modelcontextprotocol / modelcontextprotocol/servers

everything server: instructions unconditionally reference sampling/elicitation tools that only exist when the client declares those capabilities

Open Beginner friendly
#4,792 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
90.5k
Forks
11.7k
Avg merge
2d 2h
Merged PRs (30d)
5

Description

Factual issue

The @modelcontextprotocol/server-everything v2026.8.31 instructions string unconditionally tells integrating agents to use trigger-sampling-request and trigger-elicitation-request:

## Constraints & Limitations
- Sampling requests (`trigger-sampling-request`) require client sampling capability
- Elicitation requests (`trigger-elicitation-request`) require client elicitation capability

These tools are registered through registerConditionalTools() inside oninitialized, gated on the client's declared capabilities (server/index.ts). For a client that declares no sampling/elicitation capability — e.g. the majority of clients today, and verified by a capability sweep across 12 popular MCP servers — the tools never appear in tools/list, and the instructions reference tools that do not exist for that session:

  • initialize with capabilities: {}tools/list returns 13 tools, none of them trigger-sampling-request or trigger-elicitation-request
  • initialize with capabilities: {sampling:{}, elicitation:{}} → 16 tools, both present

Suggested fixes (pick any)

  1. Make the instructions conditional-aware — e.g. "when your client declares the sampling capability, trigger-sampling-request is available" — so the guidance matches what an agent can actually call.
  2. Compose the instructions per session — the instructions string is static, but it could be built from the registered-tools state after oninitialized, or the conditionality could be stated in one sentence.
  3. At minimum, add the phrase "if your client declares the corresponding capability" to the two bullets.

Why this matters beyond this server

The instructions field exists to orient agents; an agent that follows these instructions on a non-capability client will attempt to call a tool that is not in its catalog — a coherence class that deterministic batteries (this was found with mcp-eval's catalog-vs-instructions checks) can expose mechanically.

Repro

npx -y @modelcontextprotocol/server-everything
# initialize with capabilities: {} ; then tools/list -> 13 tools, no trigger-sampling-request
# initialize with capabilities: {sampling:{},elicitation:{}} ; wait ~1.5s after notifications/initialized ; tools/list -> 16 tools, both present

Environment: server-everything v2026.8.31 (npm), server self-reports 2.0.0; verified against the published dist (registerConditionalTools in dist/server/index.js).

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in server/index.ts, focusing on registerConditionalTools() inside oninitialized and the static instructions string. Run the provided npx server reproduction with empty and sampling/elicitation capabilities, then verify that the instructions consistently describe whether trigger-sampling-request and trigger-elicitation-request are available.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
backend
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
75/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.