MCP开发-07.案例-阿里云Argo与多MCP蛋白设计

本系列:00 什么是 MCP · 01 协议与心智模型 · 02 Python 框架选型 · 03 部署与调用 · 04 重任务与优化 · 05 从 0 开发 · 06 进阶示例 · 07 阿里云案例(本文)


1. 场景与目标

MCP Host(如 Cursor、内部 Agent 平台)中,用户希望用自然语言驱动酶/蛋白相关分析:

能力 模型 输入 输出
序列嵌入 ESM2 氨基酸序列 / FASTA 嵌入向量(.npz
结构预测 ESMFold 氨基酸序列 / FASTA 3D 结构(.pdb / .cif)+ pLDDT
序列设计 ProteinMPNN 3D 结构 新酶序列(.fasta

单次任务 GPU 占用高、耗时长,不适合在 MCP 进程内同步推理。本文给出在 阿里云 上的落地方式:

  • 计算编排:ACK 集群内的 Argo Workflows
  • 对象存储OSS(输入/输出、跨步骤 URI 传递)
  • 共享文件NAS(模型权重、缓存、大体积中间文件)
  • 协议层:三个独立 MCP Server(+ 可选 pipeline MCP),模式见 04 重服务与长任务

段末注释ACK(Alibaba Cloud Container Service for Kubernetes,阿里云容器服务 Kubernetes 版)是托管 K8s;OSS(Object Storage Service,对象存储服务)用于存放大对象;NAS(Network Attached Storage,文件存储 NAS)提供 POSIX 共享挂载。


2. 总体架构(阿里云)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
flowchart TB
subgraph host [MCP Host]
Agent["LLM Agent"]
end

subgraph ack [ACK 集群]
subgraph mcp_ns [命名空间 mcp-gateway]
E2["esm2-mcp\nStreamable HTTP"]
EF["esmfold-mcp"]
MP["mpnn-mcp"]
end
subgraph argo_ns [命名空间 argo]
AW["Argo Workflows"]
end
subgraph gpu [GPU 节点池]
W1["esm2-worker Pod"]
W2["esmfold-worker Pod"]
W3["mpnn-worker Pod"]
end
end

OSS["阿里云 OSS\noss://protein-runs/"]
NAS["文件存储 NAS\n/mnt/nas/models"]
RDS["RDS / Redis\nrun 元数据"]

Agent --> E2 & EF & MP
E2 & EF & MP --> AW
E2 & EF & MP --> RDS
AW --> W1 & W2 & W3
W1 & W2 & W3 --> OSS
W1 & W2 & W3 --> NAS
E2 & EF & MP --> OSS

分工原则

组件 职责
MCP Server 参数校验、写 OSS 输入、提交 Argo Workflow、查状态、返回摘要与 URI;不加载模型
Argo Workflow GPU Pod 生命周期、重试、超时、DAG(可选全链路)
OSS 每个 run_id 目录存 input/output;MCP 与 Worker 只传 URI 字符串
NAS 各 Worker 镜像挂载同一 模型目录(ESM2/ESMFold/MPNN 权重),避免打进镜像
RDS / Redis run_id → status, workflow_name, output_uris(MCP 快速查询)

MCP 部署建议:Streamable HTTP + 无状态03 部署与调用),Ingress 或 ALB(Application Load Balancer,应用型负载均衡)暴露 HTTPS。


3. 存储布局与 URI 约定

3.1 OSS 目录(跨 MCP 串联)

1
2
3
4
5
6
7
8
9
oss://{bucket}/protein-runs/{run_id}/
input.fasta # 或 input.pdb(MPNN 上游)
meta.json # 参数、服务名、创建时间
outputs/
embedding.npz # esm2-mcp
structure.pdb # esmfold-mcp
metrics.json # pLDDT 等
designed.fasta # mpnn-mcp
logs/

跨服务传递:只传 oss://{bucket}/protein-runs/{run_id}/outputs/structure.pdb,禁止把 PDB 全文塞进 Tool 返回或 LLM context。

3.2 NAS 挂载(Worker Pod)

挂载路径 内容
/mnt/nas/models/esm2/ ESM2 权重
/mnt/nas/models/esmfold/ ESMFold 权重
/mnt/nas/models/mpnn/ MPNN checkpoint
/mnt/nas/cache/ 可选,HF / 临时缓存

NAS 选型:容量型 NAS 存模型;若多可用区 Worker,使用 NAS 挂载点 与 ACK PersistentVolume 绑定(存储类 alicloud-nas)。

3.3 鉴权

  • MCP Pod / Worker Pod:通过 ACK RRSA(RAM Roles for Service Accounts)或 Worker RAM 角色,授予 OSS PutObject/GetObject、NAS 读权限;在 Tool 参数或镜像中写 AccessKey。
  • MCP 返回结果时,大文件可提供 OSS 签名 URL(短期有效),供用户浏览器或下游下载。

4. 三个 MCP 服务定义

三个服务 Tool 形态统一,便于 Agent 记忆;实现可共用 argo_client.pyoss_client.pyoss2 SDK)。

