Policy-gate, audit, and control MCP tool calls for any MCP-speaking agent. Aggregates multiple upstream MCP servers behind a single policed endpoint, enforcing declarative runtime policies on tool calls.
The Ephorate MCP Proxy defines only 2 tools: list_tools and call_tool. Both are infrastructure/gateway tools rather than domain-specific agents. list_tools has a basic but adequate description; call_tool has a longer description that explains its role as a policy enforcement gate. However, critical gaps emerge: (1) Neither tool's input schema is visible in the provided source code, only inferred from brief parameter mentions in the descriptions. (2) call_tool accepts an 'arguments' parameter typed as 'object' with no property schema, making it impossible for an LLM to know what sub-fields are valid. (3) Output schemas are completely undocumented, callers have no way to know what structure these tools return. (4) Neither tool has error handling guidance; LLMs cannot distinguish between retryable failures, permission denials, and policy rejections. (5) The tools are meta-infrastructure (proxying other tools) rather than domain-solving tools, they exist to gate calls, not to solve user problems directly. This architecture is valid for a policy platform, but the tool definitions lack the detail needed for reliable LLM integration. Based on the rubric baseline (194 chars avg for good descriptions, 100% of A+ tools have documented return types), these tools fall short.
Gate a tool call through the policy engine. Validates the call against configured policies, optionally transforms arguments, forwards to upstream MCP server, and optionally redacts output based on data loss prevention rules.
Aggregate upstream tools, namespace them <server>__<tool>, and filter based on policy visibility rules. Returns the list of available tools the agent can call.
No visible input schemas for either tool in source code. list_tools parameters not defined; call_tool accepts 'arguments' as bare 'object' with no property schema. LLMs cannot infer valid fields or required constraints.
Output schemas completely undocumented. What does list_tools return? (array of tool objects? tool names? schemas?) What does call_tool return? (raw upstream response? wrapped in metadata? error structure?) LLMs cannot plan downstream calls or validate responses.
No error classification or recovery guidance. If call_tool fails due to policy rejection, timeout, upstream unavailability, or invalid arguments, LLMs receive no signal of what to do next (retry? ask user? escalate?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | 2026-07-28+ | v2 |
Tool names are generic infrastructure verbs ('list_tools', 'call_tool') rather than domain-specific actions. While appropriate for a proxy, they lack clarity about scope, do they list/call only gated tools? All upstream tools? Tools visible to this user?
call_tool description mentions 'policy visibility rules' and 'data loss prevention rules' but does not explain what policies apply, how conflicts are resolved, or what transformations the agent should expect. LLMs operating in the dark about policy enforcement.
call_tool accepts 'name' and 'arguments' parameters but provides no guidance on parameter relationships, required constraints, or format of the 'name' field (e.g. must it include the namespace separator '__'?). Dependencies undocumented.