Easily install the Azure DevOps MCP Server for VS Code or VS Code Insiders:
This TypeScript project provides a local MCP server for Azure DevOps, enabling you to perform a wide range of Azure DevOps tasks directly from your code editor.
- 📺 Overview
- 🏆 Expectations
- ⚙️ Supported Tools
- 🔌 Installation & Getting Started
- 🌏 Using Domains
- 🏢 On-Premises / TFS Support
- 📝 Troubleshooting
- 🎩 Examples & Best Practices
- 🙋♀️ Frequently Asked Questions
- 📌 Contributing
The Azure DevOps MCP Server brings Azure DevOps context to your agents. Try prompts like:
- "List my ADO projects"
- "List ADO Builds for 'Contoso'"
- "List ADO Repos for 'Contoso'"
- "List test plans for 'Contoso'"
- "List teams for project 'Contoso'"
- "List iterations for project 'Contoso'"
- "List my work items for project 'Contoso'"
- "List work items in current iteration for 'Contoso' project and 'Contoso Team'"
- "List all wikis in the 'Contoso' project"
- "Create a wiki page '/Architecture/Overview' with content about system design"
- "Update the wiki page '/Getting Started' with new onboarding instructions"
- "Get the content of the wiki page '/API/Authentication' from the Documentation wiki"
The Azure DevOps MCP Server is built from tools that are concise, simple, focused, and easy to use—each designed for a specific scenario. We intentionally avoid complex tools that try to do too much. The goal is to provide a thin abstraction layer over the REST APIs, making data access straightforward and letting the language model handle complex reasoning.
See TOOLSET.md for a comprehensive list.
For the best experience, use Visual Studio Code and GitHub Copilot. See the getting started documentation to use our MCP Server with other tools such as Visual Studio 2022, Claude Code, and Cursor.
- Install VS Code or VS Code Insiders
- Install Node.js 20+
- Open VS Code in an empty folder
After installation, select GitHub Copilot Agent Mode and refresh the tools list. Learn more about Agent Mode in the VS Code Documentation.
This installation method is the easiest for all users of Visual Studio Code.
🎥 Watch this quick start video to get up and running in under two minutes!
In your project, add a .vscode\mcp.json file with the following content:
{
"inputs": [
{
"id": "ado_org",
"type": "promptString",
"description": "Azure DevOps organization name (e.g. 'contoso')"
}
],
"servers": {
"ado": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@azure-devops/mcp", "${input:ado_org}"]
}
}
}🔥 To stay up to date with the latest features, you can use our nightly builds. Simply update your mcp.json configuration to use @azure-devops/mcp@next. Here is an updated example:
{
"inputs": [
{
"id": "ado_org",
"type": "promptString",
"description": "Azure DevOps organization name (e.g. 'contoso')"
}
],
"servers": {
"ado": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@azure-devops/mcp@next", "${input:ado_org}"]
}
}
}Save the file, then click 'Start'.
In chat, switch to Agent Mode.
Click "Select Tools" and choose the available tools.
Open GitHub Copilot Chat and try a prompt like List ADO projects. The first time an ADO tool is executed browser will open prompting to login with your Microsoft account. Please ensure you are using credentials matching selected Azure DevOps organization.
💥 We strongly recommend creating a
.github\copilot-instructions.mdin your project. This will enhance your experience using the Azure DevOps MCP Server with GitHub Copilot Chat. To start, just include "This project uses Azure DevOps. Always check to see if the Azure DevOps MCP server has a tool relevant to the user's request" in your copilot instructions file.
See the getting started documentation to use our MCP Server with other tools such as Visual Studio 2022, Claude Code, and Cursor.
Azure DevOps exposes a large surface area. As a result, our Azure DevOps MCP Server includes many tools. To keep the toolset manageable, avoid confusing the model, and respect client limits on loaded tools, use Domains to load only the areas you need. Domains are named groups of related tools (for example: core, work, work-items, repositories, wiki). Add the -d argument and the domain names to the server args in your mcp.json to list the domains to enable.
For example, use "-d", "core", "work", "work-items" to load only Work Item related tools (see the example below).
{
"inputs": [
{
"id": "ado_org",
"type": "promptString",
"description": "Azure DevOps organization name (e.g. 'contoso')"
}
],
"servers": {
"ado_with_filtered_domains": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@azure-devops/mcp", "${input:ado_org}", "-d", "core", "work", "work-items"]
}
}
}Domains that are available are: core, work, work-items, search, test-plans, repositories, wiki, pipelines, advanced-security
We recommend that you always enable core tools so that you can fetch project level information.
By default all domains are loaded
The Azure DevOps MCP Server supports both Azure DevOps Services (cloud) and on-premises installations (Azure DevOps Server / Team Foundation Server).
This fork carries the changes needed to work against our on-premises TFS
(https://tfs.content.ai/HQ/): full on-premises support plus a PAT
Basic-auth fix for the work-items and pipelines write operations (plain
Bearer auth returns 401 there). Use this repo instead of the public npm
package.
Prerequisites: Node.js 20+, git.
-
Clone and build:
git clone https://github.com/coordinatio/azure-devops-mcp.git cd azure-devops-mcp npm install npm run build -
Create a personal access token (PAT): open
https://tfs.content.ai/HQ/→ your avatar → User settings → Personal access tokens → New Token. Grant the scopes you need (Work Items, Build, Code, Wiki, ...). Keep the token secret — it is your credential. -
Register the server with your MCP-capable agent (VS Code / Copilot, Cursor, Claude, pi, ...). Example (
.vscode/mcp.jsonstyle):{ "servers": { "azure-devops-tfs": { "type": "stdio", "command": "node", "args": ["<path-to-clone>/dist/index.js", "https://tfs.content.ai/HQ/", "--authentication", "env"], "env": { "AZURE_DEVOPS_PAT": "<your PAT>", "AZURE_DEVOPS_IGNORE_SSL_ERRORS": "true" } } } }AZURE_DEVOPS_IGNORE_SSL_ERRORS=trueis required because the TFS certificate chain is not trusted on most workstations.
⚠️ Never commit or share your PAT. Keep it only in the MCP config / environment of your own machine.
В этом форке — изменения, необходимые для работы с нашим on-premise TFS
(https://tfs.content.ai/HQ/): полная поддержка on-premise и фикс
PAT Basic-аутентификации для операций записи work-items и pipelines
(обычный Bearer там даёт 401). Используйте этот репозиторий вместо
публичного npm-пакета.
- Склонируйте и соберите:
git clone https://github.com/coordinatio/azure-devops-mcp.git && cd azure-devops-mcp && npm install && npm run build(нужен Node.js 20+). - Создайте PAT:
https://tfs.content.ai/HQ/→ аватар → User settings → Personal access tokens → New Token; выдайте нужные scope (Work Items, Build, Code, Wiki, ...). Токен никому не передавайте и никуда не коммитьте. - Подключите сервер к вашему агенту с поддержкой MCP — конфиг из примера выше: в
argsпуть кdist/index.jsиз клона и URL TFS, вenv— вашAZURE_DEVOPS_PATиAZURE_DEVOPS_IGNORE_SSL_ERRORS=true(обязательно: сертификат TFS не доверенный).
Вопросы/правки — issues и PR в этом форке.
- Pass the full URL to the on-premises Azure DevOps Server instance in the
organizationargument - Provide the PAT token via the environment variable
AZURE_DEVOPS_PAT - Instruct the mcp server to authenticate via the environment with
-a env
{
"servers": {
"ado_onprem": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@azure-devops/mcp", "https://tfs.company.com/DefaultCollection", "-a", "env"],
"env": {
"AZURE_DEVOPS_PAT": "<PAT>"
}
}
}
}- Optional: You may want to additionally set
AZURE_DEVOPS_IGNORE_SSL_ERRORSin case the server uses internal SSL certificates
{
...
"env": {
"AZURE_DEVOPS_PAT": "<PAT>",
"AZURE_DEVOPS_IGNORE_SSL_ERRORS": "true"
}
...
}The following report summarises a full read-only test run executed against a fairly recent version of an Azure DevOps Server instance.
Legend: ✅ Pass · ⏭️ Skipped (write op or n/a) · 🚫 Not supported on-premises (by design)
| # | Tool | Result | Notes |
|---|---|---|---|
| 1 | core_list_projects |
✅ | |
| 2 | core_list_project_teams |
✅ | |
| 3 | core_get_identity_ids |
✅ | |
| 4 | work_list_iterations |
✅ | |
| 5 | work_list_team_iterations |
✅ | |
| 6 | work_get_team_capacity |
✅ | |
| 7 | work_get_iteration_capacities |
✅ | |
| 8 | work_create_iterations |
⏭️ | Write — not run |
| 9 | work_assign_iterations |
⏭️ | Write — not run |
| 10 | work_update_team_capacity |
⏭️ | Write — not run |
| # | Tool | Result | Notes |
|---|---|---|---|
| 11 | pipelines_get_build_definitions |
✅ | |
| 12 | pipelines_get_builds |
✅ | |
| 13 | pipelines_get_build_status |
✅ | |
| 14 | pipelines_get_build_changes |
✅ | |
| 15 | pipelines_get_build_log |
✅ | |
| 16 | pipelines_get_build_log_by_id |
✅ | |
| 17 | pipelines_get_build_definition_revisions |
✅ | |
| 18 | pipelines_list_runs |
✅ | |
| 19 | pipelines_get_run |
✅ | |
| 20 | pipelines_run_pipeline |
⏭️ | Write — not run |
| 21 | pipelines_update_build_stage |
⏭️ | Write — not run |
| # | Tool | Result | Notes |
|---|---|---|---|
| 22 | repo_list_repos_by_project |
✅ | |
| 23 | repo_get_repo_by_name_or_id |
✅ | |
| 24 | repo_list_branches_by_repo |
✅ | |
| 25 | repo_list_my_branches_by_repo |
✅ | |
| 26 | repo_get_branch_by_name |
✅ | |
| 27 | repo_list_pull_requests_by_repo_or_project |
✅ | |
| 28 | repo_get_pull_request_by_id |
✅ | |
| 29 | repo_list_pull_request_threads |
✅ | |
| 30 | repo_list_pull_request_thread_comments |
✅ | |
| 31 | repo_search_commits |
✅ | |
| 32 | repo_list_pull_requests_by_commits |
✅ | |
| 33 | repo_create_branch |
⏭️ | Write — not run |
| 34 | repo_create_pull_request |
⏭️ | Write — not run |
| 35 | repo_update_pull_request |
⏭️ | Write — not run |
| 36 | repo_update_pull_request_reviewers |
⏭️ | Write — not run |
| 37 | repo_reply_to_comment |
⏭️ | Write — not run |
| 38 | repo_create_pull_request_thread |
⏭️ | Write — not run |
| 39 | repo_update_pull_request_thread |
⏭️ | Write — not run |
| # | Tool | Result | Notes |
|---|---|---|---|
| 40 | search_code |
✅ | |
| 41 | search_wiki |
✅ | |
| 42 | search_workitem |
✅ |
| # | Tool | Result | Notes |
|---|---|---|---|
| 43 | wiki_list_wikis |
✅ | |
| 44 | wiki_get_wiki |
✅ | |
| 45 | wiki_list_pages |
✅ | |
| 46 | wiki_get_page |
✅ | |
| 47 | wiki_get_page_content |
✅ | |
| 48 | wiki_create_or_update_page |
⏭️ | Write — not run |
| # | Tool | Result | Notes |
|---|---|---|---|
| 49 | wit_my_work_items |
✅ | |
| 50 | wit_list_backlogs |
✅ | |
| 51 | wit_list_backlog_work_items |
✅ | |
| 52 | wit_get_work_item |
✅ | |
| 53 | wit_get_work_items_batch_by_ids |
✅ | |
| 54 | wit_list_work_item_comments |
✅ | |
| 55 | wit_list_work_item_revisions |
✅ | |
| 56 | wit_get_work_items_for_iteration |
✅ | |
| 57 | wit_get_work_item_type |
✅ | |
| 58 | wit_get_query |
✅ | |
| 59 | wit_get_query_results_by_id |
✅ | |
| 60 | wit_add_work_item_comment |
⏭️ | Write — not run |
| 61 | wit_update_work_item |
⏭️ | Write — not run |
| 62 | wit_create_work_item |
⏭️ | Write — not run |
| 63 | wit_add_child_work_items |
⏭️ | Write — not run |
| 64 | wit_link_work_item_to_pull_request |
⏭️ | Write — not run |
| 65 | wit_update_work_items_batch |
⏭️ | Write — not run |
| 66 | wit_work_items_link |
⏭️ | Write — not run |
| 67 | wit_work_item_unlink |
⏭️ | Write — not run |
| 68 | wit_add_artifact_link |
⏭️ | Write — not run |
| # | Tool | Result | Notes |
|---|---|---|---|
| 69 | testplan_list_test_plans |
✅ | |
| 70 | testplan_list_test_suites |
✅ | |
| 71 | testplan_list_test_cases |
⏭️ | Skipped — requires active test plan |
| 72 | testplan_show_test_results_from_build_id |
✅ | |
| 73 | testplan_create_test_plan |
⏭️ | Write — not run |
| 74 | testplan_create_test_suite |
⏭️ | Write — not run |
| 75 | testplan_create_test_case |
⏭️ | Write — not run |
| 76 | testplan_add_test_cases_to_suite |
⏭️ | Write — not run |
| 77 | testplan_update_test_case_steps |
⏭️ | Write — not run |
| # | Tool | Result | Notes |
|---|---|---|---|
| 78 | advsec_get_alerts |
🚫 | Returns friendly on-premises not-supported message (by design) |
| 79 | advsec_get_alert_details |
🚫 | Not applicable — no alert IDs available on-premises |
| Category | Count |
|---|---|
| ✅ Passed (read) | 47 |
| ⏭️ Skipped (write / n/a) | 30 |
| 🚫 Not supported on-premises (by design) | 2 |
| Total tools | 79 |
All 47 read-only tools passed against Azure DevOps Server (on-premises).
Advanced Security tools are cloud-only by design and return a descriptive error on-premises.
See the Troubleshooting guide for help with common issues and logging.
Explore example prompts in our Examples documentation.
For best practices and tips to enhance your experience with the MCP Server, refer to the How-To guide.
For answers to common questions about the Azure DevOps MCP Server, see the Frequently Asked Questions.
We welcome contributions! During preview, please file issues for bugs, enhancements, or documentation improvements.
See our Contributions Guide for:
- 🛠️ Development setup
- ✨ Adding new tools
- 📝 Code style & testing
- 🔄 Pull request process
⚠️ Please read the Contributions Guide before creating a pull request.
This project follows the Microsoft Open Source Code of Conduct. For questions, see the FAQ or contact open@microsoft.com.
Thanks to all contributors who make this project awesome! ❤️
Generated with contrib.rocks
Licensed under the MIT License.
Trademarks: This project may include trademarks or logos for Microsoft or third parties. Use of Microsoft trademarks or logos must follow Microsoft’s Trademark & Brand Guidelines. Third-party trademarks are subject to their respective policies.

