1. 为什么要在 Claude Code 里接 DeepSeek + kimicu
Claude Code 本身是个很强的编码 Agent,但它的模型调用走的是 Anthropic 官方通道,配额用完就得等。很多人手上已经有 DeepSeek 的 Key,成本低、响应快,尤其适合跑那种"打开计算器算个数""开浏览器搜个东西"的重复性电脑操作任务。kimicu(Kimi Computer Use for Windows)正好提供了这样一套 MCP 工具,把"看屏幕 + 点鼠标 + 敲键盘"封装成 13 个标准工具,任何支持 MCP 的 Agent 都能调用。
问题在于,Claude Code 对 MCP 工具的 inputSchema 有额外限制:顶层不允许出现 oneOf/anyOf/allOf 这类组合关键字。kimicu 的 13 个工具里有 4 个恰好踩了这个坑,加载时会被静默跳过,导致你明明装好了插件,会话里却只有 9 个工具,最关键的 get_app_state 直接消失,整条"观察→操作"链路根本跑不起来。
这篇就围绕这个场景,给你一份可直接复制的 config.toml 骨架(Claude Code 的 MCP 配置),配合 TaoToken 统一 Key/API 通道,把 DeepSeek 接进来,再逐项验证 MCP 连通、模型响应、kimicu 指令执行三个环节。适合想复现"Claude Code + DeepSeek + kimicu 控制电脑"这条链路的开发者。
2. TaoToken 前置:统一 Key 与 API 通道
在动手改配置之前,先把模型通道理顺。Claude Code 默认走 Anthropic 官方,要换成 DeepSeek,需要一个兼容 Anthropic 协议的入口。TaoToken 提供的就是这个角色:一个统一的 Key,同时能调 Claude、DeepSeek 等模型,API 地址固定,不用来回切。
你需要准备的东西:
- 一个 TaoToken 账号,登录后在控制台生成 API Key
- 记下 API 基础地址:
https://taotoken.net/api - 确认你要用的 DeepSeek 模型名(比如
deepseek-chat或deepseek-v4-flash,以控制台实际列表为准)
获取 Key 的入口在控制台的 API Keys 页面,生成后复制保存,后面配置里要用。如果你还没注册,可以从官网进:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
注意:API 地址不要加 UTM 参数,直接写
https://taotoken.net/api即可,加了反而可能被某些客户端当成非法路径。
这一步做完,你手上应该有三样东西:TaoToken API Key、API 基础地址、DeepSeek 模型名。接下来把它们和 kimicu 的 MCP 配置拼到一起。
3. config.toml 可复制骨架
Claude Code 的配置分两块:一块是模型通道(走 TaoToken),一块是 MCP Server(走 kimicu 代理)。下面这份骨架你可以直接抄,把尖括号里的路径和 Key 换成自己的。
3.1 模型通道配置
Claude Code 读取环境变量或配置文件来决定走哪个 API。推荐用配置文件方式,避免每次开终端都要 export。
# ~/.claude/config.toml # Claude Code 模型通道配置:走 TaoToken 统一入口 [api] base_url = "https://taotoken.net/api" api_key = "sk-你的TaoTokenKey" # 默认模型,可被会话内 /model 覆盖 default_model = "deepseek-chat" # 请求超时(秒),DeepSeek 长任务建议给足 timeout = 120 [models] # 这里列出你想在会话里快速切换的模型 available = ["deepseek-chat", "deepseek-v4-flash", "claude-sonnet-4"]如果你更习惯环境变量,等价写法是:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的TaoTokenKey" export ANTHROPIC_MODEL="deepseek-chat"两种方式选一种即可,不要同时配,否则容易互相覆盖。
3.2 MCP Server 配置(kimicu 代理)
kimicu 本体不能直接挂到 Claude Code 上,因为那 4 个工具的 schema 会被跳过。中间要插一层代理,把 oneOf 剥掉。代理的注册配置写在 Claude Code 的 MCP 段里:
# ~/.claude/config.toml 续 # MCP Server 注册:kimi-cu 走本地代理 [mcp_servers.kimi-cu] type = "stdio" command = "C:\\Program Files\\nodejs\\node.exe" args = ["C:\\Users\\你的用户名\\.cowork\\mcp\\kimi-cu-proxy\\proxy.js"] # 代理是常驻进程,给足启动时间 startup_timeout = 30代理本身的配置放在它自己的目录里,和 Claude Code 的 config.toml 分开:
// C:\Users\你的用户名\.cowork\mcp\kimi-cu-proxy\config.json { "exePath": "", "enabledTools": [], "disabledTools": [] }exePath留空时,代理会依次回退到环境变量KIMI_CU_WINDOWS_EXE,再回退到默认路径%LOCALAPPDATA%\KimiCU\kimi-cu.exe。enabledTools和disabledTools留空表示不过滤,13 个工具全暴露。
3.3 代理核心逻辑(proxy.js 关键片段)
代理的作用就一件事:拦截tools/list响应,把每个工具 inputSchema 顶层的组合器删掉。核心函数如下:
// 剥掉 inputSchema 顶层的 oneOf/anyOf/allOf/not function sanitizeSchema(schema) { if (!schema || typeof schema !== 'object' || Array.isArray(schema)) return schema; const out = { ...schema }; for (const key of ['oneOf', 'anyOf', 'allOf', 'not']) { if (Object.prototype.hasOwnProperty.call(out, key)) { const note = `(原 schema 顶层含 ${key},为兼容 Claude Code 已剥离)`; out.description = out.description ? `${out.description} ${note}` : note; delete out[key]; } } if (!out.type) out.type = 'object'; if (out.properties === undefined) out.properties = {}; if (out.additionalProperties === undefined) out.additionalProperties = false; return out; }其余部分是双向透传:stdin 收到的每行 JSON 原样转发给kimi-cu.exe mcp子进程,stdout 收到的响应里,只有 id 匹配tools/list请求的那条才做改写,其他消息(initialize、tools/call、通知)一律不动。这样对 Claude Code 完全透明,kimicu 本体也不用改。
4. 逐项验证:MCP 连通、模型响应、kimicu 执行
配置写完不算完,得一层层验证。顺序建议从下往上:先确认 kimicu 本体健康,再确认代理能加载 13 个工具,最后确认 Claude Code 会话里能看到全部工具并真的能操作电脑。
4.1 验证 kimicu runtime 健康
打开 PowerShell,跑官方自检:
& "$env:LOCALAPPDATA\KimiCU\kimi-cu.exe" doctor期望输出里包含mcp=true、helper=embedded、agent.running=true。如果 agent.running 是 false,说明后台 agent 没起来,重启一下 kimicu 或重新跑安装脚本。
4.2 验证代理能返回 13 个工具
不要用printf | node proxy.js这种管道方式测,代理是常驻进程,管道等不到 EOF 会挂起。用 Python 起子进程,按 id 匹配响应:
import subprocess, json, threading proc = subprocess.Popen( ["node", r"C:\Users\你的用户名\.cowork\mcp\kimi-cu-proxy\proxy.js"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True, encoding="utf-8" ) def send(msg): proc.stdin.write(json.dumps(msg) + "\n") proc.stdin.flush() send({"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": "2024-11-05", "capabilities": {}, "clientInfo": {"name": "test", "version": "1.0"}}}) send({"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}}) for line in proc.stdout: msg = json.loads(line) if msg.get("id") == 2: tools = msg["result"]["tools"] print("工具数量:", len(tools)) print("工具名:", [t["name"] for t in tools]) break proc.stdin.close() proc.wait()期望输出工具数量为 13,且包含activate_window、get_app_state、click、scroll这四个之前被跳过的。如果还是 9 个,说明代理没生效,检查 config.toml 里 command 指向的是不是代理而不是 kimi-cu.exe 本体。
4.3 验证 Claude Code 会话加载
新开一个 Claude Code 会话(配置改动要新会话才生效),输入/mcp查看已加载的 Server。找到 kimi-cu,展开工具列表,确认是 13 个。如果只有 9 个,回到 4.2 确认代理本身没问题,再检查 Claude Code 是不是读的另一个配置文件(用户级~/.claude.json和项目级.claude.json可能冲突)。
4.4 验证模型响应
在会话里直接问一句,确认走的是 DeepSeek:
/model看当前模型是不是deepseek-chat。然后发一条普通消息,比如"用一句话说明你现在是哪个模型",确认能正常返回。如果报 401,检查 TaoToken Key 有没有写对;如果报 404,检查 base_url 是不是https://taotoken.net/api。
4.5 验证 kimicu 指令执行
跑一个最小闭环:让 Claude Code 打开计算器算 9×9。预期链路是:
launch_app("calc.exe")启动计算器list_apps定位窗口get_app_state(window_id, mode="full")拿到 snapshot_id 和无障碍树- 从树里解析"九""乘以""等于"按钮的中心坐标
- 依次
click(snapshot_id, x, y) get_app_state(mode="text")读到"显示为 81"turn_ended收尾
如果第 3 步报target window is minimized,先activate_window再重试。如果第 5 步报unsupported key: *,说明乘法不能用press_key,必须点按钮。
5. 本篇常见错排查
5.1 工具只加载 9 个
最常见。根因就是那 4 个工具的 inputSchema 顶层有 oneOf。确认代理的sanitizeSchema真的被调用了:在函数里加一行process.stderr.write("sanitize: " + schema.title + "\n"),看日志有没有输出。如果没输出,说明tools/list的 id 匹配逻辑有问题,检查toolsListIds集合的增删时机。
5.2 get_app_state 报坐标越界
click的坐标必须来自带截图的 snapshot(mode="full"或mode="image")的screenshot_pixels。如果你用的是mode="ax"拿到的坐标,坐标系不一样,会报 out of bounds。记住:要点击就用 full,只要文本就用 text。
5.3 窗口最小化时报错
get_app_state的 full/image 模式在窗口最小化时会直接报错。正确顺序是先activate_window把窗口带到前台,再get_app_state。不要指望它自动恢复。
5.4 Git Bash 下 taskkill 路径被转换
在 Git Bash 里跑taskkill /F /IM kimi-cu.exe,/F会被 MSYS 转成F:/。加前缀MSYS_NO_PATHCONV=1,或者干脆用 PowerShell 跑。
5.5 Python 打印中文乱码
Windows 控制台默认编码不是 UTF-8。跑验证脚本前设PYTHONIOENCODING=utf-8,或者在脚本开头sys.stdout.reconfigure(encoding="utf-8")。
5.6 skipSchemaValidation 没用
有些客户端提供skipSchemaValidation: true,但它只绕过本地校验,Anthropic API 层仍然会拒。治本还是把 oneOf 从 server schema 里去掉,也就是代理干的事。
5.7 收尾不干净
每次操作完必须调turn_ended,它是结束 Computer Use turn 并隐藏 overlay,不是杀进程。如果你发现屏幕一直显示"正在使用电脑",多半是模型忘了调turn_ended。DeepSeek 在这块确实不如 Codex 干净,可以在系统提示里明确要求"每次任务结束必须调用 turn_ended"。
6. 把链路固化下来
配置跑通之后,日常使用其实就三步:开 Claude Code、确认/mcp里 kimi-cu 是 13 个工具、直接下指令。模型通道走 TaoToken,想换模型就/model切一下,不用改配置。
如果你打算长期跑编码和 Agent 任务,建议把 TaoToken 的 Coding Plan 用起来,配额比按量更划算,适合这种高频调用的场景。入口在:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
接入文档里有各客户端的详细配置示例,遇到协议层的问题可以先翻一遍:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
想先验证模型响应正不正常,可以直接在网页端对话里试一句:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
最后留一个我踩过的坑:代理目录别放在带空格的路径下,Node 的 spawn 在某些 Windows 版本上对空格路径处理不一致,容易报 ENOENT。放在C:\Users\你的用户名\.cowork\mcp\这种纯英文无空格路径最稳。