December 4th, 2025
compellinglikeheartcelebrate9 reactions

Locking Down MCP: Create a Private Registry on Azure API Center and Enforce It in GitHub Copilot And VS Code

Two Options: Pick Your MCP Registry Adventure 🎒

Option 1: Self-hosted MCP Registry

Option 2: Azure API Center (the easy path)

What We’re Building 🚀

GitHub + Azure API Center + Vscode

Step 1: Create Your Azure API Center Instance

Note:  Please make sure that you are using data endpoint and not the portal endpoint

✅  data endpoint: https://private-mcp-registry.data.eastus.azure-apicenter.ms

🚫 portal endpoint: https://private-mcp-registry.portal.eastus.azure-apicenter.ms

API Center Overview

Step 2 : Register MCP Servers

MCP Discovery Azure API Center
API List on Azure API Center

Step 3: Enable the API Center Portal and Anonymous Access

This is where the fun began for me.

Turn on the API Center portal (so Save + publish works)

Enable anonymous access to the data API

Step 4: Find the Real MCP Registry Endpoint

curl "https://private-mcp-registry.data.eastus.azure-apicenter.ms/workspaces/default/v0.1/servers"
{
"servers": [
{
"server": {
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
"name": "msdocs-mcp-server",
"description": "AI assistant with real-time access to official Microsoft documentation.",
"version": "Original",
"remotes": [
{
"type": "sse",
"url": "https://learn.microsoft.com/api/mcp"
}
]
},
"_meta": {
"io.modelcontextprotocol.registry/official": {
"status": "active",
"createdAt": "2025-11-21T10:57:54.753206+00:00",
"updatedAt": "2025-11-21T10:58:01.1231068+00:00",
"isLatest": true
},
"x-ms-id": "b8c6e77d-f266-4a0a-a341-cc9e97c15280"
}
},
{
"server": {
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
"name": "atlassian-mcp-server",
"description": "Connect to Jira and Confluence for issue tracking and documentation.",
"version": "Original",
"remotes": [
{
"type": "sse",
"url": "https://mcp.atlassian.com/v1/sse"
}
]
},
"_meta": {
"io.modelcontextprotocol.registry/official": {
"status": "active",
"createdAt": "2025-11-21T10:58:13.1934455+00:00",
"updatedAt": "2025-11-21T10:58:18.6788839+00:00",
"isLatest": true
},
"x-ms-id": "f9894e12-64f9-49ca-84a1-d01fcd4278c8"
}
}
],
"metadata": {
"count": 2
}
}


Step 5 : Configure GitHub’s MCP Registry URL

 

GitHub MCP Settings

Behind the scenes, VS Code will now call:

https://private-mcp-registry.data.eastus.azure-apicenter.ms/workspaces/default/v0.1/servers

Step 6: Test in VS Code

vscode Disabled servers
Vscode MCP Server Disabled
Vscode MCP settings
Vscode MCP extensions
Vscode logs

Note: If you don’t see the correct registry being picked up, simply restart VS Code and try again.

Summary

Setting up a private MCP registry with Azure API Center is absolutely possible today, and once you know the correct workspace-scoped endpoint, things work smoothly with GitHub Copilot and VS Code. However, keep in mind that the Azure API Center registry endpoint is public when anonymous access is enabled. Currently, this is acceptable because Copilot integration depends on unauthenticated access. Even so, the ideal long-term approach is a private, authenticated MCP registry endpoint.

This capability isn’t supported yet, but I fully expect GitHub to introduce authentication and private-endpoint support in the near future. Until then, users can continue to rely on the public endpoint model.

Alternatively, if you need full control right now, a self-hosted MCP registry offers the most flexibility. In exchange, you’ll need to implement the v0.1 MCP Registry specification yourself and also ensure that CORS and endpoint behaviors are properly configured

Troubleshooting

Issue Solution
401 Unauthorized Verify you have the correct user role on the Azure API Center resource.
Save + Publish Button Greyed Out Enable anonymous access to the APIs
404 Not found MCP registry endpoint must include the workspaces/default segment in the URL
404 Not Found You are using data endpoint and not the portal endpoint

✅  data endpoint: https://private-mcp-registry.data.eastus.azure-apicenter.ms

🚫 portal endpoint: https://private-mcp-registry.portal.eastus.azure-apicenter.ms

 

Resources

Author

Sr. Solutions Engineer

10 comments

Leave a comment

Your email address will not be published. Required fields are marked *

Sort by :
  • Alex Carlock 2 weeks ago

    I believe I followed this correctly, but when running @mcp, I see no MCP servers listed. Also, when I go to my API center website, select an MCP server, and click to Install in Visual Studio Code, the MCP server is installed, but it has an “!” saying that the MCP server is not allowed. Accessing the data.westeurope.azure-apicenter.ms/workspaces/default/v0.1/servers URL for the site does display JSON list of the MCP servers. The URL listed in GitHub Copilot is the data.westeurope.azure-apicenter.ms/workspaces/default URL. Any thoughts?

    • tjsingh85Microsoft employee Author 1 week ago

      Hey Alex, if you are getting the right json on the workspaces/default/v0.1/servers that means API center is configured correctly. On the GitHub Side if you have configured the policy then restrat your vscode and policy should be working as described in the Blogpost. I am not 100% sure what’s your question is ?

  • Chris Capell

    I’ve been searching for a month for the missing link to get this working and this did the trick. I can’t thank you enough for posting this.

  • W Sz

    Daamn, I thought I could protect the endpoint from totally public accessibility by making it reachable only through a VPN connection.

    • tjsingh85Microsoft employee Author

      The registry can be on a private network as long as the developer’s machine running e.g VS Code can reach it.The registry URL just needs to be reachable from wherever the IDE is running. GitHub’s servers never need to access it.

      • Alessandro Surace

        HI TJ,
        thanks for sharing this interesting post.
        So if I understand it correctly, even if I go for for a self-hosted – private MCP registry, I need to open to internet in anonymous mode to allow GitHub’s servers to access it.
        If this is true, I don’t see currently any advantage in having it self-hosted.
        Can you be please more precise when this connection between GitHub servers and APIC can be completely private?
        Thanks
        Alessandro

        • tjsingh85Microsoft employee Author

          Hey Alessandro,

          What i understood from the product team is that the connection is between Client and the registry. GitHub provides a policy to define a registry URL and enforces that policies on copilot side.
          So self hosting doesnt have any clear advantage. APIC makes it easy and fast to provide V0.1 specificaiton JSON thats important for registry format. Also you can create your own MCP serves and host is on Azure and expose it via APIC.

          • Alessandro Surace

            So, if the connection is between IDE and MCP registry, I don’t need to have the MCP registry open to internet and anonymous to allow Github’s Servers to reach it.
            Is it correct? In such case the private registry will really be private.