mcp-elicitation-proxy
mcp-elicitation-proxy
A transparent MCP proxy that adds elicitation for missing required tool arguments while preserving upstream tool discovery and schemas.
mcp-elicitation-proxy is a standalone Python MCP proxy built on FastMCP. It
preserves native upstream tool discovery while adding tool-call middleware for
required-field elicitation and sensitive required-field blocking.
The core architectural rule is strict: upstream discovery stays native. The
proxy must preserve upstream tools/list output instead of replacing it with a
synthetic wrapper such as call_upstream_tool.
Install
Run directly with uvx:
uvx mcp-elicitation-proxy --config config.yamlFor development from a local checkout, use the development setup steps below.
Related MCP server: AIMCP
Development Setup
uv syncRun tests:
uv run pytest -qOptional lint:
uv run ruff check .Build artifacts can be produced with uv build. Local outputs under dist/
are not intended to be committed.
Configuration
Example config.yaml with an HTTP upstream:
proxy:
name: "mcp-elicitation-proxy"
upstream:
url: "http://localhost:8001/mcp"
elicitation:
enabled: true
fallback_on_unsupported: "structured_error"
policies:
schema_required:
enabled: true
sensitive_required:
enabled: true
tools:
search_docs:
required:
- query
- project
elicit:
message: "Provide the missing search details."
fields:
project:
type: "string"
description: "Project or scope to search."Example config.yaml with a command-based upstream:
proxy:
name: "mcp-elicitation-proxy"
upstream:
command: "npx"
args:
- -y
- "@modelcontextprotocol/server-everything"upstream.url and upstream.command are mutually exclusive. Exactly one must
be configured. upstream.args defaults to an empty list and is valid only with
upstream.command. Command-based upstreams may also provide string environment
variables with upstream.env.
Run the proxy:
uv run mcp-elicitation-proxy --config config.yamlYou can also provide the config path via MCP_ELICITATION_PROXY_CONFIG.
MCP Client Configuration
When configuring an MCP client, use mcp-elicitation-proxy as the package and
CLI command. The local MCP client server alias can be shorter; the recommended
alias is elicitation-proxy.
{
"mcpServers": {
"elicitation-proxy": {
"command": "uvx",
"args": [
"mcp-elicitation-proxy",
"--config",
"/path/to/config.yaml"
]
}
}
}In this example, elicitation-proxy is only the client-local server alias.
mcp-elicitation-proxy remains the PyPI package name and CLI command. These
names do not need to match. If desired, the proxy's own MCP server name can also
be set separately in YAML:
proxy:
name: "elicitation-proxy"Discovery Invariants
Upstream tools remain visible in native
tools/list.The proxy does not register a generic
call_upstream_tool.Tool names are not prefixed with values such as
upstream_.Tool names, descriptions, and input schemas remain the upstream values unless an explicit future discovery feature changes that contract.
The upstream server is delegated to FastMCP native proxying via
fastmcp.server.create_proxy(...).
Required Fields And Elicitation
schema_required uses native upstream JSON Schema required fields.
Per-tool tools.<tool_name>.required entries are added at runtime for
tools/call validation only. Schema-required fields keep their original order,
then configured fields are appended without duplicates.
When elicitation.enabled is true, missing non-sensitive required fields may
be requested with the client's MCP elicitation capability and merged into the
original arguments before forwarding upstream. If elicitation is disabled,
unsupported, declined, cancelled, or fails, the proxy returns a structured
result instead of calling the upstream tool.
The sensitive_required policy runs before normal required-field elicitation.
If a missing required field appears to be a credential or secret, the proxy
blocks form-mode elicitation and returns a structured tool_call_blocked
result. Complete explicit input is still forwarded.
ambiguous_if and confirm_if settings are parsed for forward-compatible
configuration, but advanced ambiguity, confirmation, and LLM-based policies are
not implemented in v0.1.0.
Manual Smoke Test With MCP Inspector
A repeatable manual test is available with MCP Inspector and the official
@modelcontextprotocol/server-everything reference server.
npx @modelcontextprotocol/inspector -- uv run mcp-elicitation-proxy --config examples/manual-everything.config.yamlThis test verifies command-based upstream startup, native upstream tool
discovery, forwarding, elicitation for missing required fields,
sensitive-required blocking, and upstream.env propagation.
Expected high-level checks:
echois visible as an upstream tool;call_upstream_toolis not present;tool names are not prefixed with
upstream_;calling
echowith a completemessageis forwarded;calling
echowithoutmessagetriggers elicitation;configured elicitation copy from
examples/manual-everything.config.yamlis used;marking a missing required field as sensitive blocks elicitation;
the configured environment variable is visible to the upstream environment tool.
See docs/manual-inspector-test.md for details.
Status
v0.1.0 is the first public-ready baseline. It includes a single-upstream
FastMCP proxy, native discovery preservation, required-field elicitation,
sensitive required-field blocking, command-based upstream startup, YAML
configuration, and automated coverage for the main proxy invariants.
Available Tools
17 toolsechoEcho ToolARead-onlyIdempotent
Echoes back the input string
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message to echo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the annotations (readOnlyHint, idempotentHint, destructiveHint) and essentially restates the implied behavior. It adds no extra contextual detail such as side effects, rate limits, or edge cases, but for such a trivial operation the annotations and description together provide sufficient transparency.
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 a single, front-loaded sentence that fully conveys the function without any wasted words. It is appropriately concise for the tool's simplicity.
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?
Given the tool's extremely low complexity, a single parameter with full schema coverage, and annotations that define the safety profile, the description is complete. No output schema is needed since 'echoes back' clearly indicates the return value is the input string.
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 input schema already provides a description for the 'message' parameter ('Message to echo'), and the tool description does not add additional meaning beyond that. With 100% schema coverage, the baseline of 3 applies; the description and schema together are adequate but not enriched.
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 uses a specific verb ('echoes back') and identifies the resource (input string), making the tool's purpose immediately clear. It is also distinguishable from sibling tools that retrieve or manipulate resources, as echo uniquely returns the provided input unchanged.
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?
There is no explicit guidance on when to use this tool versus alternatives. The description only states what it does, not in which contexts it is appropriate or when other tools should be preferred, leaving the agent to infer usage from the tool's name and simplicity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-annotated-messageGet Annotated Message ToolCRead-onlyIdempotent
Demonstrates how annotations can be used to provide metadata about content.
| Name | Required | Description | Default |
|---|---|---|---|
| messageType | Yes | Type of message to demonstrate different annotation patterns | |
| includeImage | No | Whether to include an example image |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive, which covers the safety profile. However, the description adds no behavioral context beyond this, such as what an 'annotated message' looks like or what the tool returns. The vague statement about demonstrating annotations does not provide useful behavioral information.
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 a single sentence, which is concise, but it is under-specified and does not earn its place. It provides almost no useful information, making it more of a placeholder than a helpful description.
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 and only a vague description, the agent is left without a clear understanding of the tool's purpose, inputs, or return value. The complexity is low, but the description is too incomplete to support correct invocation or expectation setting.
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 parameters ('messageType' and 'includeImage') having descriptions. The tool description itself provides no parameter details, but since the schema fully covers parameter semantics, the baseline of 3 is appropriate.
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 'Demonstrates how annotations can be used to provide metadata about content,' which is vague and does not clearly indicate what the tool actually does (e.g., returns a message with annotations). It is not a tautology, but it lacks a specific verb and resource, and it does not distinguish the tool from its siblings like 'get-resource-links' or 'get-structured-content'.
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?
There is no guidance on when to use this tool versus alternatives. The description does not mention any context, prerequisites, or exclusions, leaving the agent without any basis for selecting it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-envPrint Environment ToolARead-onlyIdempotent
Returns all environment variables, helpful for debugging MCP server configuration
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the core safety profile. The description adds the debugging context but does not disclose potential sensitivity of environment variables (e.g., containing secrets), which is a behavioral aspect beyond annotations. However, the bar is lower given the strong annotation coverage.
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 a single, front-loaded sentence that states exactly what the tool does and why it's useful. Every word earns its place, with no redundancy or filler.
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, zero-parameter tool with strong annotations, the description is sufficiently complete. It states the output scope ('all environment variables') and a practical use case. It could mention the output format (e.g., key-value pairs), but that is not necessary given the tool's simplicity and lack of an 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?
Since there are zero parameters, the schema is trivially complete (100% coverage). According to the baseline rule for 0 params, a score of 4 is appropriate; the description does not need to elaborate on parameter details.
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 'Returns all environment variables' with a specific verb and resource, clearly distinguishing it from siblings like get-sum or get-resource-links. The added context about debugging MCP server configuration reinforces its purpose.
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 description specifies a clear use case: 'helpful for debugging MCP server configuration.' It provides context for when to use the tool, though it doesn't explicitly mention alternatives or when not to use it, which is acceptable given the simplicity of the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-resource-linksGet Resource Links ToolARead-onlyIdempotent
Returns up to ten resource links that reference different types of resources
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of resource links to return (1-10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is known. The description adds 'up to ten' and 'different types of resources', giving some behavioral context but not deep detail on output format, ordering, or edge cases.
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 a single sentence, front-loaded with the core behavior, and every word is purposeful. It avoids verbosity and repetition of schema details.
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?
Given the simple signature (one parameter, no output schema), the description adequately conveys the return type (list of resource links) and the limit. However, it does not describe the structure of individual links, which could be a minor gap for an agent needing to parse the results.
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 only parameter, count, has a description in the schema covering range and default. The tool description adds no additional meaning beyond confirming the upper limit, so it relies on the schema's parameter documentation.
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 clearly states the action (Returns), the object (resource links), and the scope (up to ten, different types). It differentiates from siblings like get-resource-reference by emphasizing a collection of varied links.
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?
No explicit guidance is provided on when to use this tool versus alternatives such as get-resource-reference. The phrase 'different types' implies a general-purpose use, but there are no stated conditions, exclusions, or pointers to other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-resource-referenceGet Resource Reference ToolCRead-onlyIdempotent
Returns a resource reference that can be used by MCP clients
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | No | ID of the text resource to fetch | |
| resourceType | No | Text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior, but the description adds no further context. It doesn't describe the nature of the reference (e.g., URI, ID), any side effects, or prerequisites, so it adds no value beyond the structured annotations.
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 a single concise sentence with no padding. While it is short, it lacks useful detail, but the conciseness itself is appropriate for the tool's apparent simplicity. The sentence is front-loaded with the action and result.
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 and only a vague description, the tool's overall behavior and return value are underspecified. It doesn't explain what a resource reference is, how it relates to resourceType, or how it differs from siblings. The description is too thin to be complete for a tool with two parameters and 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 description does not reference parameters at all. Schema coverage is only 50% (resourceId has a description, resourceType does not). The description should have compensated for the missing resourceType semantics but fails to do so, leaving the agent without essential parameter understanding.
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 clearly states the tool returns a resource reference, using a specific verb and object. However, it doesn't distinguish itself from sibling tools like get-resource-links, leaving ambiguity about what makes a 'reference' different.
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 description provides no guidance on when to use this tool vs alternatives. It doesn't mention the parameters or any conditions under which this tool would be preferred, leaving the agent without decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-roots-listGet Roots List ToolARead-onlyIdempotent
Lists the current MCP roots provided by the client. Demonstrates the roots protocol capability even though this server doesn't access files.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds useful context by clarifying that the server does not access files and that the tool demonstrates the roots protocol capability. It does not describe the output shape, but for a simple listing tool with full annotation coverage this is acceptable.
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 concise sentence that front-loads the essential function and adds one clarifying clause. Every word earns its place with no redundancy or filler.
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 parameterless, safe, idempotent read-only tool, the description is complete enough for an agent to call it correctly. It explains what the tool does aligning with the protocol and adds the no-file-access caveat. A slightly richer note about expected roots being client-defined might help, but this is a minor gap.
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 has zero parameters Scott and schema description coverage is 100%, so there are no parameter semantics to clarify. The description still makes clear this is a read-only listing operation, which is sufficient given no inputs are required.
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 ('Lists') and resource ('current MCP roots provided by the client'), making the tool's function immediately clear. It also differentiates from resource-related siblings by explicitly mentioning MCP roots and noting the server does not access files.
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 description provides clear context: this tool is for listing client-provided MCP roots accruate to the roots protocol. It also adds a useful exclusion by noting the server doesn't access files, implying this is not for file access tasks. It does not name sibling alternatives explicitly, but no ambiguity remains for this parameterless tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-structured-contentGet Structured Content ToolBRead-onlyIdempotent
Returns structured content along with an output schema for client data validation
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Choose city |
Output Schema
| Name | Required | Description |
|---|---|---|
| humidity | Yes | Humidity percentage |
| conditions | Yes | Weather conditions description |
| temperature | Yes | Temperature in celsius |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive, so the description's burden is lighter. It adds the behavioral detail that the output includes an output schema for client-side validation, which is useful, but it does not explain how the location parameter affects the returned content or any other runtime behavior.
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 a single, front-loaded sentence that clearly states the core function. It contains no filler or redundant content, and every word contributes to the purpose.
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?
The tool is simple with one fully documented parameter, good annotations, and an output schema, so the description does not need to explain return formats. However, it lacks explicit context about how the location parameter determines the returned content, which is a notable gap given the description's brevity.
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 input schema covers 100% of the parameter semantics with the 'location' description and enum values. The description adds no additional parameter meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
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 that the tool returns structured content and an output schema for validation, which identifies the main action and resource. However, it does not explicitly distinguish this tool from siblings like get-resource-links or get-env, and 'structured content' is somewhat generic.
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 description provides no guidance on when to use this tool versus alternatives. It does not mention suitable contexts, prerequisites, or exclusions. The only hint is the name and schema, but the description itself offers no usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-sumGet Sum ToolARead-onlyIdempotent
Returns the sum of two numbers
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | First number | |
| b | Yes | Second number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, fully covering the safety profile. The description adds no additional behavioral context beyond the annotations, such as error handling or edge cases, but for a pure numeric sum, there is little else to disclose. No contradiction with annotations.
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 a single, front-loaded sentence that conveys the entire purpose with zero wasted words. It is appropriately sized for the tool's trivial complexity.
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?
Given the low complexity, full schema coverage, and informative annotations, the description is complete for an agent to select and invoke the tool. It states the return behavior ('Returns the sum'), and no output schema is necessary because the result type is implicitly a number.
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 input schema already describes both parameters ('a' as 'First number' and 'b' as 'Second number') with 100% coverage. The description only refers to 'two numbers' without adding new meaning about formats, constraints, or relationships. Baseline 3 is appropriate since the schema carries the parameter documentation.
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 ('Returns') and resource ('the sum of two numbers'), clearly indicating the tool's arithmetic function. It distinguishes itself from sibling get-* tools by being the only one that computes a numeric sum, so there is no ambiguity.
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 description does not explicitly state when to use this tool or mention alternatives. However, the purpose is so self-evident that the usage context is implied: use it whenever the sum of two numbers is needed. No exclusions or alternative tools are provided, which is acceptable given the tool's simplicity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-tiny-imageGet Tiny Image ToolARead-onlyIdempotent
Returns a tiny MCP logo image.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the resource type (image) but does not disclose additional behavioral details such as output format or if any network call occurs.
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 a single, focused sentence with no wasted words, making it optimally concise and easy to parse.
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 trivial zero-parameter tool with no output schema, the description fully communicates its purpose. There are no missing prerequisites, side effects, or complex behaviors to document.
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?
With zero parameters and 100% schema coverage, there is no parameter information needed. The description appropriately focuses on the output rather than parameter details, and the baseline of 4 is warranted.
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 uses a specific verb ('Returns') and identifies the exact resource ('tiny MCP logo image'), making the tool's purpose immediately clear. It is distinct from sibling tools, which serve different functions.
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 description implies the tool should be used when a tiny MCP logo image is needed, but it provides no explicit context or exclusions. Sibling tools are not mentioned, and there is no guidance on when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gzip-file-as-resourceGZip File as Resource ToolAIdempotent
Compresses a single file using gzip compression. Depending upon the selected output type, returns either the compressed data as a gzipped resource or a resource link, allowing it to be downloaded in a subsequent request during the current session.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | URL or data URI of the file content to compress | https://raw.githubusercontent.com/modelcontextprotocol/servers/refs/heads/main/README.md |
| name | No | Name of the output file | README.md.gz |
| outputType | No | How the resulting gzipped file should be returned. 'resourceLink' returns a link to a resource that can be read later, 'resource' returns a full resource object. | resourceLink |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false, idempotent=true, and destructive=false. The description adds value by explaining the output-type-dependent behavior and the session-limited download aspect, which is not captured by annotations. No contradictions exist.
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, concise and front-loaded with the primary action. Every clause contributes meaning: compression, output type, and session-limited download. There is no redundant or filler text.
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?
Given the tool's moderate complexity, the description covers the essential aspects: what it does, how the output varies, and the session constraint. Without an output schema, it clearly explains the return value. It could mention edge cases like file size limits or URL formats, but overall it is sufficiently complete for an agent to use it correctly.
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 the baseline is 3. The description mentions 'Depending upon the selected output type' which alludes to the outputType parameter, but adds no additional meaning beyond the schema's per-parameter descriptions. It does not compensate with extra detail because the schema already fully documents all three parameters.
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?
Description clearly states the verb 'Compresses' and the resource 'a single file', and specifies the output as gzipped resource or link. This distinguishes it from sibling tools like echo or get-sum, which have different purposes. The mention of 'resource link' and 'session' also helps differentiate it from other resource-related tools.
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 description conveys when to use the tool: when you need to compress a file and either get the compressed data directly or a link for later download in the current session. It gives clear context but does not explicitly name alternatives or state when not to use it. This is a clear context without exclusions, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate-research-querySimulate Research QueryA
Simulates a deep research operation that gathers, analyzes, and synthesizes information. Demonstrates MCP task-based operations with progress through multiple stages. If 'ambiguous' is true and client supports elicitation, sends an elicitation request for clarification.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | The research topic to investigate | |
| ambiguous | No | Simulate an ambiguous query that requires clarification (triggers input_required status) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since annotations are all false and provide no safety profile, the description carries the behavioral disclosure burden. It discloses that the tool simulates rather than performs real research, mentions multi-stage progress, and specifies the conditional elicitation behavior contingent on the 'ambiguous' flag and client support. No contradiction with annotations.
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 concise sentences: the first front-loads the core purpose, the second adds a conditional detail. No redundant information.
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?
The tool is a simulation with no output schema and no meaningful annotations. The description covers the key aspects: simulation purpose, multi-stage progress, and ambiguity handling. It could provide slightly more detail on what the progress stages look like or what the final output represents, but it is sufficient for a demonstration 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?
Schema coverage is 100% for both parameters, so baseline is 3. The description adds value by explaining how 'ambiguous' triggers an elicitation request when the client supports it, which goes beyond the schema's note about triggering input_required status. It also links the parameter to the simulation flow.
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 uses the specific verb 'simulates' to identify the action, names the resource as 'a deep research operation,' and clarifies it demonstrates MCP task-based operations, distinguishing it from sibling getter tools like echo and get-env.
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 description explicitly states the tool demonstrates MCP task-based operations with progress through stages, giving clear context for when to use it (for demonstration). It does not explicitly exclude alternative uses or name sibling alternatives, but the simulation nature implies it is for testing/demo, not actual research.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toggle-simulated-loggingToggle Simulated LoggingA
Toggles simulated, random-leveled logging on or off.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
All annotations are false, offering no hints about safety or side effects. The description mentions 'toggle' implying a state change, but it does not disclose whether the change is global, persistent, or affects other parts of the system. No behavioral details beyond the basic action are provided.
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 a single, concise sentence that immediately communicates the tool's function. Every word is purposeful, and there is no redundant or extraneous information.
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, parameterless toggle tool, the description is adequate to convey the core functionality. Given the absence of annotations and output schema, it could have included more context about side effects or scope, but the description still meets the needs for this low-complexity 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?
The tool has no parameters, and the schema is empty, so the description does not need to explain parameter meanings. The phrase 'on or off' implies the toggle state, which adds a slight semantic nuance. With 0 parameters, a baseline score of 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?
The description clearly states the tool toggles simulated logging on or off, using a specific verb ('toggles') and a distinct resource ('simulated, random-leveled logging'). This distinguishes it from sibling tools like toggle-subscriber-updates, which handles a different resource.
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 description provides no guidance on when to use this tool versus alternatives, nor any context or prerequisites. It only states the action without indicating scenarios where toggling simulated logging is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toggle-subscriber-updatesToggle Subscriber UpdatesA
Toggles simulated resource subscription updates on or off.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, which aligns with a state-changing toggle. The description adds that the updates are 'simulated,' but does not disclose return behavior or side effects beyond the toggle action.
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 sentence that is front-loaded and contains no unnecessary words. Every word 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 simple, parameterless toggle with no output schema, the description is complete. It names the target and the action, and no additional behavior or prerequisites are required.
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?
With zero parameters, the schema provides full coverage. The description adds no parameter details but none are needed, so the baseline of 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?
The description uses a specific verb ('Toggles') and resource ('simulated resource subscription updates'), clearly distinguishing it from sibling tools like toggle-simulated-logging. It is unambiguous and not a tautology.
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 context is clear: this tool is for turning subscription updates on or off. No explicit alternatives or when-not scenarios are given, but the zero-parameter design makes its usage self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger-elicitation-requestTrigger Elicitation Request ToolC
Trigger a Request from the Server for User Elicitation
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false and provide little signal, so the description carries the burden of disclosing side effects and behavior. It only says a request is triggered, but nothing about whether it blocks, whether it is asynchronous, what side effects occur, or what happens after the request is made.
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 a single short sentence with no filler, and the main action is front-loaded. It is concise, though the brevity sacrifices precision.
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-parameter tool, the main needed context is purpose and when to use it. The description gives only an ambiguous purpose and no usage context, and with no output schema, an agent has little to rely on 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 has zero parameters and schema coverage is 100%, so there are no parameters needing explanation. The baseline of 4 applies because the description cannot add meaning to parameters that do not exist.
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 uses a verb ('Trigger') and names a resource ('a Request from the Server for User Elicitation'), but the phrase is vague and does little more than rephrase the tool name. It does not differentiate from sibling tools like trigger-url-elicitation or trigger-sampling-request, leaving the exact elicitation type unclear.
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?
There is no guidance on when to use this tool versus alternatives, nor any indication of prerequisites or when not to use it. The one-line description only implies a generic elicitation scenario and provides no situational context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger-long-running-operationTrigger Long Running Operation ToolBRead-onlyIdempotent
Demonstrates a long running operation with progress updates.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | Number of steps in the operation | |
| duration | No | Duration of the operation in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the safety profile is covered. The description adds the behavioral trait of progress updates, which is beyond the annotations, but does not explain how progress is reported, whether the operation blocks, or what the response contains.
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 a single concise sentence of 8 words that is front-loaded with the core purpose. Every word earns its place with no unnecessary filler or 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?
While the schema and annotations provide good coverage for a simple demo tool, the absence of an output schema and the minimal description leave uncertainty about the actual operation's behavior and progress mechanism. The description is adequate but not rich enough to be fully complete.
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 'steps' and 'duration' well-documented in the schema. The description adds no additional parameter semantics, but the schema already carries the full burden, so the baseline score of 3 is appropriate.
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 clearly identifies the tool as demonstrating a long-running operation with progress updates, which is more specific than simply restating the name. It distinguishes itself from sibling tools by highlighting progress updates, though the verb 'demonstrates' is slightly less direct than 'triggers' or 'runs'.
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 description provides no guidance on when to use this tool versus alternatives. It does not mention use cases, exclusions, or compare with any sibling tools, leaving the agent to infer context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger-sampling-requestTrigger Sampling Request ToolC
Trigger a Request from the Server for LLM Sampling
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | The prompt to send to the LLM | |
| maxTokens | No | Maximum number of tokens to generate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false (mutation possible), openWorldHint=true (external side effects), and idempotentHint=false (may not be repeatable). The description adds no behavioral detail about side effects, error conditions, or rate limits, leaving the agent underinformed.
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 extremely concise and front-loaded, but it borders on under-specification. It is short and to the point, but lacks substance.
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?
Given the side-effect potential (openWorldHint) and lack of output schema, the description is too minimal. It omits details about the response format, error handling, or consequences, making it incomplete for an agent to invoke confidently.
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 schema has 100% coverage, so parameters are documented, but the description adds nothing beyond that. There is no clarification on the meaning of 'sampling' or how maxTokens is used.
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 that the tool triggers a request for LLM sampling, which conveys a general action, but it is vague about what resource or context it operates on. It doesn't distinguish it from sibling tools like 'trigger-elicitation-request' or 'trigger-url-elicitation'.
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?
No guidance is provided for when to use this tool versus alternatives. The openWorldHint suggests the tool may operate on external resources, but the description does not explain the use case or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger-url-elicitationTrigger URL Elicitation ToolA
Trigger a URL elicitation so the client can direct the user to a browser flow. Supports two mechanisms: the request path (elicitation/create, default) which awaits the user's response, and the error path (UrlElicitationRequiredError, -32042) which signals the client to handle URL elicitation via the error response. Set errorPath=true to use the error path.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL the user should open | |
| message | No | Message shown to the user before opening the URL | Please open the link to complete this action. |
| errorPath | No | Controls which elicitation mechanism is used. When false (default), sends an elicitation/create request (request path). When true, throws a UrlElicitationRequiredError (MCP error code -32042) so the client handles the URL elicitation via the error path rather than waiting for a response. To clear the error, satisfy the prerequisite and retry this call with the same arguments; the retry ignores errorPath and proceeds, so the client does not loop on the same error. | |
| elicitationId | No | Optional explicit elicitation ID. Defaults to a random UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses crucial behavior: the request path blocks awaiting the user's response, the error path throws a specific MCP error (-32042), and retrying after satisfying the prerequisite clears the error without looping. This is substantive behavioral context that annotations do not capture.
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 tightly written sentences with no filler. The primary purpose appears first, followed by the mechanism details and the actionable 'Set errorPath=true' instruction.
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 tool with no output schema, the description covers the core workflow well: how elicitation is triggered, which path to use, and how errors are resolved. It does not explicitly state the success return value, but the 'awaits the user's response' phrasing conveys the expected interaction sufficiently.
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 the baseline is 3. The tool description adds minimal parameter-level meaning beyond the schema; the errorPath behavior is already fully described in the schema's errorPath documentation.
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 action ('Trigger a URL elicitation') and a clear purpose ('so the client can direct the user to a browser flow'). It also distinguishes this from generic elicitation siblings by naming the concrete mechanisms: 'elicitation/create' and 'UrlElicitationRequiredError'.
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 description clearly explains the two modes, marks one as the default, and explicitly tells the caller to 'Set errorPath=true to use the error path'. It does not explicitly compare against sibling tools like trigger-elicitation-request, so it stops short of full alternative routing.
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.
17 tool updates
v0.1.0- First observed
echo - First observed
get-annotated-message - First observed
get-env - First observed
get-resource-links - First observed
get-resource-reference - First observed
get-roots-list - First observed
get-structured-content - First observed
get-sum - First observed
get-tiny-image - First observed
gzip-file-as-resource - First observed
simulate-research-query - First observed
toggle-simulated-logging - First observed
toggle-subscriber-updates - First observed
trigger-elicitation-request - First observed
trigger-long-running-operation - First observed
trigger-sampling-request - First observed
trigger-url-elicitation
TDQS
Scored across 17 tools
Most tools have distinct purposes, but there is overlap among trigger-type tools (trigger-elicitation-request, trigger-url-elicitation, trigger-sampling-request) and simulation tools that also involve elicitation (simulate-research-query). Additionally, 'get-resource-links' and 'get-resource-reference' could be confused despite their clear descriptions.
All tool names consistently use a hyphenated verb-noun pattern (e.g., get-env, toggle-logging, trigger-elicitation-request). There are no mixed conventions or inconsistencies.
With 17 tools, the server sits at the upper edge of a reasonable scope. Many tools are demonstrations of MCP features (echo, get-sum, gzip-file-as-resource) alongside core elicitation/simulation, making the count feel slightly heavy but not excessive.
The server covers a wide range of MCP capabilities including elicitation, sampling, resources, logging, subscriptions, roots, and long-running operations. Minor gaps exist (e.g., no explicit tool to query elicitation status), but the surface is adequate for a demonstration/proxy server.
Maintenance
Related MCP Connectors
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP Server for an Agent Task Marketplace
Related MCP Servers
- AlicenseCqualityDmaintenanceA demonstration server that showcases how to collect user input dynamically using the Model Context Protocol (MCP) elicitation system across tools, resources, and prompts.10214,403 npm-
- AlicenseNot gradedqualityCmaintenanceMCP server that distributes tool specifications from GitLab repositories to IDEs, dynamically generating MCP tools and serving files via aimcp:// URIs.MIT
- AlicenseBqualityDmaintenanceAn MCP server that provides elicitation tools to interactively request user input, such as selecting options, providing information, or performing manual tests.31MIT
- FlicenseNot gradedqualityCmaintenanceA minimal MCP server that raises elicitation requests from tool calls to test end-to-end elicitation workflows.-