{"id":1733,"date":"2025-12-04T15:06:03","date_gmt":"2025-12-04T15:06:03","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/all-things-azure\/?p=1733"},"modified":"2025-12-05T08:27:20","modified_gmt":"2025-12-05T08:27:20","slug":"locking-down-mcp-create-a-private-registry-on-azure-api-center-and-enforce-it-in-github-copilot-and-vs-code","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/all-things-azure\/locking-down-mcp-create-a-private-registry-on-azure-api-center-and-enforce-it-in-github-copilot-and-vs-code\/","title":{"rendered":"Locking Down MCP: Create a Private Registry on Azure API Center and Enforce It in GitHub Copilot And VS Code"},"content":{"rendered":"<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<p id=\"1982\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Ever since MCP launched,\u00a0<em class=\"wg\">every<\/em> customer has asked the same thing: <strong class=\"vk kw\">\u201cHow does a private MCP registry actually work, and how do we configure it for our enterprise?\u201d.<\/strong><\/p>\n<p id=\"d917\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">So today, on a snowy, freezing Friday in Zurich, I grabbed a coffe, opened the GitHub docs, dove into Azure API Center portal, and decided to write the blog I wish already existed.A few hours (and quite a few sighs) later, here I am. The docs are great but they definitely don\u2019t cover all the tiny quirks, hidden settings, and errors you\u2019ll hit along the way.<\/p>\n<h4 id=\"c312\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\"><strong>What did the journey look like?<\/strong><\/h4>\n<ul class=\"\">\n<li id=\"7f85\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\ud83d\udcda Reading way too many docs<\/li>\n<li id=\"59f6\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\u2705 A data API that\u00a0<em class=\"wg\">seemed<\/em>\u00a0to work<\/li>\n<li id=\"baef\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\ud83d\udd12 Mysterious\u00a0<strong class=\"vk kw\">401 Unauthorized<\/strong>\u00a0responses<\/li>\n<li id=\"b6de\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\ud83e\uddca A\u00a0<strong class=\"vk kw\">Save + publish<\/strong>\u00a0button permanently frozen in \u201cNope\u201d mode<\/li>\n<li id=\"f8e8\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\ud83d\udeab\u00a0<strong class=\"vk kw\">404 Not Found<\/strong>\u00a0and VS Code insisting the registry \u201cdoes not support version v0.1\u201d<\/li>\n<li id=\"556e\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\ud83e\udd2f And finally\u2026 the magical, undocumented discovery of\n<code class=\"fc wp wq wr ws b\"><strong class=\"vk kw\">\/workspaces\/default\/v0.1\/servers<\/strong><\/code><\/li>\n<\/ul>\n<p id=\"0410\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">This post is the guide I desperately needed:\u00a0<strong class=\"vk kw\">a clean, step-by-step setup plus every weird error and how to fix it.\u00a0<\/strong>Enjoy!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 id=\"ec21\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">Two Options: Pick Your MCP Registry Adventure \ud83c\udf92<\/h2>\n<p id=\"e8b1\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">To make an MCP registry that GitHub Copilot can actually talk to, you need two non-negotiables:<\/p>\n<ul class=\"\">\n<li id=\"59c8\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">A proper MCP Registry endpoint<\/strong>\u00a0that follows the v0.1 specification<\/li>\n<li id=\"e3d8\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">CORS enabled<\/strong>\u00a0so Copilot\/VS Code can reach it from the browser environment<\/li>\n<\/ul>\n<p id=\"9edc\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\"><span style=\"font-size: 14pt;\">And you\u2019ve got\u00a0two ways\u00a0to get there:<\/span><\/p>\n<h2 id=\"5bc2\" class=\"wz xa rc bg xb kx xn ky la lb xo lc le ig xp ih ik lh xq li ll lm xr ln lq xh bl\" data-selectable-paragraph=\"\">Option 1: Self-hosted MCP Registry<\/h2>\n<p id=\"0fcb\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">Spin up your own service that fully implements the\u00a0<strong class=\"vk kw\">v0.1 MCP Registry spec<\/strong> and handles all the CORS requirements.Great for full control but not so great if you\u2019re not in the mood to maintain yet another service.<\/p>\n<h2 id=\"7bea\" class=\"wz xa rc bg xb kx xn ky la lb xo lc le ig xp ih ik lh xq li ll lm xr ln lq xh bl\" data-selectable-paragraph=\"\">Option 2: Azure API Center (the easy path)<\/h2>\n<p id=\"febd\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">Azure API Center comes with:<\/p>\n<ul class=\"\">\n<li id=\"1102\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\u2714\ufe0f Built-in support for the\u00a0<strong class=\"vk kw\">v0.1 MCP Registry spec<\/strong><\/li>\n<li id=\"5b06\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\u2714\ufe0f CORS configured out of the box<\/li>\n<li id=\"bf68\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\u2714\ufe0f A nice UI for managing MCP servers<\/li>\n<li id=\"79d8\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">\u2714\ufe0f Zero infrastructure to run yourself<\/li>\n<\/ul>\n<p id=\"34e9\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">So for this blog (and for our sanity),\u00a0<strong class=\"vk kw\">we\u2019re going with Azure API Center<\/strong>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 id=\"a4be\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">What We\u2019re Building \ud83d\ude80<\/h2>\n<p id=\"9e49\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">We\u2019re setting up a\u00a0<strong class=\"vk kw\">private MCP registry<\/strong>\u00a0using\u00a0<strong class=\"vk kw\">Azure API Center<\/strong>\u00a0and wiring it so\u00a0<strong class=\"vk kw\">GitHub Copilot<\/strong>\u00a0and\u00a0<strong class=\"vk kw\">VS Code<\/strong>\u00a0only recognize and use the MCP servers we list there.<\/p>\n<p id=\"6f9d\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">In other words:<\/p>\n<ul class=\"\">\n<li id=\"86e7\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">Azure API Center<\/strong>\u00a0becomes our private MCP registry<\/li>\n<li id=\"c54a\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">GitHub Copilot + VS Code<\/strong>\u00a0automatically discover the approved MCP servers<\/li>\n<li id=\"d92a\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">Only<\/strong>\u00a0those servers are allowed to run on the client<\/li>\n<\/ul>\n<figure class=\"xv xw xx xy xz ya xs xt paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<section class=\"section section--body\">\n<div class=\"section-divider\"><\/div>\n<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\">\n<figure class=\"graf graf--figure\"><img decoding=\"async\" class=\"graf-image aligncenter\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1600\/1*VZLXH0EjIo56k0Ui6SLhpg.png\" alt=\"GitHub + Azure API Center + Vscode\" width=\"1536\" height=\"1024\" data-image-id=\"1*VZLXH0EjIo56k0Ui6SLhpg.png\" data-width=\"1536\" data-height=\"1024\" \/><\/figure>\n<\/div>\n<\/div>\n<\/section>\n<\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 id=\"176b\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">Step 1: Create Your Azure API Center Instance<\/h2>\n<p id=\"af69\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">In the Azure portal:<\/p>\n<ol class=\"\">\n<li id=\"b414\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Search for\u00a0<strong class=\"vk kw\">\u201cAPI Center\u201d and\u00a0<\/strong>Click\u00a0<strong class=\"vk kw\">+ Create<\/strong>.<\/li>\n<li id=\"69e9\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Fill in:<\/li>\n<\/ol>\n<ul class=\"\">\n<li id=\"9999\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">Subscription \/ Resource group<\/strong>: choose your usual.<\/li>\n<li id=\"84f8\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">Name<\/strong>: e.g.\u00a0<code class=\"fc wp wq wr ws b\">private-mcp-registry<\/code>.<\/li>\n<li id=\"5e0c\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">Region<\/strong>: e.g.\u00a0<code class=\"fc wp wq wr ws b\">East US<\/code>.<\/li>\n<li id=\"acad\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">SKU<\/strong>: Free\/Standard (Free is fine to experiment).<\/li>\n<\/ul>\n<p id=\"24f5\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">\u00a0 \u00a0 \u00a0 3. Click <strong class=\"vk kw\">Review + create<\/strong>\u00a0\u2192\u00a0<strong class=\"vk kw\">Create<\/strong>.<\/p>\n<p id=\"5dcb\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Once deployment is done, open the resource and note the\u00a0<strong class=\"vk kw\">data-plane endpoint<\/strong>, which looks like:<\/p>\n<p id=\"a893\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\"><code class=\"fc wp wq wr ws b\"><a class=\"ah pb\" href=\"https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms<\/a><\/code><\/p>\n<p data-selectable-paragraph=\"\">Note:\u00a0 Please make sure that you\u00a0are using data endpoint and not the portal endpoint<\/p>\n<p>\u2705\u00a0 data endpoint: https:\/\/private-mcp-registry.<em><strong>data<\/strong><\/em>.eastus.azure-apicenter.ms<\/p>\n<p>\ud83d\udeab portal endpoint: https:\/\/private-mcp-registry.<em><strong>portal<\/strong><\/em>.eastus.azure-apicenter.ms<\/p>\n<\/div>\n<\/div>\n<div class=\"ya\">\n<div class=\"ac cr\">\n<div class=\"uo cp up co uq cn pf yh pg yi gj bi\">\n<figure class=\"xv xw xx xy xz ya yk yl paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt yj\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*24AF1-bzlNjnhcEeqB66mQ.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*24AF1-bzlNjnhcEeqB66mQ.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*24AF1-bzlNjnhcEeqB66mQ.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*24AF1-bzlNjnhcEeqB66mQ.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*24AF1-bzlNjnhcEeqB66mQ.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*24AF1-bzlNjnhcEeqB66mQ.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:2000\/format:webp\/1*24AF1-bzlNjnhcEeqB66mQ.png 2000w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 1000px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*24AF1-bzlNjnhcEeqB66mQ.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*24AF1-bzlNjnhcEeqB66mQ.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*24AF1-bzlNjnhcEeqB66mQ.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*24AF1-bzlNjnhcEeqB66mQ.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*24AF1-bzlNjnhcEeqB66mQ.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*24AF1-bzlNjnhcEeqB66mQ.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:2000\/1*24AF1-bzlNjnhcEeqB66mQ.png 2000w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 1000px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:2000\/1*24AF1-bzlNjnhcEeqB66mQ.png\" alt=\"API Center Overview\" width=\"1000\" height=\"361\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<p id=\"864f\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\"><em class=\"wg\">This host is where the MCP registry will live (we\u2019ll refine the path later).<\/em><\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cr ne wt wu wv\" role=\"separator\"><\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 id=\"53f8\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">Step 2 : Register MCP Servers<\/h2>\n<p id=\"0341\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">API Center gives you two options:<\/p>\n<p class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">1\ufe0f\u20e3 Create and expose\u00a0<strong class=\"vk kw\">your own MCP server<\/strong>\u00a0through API Center, or<\/p>\n<p class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">2\ufe0f\u20e3 Use one of the\u00a0<strong class=\"vk kw\">pre-listed MCP servers<\/strong>\u00a0available in the Discovery section.<\/p>\n<p id=\"f24e\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">If you want to register your own MCP server, go to\u00a0<strong class=\"vk kw\">Assets \u2192 APIs \u2192 Register an API<\/strong>, fill in the details, and create a new\u00a0<strong class=\"vk kw\">MCP-type API<\/strong>.<\/p>\n<p id=\"202d\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Or, if you prefer the easier path, you can use the\u00a0<strong class=\"vk kw\">preview Discovery feature<\/strong>, which lets you add ready-made MCP servers to your registry with a single click. Just go to\u00a0<strong class=\"vk kw\">Discover \u2192 MCP (preview)<\/strong> on the left panel.<\/p>\n<figure class=\"xv xw xx xy xz ya xs xt paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt ym\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*_RbZaiKYP4SVWk_eZMRZ1w.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*_RbZaiKYP4SVWk_eZMRZ1w.png\" alt=\"MCP Discovery Azure API Center\" width=\"700\" height=\"565\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"bf31\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">For this blog, I added\u00a0<strong class=\"vk kw\">\u201cMicrosoft Docs\u201d<\/strong>\u00a0and\u00a0<strong class=\"vk kw\">\u201cAtlassian\u201d<\/strong>. Once saved, these MCP servers become part of your registry inventory, and you can view them under\u00a0<strong class=\"vk kw\">Assets \u2192 APIs<\/strong>. For lifecycle management, you can also assign each server to an environment such as production, testing, or development.<\/p>\n<figure class=\"xv xw xx xy xz ya xs xt paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt yn\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*30xrOU-5ph93iiWsMRP2Kg.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*30xrOU-5ph93iiWsMRP2Kg.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*30xrOU-5ph93iiWsMRP2Kg.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*30xrOU-5ph93iiWsMRP2Kg.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*30xrOU-5ph93iiWsMRP2Kg.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*30xrOU-5ph93iiWsMRP2Kg.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*30xrOU-5ph93iiWsMRP2Kg.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*30xrOU-5ph93iiWsMRP2Kg.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*30xrOU-5ph93iiWsMRP2Kg.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*30xrOU-5ph93iiWsMRP2Kg.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*30xrOU-5ph93iiWsMRP2Kg.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*30xrOU-5ph93iiWsMRP2Kg.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*30xrOU-5ph93iiWsMRP2Kg.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*30xrOU-5ph93iiWsMRP2Kg.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*30xrOU-5ph93iiWsMRP2Kg.png\" alt=\"API List on Azure API Center\" width=\"700\" height=\"275\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cr ne wt wu wv\" role=\"separator\"><\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 id=\"ef8a\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">Step 3: Enable the API Center Portal and Anonymous Access<\/h2>\n<h3 id=\"3495\" class=\"yo xa rc bg xb yp yq yr la ys yt yu le vt yv yw yx vx yy yz za wb zb zc zd ze bl\" data-selectable-paragraph=\"\">This is where the fun began for me.<\/h3>\n<p id=\"2f54\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">as per GitHub docs,<em class=\"wg\">\u00a0\u201cto ensure GitHub Copilot can fetch your registry, in the visibility settings of your API Center, allow anonymous access\u201d<\/em>.I expected a neat \u201cAllow anonymous access\u201d checkbox somewhere obvious. Instead, I got:<\/p>\n<ul class=\"\">\n<li id=\"277a\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">A\u00a0<strong class=\"vk kw\">greyed-out \u201cSave + publish\u201d<\/strong>\u00a0button and<\/li>\n<li id=\"2990\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\">A\u00a0<code class=\"fc wp wq wr ws b\">\/v0.1\/servers<\/code>\u00a0endpoint that always returned\u00a0<strong class=\"vk kw\">401<\/strong>.<\/li>\n<\/ul>\n<p id=\"554d\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Here\u2019s the actual order that works.<\/p>\n<h3 id=\"0eaf\" class=\"yo xa rc bg xb yp yq yr la ys yt yu le vt yv yw yx vx yy yz za wb zb zc zd ze bl\" data-selectable-paragraph=\"\">Turn on the API Center portal (so Save + publish works)<\/h3>\n<ol class=\"\">\n<li id=\"a923\" class=\"vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">In your API Center resource, in the left menu, find\u00a0<strong class=\"vk kw\">\u201cAPI Center portal\u201d\u2192 Settings<\/strong>.<\/li>\n<li id=\"9e14\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Go to the\u00a0<strong class=\"vk kw\">Identity provider<\/strong>\u00a0tab.<\/li>\n<li id=\"6cd8\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Click\u00a0<strong class=\"vk kw\">Start set up<\/strong>\u00a0(or\u00a0<strong class=\"vk kw\">Quick setup<\/strong>).<\/li>\n<li id=\"0c72\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Complete the wizard<\/li>\n<li id=\"6560\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Click\u00a0<strong class=\"vk kw\">Save + publish<\/strong>.<\/li>\n<\/ol>\n<p id=\"277c\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Until you do this, the global\u00a0<strong class=\"vk kw\">Save + publish<\/strong>\u00a0button on the portal settings tends to be disabled or useless.<\/p>\n<h3 id=\"b02b\" class=\"yo xa rc bg xb yp yq yr la ys yt yu le vt yv yw yx vx yy yz za wb zb zc zd ze bl\" data-selectable-paragraph=\"\">Enable anonymous access to the data API<\/h3>\n<ol class=\"\">\n<li id=\"edc7\" class=\"vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Still under\u00a0<strong class=\"vk kw\">API Center portal \u2192 Settings<\/strong>, go to the\u00a0<strong class=\"vk kw\">API visibility<\/strong>\u00a0tab.<\/li>\n<li id=\"dedf\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Look for\u00a0<strong class=\"vk kw\">\u201cAnonymous access\u201d<\/strong>.<\/li>\n<li id=\"7f82\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Turn it\u00a0<strong class=\"vk kw\">On<\/strong>.<\/li>\n<li id=\"cbd5\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Click\u00a0<strong class=\"vk kw\">Save + publish<\/strong>\u00a0again.<\/li>\n<\/ol>\n<p id=\"274a\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">What this does:<\/p>\n<ul>\n<li class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\">It allows <strong class=\"vk kw\">unauthenticated read access<\/strong>\u00a0to the\u00a0<strong class=\"vk kw\">data plane API<\/strong>, so your MCP clients (GitHub, VS Code) can read the registry without dealing with Azure AD tokens.<\/li>\n<li id=\"fc6b\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\">If anonymous access is off, you\u2019ll see\u00a0<strong class=\"vk kw\">401 Unauthorized<\/strong>\u00a0when you hit the registry endpoints.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cr ne wt wu wv\" role=\"separator\"><\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 id=\"178e\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">Step 4: Find the Real MCP Registry Endpoint<\/h2>\n<p id=\"a20e\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">This was the \u201caha!\u201d moment.At first, I assumed the registry was at: <span id=\"a52c\" class=\"zi xa rc ws b bh zj zk m zl zm\" data-selectable-paragraph=\"\">https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/v0.1\/servers<\/span><\/p>\n<p id=\"1db6\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Calling that gave me: <strong>&#8220;<span id=\"eeed\" class=\"zi xa rc ws b bh zj zk m zl zm\" data-selectable-paragraph=\"\"><span class=\"hljs-variable.constant\">HTTP<\/span>\/<span class=\"hljs-number\">1.1<\/span> <span class=\"hljs-number\">404<\/span> <span class=\"hljs-title.class\">Not<\/span> <span class=\"hljs-title.class\">Found&#8221; <\/span><\/span><\/strong>and VS Code logs like: <em class=\"rc\">The service at\u00a0<\/em><a class=\"ah pb\" href=\"https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/\" target=\"_blank\" rel=\"noopener ugc nofollow\"><em class=\"rc\">https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms<\/em><\/a><em class=\"rc\">\u00a0does not support version v0.1. Service returned status 404.<\/em><\/p>\n<p id=\"5093\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">The missing piece:\u00a0<strong class=\"vk kw\">the registry endpoints live under a workspace<\/strong>.<\/p>\n<p id=\"1237\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">API Center includes a default workspace, and your MCP registry endpoint\u00a0<strong class=\"vk kw\">must<\/strong>\u00a0include the\u00a0<code class=\"fc wp wq wr ws b\">workspaces\/default<\/code>\u00a0segment in the URL. If you prefer, you can create additional workspaces: just make sure to adjust the URL accordingly.<\/p>\n<p id=\"b0bd\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">If you\u2019re following this blog with my setup, your MCP registry endpoint will look like this: \u201c<a class=\"ah pb\" href=\"https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/workspaces\/default\/v0.1\/servers\" target=\"_blank\" rel=\"noopener ugc nofollow\">https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/workspaces\/default\/v0.1\/servers<\/a>\u201d<\/p>\n<p id=\"0d8d\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Run this:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">curl \"https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/workspaces\/default\/v0.1\/servers\"<\/code><\/pre>\n<p id=\"58e6\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">If everything is configured correctly, you should see:<\/p>\n<pre class=\"prettyprint language-json\"><code class=\"language-json\">{\r\n\"servers\": [\r\n{\r\n\"server\": {\r\n\"$schema\": \"https:\/\/static.modelcontextprotocol.io\/schemas\/2025-09-29\/server.schema.json\",\r\n\"name\": \"msdocs-mcp-server\",\r\n\"description\": \"AI assistant with real-time access to official Microsoft documentation.\",\r\n\"version\": \"Original\",\r\n\"remotes\": [\r\n{\r\n\"type\": \"sse\",\r\n\"url\": \"https:\/\/learn.microsoft.com\/api\/mcp\"\r\n}\r\n]\r\n},\r\n\"_meta\": {\r\n\"io.modelcontextprotocol.registry\/official\": {\r\n\"status\": \"active\",\r\n\"createdAt\": \"2025-11-21T10:57:54.753206+00:00\",\r\n\"updatedAt\": \"2025-11-21T10:58:01.1231068+00:00\",\r\n\"isLatest\": true\r\n},\r\n\"x-ms-id\": \"b8c6e77d-f266-4a0a-a341-cc9e97c15280\"\r\n}\r\n},\r\n{\r\n\"server\": {\r\n\"$schema\": \"https:\/\/static.modelcontextprotocol.io\/schemas\/2025-09-29\/server.schema.json\",\r\n\"name\": \"atlassian-mcp-server\",\r\n\"description\": \"Connect to Jira and Confluence for issue tracking and documentation.\",\r\n\"version\": \"Original\",\r\n\"remotes\": [\r\n{\r\n\"type\": \"sse\",\r\n\"url\": \"https:\/\/mcp.atlassian.com\/v1\/sse\"\r\n}\r\n]\r\n},\r\n\"_meta\": {\r\n\"io.modelcontextprotocol.registry\/official\": {\r\n\"status\": \"active\",\r\n\"createdAt\": \"2025-11-21T10:58:13.1934455+00:00\",\r\n\"updatedAt\": \"2025-11-21T10:58:18.6788839+00:00\",\r\n\"isLatest\": true\r\n},\r\n\"x-ms-id\": \"f9894e12-64f9-49ca-84a1-d01fcd4278c8\"\r\n}\r\n}\r\n],\r\n\"metadata\": {\r\n\"count\": 2\r\n}\r\n}<\/code><\/pre>\n<pre class=\"xv xw xx xy xz zf ws zg bq zh bc bl\"><\/pre>\n<p id=\"9206\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\"><span style=\"font-size: 14pt;\">The key is the shape: <em><strong><span id=\"de76\" class=\"zi xa rc ws b bh zj zk m zl zm\" data-selectable-paragraph=\"\">&lt;data endpoint&gt; <span class=\"hljs-regexp\">\/ workspaces \/<\/span> &lt;workspaceName&gt; <span class=\"hljs-regexp\">\/ v0.1 \/<\/span> servers<\/span><\/strong><\/em><\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cr ne wt wu wv\" role=\"separator\"><\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 id=\"1deb\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">Step 5 : Configure GitHub\u2019s MCP Registry URL<\/h2>\n<p id=\"7cc6\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">Now that the endpoint works, we need to wire it into GitHub so Copilot and VS Code use it.<\/p>\n<p class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\"><em class=\"rc\">\u26a0\ufe0f Important: in GitHub\u2019s config, you\u00a0<\/em><strong class=\"vk kw\"><em class=\"rc\">do not<\/em><\/strong><em class=\"rc\">\u00a0include\u00a0<\/em><code class=\"fc wp wq wr ws b\"><em class=\"rc\">\/v0.1\/servers<\/em><\/code><em class=\"rc\">.You point it at the\u00a0<\/em><strong class=\"vk kw\"><em class=\"rc\">workspace base URL<\/em><\/strong><em class=\"rc\">, and the GitHub will append <\/em><code class=\"fc wp wq wr ws b\"><em class=\"rc\">\/v0.1\/servers<\/em><\/code><em class=\"rc\">.<\/em><\/p>\n<p id=\"4984\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">In your GitHub Enterprise or org settings:<\/p>\n<ol class=\"\">\n<li id=\"2208\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Go to\u00a0<strong class=\"vk kw\">Enteprise \u2192 AI Coontrols \u2192MCP<\/strong><\/li>\n<li id=\"8964\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Find the\u00a0<strong class=\"vk kw\">MCP Registry URL<\/strong>\u00a0field.<\/li>\n<li id=\"1cb8\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Set it to:<code class=\"fc wp wq wr ws b\"><a class=\"ah pb\" href=\"https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/workspaces\/default\" target=\"_blank\" rel=\"noopener ugc nofollow\">https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/workspaces\/default<\/a><\/code><\/li>\n<li id=\"99df\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf yg wi wj bl\" data-selectable-paragraph=\"\">Choose your MCP policy:<\/li>\n<\/ol>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul class=\"\">\n<li id=\"6476\" class=\"vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">Allow all MCP servers<\/strong>, or<\/li>\n<li id=\"327a\" class=\"vi vj rc vk b vl wk vn vo vp wl vr vs vt wm vv vw vx wn vz wa wb wo wd we wf wh wi wj bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\">Registry only<\/strong> (only servers from this registry).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<div class=\"ya\">\n<div class=\"ac cr\">\n<div class=\"uo cp up co uq cn pf yh pg yi gj bi\">\n<figure class=\"xv xw xx xy xz ya yk yl paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt zq\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*ew-KZfyCmIkJXuKYOAgPSw.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*ew-KZfyCmIkJXuKYOAgPSw.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*ew-KZfyCmIkJXuKYOAgPSw.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*ew-KZfyCmIkJXuKYOAgPSw.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*ew-KZfyCmIkJXuKYOAgPSw.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*ew-KZfyCmIkJXuKYOAgPSw.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:2000\/format:webp\/1*ew-KZfyCmIkJXuKYOAgPSw.png 2000w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 1000px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*ew-KZfyCmIkJXuKYOAgPSw.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*ew-KZfyCmIkJXuKYOAgPSw.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*ew-KZfyCmIkJXuKYOAgPSw.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*ew-KZfyCmIkJXuKYOAgPSw.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*ew-KZfyCmIkJXuKYOAgPSw.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*ew-KZfyCmIkJXuKYOAgPSw.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:2000\/1*ew-KZfyCmIkJXuKYOAgPSw.png 2000w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 1000px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:2000\/1*ew-KZfyCmIkJXuKYOAgPSw.png\" alt=\"GitHub MCP Settings\" width=\"1000\" height=\"338\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h3 id=\"56f4\" class=\"yo xa rc bg xb yp yq yr la ys yt yu le vt yv yw yx vx yy yz za wb zb zc zd ze bl\" data-selectable-paragraph=\"\">Behind the scenes, VS Code will now call:<\/h3>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">https:\/\/private-mcp-registry.data.eastus.azure-apicenter.ms\/workspaces\/default\/v0.1\/servers<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 data-selectable-paragraph=\"\"><\/h2>\n<h2 id=\"94ee\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">Step 6: Test in VS Code<\/h2>\n<p id=\"f60d\" class=\"pw-post-body-paragraph vi vj rc vk b vl xi vn vo vp xj vr vs vt xk vv vw vx xl vz wa wb xm wd we wf ft bl\" data-selectable-paragraph=\"\">Once the enterprise settings have propagated, open VS Code and try accessing your previously installed MCP servers, you\u2019ll notice a\u00a0<strong class=\"vk kw\">yellow exclamation mark<\/strong> on them.<\/p>\n<figure class=\"xv xw xx xy xz ya xs xt paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt zr\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*lRdmJHwD_2EHnDYpE5YW6g.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*lRdmJHwD_2EHnDYpE5YW6g.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*lRdmJHwD_2EHnDYpE5YW6g.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*lRdmJHwD_2EHnDYpE5YW6g.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*lRdmJHwD_2EHnDYpE5YW6g.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*lRdmJHwD_2EHnDYpE5YW6g.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*lRdmJHwD_2EHnDYpE5YW6g.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*lRdmJHwD_2EHnDYpE5YW6g.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*lRdmJHwD_2EHnDYpE5YW6g.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*lRdmJHwD_2EHnDYpE5YW6g.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*lRdmJHwD_2EHnDYpE5YW6g.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*lRdmJHwD_2EHnDYpE5YW6g.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*lRdmJHwD_2EHnDYpE5YW6g.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*lRdmJHwD_2EHnDYpE5YW6g.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*lRdmJHwD_2EHnDYpE5YW6g.png\" alt=\"vscode Disabled servers\" width=\"700\" height=\"400\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"a61c\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">When you select an MCP server that isn\u2019t part of the private registry enforced by your GitHub policies, VS Code will show a warning message:<\/p>\n<p id=\"26e4\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\"><em class=\"wg\">\u201cThis MCP server is disabled because it is configured to be disabled in the editor.\u201d<\/em><\/strong><\/p>\n<figure class=\"xv xw xx xy xz ya xs xt paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt zs\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*C6xlHvwHfFRH2A-S_bJY1A.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*C6xlHvwHfFRH2A-S_bJY1A.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*C6xlHvwHfFRH2A-S_bJY1A.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*C6xlHvwHfFRH2A-S_bJY1A.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*C6xlHvwHfFRH2A-S_bJY1A.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*C6xlHvwHfFRH2A-S_bJY1A.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*C6xlHvwHfFRH2A-S_bJY1A.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*C6xlHvwHfFRH2A-S_bJY1A.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*C6xlHvwHfFRH2A-S_bJY1A.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*C6xlHvwHfFRH2A-S_bJY1A.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*C6xlHvwHfFRH2A-S_bJY1A.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*C6xlHvwHfFRH2A-S_bJY1A.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*C6xlHvwHfFRH2A-S_bJY1A.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*C6xlHvwHfFRH2A-S_bJY1A.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*C6xlHvwHfFRH2A-S_bJY1A.png\" alt=\"Vscode MCP Server Disabled\" width=\"700\" height=\"390\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"d41a\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">When you open the MCP access settings in VS Code, you\u2019ll see that\u00a0<strong class=\"vk kw\">\u201cregistry\u201d<\/strong>\u00a0is selected as the control method for installing MCP servers. This setting is enforced by your GitHub policies, so the user cannot toggle it: the option is\u00a0<strong class=\"vk kw\">greyed out<\/strong>.<\/p>\n<figure class=\"xv xw xx xy xz ya xs xt paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt zt\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*MRX5BvBtLiAilm2BaUEssg.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*MRX5BvBtLiAilm2BaUEssg.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*MRX5BvBtLiAilm2BaUEssg.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*MRX5BvBtLiAilm2BaUEssg.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*MRX5BvBtLiAilm2BaUEssg.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*MRX5BvBtLiAilm2BaUEssg.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*MRX5BvBtLiAilm2BaUEssg.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*MRX5BvBtLiAilm2BaUEssg.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*MRX5BvBtLiAilm2BaUEssg.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*MRX5BvBtLiAilm2BaUEssg.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*MRX5BvBtLiAilm2BaUEssg.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*MRX5BvBtLiAilm2BaUEssg.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*MRX5BvBtLiAilm2BaUEssg.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*MRX5BvBtLiAilm2BaUEssg.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*MRX5BvBtLiAilm2BaUEssg.png\" alt=\"Vscode MCP settings\" width=\"700\" height=\"311\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"9395\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Now let\u2019s check which MCP servers are available for installation in VS Code. When you type\u00a0<strong class=\"vk kw\">@MCP\u00a0<\/strong>in the extensions section, instead of seeing the full list of servers, you\u2019ll only see the\u00a0<strong class=\"vk kw\">two MCP servers<\/strong>\u00a0we exposed through Azure API Center and included in our private MCP registry.<\/p>\n<figure class=\"xv xw xx xy xz ya xs xt paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt zu\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*Eo8BGADuIPghZVnFWifmzw.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*Eo8BGADuIPghZVnFWifmzw.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*Eo8BGADuIPghZVnFWifmzw.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*Eo8BGADuIPghZVnFWifmzw.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*Eo8BGADuIPghZVnFWifmzw.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*Eo8BGADuIPghZVnFWifmzw.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*Eo8BGADuIPghZVnFWifmzw.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*Eo8BGADuIPghZVnFWifmzw.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*Eo8BGADuIPghZVnFWifmzw.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*Eo8BGADuIPghZVnFWifmzw.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*Eo8BGADuIPghZVnFWifmzw.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*Eo8BGADuIPghZVnFWifmzw.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*Eo8BGADuIPghZVnFWifmzw.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*Eo8BGADuIPghZVnFWifmzw.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*Eo8BGADuIPghZVnFWifmzw.png\" alt=\"Vscode MCP extensions\" width=\"700\" height=\"621\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"20ee\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">And to double-confirm that these MCP servers are coming from\u00a0<strong class=\"vk kw\">your<\/strong>\u00a0registry, open the\u00a0<strong class=\"vk kw\">Output<\/strong>\u00a0pane in VS Code and select the\u00a0<strong class=\"vk kw\">\u201cWindow\u201d<\/strong>\u00a0channel. You\u2019ll see the\u00a0<strong class=\"vk kw\">registry URL<\/strong>\u00a0configured from Azure API Center, that\u2019s where the server list is being fetched from.<\/p>\n<figure class=\"xv xw xx xy xz ya xs xt paragraph-image\">\n<div class=\"yb yc dt yd bi ye\" tabindex=\"0\" role=\"button\">\n<div class=\"xs xt zv\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*wUu5XRios2tLeNaGhZIb6Q.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*wUu5XRios2tLeNaGhZIb6Q.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*wUu5XRios2tLeNaGhZIb6Q.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*wUu5XRios2tLeNaGhZIb6Q.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*wUu5XRios2tLeNaGhZIb6Q.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*wUu5XRios2tLeNaGhZIb6Q.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*wUu5XRios2tLeNaGhZIb6Q.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*wUu5XRios2tLeNaGhZIb6Q.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*wUu5XRios2tLeNaGhZIb6Q.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*wUu5XRios2tLeNaGhZIb6Q.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*wUu5XRios2tLeNaGhZIb6Q.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*wUu5XRios2tLeNaGhZIb6Q.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*wUu5XRios2tLeNaGhZIb6Q.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*wUu5XRios2tLeNaGhZIb6Q.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img decoding=\"async\" class=\"bi ut yf c aligncenter\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*wUu5XRios2tLeNaGhZIb6Q.png\" alt=\"Vscode logs\" width=\"700\" height=\"119\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"3264\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\"><strong class=\"vk kw\"><em class=\"wg\">In the end, we reached our goal: a fully working private MCP registry in Azure API Center, with two MCP servers securely exposed to GitHub and successfully enforced in VS Code.<\/em><\/strong><\/p>\n<p data-selectable-paragraph=\"\"><strong data-start=\"280\" data-end=\"289\">Note:<\/strong> <em>If you don\u2019t see the correct registry being picked up, simply restart VS Code and try again.<\/em><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ft qx qy qz ra\">\n<div class=\"ac cr\">\n<div class=\"gj bi gk gl gm gn\">\n<h2 id=\"4b0a\" class=\"wz xa rc bg xb kx xc ky la lb xd lc le ig xe ih ik lh xf li ll lm xg ln lq xh bl\" data-selectable-paragraph=\"\">Summary<\/h2>\n<p data-start=\"397\" data-end=\"909\">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.<\/p>\n<p data-start=\"911\" data-end=\"1135\">This capability isn\u2019t 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.<\/p>\n<p data-start=\"1137\" data-end=\"1527\">Alternatively, if you need full control right now, a self-hosted MCP registry offers the most flexibility. In exchange, you\u2019ll need to implement the <em data-start=\"1302\" data-end=\"1335\">v0.1 MCP Registry specification<\/em> yourself and also ensure that CORS and endpoint behaviors are properly configured<\/p>\n<p id=\"9bc6\" class=\"pw-post-body-paragraph vi vj rc vk b vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf ft bl\" data-selectable-paragraph=\"\">Hopefully this guide saves you the hours I spent chasing 401s, frozen buttons, and mysterious 404s and helps you get your MCP registry up and running without the drama. Happy building! \ud83d\ude80<\/p>\n<p data-selectable-paragraph=\"\">\n<\/div>\n<h2 id=\"troubleshooting\">Troubleshooting<\/h2>\n<table style=\"border-collapse: collapse; width: 75.4153%;\">\n<tbody>\n<tr>\n<th style=\"width: 22.3421%;\">Issue<\/th>\n<th style=\"width: 53.0732%;\">Solution<\/th>\n<\/tr>\n<tr>\n<td style=\"width: 22.3421%;\">401 Unauthorized<\/td>\n<td style=\"width: 53.0732%;\">Verify you have the <b>correct user<\/b>\u00a0role on the Azure API Center resource.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 22.3421%;\">Save + Publish Button Greyed Out<\/td>\n<td style=\"width: 53.0732%;\">Enable anonymous access to the APIs<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 22.3421%;\">404 Not found<\/td>\n<td style=\"width: 53.0732%;\">MCP registry endpoint <strong class=\"vk kw\">must<\/strong>\u00a0include the\u00a0<code class=\"fc wp wq wr ws b\">workspaces\/default<\/code>\u00a0segment in the URL<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 22.3421%;\">404 Not Found<\/td>\n<td style=\"width: 53.0732%;\">You are using data endpoint and not the portal endpoint<\/p>\n<p>\u2705\u00a0 data endpoint:\u00a0https:\/\/private-mcp-registry.<em><strong>data<\/strong><\/em>.eastus.azure-apicenter.ms<\/p>\n<p>\ud83d\udeab portal endpoint: https:\/\/private-mcp-registry.<em><strong>portal<\/strong><\/em>.eastus.azure-apicenter.ms<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h2 id=\"resources\">Resources<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.github.com\/en\/enterprise-cloud@latest\/copilot\/how-tos\/administer-copilot\/manage-mcp-usage\/configure-mcp-registry\" target=\"_blank\" rel=\"noopener\">Configure MCP Registry<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/api-management\/mcp-server-overview\" target=\"_blank\" rel=\"noopener\">Microsoft Azure API Center: MCP Overview<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/enterprise-cloud@latest\/copilot\/how-tos\/administer-copilot\/manage-mcp-usage\/configure-mcp-server-access\" target=\"_blank\" rel=\"noopener\">Configure MCP Server Access On GitHub<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ever since MCP launched,\u00a0every customer has asked the same thing: \u201cHow does a private MCP registry actually work, and how do we configure it for our enterprise?\u201d. So today, on a snowy, freezing Friday in Zurich, I grabbed a coffe, opened the GitHub docs, dove into Azure API Center portal, and decided to write the [&hellip;]<\/p>\n","protected":false},"author":203957,"featured_media":1743,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[20,100,19,108,97],"tags":[],"class_list":["post-1733","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developer-productivity","category-github","category-github-copilot","category-mcp","category-mcp-model-context-protocol"],"acf":[],"blog_post_summary":"<p>Ever since MCP launched,\u00a0every customer has asked the same thing: \u201cHow does a private MCP registry actually work, and how do we configure it for our enterprise?\u201d. So today, on a snowy, freezing Friday in Zurich, I grabbed a coffe, opened the GitHub docs, dove into Azure API Center portal, and decided to write the [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/posts\/1733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/users\/203957"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/comments?post=1733"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/posts\/1733\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/media\/1743"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/media?parent=1733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/categories?post=1733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/all-things-azure\/wp-json\/wp\/v2\/tags?post=1733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}