使用说明
Azure DevOps本地MCP服务器
一个模型上下文协议(MCP)服务器,通过Claude、GitHub Copilot和其他MCP兼容工具等人工智能助手,实现与Azure DevOps内部部署实例的无缝交互。
✨ 特性
全面的Azure DevOps集成,涵盖多个类别的27多种工具:
🏢 核心API(2个工具)
- 列出项目 -浏览组织中的所有项目
- 列出项目团队 -查看特定项目中的团队
📋 工作项目(9个工具)
- 获取工作项 -检索特定工作项的详细信息
- 批量获取工作项 -按ID检索多个工作项
- 创建工作项 -创建新的工作项(任务、bug、用户故事等)
- 更新工作项 -修改现有工作项
- 我的工作项目 -通过筛选查看分配给您的所有工作项
- 添加评论 -向工作项添加注释
- 列出评论 -查看对工作项的所有评论
- 执行查询 -按ID运行已保存的工作项查询
📦 存储库(7个工具)
- 列出存储库 -浏览项目中的所有存储库
- 获取存储库 -获取特定存储库的详细信息
- 列出分支机构 -查看存储库中的所有分支
- 获取分支 -获取特定分支机构的详细信息
- 列出拉取请求 -通过过滤浏览拉取请求
- 获取拉取请求 -获取特定PR的详细信息
- 创建拉取请求 -创建新的拉取请求
🚀 管道和建筑(3个工具)
- 列表构建 -使用状态和结果过滤浏览构建
- 获取构建状态 -检查特定构建的状态
- 列表构建定义 -查看可用的构建/管道定义
📚 Wiki(3个工具)
- 列出维基 -浏览组织或项目中的Wiki
- 获取页面内容 -检索wiki页面内容
- 列表页面 -查看wiki中的所有页面
🔍 搜索(3个工具)
- 搜索代码 -通过过滤在存储库中搜索代码
- 搜索Wiki -按关键字和内容搜索wiki页面
- 搜索工作项 -跨工作项的全文搜索
⏱️ 工作和迭代(2个工具)
- 列出迭代次数 -查看项目中的所有迭代/冲刺
- 列出团队迭代 -查看分配给特定团队的迭代
🔒 安全功能
- 内置WIQL注入预防和输入验证
- 通过环境变量实现安全的凭证处理
- 防止内存耗尽的结果限制
📋 先决条件
-
Node.js 18或更高版本
-
访问Azure DevOps内部部署服务器
-
具有以下权限的个人访问令牌(PAT):
- 工作项(读写) -查看和修改工作项、添加注释时需要
- 代码(读写) -存储库和拉取请求操作、代码搜索所需
- 构建(读取) -查看构建和管道时需要
- 项目和团队(阅读) -列出项目和团队所需
- Wiki(阅读) -wiki搜索操作需要
注意:如果您只需要查询/查看数据,则可以创建仅具有读取权限的PAT。
🚀 安装
方案1:地方发展
-
克隆存储库
git clone <repository-url> cd custom-mcp-server -
安装依赖项
npm install -
配置环境变量
创建一个
.env项目根目录中的文件:AZURE_DEVOPS_ORG_URL=https://your-devops-server.com/your-organization AZURE_DEVOPS_PAT=your-personal-access-token-here -
构建项目
npm run build
选项2:全局安装
全局安装该软件包,以便从任何地方使用它:
npm install -g .
然后使用环境变量运行它:
AZURE_DEVOPS_ORG_URL=https://your-server.com AZURE_DEVOPS_PAT=your-pat azure-devops-onprem-mcp-server
⚙️ 配置
VS代码(GitHub副本)
添加到您的VS代码设置文件(.vscode/mcp.json 或用户设置):
{
"mcpServers": {
"azure-devops-onprem": {
"command": "node",
"args": ["/absolute/path/to/custom-mcp-server/dist/index.js"],
"env": {
"AZURE_DEVOPS_ORG_URL": "https://your-devops-server.com/your-org",
"AZURE_DEVOPS_PAT": "your-personal-access-token"
}
}
}
}
克劳德桌面
添加到您的Claude Desktop配置(~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):
{
"mcpServers": {
"azure-devops-onprem": {
"command": "node",
"args": ["/absolute/path/to/custom-mcp-server/dist/index.js"],
"env": {
"AZURE_DEVOPS_ORG_URL": "https://your-devops-server.com/your-org",
"AZURE_DEVOPS_PAT": "your-personal-access-token"
}
}
}
}
其他MCP客户端
对于任何兼容MCP的客户端,请使用:
- 命令:
node - 参数:
["/path/to/dist/index.js"] - 运输标准: stdio
- 环境:设置
AZURE_DEVOPS_ORG_URL和AZURE_DEVOPS_PAT
🛠️ 可用工具
核心API工具
mcp_ado_core_list_projects
列出Azure DevOps组织中的所有项目。
参数:
stateFilter(字符串,可选):按状态筛选(全部、格式良好、删除、新建)top(number,可选):要返回的最大项目数
mcp_ado_core_list_project_teams
列出项目中的团队。
参数:
project(string,必填):项目名称或IDtop(数量,可选):可返回的最大团队数量
工作项工具
mcp_ado_wit_get_work_item
获取单个工作项的详细信息。
参数:
id(数字,必填):工作项IDproject(字符串,可选):项目名称(不需要,因为工作项ID是全局唯一的)expand(字符串,可选):展开选项(无、关系、字段、链接、全部)
mcp_ado_wit_get_work_items_batch_by_ids
在单个批处理请求中检索多个工作项。
参数:
ids(数字数组,必填):工作项ID数组project(string,必填):项目名称fields(字符串数组,可选):要返回的特定字段
mcp_ado_wit_create_work_item
创建新工作项。
参数:
project(string,必填):项目名称workItemType(字符串,必填):类型(例如,“任务”、“Bug”、“用户故事”)title(字符串,必填):工作项标题description(字符串,可选):工作项描述assignedTo(字符串,可选):要分配给的用户state(字符串,可选):初始状态tags(字符串,可选):以分号分隔的标签
mcp_ado_wit_update_work_item
更新现有工作项。
参数:
id(数字,必填):工作项IDproject(string,必填):项目名称title(字符串,可选):更新标题description(字符串,可选):更新的描述state(字符串,可选):更新状态assignedTo(字符串,可选):已更新的受让人tags(字符串,可选):已更新标签
mcp_ado_wit_my_work_items
获取所有项目中分配给当前用户的工作项,或按特定项目筛选的工作项。
参数:
project(字符串,可选):按项目名称筛选state(字符串,可选):状态过滤器(例如,“活动”、“新建”)type(字符串,可选):工作项类型筛选器top(数字,可选):要返回的最大项目数(默认值:100)
mcp_ado_wit_add_work_item_comment
向工作项添加注释。
参数:
project(string,必填):项目名称workItemId(数字,必填):工作项IDcomment(字符串,必填):注释文本
mcp_ado_wit_list_work_item_comments
列出对工作项的所有评论。
参数:
project(string,必填):项目名称workItemId(数字,必填):工作项IDtop(数字,可选):返回的最大评论数
mcp_ado_wit_get_query_results_by_id
执行已保存的工作项查询并获取结果。
参数:
project(string,必填):项目名称queryId(字符串,必填):查询ID(GUID)top(数字,可选):返回的最大结果
存储库工具
mcp_ado_repo_list_repos_by_project
列出项目中的所有存储库。
参数:
project(string,必填):项目名称或ID
mcp_ado_repo_get_repo_by_name_or_id
获取详细的存储库信息。
参数:
project(string,必填):项目名称repositoryNameOrId(字符串,必填):存储库名称或ID
mcp_ado_repo_list_branches_by_repo
列出存储库中的所有分支。
参数:
repositoryId(字符串,必填):存储库IDproject(string,必填):项目名称
mcp_ado_repo_get_branch_by_name
获取特定分支的详细信息。
参数:
repositoryId(字符串,必填):存储库IDbranchName(字符串,必填):分支名称(例如“main”或“refs/heads/main”)project(string,必填):项目名称
mcp_ado_repo_list_pull_requests_by_repo_or_project
列出存储库或项目的拉取请求。
参数:
project(string,必填):项目名称repositoryId(字符串,可选):存储库IDstatus(字符串,可选):PR状态(活动、已完成、放弃、全部)targetRefName(字符串,可选):目标分支筛选器top(数字,可选):要返回的最大PR
mcp_ado_repo_get_pull_request_by_id
获取有关拉取请求的详细信息。
参数:
repositoryId(字符串,必填):存储库IDpullRequestId(number,必填):拉取请求IDproject(string,必填):项目名称
mcp_ado_repo_create_pull_request
创建新的pull请求。
参数:
repositoryId(字符串,必填):存储库IDproject(string,必填):项目名称sourceRefName(string,必填):源分支(例如,'refs/heads/feature')targetRefName(string,必填):目标分支(例如,'refs/heads/main')title(字符串,必填):PR标题description(字符串,可选):PR描述isDraft(布尔值,可选):创建为PR草稿
管道和构建工具
mcp_ado_pipelines_get_builds
为项目生成列表。
参数:
project(string,必填):项目名称definitions(数字数组,可选):按构建定义ID筛选top(数字,可选):返回的最大构建数statusFilter(字符串,可选):状态过滤器(全部、取消、已完成、进行中、未开始、已推迟)resultFilter(字符串,可选):结果筛选器(成功、部分成功、失败、取消)
mcp_ado_pipelines_get_build_status
获取特定版本的状态。
参数:
project(string,必填):项目名称buildId(数字,必填):构建ID
mcp_ado_pipelines_get_build_definitions
列出项目中的生成定义。
参数:
project(string,必填):项目名称name(字符串,可选):按定义名称筛选top(数字,可选):要返回的最大定义数
Wiki工具
mcp_ado_wiki_list_wikis
列出组织或项目中的所有Wiki。
参数:
project(字符串,可选):按项目名称筛选
mcp_ado_wiki_get_page_content
获取wiki页面的内容。
参数:
wikiIdentifier(字符串,必填):Wiki ID或名称project(string,必填):项目名称path(字符串,必填):页面路径(例如,“/Page name”)
mcp_ado_wiki_list_pages
列出wiki中的所有页面。
参数:
wikiIdentifier(字符串,必填):Wiki ID或名称project(string,必填):项目名称
搜索工具
⚠️ 对于本地安装很重要:
代码和Wiki搜索需要 代码搜索 扩展将安装在您的Azure DevOps服务器上。
如果遇到404或API未找到错误,请验证:
- 代码搜索扩展已安装在您的组织中
- 已为您的项目启用扩展
- 您的PAT具有适当的搜索权限
看 安装代码搜索 有关设置说明。
mcp_ado_search_code
在Azure DevOps存储库中搜索代码。
参数:
searchText(字符串,必填):要在代码存储库中搜索的关键字project(字符串数组,可选):按项目名称筛选repository(字符串数组,可选):按存储库名称筛选path(字符串数组,可选):按文件路径筛选branch(字符串数组,可选):按分支名称筛选includeFacets(布尔值,可选):在结果中包含方面(默认值:false)skip(number,可选):分页时要跳过的结果数(默认值:0)top(数字,可选):返回的最大结果数(默认值:5)
mcp_ado_search_wiki
按关键字搜索Azure DevOps维基页面。
参数:
searchText(字符串,必填):要在wiki页面中搜索的关键字project(字符串数组,可选):按项目名称筛选wiki(字符串数组,可选):按wiki名称筛选includeFacets(布尔值,可选):在结果中包含方面(默认值:false)skip(number,可选):分页时要跳过的结果数(默认值:0)top(数字,可选):返回的最大结果数(默认值:10)
mcp_ado_search_workitem
按文本搜索工作项。
参数:
searchText(字符串,必填):要搜索的文本project(字符串,可选):按项目名称筛选top(数字,可选):最大结果(默认值:50)
工作和迭代工具
mcp_ado_work_list_iterations
列出项目中的所有迭代。
参数:
project(string,必填):项目名称
mcp_ado_work_list_team_iterations
列出特定团队的迭代。
参数:
project(string,必填):项目名称team(string,必填):团队名称或ID
🔒 安全功能
此服务器包括多种安全措施:
- WIQL注射预防:所有用户输入在用于WIQL查询之前都已正确转义
- 输入验证:所有参数的类型和格式都经过验证
- 结果限制:默认限制可防止大型结果集导致内存耗尽
- 安全凭证处理:PAT令牌从环境变量加载,从不硬编码
最佳实践
- 永不承诺 你的
.env文件或PAT令牌到版本控制 - 以最小权限使用PAT -只授予需要的东西:
- 只读PAT:仅用于查询和查看数据
- 读/写PAT:创建/更新工作项、添加注释、创建PR所需
- 定期轮换PAT 根据贵组织的安全策略
- 用于生产,考虑使用Azure密钥库或类似的密钥管理
- 网络安全:确保您的本地服务器具有正确的SSL/TLS证书
🔧 发展
可用脚本
# Install dependencies
npm install
# Build the TypeScript project
npm run build
# Watch mode (auto-rebuild on changes)
npm run watch
# Run the server (after building)
npm start
# Development mode (build and run)
npm run dev
项目结构
custom-mcp-server/
├── src/
│ └── index.ts # Main server implementation
├── dist/ # Compiled JavaScript output
├── .env # Environment variables (create this)
├── package.json # Project configuration
├── tsconfig.json # TypeScript configuration
└── README.md # This file
🐛 故障排除
SSL证书问题
如果您在内部部署服务器上遇到自签名证书的SSL证书错误:
仅用于开发:
export NODE_TLS_REJECT_UNAUTHORIZED=0
⚠️ 警告:仅在具有受信任服务器的开发环境中使用此功能。切勿在生产中使用。
更好的解决方案:安装正确的证书链或将您组织的CA证书添加到Node.js受信任的证书中。
连接失败
- 验证您的PAT:直接使用Azure DevOps web界面或REST API进行测试
- 检查URL格式:应该是
https://your-server.com/your-organization - 网络接入:确保您可以访问服务器(尝试
curl或浏览器) - PAT权限:
- 读取操作:工作项(读取)、项目(读取)和构建(读取)
- 写入操作:工作项(读写)、代码(读写
- 验证令牌是否具有所需操作的适当范围
MCP服务器未出现
- 检查路径:确保路径
dist/index.js绝对正确 - 重建:运行
npm run build确保编译了最新代码 - 重新启动客户端:重新启动VS Code、Claude Desktop或MCP客户端
- 检查日志:在客户端的开发人员控制台中查找错误消息
未找到工作项
- 验证工作项是否存在:检查Azure DevOps web界面中的ID
- 检查权限:确保您的PAT可以访问该项目
- WIQL语法:对于自定义查询,请验证WIQL语法是否正确
搜索API问题
如果代码或wiki搜索失败:
-
检查扩展安装:
- 代码搜索扩展必须安装在Azure DevOps服务器上
- 转到“组织设置”>“扩展”以验证安装
- 看 安装代码搜索
-
验证API的可用性:
- 手动测试端点:
curl -u :YOUR_PAT https://your-server.com/your-org/_apis/search/codesearchresults?api-version=7.1-preview.1 - 404错误通常意味着未安装搜索扩展
- 403错误表示权限问题
- 手动测试端点:
-
检查PAT权限:
- 确保您的PAT具有代码搜索的“代码(读取)”权限
- 确保您的PAT具有Wiki搜索的“Wiki(读取)”权限
-
API版本兼容性:
- 搜索API使用版本
7.1-preview.1 - 较旧的内部部署服务器可能需要不同的API版本
- 检查您的服务器版本和Azure DevOps API兼容性
- 搜索API使用版本
📚 资源
🤝 贡献
欢迎投稿!以下是您可以提供帮助的一些方法:
- 🐛 报告错误
- 💡 建议新功能
- 📝 改进文档
- 🔧 提交拉取请求
📝 许可证
麻省理工学院
🙏 致谢
内置:
备注:此服务器专为Azure DevOps内部部署实例而设计。对于Azure DevOps服务(云),类似的配置适用,但请确保您的组织URL采用以下格式 https://dev.azure.com/your-organization.
