1. Claude Code SDK 接 Gitlab MCP 时 endpoint 到底该改哪里
Claude Code SDK 是 Anthropic 官方给 Python/Node 开发者的一套编程接口,它把 Claude Code 这个命令行 Agent 的能力封装成可调用的客户端,让你能在自己的脚本、后端服务里驱动它读写文件、执行命令、调用 MCP 工具。Gitlab MCP 则是把 Gitlab 的仓库、Issue、Merge Request 等操作暴露成 MCP 工具,让模型能直接"动手"建仓库、提 MR。把这两者接起来,再统一走 TaoToken 的 API 通道,是很多团队在本地开发环境里管理模型调用入口的常见做法。
适合谁看:需要在本地或内网跑 Claude Code SDK、又想让所有模型请求统一走一个 Key 和 Base URL 的工程师;已经配过 Gitlab 个人令牌但卡在 endpoint 不知道改哪的人;以及被permission_mode和流冲突坑过的同学。
核心检索词先摆出来:Claude Code SDK 配置 Gitlab MCP 服务,关键动作就两个——把ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址,把 MCP server 的url指向你的 Gitlab SSE 端点。前者决定模型请求走哪条通道,后者决定工具调用打到哪个 Gitlab 实例。很多人只改了 MCP 的 url,忘了 Base URL 还是默认的官方地址,结果要么连不上,要么 Key 对不上,报一堆看不懂的错。
我试过在同一个脚本里既跑模型对话又跑 Gitlab 工具调用,最容易出问题的不是配置本身,而是客户端复用导致的流读取冲突。下面按"准备 → 配置 → 验证 → 排障"的顺序,把每一步的可复制片段都给出来,你照着改就能跑通。
先明确整体链路:你的 Python 脚本 → Claude Code SDK(ClaudeSDKClient)→ TaoToken API 通道(https://taotoken.net/api)→ 模型 → 模型决定调用 Gitlab MCP 工具 → SDK 通过 SSE 把工具请求发给 Gitlab MCP server → Gitlab 执行 → 结果回传模型 → 模型输出最终文本。这条链路上有两个 endpoint 要改,别搞混。
2. 前置准备:Gitlab 令牌与 TaoToken Key 怎么拿
2.1 创建 Gitlab 个人访问令牌
Gitlab MCP 要操作你的仓库,必须有一个带权限的令牌。登录你的 Gitlab 实例后,点右上角头像 → Preferences(偏好设置)→ Access Tokens(访问令牌)→ Add new token。名字随便起,比如claude-mcp,过期时间按需选,Scopes 至少勾上api,如果要建仓库、提 MR,api这一个就够覆盖大部分读写操作。生成后那串glpat-开头的字符串只显示一次,立刻复制存好,页面一关就再也看不到。
如果你用的是自建 Gitlab,域名和端口要记清楚,后面拼 SSE 端点时要用。比如你的实例是http://192.168.1.50:8080,那 API 根路径就是http://192.168.1.50:8080/api/v4。官方 gitlab.com 则是https://gitlab.com/api/v4。
2.2 获取 TaoToken API Key
TaoToken 这边你需要一个统一的 Key 来驱动模型请求。打开控制台,在 API Keys 页面创建一个新 Key,复制保存。这个 Key 会填到环境变量ANTHROPIC_API_KEY里。同时 Base URL 用https://taotoken.net/api,注意这里不加任何 UTM 参数,就是干净的 API 根地址。
注意:TaoToken 的 Key 和 Gitlab 的令牌是两套东西,前者管模型调用,后者管 Gitlab 操作,别互相填错位置。这是新手最常见的混淆点。
2.3 确认 MCP server 的 SSE 端点
Gitlab MCP server 通常以 SSE 方式暴露,形如https://你的域名/api/v4/...或者第三方托管平台生成的 SSE 地址。如果你用的是托管平台,直接在 MCP 广场搜 gitlab,把令牌粘进去,它会生成一段 SSE 配置信息,里面就有完整的url。自建的话,把域名换成你自己的http://ip:端口/api/v4即可。
拿到这个 url 后先别急着写代码,用浏览器或 curl 探一下能不能通,避免后面把网络问题误判成配置问题。
3. 可复制配置:settings 与 endpoint 片段
3.1 环境变量与 Base URL
最直接的方式是在脚本开头设置环境变量。Claude Code SDK 会读取ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL这两个变量来决定请求发往哪里。
import os os.environ["ANTHROPIC_API_KEY"] = "你的 TaoToken API Key" os.environ["ANTHROPIC_BASE_URL"] = "https://taotoken.net/api"如果你更喜欢用配置文件管理,可以在项目根目录建一个.env,然后用python-dotenv加载:
# .env ANTHROPIC_API_KEY=你的TaoTokenKey ANTHROPIC_BASE_URL=https://taotoken.net/apifrom dotenv import load_dotenv load_dotenv()这样 Key 不会硬编码进代码,提交到仓库也安全。团队协作时每个人用自己的.env,互不干扰。
3.2 MCP server 配置片段
MCP server 的配置写在ClaudeCodeOptions的mcp_servers参数里,是一个字典。key 是服务名,你可以自定义,后面在 prompt 里引用这个名字来指定用哪个工具。
mcp_servers = { "mcp-gitlab-server": { "type": "sse", "url": "https://你的gitlab域名/api/v4/你的sse路径" } }自建 Gitlab 就把 url 换成http://ip:端口/api/v4/...。这里的type必须是sse,因为 Gitlab MCP 走的是 Server-Sent Events 协议。
3.3 完整的 ClaudeCodeOptions 配置
把权限模式和 MCP 配置一起塞进 options:
from claude_code_sdk import ClaudeCodeOptions options = ClaudeCodeOptions( cwd=".", permission_mode="bypassPermissions", mcp_servers=mcp_servers )permission_mode="bypassPermissions"这一行非常关键。Claude Code 默认有权限确认机制,遇到创建文件夹、执行命令这类操作会弹确认。在 SDK 里没有交互终端,如果不绕过权限,工具调用会卡住或直接失败。文档里把权限模式分成 Default、AcceptEdits、Plan、BypassPermissions 四种,SDK 场景下基本都用 BypassPermissions。
注意:
bypassPermissions意味着模型可以不经确认执行操作,务必在受控环境里用,别对着生产仓库跑。
3.4 如果你用 CC Switch 或 Cline MCP 管理配置
有些同学用 CC Switch 切换不同的 Claude Code 配置,或者用 Cline 的 MCP 面板管理服务。无论哪种,三件套都要写全:Base URL 填https://taotoken.net/api,Key 填 TaoToken 的 Key,Model ID 填你实际要用的模型标识。三者缺一,请求就会 401 或找不到模型。Cline 的 MCP 配置里,Gitlab server 的 url 同样指向你的 SSE 端点,和上面 Python 里的写法一一对应。
4. 验证请求:跑一次 Gitlab MCP 工具调用
4.1 完整可运行脚本
下面这段是精简后的验证脚本,去掉了原版里冗长的消息分类打印,保留核心链路,方便你先跑通再扩展。
import asyncio import os from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions from claude_code_sdk.types import AssistantMessage, TextBlock, ToolUseBlock, ResultMessage os.environ["ANTHROPIC_API_KEY"] = "你的TaoTokenKey" os.environ["ANTHROPIC_BASE_URL"] = "https://taotoken.net/api" async def chat(): client = None try: mcp_servers = { "mcp-gitlab-server": { "type": "sse", "url": "https://你的gitlab域名/api/v4/你的sse路径" } } options = ClaudeCodeOptions( cwd=".", permission_mode="bypassPermissions", mcp_servers=mcp_servers ) client = ClaudeSDKClient(options=options) await client.connect() prompt = "使用mcp-gitlab-server这个mcp工具帮我在gitlab仓库中创建一个名为camel_test的项目" await client.query(prompt, session_id="123456") async for message in client.receive_messages(): if isinstance(message, AssistantMessage): for block in message.content: if isinstance(block, TextBlock): print("文本:", block.text.strip()) elif isinstance(block, ToolUseBlock): print("调用工具:", block.name, block.input) elif isinstance(message, ResultMessage): print("本轮结束, tokens:", message.usage) break finally: if client: try: await client.disconnect() except Exception: pass if __name__ == "__main__": asyncio.run(chat())4.2 预期成功结果
跑起来后,你会看到类似这样的输出:先打印"调用工具: create_project"或类似的工具名,参数里带着camel_test;然后模型返回一段文本,告诉你项目已创建。去 Gitlab 网页刷新,能看到新仓库出现在你的项目列表里。同时ResultMessage会打印出 input/output tokens,说明请求确实经过了 TaoToken 通道并正常计费返回。
如果工具调用成功但模型文本说"无法创建",多半是 Gitlab 令牌权限不够,去检查 Scopes 有没有勾api。
4.3 用模型对话快速验证通道
在正式跑 Gitlab 工具前,建议先用一个纯文本 prompt 验证 TaoToken 通道是否通。把 prompt 换成"你好,回复一句话",如果几秒内返回文本,说明 Base URL 和 Key 没问题,问题就缩小到 MCP 配置上了。这一步能帮你快速定位是模型通道的问题还是工具通道的问题。
5. 常见报错排查:401、local proxy failed、流冲突
5.1 401 Unauthorized
最常见。原因通常是ANTHROPIC_API_KEY填的不是 TaoToken 的 Key,或者 Key 复制时带了空格。检查.env或环境变量,确认 Key 完整。另一种情况是 Base URL 写成了带 UTM 的地址,虽然一般不影响鉴权,但建议统一用https://taotoken.net/api。如果 Key 没问题还报 401,去控制台看这个 Key 是否被禁用或额度耗尽。
5.2 local proxy failed / 连接失败
这个报错说明 SDK 连不上 Base URL。先确认网络能访问https://taotoken.net/api,用 curl 探一下:
curl -I https://taotoken.net/api如果返回 4xx 说明通了,只是鉴权问题;如果超时,检查本地网络或防火墙。注意别把 Base URL 写成https://taotoken.net/api/带尾斜杠,有些客户端拼接路径时会出问题。
5.3 reading choices / 流读取冲突
报错信息里出现another coroutine is already waiting或reading choices,基本是客户端复用导致的。ClaudeSDKClient 的流是单消费者模型,一个 client 同时被两个协程读就会冲突。解决办法很简单:每次请求都新建一个 client,用完就 disconnect,别跨请求复用。上面的脚本就是每次chat()都ClaudeSDKClient(options=options)新建,跑完在 finally 里关掉。
5.4 OAuth / 认证相关报错
如果看到 OAuth 字样,说明 SDK 尝试走 OAuth 流程而不是 API Key。确认你设置的是ANTHROPIC_API_KEY而不是其他认证变量,并且没有残留的 OAuth 配置文件干扰。清掉本地缓存的认证信息,重新用 Key 方式启动。
5.5 MCP 工具调用无响应
模型说要调用工具,但一直没结果。检查 MCP server 的 url 是否可达,SSE 端点是否要求特定 header。有些自建 Gitlab 的 SSE 路径和 API 路径不一样,别想当然拼。另外permission_mode如果不是bypassPermissions,工具调用会卡在权限确认,表现为无响应。
6. 统一入口后的日常使用建议
把 endpoint 统一到 TaoToken 之后,你本地所有 Claude Code SDK 脚本、Cline、CC Switch 都指向同一个 Base URL 和 Key,换模型、查用量、控成本都在一个控制台完成,不用每个工具单独配一遍。Gitlab MCP 的令牌则按项目或按人分配,权限最小化。
长期跑编码 Agent 或需要稳定额度的场景,可以看下 Coding Plan,适合持续性的开发任务。日常验证模型是否正常,用模型对话页面发一句话最快。接入过程中卡在配置,直接翻接入文档对照参数。Key 管理在 API Keys 页面。
最后给个实用技巧:把 Gitlab MCP 的 url 和 TaoToken 的 Base URL 都写进.env,代码里只读变量,这样换环境时改一个文件就行,不用翻代码。跑通一次后,把验证脚本存成verify_mcp.py,以后每次改配置先跑它,比直接上业务脚本省事得多。