Claude Code 系统提示词抓取 (Capturing Claude Code System Prompt via MITM)
适用版本:Claude Code 2.1.233(2026-08 实测)。目标:拿到该版本实际发送给 API 中转的完整提示词(system 数组 + 动态上下文 + tools schema)。
背景事实(先说结论)
- Claude Code 2.1.233 的系统提示词打包在
claude.exe内(minified JS / 压缩资源)。strings只能提取到随包 SDK 文档(如# Tool Use — C#),无法还原提示词正文。 - 本机经 CC Switch(
cc-switch.exe,监听127.0.0.1:15721)中转。~/.claude/settings.json的env里写死ANTHROPIC_BASE_URL=http://127.0.0.1:15721,且所有模型(opus/sonnet/haiku/fable)都映射到deepseek-v4-flash。 - 关键:base URL 非官方 Anthropic 主机时,claude 使用 SDK 精简提示词(开头 "You are a Claude agent, built on Anthropic's Claude Agent SDK."),不是网上流传的经典 Claude Code 完整版(
## System Constraints/## Tool Use那种数万 token 版本)。 settings.json的env优先级高于 shell 环境变量:export ANTHROPIC_BASE_URL=...无效,claude 仍走 settings 里的值。想改必须改文件本身。
实测提示词构成(110KB 请求)
| 部分 | 大小 | 内容 |
|---|---|---|
system 数组(3 块) | ~6.3KB | ① billing header ② 一句话身份声明 ③ 主提示词:# Harness(终端输出、权限被拒要调整不重试、并行工具调用、file:line 引用)、# Session-specific guidance、# Memory(文件持久记忆)、# Environment、# Context management |
首条 user message 的 <system-reminder> | ~21.9KB | # claudeMd(用户全局 CLAUDE.md 原样注入,19KB)+ # currentDate |
tools schema | 27 个工具 | Agent、Bash、Edit、Read、Write、Glob、Grep、WebSearch、WebFetch、CronCreate、Workflow(描述 19KB)、EnterWorktree、Skill 等。详细行为说明主要在这里 |
system role message | ~6KB | Agent 工具的可用子代理类型说明 |
system role message | 49B | <total_tokens>N tokens left</total_tokens>(每轮注入剩余 token 提醒) |
其他:thinking: {type: adaptive, display: omitted}(思维链运行但不显示)、max_tokens: 64000。
抓取步骤(MITM 拦截本地中转)
前置:本机有 CC Switch 中转(或任何本地 Anthropic 兼容中转)。
- 确认中转与配置:读
~/.claude/settings.json的env;netstat -ano | grep <port>确认监听。 - 写本地 MITM:node http 代理,监听
127.0.0.1:15999,把收到的完整请求 body 存文件,再转发到真实中转(15721)。参考脚本见文末。 - 改配置指向 MITM:备份
settings.json→ 把env.ANTHROPIC_BASE_URL改为http://127.0.0.1:15999→ 保存。 - 触发请求:
claude -p "你的问题" --no-session-persistence。 - 分析:解析 JSON,导出
system数组、首条 user message 的<system-reminder>、tools名称与描述长度。 - 清理:恢复
settings.json(从备份);杀掉 MITM 进程;确认 claude 恢复正常。
失败点与坑(全部实测踩过)
- 杀 node 进程会误杀 CC Switch 后端:
Get-Process node | Stop-Process -Force会把 cc-switch 的 node 后端一起杀掉 →15721无监听 → claude 报 Connection refused。恢复方法:重启cc-switch.exe,等几秒端口回来。 --settings覆盖会丢掉 AUTH_TOKEN:--settings <file>整体替换 env,ANTHROPIC_AUTH_TOKEN丢失 → claude 卡认证超时 180s。不要用这个方式改 base url。- node 脚本路径坑:Windows 版 node 把
/c/tmp/x解析成C:\c\tmp\x→ 启动即 ENOENT 崩溃。脚本内一律用C:/tmp/x。 - 直接抓 exe 不可行:提示词是 minified JS 字符串常量,
strings输出的是 SDK 文档和转义后的零散片段。 - 第三方 CDN 不可靠:
raw.githubusercontent.com的prompts/sys-prompts.txt已 404(仓库重构);jsdelivr / npmmirror 走代理时 SSL 偶发断连。本地 exe + MITM 是最稳路径。
参考 MITM 脚本(node)
const http = require('http');
const fs = require('fs');
const server = http.createServer((req, res) => {
let body = [];
req.on('data', c => body.push(c));
req.on('end', () => {
const payload = Buffer.concat(body);
if (req.url.includes('messages')) fs.writeFileSync('C:/tmp/cc-full-request.json', payload);
const r = http.request({ host: '127.0.0.1', port: 15721, method: req.method,
path: req.url, headers: { ...req.headers, host: '127.0.0.1:15721' } }, rp => {
res.writeHead(rp.statusCode, rp.headers);
rp.pipe(res);
});
r.on('error', e => { res.writeHead(502); res.end('err'); });
r.end(payload);
});
});
server.listen(15999, '127.0.0.1');启动:powershell -Command "Start-Process -FilePath 'C:\Program Files\nodejs\node.exe' -ArgumentList 'C:\tmp\mitm.js' -WindowStyle Hidden"(bash 工具会话结束会回收子进程,需独立进程)。
如何迁移到其他环境
- 换版本:抓包结果随版本变,重新走一遍流程即可。
- 无中转直连官方:
ANTHROPIC_BASE_URL指向官方时是完整提示词(经典版),抓包方法同样适用,但需注意官方域名走 TLS,用 https MITM(装本地 CA)或抓进程内存。
相关概念
- CC Switch(Claude Code API 配置切换工具,模型映射中转)
- 自动前缀缓存 (Automatic Prefix Caching)(动态上下文移到 user message 的原因之一:提示词缓存复用)
- AI 编码代理提示词架构对比 (Prompt Architecture pi vs Claude Code)(pi 与 Claude Code 提示词设计对比与选型)
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/AI apps