-
Notifications
You must be signed in to change notification settings - Fork 5
docs: update problem statement with progressive discovery details #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
kurtisvg
wants to merge
1
commit into
main
Choose a base branch
from
docs/problem-statement
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,8 +1,136 @@ | ||
| # Problem Statement | ||
| Problem Statement | | ||
| [Use Cases](use-cases.md) | | ||
| [Approaches](approaches.md) | | ||
| [Open Questions](open-questions.md) | | ||
| [Experimental Findings](experimental-findings.md) | | ||
| [Related Work](related-work.md) | | ||
| [Contributing](../CONTRIBUTING.md) | ||
| # Progressive Discovery Problem Statement | ||
|
|
||
| ## Large tool catalogs impose measurable costs | ||
|
|
||
| An eager tool catalog places every active tool's name, description, and schema | ||
| in model context before the tool is needed. As the catalog grows, it imposes | ||
| three costs: | ||
|
|
||
| - **Cost:** Complete tool definitions consume input tokens on every model | ||
| request where they are active. | ||
| - **Accuracy:** Tool selection becomes harder as the number of choices and the | ||
| overlap between them increase. Microsoft Research reports performance losses | ||
| of up to 85% for some models in large tool spaces. Its survey of 1,470 | ||
| runnable MCP servers found one server with 256 tools and ten more with over | ||
| 100 | ||
| ([survey](https://www.microsoft.com/en-us/research/blog/tool-space-interference-in-the-mcp-era-designing-for-agent-compatibility-at-scale/)). | ||
| The peer-reviewed [MetaTool | ||
| benchmark](https://proceedings.iclr.cc/paper_files/paper/2024/hash/bc12914d66b41b6bfc2d3a5decdb498b-Abstract-Conference.html) | ||
| likewise found that most of eight evaluated models struggled to decide whether | ||
| to use a tool and which tool to select. | ||
| - **Latency:** Larger inputs increase transfer and model-prefill work across | ||
| planning, tool calls, and follow-up turns. Prompt caching can reduce this | ||
| cost, but availability and invalidation behavior vary across providers, and | ||
| caching does not remove tool-selection interference. | ||
|
|
||
| Exact thresholds vary by model and task. MCP is model-independent, so servers | ||
| cannot assume that every client can usefully accommodate the same catalog size. | ||
| The practical requirement is to keep the *active* catalog small without making | ||
| the broader catalog unreachable. | ||
|
|
||
| ## Server management becomes developer overhead | ||
|
|
||
| A consequence of the accuracy, cost, and latency drawbacks is that developers | ||
| cannot freely install MCP servers as they need them and leave those servers | ||
| available. In an eager-loading client, every active server consumes part of the | ||
| agent's tool and context budget, so installation becomes an ongoing curation | ||
| decision rather than a one-time way to add a capability. | ||
|
|
||
| Consider the request: "Find production databases without recent backups, open | ||
| remediation tickets, and notify the owning teams." A partitioned deployment may | ||
| require database administration, monitoring, issue tracking, and messaging | ||
| servers. The developer must either load all four domains up front or reconfigure | ||
| the agent as the workflow crosses between them. A disabled server is cheap, but | ||
| the agent generally cannot discover a capability on a server it does not know it | ||
| should activate. | ||
|
|
||
| This prevents broad platforms from offering a broad entrypoint. A single | ||
| prebuilt MCP Toolbox surface for Cloud SQL for PostgreSQL contains [50 tool | ||
| definitions](https://github.com/googleapis/mcp-toolbox/blob/418f302f1c47d53a4f63f5bc629dc9fac0d5bcd2/internal/prebuiltconfigs/tools/cloud-sql-postgres.yaml). | ||
| At platform scale, the `gcloud` CLI supports [more than 8,000 | ||
| commands](https://cloud.google.com/cli). A flat Google Cloud MCP catalog is not | ||
| practical, but requiring developers to select many product-specific servers | ||
| multiplies the configurations they must maintain across every harness and gives | ||
| up the simplicity of installing, authenticating, governing, and operating one | ||
| platform integration. | ||
|
|
||
| A simpler entrypoint is easier for developers to adopt and use successfully. For | ||
| example, a developer could install one Google Cloud MCP server, leave it | ||
| connected, and retain access to the platform without placing the entire platform | ||
| catalog in model context. | ||
|
|
||
| ## CLIs and Skills avoid the same penalty | ||
|
|
||
| CLIs and Skills separate the small entrypoint required for discovery from the | ||
| larger body of information required for execution: | ||
|
|
||
| - **CLI:** An executable name and, if needed, a short description expand into | ||
| `--help`, subcommand help, and finally execution. | ||
| - **Skill:** A name and description expand into the full `SKILL.md`, then | ||
| referenced files or scripts. | ||
|
|
||
| An agent does not need all 8,000 `gcloud` command descriptions in context. It | ||
| needs to know that `gcloud` exists, then can inspect `gcloud --help`, `gcloud | ||
| sql --help`, and one command's help as needed. | ||
|
|
||
| Agent Skills formalize this loading pattern: clients initially expose only each | ||
| Skill's name and description, load the full `SKILL.md` when it is activated, and | ||
| load supporting files during execution ([Agent Skills | ||
| overview](https://agentskills.io/home)). Adding many Skills therefore adds a | ||
| small discovery index rather than many full instruction sets. | ||
|
|
||
| MCP does not standardize an equivalent relationship between a narrow entrypoint | ||
| and later expansion into relevant primitive definitions. | ||
|
|
||
| ## Relative benchmarks of MCP Vs CLIs actively harm MCP client support | ||
|
|
||
| Agent authors frequently use coding based evaluation tasks to compare CLI and | ||
| MCP equivalents where they exist, and the lack of support for effective | ||
| progressive discovery for MCP from the whole ecosystem (model providers, harness | ||
| builders and MCP itself), has reduced the ability to counter that narrative | ||
| effectively. This has systematically led to MCP features being de-prioritised, | ||
| and in some specific cases has led to partial MCP surface being exposed ex. | ||
| GitHub Copilot CLI only natively exposes a few of GitHub MCP Server’s tools \- | ||
| ones with the least overlap with the CLI \- and these decisions are made | ||
| primarily by comparing benchmark results | ||
|
|
||
| ## Why something needs to happen in MCP | ||
|
|
||
| The server knows its capability catalog and semantics. The client knows the | ||
| user's task, the model's limits, local policy, and its context-management | ||
| strategy. Neither side has enough information to implement dependable discovery | ||
| alone. | ||
|
|
||
| MCP is the shared layer where the server can provide authoritative discovery | ||
| signals and the client can decide how to apply them. Without a protocol-level | ||
| contract, each server-client pair must recreate that integration, and behavior | ||
| will continue to vary across clients. | ||
|
|
||
| MCP should therefore enable an optional progressive-discovery contract with | ||
| these properties: | ||
|
|
||
| 1. **Bounded entrypoint:** A server can summarize a large capability space | ||
| without the harness placing every primitive definition in model context. MCPs | ||
| bundled in plugins or “connectors” should be capable of exposing their full | ||
| surface, currently the lack of user configuration capabilities frequently | ||
| prevents this. | ||
| 2. **Selective expansion:** A client can resolve an intent or reference into | ||
| relevant tools, prompts, or resources. | ||
| 3. **Server-provided semantics:** Servers can communicate relationships, | ||
| entrypoints, and task-oriented guidance without prescribing the client's | ||
| search or prompt implementation. | ||
| 4. **Dynamic correctness:** Discovery can reflect authorization, configuration, | ||
| and catalog changes while remaining cacheable. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Clarify that this is about maintaining a stable prompt cache prefix; this will be confused for the TTL work I think. |
||
| 5. **Execution method agnostic:** MCP has never stipulated that tools be | ||
| directly submitted to models, and the protocol should remain agnostic to | ||
| client implementations \- the emergence of tool search, client initiated lazy | ||
| loading of tools, MCP CLIs and programmatic tool calling/code mode all | ||
| indicate that clients are still innovating in this space, and this effort | ||
| should be an enabler of this. Ex. progressive discovery metadata could be | ||
| used to make a graph graph from mcp primitives for an MCP CLI with nested | ||
| subcommands \- or provide metadata for tool search. | ||
|
|
||
| The success criterion is simple: a user can install a broad MCP server and leave | ||
| it connected. Adding capabilities does not proportionally increase the agent's | ||
| always-loaded context, and using a new capability does not require the user to | ||
| know its server, toolset, or exact name in advance. | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think one question this raises is if we intend to try and solve disambiguation here - things like tool-prefixing for namespacing purposes, which has the side-effect of causing server-provided primitive usage guidance to not exactly match the client's semantics.