apitameBLOCK
Turn any OpenAPI spec or SQL database into a safe MCP server plus agent skills. One command.
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-writeand 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_operationsandcall_operationfor the long tail. The GitHub example goes from 38 endpoints to 8 tools
1f74004cb1f5OBSERVED · 2026-10-14Install
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
Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned | |
| claude-desktop | mentioned | |
| codex | mentioned | |
| copilot | mentioned | |
| cursor | mentioned | |
| gemini-cli | mentioned |
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).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.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (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)
# DATABASE_URL=postgres://apitame_ro:password@localhost:5432/shop
url: `http://127.0.0.1:${port}${basePath}`,APITAME_TEST_POSTGRES_URL: postgres://postgres:[email protected]:5432/postgres
APITAME_TEST_MYSQL_URL: mysql://root:[email protected]:3306/mysql
npx apitame init postgres://readonly_user:password@localhost:5432/shop
npx apitame init mysql://readonly_user:password@localhost:3306/shop
const SECRET = 'live-secret-token-0123456789';
const SECRET = 'fake-key-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
echo: { token: 'unregistered-9f8e7d6c' },.prettierignore
.prettierrc.json
import { loadConfig } from '../../config/load.js';import { zip } from '../../generator/zip.js';import { loadSkills } from '../../server/skills.js';import { VERSION } from '../../version.js';import { envRefs, loadDotEnv } from '../../config/env.js';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
apitame serve --transport http --port 3333 # streamable HTTP on http://127.0.0.1:3333/mcp
# MCP endpoint: http://127.0.0.1:3333/mcp, health check: http://127.0.0.1:3333/health
Claude Code: `claude mcp add --transport http github http://127.0.0.1:3333/mcp`.
@modelcontextprotocol/node, @modelcontextprotocol/server, @readme/openapi-parser, ajv, commander, mysql2, pg, yaml
- **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
| [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
| [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
| [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
Gates applied: no_behavioural_pass.
1f74004cb1f5full audit observations/trust-audit/skill/albert-canfield__apitame.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-14 | 1f74004cb1f5 | BLOCK | F | 56 | first audit |
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.