Skip to main content
Glama

@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/mcp

Most 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.

Add to Cursor Install in VS Code

Listed in the official MCP Registry as dev.octri/mcp.

Related MCP server: mcp-swagger

Tools

Tool

Description

search_docs

Search the API documentation for an endpoint or concept

get_endpoint

Get full documentation for a specific API endpoint

list_endpoints

List all available API endpoints, optionally filtered by section

get_changelog

Get recent API changes and breaking changes

list_sdks

List the available SDK client libraries (languages, versions, download links)

get_guide

Get the full content of a written guide by its slug

get_sdk_methods

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

OCTRI_PROJECT_ID

Yes*

None

The project to connect to. Can also be set via --project-id CLI flag.

OCTRI_GROUP

No

None

Serve only one tool group the project owner published (for example billing). Can also be set via --group. A group the project does not have serves no tools.

OCTRI_SKIP_PROMPTS

No

None

Prompts to leave out, by name, comma-separated. Can also be set via --skip-prompts. The project's Claude Code plugin sets it for the prompts it already ships as slash commands, so each shows once.

OCTRI_API_URL

No

https://api.octri.dev/api/v1

Override the API base URL for local development or an authorized private test endpoint. Hosted Octri self-hosting is not available.

MCP_TRANSPORT

No

stdio

http for remote hosting (Streamable HTTP), or sse for the legacy transport.

PORT

No

3000

HTTP port for the http and sse transports.

MCP_HOST

No

127.0.0.1

Interface to bind. Widening it requires MCP_AUTH_TOKEN.

MCP_ALLOWED_ORIGINS

No

None

Comma-separated browser origins allowed to reach an HTTP transport.

MCP_AUTH_TOKEN

When MCP_HOST is not loopback

None

Bearer token every HTTP request must send as Authorization: Bearer <token>.

* 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

OCTRI_API_BASE_URL

Target API base for operation calls (falls back to the studio's Base URL).

OCTRI_API_TOKEN

Bearer / OAuth2 token.

OCTRI_API_KEY (+ OCTRI_API_KEY_HEADER)

API-key value, and the header it goes in (default X-API-Key).

OCTRI_API_USERNAME / OCTRI_API_PASSWORD

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

OCTRI_READ_ONLY=1

--read-only

List and run only tools that read.

OCTRI_DENY_TOOLS=a,b

--deny-tools a,b

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.

OCTRI_ALLOW_TOOLS=a,b

--allow-tools a,b

Run these "ask first" tools without asking (* for all). Matches a tool's current name or its endpoint slug; after a rename, an old name asks again.

OCTRI_ALLOW_WRITES=1

--allow-writes

Same as OCTRI_ALLOW_TOOLS=*.

OCTRI_DRY_RUN=1

--dry-run

Build each call and return it to the agent unsent.

OCTRI_PRACTICE=1

--practice

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-mcp

The 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_ID

Confirms 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_ID

Asks 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.js

As 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 publish

Requires 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

API Studio

Your OpenAPI spec becomes a hosted documentation site with a live request playground, editable page by page.

SDK Studio

The same spec becomes client libraries for ten languages, versioned and released together.

MCP

Your endpoints and docs become tools an AI assistant can call, generated from the same spec.

Monitoring

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 tools
get_changelogC
Read-onlyIdempotent

Get recent API changes and breaking changes

NameRequiredDescriptionDefault
projectIdNoProject to read. Optional: defaults to the project this server was started with. Only pass it to target a different project.
breakingOnlyNoOnly return entries with breaking changes (default false)

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_endpointB
Read-onlyIdempotent

Get full documentation for a specific API endpoint

NameRequiredDescriptionDefault
slugYesThe endpoint slug
projectIdNoProject to read. Optional: defaults to the project this server was started with. Only pass it to target a different project.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_guideA
Read-onlyIdempotent

Get the full content of a written guide (tutorial / conceptual doc) by its slug

NameRequiredDescriptionDefault
slugYesThe guide slug (from list_endpoints)
groupSlugNoThe guide's group (list_endpoints shows it). Optional: found from the site's navigation when omitted.
projectIdNoProject to read. Optional: defaults to the project this server was started with. Only pass it to target a different project.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_methodsA
Read-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.

NameRequiredDescriptionDefault
slugNoOne endpoint by its slug. Omit for the index of methods.
languageNoFocus on one SDK language (e.g. typescript, python, go). Omit for all supported languages.
projectIdNoProject to read. Optional: defaults to the project this server was started with. Only pass it to target a different project.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_endpointsA
Read-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.

NameRequiredDescriptionDefault
sectionNoOnly the sections whose name contains this text
projectIdNoProject to read. Optional: defaults to the project this server was started with. Only pass it to target a different project.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_sdksA
Read-onlyIdempotent

List the available SDK client libraries for this API (languages, versions, and download links)

NameRequiredDescriptionDefault
projectIdNoProject to read. Optional: defaults to the project this server was started with. Only pass it to target a different project.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_docsB
Read-onlyIdempotent

Search the API documentation for an endpoint or concept

NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 5)
queryYesNatural language search query
projectIdNoProject to read. Optional: defaults to the project this server was started with. Only pass it to target a different project.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 7 tool updatesv1.4.2
    • Changedget_changelog1 field changed
      • changedInput schema / properties / projectId / description
        Previous 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."
    • Changedget_endpoint1 field changed
      • changedInput schema / properties / projectId / description
        Previous 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."
    • Changedget_guide2 fields changed
      • changedInput schema / properties / groupSlug / description
        Previous 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."
      • changedInput schema / properties / projectId / description
        Previous 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."
    • Changedget_sdk_methods2 fields changed
      • changedInput schema / properties / projectId / description
        Previous 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."
      • changedInput schema / properties / slug / description
        Previous 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."
    • Changedlist_endpoints2 fields changed
      • changedInput schema / properties / projectId / description
        Previous 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."
      • changedInput schema / properties / section / description
        Previous value: -"Filter by section/tag name"New value: +"Only the sections whose name contains this text"
    • Changedlist_sdks1 field changed
      • changedInput schema / properties / projectId / description
        Previous 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."
    • Changedsearch_docs1 field changed
      • changedInput schema / properties / projectId / description
        Previous 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."
  2. 7 tool updatesv1.1.1
    • First observedget_changelog
    • First observedget_endpoint
    • First observedget_guide
    • First observedget_sdk_methods
    • First observedlist_endpoints
    • First observedlist_sdks
    • First observedsearch_docs

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation4/5

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).

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Exposes Swagger/OpenAPI API documentation to AI models, enabling exploration, search, and interaction with endpoints, schemas, and execution of API calls.
    14
    26 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides AI coding agents with accurate OpenAPI contract details to prevent hallucinated API calls, supporting multi-version pinning, endpoint discovery, and request validation.
    42 npm
    Apache 2.0