makecindy / makecindy/cindy

无交互界面场景下 Auto 档的 MCP 工具无条件 fail-closed deny,连策略表都不查

Open
#1,577 1 comment 0 reactions 1 assignee Claimed by @zqchris View on GitHub
bug
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## 现象

在没有交互界面的会话里(Telegram / 飞书 bot、scheduler 定时任务、Orca headless worker),Auto 权限档下**所有非只读 MCP 工具无条件被拒**,无论用户把权限设成什么。定时任务里想用 `cindy_ssh`、插件 `ghost_call` 或任何第三方 MCP 基本必挂。

## 代码位置

`packages/maker-core/src/agents/claude-code/index.ts:1598`:

```ts
const canReviewWithoutUi =
mutablePermissionMode === 'auto' && !toolName.startsWith('mcp__');
if (!interactionResolver && !canReviewWithoutUi) {
if (isReadOnlyClaudeTool(toolName)) {
return { behavior: 'allow', updatedInput: input };
}
log.warn('canUseTool without interactionResolver → fail-closed deny', { tool: toolName });
return { behavior: 'deny', message: 'no interaction resolver attached; denying non-read-only tool (fail-closed)' };
}
```

远端分支同构:`claude-code/index.ts:2497`。

`canReviewWithoutUi` 显式把 `mcp__*` 排除,于是 MCP 工具在无 resolver 时直接落进 fail-closed deny——**连策略表都没查**。也就是说哪怕 `getDesktopMcpToolApprovalPolicy` 会判它 `auto-approve`,这里也已经拒掉了。

## 为什么是缺口

`mcp-tool-approval-policy.ts:66` 里 `TRUSTED_MCP_SERVERS`(`cindy_browser`、`cindy_scheduler`、`cindy_memory`、`cindy_orca`、`orca_worker_bridge`…)本来就是「整体静默执行、不需要人」的一批。这批在有 UI 时静默放行,在无 UI 时反而被拒,语义正好反了。

`orca_worker_bridge` 尤其典型:它是 worker → lead 的回报通道,策略表里特意注明"逐次弹窗只会让远端 daemon 等审批超时、worker 回报断链",但在 headless worker 里这条通道恰恰会被这段 fail-closed 拒掉。

## 建议改法(保持独立)

把无 UI 分支从"MCP 一律拒"改成"先查策略表":

```ts
const mcpPolicy = toolName.startsWith('mcp__') ? classifyMcpApprovalPolicy(toolName, input) : null;
const canReviewWithoutUi =
mutablePermissionMode === 'auto' && (!toolName.startsWith('mcp__') || mcpPolicy === 'auto-approve');
```

即:策略表判 `auto-approve` 的走原有静默路径;判 `prompt` / `prompt-each-time` 的仍然 fail-closed deny(无人可问,拒绝是对的),但 deny message 要说清是"当前会话无交互界面",而不是笼统的"被拒绝"。

## 独立性

只碰 `claude-code/index.ts` 的两处无 resolver 分支(本地 + 远端)与 codex 对应处,不依赖其他 auto-review issue。

与「Auto 档下 MCP 绕过 AI review」是两件事:那条讲有 UI 时的审阅粒度,本条讲无 UI 时连策略表都不查。两个可以各自独立合并。

## 验证

- 在 Telegram bot 会话 / scheduler 任务里,Auto 档调 `cindy_memory` 或 `cindy_browser` 的写类工具,确认不再被拒
- 确认第三方 server / `cindy_ssh` 在无 UI 下仍然拒绝,且 message 明确说明原因

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.