Skip to content

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

Description

@sasan1200

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).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions