Overview
call_tool is the HTTP transport’s primary execution verb. Where the stdio transport’s run tool composes multiple calls inside a TypeScript sandbox, call_tool invokes a single tool by path with structured arguments. One MCP call, one upstream call.
Available only on the remote MCP endpoint (POST /api/mcp/:token). The CLI’s stdio surface uses run instead.
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
path | string | Yes | Tool path (e.g. granola.personal.notes.list) |
arguments | object | No | Tool arguments matching the tool’s inputSchema |
search_tools to find a path and read_tool to see what arguments should contain.
Annotations
The MCP-level annotation oncall_tool is non-destructive (it’s a meta tool), but the underlying tool may itself be destructive. Hosts should rely on the destructive field returned by read_tool to decide whether to require user confirmation before invoking.
Behavior
- Look up the handler by
path. ReturnsTool not foundif the tool isn’t in the user’s filtered catalog (either it doesn’t exist or the user hasn’t connected the provider). - Build a plugin context (
userId, role,auth.getTokenresolver, no-op elicitation, console logger). - Pass
arguments ?? {}through the SDK’s Zod input wrap — defaults from the tool’sinputSchemaare applied here, so omitted fields take their declared default rather thanundefined. - Run the handler and stringify the result back as
text/plaincontent.
Examples
Errors
If the handler throws,call_tool returns { isError: true, content: [{ type: "text", text: "Error: <message>" }] } so the agent gets a structured failure rather than a transport-level error. Common shapes:
Tool not found: <path>— typo or unconnected providerNo credentials for "<provider>". Connect it in the Toolshed dashboard.—resolveToken()exhausted all three sources- Upstream API messages bubble through unchanged (e.g.
Granola API error 401: Unauthorized)