从零开始 Claude MCP 服务:小白也能实现的团队部署效率提升。
本文记录了为 Claude Code 开发 MCP (Model Context Protocol) 服务的过程,通过自定义工具实现项目部署信息的一键查询,大幅提升开发效率。
背景
以下信息是AI根据总结生成,AI可以帮我们做很多事情,尤其有了调用mcp和使用tools之后。可以自己执行动作,比如修改代码,推送分支,那么一直让我不得不浪费时间去做的一件事是,打开公司pmo的项目管理平台,然后找到自己的分支点击去部署跳转到meta平台选择分支和项目进行测试环境的功能部署,链路非常长,一个打开功能需要很多步。程序员的时间也是时间。
所以我有了想法就是实现一个mcp在我claudecode使用,核心的方法就是完成一个mcp服务,接受一个pmo号或者git分支号,调用服务直接返回拼接好的链接。和信息打开即可。
我有的资源:claudecode ,network查到的一个根据pmo获取信息的接口,meta的标准化链接。claude code标准mcp的接入方式。
通过这些的组合让ai帮我完成自己测试就好了。最终的使用方式也就是提供一个包直接运行.sh就完成全部注册了。 有mcp管理平台完全可以参考一下。还是那句话,AI帮我提高生产力,我们负责管理他们。不断发现身边问题不断解决,才是我们的真正工作。各位加油。
在日常开发中,我们经常需要查看项目的部署信息或触发部署。让我们先看看原来的操作流程。
原来的操作链路
场景:需要查看或触发某个项目的部署
1. 打开浏览器,输入 PMO 平台地址
2. 登录(如果未登录)
3. 在搜索框输入项目编号(如 PROJ-12345)
4. 从搜索结果中找到对应项目
5. 点击进入项目详情
6. 点击「发布 Beta」按钮
7. 选择目标环境(测试/预发等)
8. 选择要发布的分支
9. 点击「确认发布」
整个流程下来,至少需要 30-60 秒,而且需要多次点击和记忆环境 ID、分支名等信息。
新的操作方式
安装 MCP 服务后:
用户: 查看 PROJ-12345 的部署信息
Claude: [自动调用工具,2秒内返回]
项目编号: PROJ-12345
环境 ID: 10058
应用: 业务系统 (app-code)
分支: feature-new-fix
部署链接: https://deploy.internal.com/...
只需要一句话,5 秒内获取到所有信息,点击链接即可直接进入部署页面。
效率对比
| 指标 | 原方式 | 新方式 | 提升 |
|---|---|---|---|
| 耗时 | 30-60 秒 | 5 秒 | 6-12 倍 |
| 操作步骤 | 9 步 | 1 步 | 9 倍 |
| 上下文切换 | 需要 | 不需要 | ✅ |
| 记忆负担 | 需要记住环境 ID | 自动显示 | ✅ |
什么是 MCP
MCP (Model Context Protocol) 是 Claude 推出的开放协议,允许 AI 助手连接外部数据源和工具。通过 MCP,我们可以:
- 让 AI 调用内部 API 获取数据
- 自定义工具扩展 AI 能力
- 实现 AI 与企业系统的集成
项目架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Claude Code │─────│ MCP Server │─────│ PMO API │
│ │ │ (stdio) │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
│ │
用户对话 解析输入/调用API
核心实现
1. 项目初始化
mkdir pmo-mcp-server
cd pmo-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
2. MCP 服务基础结构
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
// 创建服务器实例
const server = new Server({
name: "pmo-deploy-server",
version: "1.0.0",
}, {
capabilities: { tools: {} }
});
// 启动服务
const transport = new StdioServerTransport();
await server.connect(transport);
3. 定义工具
MCP 通过 "工具" (Tools) 暴露功能给 AI:
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [{
name: "get_deploy_info",
description: "获取项目部署信息并生成部署页面链接",
inputSchema: {
type: "object",
properties: {
input: {
type: "string",
description: "项目编号或分支名"
}
},
required: ["input"]
}
}]
};
});
4. 智能输入解析
用户可能输入项目编号,也可能是分支名,需要智能识别:
function parseInput(input) {
const trimmed = input.trim();
// 匹配项目编号格式,如 PROJ-12345
const match = trimmed.match(/(PROJ|PRJ)-\d+/i);
if (match) {
const projectId = match[0].toUpperCase();
// 判断是纯项目编号还是从分支名提取的
const type = trimmed === projectId ? "direct" : "from_branch";
return { type, projectId, originalInput: trimmed };
}
return { type: "unknown" };
}
5. 调用内部 API
async function fetchDeployInfo(projectId) {
const url = `https://internal-api.com/deploy?projectId=${projectId}`;
return new Promise((resolve, reject) => {
https.get(url, (res) => {
let data = "";
res.on("data", (chunk) => data += chunk);
res.on("end", () => {
const result = JSON.parse(data);
resolve({
projectId: result.data.id,
envId: result.data.envId,
applications: result.data.apps.map(app => ({
code: app.code,
name: app.name,
branch: app.branch,
deployUrl: generateDeployUrl(result.data.envId, app.code, app.branch)
}))
});
});
}).on("error", reject);
});
}
6. 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
if (name === "get_deploy_info") {
const parsed = parseInput(args.input);
if (parsed.type === "unknown") {
return {
content: [{
type: "text",
text: "无法识别输入,请提供有效的项目编号或分支名"
}]
};
}
const info = await fetchDeployInfo(parsed.projectId);
// 格式化输出
let output = `项目部署信息\n`;
output += `项目编号: ${info.projectId}\n`;
output += `环境 ID: ${info.envId}\n\n`;
for (const app of info.applications) {
output += `应用: ${app.name} (${app.code})\n`;
output += `分支: ${app.branch}\n`;
output += `部署链接: ${app.deployUrl}\n\n`;
}
return { content: [{ type: "text", text: output }] };
}
});
安装配置
安装脚本
为了让团队成员快速安装,编写了安装脚本:
#!/bin/bash
# 安装依赖
npm install
# 添加到 Claude(用户级别)
INDEX_JS="$(pwd)/index.js"
claude mcp add --scope user deploy-info -- node "$INDEX_JS"
# 验证安装
claude mcp list
配置文件
安装后会在 ~/.claude.json 的根目录添加配置:
{
"mcpServers": {
"deploy-info": {
"type": "stdio",
"command": "node",
"args": ["/path/to/pmo-mcp-server/index.js"]
}
}
}
使用效果
安装完成后,在 Claude 中自然对话即可:
用户: 查看 PROJ-12345 的部署信息
Claude: [调用 get_deploy_info 工具]
项目部署信息
项目编号: PROJ-12345
环境 ID: 10058
应用: 业务系统 (app-code)
分支: feature-xxx-PROJ-12345
部署链接: https://deploy.internal.com/...
用户: feature-new-fix-proj 这个分支部署在哪里?
Claude: [自动解析分支名中的项目编号,调用工具]
已从分支名解析出项目编号: PROJ-12345
[显示部署信息...]
技术要点
1. stdio 通信
MCP 使用标准输入输出进行通信,这是 Claude 与扩展服务通信的标准方式:
// 错误日志输出到 stderr(不影响通信)
console.error("Server starting...");
// 正常数据通过 MCP 协议传输
await server.connect(new StdioServerTransport());
2. 正则匹配技巧
使用精确的正则避免误匹配:
// ❌ 太宽泛,可能匹配错误
/([A-Z]+)-\d+/
// ✅ 精确匹配特定前缀
/(PROJ|PRJ|TASK)-\d+/
3. 错误处理
try {
const info = await fetchDeployInfo(projectId);
return { content: [{ type: "text", text: formatOutput(info) }] };
} catch (error) {
return {
content: [{
type: "text",
text: `获取部署信息失败: ${error.message}`
}]
};
}
分发方案
本地分发
# 打包(排除 node_modules)
tar --exclude=node_modules -czf deploy-mcp.tar.gz .
# 其他成员解压后安装
tar -xzf deploy-mcp.tar.gz
cd pmo-mcp-server
bash install.sh
远程一键安装
curl -sSL https://raw.githubusercontent.com/xxx/repo/main/install.sh | bash
收益与总结
通过开发这个 MCP 服务:
- 效率提升:查询部署信息从 30 秒缩短到 5 秒
- 体验优化:在对话中自然完成操作,无需切换应用
- 团队赋能:一次开发,全团队受益
关键收获
- MCP 协议简洁高效,易于集成
- stdio 通信方式让扩展更灵活
- AI + 企业系统集成是未来趋势
展望
后续可以扩展更多功能:
- 一键部署触发
- 部署状态查询
- 多环境管理
- 版本回滚操作
相关资源
- MCP 官方文档: modelcontextprotocol.io
- Claude Code: code.anthropic.com
本文介绍了如何通过 MCP 协议扩展 Claude AI 的能力,实现与企业内部系统的集成。希望能给有类似需求的团队提供参考。