OpenAI Docs MCP
https://developers.openai.com/mcp
Severity breakdown
Worst finding
Tool `search_openai_docs` accepts unconstrained string input
· search_openai_docs
The following string parameter(s) have no `maxLength` constraint: `cursor`, `query`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
All 6 findings
- mediumTool `search_openai_docs` accepts unconstrained string input· search_openai_docsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `cursor`, `query`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `list_openai_docs` accepts unconstrained string input· list_openai_docsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `cursor`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `list_openai_docs` fetches external web content -- indirect-injection surface· list_openai_docsindirect injection
Description: "List/browse pages from `platform.openai.com` + `developers.openai.com` that this server crawls (useful when you don’t know the right query yet or you’re paging through results). Search across `platform.openai.com` + `developers.openai.com` docs. Use this whenever you are working with the OpenAI API (including the Responses API), OpenAI API SDKs, ChatGPT Apps SDK, or ChatGPT Codex. Results include URLs—**after `list`, use `fetch_openai_doc`** on a result URL to get the full markdown." -- this tool pulls externally-controlled content into the agent's context window, the canonical indirect-injection vector. Even when the user supplies the URL, content at that URL can carry hostile instructions.
fix: Sandbox the fetched content: strip prompts before forwarding to the model, constrain to an allow-list of domains, and route through capframe-guard with a `domain in [...]` caveat.
- mediumTool `fetch_openai_doc` accepts unconstrained string input· fetch_openai_docunconstrained input
The following string parameter(s) have no `maxLength` constraint: `anchor`, `url`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `fetch_openai_doc` fetches external web content -- indirect-injection surface· fetch_openai_docindirect injection
Description: "Fetch the markdown for a specific doc page (from `developers.openai.com` or `platform.openai.com`) so you can quote/summarize exact, up-to-date guidance (schemas, examples, limits, edge cases). Prefer to **`search_openai_docs` first** (or `list_openai_docs` if you’re browsing) to find the best URL, then `fetch_openai_doc` to pull the exact text; you can pass `anchor` (e.g. `#streaming`) to fetch just that section." -- this tool pulls externally-controlled content into the agent's context window, the canonical indirect-injection vector. Even when the user supplies the URL, content at that URL can carry hostile instructions.
fix: Sandbox the fetched content: strip prompts before forwarding to the model, constrain to an allow-list of domains, and route through capframe-guard with a `domain in [...]` caveat.
- mediumTool `get_openapi_spec` accepts unconstrained string input· get_openapi_specunconstrained input
The following string parameter(s) have no `maxLength` constraint: `url`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
How this was scored
Source http — live HTTP MCP endpoint, classified against every rule. Findings are emitted by the public capframe.findings.v1 schema. Score = 100 − (10·Critical + 4·High + 2·Medium + 1·Low), clamped to [0, 100].
Disagree with a finding? Open an issue.