Atlas / Skills / albert-canfield / apitame

apitameBLOCK

skills/albert-canfield/apitame

Turn any OpenAPI spec or SQL database into a safe MCP server plus agent skills. One command.

Verdict
BLOCK
Grade
F
Trust score
56 /100
Version
—
Hosts
6 documented
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

apitame

Turn any OpenAPI spec or SQL database into a safe MCP server, plus agent skills. One command.

npx apitame init ./openapi.yaml          # or an API URL, postgres://..., mysql://..., ./shop.db
npx apitame add-to claude-code --write   # or codex, cursor, vscode, gemini, claude-desktop

That is the whole setup. Your agent now has a small set of task-level tools for the API, read-only by default, plus a skill that teaches it how to use them.

Why apitame

Giving an agent an API is easy. Giving it one safely, without flooding its context, is not. Most generators map every endpoint to a tool and expose every write operation. apitame makes the opposite choices:

  • Safe by default. Read-only out of the box. Writes need mode: read-write and an explicit allowlist. Destructive operations stop for human approval. Every write has a dry run.
  • A curated tool surface. Endpoints are grouped into a handful of task-level tools, with search_operations and call_operation for the long tail. The GitHub example goes from 38 endpoints to 8 tools
Read from source at commit 1f74004cb1f5OBSERVED · 2026-10-14
02

Install

Commands as the repository documents them. They are shown, not run.

git clone https://github.com/albert-canfield/apitame.git
claude mcp add --transport stdio --scope project github -- npx -y [email protected] serve --config /abs/path/apitame.config.yaml
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
claude-desktopmentioned
codexmentioned
copilotmentioned
cursormentioned
gemini-climentioned
04

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: github-api
description: Use the GitHub REST API (subset) through the "github" MCP server (generated by apitame). Use for requests that involve repos, issues, pulls, search, users or activity data (read-only access). Covers which tool to call, argument shapes, common multi-step workflows and the safety rules for writes.
---

# GitHub REST API (subset)

A hand-picked subset of the GitHub REST API (repositories, issues, pull requests, search, users and stars), used by the apitame examples. Operation ids, paths and fields follow the official GitHub description.

These tools come from the `github` MCP server, generated by apitame from the OpenAPI spec.
The server runs in **read-only mode**: 13 write operations are blocked.

## Tools

| Tool | Use it to | Operations |
| --- | --- | --- |
| `repos` | Repositories, their content, commits, branches and releases | `repos/get`, `repos/list-for-user`, `repos/list-for-org`, `repos/list-contributors`, `repos/list-languages`, `repos/list-branches`, `repos/list-commits`, `repos/list-releases`, `repos/get-content`, `repos/get-commit`, `repos/get-latest-release` |
| `issues` | Issues, comments and labels | `issues/list-for-repo`, `issues/list-labels-for-repo`, `issues/get`, `issues/list-comments` |
| `pulls` | Pull requests, their files and reviews | `pulls/list`, `pulls/get`, `pulls/list-files`, `pulls/list-reviews` |
| `search` | Search repositories, issues and code | `search/repos`, `search/issues-and-pull-requests`, `search/code` |
| `users` | User profiles | `users/get-authenticated`, `users/get-by-username` |
| `activity` | Stars and stargazers | `activity/list-stargazers-for-repo` |
| `search_operations` | Find any of the 38 operations by keyword | all |
| `call_operation` | Call an operation that has no dedicated tool | any available |

Grouped tools take `{"operation": "<operation id>", "params": {...}}`. Results are JSON: `{"status": <http status>, "data": <body>}`.

Add `"fields"` with dot paths to keep only what you need, for example `"fields": ["id", "name", "items.owner.login"]`. Arrays are handled for you, so `items.name` keeps `name` in every item. It saves a lot of context on large responses.

## Workflows

### List commits, then open one

1. Call `repos` with `{"operation":"repos/list-commits","params":{"owner":"octocat","repo":"hello-world"}}`.
2. Take the identifier (`ref`) of the item the user means from the result, then call `repos` with `{"operation":"repos/get-commit","params":{"owner":"octocat","repo":"hello-world","ref":"main"}}`.
3. Summarize the fields the user asked about instead of pasting the raw JSON.

### List repository issues, then open one

1. Call `issues` with `{"operation":"issues/list-for-repo","params":{"owner":"octocat","repo":"hello-world","state":"open"}}`.
2. Take the identifier (`issue_number`) of the item the user means from the result, then call `issues` with `{"operation":"issues/get","params":{"owner":"octocat","repo":"hello-world","issue_number":1}}`.
3. Summarize the fields the user asked about instead of pasting the raw JSON.

### Search repositories

