作为生信人员,每天总归跳不过的一个工作就是跑一些分析流程,而平时跑个任务,要登陆服务器,查看流程的输入接口,准备运行配置参数,总归还是要花些时间的。而最主要的问题是其中Linux操作会对于让很多非生信人员望而却步,导致这些工作都是生信分析的同学进行处理,研发阶段的参数我自己有时候都记不住🤷。
项目已经开源,如果大家需要可以自取:https://github.com/AI-skill-mcp/mcp_argo_pipeline
1. 确定方案「一份代码 + 两份 YAML」
起始考虑到正常的研发、测试过程,流程起始会经常会遇到横向的扩展和纵向的迭代,而且基于argo本身的特征管理,我自己的习惯,会进行一些子模块的模板注册。所以其实即使只有几个项目,模板也会非常多。比如我自己最近测试开发的一些工作就很多。
这个情况下,每个模板创建一个MCP显然不太现实,后期单独维护也维护不过来。而且MCP注册的一多就会出现几个问题:
- Tool 语义几乎相同(列模板 / 查参数 / 提交 / 等结果),却重复维护;
- 新域上线要改代码、改入口、改 Host 配置;
- 远程鉴权、端口、kubeconfig 散落在环境变量与脚本里,难审计,随着独立MCP增加,管理复杂性让人绝望。
所以考虑构建的,其实更像是一个argo MCP 的框架:
| 层 | 职责 |
|---|---|
| 统一框架 | 所有MCP共享一个相同的顶层构建代码 server.py |
| 调度内核 | 通用 Tool:通用的argo接口调度工具 |
| 流程配置 | pipelines.yaml(流程类、模板、端口、instructions、kubeconfig) |
| 鉴权配置 | auth.yaml(每域多 Bearer,带用户/单位备注) |

2. 确定定位「中转服务」
首先我们肯定不会在这个服务部署服务器直接跑任务,毕竟部分高计算任务,甚至一些计算需要GPU资源,都是重计算任务,需要较大的资源。
所以任务依然都是通过argo CLI 调度;MCP更多的是一个中转服务,接受 Agent 的任务请求 ->然后向K8s服务器发送任务,定期查看任务进展并返回任务结果。
长任务仍在集群 Workflow 中执行。MCP 进程只做:
- 解析配置与鉴权;
- 调用本机
argoCLI(可按域注入KUBECONFIG); - 把结果以 Tool 返回值交给 Host。
3. 功能定位「有用封装」
因为顶层,我们共用同一套代码,所以我们需要进行代码功能的抽象,经过评估后,我们设计的具体tools 列表如下:
| Tool | 作用 |
|---|---|
list_allowed_templates |
知道有哪些能用的模板 |
get_template_parameters |
知道模板投递参数需要什么(Agent 可先查再提交) |
submit_template |
知道如何通过模板提交任务(可覆盖参数) |
get_workflow_status / wait_workflow / get_workflow_logs |
观测任务运行的状态、日志 |
list_recent_workflows |
查看近期运行的任务 |
安全边界:submit_template / get_template_parameters 只接受 pipelines.yaml 白名单内的模板名;未列入的模板对 Agent 不可见、不可投从而来实现模板隔离。
4. 环境确认「兼容性」
4.1 通信和环境
兼容不同的部署形态本地开发测试为主,远程是后面给他同事业务应用为主。
- 本地部署:本地开发部署MCP时,通过
stdio来进行评估测试,本地起、本地用无需进行鉴权; - 远程部署:远程服务部署service采用
streamable-http,远程url访问,防止url泄漏,进行鉴权;ps 远程需要同时兼容mac和windows和linux。
4.2 启动校验
启动即校验可用性,避免「进程起来了但集群不可用」
- kubeconfig 可读,且能访问配置的 namespace;
- 白名单内每个模板能被
argo template get读到。
MCP在启动时,本身不能发现配置的非格式问题(例如k8s.cfg 无权限),启动校验在启动阶段可以检查这些问题,(可设 MCP_SKIP_STARTUP_CHECKS=1 跳过):。
5. 配置面:扩容时真正要改的东西
5.1 配置流程 pipelines.yaml:
核心字段:
1 | defaults: |
- 同一域加能力:在已有
templates列表追加已验收的模板名,重启该 Pipeline 进程即可; - 新业务域:新增
pipelines.<id>整块,分配端口与 instructions,再配鉴权并启动。
不必为新域再写一套 Python Tool。而且每个功能域的模板可以独立启动服务,防止agent应用阶段的过渡加载。
5.2 auth.yaml:按域发钥匙
1 | pipelines: |
- 一域多 token:便于人/组隔离与轮换;
username/unit供审计备注(中间件验票后写入请求上下文);- 从
auth.yaml.example拷贝后编辑。
从而可以实现精确的鉴权和定位,因为我自己目前使用的规模不会超过20人,所以token配置这么实现基本就满足需求。
5.3 客户端只改连接配置
HTTP 示例(项目 .cursor/mcp.json):
1 | { |
stdio 则指向同一 server.py,用环境变量区分域:
1 | { |
6 启动服务
参考上面的部分完成配置后,我们就可以启动MCP服务,给其他人调用了。
步骤 A — 写入 auth.yaml(若用 HTTP)
为该域至少配一把 token;Host 的 Bearer 必须与之一致。用于鉴权。
步骤 2 — 依赖与启动
环境依赖 uv进行管理,部署shell会自动同步uv环境的准备和服务的启动,不过你需要按需指定要启动的功能组。
1 | cd mcp/mcp_argo_pipeline |
启动失败优先看:kubeconfig、模板名是否与集群一致、该域是否配置了 token。
7. Agent连通
Agent配置
在这里面我们用workbuddy进行连通性测试,先填写我们的MCP配置
然后启用链接,发现每个域都绿了,恭喜你,MCP服务启动成功,并且和agent已经打通了。
- 或用协议正确的
initializePOST 冒烟(裸 GET/mcp常返回 400 Missing session ID,属协议要求,不代表服务挂了;401 才是鉴权失败)。
运行一个任务
MCP配置以后,就和其他的MCP使用一样了,可以直接通过自然语言来触发任务
然后过段时间就可以看到结果啦。
ps:混元模型最近可以免费白嫖,所以这种测试现在都是在白嫖免费模型,大家有需要的也可以看看。
截止目前,我们的MCP已经构建完成,并且已经可以在Agent里面通过对话,启动任务运行了。接下来你只需要把配置模板准备好,告诉他们怎么配置,以后就可以让他们自己通过Agent的自然语言投递一些大计算的分析任务啦,而且他们自己就可以直接通过自然语言询问任务进度和状态。