What
mcp_call is a request that a program controlling Claude Code through the SDK can send. It calls a tool on an MCP server (an add-on that provides tools) directly. Such calls used to skip permission checks with no exception. The description now says permission checks are skipped unless check_permissions is set.
- With
check_permissionstrue, the call is decided like Claude's own call. Permission rules, the permission mode and managed settings all apply, as doPreToolUseandPostToolUsehooks (your own scripts that run before and after a tool call). Questions go to the host program ascan_use_tool. - Refusals begin "The tool did not run: ", for example "no permission decision was reached." or "nobody can be asked in this permission mode." Where the option cannot be used, the reply is "The tool did not run: check_permissions is not available here." Refused calls raise
McpCallRefusedError. - Refusals are capped per server in each conversation. Past the cap, the reply is "too many calls to this server were refused, so no more will run in this conversation."
check_permissionsmust be a boolean, otherwise the call fails with "mcp_call: check_permissions must be a boolean". Only a CLI that reportsmcp_call_check_permissions_v1honours it, and older CLIs ignore it.- The
timeout_msdescription now says it also limits how long hooks run and how long the call waits for an answer. - A new early check can reject the request with an error, and a cancelled call now stops with a
remote-cancelreason. Theresult_not_for_modelcheck now uses a helper shared with other code. Thetengu_ptc_enabledkill switch for staged calls still falls back to true, and nothing has been read about it. - An
mcp_toolhook is a hook that calls an MCP tool itself. These hooks now run a check on the server, tool and input before the call. Refusals return withheld results marked "Hooks: mcp_tool hook refused", and errors are turned into refusals too. - When an
mcp_toolhook's call to a claude.ai connector is refused, the message starts "An mcp_tool hook's call was refused." In one form, used when the check cannot tell, it suggests removing the hook or pointing it at a tool that is not a connector. In the other, it suggests removing the hook, using another tool, or leaving an argument out of its input.
Why
Programs driving Claude Code can make their direct MCP calls obey the same rules, modes and hooks as Claude's own calls. People who write hooks that call claude.ai connectors get a clear reason when a call is blocked.
tengu_ptc_enabled Not enough to sayNothing here resolved what this flag was doing on this version, so nothing here should be read as on or off.
This account: no value returned · anonymous baseline: no value returned · compiled default in v2.1.319: on
These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
Read once, for one account on one subscription tier, against v2.1.319. It isn't a statement about your account. What a flag value here can and cannot tell you