ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

读懂 MCP 与 A2A 架构,这次用 TaoToken 让 Claude Code 走通 Doris MCP 示例

读懂 MCP 与 A2A 架构,这次用 TaoToken 让 Claude Code 走通 Doris MCP 示例 第7章把 MCP 服务端框架搭起来后最容易被忽略的不是路由和鉴权而是示例里那行模型密钥换个项目要换 Key换个模型要改环境变量到了第11章 Apache Doris MCP 的生产级构建Tools、Resources、Prompts 都通了却说不清一次工具调用到底消耗了多少 Token。这个场景里先让 TaoToken 把 Claude Code 的模型出口固定下来打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdoris_mcp_intro 创建 API Key把 Base URL 填成 https://taotoken.net/api再回到 Doris MCP 示例验证 MCP 工具调用是否一次通过。书里反复提到的上下文爆栈、Token 成本高、工具调用准确率低、企业数据权限混乱其实在动手阶段都能落到可观测指标。MCP 负责工具层A2A 负责多智能体之间的能力发现与任务协同Claude Code 在这里充当宿主和 MCP 客户端。先把 Key、通道、调用日志和 Token 消耗看清楚再去接 Dify 和 Cursor排障边界会清楚很多。下面按第7章和第11章的路径走重点不是再画一遍架构图而是让 Doris MCP 的只读工具在 Claude Code 里真正被调用一次并从日志里对上账。1. 从第7章 7.3 的“填密钥”说起Doris MCP 为什么先要看见 Token 账1.1 原文的痛点不是架构图而是上下文和成本第7章的重点是 MCP 服务端开发7.3 快速搭建框架里已经把环境准备、依赖安装、基础服务端、配置与启动流程串起来了。很多读者照着走到最后会在示例配置里直接写模型密钥然后启动服务、打开调试器、跑一次工具调用看见返回就认为通了。问题是这一步只验证了“能跑”没有验证“成本可控”和“权限可控”。到了第11章 Apache Doris MCP 构建实战Tools 原语会暴露查询类工具Resources 可能返回表结构、字段注释、样例数据Prompts 还会把上下文组合得更长。如果没有 Token 账上下文爆栈往往是在 Dify 或 Cursor 接入后才突然暴露。更现实的问题是工具调用准确率。Doris MCP 这种数据库服务工具参数通常包含库名、表名、SQL、限制行数、超时时间。模型一旦对参数理解偏差调用就会失败失败后重试又会产生新的 Token 消耗。第9章讲错误处理与健壮性设计第10章讲测试、部署与性能优化其实都在提醒同一件事MCP 服务端不是把接口包一层就结束调用链上的每一个失败和重试都要能被看见。否则你只知道“没返回结果”却不知道是 Key 无效、Base URL 配错、模型 ID 不在可用列表还是 Doris 侧权限不足。所以本文把第7章和第11章里“直接填模型密钥”的动作改掉换成先到统一入口创建 Key再把 Claude Code 的模型出口固定到 TaoToken。这样做的目的不是增加一个步骤而是让模型调用、MCP 工具调用、Doris 只读查询这三层各自有日志可查。只有先把调用日志和 Token 消耗跑通后面继续做 Dify Agent Doris MCP、Cursor 集成时才不会把通道问题和业务逻辑问题混在一起猜。1.2 把“直接填模型密钥”改成 TaoToken 统一通道回到原文第7章 7.3.3 的“配置与启动流程”原来常见的做法是每个示例文件里填一次模型密钥或者在环境变量里写死一个 Key。项目一多Key 散落在不同目录模型切换也要逐处修改。仿照书里的工程化思路应该把模型出口收口先去 TaoToken 注册并创建 API Key再把 Claude Code 的ANTHROPIC_BASE_URL指向https://taotoken.net/api把ANTHROPIC_AUTH_TOKEN填成YOUR_API_KEY。模型 ID 不要凭记忆写去模型广场看当时列表选中哪个就填哪个。这里要区分两个地址很多第一次接入的人会把它们混用。给人打开、注册、创建 Key、看模型广场、看用量的是官网页面也就是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdoris_mcp_intro填进 Claude Code 的接口地址是https://taotoken.net/api末尾不要加/v1。这两个地址各司其职前者是控制台入口后者是 API 通道入口。把 UTM 参数加到/api上或者把/v1补在后面都会让请求落到错误路径。TaoToken 在这里承担的是统一 API 和兼容通道的角色让 Claude Code 用同一把 Key 访问模型再通过 MCP 协议去调用 Doris MCP 服务端。它不改变 MCP 的架构也不替代 Doris 的权限体系。真正需要企业团队做的仍然是把 Doris MCP 服务端按第11章拆成 Tools、Resources、Prompts把只读账号、测试库、超时和重试策略配好。TaoToken 解决的是模型调用侧的入口统一和用量可见方便你在一个地方对账。2. 在 Claude Code 的 settings.json 里给 Doris MCP 固定模型出口2.1 先拿 Key打开 TaoToken 创建 YOUR_API_KEY准备材料分三样Claude Code 本体、Doris MCP 服务端目录、一把可用的 API Key。Key 不要从旧示例里复制也不要用别人分享的临时 Key。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdoris_mcp_create_key 注册登录后进入控制台在 API Keys 页面创建一把新 Key。建议按项目命名例如claude-code-doris-mcp方便后面在调用日志里按 Key 过滤。创建后只显示一次或少数几次复制到本地密码管理器不要贴进 Git 仓库。同时去模型广场确认要用的模型 ID。本文配置里统一写YOUR_MODEL_ID你实际填的值以模型广场当时列表为准。不要因为网上某个示例写了某个日期后缀就跟着写模型列表会变Claude Code 发起请求时如果模型 ID 不在可用列表通常会直接报模型不存在或权限不足。Key 和模型 ID 都确认后再开始改 Claude Code 配置。2.2 环境变量与 ~/.claude/settings.json 两种写法如果只是临时验证可以在当前终端里导出环境变量。这样不会污染长期配置关掉终端就恢复。注意 Base URL 只写https://taotoken.net/api不要加/v1也不要加任何查询参数。export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENYOUR_API_KEY export ANTHROPIC_MODELYOUR_MODEL_ID如果要长期使用把同样三项写进 Claude Code 的用户级配置文件~/.claude/settings.json。书中第7章强调配置与启动流程要稳定可复现这里也建议用配置文件而不是每次手动导出。下面是最小 env 示例YOUR_MODEL_ID替换成模型广场里选中的 ID。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_MODEL_ID } }保存后新开一个终端或者重启 Claude Code让配置生效。可以用echo $ANTHROPIC_BASE_URL检查当前终端是否读到了正确地址。如果你更习惯命令行启动也可以用 TaoToken 提供的 CLI 包快速拉起 Claude Code这一步只在原文涉及命令行工具链时使用属于可选路径npm install -g taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m YOUR_MODEL_ID无论走环境变量、settings.json 还是 CLI模型出口都固定到同一个 Base URL。这样后面 Doris MCP 服务端里的示例代码不需要再各自保存模型密钥MCP 服务端专心处理 Doris 连接和工具暴露Claude Code 专心处理模型对话与工具编排。Key 一旦泄露或轮换也只需要改一处。3. 按第11章搭 Apache Doris MCPTools、Resources、Prompts 到 stdio 入口3.1 第7章服务端框架 第11章 Doris MCP 的最小目录第7章 7.3 搭的是 MCP 服务端通用框架第11章 11.2 把这套框架落到 Apache Doris。按书里的结构Doris MCP 服务端至少要有入口文件、工具注册、资源注册、提示词注册、传输层和 Doris 连接管理。本文不重复书里的完整代码只给出可跑通的最小路径以书中第11章示例目录为准确认入口文件例如doris_mcp_server.py传输方式先用stdio因为 Claude Code 作为本地 MCP 宿主用标准输入输出最容易排查。Doris 连接只指向本地或测试环境不要一上来就接生产库。依赖安装按原书第7章 7.3.1 和第6章 6.4 的工具链来。若示例用uv就按uv的方式创建虚拟环境和安装依赖若示例保留requirements.txt也不要跳过锁版本。下面命令里的文件名和模块名要与你手里的书中示例保持一致不要凭空改包名。uv venv uv pip install -r requirements.txt uv run python doris_mcp_server.py --transport stdio启动前检查 Doris 连接参数。测试库可以用127.0.0.1、只读账号、单独 database例如demo_db。不要把生产库账号写进 MCP 服务端 env也不要把高权限账号交给 Claude Code。第11章 11.2.7 讲安全架构11.2.8 讲异常处理与容错到了实际配置里最有效的安全措施就是最小权限、只读账号、测试数据、限制返回行数。3.2 Claude Code 注册 doris-mcp.mcp.json 与 claude mcp addMCP 服务端能单独启动后要在 Claude Code 里注册。项目级配置可以放在.mcp.json这是 Claude Code 常用的 MCP 配置文件格式。注意这里只配 Doris MCP 服务端的启动命令和 Doris 连接环境变量不要把ANTHROPIC_*模型变量塞进来。模型 Key 属于 Claude Code 的模型出口Doris 账号属于 MCP 服务端的数据出口两者混在一起会让排障非常痛苦。{ mcpServers: { doris-mcp: { command: uv, args: [ run, python, doris_mcp_server.py, --transport, stdio ], env: { DORIS_HOST: 127.0.0.1, DORIS_PORT: 9030, DORIS_USER: readonly_user, DORIS_PASSWORD: YOUR_DORIS_PASSWORD, DORIS_DATABASE: demo_db } } } }如果你不想手写 JSON也可以用 Claude Code 的 MCP 添加命令。下面命令只演示形式实际入口文件和参数以书中第11章示例为准。命令里的doris-mcp是给 Claude Code 看的服务名后面在对话里列工具时会显示。claude mcp add doris-mcp -- uv run python doris_mcp_server.py --transport stdio配置完成后重启 Claude Code让它重新读取.mcp.json。如果 Claude Code 没有识别到doris-mcp先不要怀疑模型通道而是回到 MCP 服务端手动执行一次启动命令看它是卡在依赖、Doris 连接还是参数解析。MCP 工具没出现通常和模型 Key 无关。4. 验证 MCP 工具调用一次通过先 list_tools再只读测试 SQL4.1 让 Claude Code 列出 doris-mcp 工具验证的第一步不是直接查业务数据而是让 Claude Code 列出当前 Doris MCP 暴露了哪些工具。这一步对应第11章 11.2.2 的 Tools 原语也能顺便确认 MCP 服务端和 Claude Code 之间的 stdio 通道是否正常。可以在 Claude Code 里发一条明确指令“请列出当前 doris-mcp 提供的 tools并用一句话解释每个工具的参数先不要执行任何 SQL。”如果配置正确Claude Code 会触发一次或多次 MCP 工具发现请求并在界面上显示可用工具列表。此时观察输出里是否出现你注册的服务名以及工具数量是否和 Doris MCP 服务端代码里注册的一致。若列表为空检查.mcp.json路径、uv是否在 PATH、入口文件是否写对、启动命令能否在项目根目录手动跑通。这一步只验证工具发现不消耗大量 Token适合作为第一次对账点。4.2 用一条只读 SELECT 走完整链路工具列表出现后下一步验证 Tools、Claude Code、TaoToken 通道和 Doris 测试库能否串起来。安全起见不要让 Claude Code 直接连生产库执行业务操作。可以按下面的顺序做先让 Claude Code 调用 Doris MCP 的表结构类工具例如获取demo_db.demo_orders的字段和类型再让它根据表结构生成一条只读SELECT加上LIMIT 10SQL 生成后由你在本地 Doris 客户端或 SQL 编辑器执行把结果前几行贴回对话最后让 Claude Code 结合结果解释字段含义。这样既走通了 MCP 工具调用又守住了生产边界。MCP 工具可以用于测试库的元数据读取和只读结构查询生产诊断 SQL 则必须由读者在本地客户端执行再把报错或结果贴回对话。不要写成“让 Claude Code 直接连上生产 Doris 执行诊断 SQL”也不要让 MCP 服务端持有生产库高权限账号。第11章 11.2.7 的安全架构、11.2.8 的异常处理落到操作上就是这句话测试库自动查生产库人工执行。4.3 工具调用成功的标志一次成功的 MCP 工具调用在 Claude Code 侧通常能看到工具请求和工具返回的往返。界面上会出现类似工具名、参数、结果摘要的信息如果失败则会出现超时、连接拒绝、参数校验失败或 Doris 返回的错误码。此时不要只看最终自然语言回答要看工具调用层的结果。MCP 服务端控制台日志里也应该出现对应请求包括工具名、耗时和错误堆栈。若 Claude Code 说“无法调用工具”但 MCP 服务端日志里没有任何请求问题多半在 Claude Code 的 MCP 注册配置而不是 Doris。若工具被调用但 Doris 返回权限错误检查readonly_user是否对demo_db有SELECT权限以及是否限制了返回行数。第11章 11.2.6 核心功能集成里强调参数校验和异常封装实际排障时优先看 MCP 服务端有没有把原始错误吞掉。如果所有工具都调用成功说明 Claude Code、TaoToken 通道、Doris MCP 服务端、测试 Doris 四段链路基本畅通可以进入 Token 用量对账。5. 在调用日志里看 Token 消耗确认 Key 与通道都可用5.1 Claude Code 会话里的 /cost 与 MCP 调用轮次Claude Code 会话里可以用/cost查看当前会话的 Token 使用情况。走完上面的工具列表、表结构查询、SQL 生成和结果解释后你会看到输入 Token、输出 Token 以及缓存相关统计。重点不是记住某个绝对数字而是建立对照一次只读表结构查询和一次 SQL 生成分别用了多少 Token工具返回的元数据是不是过长。第11章反复提醒上下文爆栈Doris 表多、字段多时Resources 一次性返回全量表结构就可能把上下文推高。看到 Token 曲线后可以回去把 MCP 工具改成按表名查询、限制返回字段数、必要时分页。如果/cost没有显示先确认 Claude Code 版本和当前会话是否支持该命令也可以在 Claude Code 的日志目录里查看请求记录。这里的目标是形成可复现的观察方式同一把 Key、同一个模型 ID、同一条 Doris MCP 只读查询前后两次对比 Token 消耗。一旦 Dify 或 Cursor 接入你就能判断新增消耗来自模型切换、上下文变长还是 MCP 工具返回了过多数据。5.2 TaoToken 控制台对账三件事Claude Code 侧看到用量后再去 TaoToken 控制台对账。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdoris_mcp_usage 进入控制台查看 API Keys、调用日志和用量统计。第一确认刚才创建的 Key 有调用记录第二确认请求使用的模型 ID 和你填在ANTHROPIC_MODEL里的一致第三确认 Token 消耗时间和 Claude Code 会话时间对得上。如果这里没有记录而 Claude Code 又返回了内容优先检查是否误用了旧环境变量或者 Base URL 被其他配置覆盖。对账时还要看错误日志。有些请求会在重试后成功Claude Code 最终回答看起来正常但控制台里可能留下失败记录。比如模型 ID 写错一次、Doris MCP 工具超时一次都会影响成本。第9章整章讲错误处理与健壮性设计第10章讲测试和性能优化实际落地时控制台里的失败记录就是最好的巡检入口。确认 Key、模型、Token 三项都正常后再继续 Dify 和 Cursor 部分心里会踏实很多。6. 排障Doris MCP 示例里最容易卡住的四类错6.1 401/403Key、空格、Base URL 多了 /v1401 通常表示认证失败。先检查ANTHROPIC_AUTH_TOKEN是否等于刚创建的YOUR_API_KEY有没有前后空格、换行、引号。再检查ANTHROPIC_BASE_URL是否为https://taotoken.net/api末尾不要加/v1也不要加任何 UTM 参数。403 更可能是 Key 没有权限、模型未开通或账号状态异常。此时回到控制台看 Key 状态和模型可用性不要反复改 Doris MCP 服务端代码因为问题不在 MCP 工具层。还有一个常见误配是把官网地址填进ANTHROPIC_BASE_URL。官网地址是给浏览器打开、注册和看用量的不是 API 地址。API 地址只写https://taotoken.net/api。如果你同时用了 CLI 启动检查-u参数是否也是这个地址不要在后面补/v1。6.2 MCP 工具没出现stdio 启动命令与工作目录Claude Code 里看不到doris-mcp多数是 MCP 服务端没启动成功。先在项目根目录手动执行.mcp.json里的command和args看终端是否报错。若提示uv: command not found说明 Claude Code 启动时的 PATH 和你的终端不一致可以用绝对路径或在配置文件里补环境变量。若提示 Python 模块找不到检查工作目录和PYTHONPATH。若 Doris 连接失败MCP 服务端可能启动到一半退出Claude Code 自然发现不了工具。另外stdio模式下不要把日志输出到标准输出否则会干扰 MCP 协议消息。日志应该写入文件或标准错误。书中第7章 7.3.5 常见问题与调试技巧提到调试器实际排障时可以先用 MCP Inspector 或服务端自带调试入口确认工具列表再回到 Claude Code 注册。6.3 Doris 元数据太长导致上下文爆栈Doris MCP 的 Resources 如果一次性返回大量表结构、字段注释、分区信息Token 会迅速上涨。第11章 11.2.3 Resources 原语实现里资源可以按 URI 粒度暴露不一定全部塞进一次对话。建议在提示词里明确要求“只查 demo_db 下指定表”“字段注释只返回前若干条”“样例数据限制 10 行”。如果 Claude Code 已经出现上下文超限先把 MCP 工具改成按需查询再重新跑一次 Token 对账。上下文爆栈不是模型通道问题而是工具返回数据的设计问题。把 Resources 做大而全看似方便实际会让每次对话都背负巨额上下文。企业级 Doris MCP 更应该提供细粒度资源让 Claude Code 按需调用。这样 Token 成本可控工具调用准确率也更高。6.4 模型 ID 不在模型广场导致请求被拒ANTHROPIC_MODEL里填的 ID 必须来自模型广场当时列表。不要从旧文章复制带日期后缀的 ID也不要自己拼一个看似合理的名称。请求被拒时Claude Code 可能只显示“模型不可用”或“请求失败”但 TaoToken 控制台日志里会留下更具体的错误。回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdoris_mcp_intro 查看模型广场复制当前可用 ID再更新配置。模型 ID 正确后如果仍失败检查该 Key 是否绑定了对应模型或套餐。第11章 11.4 之后要接 Dify 和 Cursor不同工具可能用不同模型 ID建议在 Key 命名和模型选择上做好区分。不要一套配置复制到所有工具最后无法判断是哪一段消耗了 Token。7. 继续 Dify、Cursor 集成前把用量口径和权限边界固定下来7.1 Dify Agent Doris MCP 复用已验证的 stdio 服务第11章 11.4.1 讲 Dify Agent Doris MCP 构建企业级 ChatBI。走到这一步时Claude Code 已经验证过 Doris MCP 服务端的工具发现、只读元数据查询和 SQL 生成。Dify 集成时优先复用同一个 MCP 服务端不要为了 Dify 重写一套工具逻辑。Dify 侧的模型供应商配置按 Dify 官方文档操作如果走兼容接口Base URL 填https://taotoken.net/apiKey 用同一把YOUR_API_KEY模型 ID 仍以模型广场为准。复用服务端的好处是权限和日志口径一致。Doris 只读账号还是那个只读账号测试库还是那个测试库MCP 工具返回内容也受同样的行数和字段限制。这样在 TaoToken 控制台看到的 Token 消耗可以大致对应到 Claude Code 和 Dify 两个入口而不是两套完全不同的黑盒。7.2 Cursor 里分开模型配置与 MCP 配置Cursor 集成 Doris MCP 时最容易犯的错是把 Claude Code 的ANTHROPIC_*环境变量直接塞进 Cursor 的 MCP 配置。Cursor 的模型配置和 MCP server 配置是两件事模型配置决定 Cursor 用哪个模型、哪个 Base URLMCP 配置决定 Cursor 启动哪个 Doris MCP 服务端命令。MCP server 的 env 里只放 Doris 连接参数不要把模型 Key 混进去。模型侧如果支持自定义 Base URL同样填https://taotoken.net/api不要带/v1。权限边界也要提前说清楚。Doris MCP 服务端可以连测试库做只读查询生产库的诊断 SQL 由读者在本地 Doris 客户端执行再把结果贴回对话。不要让 Cursor 或 Claude Code 直接连生产库执行INSERT、UPDATE、DELETE或 DDL。第11章 11.3 讲生产部署与监控运维那是服务端部署话题不等于让 AI 工具获得生产写权限。7.3 A2A 协作层先别急MCP 工具层跑通后再考虑 A2A。A2A 解决的是多个智能体之间的能力发现、任务协同和可信通信原文第4章有完整设计策略。企业里常见顺序是先把一个 MCP 服务端做稳再让多个 Agent 通过 A2A 协作。如果 MCP 工具调用还在 401、上下文爆栈、Token 账不清的阶段直接上多智能体协作只会把问题放大。先把这次 Doris MCP 示例的调用日志和用量对清楚再扩到 Dify、Cursor最后才是 A2A 协同。8. 跑完这次 Doris MCP 示例后去对一下这条调用的账8.1 模型对话里复测同一把 Key配置保存并跑通 Doris MCP 工具调用后可以先去 TaoToken 模型对话 用同一把YOUR_API_KEY发一条测试消息确认模型 ID 和 Base URL 没填错。模型对话里看到的响应速度和 Token 消耗可以和 Claude Code 侧/cost、控制台日志做交叉对照。如果模型对话正常、Claude Code 报错问题多半在 Claude Code 的配置或 MCP 注册如果两边都报错再回到 Key 和 Base URL 检查。8.2 长期写代码看 Coding PlanKey 在控制台创建如果只是验证 Doris MCP 示例临时 Key 加测试库就够了如果要长期用 Claude Code 写 MCP 服务端、调试 Dify Agent、接 Cursor可以打开 Coding Plan 看套餐是否够用。新的 Key 在 控制台 API Keys 创建Claude Code 的环境变量和settings.json对照见 Claude Code 接入文档。这次先在 Doris MCP 的只读测试库里把工具调用跑顺把一次查询消耗的 Token 看清楚再决定要不要把 Dify、Cursor 接进同一把 Key 的用量口径里。生产库的 SQL 仍然由你在本地客户端执行MCP 只负责测试环境和元数据侧的可控调用。
返回列表