Skip to content

feat: 代理支持 --upstream-proxy,修复 MCP 外部数据库国内直连不可达#14

Open
estelledc wants to merge 1 commit into
SuperJJ007:mainfrom
estelledc:fix/issue-11-upstream-proxy
Open

feat: 代理支持 --upstream-proxy,修复 MCP 外部数据库国内直连不可达#14
estelledc wants to merge 1 commit into
SuperJJ007:mainfrom
estelledc:fix/issue-11-upstream-proxy

Conversation

@estelledc

Copy link
Copy Markdown

解决的问题

Closes #11

问题描述

Streamable HTTP MCP 服务器(PubMed、ChEMBL、clinical-trials、biorxiv)在国内网络环境下直连不可达。CSswitch 代理的 CONNECT 隧道目前是直连目标 socket.create_connection((host, port)),不经过用户的翻墙代理。

错误日志:

[MCP] Failed to connect to server 'pubmed': Error: Streamable HTTP error: Error POSTing to endpoint:
[MCP] Failed to connect to server 'clinical-trials': Error: Streamable HTTP error: Error POSTing to endpoint:
[MCP] Failed to connect to server 'chembl': Error: Streamable HTTP error: Error POSTing to endpoint:
[MCP] Failed to connect to server 'biorxiv': Error: Streamable HTTP error: Error POSTing to endpoint:

注意:本地 stdio MCP 服务器(genes-ontologies、drug-regulatory 等 11 个)全部正常——只有需要出墙的 Streamable HTTP 类型失败。

根因

  1. launch-virtual-sandbox.sh 刻意不设 http_proxy(因为代理未实现普通 HTTP 转发,设了反而会让 HTTP 请求撞代理拿 404)
  2. https_proxy 指向 CSswitch 代理(18991),但 do_CONNECT 对非 Anthropic 域名是直连目标,不经翻墙代理
  3. 在国内网络环境下 eutils.ncbi.nlm.nih.govclinicaltrials.gov 等域名直连超时

修改

代理(csswitch_proxy.py)

  • 新增 --upstream-proxy host:port 参数
  • 指定后,非 Anthropic 域的 CONNECT 隧道改为:先连上游代理 → 发 CONNECT 请求 → 隧道建立在代理之上
  • 实现完整的 HTTP CONNECT 客户端(请求上游代理 + 读响应 + 建隧道)

桌面端(config.rs + lib.rs)

  • Config 新增 upstream_proxy 字段(持久化到 ~/.csswitch/config.json
  • ensure_proxy() 启动代理进程时传递 --upstream-proxy

启动脚本(launch-virtual-sandbox.sh)

  • 新增 --upstream-proxy 参数
  • 指定后同时设 http_proxy 指向上游代理(HTTP 的 MCP/包源请求走此通道)
  • https_proxy 仍指向 CSswitch 代理(Anthropic fast-fail + CONNECT 隧道经上游)

使用方式

# 代理端
python3 csswitch_proxy.py --provider deepseek --port 18991 --upstream-proxy 127.0.0.1:7890

# 沙箱端
launch-virtual-sandbox.sh --port 8990 --upstream-proxy http://127.0.0.1:7890

在 CSSwitch GUI 面板的 config.json 中添加 "upstream_proxy": "127.0.0.1:7890" 后,点「一键开始」自动生效。

验证

# 全量测试通过
bash test/run_all.sh
# ALL GREEN

# 连通性验证(通过上游代理 7890 访问外部数据库)
curl -x http://127.0.0.1:7890 -sI "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=test"
# → HTTP 200

curl -x http://127.0.0.1:7890 -sI "https://clinicaltrials.gov/api/v2/studies"
# → HTTP 200

向后兼容

  • 不指定 --upstream-proxy 时行为不变(直连目标)
  • config.jsonupstream_proxy 字段时默认空字符串,走原有逻辑

问题:Streamable HTTP MCP 服务器(PubMed/ChEMBL/clinical-trials/biorxiv)
在国内网络环境下直连不可达。CSswitch 代理的 CONNECT 隧道直连目标,
不经过用户的翻墙代理,导致连接超时/失败。

修改:
- csswitch_proxy.py:新增 --upstream-proxy 参数(host:port)
  非 Anthropic 域的 CONNECT 隧道经上游代理建立,而非直连
- config.rs:新增 upstream_proxy 配置字段(持久化)
- lib.rs:ensure_proxy() 传递 --upstream-proxy 给代理进程
- launch-virtual-sandbox.sh:支持 --upstream-proxy 参数,
  同时设 http_proxy 指向上游代理(MCP HTTP 请求出墙)

用法:
  代理:  python3 csswitch_proxy.py --upstream-proxy 127.0.0.1:7890
  沙箱:  launch-virtual-sandbox.sh --upstream-proxy http://127.0.0.1:7890

Closes SuperJJ007#11
@SuperJJ007

Copy link
Copy Markdown
Owner

牛逼。
我正在重构代码。
现在代码太垃圾了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Streamable HTTP MCP 服务器(PubMed/ChEMBL/clinical-trials/biorxiv)无法通过默认代理连接

2 participants