news 2026/6/23 8:24:47

Cline 远程 MCP 鉴权:踩坑与最佳实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cline 远程 MCP 鉴权:踩坑与最佳实践

最近在折腾 MCP Server,遇到个特别抓狂的问题。

本地开发一切顺利,GitHub Token 塞进.env环境变量里就完事了,Cline (VS Code 插件) 跑得飞起。但当我把 Server 部署到服务器上,想让团队里每个人用自己的 GitHub Token去跑任务时,傻眼了…

Cline 的配置里好像没地方填“动态参数”?难道要每个人都去改 Server 的环境变量?这也太不安全了。

折腾了一晚上,终于摸索出了一套基于 HTTP Header 和 ContextVars 的透传方案


痛点:如何把 Token 传过去?

我们面临的死局是:

  1. MCP 协议:主要是 JSON-RPC,标准里好像没规定怎么传鉴权 Token。
  2. Cline 客户端:配置项少得可怜,只有command(本地) 和url(远程)。

但我转念一想,MCP 的 SSE 模式本质上就是 HTTP 长连接。既然是 HTTP,Header 总能用吧?

验证时刻:Cline 真的发 Header 吗?

虽然 Cline 文档里没明说支持自定义 Header,写了个简单的“抓包脚本”来验证。

Header Sniffer 脚本 (src/header_sniffer.py)

fromaiohttpimportwebasyncdefhandle_all(request):print("\n[Request Received]")print("--- Headers ---")forname,valueinrequest.headers.items():print(f"{name}:{value}")print("---------------")# 返回一个假的 SSE 响应防止客户端报错returnweb.Response(text="OK")if__name__=="__main__":app=web.Application()app.router.add_route('*','/{tail:.*}',handle_all)print("Sniffer running on port 13334...")web.run_app(app,port=13334)

验证过程

  1. 启动这个脚本:python src/header_sniffer.py
  2. 在 Cline 的配置里填入:
    "url":"http://127.0.0.1:13334/sse","headers":{"X-Github-Token":"test-token-123"}
  3. 点击连接。

结果:终端里清晰地跳出了:
X-Github-Token: test-token-123

激动了!Cline 的底层实现是完整的,它默默支持着 Header 发送。这就好办了,路通了。


Server 端接招:从 FastMCP 到 FastAPI

路通了,但 Server 端怎么收呢?

我用的是fastmcp库,它封装得太好了,以至于我找不到地方插 Middleware 去拦截 Header。翻了半天源码,发现FastMCP类其实是一个独立的 Server,不开放底层接口。

破局思路:既然改不了它,就包装它。

FastMCP虽然高冷,但它提供了一个sse_app()方法,返回的是一个标准的 ASGI 应用。这就意味着,我可以用FastAPI做外壳,负责处理 HTTP Header 和鉴权,然后把“脏活累活”甩给 FastMCP 去干。

核心代码实现

直接上干货。我们需要用到 Python 的contextvars,这玩意儿是处理并发请求的神器,比 ThreadLocal 更好用。

fromcontextvarsimportContextVarfromfastapiimportFastAPI,RequestfromfastmcpimportFastMCPimportuvicorn# 1. 定义一个“隐形口袋” (ContextVar)# 用来在请求处理过程中临时存放 Token,请求结束自动销毁,并发安全。user_token_ctx=ContextVar("user_token",default=None)# 2. 定义 FastAPI 外壳app=FastAPI()# 3. 编写中间件:拦截 Token 并装进口袋@app.middleware("http")asyncdeftoken_passthrough_middleware(request:Request,call_next):# 只拦截 MCP 相关的 SSE 请求ifrequest.url.path.startswith("/sse")orrequest.url.path.startswith("/messages"):# 拿到用户传来的 Tokentoken=request.headers.get("X-Github-Token")iftoken:user_token_ctx.set(token)print(f"收到来自{request.client.host}的 Token,已暂存。")response=awaitcall_next(request)returnresponse# 4. FastMCP 核心逻辑mcp=FastMCP("MyServer")@mcp.tool()asyncdeflist_repos():# 5. 在工具里从口袋掏出 Tokentoken=user_token_ctx.get()iftoken:print("Using Client-Provided Token!")# 这里就可以用用户的 Token 去调 GitHub API 了client=GitHubClient(token=token)else:print("Fallback to Server Token...")client=GitHubClient(token=os.getenv("GITHUB_TOKEN"))returnclient.get_repos()# 6. 关键一步:把 FastMCP 挂载上去mcp_app=mcp.sse_app()app.mount("/",mcp_app)if__name__=="__main__":# 启动的是 FastAPI,而不是 mcp.run()uvicorn.run(app,host="0.0.0.0",port=13333)

