Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,20 +52,22 @@ If you encounter issues with tools, need support, or have a feature request, you

### Quick Start

Create `.vscode/mcp.json` in your project and add this configuration. Replace `{organization}` with your Azure DevOps organization name.
Create `.vscode/mcp.json` in your project and add this configuration:

```json
{
"servers": {
"ado-remote-mcp": {
"url": "https://mcp.dev.azure.com/{organization}",
"url": "https://mcp.dev.azure.com",
"type": "http"
}
},
"inputs": []
}
```

The organization-neutral endpoint is recommended because it lets users and agents work across Azure DevOps organizations without reconnecting. To restrict the connection to one organization, use the optional organization-specific URL `https://mcp.dev.azure.com/{organization}` and replace `{organization}` with your Azure DevOps organization name.

See the [remote server configuration documentation](https://learn.microsoft.com/en-us/azure/devops/mcp-server/remote-mcp-server?view=azure-devops#mcpjson-configuration) for more options.

After saving `.vscode/mcp.json`, start the server from the MCP view in VS Code, then run a prompt like `List ADO projects`.
Expand Down
24 changes: 4 additions & 20 deletions server.json
Original file line number Diff line number Diff line change
@@ -1,34 +1,18 @@
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-10-17/server.schema.json",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",

@Novaes Marcelo Novaes (Novaes) Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A possibility here is having remote server.json on the remote server code; and we keep this one for local. lgtm though either way.

"name": "com.microsoft/azure-devops",
"description": "The MCP server for Azure DevOps, bringing the power of Azure DevOps directly to your agents.",
"version": "2.4.0",
"version": "2.10.0",
"title": "Azure DevOps",
"remotes": [
{
"type": "streamable-http",
"url": "https://mcp.dev.azure.com/{organization}",
"variables": {
"organization": {
"description": "Your Azure DevOps organization identifier (e.g., 'contoso', 'fabrikam')",
"isRequired": false
}
}
}
],
"packages": [
{
"registryType": "npm",
"identifier": "@microsoft/azure-devops",
"version": "2.4.0",
"transport": {
"type": "stdio"
}
"url": "https://mcp.dev.azure.com"
}
],
"repository": {
"url": "https://github.com/microsoft/azure-devops-mcp",
"source": "github"
},
"websiteUrl": "https://learn.microsoft.com/en-us/azure/devops/mcp-server/mcp-server-overview"
"websiteUrl": "https://learn.microsoft.com/en-us/azure/devops/mcp-server/remote-mcp-server"
}
35 changes: 35 additions & 0 deletions test/src/server-json.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

import { readFileSync } from "fs";
import { join } from "path";

const SERVER_JSON = join(__dirname, "..", "..", "server.json");

describe("Official MCP Registry manifest", () => {
const manifest = JSON.parse(readFileSync(SERVER_JSON, "utf8"));

it("publishes the hosted server as a remote-only installation", () => {
expect(manifest).toMatchObject({
$schema: "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
name: "com.microsoft/azure-devops",
remotes: [
{
type: "streamable-http",
url: "https://mcp.dev.azure.com",
},
],
repository: {
url: "https://github.com/microsoft/azure-devops-mcp",
source: "github",
},
websiteUrl: "https://learn.microsoft.com/en-us/azure/devops/mcp-server/remote-mcp-server",
});
expect(manifest).not.toHaveProperty("packages");
});

it("uses a valid, current registry metadata version", () => {
expect(manifest.version).toMatch(/^\d+\.\d+\.\d+$/);
expect(manifest.version).not.toBe("2.4.0");
});
});
Loading