@octri/mcp
This MCP server lets an AI assistant browse API documentation, endpoints, guides, changelogs, and SDK resources for an Octri project, with optional per-call project targeting.
Search API documentation using natural-language queries.
List available API endpoints, optionally filtered by section/tag.
Get full documentation for a specific endpoint by slug.
Get recent changelog entries, optionally limited to breaking changes.
List available SDK client libraries with languages, versions, and download links.
Get a written guide by its slug, optionally including its section slug.
Get ready-to-use SDK code snippets for endpoints, filtered by endpoint slug and/or language.
Override the default project per tool call using
projectId.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@octri/mcpsearch the API docs for the create user endpoint"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@octri/mcp
An MCP server that turns your API documentation into tools an AI assistant can call. Claude, Cursor, VS Code Copilot, and any other MCP client can search your endpoints, open a guide, pull a ready-to-use SDK snippet in any supported language, and check the changelog for breaking changes, all from the same OpenAPI spec your docs are built from.
Octri turns an OpenAPI spec into a documentation site, client SDKs for ten languages, an MCP server your AI assistant can call, and monitoring for the API behind them. This package is the MCP server. See octri.dev/mcp.
Node 20 or newer. Runs over stdio for a local client, or Streamable HTTP when you host it.
Operation bodies use documented media type. For multipart or binary values,
pass files only as bounded inline descriptor:
{ "filename": "report.csv", "content": "base64...", "contentType": "text/csv" }.
Paths and URLs are intentionally unsupported.
Explicit URL-encoded deepObject fields with explode: true use bracketed
wire keys, including nested objects and arrays. This covers APIs such as Stripe
that mark fields like invoice_settings and tax_id_data as deepObject.
Install
npx -y @octri/mcpMost clients are configured with that command, so a global install is optional. The Installation section below has the exact config block for each one.
Or install it in one click. VS Code asks for your project ID; Cursor writes
YOUR_PROJECT_ID into its mcp.json for you to replace.
Listed in the official MCP Registry as dev.octri/mcp.
Related MCP server: mcp-swagger
Tools
Tool | Description |
| Search the API documentation for an endpoint or concept |
| Get full documentation for a specific API endpoint |
| List all available API endpoints, optionally filtered by section |
| Get recent API changes and breaking changes |
| List the available SDK client libraries (languages, versions, download links) |
| Get the full content of a written guide by its slug |
| Get ready-to-use SDK code snippets for each endpoint in every supported language |
Installation
Claude Desktop
One click: download octri-mcp-<version>.mcpb from the
latest release and open
it. Claude Desktop installs the server and asks for the project ID and the
API's credentials, keeping secrets in the system keychain. No Node install, no
config file.
Or by hand: add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"my-api-docs": {
"command": "npx",
"args": ["@octri/mcp", "--project-id", "YOUR_PROJECT_ID"]
}
}
}Cursor
Add to .cursor/mcp.json in your project root (or ~/.cursor/mcp.json globally):
{
"mcpServers": {
"my-api-docs": {
"command": "npx",
"args": ["@octri/mcp"],
"env": {
"OCTRI_PROJECT_ID": "YOUR_PROJECT_ID"
}
}
}
}VS Code (Copilot / MCP extension)
Add to .vscode/mcp.json:
{
"servers": {
"my-api-docs": {
"type": "stdio",
"command": "npx",
"args": ["@octri/mcp", "--project-id", "YOUR_PROJECT_ID"]
}
}
}Environment variables
Variable | Required | Default | Description |
| Yes* | None | The project to connect to. Can also be set via |
| No | None | Serve only one tool group the project owner published (for example |
| No | None | Prompts to leave out, by name, comma-separated. Can also be set via |
| No |
| Override the API base URL for local development or an authorized private test endpoint. Hosted Octri self-hosting is not available. |
| No |
|
|
| No |
| HTTP port for the |
| No |
| Interface to bind. Widening it requires |
| No | None | Comma-separated browser origins allowed to reach an HTTP transport. |
| When | None | Bearer token every HTTP request must send as |
* Required unless every tool call passes projectId explicitly.
Credentials for the API being called
Operation tools call your real API, and these supply its credentials:
Variable | Description |
| Target API base for operation calls (falls back to the studio's Base URL). |
| Bearer / OAuth2 token. |
| API-key value, and the header it goes in (default |
| Basic-auth credentials. |
All of these are sent as HTTP headers. An API that takes its credentials in
the request body instead (Plaid's client_id and secret, for example) is
not served by them: those are ordinary body fields, so they appear as tool
arguments and the agent passes them like any other field. Setting
OCTRI_API_KEY for such an API adds a header it ignores.
Permissions
The project owner sets every operation tool to run on its own, ask first, or off, and publishes that from the MCP page. Reads run on their own by default and everything else asks first. An "ask first" call is shown to the user through MCP elicitation (Claude Code 2.1.76+, VS Code) with its method, URL and body, and is sent only on approval. A client that cannot ask is refused the call instead.
These narrow what the owner allowed. Only ALLOW widens anything, and nothing
brings back a tool the owner turned off:
Variable | Flag | Effect |
|
| List and run only tools that read. |
|
| Never list or run these tools. Matches a tool's name, its endpoint slug, or the name it had before the project owner renamed it. |
|
| Run these "ask first" tools without asking ( |
|
| Same as |
|
| Build each call and return it to the agent unsent. |
|
| Practice mode: answer every call with fake data built from the API's documentation, keeping records the agent creates for the session. Nothing is sent and no credential is needed. The project's owner must turn practice mode on. |
Tool groups
A project owner can split the tools into groups, each served as its own MCP
server, so a team connects only the tools a job needs. Pass --group <slug> (or
set OCTRI_GROUP) to serve one. Inside a group every tool keeps the owner's
permissions and the limits above: a group only takes tools away. Each group can
also be reached hosted, at https://api.octri.dev/api/v1/public/mcp/<project id>/g/<group>/mcp.
Usage reporting
Each tool call reports its tool name, outcome, duration, tool group (when one is
served) and the client's name to
Octri, so the project owner can see which tools agents use. Arguments and
responses are never sent. Set OCTRI_TELEMETRY=0 or pass --no-telemetry to
turn it off.
Remote hosting
Use Streamable HTTP (MCP_TRANSPORT=http), the transport the MCP spec has
defined for remote servers since revision 2025-03-26 and the one a current
client tries first:
docker build -t octri-mcp .
docker run -p 3000:3000 \
-e MCP_AUTH_TOKEN=<a long random token> \
-e OCTRI_PROJECT_ID=YOUR_PROJECT_ID \
octri-mcpThe image binds all interfaces, so it refuses to start without
MCP_AUTH_TOKEN; clients send it as Authorization: Bearer <token>. It runs as
a non-root user, and GET /health answers a container or load balancer probe
without the token.
It serves a single endpoint, /mcp. A client's first request opens a session
and gets its id back in the mcp-session-id header; every later request
carries it and reaches the same server. That is what lets a tool that asks
first work: the approval prompt goes out in the middle of a call and the
answer comes back on another request. Sessions idle for 30 minutes are closed.
Behind more than one replica, route by mcp-session-id (sticky sessions).
Point a remote MCP client at http://your-host:3000/mcp.
Legacy HTTP+SSE transport
MCP_TRANSPORT=sse serves the older 2024-11-05 design, kept so existing
deployments keep working. It exposes GET /sse to open a connection and
POST /messages?sessionId=<id> to relay client messages. Prefer http for
anything new.
Binding and origins
Both HTTP transports bind 127.0.0.1 by default and refuse any request whose
Origin is not listed in MCP_ALLOWED_ORIGINS, or whose Host is not
loopback. This server holds your API credentials, and any page the browser
visits can reach a loopback port.
Widening MCP_HOST puts those credentials on the network, so the server then
refuses to start without MCP_AUTH_TOKEN, and every request must send
Authorization: Bearer <token>. Configure the same header in your MCP client,
and list browser origins explicitly.
Check your setup
npx -y @octri/mcp doctor --project-id YOUR_PROJECT_IDConfirms the project and its tools load, the base URL and credentials are set,
and makes one real read call, then says what to fix if anything fails.
--no-call skips the call. Exits non-zero on a failure.
Keep the credential out of the config
npx -y @octri/mcp login --project-id YOUR_PROJECT_IDAsks for the API credential the project's scheme needs and saves it in your
system keychain (macOS Keychain, Windows Credential Manager, or the Secret
Service on Linux). Your MCP client's config then needs no OCTRI_API_*
variable. A variable set in the config still wins. logout removes it.
The keychain store, @napi-rs/keyring, is an optional dependency. Where it
cannot install or the system has no secret store, login says so and env
variables work as before.
Local development
# Build
pnpm build
# Run in stdio mode
OCTRI_PROJECT_ID=my-project node dist/index.js
# Run in Streamable HTTP mode (POST /mcp)
MCP_TRANSPORT=http OCTRI_PROJECT_ID=my-project node dist/index.js
# Run in the legacy SSE mode
MCP_TRANSPORT=sse OCTRI_PROJECT_ID=my-project node dist/index.jsAs a library
The octri-mcp command is one host for the server core. createServer takes
the tool source and everything else a host decides:
import { createServer, startStdio, processEnv, loadUserPermissions } from "@octri/mcp";
const env = processEnv("ACME"); // reads ACME_API_TOKEN, ACME_ALLOW_TOOLS, ...
await startStdio(() =>
createServer({
// "live" fetches tools from the Octri API; "static" serves a fixed manifest.
source: { kind: "static", manifest },
branding: { name: "acme-mcp", version: "2.4.0" },
env,
permissions: loadUserPermissions(process.argv.slice(2), env),
}),
);A static source serves Octri's documentation tools, and reports usage, only
when it is given an Octri project (octri: { apiUrl, projectId }).
Publishing
pnpm build
pnpm pack:mcpb
npm publish --access public
gh release upload v<version> octri-mcp-<version>.mcpb --repo octridev/octri-mcp
mcp-publisher publishRequires an npm account with access to the @octri scope. pack:mcpb writes
the MCP Bundle and points server.json at it on the GitHub release, so upload
that exact file before mcp-publisher publish.
The rest of Octri
Product | What it does |
Your OpenAPI spec becomes a hosted documentation site with a live request playground, editable page by page. | |
The same spec becomes client libraries for ten languages, versioned and released together. | |
Your endpoints and docs become tools an AI assistant can call, generated from the same spec. | |
Errors, traces, uptime and releases for the API, joined to the SDK calls that reached it. |
Monitoring runtimes
Node · Python · Go · Ruby · Rust · PHP · Java · Kotlin · Swift · Dart
Documentation · Pricing · Changelog
MIT licensed.
Available Tools
7 toolsget_changelogCRead-onlyIdempotent
Get recent API changes and breaking changes
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project. | |
| breakingOnly | No | Only return entries with breaking changes (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds nothing beyond that: it does not say how far back "recent" reaches, how many entries are returned, whether results are ordered, or how breaking changes are flagged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single eight-word sentence with no filler and the key concept (breaking changes) front-loaded. It is efficient, though borderline under-specified rather than merely concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-required-parameter tool with full schema coverage and no output schema, the definition is close to sufficient. The remaining gap is the undefined recency window and result scope, which an agent would need in order to know whether this answers "what changed last week" questions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters (projectId default behavior, breakingOnly default false) are documented in the schema itself. The description's mention of "breaking changes" loosely echoes breakingOnly but adds no format or semantics beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Get recent API changes and breaking changes" gives a specific verb (get) and resource (API changelog), which is clearly distinct from the doc-lookup siblings like get_guide or search_docs. The only weakness is that "recent" is left undefined and no sibling is named, but the purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus get_guide, search_docs, or get_endpoint, and no prerequisites or exclusions. The agent must infer that this is the tool for change/breaking-change questions rather than release documentation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_endpointBRead-onlyIdempotent
Get full documentation for a specific API endpoint
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The endpoint slug | |
| projectId | No | Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered by structured data. The description adds only that the returned content is 'full documentation' (i.e., comprehensive rather than a snippet), and says nothing about response size/format or what happens with an invalid slug. Given the annotation coverage, this is acceptable but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler and no wasted clauses. It is arguably too terse for the available sibling set, but nothing in it is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with full annotation coverage and complete schema descriptions, the essentials are present. However, with no output schema, an agent still cannot tell whether the response is structured JSON or prose documentation, nor how large it may be — a modest gap for a docs-retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a clear note that projectId defaults to the server's project and should only be passed to target another one. The description adds no detail about the slug format or where slugs come from, so it neither helps nor hurts beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: fetch full documentation for one API endpoint, keyed by slug. The word 'specific' implicitly contrasts with the sibling list_endpoints, but the description never names that sibling or any other, so differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer it should call list_endpoints first to obtain a slug and then use this tool for the full write-up. There is no explicit when-to-use, when-not, or statement of how this differs from search_docs, get_guide, or get_sdk_methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_guideARead-onlyIdempotent
Get the full content of a written guide (tutorial / conceptual doc) by its slug
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The guide slug (from list_endpoints) | |
| groupSlug | No | The guide's group (list_endpoints shows it). Optional: found from the site's navigation when omitted. | |
| projectId | No | Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds only that the entire document is returned rather than an excerpt, with no mention of size, truncation, or response shape for potentially long guides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the parenthetical clarification is well placed. It is efficient but leaves obvious space unused for distinguishing siblings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-required-parameter read with rich annotations and complete schema coverage, this is largely sufficient. The only shortfall is that agents get no hint about document size or output format for large guides.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so slug, groupSlug, and projectId are already documented, including the fallback behavior for groupSlug and the project default. The description only echoes that retrieval is keyed by slug, adding nothing the schema does not already say.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Get the full content of a written guide") and disambiguates the resource with the parenthetical "tutorial / conceptual doc", which separates it from endpoint/SDK siblings. It does not explicitly contrast with search_docs, so retrieval-vs-search must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the schema's "from list_endpoints" hints at a discover-then-fetch flow, and the description's "full content" implies search_docs returns partial matches. There is no explicit statement of when to use this instead of search_docs or get_endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sdk_methodsARead-onlyIdempotent
Show how to call this API through its generated SDKs. With slug (from list_endpoints or search_docs): ready-to-use code for that endpoint in every SDK language, or in one with language (e.g. typescript, python, go). Without slug: the index of SDK methods, one line per endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | One endpoint by its slug. Omit for the index of methods. | |
| language | No | Focus on one SDK language (e.g. typescript, python, go). Omit for all supported languages. | |
| projectId | No | Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a safe, read-only, idempotent, open-world lookup, so the safety profile is covered. The description adds useful context the annotations do not: the two distinct output shapes (ready-to-use code samples per language vs. a one-line-per-endpoint index), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the purpose, then the two modes in a clean parallel structure. Nothing is redundant and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns and does so for both modes. The only omission is `projectId` behavior, which the schema already covers adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; each parameter is already documented in the schema. The description adds marginal value by naming where `slug` comes from (list_endpoints, search_docs) and giving language examples, but it largely restates the schema's own guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Show how to call this API through its generated SDKs' — and immediately splits the behavior into two named modes (with slug vs. without). It does not explicitly contrast itself with the sibling list_sdks or get_endpoint, but the description of each mode is concrete enough to distinguish it in practice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions: pass `slug` (sourced from list_endpoints or search_docs) to get per-endpoint code, add `language` to narrow, omit `slug` to get the method index. That is near-complete when/when-not guidance, though it never mentions sibling tools like list_sdks as an alternative for browsing SDK availability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_endpointsARead-onlyIdempotent
List the API's endpoints and guides, grouped by section. A large API lists its sections with endpoint counts instead: pass section to list one of them.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Only the sections whose name contains this text | |
| projectId | No | Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds real value by disclosing that the response shape changes with API size — sections with endpoint counts instead of a flat endpoint listing — which an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the primary listing behavior front-loaded and the size-dependent variant immediately after. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter read tool with no output schema, the key gap — that the response may be a section index rather than an endpoint list — is covered. Minor omissions remain: no mention of ordering, and projectId's default-project behavior is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented and the description need only supplement. It explains why `section` matters for large APIs, but its wording ('list one of them') sits slightly at odds with the schema's substring-filter phrasing ('sections whose name contains this text'), leaving the exact matching behavior fuzzy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the API's endpoints and guides') plus the grouping behavior. It implicitly separates itself from the single-resource sibling get_endpoint, but never names an alternative such as search_docs for keyword lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: browse to discover endpoints, and pass `section` to drill into a section when the API is large. There is no explicit when-not guidance or routing to search_docs/get_endpoint, and the phrase 'pass section to list one of them' leaves the drill-down effect to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sdksARead-onlyIdempotent
List the available SDK client libraries for this API (languages, versions, and download links)
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered elsewhere. The description adds useful context about the shape of the payload (languages, versions, download links), but says nothing about pagination, freshness, or whether results are filtered by project or API surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the resource first and the returned fields in a compact parenthetical. Every clause carries information; nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with one optional, fully documented parameter and rich annotations, this is nearly complete. Because there is no output schema, the parenthetical enumeration of returned fields usefully compensates, though it could note whether the list is project-scoped.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional projectId is fully documented in the schema, including its default-to-server-project behavior. The description adds no additional meaning about the parameter, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("List the available SDK client libraries for this API") and even names the fields returned (languages, versions, download links). It is naturally distinguishable from sibling get_sdk_methods, though it does not explicitly name any sibling to contrast against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for enumerating SDKs, but the description never says when to prefer it over get_sdk_methods or whether prerequisites (auth, project scope) apply. No explicit when-not or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsBRead-onlyIdempotent
Search the API documentation for an endpoint or concept
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 5) | |
| query | Yes | Natural language search query | |
| projectId | No | Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior, so the safety profile is fully covered elsewhere. The description adds only that the searchable domain is API documentation and that it matches endpoints or concepts; it says nothing about ranking, result scope, or how results differ from list_endpoints output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted wording. It is efficient, though its brevity leaves no room for the routing guidance an agent would benefit from.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only, fully described 3-parameter tool with rich annotations and no output schema, the description is adequate but thin. It omits the main thing an agent would need: how this search relates to get_endpoint, list_endpoints, and get_guide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema documents query as a natural-language string, limit with a default of 5, and projectId's default project behavior. The description adds no further meaning about query formulation or reasonable limit values, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Search the API documentation for an endpoint or concept" names a specific verb (search) and resource (API documentation) plus what kinds of targets it matches. It is distinguishable from siblings like get_endpoint or list_endpoints, but the description never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer that search is for locating an unknown endpoint or concept before calling get_endpoint. There is no explicit statement of when to prefer search over get_guide, list_endpoints, or get_sdk_methods, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v1.4.2- Changed
get_changelog1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project to read. Optional — defaults to the project this server was started with. Only pass it to target a different project."New value: +"Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project."
- Changed
get_endpoint1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project to read. Optional — defaults to the project this server was started with. Only pass it to target a different project."New value: +"Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project."
- Changed
get_guide2 fields changed- changed
Input schema / properties / groupSlug / descriptionPrevious value: -"The guide's section slug, if it belongs to one"New value: +"The guide's group (list_endpoints shows it). Optional: found from the site's navigation when omitted." - changed
Input schema / properties / projectId / descriptionPrevious value: -"Project to read. Optional — defaults to the project this server was started with. Only pass it to target a different project."New value: +"Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project."
- Changed
get_sdk_methods2 fields changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project to read. Optional — defaults to the project this server was started with. Only pass it to target a different project."New value: +"Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project." - changed
Input schema / properties / slug / descriptionPrevious value: -"Focus on a single endpoint by its slug. Omit to return all endpoints."New value: +"One endpoint by its slug. Omit for the index of methods."
- Changed
list_endpoints2 fields changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project to read. Optional — defaults to the project this server was started with. Only pass it to target a different project."New value: +"Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project." - changed
Input schema / properties / section / descriptionPrevious value: -"Filter by section/tag name"New value: +"Only the sections whose name contains this text"
- Changed
list_sdks1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project to read. Optional — defaults to the project this server was started with. Only pass it to target a different project."New value: +"Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project."
- Changed
search_docs1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project to read. Optional — defaults to the project this server was started with. Only pass it to target a different project."New value: +"Project to read. Optional: defaults to the project this server was started with. Only pass it to target a different project."
7 tool updates
v1.1.1- First observed
get_changelog - First observed
get_endpoint - First observed
get_guide - First observed
get_sdk_methods - First observed
list_endpoints - First observed
list_sdks - First observed
search_docs
TDQS
Scored across 7 tools
The tools divide cleanly into discovery (search_docs, list_endpoints), retrieval (get_endpoint, get_guide, get_changelog), and SDK tooling (list_sdks, get_sdk_methods). There is minor overlap in that list_endpoints and get_sdk_methods (without slug) both effectively enumerate endpoints, but their descriptions clarify the difference (endpoint catalog vs SDK method index).
Every tool follows a consistent verb_noun snake_case pattern: search_docs, get_endpoint, list_endpoints, get_changelog, list_sdks, get_guide, get_sdk_methods. The verbs map predictably to actions (list = enumerate, get = fetch a specific item, search = query), with no style deviations.
Seven tools is well-scoped for an API documentation server, covering discovery, retrieval, changelog, and SDK integration without padding. Each tool corresponds to a distinct documentation task that earns its place.
The surface covers the full documentation lifecycle: search, enumerate (endpoints and guides), fetch specific endpoints and guides, review changelogs, and consume SDKs (catalog plus per-endpoint method code). No obvious gaps remain for the stated purpose of browsing and consuming API docs and SDKs.
Maintenance
Related MCP Connectors
Versioned documentation registry and semantic search for AI tools and coding assistants.
Publish your API docs so AI assistants can look up endpoints and call your API correctly.
Find, write, publish and check pages and API references in your DeveloperHub docs from an AI client
Turn any task into the right API calls: discover, evaluate, and integrate public APIs.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to discover, search, and interact with REST APIs by parsing OpenAPI/Swagger specifications with intelligent fuzzy search across endpoints, supporting both local and remote API sources.6 npm2MIT
- AlicenseAqualityDmaintenanceExposes Swagger/OpenAPI API documentation to AI models, enabling exploration, search, and interaction with endpoints, schemas, and execution of API calls.1426 npm2MIT
- FlicenseNot gradedqualityDmaintenanceBrings OpenAPI/Swagger documentation into AI assistants, enabling endpoint discovery, deep inspection, cURL generation, and TypeScript type generation.-
- AlicenseNot gradedqualityCmaintenanceProvides AI coding agents with accurate OpenAPI contract details to prevent hallucinated API calls, supporting multi-version pinning, endpoint discovery, and request validation.42 npmApache 2.0