Lessons Learned : Setting up an MCP registry for Github Copilot to enable enterprise governance


While GitHub Copilot significantly boosts developer productivity, its ability to integrate with external tools through the Model Context Protocol (MCP) necessitates a robust governance framework to prevent unvetted data access. As per the official documentation, an internal MCP registry that acts as a centralized gateway, replacing fragmented local configurations with a single source of truth for approved servers. This allows us to curate a catalog of vetted tools, ensuring the security standards across the organization.

We selected the Playwright MCP server as our flagship test case because it addressed a critical gap in our toolchain and was the most requested integration among our engineering teams. From a developer experience standpoint, this setup allows engineers to author, execute, and troubleshoot end-to-end tests directly within the GitHub Copilot chat, effectively transforming the IDE into a live automation environment. By allowing the AI to interact with a real browser instance through the governed registry, we have significantly minimized context-switching and accelerated the overall testing lifecycle.

So, we built the registry using community version . Its essentially 3 APIs as Endpoint and specification requirements.

A valid registry must support URL routing and follow the v0.1 MCP registry specification, including the following endpoints:

GET /v0.1/servers: Returns a list of all included MCP servers
GET /v0.1/servers/{serverName}/versions/latest: Returns the latest version of a specific server
GET /v0.1/servers/{serverName}/versions/{version}: Returns the details for a specific version of a server

After successfully deploying our internal registry and modifying the GitHub enterprise policies settings, we encountered a baffling roadblock: VS Code was picking up the registry configurations perfectly, yet it was hard-blocking every server in the toolchain. It was a classic 'dark hole' scenario that forced us to look deeper into the handshake between the IDE's security layer and our governance APIs.

As we were debugging the issue, I got curios about the error message in the IDE. I remembered that VS code itself is opensource and why don't I try to understand the inner workings of the validation. There we go, and we have some new information. So, While the Github documentation speaks about the matching of the name of the server name, the actual validation covers name, description and version. Also the schema of the response should be of appropriate version. AI was of much help to get this information easily out.



Also, I had to create a input schema to add the server in appropriate way. After much try including with Microsoft Copilot and Google Gemini, I got the working version as below,
{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-10-17/server.schema.json",

  "name": "com.microsoft/playwright-mcp",
  "version": "0.0.54",

  "title": "Playwright MCP",
  "description": "Browser automation using Playwright with structured accessibility snapshots.",

  "websiteUrl": "https://github.com/microsoft/playwright-mcp",
  "repository": {
    "url": "https://github.com/microsoft/playwright-mcp",
    "source": "github"
  },

  "icons": [
    {
      "src": "https://raw.githubusercontent.com/microsoft/playwright-mcp/main/assets/icon.png",
      "type": "image/png",
      "size": 128
    }
  ],

  "packages": [
    {
      "registryType": "npm",
      "identifier": "@playwright/mcp",
      "version": "0.0.54",

      "transport": { "type": "stdio" },

      "packageArguments": [],
      "environmentVariables": []
    }
  ]
}

Most important thing is, we should install our MCP Server to be from the IDE using the "packages" tag so that all the validation parameters are correct. With this all the issues were resolved and we could use Playwright MCP Server in VS Code. Also it blocked others servers demonstrating the validity of registry settings. I have also added a pull request to improve the documentation on Github docs.