MCP Server 连 WeKnora 时,TaoToken 负责模型侧 Key
1. MCP Server 连 WeKnora 时TaoToken 负责模型侧 Key当 Claude Code 的 MCP 面板已经能列出 WeKnora 工具检索也能返回 chunk但一问“按公司制度生成差旅报告”就报 401这通常不是 MCP 传输层坏了而是 WeKnora 内部 ReAct/RAG 调模型时没有拿到正确的模型侧 Key。这个场景里TaoToken 负责模型侧 Key官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentweknora_mcp_intro 模型侧地址统一使用 https://taotoken.net/api 。很多团队第一次接 WeKnora 时会把“知识库 API Key”和“模型 API Key”混成一个环境变量MCP Server 能启动tools/list 正常甚至 weknora_search 也能查到文档一旦触发 weknora_ask、ReAct 规划、摘要重写或 Wiki 生成就会走模型请求此时缺 Key、Base URL 写错、模型名不匹配都会被放大成 401、404 或 model not found。更隐蔽的一种情况是Claude Code 本身的 ANTHROPIC_* 已经配置好了但 MCP Server 是作为独立子进程拉起的并没有继承父进程环境于是 Claude Code 聊天正常WeKnora 内部问答失败。本文以 MCP 集成工程师视角把 WeKnora 的 MCP Server 拆成两层知识工具层由 WeKnora 提供负责检索、文档、RAG/ReAct 流程模型调用层交给 TaoToken负责模型侧 Key、Base URL 和模型名。目标是给出一份能跟做的模型侧参数片段并用 Agent 检索调用对照表定位问题到底出在哪一层。2. 先让 WeKnora 的 MCP Server 跑起来再分离两类凭据本地验证时推荐先把 WeKnora 作为独立服务启动再让 Claude Code、Codex 或自研 Agent 通过 MCP 连进去。前置条件通常是 Docker、Docker Compose 和 Git。仓库地址按你实际使用的 WeKnora 版本获取本文不贴站外链接。启动后访问http://localhost进入 Web UI先建一个很小的知识库例如上传两三份 Markdown、PDF 或 Word确认文档解析、分块和检索结果正常。这个阶段不要急着接模型侧 Key先把知识库侧跑通# 本地执行目录按你的 WeKnora 部署位置替换 docker compose up -d docker compose ps接着确认 MCP Server 的暴露方式。常见有两类stdio 模式由客户端拉起进程适合 Claude Code、Codex 这类本地 HarnessHTTP/SSE 模式监听端口适合企业内部多个 Agent 共享。无论哪种先只验证工具列表不要先触发大模型问答# 端口和路径按你的 MCP Server 配置替换 curl -s http://localhost:3001/mcp \ -H Content-Type: application/json \ -d {jsonrpc:2.0,id:1,method:tools/list,params:{}}如果这一步能返回weknora_search、weknora_read_document、weknora_ask之类的工具名说明 MCP 传输层和 WeKnora 服务基本通了。此时要立刻建立凭据边界WeKnora API Key用于访问知识库、文档、检索接口占位符写成YOUR_WEKNORA_API_KEY。TaoToken 模型侧 Key用于 WeKnora 内部 RAG/ReAct、摘要、Wiki 生成等模型调用占位符写成YOUR_API_KEY。MCP 客户端自身模型 Key例如 Claude Code 的ANTHROPIC_AUTH_TOKEN用于 Claude Code 生成回答Codex 则使用自己的TAOTOKEN_API_KEY。这三者不要互相替代。尤其不要把 TaoToken 的YOUR_API_KEY写进 WeKnora 知识库 API 的 Header也不要把 WeKnora 的 Key 塞进模型供应商配置。后面所有排障都先问一句当前请求到底经过哪一层。3. MCP Server 模型侧参数片段把 TaoToken Key 注入子进程WeKnora 的 MCP Server 如果只是把检索结果返回给外部 Agent那么它不一定需要模型侧 Key但只要它内部执行 RAG 问答、ReAct 多轮检索、Skills 规划、Wiki 整理就一定会调用 LLM。模型侧地址应统一填https://taotoken.net/apiKey 从 TaoToken 官网控制台创建入口见 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentweknora_mcp_getkey 。创建后先放在 MCP Server 进程的环境变量里不要写进工具调用参数。下面是一份通用参数片段字段名是示意实际请按你的 MCP Server 实现映射# WeKnora MCP Server 进程环境本地示例 # 模型侧供 WeKnora 内部 RAG/ReAct 调用 TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYYOUR_API_KEY TAOTOKEN_MODELclaude-sonnet-4-20250514 # 知识库侧供访问 WeKnora 服务 WEKNORA_API_URLhttp://localhost:8080 WEKNORA_API_KEYYOUR_WEKNORA_API_KEY # 可选限制超时和并发避免 ReAct 多轮检索拖垮本地调试 WEKNORA_MCP_TIMEOUT120 WEKNORA_MCP_MAX_RETRIES1如果 MCP Server 用 JSON 配置启动可以把模型侧参数放进env而不是放进arguments。这样做的原因是arguments会出现在 Agent 的调试日志、对话历史或追踪系统里Key 容易泄露env只存在进程环境里风险低得多。示意如下{ mcpServers: { weknora: { command: 你的 WeKnora MCP Server 启动命令, args: [], env: { WEKNORA_API_URL: http://localhost:8080, WEKNORA_API_KEY: YOUR_WEKNORA_API_KEY, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: YOUR_API_KEY, TAOTOKEN_MODEL: claude-sonnet-4-20250514 } } } }这里最容易犯的错是把TAOTOKEN_BASE_URL写成带/v1的地址。产品侧给定的模型 Base URL 是https://taotoken.net/api部分 SDK 会自动追加路径如果你再手写一层就可能出现 404。另一个错误是容器网络如果 WeKnora 跑在 Docker Compose 里MCP Server 也在容器里那么WEKNORA_API_URLhttp://localhost:8080指向的是 MCP 容器自己不是 WeKnora 服务。此时应改成 Compose 服务名例如http://weknora:8080或按你的网络配置使用host.docker.internal。4. Claude Codesettings.json、ANTHROPIC_* 与 WeKnora MCP 的完整写法Claude Code 接 TaoToken 时模型侧配置使用ANTHROPIC_*。你可以在settings.json中写env也可以在启动 Claude Code 前导出环境变量。关键字段是ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN模型名用ANTHROPIC_MODEL。注意Claude Code 自己的模型请求走这一套但 WeKnora MCP Server 子进程不一定继承这些变量所以 MCP Server 条目下要单独写自己的env。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, mcpServers: { weknora: { command: 你的 WeKnora MCP Server 启动命令, args: [], env: { WEKNORA_API_URL: http://localhost:8080, WEKNORA_API_KEY: YOUR_WEKNORA_API_KEY, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: YOUR_API_KEY, TAOTOKEN_MODEL: claude-sonnet-4-20250514 } } } }修改后重启 Claude Code执行/mcp查看 WeKnora 是否已连接。然后先调用纯检索工具再调用问答工具/mcp # 在 Claude Code 对话里尝试 # 用 weknora_search 搜索“差旅报销标准” # 用 weknora_ask 询问“员工出差住宿上限是多少”如果第一条返回文档第二条报 401问题就在 WeKnora MCP Server 的模型侧 Key而不是 Claude Code 的ANTHROPIC_*。如果你使用 CC Switch 管理多套 Claude Code 配置记住它的三件套通常只覆盖Base URL: https://taotoken.net/api API Key: YOUR_API_KEY Model: claude-sonnet-4-20250514CC Switch 切换的是 Claude Code 自身模型侧配置不会自动把TAOTOKEN_API_KEY同步给 WeKnora MCP Server 的env。因此多环境切换时MCP Server 的模型侧 Key 也要跟着切换到对应配置或者通过统一的本地密钥管理注入。5. Codexconfig.toml 只写 model_provider不要把 ANTHROPIC_* 搬过来Codex 的配置体系与 Claude Code 不同不要因为 Claude Code 用了ANTHROPIC_*就把这些变量复制到 Codex。Codex 应使用config.toml配置模型供应商并通过环境变量提供 Key。下面是一个示例Base URL 同样使用https://taotoken.net/apimodel gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat [mcp_servers.weknora] command 你的 WeKnora MCP Server 启动命令 args [] env { WEKNORA_API_URL http://localhost:8080, WEKNORA_API_KEY YOUR_WEKNORA_API_KEY, TAOTOKEN_BASE_URL https://taotoken.net/api, TAOTOKEN_API_KEY YOUR_API_KEY, TAOTOKEN_MODEL gpt-5-codex }启动前导出 Keyexport TAOTOKEN_API_KEYYOUR_API_KEY然后在 Codex 中查看 MCP 工具触发一次 WeKnora 检索和一次 WeKnora 问答。如果 Codex 聊天正常但 WeKnora 的weknora_ask报错检查[mcp_servers.weknora].env中的TAOTOKEN_API_KEY是否已注入。这里不要写ANTHROPIC_BASE_URL或ANTHROPIC_AUTH_TOKENCodex 不按这套变量解析模型供应商写了也不会生效反而会让排障时误以为模型侧已经配置完成。6. Agent 检索调用对照哪些请求经过 TaoToken哪些只经过 WeKnora把调用链拆开之后排障会简单很多。下面用一张对照表说明常见 Agent 动作分别经过哪一层。工具名以你的tools/list实际返回为准这里用weknora_search和weknora_ask做示意。Agent 动作是否经过 WeKnora是否经过 TaoToken 模型侧使用的 Key典型现象tools/list只连 MCP Server否无模型 Key能列出工具不代表模型侧已配好weknora_search是走检索否YOUR_WEKNORA_API_KEY纯检索通常不消耗模型 Keyweknora_read_document是读文档否YOUR_WEKNORA_API_KEY能返回原文片段weknora_ask/ ReAct 问答是内部可能多轮检索是YOUR_API_KEY模型 Key 错时 401、404Wiki Mode 自动整理是是YOUR_API_KEY需要模型生成结构化内容Claude Code 生成最终回答否MCP 返回后由客户端生成是ANTHROPIC_AUTH_TOKEN与 MCP Server 的 Key 是两套Codex 生成最终回答否MCP 返回后由客户端生成是TAOTOKEN_API_KEYCodex 用config.toml供应商实际 JSON-RPC 调用可以这样理解。纯检索请求{ jsonrpc: 2.0, id: 2, method: tools/call, params: { name: weknora_search, arguments: { query: 差旅报销标准, top_k: 5 } } }触发 WeKnora 内部 RAG/ReAct 的问答请求{ jsonrpc: 2.0, id: 3, method: tools/call, params: { name: weknora_ask, arguments: { question: 员工出差住宿标准是多少, mode: react, top_k: 8 } } }如果weknora_search成功而weknora_ask失败优先检查TAOTOKEN_*环境变量。如果两者都失败先检查 MCP 连接和 WeKnora 服务。如果两者都成功但 Claude Code 回答风格不对检查ANTHROPIC_*。如果 Codex 回答异常检查config.toml的model_provider和TAOTOKEN_API_KEY。这样分层之后不需要在一个日志里盲猜。7. 典型报错与最小排查顺序401、404、model not found、容器网络最常见的是 401。表现是 MCP 工具能列出纯检索能返回但 WeKnora 问答报无效 Key。原因是 MCP Server 子进程没有拿到TAOTOKEN_API_KEY或者 Key 被空格、引号包裹后传入。排查时不要打印完整 Key先脱敏检查# 本地执行仅看变量是否存在不输出完整值 env | grep -E TAOTOKEN|ANTHROPIC|WEKNORA | sed s/.*/***/如果 Claude Code 的ANTHROPIC_AUTH_TOKEN存在但TAOTOKEN_API_KEY不存在就说明 WeKnora MCP Server 没有模型侧 Key。把它加到 MCP Server 条目的env里而不是只加在 Claude Code 顶层。404 多数与 Base URL 有关。模型侧地址使用https://taotoken.net/api不要重复拼/v1也不要拼成/api/v1/chat/completions这种完整端点。不同 SDK 会自动补路径重复补就会打到不存在的地址。另一个 404 来源是 WeKnora API URL 写错例如把知识库服务地址写成模型服务地址。把WEKNORA_API_URL和TAOTOKEN_BASE_URL分开检查即可。model not found通常不是鉴权问题而是模型名与实际可用模型不一致。Claude Code 和 WeKnora 内部调用可能用不同模型名建议先用同一个模型跑通再按需要拆分。模型对话页面可以用来快速验证模型是否可用入口见 https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentweknora_mcp_chat 。如果对话页面正常MCP Server 报模型不存在就把 WeKnora 侧的模型名改成对话页面所用模型。超时和连接拒绝通常来自容器网络。MCP Server 在容器里访问宿主机上的 WeKnoralocalhost不一定可用WeKnora 在另一个 Compose 服务里应使用服务名。排查顺序建议固定为tools/list是否成功。weknora_search是否成功。weknora_ask是否成功。看 MCP Server 日志里的上游 URL 和状态码。检查TAOTOKEN_BASE_URL、TAOTOKEN_API_KEY、模型名。检查 WeKnora API URL 和知识库 Key。最后才调整提示词、top_k 或 rerank 参数。还有一个安全边界必须单独强调不要让 MCP Server 或 Agent 直连 Oracle、MySQL 等生产库来“绕过检索”。MCP Server 应调用 WeKnora 的知识库接口SQL 查询和命令由读者在本地或受控环境执行。生产库连接串一旦进入 Agent 工具参数日志、会话历史和追踪系统都可能留下敏感信息风险远大于省掉的检索步骤。8. 多 Harness 共享 WeKnora 知识层时模型侧统一到 TaoToken 的工程价值WeKnora 这类项目把企业知识库、MCP、Skills、ReAct、长期记忆等能力拼在一起后企业内部的常见形态会变成Claude Code 负责编码和文档理解Codex 负责另一类自动化任务自研 Agent 负责业务流程但它们都通过同一个 WeKnora MCP Server 检索同一套企业知识。此时真正需要稳定的不是每个 Agent 各写一套知识接口而是知识层共享、模型侧配置可替换。把模型侧统一到 TaoToken 的好处是WeKnora 内部 RAG/ReAct、Claude Code、Codex 都可以使用同一个 Base URL 入口但各自使用各自的配置位置。WeKnora MCP Server 用TAOTOKEN_*环境变量Claude Code 用ANTHROPIC_*和settings.jsonCodex 用config.toml和TAOTOKEN_API_KEY。这样切换模型、轮换 Key、区分开发和生产时不需要改知识库文档也不需要改 MCP 工具定义。工程上建议再加三条约束Key 不落盘到知识库文档、Wiki 页面和 MCP 工具参数里。MCP Server 只暴露必要工具读文档、检索、问答分开授权。日志中对Authorization、api_key、token做脱敏。做到这三点后WeKnora 作为企业知识层TaoToken 作为模型侧 Key 提供方Agent Harness 只负责编排和展示。出现问题时按“MCP 传输层 → WeKnora 知识层 → TaoToken 模型层 → Harness 自身模型层”的顺序排查基本不会乱。9. 下一步按这条路径完成模型侧 Key 与 MCP 接入如果你还没有模型侧 Key建议按高转化路径走一遍避免在 MCP 配置里反复试错。先打开模型对话页面验证模型可用再选择 Coding Plan然后创建 API Key最后回到 Claude Code 文档完成settings.json配置模型对话https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentweknora_mcp_chatCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentweknora_mcp_plan创建 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentweknora_mcp_keysClaude Code 文档https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentweknora_mcp_docTaoToken 官网总入口见 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentweknora_mcp_end 。配置时牢记WeKnora 负责知识工具层TaoToken 负责模型侧 KeyClaude Code 用settings.json和ANTHROPIC_*Codex 用config.toml和模型供应商配置CC Switch 三件套只解决 Claude Code 侧切换。把TAOTOKEN_BASE_URL固定为https://taotoken.net/api把YOUR_API_KEY注入到真正需要调用模型的那一层再按 Agent 检索调用对照表逐项验证MCP Server 连 WeKnora 的模型侧问题就会从“玄学 401”变成可定位、可复现、可交接的配置问题。