Repository navigation
feat(integrations): add Azure DevOps MCP catalog entry - #384
Draft
jpelletier1 wants to merge 1 commit into
Draft
jpelletier1 wants to merge 1 commit into
jpelletier1 wants to merge 1 commit into
Conversation
Add a first-class Azure DevOps integration to the MCP marketplace catalog so Agent Canvas users can connect their Azure DevOps organization directly from the MCP UI. Surfaces the official Microsoft Azure DevOps MCP Server (https://github.com/microsoft/azure-devops-mcp) with two connection options: - Remote (recommended, public preview): Azure DevOps-hosted streamable HTTP endpoint at https://mcp.dev.azure.com/{organization}, authenticated with Microsoft Entra ID (OAuth). The URL is editable so users fill in their organization name. - Local (PAT): stdio via , with the organization passed as a CLI argument and the Personal Access Token supplied through the documented PERSONAL_ACCESS_TOKEN environment variable (base64-encoded). Adds the Azure DevOps logo asset under integrations/icons/ and regenerates the catalog index. Closes OpenHands/agent-canvas#929 Co-authored-by: openhands <openhands@all-hands.dev>
1 of 6 tasks
Open
5 tasks
enyst
reviewed
Oct 4, 2026
enyst
left a comment
Member
There was a problem hiding this comment.
I'm an AI agent (Claude Code, based on Opus 5.5) helping Engel Nyst (@enyst) with project work.
I recommend closing this in favour of #716, which adds the same entry on current main and fixes the problems below. I'm not suggesting a rework of this branch: it is a draft, 142 commits behind main, and conflicts in integrations/catalog-index.js.
Against current main, this head has three problems:
- azure-devops.json#L64: the
organizationargField has notype, and main's schema now requires one. With this file on main, 13 catalog tests fail. The Python model loader also raises, which breakslist_integration_catalog_models()for the whole catalog, not only this entry. - #L32-L35: the OAuth block hard-codes Entra
commonendpoints and the Azure DevOps REST API scope499b84ac-.../.default. The MCP server's protected-resource metadata advertises a different scope,https://mcp.dev.azure.com/.default, under theorganizations/v2.0authority. Microsoft's docs also say Entra doesn't support DCR, so a registered client ID is needed in any case. #716 leaves this to MCP discovery with a registered client and documents that innotes. - #L43: the default URL contains a literal
{organization}, and nothing in the catalog substitutes it. Microsoft documents the basehttps://mcp.dev.azure.com/as valid, with the organization supplied in each tool call. #716 uses that URL.
#716 keeps the same PAT/stdio command (--authentication pat, base64 PERSONAL_ACCESS_TOKEN, organization as a positional argument), which is correct here too.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Agent Canvas had no Azure DevOps entry in the MCP integration marketplace, even though
azure_devopsis already a recognized git/auth provider in the OpenHands codebase (icon, URL parsing, dropdown support). This surfaces the official Microsoft Azure DevOps MCP Server so agents can act on Azure DevOps resources (work items, repos, pipelines, wikis, test plans) directly from the Agent Canvas MCP UI.Summary
integrations/catalog/azure-devops.jsonwith two connection options:https://mcp.dev.azure.com/{organization}, Microsoft Entra ID (OAuth) auth, editable URL so users fill in their organization name.npx -y @azure-devops/mcp --authentication pat, with the organization passed as a CLI argument and the PAT supplied through the documentedPERSONAL_ACCESS_TOKENenv var (base64-encoded:PAT).integrations/icons/azure-devops.svgand pointslogoUrlat it.integrations/catalog-index.js.test_azure_devops_entry_contracttotests/test_catalogs.pylocking in the entry's contract (remote OAuth + local PAT options, logo, env/arg fields); the existing schema/in-sync tests parametrize over the new entry automatically.Issue Number
Closes OpenHands/OpenHands#15769
How to Test
The
azure-devopsentry should appear inlistIntegrationCatalog({ mcp: true })andlistIntegrationCatalog({ oauth: true }). Once consumed by Agent Canvas (dep bump in that repo), it surfaces in the MCP marketplace and the install modal offers the local PAT stdio path.Notes
urlFields), so the remote option usesurlEditable: truewith the documented{organization}placeholder URL — users edit it to their real organization URL in the install dialog, matching the Datadog pattern.@azure-devops/mcp@2.7.0CLI:--authentication patreadsPERSONAL_ACCESS_TOKEN(base64-encoded, used directly as the Basic auth credential) and accepts the organization positional before or after flags. Helper text documents the base64 encoding requirement.authorizationUrl/tokenUrluse the Microsoft Entra common endpoints with the Azure DevOps resource scope (499b84ac-.../.default); the hosted MCP server performs MCP-spec OAuth with Entra. Agent Canvas handles hosted-MCP OAuth via the agent-server backend.This PR was created by an AI agent (OpenHands) on behalf of the OpenHands team.
@jpelletier1 can click here to continue refining the PR