{"components":{"schemas":{"JsonRpcRequest":{"description":"A JSON-RPC 2.0 request, as the Model Context Protocol sends.","properties":{"id":{"description":"Request id (absent on notifications)."},"jsonrpc":{"const":"2.0","type":"string"},"method":{"description":"The MCP method, e.g. `initialize` or `tools/call`.","type":"string"},"params":{"description":"Method parameters.","type":"object"}},"required":["jsonrpc","method"],"type":"object"},"JsonRpcResponse":{"description":"A JSON-RPC 2.0 response: a `result` or an `error`.","properties":{"error":{"properties":{"code":{"type":"integer"},"data":{},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"id":{},"jsonrpc":{"const":"2.0","type":"string"},"result":{"type":"object"}},"required":["jsonrpc"],"type":"object"},"NavLink":{"properties":{"href":{"description":"Link target — an internal route or an external URL.","type":"string"},"icon":{"description":"Optional icon name.","type":"string"},"label":{"type":"string"}},"required":["href","label"],"type":"object"},"NavNode":{"description":"A sidebar entry: a page (linking to its route) or a group holding further nodes.","oneOf":[{"properties":{"badge":{"type":"string"},"deprecated":{"type":"boolean"},"description":{"type":"string"},"icon":{"type":"string"},"kind":{"const":"page","type":"string"},"label":{"type":"string"},"pageId":{"description":"The page's stable content id.","type":"string"},"route":{"description":"The page's route.","type":"string"}},"required":["kind","label","pageId","route"],"type":"object"},{"properties":{"badge":{"type":"string"},"children":{"items":{"$ref":"#/components/schemas/NavNode"},"type":"array"},"collapsed":{"type":"boolean"},"icon":{"type":"string"},"kind":{"const":"group","type":"string"},"label":{"type":"string"},"path":{"description":"The group's route prefix (not necessarily a page).","type":"string"},"route":{"description":"The group's index page route, when it has one.","type":"string"}},"required":["children","kind","label"],"type":"object"}]},"NavSelector":{"description":"A top-level partition selector (products, versions, languages).","properties":{"items":{"items":{"properties":{"description":{"type":"string"},"label":{"type":"string"},"path":{"type":"string"},"tag":{"type":"string"}},"required":["label","path"],"type":"object"},"type":"array"},"kind":{"type":"string"},"label":{"type":"string"}},"required":["items","kind","label"],"type":"object"},"NavTab":{"properties":{"href":{"description":"The clickable target when it differs from `path` (the section's first page).","type":"string"},"icon":{"type":"string"},"label":{"type":"string"},"path":{"description":"The tab's section prefix.","type":"string"}},"required":["label","path"],"type":"object"},"Navigation":{"description":"The docs navigation model: header tabs, the sidebar tree, partition selectors, and pinned links.","properties":{"actions":{"items":{"$ref":"#/components/schemas/NavLink"},"type":"array"},"cta":{"oneOf":[{"$ref":"#/components/schemas/NavLink"},{"type":"null"}]},"featured":{"items":{"$ref":"#/components/schemas/NavLink"},"type":"array"},"repoUrl":{"type":["string","null"]},"root":{"description":"The tree root's route (`/`, or a locale/version prefix).","type":"string"},"selectors":{"items":{"$ref":"#/components/schemas/NavSelector"},"type":"array"},"sidebar":{"items":{"$ref":"#/components/schemas/NavNode"},"type":"array"},"tabs":{"items":{"$ref":"#/components/schemas/NavTab"},"type":"array"}},"required":["featured","selectors","sidebar","tabs"],"type":"object"},"Page":{"allOf":[{"$ref":"#/components/schemas/PageSummary"},{"properties":{"markdown":{"description":"The page as agent Markdown: frontmatter included, components downleveled to plain Markdown.","type":"string"}},"required":["markdown"],"type":"object"}],"description":"A page's index entry plus its full Markdown body."},"PageSummary":{"properties":{"contentType":{"description":"The page's content type (frontmatter `type`).","type":"string"},"description":{"type":"string"},"facets":{"additionalProperties":{"type":"string"},"description":"Facet values the site declares for the page's content type (`content.types.<type>.facets`), key → value.","type":"object"},"json":{"description":"This page's JSON representation (the `getPage` operation).","format":"uri-reference","type":"string"},"lastModified":{"description":"ISO 8601 last-modified date, when known.","type":["string","null"]},"locale":{"description":"The page's locale code.","type":"string"},"markdownUrl":{"description":"The page's raw-Markdown mirror (the `getPageMarkdown` operation).","format":"uri-reference","type":"string"},"route":{"description":"The page's route (`/guides/install`); the key every other operation takes.","type":"string"},"title":{"type":"string"},"url":{"description":"Where the rendered page is served.","format":"uri-reference","type":"string"},"version":{"description":"Docs version the page belongs to on a versioned site: `\"\"` for the current docs, else an archived version id. Absent on unversioned sites.","type":"string"}},"required":["contentType","json","lastModified","locale","markdownUrl","route","title","url"],"type":"object"},"PagesIndex":{"properties":{"count":{"type":"integer"},"generator":{"description":"The Blume version that built the site.","type":"string"},"pages":{"items":{"$ref":"#/components/schemas/PageSummary"},"type":"array"},"site":{"type":["string","null"]}},"required":["count","generator","pages","site"],"type":"object"},"Problem":{"description":"RFC 9457 problem details, with a stable code and a resolution hint.","properties":{"code":{"description":"Stable error code (e.g. `PAGE_NOT_FOUND`).","type":"string"},"detail":{"description":"Human-readable explanation of this occurrence.","type":"string"},"instance":{"description":"The request path the problem occurred on.","type":"string"},"links":{"description":"Recovery links, when there is somewhere useful to go.","items":{"properties":{"href":{"type":"string"},"label":{"type":"string"}},"required":["href","label"],"type":"object"},"type":"array"},"resolution":{"description":"What to do next.","type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"description":"Problem type URI; `about:blank` by default.","type":"string"}},"required":["code","detail","resolution","status","title","type"],"type":"object"},"SearchHit":{"properties":{"contentType":{"type":"string"},"excerpt":{"description":"The page description, else the start of its content.","type":"string"},"facets":{"additionalProperties":{"type":"string"},"description":"Facet values the site declares for the page's content type (`content.types.<type>.facets`), key → value.","type":"object"},"route":{"description":"The page's route; pass it to `getPage`.","type":"string"},"title":{"type":"string"},"url":{"format":"uri-reference","type":"string"},"version":{"description":"Docs version the page belongs to on a versioned site: `\"\"` for the current docs, else an archived version id. Absent on unversioned sites.","type":"string"}},"required":["excerpt","route","title","url"],"type":"object"},"SearchResponse":{"properties":{"count":{"type":"integer"},"query":{"type":"string"},"results":{"items":{"$ref":"#/components/schemas/SearchHit"},"type":"array"}},"required":["count","query","results"],"type":"object"}}},"info":{"description":"Read-only JSON API over the Specific Docs documentation: Specific enables any coding agent to define infrastructure for the code it writes. Start building locally and deploy to production in minutes.\n\nEvery operation is public and needs no authentication. Errors are RFC 9457 problem details (`application/problem+json`) with a stable `code`, a `detail`, and a `resolution` hint.","title":"Specific Docs API","version":"2.0.3","x-generator":"blume@2.0.3"},"openapi":"3.1.0","paths":{"/api/docs/pages.json":{"get":{"description":"Every documentation page with its route, title, description, content type, locale, facets, and the URLs of its rendered, Markdown, and JSON forms. Unfiltered; on a versioned site every version is listed with its `version`. Use it to enumerate the docs or to find a page when search is too narrow.","operationId":"listPages","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesIndex"}}},"description":"The page index."},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"An error, as problem details."}},"summary":"List every page","tags":["Pages"]}},"/api/docs/pages/{route}.json":{"get":{"description":"A single page as JSON: its index entry plus the page's agent Markdown (frontmatter included, components downleveled to plain Markdown). Take `route` from `listPages` or `searchDocs`.","operationId":"getPage","parameters":[{"description":"The page route without its leading slash (`guides/install`), or `index` for the home page. May contain slashes.","in":"path","name":"route","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}},"description":"The page."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No page has that route."},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"An error, as problem details."}},"summary":"Get a page as JSON","tags":["Pages"]}},"/api/docs/navigation.json":{"get":{"description":"The navigation tree (header tabs and the sidebar hierarchy) as readers see it, for the default locale and the current docs.","operationId":"getNavigation","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Navigation"}}},"description":"The navigation tree."},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"An error, as problem details."}},"summary":"Get the navigation tree","tags":["Navigation"]}},"/api/docs/search":{"get":{"description":"Full-text search across the documentation. Returns matching pages with their title, route, content type, and a short excerpt; narrow by content type, locale, version, or facet. Use it first to discover relevant pages, then `getPage` to read one in full.","operationId":"searchDocs","parameters":[{"description":"The search query.","in":"query","name":"q","required":true,"schema":{"minLength":1,"type":"string"}},{"description":"Maximum hits to return (default 8, at most 20).","in":"query","name":"limit","required":false,"schema":{"default":8,"maximum":20,"minimum":1,"type":"integer"}},{"description":"Only include pages of these content types (frontmatter `type`, e.g. `doc`, `rfc`). Comma-separated or repeated. Omit for every type.","explode":false,"in":"query","name":"contentTypes","required":false,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"Only include pages in this locale (e.g. `fr`). Omit for every language.","in":"query","name":"locale","required":false,"schema":{"type":"string"}},{"description":"Docs version to scope to on a versioned site: `latest` (the default — current docs only), `all`, or an archived version id. Ignored when the site is unversioned.","in":"query","name":"version","required":false,"schema":{"type":"string"}},{"description":"Only include pages matching every facet, as `filters[key]=value` pairs (e.g. `filters[status]=enforced`). Facets are metadata the site declares per content type; the page index shows each page's values.","explode":true,"in":"query","name":"filters","required":false,"schema":{"additionalProperties":{"type":"string"},"type":"object"},"style":"deepObject"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"description":"The matching pages, best first."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The query was missing or blank."},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"An error, as problem details."}},"summary":"Search the docs","tags":["Search"]}},"/{route}.md":{"get":{"description":"A page's raw-Markdown mirror: append `.md` to any page URL. Components are downleveled to plain Markdown; `.mdx` serves the source as written. The same body the `getPage` operation carries in its `markdown` field.","operationId":"getPageMarkdown","parameters":[{"description":"The page route without its leading slash (`guides/install`), or `index` for the home page. May contain slashes.","in":"path","name":"route","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"text/markdown":{"schema":{"type":"string"}}},"description":"The page as Markdown."},"404":{"content":{"text/markdown":{"schema":{"type":"string"}}},"description":"No page has that route; the body lists where to look next."}},"summary":"Get a page as Markdown","tags":["Markdown"]}},"/llms.txt":{"get":{"description":"The llms.txt index: the site's summary, when to use it, and every page with a one-line description, grouped by section.","operationId":"getLlmsTxt","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"The index."}},"summary":"Get llms.txt","tags":["Markdown"]}},"/llms-full.txt":{"get":{"description":"The full Markdown of every current-docs page in one file.","operationId":"getLlmsFullTxt","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Every page's Markdown."}},"summary":"Get llms-full.txt","tags":["Markdown"]}},"/agent-readability.json":{"get":{"description":"A manifest indexing every agent-facing artifact the site publishes — this API, the Markdown mirrors, llms.txt, the MCP server, feeds, and the sitemap.","operationId":"getAgentReadability","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"The manifest."}},"summary":"Get the agent-readability manifest","tags":["Discovery"]}},"/mcp":{"post":{"description":"The Model Context Protocol server (Streamable HTTP, stateless, JSON responses). Send `Accept: application/json, text/event-stream`: the Streamable HTTP transport requires a client to accept both and answers `406` otherwise, though this server always replies with JSON. Tools: `search_docs`, `get_page`, `list_pages`, `get_navigation` — the same operations this API exposes — plus every page as a `text/markdown` resource. Discovery document at `/.well-known/mcp.json`.","operationId":"mcp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}},"text/event-stream":{"schema":{"type":"string"}}},"description":"The JSON-RPC response."},"406":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}},"description":"The request's `Accept` header doesn't list both `application/json` and `text/event-stream`."}},"summary":"Call the MCP server","tags":["MCP"]}}},"security":[],"servers":[{"description":"Specific Docs","url":"https://docs.specific.dev"}],"tags":[{"description":"Enumerate and read documentation pages.","name":"Pages"},{"description":"Full-text search over the docs.","name":"Search"},{"description":"How the docs are organized.","name":"Navigation"},{"description":"Plain-text and Markdown surfaces.","name":"Markdown"},{"description":"Agent discovery documents.","name":"Discovery"},{"description":"The Model Context Protocol endpoint.","name":"MCP"}],"externalDocs":{"description":"Specific Docs documentation","url":"https://docs.specific.dev/"}}