Citadel MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| docsA | Run JavaScript in a local Node sandbox. Write ONE async arrow function that returns a value. Inside the sandbox you have:
Fan out independent calls with Promise.all — that is why this tool exists. N tool calls collapse into one MCP round-trip. Available tools:
type NextjsDocsInput = {
/** Documentation path (e.g., '/docs/app/api-reference/functions/refresh'). Do NOT include a '.md' suffix — the tool appends it. Get valid paths by calling codemode.nextjs_index() first. App Router only — Pages Router paths ('/docs/pages/...') are not supported. /
path: string;
/* Optional anchor/section from the index (e.g., 'usage'). Included in response metadata to indicate relevant section. /
anchor?: string;
};
type NextjsDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type ReactDocsInput = {
/* Documentation path (e.g., '/learn/react-compiler.md' or '/reference/react/useState.md'). The path includes the .md suffix as listed in the index. Get valid paths by calling codemode.react_index() first. /
path: string;
};
type ReactDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type TurborepoDocsInput = {
/* Documentation path (e.g., '/guides/tools/docker.md', '/reference/run.md', or 'index.md'). Paths are relative to '/docs/'; the tool resolves them under turborepo.dev/docs/. Get valid paths by calling codemode.turborepo_index() first. /
path: string;
};
type TurborepoDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type SupabaseDocsInput = {
/* Guide path (e.g., '/docs/guides/functions/auth'). Must start with '/docs/guides/'. Do NOT include a '.md' suffix — the tool appends it. Get valid paths by calling codemode.supabase_index() first. /
path: string;
};
type SupabaseDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type EffectDocsInput = {
/* Documentation path (e.g., '/docs/batching/' or '/docs/schema/introduction/'). Paths are pathnames from effect.website with the trailing slash, exactly as listed in the index. Get valid paths by calling codemode.effect_index() first. /
path: string;
};
type EffectDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type OxcDocsInput = {
/* Documentation path from the index (e.g., '/docs/guide/usage/linter/automatic-fixes.md'). Paths already include the '.md' suffix as listed in the index. Get valid paths by calling codemode.oxc_index() first. /
path: string;
};
type OxcDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type TanstackStartDocsInput = {
/* Documentation path from the index (e.g., '/start/latest/docs/framework/react/overview'). Do NOT include a '.md' suffix — the tool appends it. Get valid paths by calling the matching codemode.tanstack_index() first. /
path: string;
};
type TanstackStartDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type TanstackRouterDocsInput = {
/* Documentation path from the index (e.g., '/start/latest/docs/framework/react/overview'). Do NOT include a '.md' suffix — the tool appends it. Get valid paths by calling the matching codemode.tanstackindex() first. /
path: string;
};
type TanstackRouterDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type TanstackQueryDocsInput = {
/* Documentation path from the index (e.g., '/start/latest/docs/framework/react/overview'). Do NOT include a '.md' suffix — the tool appends it. Get valid paths by calling the matching codemode.tanstack_index() first. /
path: string;
};
type TanstackQueryDocsOutput = {
path: string;
url?: string;
content?: string;
anchor?: string | null;
error?: string;
message?: string;
};
type DocsSearchInput = {
/* Free-text search query. Tokenized on whitespace and punctuation. /
query: string;
/* Stacks to search (e.g. ['nextjs', 'react']). Defaults to all registered stacks. /
stacks?: string[];
/* Maximum matches to return. Default 10. /
limit?: number;
/* When true, fan out doc fetches in parallel and attach /**
Example (parallel cross-stack survey, the common case): Example (parallel cross-stack survey): async () => { const [nextjsIdx, reactIdx, turborepoIdx, supabaseIdx, effectIdx, oxcIdx, tanstack_startIdx, tanstack_routerIdx, tanstack_queryIdx] = await Promise.all([ codemode.nextjs_index(), codemode.react_index(), codemode.turborepo_index(), codemode.supabase_index(), codemode.effect_index(), codemode.oxc_index(), codemode.tanstack_start_index(), codemode.tanstack_router_index(), codemode.tanstack_query_index(), ]); // Pick relevant paths from each index, then fan out doc fetches with another Promise.all. return { nextjsIdx, reactIdx, turborepoIdx, supabaseIdx, effectIdx, oxcIdx, tanstack_startIdx, tanstack_routerIdx, tanstack_queryIdx }; } Return the value the caller needs. If you console.log, output is captured in a [logs] block alongside the result. For deeper patterns read the MCP resource |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| agent-usage | Full playbook for writing `docs` calls against the Citadel codemode SDK: workflow, parallel fan-out patterns, error handling, common mistakes. Read once before your first `docs` call. |
TDQS
Scored across 1 tool
Only one MCP tool is exposed, so there is no possibility of selecting the wrong tool. The internal codemode methods are clearly named and described, leaving no ambiguity about what each call does.
The single tool name 'docs' is simple and matches the documentation domain. Internal methods follow a consistent snake_case pattern (e.g., nextjs_docs, react_index), and no conflicting naming conventions appear across the tool surface.
With only one MCP tool, the server feels severely undersurfaced for its broad scope covering nine documentation stacks. The design hides ~20 callable methods behind a single JS sandbox, reducing discoverability and forcing agents to write code to access basic functionality.
The tool provides comprehensive coverage of the documentation domain: per-stack indices, path-based doc fetchers, and a cross-stack search with optional content fetching. There are no obvious gaps in the workflow.