九江市建设局网站网站图片地址怎么做的
2026/4/6 5:27:10 网站建设 项目流程
九江市建设局网站,网站图片地址怎么做的,北京移动网站建设公司价格,2021年网络营销考试题及答案最近在折腾 MCP Server#xff0c;遇到个特别抓狂的问题。 本地开发一切顺利#xff0c;GitHub Token 塞进 .env 环境变量里就完事了#xff0c;Cline (VS Code 插件) 跑得飞起。但当我把 Server 部署到服务器上#xff0c;想让团队里每个人用 自己的 GitHub Token 去跑任务…最近在折腾 MCP Server遇到个特别抓狂的问题。本地开发一切顺利GitHub Token 塞进.env环境变量里就完事了Cline (VS Code 插件) 跑得飞起。但当我把 Server 部署到服务器上想让团队里每个人用自己的 GitHub Token去跑任务时傻眼了…Cline 的配置里好像没地方填“动态参数”难道要每个人都去改 Server 的环境变量这也太不安全了。折腾了一晚上终于摸索出了一套基于 HTTP Header 和 ContextVars 的透传方案。痛点如何把 Token 传过去我们面临的死局是MCP 协议主要是 JSON-RPC标准里好像没规定怎么传鉴权 Token。Cline 客户端配置项少得可怜只有command(本地) 和url(远程)。但我转念一想MCP 的 SSE 模式本质上就是 HTTP 长连接。既然是 HTTPHeader 总能用吧验证时刻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(textOK)if__name____main__:appweb.Application()app.router.add_route(*,/{tail:.*},handle_all)print(Sniffer running on port 13334...)web.run_app(app,port13334)验证过程启动这个脚本python src/header_sniffer.py在 Cline 的配置里填入url:http://127.0.0.1:13334/sse,headers:{X-Github-Token:test-token-123}点击连接。结果终端里清晰地跳出了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_ctxContextVar(user_token,defaultNone)# 2. 定义 FastAPI 外壳appFastAPI()# 3. 编写中间件拦截 Token 并装进口袋app.middleware(http)asyncdeftoken_passthrough_middleware(request:Request,call_next):# 只拦截 MCP 相关的 SSE 请求ifrequest.url.path.startswith(/sse)orrequest.url.path.startswith(/messages):# 拿到用户传来的 Tokentokenrequest.headers.get(X-Github-Token)iftoken:user_token_ctx.set(token)print(f收到来自{request.client.host}的 Token已暂存。)responseawaitcall_next(request)returnresponse# 4. FastMCP 核心逻辑mcpFastMCP(MyServer)mcp.tool()asyncdeflist_repos():# 5. 在工具里从口袋掏出 Tokentokenuser_token_ctx.get()iftoken:print(Using Client-Provided Token!)# 这里就可以用用户的 Token 去调 GitHub API 了clientGitHubClient(tokentoken)else:print(Fallback to Server Token...)clientGitHubClient(tokenos.getenv(GITHUB_TOKEN))returnclient.get_repos()# 6. 关键一步把 FastMCP 挂载上去mcp_appmcp.sse_app()app.mount(/,mcp_app)if__name____main__:# 启动的是 FastAPI而不是 mcp.run()uvicorn.run(app,host0.0.0.0,port13333)客户端配置 (Cline)Server 端改好后Cline 这边的配置就非常简单直观了{mcpServers:{my-remote-server:{url:http://192.168.1.100:13333/sse,transport:sse,headers:{X-Github-Token:ghp_这就是每个用户自己的Token},autoApprove:[]}}}总结一下这个方案最爽的地方在于无感和隔离。隔离性利用ContextVar即使用户 A 和用户 B 同时发请求他们的 Token 也绝不会串台。兼容性代码里我做了回退处理本地开发没 Header 时依然可以用.env里的 Token不影响调试。安全性Server 变成了无状态的管道不存用户数据大大降低了运维风险。希望这个踩坑记录能帮到正在折腾 MCP 的你。如果有更好的方案欢迎交流

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询