此仓库包含一组 .NET 库和一个模型上下文协议(MCP)服务器,用于公开 Azure DevOps 操作。目标是通过统一的 MCP 端点使 Azure DevOps 自动化对 AI 代理可用,这些端点包括常见的任务——创建工作项、管理拉取请求、排队构建、处理工件等。
目前处于预发布阶段。
预览通知
此仓库作为公共预览版发布,以收集社区反馈。API 表面和整体结构仍在形成中,并可能随着开发继续而发生重大变化。未来的更新可能会引入破坏性更改而不提前通知,今天可用的功能可能会被重构或移除。
如果您选择在预览阶段在此项目上进行构建,请准备好定期与仓库同步并调整您的代码以适应这些变化。
| SonarCloud 静态分析 |
|---|
该仓库包含多个 C# 项目,封装了 Microsoft Azure DevOps SDK 和 REST API。每个 Azure DevOps 标签——看板、存储库、管道、工件等——都有一个位于 /src/ 下的项目,提供简化客户端接口。这些薄包装由 Dotnet.AzureDevOps.Mcp.Server 使用来呈现模型上下文协议(MCP)工具。虽然大多数调用转发到官方 SDK 或必要时的 REST 端点,但这一层保持 MCP 服务器与 Azure DevOps 解耦,以便它可以独立发展或在未来更换实现。
解决方案组织为一个多项目工作区,针对 .NET 10。Azure DevOps 的每个服务区域都有自己的客户端库:
Dotnet.AzureDevOps.Mcp.Server 项目将这些库汇集在一起,并作为 MCP 工具公开。服务器实现为控制台应用程序,使用 ModelContextProtocol 包托管 ASP.NET Core Web 服务器。您可以直接运行它,也可以根据您偏好的托管环境进行调整——例如容器镜像、Azure Functions 或 Windows 服务。
MCP 服务器遵循模型上下文协议规范,在 /mcp 端点使用 HTTP 上的服务器发送事件(SSE)提供 MCP 工具。AI 助手可以在运行时通过连接到此端点发现可用工具,并使用结构化的函数调用执行它们。
集成测试对每个客户端进行了真实 Azure DevOps 组织的测试。另一个测试套件使用 Semantic Kernel 验证端到端代理交互,证明 LLM 可以自动调用发布的工具。
Dotnet.AzureDevOps.sln – 将所有项目链接起来的解决方案文件。# 构建并运行
dotnet build
dotnet run --project src/Dotnet.AzureDevOps.Mcp.Server
# 在容器中构建并运行
docker build -t azure-devops-mcp-server .
docker run -p 5050:5050 azure-devops-mcp-server
对于开发和测试:
dotnet build
dotnet test
dotnet run --project src/Dotnet.AzureDevOps.Mcp.Server
服务器默认监听 http://localhost:5050。
MCP 端点在 /mcp (http://localhost:5050/mcp) 可用。
访问 /health 来检查其是否正在运行。
end-to-end 测试 展示了如何使用 Semantic Kernel 代理调用 MCP 服务器发布的工具。一个新的控制台应用程序可以重现相同的流程:
MCP_SERVER_URLOPENAI_API_KEYOPENAI_MODELdotnet new console -n MyMcpClient
cd MyMcpClient
dotnet add package Microsoft.SemanticKernel --version 1.59.0
dotnet add package Microsoft.SemanticKernel.Agents.Core --version 1.59.0
dotnet add package ModelContextProtocol-SemanticKernel --version 0.3.0-preview-01
替换 Program.cs 为以下内容,并将您的 MCP 服务器 URL 和 OpenAI 凭据配置为环境变量:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using ModelContextProtocol.SemanticKernel.Extensions;
var serverUrl = Environment.GetEnvironmentVariable("MCP_SERVER_URL")!;
var openAiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
var model = Environment.GetEnvironmentVariable("OPENAI_MODEL")!;
// 注意:MCP_SERVER_URL 应包括 /mcp 端点路径
// 示例:"http://localhost:5050/mcp"
IKernelBuilder builder = Kernel.CreateBuilder();
builder.Services.AddOpenAIChatCompletion("openai", model, openAiKey);
var kernel = builder.Build();
await kernel.Plugins.AddMcpFunctionsFromSseServerAsync("MyMcpServer", serverUrl);
var settings = new OpenAIPromptExecutionSettings
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
var agent = new ChatCompletionAgent
{
Name = "McpTester",
Kernel = kernel,
Instructions = "使用可用工具回答用户的问题。",
Arguments = new KernelArguments(settings)
};
await foreach (var update in agent.InvokeAsync(
"调用 echo 工具,传入文本 \"Hello MCP!\" 并返回原始输出。"))
{
Console.WriteLine(update.Message);
}
运行此程序会打印 Hello MCP!,一旦代理调用了您的 MCP 服务器暴露的 echo 工具。
Azure DevOps MCP 服务器支持两种部署方法:
直接在您的机器上运行服务器进行开发和测试:
# 直接构建并运行
dotnet run --project src/Dotnet.AzureDevOps.Mcp.Server
# 或使用提供的脚本
./run-local.sh # Linux/macOS
run-local.cmd # Windows
服务器默认监听 http://localhost:5050。
MCP 端点在 /mcp (http://localhost:5050/mcp) 可用。
访问 /health 来检查其是否正在运行。
在 Docker 容器中运行服务器以实现一致且隔离的部署:
# 构建 Docker 镜像
docker build -t azure-devops-mcp-server .
# 运行容器
docker run -d \
--name azure-devops-mcp-server \
-p 5050:5050 \
-e ASPNETCORE_ENVIRONMENT=Production \
azure-devops-mcp-server
# 或使用提供的脚本
./run-docker.sh # Linux/macOS
run-docker.cmd # Windows
容器化的服务器在 http://localhost:5050 可用。
MCP 端点在 /mcp (http://localhost:5050/mcp) 可用。
两种部署方法都支持相同的配置选项:
设置从 appsettings.json 和以 MCP_ 为前缀的环境变量中读取。
MCP_McpServer__Port=5050 - 服务器端口(默认:5050)MCP_McpServer__LogLevel=Information - 日志级别MCP_McpServer__EnableOpenTelemetry=true - 启用遥测MCP_McpServer__EnableApplicationInsights=false - 启用应用洞察ASPNETCORE_ENVIRONMENT=Production - ASP.NET Core 环境为了连接到 Azure DevOps 服务,请设置这些环境变量:
AZURE_DEVOPS_ORG - 您的 Azure DevOps 组织名称(例如,“mycompany”)AZURE_DEVOPS_PAT - 具有适当权限的个人访问令牌AZURE_DEVOPS_SEARCH_ENDPOINT(可选)- 自定义搜索端点 URL示例:
export AZURE_DEVOPS_ORG=mycompany
export AZURE_DEVOPS_P