---
title: 'MCP: execute tools/call through ordinary Tool path'
state: 'closed'
created_at: '2026-06-20T05:30:04Z'
updated_at: '2026-06-20T09:18:51Z'
assignee: null
readiness: 'implementation_ready'
risk_flags: ['mcp', 'tools-call', 'permission', 'history', 'bounded-output']
queued_by: 'workspace-panel'
queued_at: '2026-06-20T05:59:04Z'
---

## Background

After MCP tools are registered through ToolRegistry, invoking a Yoi MCP-backed tool should call the server's `tools/call` and return a bounded ordinary Tool result. Permission denial must happen before sending a request to the MCP server.

## Requirements

- Route registered MCP tool invocation to MCP `tools/call`.
- Apply existing PreToolCall / Tool permission path before MCP server call.
- If permission is denied, do not send `tools/call` to the server.
- Distinguish normal result, MCP `isError: true`, and JSON-RPC protocol error.
- Serialize MCP result forms boundedly: `content[]`, `structuredContent`, `isError`, `_meta`, and supported rich content summaries.
- Store result through ordinary Tool result/history path.
- Treat all content as untrusted.

## Acceptance criteria

- MCP mock tool returns normal result through ordinary Yoi Tool result.
- MCP `isError: true` is represented distinctly from JSON-RPC protocol failure.
- Permission denied call is not sent to the MCP server.
- Oversize/rich results are bounded/truncated or rejected according to explicit policy.
- Tool history shows ordinary tool call/result, not hidden context injection.
- Tests cover normal result, `isError`, protocol error, permission denial, and output bounds.

## Non-goals

- resources/read or prompts/get.
- list_changed notifications.
- Sampling/elicitation.

## Related work

- Depends on `00001KVHR3WS6`.
- Objective: `00001KTR80WMN`.
