ARTICLE DETAIL

资讯详情

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

如何开发一个MCP Server:用TaoToken统一Key打通Python/TypeScript/Java三语言工具链

如何开发一个MCP Server:用TaoToken统一Key打通Python/TypeScript/Java三语言工具链 1. 多语言 MCP Server 的鉴权痛点为什么每个语言都要重写一遍 KeyMCP Server 说白了就是给大模型装一个外挂工具箱模型通过标准协议调用你写的工具函数。Python 写一个计算器、TypeScript 写一个天气查询、Java 写一个内部系统对接三种语言各写一个 Server 本身不难难的是每个 Server 都要自己去处理模型 API 的鉴权、Base URL、超时重试这些和业务无关的事。我试过最原始的做法Python 里读环境变量OPENAI_API_KEYTypeScript 里读process.env.ANTHROPIC_API_KEYJava 里塞进application.yml。结果就是三套配置、三个 Key、三处轮换一旦某个 Key 额度用完或者要换供应商三个项目都得改一遍重新打包。更麻烦的是本地调试时每个语言都要单独配一遍环境变量新人接手光配环境就得半天。这篇要解决的就是这个问题用 TaoToken 的统一 Key 和统一 API 通道让 Python、TypeScript、Java/Spring AI 三种 MCP Server 共用同一套鉴权配置。你只需要在 TaoToken 控制台拿一个 Key三个语言的项目都指向同一个 Base URL配置骨架我会给出可直接复制的settings.json、config.toml示例最后用一个工具调用动作验证 Key 是否生效、请求链路是否正常。适合谁看已经在写 MCP Server、但被多语言鉴权配置搞烦的开发者想用 Spring AI 写 MCP Server 但不确定怎么接统一通道的 Java 同学以及需要在 Cline、Claude Code 这类客户端里同时挂载多个语言 Server 的人。2. TaoToken 前置准备一个 Key 打通三语言TaoToken 在这里扮演的角色是统一入口——它提供一个兼容主流模型协议的 API 通道你的 MCP Server 不管用什么语言写只要把请求发到同一个 Base URL、带上同一个 Key就能调用背后的模型能力。对 MCP Server 来说这意味着鉴权逻辑可以抽成一份配置三个语言共享。先去官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号然后进控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 创建后只显示一次记得复制保存。API 通道地址统一用 https://taotoken.net/api 注意这个地址后面不加任何 UTM 参数直接作为 Base URL 填进各语言的配置里。模型名称按你实际要用的填比如claude-sonnet-4-5或gpt-4o这类具体可用列表在模型对话页面能看到https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。注意Key 不要硬编码进代码提交到 Git。三个语言统一用环境变量TAOTOKEN_API_KEY读取本地开发用.env或 shell export生产环境用密钥管理服务注入。如果你后面要长期跑编码类 Agent可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用的场景。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到协议细节可以对照查。3. 三语言可复制配置骨架3.1 Python MCP Server 接入配置Python 这边用官方mcpSDK先建项目uv init mcp-server-demo-python cd mcp-server-demo-python uv add mcp[cli] openai python-dotenv新建config.toml把 TaoToken 通道和 Key 的读取方式集中管理[taotoken] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY default_model claude-sonnet-4-5 timeout 60 max_retries 2server.py里读取配置并初始化客户端工具函数只关心业务逻辑import os import tomllib from mcp.server.fastmcp import FastMCP from openai import OpenAI with open(config.toml, rb) as f: cfg tomllib.load(f)[taotoken] client OpenAI( base_urlcfg[base_url], api_keyos.environ[cfg[api_key_env]], timeoutcfg[timeout], max_retriescfg[max_retries], ) mcp FastMCP(taotoken-demo-python) mcp.tool() def ask_model(prompt: str) - str: 把问题转发给统一通道的模型 resp client.chat.completions.create( modelcfg[default_model], messages[{role: user, content: prompt}], ) return resp.choices[0].message.content if __name__ __main__: mcp.run()本地调试用mcp dev server.py会起一个 Inspector 页面能看到工具列表并手动触发。3.2 TypeScript MCP Server 接入配置TypeScript 用官方modelcontextprotocol/sdk初始化mkdir mcp-server-demo-ts cd mcp-server-demo-ts npm init -y npm install modelcontextprotocol/sdk openai dotenv npm install -D types/node typescript mkdir src touch src/index.tssettings.json放统一配置和 Python 的config.toml字段对齐{ taotoken: { baseUrl: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY, defaultModel: claude-sonnet-4-5, timeoutMs: 60000 } }src/index.ts读取配置并注册工具import { McpServer } from modelcontextprotocol/sdk/server/mcp.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import OpenAI from openai; import { z } from zod; import settings from ../settings.json assert { type: json }; const client new OpenAI({ baseURL: settings.taotoken.baseUrl, apiKey: process.env[settings.taotoken.apiKeyEnv], timeout: settings.taotoken.timeoutMs, }); const server new McpServer({ name: taotoken-demo-ts, version: 1.0.0 }); server.tool( ask_model, 把问题转发给统一通道的模型, { prompt: z.string().describe(要问模型的问题) }, async ({ prompt }) { const resp await client.chat.completions.create({ model: settings.taotoken.defaultModel, messages: [{ role: user, content: prompt }], }); return { content: [{ type: text, text: resp.choices[0].message.content ?? }] }; } ); const transport new StdioServerTransport(); await server.connect(transport);编译用npx tsc产物在build/index.js。3.3 Java / Spring AI MCP Server 接入配置Spring AI 这边要求 JDK 17 以上用 Spring Boot 3.x。application.yml里配置统一通道spring: ai: openai: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} chat: options: model: claude-sonnet-4-5 temperature: 0.7 main: web-application-type: none mcp: server: stdio: true工具类用Tool注解暴露给 MCPComponent public class AskModelTool { private final ChatClient chatClient; public AskModelTool(ChatClient.Builder builder) { this.chatClient builder.build(); } Tool(description 把问题转发给统一通道的模型) public String askModel(ToolParam(description 要问模型的问题) String prompt) { return chatClient.prompt().user(prompt).call().content(); } }打包mvn clean package -DskipTests产物是target/*.jar。4. 验证请求一次工具调用确认 Key 生效三个语言都写好后用同一个动作验证让客户端调用ask_model工具问一句用一句话说明 MCP 是什么。如果 Key 和通道配置正确模型会返回内容如果 Key 无效会直接报 401。以 Cline 为例settings.json里挂载三个 Server{ mcpServers: { demo-python: { command: uv, args: [--directory, /path/to/mcp-server-demo-python, run, server.py], env: { TAOTOKEN_API_KEY: 你的Key } }, demo-ts: { command: node, args: [/path/to/mcp-server-demo-ts/build/index.js], env: { TAOTOKEN_API_KEY: 你的Key } }, demo-java: { command: java, args: [-Dspring.ai.mcp.server.stdiotrue, -Dspring.main.web-application-typenone, -jar, /path/to/target/demo.jar], env: { TAOTOKEN_API_KEY: 你的Key } } } }重启客户端后工具列表里应该能看到三个 Server 各自的ask_model。手动触发任意一个观察返回内容。三个都返回正常说明统一 Key 在三种语言下都生效了。提示如果某个 Server 连不上先单独在终端跑一遍它的启动命令看 stderr 输出。MCP Server 的日志走 stderr客户端界面不一定显示完整。5. 本篇常见错排查Python 侧uv依赖装不上或 Inspector 连不上先确认uv.lock和.venv/lib下有mcp包。如果 Inspector 页面工具列表为空多半是server.py启动就报错了直接在终端uv run server.py看报错。config.toml路径用相对路径时注意工作目录是项目根。TypeScript 侧assert { type: json }报语法错Node 版本低于 20 或者tsconfig.json的module不是Node16会出问题。把module和moduleResolution都设成Node16target设ES2022。如果还是不行改用fs.readFileSync手动解析 JSON。Java 侧启动即退出检查spring.main.web-application-typenone是否生效MCP stdio 模式不需要 Web 容器。另外logging.pattern.console要留空否则日志会污染 stdio 通道导致协议解析失败。三个语言都报 401Key 没读到。确认环境变量名和配置里写的一致Cline 的env字段是传给子进程的不是全局环境变量。Key 前后不要有空格复制时容易带上换行。请求超时TaoToken 通道默认超时 60 秒如果模型响应慢可以调大。Python 改config.toml的timeoutTypeScript 改settings.json的timeoutMsJava 在application.yml里加spring.ai.openai.chat.options.timeout。模型名写错不同模型名对应不同后端写错会报 404 或 model not found。去模型对话页面确认可用名称别凭记忆填。6. 统一 Key 之后多语言 MCP 的维护成本降在哪三个语言共用一份 Key 和 Base URL 之后最直接的变化是轮换 Key 时只改一处环境变量三个 Server 重启即可不用重新打包。其次是本地调试时新人只需要配一个TAOTOKEN_API_KEY不用分别去 Python、Node、Java 三套环境里找配置项。如果你还在用 Cline 或 Claude Code 挂载多个 MCP Server建议把三个语言的配置骨架抽成一个共享的taotoken-config仓库各语言项目通过 submodule 或复制的方式引用字段命名保持一致。这样以后加第四个语言比如 Go 或 Rust照抄配置结构就行。长期跑编码类 Agent 的话Coding Plan 的额度模型比按次调用更划算接入方式还是同一个 Base URL只是 Key 类型不同。API Keys 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入细节对照文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。Claude Code 相关的接入说明在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentClaudeCodeAnthropicutm_campaignrewrite 需要的话可以看看。最后留一个我踩过的坑MCP Server 的 stdio 通道对日志非常敏感任何往 stdout 打印的内容都会被当成协议消息。三个语言都要确保业务日志走 stderrJava 的logging.pattern.console留空、Python 用logging.basicConfig(streamsys.stderr)、TypeScript 用console.error而不是console.log。这一点不注意工具能连上但调用会随机失败排查起来很费时间。
返回列表