Skip to article

Use the documentation MCP server

Read documentation, provider capabilities, examples, and one integration skill through the public, unauthenticated MCP endpoint.

On this page

Connect to the public endpoint

Configure an MCP client that supports protocol revision 2026-07-28 with the Streamable HTTP URL https://searchsdk.dev/mcp. /api/mcp is an alias. No API key or account is required; send no cookies or Authorization header. The endpoint serves public documentation only; it does not accept provider keys, run live searches, execute examples, or create remote infrastructure.

This revision uses stateless requests. Every request includes protocol version and client capabilities in params._meta; HTTP mirrors the version and method in headers. It does not use the older initialize handshake or a session ID. A client that only supports older handshake-based revisions needs a compatible update.

Discover the server · terminal
curl --fail-with-body https://searchsdk.dev/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: server/discover' \
  --data '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"docs-reader","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}'

Read supportedVersions and capabilities from the discovery response, then call tools/list to inspect the current tool schemas. Mcp-Name is also required for tools/call and resources/read, matching the tool name or resource URI in the body. Skill discovery uses Mcp-Method and the version header; skills/get does not require Mcp-Name.

Documentation, providers, and examples

ToolArgumentsResult
search_docsquery, optional limit (1–10)Local lexical search with bounded article snippets; no web-provider request.
get_docslugComplete article text. Use an empty slug for the introduction.
list_providersOptional opaque cursorPublic provider metadata, up to 50 entries per page.
get_provideridOne provider, including its supported boundary.
list_examplesOptional opaque cursorDocumented code examples, up to 50 entries per page.
get_exampleid from the listingOne example with language, source URL, and code.

Use returned cursors unchanged to fetch later pages. Choose example IDs from list_examples; IDs are generated from the article, section, and block position. Titles such as “shape” or “abbreviated” identify examples that are not standalone applications. Review environment requirements before using any code.

mcp-docs.ts · read public data
const endpoint = 'https://searchsdk.dev/mcp';
const metadata = {
  'io.modelcontextprotocol/protocolVersion': '2026-07-28',
  'io.modelcontextprotocol/clientInfo': { name: 'docs-reader', version: '1.0.0' },
  'io.modelcontextprotocol/clientCapabilities': {},
};
let requestId = 0;
async function rpc(method: string, params: Record<string, unknown> = {}) {
  const name = method === 'tools/call' ? params.name
    : method === 'resources/read' ? params.uri : undefined;
  const headers = new Headers({
    'Content-Type': 'application/json',
    Accept: 'application/json, text/event-stream',
    'MCP-Protocol-Version': '2026-07-28',
    'Mcp-Method': method,
  });
  if (typeof name === 'string') headers.set('Mcp-Name', name);
  const response = await fetch(endpoint, {
    method: 'POST', headers, credentials: 'omit', signal: AbortSignal.timeout(10_000),
    body: JSON.stringify({ jsonrpc: '2.0', id: ++requestId, method,
      params: { ...params, _meta: metadata } }),
  });
  // This endpoint returns JSON. Other MCP servers can return an SSE stream.
  const message = await response.json();
  if (!response.ok || message.error) throw new Error('MCP request failed');
  return message.result;
}

console.log(await rpc('server/discover'));
console.log(await rpc('tools/list'));
console.log(await rpc('tools/call', {
  name: 'search_docs', arguments: { query: 'fallback cancellation', limit: 3 },
}));
console.log(await rpc('tools/call', {
  name: 'get_doc', arguments: { slug: 'quickstart' },
}));
console.log(await rpc('tools/call', { name: 'list_providers', arguments: {} }));
console.log(await rpc('tools/call', {
  name: 'get_provider', arguments: { id: 'context' },
}));
console.log(await rpc('tools/call', { name: 'list_examples', arguments: {} }));
// Pass a returned example ID to get_example; do not infer an ID or execute it.
export {};

Handle request limits

Keep request bodies below 16 KiB. The server allows three seconds to receive the body, a five-second total request deadline, and responses up to 512 KiB. Article text stays below 128 KiB per record. Prefer search snippets and individual articles over fetching the entire catalog.

Rate limits apply per server instance: a client socket address has a burst of 30 requests and refills at 60 per minute; the aggregate burst is 120 and refills at 240 per minute. Up to 12 requests run concurrently. Forwarded-address headers are ignored, so clients behind a reverse proxy can share one address bucket. On HTTP 429, respect Retry-After before retrying. These limits are local protective bounds, not a guaranteed service quota or availability promise.

Read exact resources

Clients can enumerate the exact resource catalog with resources/list. There are no resource templates. Read an enumerated URI with resources/read. The introduction is searchsdk://docs/index; other documentation uses searchsdk://docs/ followed by encodeURIComponent(slug). Provider and example resources use searchsdk://providers/ or searchsdk://examples/ followed by encodeURIComponent(id).

Resource request · params
{
  "uri": "searchsdk://docs/reliability%2Ffallback",
  "_meta": {
    "io.modelcontextprotocol/protocolVersion": "2026-07-28",
    "io.modelcontextprotocol/clientInfo": { "name": "docs-reader", "version": "1.0.0" },
    "io.modelcontextprotocol/clientCapabilities": {}
  }
}

Send these params with JSON-RPC method resources/read, header Mcp-Method: resources/read, and matching header Mcp-Name: searchsdk://docs/reliability%2Ffallback. Documentation text is bounded below 128 KiB per article. The endpoint serves exact resources from its generated catalog rather than reading arbitrary filesystem paths.

Load the searchSDK integration skill

The server publishes one curated skill through the official io.modelcontextprotocol/skills extension: skill://searchsdk/SKILL.md. It guides provider selection, server integration, fallback, cancellation, errors, and local fixture checks. It does not authorize live provider calls. Directory reads are not supported.

After server/discover advertises the extension, use skills/list or skills/get with { "uri": "skill://searchsdk/SKILL.md" }, including the same required per-request metadata. Read that URI with resources/read. The manifest contains the SHA-256 digest and exact UTF-8 byte size of the single file. Skill-capable hosts verify the manifest and frontmatter and apply their skill-loading and approval rules before activation; an ordinary resource read does not activate the skill.

Read without an MCP client

Every public page has a Markdown export discoverable through an HTML rel="alternate" link with type="text/markdown". rel="describedby" points to /llms.txt. The short index links to the main references; /llms-full.txt is an optional full-text concatenation, not a required part of the llms.txt proposal. Generated JSON indexes are searchSDK-specific formats, not new MCP or web standards.