Azure DevOps MCP服务器
模型上下文协议(MCP)服务器,提供人工智能驱动的工具,用于与Azure DevOps存储库、拉取请求和工作项进行交互。内置FastMCP,可与Claude和其他兼容MCP的AI助手无缝集成。
特性
- 项目发现 -列出所有可访问的Azure DevOps项目
- 库管理 -解析存储库ID,列出分支
- 拉取请求操作 -列出、创建、检查和评论PR
- 工作项管理 -创建PBI、Bug和自定义工作项
- 差异分析 -获取原始和修改内容的完整统一差异
- 代码审查 -内置审核策略和自动审核功能
- PR工作项链接 -将拉取请求链接到工作项
- 自动发现 -自动工具和资源注册
- 可扩展架构 -添加新功能的简单模式
项目结构
AzureDevopsMcp/
├── src/
│ ├── config.py # Global MCP instance & configuration
│ ├── client.py # HTTP client for Azure DevOps API
│ ├── server.py # Server entry point
│ ├── utils/
│ │ └── helpers.py # Helper functions (repo resolution, blob fetching)
│ ├── tools/
│ │ ├── __init__.py # Auto-import tool modules
│ │ ├── repository.py # Repository & project tools
│ │ ├── pull_requests.py # Pull request tools
│ │ └── work_items.py # Work item tools (PBI, Bug, etc.)
│ └── policies/
│ ├── __init__.py # Auto-import policy modules
│ └── review_policy.py # Code review policy resource
├── main.py # Application entry point
├── requirements.txt # Python dependencies
├── .env # Environment configuration
└── README.md设置
1.克隆和安装
git clone
cd AzureDevopsMcp
pip install -r requirements.txt2.配置环境
创建一个 .env 项目根目录中的文件:
ADO_ORG_URL=https://dev.azure.com/YourOrganization
ADO_PROJECT=YourDefaultProject
ADO_PAT=your_personal_access_token_here获取个人访问令牌(PAT):
- 转到Azure DevOps→ 用户设置→ 个人访问令牌
- 创建具有权限的新令牌:
- Code (Read & Write) -用于存储库和PR操作 - Pull Request Threads (Read & Write) -征求公关意见 - Work Items (Read & Write) -用于创建/更新工作项
- 将令牌复制到您的
.env文件
3.运行服务器
python main.py服务器将在stdio模式下运行,准备接受MCP协议请求。
可用工具
项目和存储库工具
list_projects() -> List[Dict]
列出您有权访问的所有Azure DevOps项目。
退货: 包含名称、id、描述和状态的项目列表。
用途: 在创建工作项之前调用此命令以发现可用项目。
______________________________________________________________________
resolve_repo_id(repo_key: str, project: str = None) -> str
将存储库名称转换为其GUID标识符。
参数:
repo_key-存储库名称(例如“my api”)或GUID
退货: 存储库GUID
______________________________________________________________________
list_branches(repo_id: str, filter_name: str = None, top: int = 100) -> List[Dict]
列出存储库中的分支。
参数:
repo_id-存储库GUID来自resolve_repo_idfilter_name-可选的按名称前缀过滤(例如“feature/”)top-要返回的最大分支数
退货: 具有名称、全名、isDefault、创建者、objectId的分支列表
______________________________________________________________________
拉取请求工具
list_pull_requests(repo_id: str, status: str = "active", top: int = 10) -> List[Dict]
列出存储库的拉取请求。
参数:
repo_id-存储库GUIDstatus-筛选器:"active","completed","abandoned"top-PR的最大数量
______________________________________________________________________
get_pull_request(repo_id: str, pr_id: int) -> str
检索特定拉取请求的详细信息。
______________________________________________________________________
create_pull_request(repo_id: str, source_branch: str, target_branch: str, title: str, description: str = None, work_item_ids: List[int] = None) -> Dict
创建新的pull请求。
参数:
repo_id-存储库GUIDsource_branch-完整的参考名称(例如,“参考/头部/特征/我的特征”)target_branch-全名(例如,“refs/heads/main”)title-PR标题description-可选PR描述work_item_ids-要链接的工作项ID的可选列表
退货: 创建了PR详细信息,包括id、url、标题、状态
______________________________________________________________________
set_pr_description(repo_id: str, pr_id: int, description: str) -> Dict
更新现有拉取请求的描述。
LLM说明: 描述应包括结构化格式,包括:
- 带有要点的摘要部分
- 带有复选框的测试计划部分
- 基于差异分析自动检测测试和文档的复选框
______________________________________________________________________
get_pull_request_full_diff(repo_id: str, pr_id: int) -> Dict
获取PR的完整差异和所有评论。
______________________________________________________________________
add_pull_request_comment(repo_id: str, pr_id: int, comment: str, file_path: str = None, line: int = None) -> str
向拉取请求添加注释(顶级或内联)。
______________________________________________________________________
link_pr_to_work_item(repo_id: str, pr_id: int, work_item_id: int, project: str) -> Dict
将拉取请求链接到工作项。
______________________________________________________________________
工作项工具
list_work_item_types(project: str) -> List[Dict]
列出项目中所有可用的工作项类型。
用途: 调用此命令可发现可用的工作项类型(Bug、PBI、Task等)。
______________________________________________________________________
list_area_paths(project: str, depth: int = 3) -> List[Dict]
列出项目中用于组织工作项的所有区域路径。
______________________________________________________________________
list_iteration_paths(project: str, depth: int = 3) -> List[Dict]
列出项目中的所有迭代路径(冲刺)。
______________________________________________________________________
create_product_backlog_item(project: str, title: str, assigned_to: str, ...) -> Dict
创建新的产品待办列表项(PBI)。
所需参数:
project-项目名称(使用list_projects()第一)title-PBI标题assigned_to-受让人的电子邮件或显示姓名
可选参数:
description-HTML描述acceptance_criteria-HTML接受标准area_path-组织区域路径iteration_path-Sprint任务priority-优先级(1-4)tags-分号分隔标签
______________________________________________________________________
create_bug(project: str, title: str, assigned_to: str, description: str, steps_to_reproduce: str, expected_behavior: str, ...) -> Dict
创建新的Bug工作项(使用带有必填字段的自定义“Bug”类型)。
所需参数:
project-项目名称title-Bug标题assigned_to-受让人description-Bug描述steps_to_reproduce-重现错误的步骤expected_behavior-预期的应用行为
可选参数:
environment-环境(默认值:“Dev”)area_path,iteration_path,priority,tags
______________________________________________________________________
create_work_item(project: str, work_item_type: str, title: str, assigned_to: str, ...) -> Dict
创建任何类型的工作项。最灵活的自定义工作项类型工具。
参数:
work_item_type-来自的确切类型名称list_work_item_types()custom_fields-自定义字段引用名称到值的骰子
自定义字段示例:
create_work_item(
project="MyProject",
work_item_type="Bugs",
title="Fix login error",
assigned_to="john@company.com",
custom_fields={
"Custom.Environment": "Dev",
"Custom.Stepstoreproduce": "1. Go to login\n2. Click submit",
"Custom.Expectedappbehavior": "User should be logged in"
}
)______________________________________________________________________
资源
policy://review -代码审查政策
官方代码审查标准和PR审查期望。
用途: LLM应在执行自动代码审查之前加载此资源。
扩展服务器
添加新工具
第一步: 在中创建工具模块 src/tools/
# src/tools/my_tools.py
from ..config import mcp, ADO_ORG_URL
from ..client import client
@mcp.tool()
def my_new_tool(param: str) -> dict:
"""Tool description for LLM."""
# Implementation
pass第二步: 注册于 src/tools/__init__.py
from . import my_tools # noqa: F401添加新资源
第一步: 在中创建资源模块 src/policies/
# src/policies/my_policy.py
from ..config import mcp
@mcp.resource(uri="policy://my-policy", name="My Policy", description="...")
def get_my_policy() -> str:
return "Policy content..."第二步: 注册于 src/policies/__init__.py
建筑
- 全局MCP实例 (
src/config.py)-所有模块共享单个FastMCP实例 - 自动发现 -模块通过导入进行自我注册
__init__.py - 关注点分离 -工具、资源、实用程序和配置完全分开
- 类型安全 -完整的类型提示,以获得更好的IDE支持和错误检查
贡献
欢迎投稿!添加新功能时,请遵循现有的代码结构和模式。
