Labsco
MCP SERVER

MCP Elicitation Proxy

by robertocirillo

Sits in front of another MCP server and asks the user for the arguments a tool call is missing — without rewriting the upstream tool list.

MCP Plumbing: Proxies, Registries & Inspectors
Summary
It refuses to replace the tool list, and that is the point.

Most proxies flatten an upstream server into one generic call tool and lose the schemas; here the invariant is stated and tested — upstream names, descriptions and schemas survive, and no `call_upstream_tool` is registered. Read the version line before relying on the advanced policies: `ambiguous_if` and `confirm_if` are parsed for forward compatibility but are not implemented in v0.1.0, so what works today is required-field elicitation and sensitive-field blocking.

What it is

A transparent MCP proxy. It forwards an upstream server's tools untouched, and adds one behaviour on the call path: when a required argument is missing, it elicits that value from the user through the client, merges it into the arguments, and only then calls upstream.

What you get
  • Upstream tools kept exactly as they are — same names, descriptions and input schemas, visible in native `tools/list`, with no synthetic wrapper tool and no `upstream_` prefix
  • Missing required fields requested from the user through the client's MCP elicitation capability, with your own prompt copy per tool
  • A definite outcome when elicitation is unavailable: if the client cannot elicit, or the user declines or cancels, it returns a structured result instead of calling upstream with holes
  • Required fields from two sources: the upstream JSON Schema `required` list, plus per-tool extras declared in YAML for call-time validation, in schema order with the configured ones appended
  • A credential guard that runs first — a missing required field that looks like a secret blocks form-mode elicitation and returns a `tool_call_blocked` result, while complete explicit input is still forwarded
  • Either kind of upstream: an HTTP `upstream.url`, or a `upstream.command` with args and string environment variables
Requirements

Python via `uvx mcp-elicitation-proxy --config config.yaml`; the config path can also come from `MCP_ELICITATION_PROXY_CONFIG`. The YAML needs exactly one of `upstream.url` or `upstream.command` — they are mutually exclusive — and carries the `elicitation`, `policies` and per-tool `tools` blocks. The client entry is the same `uvx` command; the README suggests the shorter local alias `elicitation-proxy`. A repeatable smoke test against `@modelcontextprotocol/server-everything` is documented with MCP Inspector. This is version 0.1.0.

Setup effort

One command — uvx mcp-elicitation-proxy --config config.yaml