Agent Docs
Search the official docs of Claude Code, Cursor, OpenAI Codex and MCP, refreshed daily.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"agent-docs": {
"url": "https://agent-docs-mcp.onrender.com/mcp/"
}
}
}Remote endpoints
https://agent-docs-mcp.onrender.com/mcp/streamable-httpWhat it can do
Tool inventory
Tools (2)
🟢search_docs(query, limit, product, response_format)
Search the official documentation of Claude Code, Cursor, OpenAI Codex and MCP. Use it before answering any question about using, configuring or administering these products. Not for other products or general programming. If the answer could differ between products and the user hasn't said which one, ask. Returns one passage per page, with the page's one-line description and a relevance score; under ~0.5 means the docs probably don't cover it. One topic per call: split multi-part questions. Need more than the passage? Call read_section(url), or read_section(url, heading) for one of the passage's other_sections.
Input Schema
{
"type": "object",
"properties": {
"query": {
"description": "What to find, in English: keywords or a short question, e.g. \"<product> <feature> <what you need>\".",
"maxLength": 500,
"minLength": 1,
"title": "Query",
"type": "string"
},
"limit": {
"default": 8,
"description": "Pages to return, 1-20 (default 8).",
"maximum": 20,
"minimum": 1,
"title": "Limit",
"type": "integer"
},
"product": {
"anyOf": [
{
"enum": [
"claude-code",
"cursor",
"codex",
"mcp"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Only this product. Set it when the user has named the product, now or earlier in the conversation. Otherwise leave it empty: an unfiltered search still finds product-specific pages, while a wrong product hides the right ones.",
"title": "Product"
},
"response_format": {
"default": "concise",
"description": "`concise` (default): first 300 characters of each passage, enough to choose. `detailed`: full passages, about 800 tokens each. Start concise; re-run detailed with a small limit for the pages you need.",
"enum": [
"concise",
"detailed"
],
"title": "Response Format",
"type": "string"
}
},
"required": [
"query"
],
"title": "search_docsArguments"
}Output Schema
{
"type": "object",
"properties": {
"passages": {
"description": "Ranked documentation passages. Empty if nothing matched.",
"items": {
"$ref": "#/$defs/PassageModel"
},
"title": "Passages",
"type": "array"
},
"index_snapshot": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Date the documentation was indexed (ISO); null if unknown.",
"title": "Index Snapshot"
}
},
"required": [
"passages",
"index_snapshot"
],
"$defs": {
"PassageModel": {
"additionalProperties": false,
"properties": {
"rank": {
"description": "1-based rank after Cohere reranking.",
"title": "Rank",
"type": "integer"
},
"title": {
"description": "Document title.",
"title": "Title",
"type": "string"
},
"heading": {
"description": "Heading path inside the document.",
"title": "Heading",
"type": "string"
},
"url": {
"description": "Source URL; pass it to read_section.",
"title": "Url",
"type": "string"
},
"description": {
"description": "One sentence on what the page is; empty if unavailable.",
"title": "Description",
"type": "string"
},
"score": {
"description": "Cohere rerank relevance in [0, 1]. Low scores across all passages mean the docs may not cover the query; consider rephrasing.",
"title": "Score",
"type": "number"
},
"content": {
"description": "Chunk text, trimmed when concise.",
"title": "Content",
"type": "string"
},
"truncated": {
"description": "True when `content` was trimmed; re-run detailed for the rest.",
"title": "Truncated",
"type": "boolean"
},
"other_sections": {
"description": "Other sections of this page that also match, best first; pass one to read_section as `heading`. Empty when none does.",
"items": {
"type": "string"
},
"title": "Other Sections",
"type": "array"
}
},
"required": [
"rank",
"title",
"heading",
"url",
"description",
"score",
"content",
"truncated",
"other_sections"
],
"title": "PassageModel",
"type": "object"
}
},
"additionalProperties": false,
"title": "SearchDocsResult"
}🟢read_section(url, heading, offset, outline_depth)
Read a page found by search_docs. Without a heading: the page's description and outline (top-level sections with subsection counts). With a heading: that section's full text, including its subsections; continue long sections with next_offset. outline_depth=3 also lists subsections; use it only on long pages to find one specific subsection.
Input Schema
{
"type": "object",
"properties": {
"url": {
"description": "Page URL exactly as search_docs returned it.",
"maxLength": 500,
"minLength": 1,
"title": "Url",
"type": "string"
},
"heading": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Heading to read, as listed in the outline (leading #s optional). Exact text first, case-insensitive, then a unique partial match; use 'Parent > Heading' when two headings share a name. Leave unset to get the page's outline.",
"title": "Heading"
},
"offset": {
"default": 0,
"description": "Character offset into the section; pass the previous next_offset to continue a long section.",
"minimum": 0,
"title": "Offset",
"type": "integer"
},
"outline_depth": {
"default": 2,
"description": "Outline depth when no heading is given: 2 lists top-level sections with subsection counts, 3 also lists the subsections.",
"enum": [
2,
3
],
"title": "Outline Depth",
"type": "integer"
}
},
"required": [
"url"
],
"title": "read_sectionArguments"
}Output Schema
{
"type": "object",
"properties": {
"url": {
"description": "Page URL.",
"title": "Url",
"type": "string"
},
"title": {
"description": "Page title.",
"title": "Title",
"type": "string"
},
"description": {
"description": "One sentence on what the page is.",
"title": "Description",
"type": "string"
},
"outline": {
"description": "Top-level sections as '## Text (N subsections)' when no heading was asked for (at most 40 lines, then '+N more sections'); empty otherwise.",
"items": {
"type": "string"
},
"title": "Outline",
"type": "array"
},
"heading": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Path of the section returned, e.g. 'Hooks > PreToolUse'; null when only the outline was asked for.",
"title": "Heading"
},
"text": {
"description": "Section markdown from its heading to the next heading of the same or higher level, at most 8,000 characters per call.",
"title": "Text",
"type": "string"
},
"offset": {
"description": "Offset of `text` within the section.",
"title": "Offset",
"type": "integer"
},
"next_offset": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Pass as offset to read the rest; null when nothing is left.",
"title": "Next Offset"
},
"total_chars": {
"description": "Length of the whole section.",
"title": "Total Chars",
"type": "integer"
}
},
"required": [
"url",
"title",
"description",
"outline",
"heading",
"text",
"offset",
"next_offset",
"total_chars"
],
"additionalProperties": false,
"title": "ReadSectionResult"
}Community
Evidence