客户端配置 (Cline)

Server 端改好后,Cline 这边的配置就非常简单直观了:

{"mcpServers":{"my-remote-server":{"url":"http://192.168.1.100:13333/sse","transport":"sse","headers":{"X-Github-Token":"ghp_这就是每个用户自己的Token"},"autoApprove":[]}}}

总结一下

这个方案最爽的地方在于无感隔离

  1. 隔离性:利用ContextVar,即使用户 A 和用户 B 同时发请求,他们的 Token 也绝不会串台。
  2. 兼容性:代码里我做了回退处理,本地开发没 Header 时依然可以用.env里的 Token,不影响调试。
  3. 安全性:Server 变成了无状态的管道,不存用户数据,大大降低了运维风险。

希望这个踩坑记录能帮到正在折腾 MCP 的你。如果有更好的方案,欢迎交流!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 17:54:19

企业级OCR解决方案:腾讯混元OCR在金融票据场景的应用

企业级OCR解决方案:腾讯混元OCR在金融票据场景的应用 在银行、保险和支付机构的后台系统中,每天都有成千上万张发票、保单、身份证件和合同被扫描上传。这些文档承载着关键业务信息,却长期依赖人工逐字录入——效率低、成本高、还容易出错。更…

作者头像 李华
网站建设 2026/6/10 23:09:03

图解说明Arduino创意作品基础电路搭建流程

从零开始搭建你的第一个 Arduino 创意作品:手把手带你连对每一条线你有没有过这样的经历?兴致勃勃地买回一块 Arduino Uno,一堆传感器和 LED 模块,结果一通电——灯不亮、串口没输出、程序上传失败……最后只能对着杂乱的面包板发…

作者头像 李华
网站建设 2026/6/15 17:11:46

iOS应用集成OCR功能?基于HunyuanOCR的私有化方案

iOS应用集成OCR功能?基于HunyuanOCR的私有化方案 在金融、政务、医疗等对数据安全高度敏感的行业,一个看似简单的需求——“用手机拍张身份证就能自动填表”——背后却潜藏着巨大的技术挑战。用户愿意掏出手机拍照,但绝不希望这张包含姓名、身…

作者头像 李华
网站建设 2026/6/22 9:52:31

无源蜂鸣器PWM调音技术:Arduino实战案例

用Arduino玩转蜂鸣器音乐:从“滴滴”到《小星星》的硬核调音实战你有没有试过给自己的Arduino项目加个提示音?按一下按钮,“滴”一声;启动完成,“嘀——”长响一下。听起来挺酷,但总觉得少了点灵魂&#xf…

作者头像 李华
网站建设 2026/6/15 13:09:03

circuit simulator与传统实验结合的教学模式:全面讲解

当理论“活”起来:用电路仿真重塑电子教学的知行闭环你有没有经历过这样的课堂?老师在黑板上推导完一串复杂的微分方程,讲完RC电路的充放电过程,学生点头如捣蒜。可等到走进实验室,面对面包板、示波器和一堆色环电阻时…

作者头像 李华
网站建设 2026/6/13 19:48:57

快递面单识别专项优化:HunyuanOCR字段抽取模板配置指南

快递面单识别专项优化:HunyuanOCR字段抽取模板配置指南 在快递网点每天处理成千上万张运单的现实场景中,一个微小的录入错误就可能导致包裹错派、客户投诉甚至物流链条中断。而面对手写潦草、打印模糊、多语言混排的面单图像,传统OCR方案往往…

作者头像 李华