NiChart DLMUSE MCP
NiChart DLMUSE MCP server
将 cbica/nichart_dlmuse(T1 MRI
颅骨剥离 + MUSE ROI 分割)托管在 GPU EC2 实例上的 MCP 服务器后面,因此
Claude Code 可以远程运行分割,而无须每个用户都配备本地 GPU。
为什么这样设计
MCP 工具参数是 JSON。一个 .nii.gz 文件有几十 MB 的二进制数据,分割
在 GPU 上需要 ~1-2 分钟——对于单个阻塞式工具调用来说太大也太慢了。
因此:
文件传输发生在 MCP 协议之外,通过一个普通的带认证的
POST /upload端点。只有一个小小的upload_id会流经 MCP 工具 参数。作业是异步的:
run_dlmuse_segmentation入队后立即返回;get_job_status轮询;get_job_result获取内联的 CSV 以及 掩码文件的下载链接。单一 worker,串行执行:它是一块共享 GPU,所以同一时间只有一个
docker run在执行, 排在asyncio.Queue后面。Bearer token 认证:每个团队成员在除
/healthz之外的每个端点上都需要。私有实例,没有公共 Web 层:应用只绑定
127.0.0.1,并且 安全组只开放 SSH(22)。用户通过 SSH 端口转发将笔记本电脑映射到该回环端口,并使用他们的私钥访问—— 没有域名,也没有任何面向互联网的可攻击面。TLS 使用自签名证书,在实例上生成一次,因为公开签发的证书(Let's Encrypt 等)要求实例能够从互联网访问以进行域名验证,而这个实例不行。 每个用户在自己的笔记本电脑上信任这一个证书(见下文)。
扫描数据不会永久保留:上传和作业输出会在
RETENTION_HOURS(默认 24 小时)后被删除。
架构
Claude Code (laptop) SSH tunnel EC2 (private, SG: 22 only)
│ ssh -i key.pem -L 8420:127.0.0.1:8420 user@instance ─────────────────► │
│ │
│ 1. curl https://127.0.0.1:8420/upload ─────(via tunnel)──────────► MCP server :8420 (127.0.0.1, self-signed TLS)
│ 2. run_dlmuse_segmentation ────────────────(via tunnel)──────────► │
│ 3. get_job_status (poll) ──────────────────(via tunnel)──────────► asyncio job queue (1 worker)
│ 4. get_job_result ─────────────────────────(via tunnel)──────────► │
docker run --gpus all cbica/nichart_dlmuse仓库布局
server/app.py MCP tools (run_dlmuse_segmentation, get_job_status, get_job_result)
+ HTTP routes (/upload, /download/{job_id}/{filename}, /healthz)
server/jobs.py job queue/worker, docker invocation, root-owned-output cleanup
server/auth.py bearer-token ASGI middleware
server/config.py env-driven settings
deploy/ EC2 provisioning script (installs Docker, GPU toolkit, self-signed cert, systemd unit)一次性 EC2 设置
需要一台现有的 GPU EC2 实例(推荐使用 AWS Deep Learning AMI——通常已安装 NVIDIA 驱动和 Docker)。
将此仓库复制到实例上(
git clone/scp -r)。执行
cp .env.example .env,并至少填写TOKENS——每个团队成员一个name:token对, 用逗号分隔。使用openssl rand -hex 32生成 token。在实例的安全组中:仅允许入站
22(SSH),并限制为团队 IP 或堡垒机。不要开放其他任何端口——不要开放443,也不要开放8420。应用 绑定127.0.0.1,只能通过 SSH 隧道访问。运行配置脚本:
sudo ./deploy/setup_ec2.sh它是幂等的——仅在缺失时安装 Docker/nvidia-container-toolkit, 拉取 DLMUSE 镜像,创建专用的
nichart-mcp服务用户,将代码部署到/opt/nichart-mcp,生成自签名 TLS 证书(SAN =127.0.0.1/localhost), 并安装nichart-mcpsystemd 服务。在实例本身上验证:
curl --cacert /opt/nichart-mcp/tls/server.crt https://127.0.0.1:8420/healthz将
/opt/nichart-mcp/tls/server.crt从实例上复制出来,以便分发给 每个团队成员(例如scp -i key.pem ec2-user@<instance-ip>:/opt/nichart-mcp/tls/server.crt .)。
以后要添加或撤销用户:在实例上编辑 /opt/nichart-mcp/.env 中的 TOKENS,
然后运行 sudo systemctl restart nichart-mcp。
更新代码
在实例上从更新后的检出重新运行 sudo ./deploy/setup_ec2.sh——它会
重新同步 /opt/nichart-mcp(保持现有 TLS 证书不变),重新安装
依赖项,并重启服务。
从笔记本电脑连接
每个团队成员需要:他们的 SSH 私钥(对于 Windows PuTTY .ppk 密钥,
用 puttygen key.ppk -O private-openssh -o key.pem 转换一次,以便标准
ssh 客户端可以使用)、他们的 bearer token,以及 server.crt 文件
(来自设置步骤 6)。
1. 信任自签名证书一次,这样 curl/Claude Code 就不会拒绝它:
macOS:
security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain-db server.crtLinux:
sudo cp server.crt /usr/local/share/ca-certificates/nichart-mcp.crt && sudo update-ca-certificatesWindows:
certutil -addstore -f "ROOT" server.crt
2. 打开 SSH 隧道(在使用 Claude Code 期间让此命令在终端中保持运行):
ssh -i key.pem -N -L 8420:127.0.0.1:8420 <ssh_user>@<instance-ip>如果实例没有公网 IP,只能通过堡垒机访问,请添加
-J <bastion_user>@<bastion_host>。
3. 向 Claude Code 注册 MCP 服务器(只需一次):
claude mcp add --transport http nichart-dlmuse https://127.0.0.1:8420/mcp \
--header "Authorization: Bearer <their-token>"使用方法
隧道打开后,让 Claude Code 对扫描进行分割;它将:
上传文件(通过隧道,所以
127.0.0.1:8420是正确的,即使文件最终要发送到远程实例):curl -X POST -H "Authorization: Bearer <token>" \ -F "file=@/path/to/scan.nii.gz" \ https://127.0.0.1:8420/upload # -> {"upload_id": "..."}使用该
upload_id调用run_dlmuse_segmentation工具 -> 得到一个job_id。轮询
get_job_status(job_id),直到status == "done"(通常在 GPU 上需要 ~1-2 分钟)。调用
get_job_result(job_id)-> 获取内联的 ROI 体积 CSV,以及/download/{job_id}/{filename}链接,用于 ICV 和 MUSE 掩码 NIfTI 文件 (使用相同的 bearer token,通过同一条隧道从https://127.0.0.1:8420/download/...获取)。
运维说明
GPU 并发:按设计同一时间只运行一个作业(单一共享 GPU)。 繁忙的团队会看到作业排队;
get_job_status会报告queue_position。作业状态保存在内存中:
systemctl restart nichart-mcp会丢失进行中的作业记录 (已上传的扫描和磁盘上的任何部分输出不受影响,但你需要重新提交)。在小团队规模下没问题; 如果规模超出,请将server/jobs.py中的内存字典替换为 Redis/RQ。PHI:扫描是真实的患者数据。
RETENTION_HOURS限制了它们在磁盘上的保留时间, 但在用于真实患者之前,请确认这符合你的数据处理要求。如果尚未启用实例卷的 EBS 加密,请考虑启用。DLMUSE 容器在内部以 root 身份运行(它硬编码写入
/app/pipeline.log,因此无法在--user下运行)。其输出最终归 root 所有;server/jobs.py的清理会回退到临时alpine容器来强制删除这些目录。
本地开发
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
cp .env.example .env # fill in TOKENS
TOKENS=dev:devtoken DATA_DIR=/tmp/nichart-dev .venv/bin/python -m server.app这会在本地运行完整的服务器(认证、上传、作业队列、MCP 工具)。实际
运行分割仍然需要具备 GPU 访问权限的 Docker——在没有 GPU 的机器上,
作业会在 docker run 步骤失败,但其他一切(路由、认证、排队、状态/错误报告)
都可以测试。
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Remote MCP server for RunComfy Serverless API (ComfyUI): deployments and async inference.
Cloud-hosted MCP server for durable AI memory
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/euroso97/DLMUSE_MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server