ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AI编程工具跑 MCP 自定义技能:Key 用 TaoToken

AI编程工具跑 MCP 自定义技能:Key 用 TaoToken 上个月我在 Claude Code 里写了一个数据库查询工具写完觉得它不该只在 Claude 里能用Cursor、TRAE 甚至我自己的 Python 脚本都应该能调。绕一圈发现MCP 协议把工具层统一了模型 Key 却依旧各配一把Claude Code 要 Anthropic 的Cursor 默认走自己的 Provider两边还要分别看用量。我最后用 TaoToken 把模型请求统一收拢先去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 Key再把各客户端模型 Provider 的 Base URL 填成 https://taotoken.net/api钥匙链一下清爽了。下面的步骤基本照着我当时的折腾路线走先用 FastMCP 写 server.py再用 mcp dev 调试最后分别配 claude_desktop_config.json 和 ~/.cursor/mcp.json 接进 Claude Code 和 Cursor。和原文不同的是我把“客户端 AI 工具的模型请求”也统一改了MCP Server 注册的自定义技能照常走 STDIO 协议模型请求则统一走 TaoToken 兼容通道。这样每次 AI 调用 add、get_weather 或 read_project_file 时底层模型调用的计费都落在一把 Key 上不用每个工具单独申请官方 Key。1. MCP 解决“写一套工具处处用”TaoToken 解决“一把 Key 处处配”1.1 在 MCP 之前每个人都在给 AI 写胶水代码MCP 出现以前Cursor 的个性化靠 .cursorrulesClaude 的记忆靠 Project KnowledgeVSCode Copilot 靠 extension API。假如我想让三个工具都能“查公司内部 API 文档”按老办法得写三套互不兼容的插件。MCP 把它们统一成一种协议你写一个 Server暴露 Tools、Resources、Prompts客户端通过 JSON-RPC 2.0 通信。这就像把各种私有充电口统一成了 USB-CAI 客户端是设备你的自定义技能是配件协议一致之后配件在哪台设备上都能插。1.2 工具层统一了钥匙链却更乱了MCP 的确让“一个工具处处用”变成现实但注意它统一的是工具调用不是模型请求。Claude Code 的模型请求默认走 Anthropic 官方接口Cursor 走自己的模型 Provider 体系如果你同时用 TRAE那又是第三套配置。MCP 把工具代码收敛了钥匙链却没有收敛。我在接入时多走了一步把客户端里 AI 模型的请求统一改为走 TaoToken。它提供的是一个统一的 API 兼容通道各工具的 Base URL 指向同一个地址Key 也统一用同一把模型请求集中计费不用再为每个工具分别申请、分别看用量。2. 环境准备与第一个 MCP Serverserver.py 三十行跑通2.1 环境Python 3.10 加 mcp[cli]先建目录和虚拟环境mkdir my-mcp-server cd my-mcp-server python -m venv .venv source .venv/bin/activate pip install mcp[cli]mcp[cli] 装的是 MCP Python SDK 加命令行工具Claude Code 和 Cursor 的接入不需要再装额外依赖。装完确认版本python -c import mcp; print(mcp.__version__)正常会看到 1.x.x。另外准备材料这里补一步打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并创建一个 API Key后面所有客户端的模型 Key 都填这一把。2.2 server.py用 FastMCP 注册 add 和 get_weather新建 server.pyfrom mcp.server.fastmcp import FastMCP mcp FastMCP(FirstMCPServer) mcp.tool() def add(a: int, b: int) - int: 对两个整数做加法返回求和结果。 return a b mcp.tool() def get_weather(city: str) - str: 返回指定城市的模拟天气数据。 return f{city} 今日多云转晴气温 22℃湿度 45% if __name__ __main__: mcp.run(transportstdio)FastMCP 的装饰器风格和 Flask 有几分神似mcp.tool() 注册的就是可被 AI 调用的工具。函数签名里类型注解和 docstring 会自动变成工具 Schema所以描述写得越清楚AI 调用越准。运行python server.py终端没输出这很正常。STDIO 模式下 Server 通过标准输入输出和客户端通信没有请求时就是静默等待。按 CtrlC 退出。2.3 用 mcp dev 调试先别急着接客户端想确认 Server 是否真的工作用 MCP CLI 自带的调试界面mcp dev server.py默认启动一个 Web 调试面板地址是 http://localhost:5173。浏览器打开能看到 add 和 get_weather 两个 Tool 已经暴露可以直接在页面上试调用入参和返回值都可视化。这一步比手动构造 JSON-RPC 请求快得多我把调试放在接客户端之前。3. 实用升级让 AI 自己读项目文件3.1 read_project_file 和 list_directory加法和天气只是验证协议。真正有用的工具是让 AI 读你当前项目里的代码。把 server.py 改成这样import os from mcp.server.fastmcp import FastMCP mcp FastMCP(ProjectFileReader) mcp.tool() def read_project_file(filepath: str) - str: 读取指定文件内容供 AI 分析源码或文档。 if not os.path.exists(filepath): return f文件不存在: {filepath} if os.path.isdir(filepath): return f目标是目录不是文件: {filepath} try: with open(filepath, r, encodingutf-8) as f: return f.read() except Exception as e: return f读取失败: {str(e)} mcp.tool() def list_directory(dirpath: str .) - str: 列出指定目录下的文件和文件夹返回各项的名称与类型。 if not os.path.exists(dirpath): return f目录不存在: {dirpath} lines [] for item in os.listdir(dirpath): full os.path.join(dirpath, item) kind 目录 if os.path.isdir(full) else 文件 lines.append(f[{kind}] {item}) return \n.join(lines) if lines else 目录为空 if __name__ __main__: mcp.run(transportstdio)3.2 AI 自己调工具不用复制粘贴这个 Server 跑起来之后AI 就能直接读你项目里的代码文件了。你只需要说一句“读取当前目录下所有 Python 文件”Claude Code 会自己先调 list_directory 找到文件名再调 read_project_file 拿内容全程不需要你手动把代码贴进对话框。这正对应 MCP 的设计理念让 AI 学会用你的工具而不是你为 AI 写胶水代码。4. 接入 Claude Code 和 CursorMCP 配置照抄模型入口换成 TaoToken4.1 先拿 Key再分清楚两个地址在配置任何客户端之前先去 TaoToken 注册并创建 API Key。有两个地址必须分清楚网页落地页 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 用于注册、创建 Key、查看模型广场和用量真正填进工具的是接口 Base URLhttps://taotoken.net/api末尾不要加 /v1也不要带任何 UTM 参数。模型 ID 怎么填以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的模型广场上列出的为准。我自己的教训是先到模型广场确认 ID再填配置文件不要凭印象写一个名字。4.2 Claude CodemcpServers 注册技能env 换模型入口Claude 桌面版读 ~/Library/Application Support/Claude/claude_desktop_config.jsonClaude Code CLI 读 ~/.claude/settings.json两个文件结构一致。以 CLI 版为例{ mcpServers: { my-file-reader: { command: /绝对路径/my-mcp-server/.venv/bin/python, args: [/绝对路径/my-mcp-server/server.py] } }, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: 以模型广场为准的模型ID } }mcpServers 负责把 my-file-reader 这个文件读取技能注册进 Claude Codeenv 里三个环境变量负责让 Claude Code 的模型请求走 TaoToken 通道。ANTHROPIC_BASE_URL 填的是 https://taotoken.net/api不是官网落地页ANTHROPIC_AUTH_TOKEN 填你从前面官网创建的那把 Key。重启 Claude Code输入 /mcp 能看到 my-file-reader 已连接。直接说“读取当前目录下所有 Python 文件”Claude 会调用 list_directory 和 read_project_file 完成操作。这时候再看模型请求已经经由 TaoToken 统一计费。4.3 Cursormcp.json 注册技能模型 Provider 指向 TaoTokenCursor 可以直接编辑 ~/.cursor/mcp.json{ mcpServers: { my-file-reader: { command: /绝对路径/my-mcp-server/.venv/bin/python, args: [/绝对路径/my-mcp-server/server.py] } } }然后在 Cursor 的 Settings → Models 里把模型 Provider 的 Base URL 指到 TaoToken在 OpenAI API Key 区域配置刚创建的 Key并打开 Override Base URL 填写 https://taotoken.net/api。这样 Cursor 的模型请求统一走 TaoTokenmcp.json 只负责技能注册两者互不干扰。配置完成后在 Cursor 的 Composer 里对 AI 说“帮我重构这个文件先读一下 server.py”它会自动通过 MCP 读取文件内容再基于 TaoToken 通道上的模型给出重构建议全程零手动复制。5. STDIO 与 HTTP本机用 STDIO团队共享切 HTTP5.1 两种通信方式怎么选MCP 支持 STDIO 和 HTTP 两种通信模式。STDIO 下 Server 是客户端的一个子进程通过标准输入输出通信零网络配置只能本机访问适合个人开发。HTTP 模式Streamable HTTP下 Server 作为一个 Web 服务运行客户端通过 HTTP 连接可以远程访问、多客户端共享适合团队统一部署。这里要特别说一句MCP Server 走 STDIO 还是 HTTP影响的是工具调用链路而模型请求走不走 TaoToken由客户端的 Provider 配置决定两者是独立的。你完全可以在本机用 STDIO 跑 Server同时让每个客户端的模型请求都走 TaoToken。5.2 切到 HTTP 只改一行把 server.py 末尾改成if __name__ __main__: mcp.run(transportstreamable-http, port8000)客户端配置里把 command 和 args 换成 url{ mcpServers: { my-file-reader: { url: http://your-server:8000/mcp } } }HTTP 模式部署到公网时前面一定要加认证不要让裸的 MCP Server 暴露在公网上。生产环境建议放在内网或者用带鉴权的反向代理。6. 调试避坑与进阶print 污染、绝对路径与知识库搜索6.1 print 会毁掉 STDIO 通道STDIO 模式下标准输出是留给 JSON-RPC 协议消息的。你写的 print() 会把输出打到标准输出上客户端拿到后当作协议消息解析立刻报“协议解析错误”。想打日志明确写到标准错误流import sys print(add 被调用了, filesys.stderr)6.2 绝对路径、虚拟环境和热更新客户端配置里的路径一定要写绝对路径。相对路径在不同工作目录下表现不一致Claude Code 可能找不到你的 server.py。如果 Server 跑在虚拟环境里command 要指向虚拟环境里的 python{ command: /绝对路径/my-mcp-server/.venv/bin/python, args: [/绝对路径/my-mcp-server/server.py] }改完 server.py 记得重启客户端。Claude Code 里输入 /restartCursor 需要重启进程否则客户端还拿着旧的工具列表。另外注册 Tool 时要克制exec_shell_command、delete_file_recursive 这类危险操作不要注册到生产环境的 MCP Server 上。STDIO 模式只对本机可见问题不大但 HTTP 部署到公网时必须加认证而且最小化暴露的工具集合。6.3 接入 TaoToken 后报 401 或 404 怎么查模型请求报 401先检查 KeyANTHROPIC_AUTH_TOKEN 或 Cursor 里填的是不是完整的 YOUR_API_KEY复制的时候有没有带上空格或换行。报 404大概率是 Base URL 填错了。正确的接口地址只有 https://taotoken.net/api末尾不要加 /v1也不要把官网落地页 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 当成接口地址填进去。官网落地页是注册、创建 Key、看模型广场和用量记录的地方和接口地址不是一回事。6.4 进阶搭一个知识库搜索 Server把文件读取工具稍作扩展就能变成一个团队知识库 MCP Server。原理是扫描指定目录下的 Markdown 文件构建一个简单的倒排索引让 AI 能按关键词搜索文档import os import re from collections import defaultdict from mcp.server.fastmcp import FastMCP mcp FastMCP(TeamKnowledgeBase) KB_DIR /path/to/your/knowledge-base def build_index(): index defaultdict(list) for root, _, files in os.walk(KB_DIR): for name in files: if name.endswith(.md): path os.path.join(root, name) with open(path, r, encodingutf-8) as fh: words set(re.findall(r\w, fh.read().lower())) for w in words: index[w].append(path) return index index build_index() mcp.tool() def search_knowledge(query: str) - str: 在知识库中检索关键词返回匹配文档列表和第一行摘要。 query_words re.findall(r\w, query.lower()) if not query_words: return 请输入搜索关键词 hits set() for w in query_words: hits.update(index.get(w, [])) if not hits: return f未找到包含「{query}」的文档 results [] for path in sorted(hits)[:5]: with open(path, r, encodingutf-8) as f: first_line f.readline().strip() results.append(f{path} - {first_line}) return \n.join(results) if __name__ __main__: mcp.run(transportstdio)当团队共享这个 Server 时每个人在自己的 Claude Code 或 Cursor 里把模型 Provider 指向 TaoToken各自用自己的 Key。工具注册统一走 MCP模型计费统一落在 TaoToken管理成本远低于每人分别申请官方 Key。7. 从这 30 行 Server 开始让 AI 读懂你的项目MCP 把“让 AI 学会用你的工具”这件事标准化了写一次 ServerClaude Code、Cursor、TRAE 都能用。但工具层统一不解决模型 Key 的分散问题。我在跑通原文那套 FastMCP 流程后把模型入口也收拢了TaoToken 提供统一的兼容通道Base URL 指向 https://taotoken.net/apiKey 统一用一把每次模型请求的计费落在一个地方。从今天这个 30 行的文件读取 Server 开始先让它跑起来再往里面加 mcp.tool() 装饰的函数。下一步很直接打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册、创建你的 API Key按第 4 章的配置把 Claude Code 或 Cursor 的 Base URL 填好然后对 AI 说一句“读取当前目录下所有 Python 文件”。完成这次调用后回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 看用量记录你会发现模型请求真的统一记在那把 Key 名下了。
返回列表