The Context-Saver
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., "@The Context-Saverfind tools for querying Postgres and count users in the users table"
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.
The Context-Saver is an MCP Gateway/Router: one Model Context Protocol server that multiplexes all of your other MCP servers, and hands the model only the tool schemas it needs for the current turn. Connect one thing. Get everything. Burn almost nothing.
Why · Quick Start (60 s) · How it works · The 8 meta-tools · Configuration · Auth · Real numbers · FAQ
The pain point
You installed one MCP server and it was magic. Then you added a second. A third. Ten. Now, before you type a single word, every server has injected its full tool schema into your context window:
10 servers ≈ 15,000–20,000 tokens burned per session — you pay for it on every request, on every provider
the model sees hundreds of tools at once and starts hallucinating workflows that don't exist ("let me just use
db_migrate_hotfix…")your $200/mo API plan is quietly funding a 20k-token preamble you never asked for
add a server, and your entire team's prompts get worse
This is one of the most common complaints on developer forums right now. The schemas aren't the problem — loading them all upfront is.
Related MCP server: AISIX AI Gateway
The idea
Don't connect 10 servers to Claude Code / Cursor / whatever. Connect one: the Context-Saver gateway.
flowchart LR
subgraph before["❌ Direct: N servers"]
L1[Claude Code]
S1[Server A<br/>40 tools<br/>~4.7k tok]
S2[Server B<br/>25 tools<br/>~2.9k tok]
S3[Server C<br/>12 tools<br/>~1.4k tok]
SD[Dots ×7 more]
L1 -->|full schemas<br/>ALL AT ONCE| S1
L1 --> S2
L1 --> S3
L1 -.-> SD
endflowchart LR
subgraph after["✅ With the Context-Saver gateway"]
L2[Claude Code]
GW[Context-Saver Gateway<br/>8 fixed meta-tools<br/>~1.3k tok — CONSTANT]
U1[Server A]
U2[Server B]
U3[Server C]
U4[Server …]
L2 -->|one connection| GW
GW -.->|lazy: schemas only<br/>when actually needed| U1
GW -.-> U2
GW -.-> U3
GW -.-> U4
endThe gateway speaks MCP on one side and is an MCP client on the other. It indexes every upstream's tools, then serves the model a fixed menu of 8 meta-tools. When a prompt arrives, suggest_tools ranks the catalog against the prompt and returns the matched tools with their schemas in the same response — so one cheap call replaces the entire upfront burn.
Why schemas stay fixed but the model still knows what exists: the 8 meta-tools include a compact catalog (list_tools: name + one-line description, no schemas) and search_tools. The model can see what exists for ~2–3k tokens on a 90-tool setup, then load the exact schema it wants, when it wants it.
Quick Start in 60 Seconds
1 — Declare your upstream servers (the only file you'll ever edit):
mkdir -p ~/.context-saver
cp servers.example.json ~/.context-saver/servers.json
$EDITOR ~/.context-saver/servers.json # point at *your* servers2 — Connect your host to the gateway instead of N servers.
Local (stdio — Claude Code, Cursor, VS Code, any MCP host):
npx context-saver-mcp # that's the whole server// e.g. Claude Code / claude_desktop_config.json
{
"mcpServers": {
"context-saver": { "command": "npx", "args": ["-y", "context-saver-mcp"] }
}
}Remote (Streamable HTTP + SSE, zero-copy-paste-JSON-for-auth) — step 3 only if you want the OAuth popup instead of a static key:
npx context-saver-mcp --transport http --port 6480 --auth oauth
# stderr prints:
# OAuth 2.1 (PKCE) ready: /oauth/authorize (popup) · /oauth/token
# listening on http://127.0.0.1:6480/mcpPoint any MCP host (or your whole team) at http://<host>:6480/mcp. No API keys in client JSON — the host pops the login page (see it rendered), the user enters the access code, PKCE completes, done.
That's the whole setup. Ask your agent something and watch it call suggest_tools first instead of drowning in 92 schemas.
How it works
Architecture
flowchart TB
subgraph client["MCP host (Claude Code, Cursor, VS Code, …)"]
M[model]
end
subgraph gw["context-saver-mcp — the single-file gateway"]
direction TB
T1["stdio transport (local)"]
T2["Streamable HTTP + SSE (remote)<br/>sessions · idle sweeping · DELETE"]
AUTH["Auth: none | apikey | OAuth 2.1 + PKCE<br/>RFC 8414 / 9728 discovery · popup login"]
META["8 fixed meta-tools<br/>(~1.3k tokens, CONSTANT)"]
IDX["Catalog index + token accounting<br/>persisted cache (~/.context-saver/cache.json)"]
POOL["Lazy connection pool<br/>timeouts · 1 reconnect-replay<br/>circuit breakers · EMA latency"]
end
subgraph upstreams["Your existing MCP servers — unmodified"]
U1["stdio<br/>npx … / uvx …"]
U2["Streamable HTTP"]
U3["legacy SSE"]
end
M --> T1
M --> T2
T2 --> AUTH
T1 --> META
T2 --> META
META --> IDX
META --> POOL
POOL --> U1
POOL --> U2
POOL --> U3One turn, end to end
sequenceDiagram
autonumber
participant U as You
participant M as Model
participant G as Context-Saver gateway
participant W as Upstream (e.g. weather)
U->>M: "What's the weather forecast for Kuala Lumpur tomorrow?"
M->>G: suggest_tools { prompt }
Note over G: scores the 92-tool catalog<br/>against the prompt (IDF-weighted)
G-->>M: matches + schemas of the top tools<br/>272 tokens — the ONLY schemas loaded
M->>G: call_tool { server: "weather", tool: "get_forecast", arguments }
G->>W: MCP tools/call (lazy-dials if idle)
W-->>G: result
G-->>M: result (passed through, errors normalized)
Note over M: total context cost this turn: gateway 1.3k + 272<br/>direct-connect would have burned 8.3kThe 8 meta-tools
Tool | What it does | Token cost |
| Upstream registry + health + circuit state | tiny, fixed |
| Compact catalog — names + one-liners, no schemas | ~30 tok per 10 tools |
| Keyword search with reasons and per-tool schema cost | tiny |
| The core trick: prompt → ranked matches with schemas in one response | ~200–300 tok |
| Load exactly one full JSON schema | the schema, only when needed |
| Execute on the upstream (timeout, reconnect, breaker) | passthrough |
| Health + the live context-savings report | tiny |
| Hot-reload | tiny |
Fixed menu. The footprint never grows as you add upstreams — that's the whole point. (The instructions shipped to the host model teaches it this workflow.)
Configuration
One file, searched in this order: --config <path> → CS_CONFIG → ~/.context-saver/servers.json → ./servers.json. See servers.example.json and the machine-checked docs/config-schema.schema.json.
{
"defaults": { "callTimeoutMs": 60000, "breakerThreshold": 3 },
"servers": [
{ "name": "github", "type": "http", "url": "https://mcp.github.com/mcp",
"headers": { "authorization": "Bearer ${GITHUB_MCP_TOKEN}" } }, // ${ENV} expanded — no secrets in the file
{ "name": "filesystem", "type": "stdio", "command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "~/projects"],
"exclude": ["write_*"] }, // glob tool filtering
{ "name": "sqlite", "type": "stdio", "command": "uvx",
"args": ["mcp-server-sqlite", "--db-path", "~/data/app.db"] },
{ "name": "legacy", "type": "sse", "url": "http://10.0.0.4:8901/sse", "disabled": true }
]
}Every upstream gets: per-call timeout (default 60 s), connect timeout (15 s), one automatic reconnect+replay on transport death, and a circuit breaker (3 consecutive failures → open → fast-fail for 30 s → half-open probe) so one dead server can never stall your agent's turn. ${VAR} expansion works in command, args, env, url, headers and cwd.
reload_config (or SIGHUP in HTTP mode) applies edits live: unchanged upstreams keep their connections, changed ones are swapped, removed ones are disconnected — and a broken file never takes down the running setup.
Zero-friction auth (OAuth popup, no keys in JSON)
Remote mode supports three auth levels — pick per deployment:
Mode | Setup | Who it's for |
| — | localhost / private network behind a VPN |
|
| personal remote, single user |
|
| teams — the "viral" path: no API keys in client config files, ever |
The oauth mode is a built-in OAuth 2.1 authorization server with everything MCP hosts expect:
/.well-known/oauth-protected-resource(RFC 9728) +/.well-known/oauth-authorization-server(RFC 8414) discoveryWWW-Authenticate: Bearer resource_metadata=…on 401 (so Claude / Cursor auto-discover the flow)Popup login page — user types the access code, no API keys, no JSON
PKCE (S256) mandatory, single-use 120 s codes, rotating refresh tokens, HMAC-signed access tokens
Dynamic client registration (RFC 7591) for hosts that use it
Details and threat model: SECURITY.md.
Real numbers (measured, not marketing)
From the captured demo session (92 tools across 6 upstreams — scripts/gif-session.mjs + the at scale integration test):
Direct-connect | Context-Saver gateway | |
Tool schemas in context, before first prompt | 8,295 tokens | 0 (catalog metadata only) |
Fixed menu the model always sees | — (grows with every server) | 1,322 tokens, constant |
| — | 272 tokens incl. the 2 schemas it needed |
Session total after a real forecast call | 8,295 | 1,594 → 84 % saved |
Idle turn cost | 8,295 tokens, every request | ~0 marginal |
At ~$3/M input tokens, one heavy user burning 8.3k tokens on every request, 50 requests/day pays ≈ $37/month for schemas alone. The same usage through the gateway: ~$6. Scaling is linear: add servers, the direct-connect column grows, the gateway column stays ~1.3k + what you actually load.
Resilience you get for free
Lazy everything — upstreams that are never called never spawn a process or open a socket; cold starts serve the persisted catalog instantly
One bad server can't hurt you — timeouts, breakers and normalized errors per upstream; the audit even has a test where a nonexistent binary fast-fails while
weatherkeeps answeringdid you meanUX — unknown server/tool typos get Levenshtein suggestions instead of dead endsSane HTTP server semantics — session ids, 400/404/405/413 handling, CORS,
/health, idle-session sweeping, clean shutdown (no hanging keep-alive sockets — that was a real bug we fixed)Stdout is sacred — in stdio mode all logging goes to stderr;
no-consoleis a lint rule because one strayconsole.logcorrupts the JSON-RPC stream
Contributing & Good First Issues
The entire server is one readable, section-bounded file (~2,000 lines, no build step) — read sections 1–11 top to bottom and you've read the whole product. CONTRIBUTING.md maps sections to starter issues.
Current :
Prompt ranking is TF-IDF, not embeddings (§5) — deterministic and dependency-free, but a pluggable
Scorerinterface would let people add smarter rankersresources/promptspassthrough (§7) — the gateway multiplexes tools only todayOAuth state persistence (§8) — codes/refresh tokens are in-memory per process; a pluggable store would enable multi-instance deployments
IdP delegation (§8) — "Continue with GitHub" login option behind the popup
Upstream
include/excludetests on Windows (§3) — glob behavior across path separators
Node ≥ 18.19, zero runtime dependencies beyond @modelcontextprotocol/sdk + zod, npm test runs 42 tests in ~20 s.
FAQ
Does this break the host's tool discovery? No — it replaces it. The model sees 8 stable meta-tools (fewer than most single servers) plus a compact catalog. MCP tools/list pagination is honored upstream; nothing is truncated silently.
Is the ranking "AI"? It's honest engineering: tokenization, stopwording, camelCase/snake_case splitting and IDF weighting — deterministic, testable, no API calls. For most prompts it lands the right tool; search_tools/list_tools cover the rest, and the model always stays in control.
What about latency? One extra hop on the LAN/localhost. Lazy connections mean a cold upstream pays its connect time once, on first use; hot calls add ~1 ms of routing.
Can it multiplex resources and prompts? Not yet — tools only in 1.0.0 (see good first issues; the section-bounded codebase makes this a contained change).
Why OAuth instead of just an API key? Both work (apikey mode is one env var). OAuth mode exists because copying bearer tokens into local client JSON is the #1 friction killing MCP tool adoption in teams — the popup flow means a new teammate connects in one click.
Single file — isn't that bad engineering? It's a feature: npx context-saver-mcp downloads one readable artifact with no build step, every section is exported for testing, and the audit trail shows fixes landing in a single file with full test coverage. The tests/ tree is where the structure lives.
MIT © Gatsuke · Built because 20k tokens of schemas before breakfast is 19k too many.
Available Tools
8 toolscall_toolExecute an upstream toolA
Run a tool on an upstream MCP server. Arguments are passed through unmodified and validated by the upstream against the schema you loaded. Timeouts, one automatic reconnect, and a circuit breaker protect your turn from stuck upstreams.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | Tool name on that server | |
| server | Yes | Upstream server name | |
| arguments | No | Arguments exactly as the tool schema defines |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description carries most of the burden and does so well: it discloses pass-through argument handling with upstream-side validation, plus timeouts, one automatic reconnect, and a circuit breaker. The retry detail is genuinely load-bearing for reasoning about non-idempotent upstream tools. It omits auth requirements and how upstream failures are surfaced as errors.
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 sentences, each doing distinct work: purpose, argument handling, failure/resilience behavior. The purpose is front-loaded and there is no filler or restatement of the title.
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?
There is no output schema, so the description should explain what a successful call returns (tool result content, shape, error form), and it does not. For a generic pass-through executor with a nested free-form arguments object, the behavioral coverage is strong but the return contract is left entirely implicit.
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, but the description adds real meaning: arguments are passed through unmodified and validated by the upstream against a previously loaded schema. That tells the agent the local schema will not reject content and that malformed arguments fail remotely, which the schema alone does not convey.
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 opens with a specific verb and resource: "Run a tool on an upstream MCP server." That is clearly distinct from the sibling set (list_servers, list_tools, search_tools, get_tool_schema, gateway_status), but no sibling is named, so differentiation is inferable rather than explicit.
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?
The phrase "the schema you loaded" implies get_tool_schema should precede this call, which is a useful workflow hint, but the ordering is never stated as guidance. There is no explicit statement of when to use this versus searching/suggesting tools, and no exclusions for cases where a call should not be attempted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gateway_statusGateway health & savings reportARead-onlyIdempotent
Health of every upstream (status, latency, error counts, breaker state) plus the context-savings report: tokens a direct connection would burn vs. tokens this session actually spent.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly=true and idempotent=true, so the safety profile is covered. The description adds real value beyond that by disclosing the exact data surface (breaker state, error counts, and a cost-delta computation), which is not derivable from annotations or a zero-parameter schema. It stops short of saying whether the numbers come from live probes or cached aggregation, which matters for freshness of 'latency'.
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 two clearly delineated payloads (health, savings) and no filler. It is dense — the parenthetical list and the colon clause pack a lot into one sentence — but every clause carries information an agent needs.
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 describing return values, and it does so field-by-field, which is appropriate for a no-argument diagnostic. What remains unclear is the shape/unit of the response (per-upstream records, token counts as integers, any aggregate totals), a modest gap for a reporting 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?
Zero parameters, so the baseline applies; there is nothing the description could document that the schema does not already settle. The description correctly focuses its words on outputs rather than inventing parameter 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?
Names a concrete resource (every upstream) and enumerates exactly what is reported: status, latency, error counts, breaker state — plus a second, separately described output (context-savings comparison of direct-connection tokens vs. tokens actually spent). No sibling tool overlaps with health/savings reporting, so an agent can identify it unambiguously.
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 'call this to check upstream health or see token savings', but the description never states when to prefer it over the sibling listing tools (list_servers, list_tools) that also reveal configuration state. No prerequisites, no exclusions, no explicit triggering condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tool_schemaLoad one full tool schemaARead-onlyIdempotent
Fetch the complete JSON schema (and annotations) of exactly ONE upstream tool — the precise, lazy-loading primitive. Prefer suggest_tools when you only have a vague prompt; call this when you already know the tool.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | Tool name on that server | |
| server | Yes | Upstream server name from list_servers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety is covered. The description still adds real context: it is a lazy-loading primitive that returns schema and annotations rather than executing anything, which tells the agent the call is metadata-only. It does not cover failure behavior for an unknown server/tool name.
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 core action front-loaded and the sibling routing placed second. Every clause earns its place.
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-parameter read tool with full schema coverage and safety annotations, nothing needed to call it correctly is missing; the description even states what the response contains (schema plus annotations), compensating for the absent output 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 description coverage is 100%, with both 'server' and 'tool' documented in-schema, including the pointer to list_servers. The description reinforces the one-tool scope but adds no syntax, format, or naming details beyond the schema, so 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?
States a specific verb and resource: fetch the complete JSON schema plus annotations for exactly one upstream tool. The phrase 'exactly ONE' and 'the precise, lazy-loading primitive' separates it from the listing/search siblings (list_tools, search_tools) without needing their schemas.
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?
Explicitly routes between alternatives: use suggest_tools for a vague prompt, use this when the tool is already known. This is a direct when-to-use / when-not-to-use split naming the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_serversList upstream MCP serversARead-onlyIdempotent
List the upstream MCP servers multiplexed by this gateway, with health, circuit-breaker state and tool counts. Cheap: call this first to orient yourself.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent, so the safety profile is covered; the description adds value beyond them by disclosing the returned facets (health, circuit-breaker state, tool counts) and a relative cost signal. It does not discuss failure modes or whether unhealthy servers still appear, which keeps it below a 5.
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, both earning their place: the first front-loads what is returned, the second front-loads the cost-and-ordering advice. No filler, no restatement of the title.
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 zero-argument, read-only discovery tool with no output schema, the description supplies the returned fields and the call-ordering guidance an agent needs. Nothing material is missing for correct invocation.
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?
The tool takes zero parameters, so there is no parameter meaning to convey and the schema is complete by construction; baseline 4 applies. The description correctly implies an unfiltered listing by adding no filtering or pagination talk.
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 upstream MCP servers') plus scope ('multiplexed by this gateway') and the payload contents (health, circuit-breaker state, tool counts). This clearly separates it from list_tools/search_tools (tools, not servers) and gateway_status, without needing to name a sibling.
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?
'Cheap: call this first to orient yourself' gives concrete when-to-use guidance and sequencing relative to the rest of the gateway toolset. It stops short of naming an explicit alternative or a when-not condition, so it is clear context rather than full routing logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_toolsCompact tool catalogARead-only
List upstream tools COMPACTLY (name + one-line description, no JSON schemas). Optionally filter to one server. Set refresh=true to force a live re-index.
| Name | Required | Description | Default |
|---|---|---|---|
| server | No | Restrict listing to a single upstream server | |
| refresh | No | Force a live refresh of the tool index (slower) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds useful behavior: output is compact and excludes JSON schemas, and refresh triggers a slower live re-index. It does not cover pagination, output limits, or failure modes.
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?
The description is tightly front-loaded, uses two short sentences, and every clause adds actionable meaning without repetition.
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 catalog tool with two optional parameters, no output schema, and full schema coverage, the description is nearly complete. It explains compact output and refresh semantics, though it omits pagination or result-size expectations.
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 already fully documented. The description restates the server filter and refresh behavior with only a small addition that refresh is slower, matching the schema.
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 states a specific verb and resource: list upstream tools compactly, including name and one-line description without JSON schemas. This clearly distinguishes it from get_tool_schema, but it does not explicitly contrast with search_tools or list_servers.
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?
It implies usage through 'optionally filter to one server' and 'set refresh=true to force a live re-index', but gives no explicit when-to-use guidance versus alternatives such as search_tools or suggest_tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reload_configHot-reload the upstream registryA
Re-read servers.json and apply changes WITHOUT restarting the gateway: new servers appear, removed ones are disconnected, unchanged ones keep their connections. Fails safely — a broken config leaves the current setup running.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by describing concrete effects: new servers appear, removed ones are disconnected, unchanged ones keep their connections, and a broken config fails safely leaving the current setup running. That covers side effects, existing-state preservation, and failure semantics. What's missing is whether the operation blocks or interrupts live traffic, and whether a partial config can be applied.
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 tight sentences, zero filler. The hot-reload guarantee is front-loaded in capitals, and the second sentence handles failure behavior without restating anything.
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 parameters and no output schema, the description covers the two things an agent actually needs: what changes take effect and what happens on a bad config. It does leave out what a successful call returns (counts of added/removed servers) or how failure is surfaced, which matters slightly more given there is no output 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?
The tool takes no parameters, so the schema has nothing to document and the description need not compensate — baseline 4 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?
States a specific verb and object ('Re-read servers.json and apply changes') plus the key differentiator from a full restart ('WITHOUT restarting the gateway'). The operation is unambiguous and distinguishable from the read-only siblings such as gateway_status and list_servers.
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?
The implied trigger is clear: this is what you call after servers.json has changed, and the alternative (restarting the gateway) is implicitly ruled out by the 'WITHOUT restarting' phrasing. It stops short of an explicit 'use this when / do not use when' statement or a note about concurrent in-flight calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_toolsKeyword search across all toolsARead-only
Search every upstream tool by keywords. Returns ranked matches with reasons and per-tool schema cost. Schemas are NOT included — load the ones you need with get_tool_schema.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Keywords to search for, e.g. "pull request review comments" | |
| top_k | No | Max matches to return (default 10) | |
| include_schemas | No | Also return full JSON schemas of matches (costs tokens) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already covers the safety profile, yet the description still adds real value: it discloses the return payload (ranked matches, reasons, schema cost) and warns that schemas are excluded. The token-cost implication of include_schemas is reinforced rather than newly introduced, so it stops just short of a 5.
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 short sentences, zero filler, and the most decision-relevant constraint (schemas not included) is front-loaded after the scope statement. Nothing needs trimming or reordering.
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 describing returns and does so briefly but adequately, plus it routes the agent to get_tool_schema for follow-up. The only missing piece is disambiguation from the other discovery siblings in the same family.
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 query, top_k, and include_schemas are already documented with defaults and bounds. The description adds only the implicit framing that queries are keyword-based and results are ranked, which is marginal beyond the schema baseline of 3.
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 names a specific verb and resource ("search every upstream tool by keywords") and states the return shape (ranked matches with reasons and per-tool schema cost). It does not differentiate from the sibling suggest_tools, which is a near-neighbor for the same discovery task, so the agent cannot fully resolve search vs. suggest from the text alone.
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?
It gives one clear routing rule: schemas are not returned here, so load them with get_tool_schema. That is useful when-to-use guidance for the follow-up step, but there is no guidance on when to prefer this over list_tools or suggest_tools, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_toolsPrompt-aware tool suggestions (the context saver)ARead-onlyIdempotent
THE core trick: pass the user's current prompt. Ranks the catalog against it and returns the best-matching upstream tools WITH their full JSON schemas in this single response — so one cheap call replaces loading every schema. Default top_k=4 keeps context lean; raise it for complex multi-tool tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| top_k | No | How many candidate tools to return (default 4) | |
| prompt | Yes | The user's current prompt, verbatim or paraphrased | |
| auto_load | No | Return full schemas of matches (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety is covered; the description adds real value beyond them by disclosing the response payload (full JSON schemas inline), the context-cost tradeoff of top_k, and the intent that it substitutes for repeated schema loads. It does not say what happens on zero matches or how ranking is ordered.
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 tight sentences with the mechanism front-loaded and the budget advice last. The framing phrases ('THE core trick', 'the context saver') are promotional padding rather than information, but they cost little.
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 describing returns and does so concretely (matching tools plus full JSON schemas in one response). Edge behavior — empty results, ranking order, effect of auto_load=false — remains unstated.
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 baseline would be 3, but the description adds operational meaning: top_k is framed as a context-budget lever with guidance to raise it for multi-tool tasks. The auto_load parameter is never mentioned in the description, which is the only parameter left to schema alone.
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: it ranks the tool catalog against a prompt and returns matching upstream tools with their full JSON schemas. That distinguishes it functionally from get_tool_schema and search_tools, though those siblings are never named, so the agent must infer the boundary from 'one cheap call replaces loading every schema'.
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?
Clear directive to pass the user's current prompt as the entry point, plus concrete tuning guidance ('default top_k=4 keeps context lean; raise it for complex multi-tool tasks'). It lacks an explicit when-not-to-use case, e.g. what to do when no match is returned or how it differs from calling search_tools first.
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.
8 tool updates
v1.0.2- First observed
call_tool - First observed
gateway_status - First observed
get_tool_schema - First observed
list_servers - First observed
list_tools - First observed
reload_config - First observed
search_tools - First observed
suggest_tools
TDQS
Scored across 8 tools
The tools are mostly distinct: discovery is split into list_tools (compact list), search_tools (keyword search), suggest_tools (prompt-ranked with schemas), and get_tool_schema (single schema load), with clear boundaries. The main overlap is list_servers vs gateway_status, both of which expose upstream health/circuit-breaker state, though the descriptions differentiate cheap orientation from detailed status reporting.
All names use snake_case and most follow a predictable verb_object pattern: list_servers, list_tools, search_tools, suggest_tools, get_tool_schema, call_tool, reload_config. gateway_status is the one noun-phrase outlier, a minor deviation rather than a pattern break.
Eight tools is well-scoped for a gateway that needs to orient, discover, load schemas, invoke upstream tools, report health, and reload config. Each tool has a clear role in the workflow, and there is no obvious padding.
The surface covers the core gateway lifecycle: list servers/tools, search and suggest tools, fetch schemas, call upstream tools, report status, and reload configuration. Minor gaps remain around explicit server connection management, circuit-breaker reset, or MCP resources/prompts if those upstream capabilities are in scope.
Maintenance
Related MCP Connectors
MCP Gateway: wrap any MCP server with cold-start retries, uptime SLA, and per-execution MPP billing.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
MCP gateway: one connection for your AI apps, with tool policies, PII redaction and audit logs.
1Stateless MCP gateway and OTel span-streaming bridge for hosted MCP servers.
Related MCP Servers
- FlicenseAqualityAmaintenanceA multiplexing gateway that aggregates multiple MCP servers into a single port, significantly reducing context token usage through a Meta-MCP discovery system. It enables dynamic tool discovery and invocation across various transport protocols including stdio, HTTP, and SSE.1585-

AISIX AI Gatewayofficial
AlicenseAqualityAmaintenanceSelf-hosted MCP gateway that registers upstream MCP servers and fronts them behind one governed Streamable HTTP endpoint: per-tool access control by caller API key, guardrails over tool arguments and results, rate limits, and usage logs. The same Rust gateway also proxies LLM and A2A agent traffic.1206Apache 2.0- AlicenseAqualityFmaintenanceEnables connecting multiple downstream MCP servers into a single gateway, with unified tool search, namespacing, and deferred loading to preserve context window.26MIT

jev-routerofficial
AlicenseAqualityCmaintenanceEnables agents to connect through a single gateway that has a decision model pick which MCP tools and playbooks are relevant to each request, so the LLM only sees the few schemas it needs, and to then invoke those tools on the underlying servers. This cuts tool-selection cost and prompt size dramatically when many MCP servers are connected.24MIT