4.1 通用 Tool 集(每个 MCP 相同模式)

Tool 说明
submit_* 创建 run、上传输入到 OSS、提交 Argo Workflow;返回 run_id(支持 Task 时立即 working
get_run_status(run_id) pending / running / succeeded / failed
fetch_run_summary(run_id) 摘要 + output_uris;小 JSON 可 inline
cancel_run(run_id) 终止 Argo Workflow

Resource 示例:resource://runs/{run_id}/summary(只读 meta + OSS 路径列表)。


4.2 esm2-mcp(序列 → 嵌入)

1
2
3
4
5
6
7
8
9
submit_esm2_embed(
sequence: str | None = None,
fasta_oss_uri: str | None = None, # oss://bucket/.../input.fasta
model: str = "esm2_t33_650M_UR50D",
pooling: str = "mean", # mean | per_residue
) -> str # run_id

fetch_run_summary(run_id: str) -> dict
# 例: { "embedding_uri": "oss://.../embedding.npz", "shape": [L, 1280], ... }

Argo WorkflowTemplate 名esm2-embed(见 §6)。


4.3 esmfold-mcp(序列 → 3D 结构)

1
2
3
4
5
6
7
8
submit_esmfold_predict(
sequence: str | None = None,
fasta_oss_uri: str | None = None,
num_recycles: int = 3,
) -> str

fetch_run_summary(run_id: str) -> dict
# 例: { "pdb_uri", "mean_plddt", "n_residues", "preview_lines": "HEADER..." }

GPU 建议:独占 A10 / V100 / GU30 等 ACK GPU 共享池 中较大显存规格;与 ESM2 分 WorkflowTemplate 与节点池。


4.4 mpnn-mcp(结构 → 新序列)

1
2
3
4
5
6
7
8
9
10
submit_mpnn_design(
structure_oss_uri: str, # 必填,来自 esmfold 的 pdb_uri
num_sequences: int = 8,
method: str = "protein_mpnn", # 可扩展 diffusion 等
fixed_positions: list[int] | None = None,
temperature: float = 0.1,
) -> str

fetch_run_summary(run_id: str) -> dict
# 例: { "fasta_uri", "top_sequences_preview": ["MKFL...", ...], "scores": [...] }

典型 Agent 调用链

1
2
3
esmfold.submit → poll → fetch → pdb_uri
mpnn.submit(structure_oss_uri=pdb_uri) → poll → fetch → fasta_uri
(可选)esm2.submit(fasta_oss_uri=fasta_uri) # 对比设计前后嵌入

5. 可选:pipeline-mcp(Argo DAG 一键)

若 Host 常跑固定流程,可增加第四个 MCP,内部提交 一条 Argo DAG

1
2
3
4
5
6
flowchart LR
IN["input.fasta\nOSS"] --> FOLD["esmfold"]
FOLD --> PDB["structure.pdb\nOSS"]
PDB --> DESIGN["mpnn"]
DESIGN --> OUT["designed.fasta\nOSS"]
OUT --> EMB["esm2 可选"]
1
2
3
4
5
submit_enzyme_design_pipeline(
sequence: str,
mpnn_num_sequences: int = 8,
also_embed_designs: bool = False,
) -> str # pipeline_run_id

单步调试仍用三个专用 MCP;产品化「一键酶设计」用 pipeline。


6. Argo WorkflowTemplate(阿里云适配骨架)

以下 YAML 为 骨架,镜像需推送到 ACR(Alibaba Cloud Container Registry,容器镜像服务);参数由 MCP 在 submit_* 时注入。

6.1 ESM2 嵌入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: esm2-embed
namespace: argo
spec:
entrypoint: embed
arguments:
parameters:
- name: run-id
- name: input-oss-uri
- name: output-oss-uri
- name: model-name
- name: pooling
templates:
- name: embed
container:
image: registry.cn-hangzhou.aliyuncs.com/your-ns/esm2-worker:latest
command: [python, -m, esm2_worker]
args:
- --run-id={{workflow.parameters.run-id}}
- --input-uri={{workflow.parameters.input-oss-uri}}
- --output-uri={{workflow.parameters.output-oss-uri}}
- --model={{workflow.parameters.model-name}}
- --pooling={{workflow.parameters.pooling}}
- --model-dir=/mnt/nas/models/esm2
env:
- name: OSS_ENDPOINT
value: oss-cn-hangzhou-internal.aliyuncs.com # 同地域用内网 endpoint
volumeMounts:
- name: nas-models
mountPath: /mnt/nas/models
resources:
limits:
nvidia.com/gpu: "1"
memory: 16Gi
volumes:
- name: nas-models
persistentVolumeClaim:
claimName: nas-models-pvc
retryStrategy:
limit: 2
activeDeadlineSeconds: 3600

6.2 ESMFold / MPNN

结构类似,替换:

  • 镜像esmfold-workermpnn-worker
  • NAS 子路径/mnt/nas/models/esmfold/mnt/nas/models/mpnn
  • GPU / memory:ESMFold 显存需求更高,可设 activeDeadlineSeconds: 7200
  • MPNN 输入参数--structure-uri={{workflow.parameters.structure-oss-uri}}

6.3 MCP 提交 Workflow(Python 概念代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from argo_workflows.api import workflow_service_api
import oss2

def submit_workflow(template: str, run_id: str, params: dict) -> str:
body = {
"namespace": "argo",
"resourceKind": "WorkflowTemplate",
"resourceName": template,
"submitOptions": {
"name": f"{template}-{run_id[:8]}",
"parameters": [f"{k}={v}" for k, v in params.items()],
},
}
# 调用 Argo Server API(集群内 Service 或 Ingress)
...
return body["submitOptions"]["name"]

Worker 内读写 OSS 使用 oss2,Endpoint 与 Bucket 同地域,优先 内网 endpoint 免流量费、降延迟。


7. ACK 部署清单

7.1 集群与组件

建议
ACK 集群 至少 1 个 GPU 节点池(可按 ESMFold / MPNN 分池)
Argo Workflows argo 命名空间安装;MCP 通过 K8s RBAC create workflows
MCP Deployment mcp-gateway 命名空间,2+ 副本,无状态 HTTP
Ingress / ALB HTTPS,WAF 可选;校验 MCP Origin 头
ACR 私有镜像;与 ACK 同地域

7.2 MCP Pod 环境变量(示例)

1
2
3
4
ARGO_SERVER_URL=https://argo.internal/api/v1
OSS_BUCKET=protein-runs
OSS_ENDPOINT=oss-cn-hangzhou-internal.aliyuncs.com
REDIS_URL=redis://:****@r-xxx.redis.rds.aliyuncs.com:6379/0

7.3 Host 侧注册(多 MCP)

1
2
3
4
5
6
7
{
"mcpServers": {
"esm2": { "url": "https://mcp.example.com/esm2/mcp" },
"esmfold": { "url": "https://mcp.example.com/esmfold/mcp" },
"mpnn": { "url": "https://mcp.example.com/mpnn/mcp" }
}
}

建议在某一 MCP 上提供 @mcp.prompt() enzyme_design_workflow,写明:先 esmfold → 再 mpnn → 可选 esm2;禁止粘贴完整 PDB。


8. 异步、Task 与取消

04 一致:

  • Host 支持 Tasks@mcp.tool(task=True),内部 watch Argo Workflow 状态并 report_progress(如「Argo phase: Running」)。
  • 不支持 Tasks:暴露 submit_* + get_run_status + fetch_run_summary 三 Tool。
  • 取消cancel_run → Argo terminate Workflow;Worker 应监听 SIGTERM 释放 GPU。
任务 典型耗时 说明
ESM2 秒~分钟 序列长度线性影响
ESMFold 分钟级 长序列需大显存
MPNN 分钟级 num_sequences 可 Argo 内 parallel steps

9. 安全与成本

主题 做法
鉴权 RAM 角色 + RRSA;OSS Bucket 私有;MCP 网关 OAuth / mTLS
网络 Worker 与 OSS/NAS 同 VPC;MCP 仅内网 Ingress
成本 GPU 节点池 弹性伸缩(缩容至 0 需注意冷启动);OSS 生命周期转低频存储
合规 序列/结构数据按租户前缀隔离:oss://bucket/{tenant_id}/protein-runs/

10. 落地顺序建议

  1. ACK + NAS 模型目录 + OSS Bucket + ACR 镜像(先 ESMFold Worker 跑通)。
  2. esmfold-mcp + WorkflowTemplate + submit / status / summary
  3. mpnn-mcp,输入改为 structure_oss_uri
  4. esm2-mcp(可选特征/对比)。
  5. pipeline-mcp 或 Argo DAG 串联;接入 ARMS(应用实时监控服务)做 Workflow 与 MCP 链路追踪。

11. 与本系列其他篇章的关系

篇章 关联
04 重服务与长任务 MCP 薄、Worker 厚;Tasks;Resource 卸载
03 部署与调用 HTTP 无状态、Ingress、生产清单
06 进阶示例 Tool / Resource / Task 代码形态

12. 小结

MCP Argo Template OSS 输出 NAS
esm2-mcp esm2-embed embedding.npz ESM2 权重
esmfold-mcp esmfold-predict structure.pdb ESMFold 权重
mpnn-mcp mpnn-design designed.fasta MPNN 权重

在阿里云上,OSS 管对象、NAS 管模型、Argo 管算力、MCP 管协议与调度;三个(或四个)MCP 服务并列注册,由 Agent 按 URI 串联,即可在 Host 内完成「嵌入 → 折叠 → 设计」酶工程工作流。

-------------本文结束感谢您的阅读-------------