1. Call `search` with `{"operation":"search/repos","params":{"q":"example"}}`. Find repositories via keywords and qualifiers, for example "mcp language:typescript stars:>100".
2. Useful parameters: `q`, `sort`. Ask the user for missing values instead of guessing.

### Page through long lists

1. List operations such as `repos/list-for-user` accept `per_page`, `page`. Start small, and only fetch the next page if the user needs more.
2. Large responses are cut to fit the response limit; a "note" field says when that happened.

## Safety rules

- Write operations are blocked by the server. Do not look for workarounds. If the user needs one, name the operation and tell them it must be enabled in `apitame.config.yaml` (`mode: read-write` and `writes.allow`).
- Responses over 50 KB are cut. Use filters, pagination and `fields` rather than fetching everything.
- Never ask the user for API keys or tokens: the server already holds them, and they are never shown to you.
- A non-2xx `status` is an API error: read `data` for the reason before retrying.

## Reference

Every operation with its parameters: [references/operations.md](references/operations.md).
05

Trust audit

BLOCKgrade F · trust 56/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (3 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.env.example:13
# DATABASE_URL=postgres://apitame_ro:password@localhost:5432/shop
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/mock/server.ts:109
url: `http://127.0.0.1:${port}${basePath}`,
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:73
APITAME_TEST_POSTGRES_URL: postgres://postgres:[email protected]:5432/postgres
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:74
APITAME_TEST_MYSQL_URL: mysql://root:[email protected]:3306/mysql
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
README.md:59
npx apitame init postgres://readonly_user:password@localhost:5432/shop
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
README.md:60
npx apitame init mysql://readonly_user:password@localhost:3306/shop
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/integration/openapi-runtime.test.ts:7
const SECRET = 'live-secret-token-0123456789';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/redaction-paths.test.ts:5
const SECRET = 'fake-key-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/redaction-paths.test.ts:79
echo: { token: 'unregistered-9f8e7d6c' },
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/add-to.ts:4
import { loadConfig } from '../../config/load.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/add-to.ts:5
import { zip } from '../../generator/zip.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/add-to.ts:6
import { loadSkills } from '../../server/skills.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/add-to.ts:7
import { VERSION } from '../../version.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/doctor.ts:4
import { envRefs, loadDotEnv } from '../../config/env.js';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:154
Prefer HTTP? `npx apitame serve --transport http` listens on `http://127.0.0.1:3333/mcp` (add `--sessions` so destructive actions are approved in the client). More in [docs/clients.md](docs/clients.md
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/cli.md:41
apitame serve --transport http --port 3333     # streamable HTTP on http://127.0.0.1:3333/mcp
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/clients.md:137
# MCP endpoint: http://127.0.0.1:3333/mcp, health check: http://127.0.0.1:3333/health
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/clients.md:140
Claude Code: `claude mcp add --transport http github http://127.0.0.1:3333/mcp`.
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/node, @modelcontextprotocol/server, @readme/openapi-parser, ajv, commander, mysql2, pg, yaml
Why it matters. 24 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.override · CWE-94, CWE-1427
docs/safety.md:189
- **Prompt injection in data.** apitame does not filter what an API or table returns. If a record says "ignore previous instructions", the agent sees it. The safety layers make sure such instructions
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/landscape.md:11
| [PrefectHQ/fastmcp](https://github.com/PrefectHQ/fastmcp) (`FastMCP.from_openapi`) | 28,067 | 2026-10-13 | Python | Runtime proxy inside a Python framework. Every route becomes a tool by default; `R
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/landscape.md:14
| [harsha-iiiv/openapi-mcp-generator](https://github.com/harsha-iiiv/openapi-mcp-generator) | 639 | 2026-09-26 | TypeScript | Codegen: scaffolds a Node project with one tool per operation and zod vali
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/landscape.md:18
| [Stainless](https://www.stainless.com/docs/mcp/index.md) (closed source) | n/a | n/a | TypeScript (generated) | Codegen alongside SDKs. Current default is code mode: a code execution tool plus a doc
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: no_behavioural_pass.

Audited 2026-10-14 · audit v0.4.1 · source sha 1f74004cb1f5full audit observations/trust-audit/skill/albert-canfield__apitame.json · Report an issue / request a re-scan
06

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-141f74004cb1f5BLOCKF56first audit
07

Questions

What does the apitame skill do?

Turn any OpenAPI spec or SQL database into a safe MCP server plus agent skills. One command.

Is apitame safe to install?

No — not without reading the findings first. The audit graded it F (56/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What can apitame access on my machine?

The audit observed that it reaches the network, runs shell commands and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: found — see the findings.

Which assistants does apitame work with?

Its documentation mentions claude-code, claude-desktop, codex, copilot, cursor and gemini-cli. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (1f74004cb1f5), read on 2026-10-14. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement