
1. Boris 说「编程已被解决」那 TypeScript 项目里 Agent 的 MCP 配置到底该怎么写Boris Cherny 在访谈里说了一句让很多人睡不着觉的话整个 2026 年他没亲手写过一行代码每天提交几十个 PR最疯狂的一天提了 150 个。Claude Code 的代码库本身就是 TypeScript 加 React没什么秘密。他的结论很直接——编程已经被解决了至少对他来说是。但如果你真的在 TypeScript 项目里跑过 Claude Code Agent就会发现一个尴尬的现实模型能力确实够了可你的 Agent 连你项目里的数据库 schema 都读不到连你团队的 API 规范都查不了。问题不在模型在配置层。Boris 反复强调 MCP 是连接一切的答案但「MCP 该怎么写」这件事官方文档给的是通用示例落到 TypeScript 项目里settings.json 和 config.toml 的骨架长什么样、权限怎么收、Key 怎么统一管这些才是真正卡住人的地方。这篇就聚焦一件事在 Boris 说的「Agent 时代」TypeScript 项目里 Claude Code Agent 与 MCP 的落地配置怎么写。我会给出可复制的 settings.json 与 config.toml 骨架并说明用 TaoToken 统一 Key 和 API 通道接入后怎么验证配置真的生效了。适合已经在用 Claude Code、但 MCP 配置还停留在「复制粘贴官方示例」阶段的 TypeScript 开发者。2. 前置TaoToken 统一 Key 与 API 通道为什么 Agent 时代更需要它Boris 提到 Anthropic 内部所有流程都围绕 AI 重新设计Agent 之间通过 Slack 互相沟通。这种玩法对个人开发者和小团队来说第一个撞上的墙不是模型能力是 Key 管理。你可能有 Claude Code 的 Key、有 MCP server 调外部 API 的 Key、有 CI 里跑 Agent 的 Key散落在各个 .env 和 settings 文件里改一个地方要翻五个仓库。TaoToken 在这里的角色是统一入口。它提供兼容的 API 通道你可以把 Claude Code Agent 的模型调用、MCP server 里需要的外部请求都收敛到同一个 Key 和同一个 base URL 上。这样 settings.json 里不用再写一堆不同厂商的 endpointconfig.toml 里 MCP server 的环境变量也能统一从一处注入。具体来说你需要先拿到一个 TaoToken 的 API Key。访问 https://taotoken.net/api-keys 创建然后在项目里把它作为唯一的环境变量来源。模型对话调试可以用 https://taotoken.net/models 先确认通道通不通长期跑编码 Agent 的话Coding Plan 页面 https://taotoken.net/coding-plan 有更细的配额说明。接入文档在 https://taotoken.net/doc 遇到配置报错先翻这里。注意TaoToken 的 API 地址是 https://taotoken.net/api 不要加 UTM 参数settings.json 里写错这个 base URL 是最常见的 401 来源。3. 可复制配置TypeScript 项目的 settings.json 与 config.toml 骨架Claude Code 的配置分两层项目级的 settings.json 管 Agent 行为和权限MCP 的 config.toml 管外部工具连接。TypeScript 项目里我建议把两者都放在项目根目录的 .claude/ 下跟着仓库走这样团队每个人拉下来就是一致的 Agent 环境。先看 settings.json 的骨架。这个文件控制 Claude Code 用哪个模型通道、允许哪些工具、MCP server 怎么启动{ model: claude-sonnet-4-20250514, apiBaseUrl: https://taotoken.net/api, apiKeyEnvVar: TAOTOKEN_API_KEY, permissions: { allow: [ Read, Glob, Grep, Bash(npm run typecheck:*), Bash(npm run test:*), Bash(npx tsc --noEmit) ], deny: [ Bash(rm -rf:*), Bash(git push --force:*), Read(./.env), Read(./secrets/**) ] }, mcpServers: { typescript-lsp: { command: npx, args: [-y, modelcontextprotocol/server-typescript], env: { TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY} } }, postgres-readonly: { command: npx, args: [-y, modelcontextprotocol/server-postgres], env: { DATABASE_URL: ${DATABASE_URL_READONLY}, TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY} } } } }几个关键点。apiBaseUrl 指向 TaoToken 的 API 地址apiKeyEnvVar 声明从环境变量读 Key这样 Key 不进仓库。permissions.allow 里我特意放了 typecheck 和 test 命令因为 TypeScript 项目里 Agent 改完代码最该跑的就是这两个放行它们能让 Agent 自己验证改动。deny 里挡住 .env 和 secrets 目录这是底线。再看 config.toml这个文件管 MCP server 的细粒度行为比如超时、重试、工具白名单[server.typescript-lsp] transport stdio timeout_ms 30000 max_retries 2 tools [get_diagnostics, get_completions, find_references] [server.postgres-readonly] transport stdio timeout_ms 15000 max_retries 1 tools [query] read_only true [agent] default_model claude-sonnet-4-20250514 api_base https://taotoken.net/api max_tokens_per_turn 8192 auto_approve_reads trueconfig.toml 里 postgres-readonly 的 read_only true 很重要。Boris 说 Agent 会自己判断该做什么但在生产库面前配置层的硬约束比模型判断更可靠。tools 白名单只放 query不放 execute这样即使 Agent 想写库也写不了。环境变量在 .env.local 里统一注入这个文件进 .gitignoreTAOTOKEN_API_KEYsk-你的taotoken密钥 DATABASE_URL_READONLYpostgresql://readonly_user:passlocalhost:5432/mydbTypeScript 项目里如果用了 dotenv记得在 Agent 启动脚本里先加载。我习惯在 package.json 里加一个 agent 脚本{ scripts: { agent: dotenv -e .env.local -- claude } }这样 npm run agent 启动时环境变量已经就位settings.json 里的 ${TAOTOKEN_API_KEY} 能正确展开。4. 验证请求确认 MCP 配置真的生效了配置写完不代表生效。Boris 说他们内部 Agent 之间会互相沟通前提是每个 Agent 的工具连接都是通的。验证分三步。第一步确认模型通道通。在项目里跑一个最小请求看 TaoToken 的 API 地址是否可达curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: $TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 64, messages: [{role: user, content: reply with ok}] }返回里如果有 content 字段且文本是 ok说明 Key 和 base URL 都对。如果返回 401先检查 TAOTOKEN_API_KEY 有没有正确加载如果返回 404检查 base URL 是不是写成了带路径的变体。第二步确认 MCP server 被 Claude Code 识别。启动 Agent 后在对话里输入 /mcp 命令应该能看到 typescript-lsp 和 postgres-readonly 两个 server 的状态是 connected。如果显示 failed看 config.toml 里的 command 和 args 能不能在终端里手动跑通。第三步实际调用一次 MCP 工具。让 Agent 做一件必须用 MCP 才能完成的事比如「查一下 users 表里最近注册的 5 个用户」。如果 Agent 能通过 postgres-readonly 的 query 工具拿到结果说明整条链路通了。这一步成功的结果长这样Agent 返回查询结果并在工具调用记录里显示 postgres-readonly.query 被调用。TypeScript 项目里还有一个专属验证让 Agent 读一个 .ts 文件并报告类型错误。如果 typescript-lsp 的 get_diagnostics 工具正常工作Agent 能准确说出哪一行有类型问题。这比单纯看 server 状态更能说明 MCP 真的在干活。5. 本篇常见错排查配置 MCP 时踩的坑大多集中在几个地方。报错MCP server xxx failed to start: spawn npx ENOENT。这是环境变量 PATH 的问题Claude Code 启动时没继承你 shell 的 PATH。解决办法是在 settings.json 的 mcpServers 里把 command 写成 npx 的绝对路径用which npx查出来填进去。报错401 Unauthorized且确认 Key 没问题。八成是 apiBaseUrl 写错了。TaoToken 的 API 地址是 https://taotoken.net/api 不要写成 https://taotoken.net/api/v1 或者带尾斜杠。settings.json 里改完记得重启 Agent配置不会热加载。MCP 工具调用返回permission denied。检查 settings.json 的 permissions.deny 里有没有误伤。比如你 deny 了Read(./**)那 Agent 连项目文件都读不了MCP 工具自然也用不了。deny 要精确到敏感路径不要用通配符一刀切。config.toml 改了不生效。Claude Code 读的是项目根目录 .claude/config.toml如果你放在别的地方它不认。另外 TOML 语法对缩进不敏感但对引号敏感字符串必须用双引号单引号在某些版本会解析失败。Agent 能连上 MCP 但查不到数据。postgres-readonly 的 DATABASE_URL 如果指向了错误的库query 会返回空结果而不是报错。先在终端用 psql 手动连一下这个 URL确认库和表都在。提示每次改完 settings.json 或 config.toml用claude --debug启动能看到 MCP server 的启动日志和配置加载详情比猜快得多。6. 下一步把配置层当成 Agent 时代的基本功Boris 说 Claude Code 本身一年后可能只剩 100 行代码因为模型足够聪明时不需要那么多脚手架。但那是模型层的事。配置层反而会变得更关键因为 Agent 越自主你越需要在配置里划清边界哪些工具能碰、哪些数据能读、Key 从哪来、请求走哪条通道。TypeScript 项目里这套 settings.json 加 config.toml 的骨架你可以直接复制到仓库里跑起来。跑通之后下一步是把 MCP server 按团队需求扩展比如接上你们的内部 API 文档、接上 CI 状态查询。每加一个 server都在 config.toml 里用 tools 白名单收窄权限这是 Boris 说的「为下一个模型构建产品」在配置层的具体做法。如果你还没配 TaoToken 的 Key先去 https://taotoken.net/api-keys 创建一个然后照着第 3 节的骨架把 apiBaseUrl 和 apiKeyEnvVar 填上。模型对话想先试试通道用 https://taotoken.net/models 长期跑编码 Agent 看 https://taotoken.net/coding-plan 配置报错翻 https://taotoken.net/doc 。Claude Code 的 Anthropic 接入细节在 https://taotoken.net/claude-code-anthropic 控制台在 https://taotoken.net/console 。配置写完、验证跑通的那一刻你会理解 Boris 那句话的另一层意思编程被解决的前提是你先把 Agent 的配置层解决掉。