fix(mcp): point registry stdio servers at packages that exist

15 of the 21 npx entries in the MCP discovery registry named packages that
npm answers 404 for (most under an @anthropic/ scope that publishes no MCP
servers), so adding them from the discovery page always failed tool
discovery.

Entries whose vendor publishes an official server now launch it: tavily-mcp,
@playwright/mcp, @browserbasehq/mcp, mongodb-mcp-server and
@supabase/mcp-server-supabase over npx, and awslabs.aws-api-mcp-server and
redis-mcp-server over uvx, with env vars matching what each server reads.
Entries with no official server to launch (discord, sqlite, mysql,
google_calendar, obsidian, docker, shopify, twilio) are removed.

Fixes #24769
This commit is contained in:
madhu19991 2026-09-29 01:48:37 -07:00
parent 85dc7cb62e
commit 694304be7a
3 changed files with 47 additions and 131 deletions

View file

@ -77,20 +77,6 @@
{"name": "SLACK_TEAM_ID", "description": "Slack Team/Workspace ID", "secret": false}
]
},
{
"name": "discord",
"title": "Discord",
"description": "Discord server management, messaging, and bot integration",
"icon_url": "https://cdn.simpleicons.org/discord",
"category": "Communication",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-discord"],
"env_vars": [
{"name": "DISCORD_BOT_TOKEN", "description": "Discord Bot Token", "secret": true}
]
},
{
"name": "postgresql",
"title": "PostgreSQL",
@ -105,37 +91,6 @@
{"name": "POSTGRES_CONNECTION_STRING", "description": "PostgreSQL connection string (e.g., postgresql://user:pass@host:5432/db)", "secret": true}
]
},
{
"name": "sqlite",
"title": "SQLite",
"description": "Query and manage SQLite databases",
"icon_url": "https://cdn.simpleicons.org/sqlite",
"category": "Databases",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sqlite"],
"env_vars": [
{"name": "SQLITE_DB_PATH", "description": "Path to SQLite database file", "secret": false}
]
},
{
"name": "mysql",
"title": "MySQL",
"description": "Query and manage MySQL databases",
"icon_url": "https://cdn.simpleicons.org/mysql",
"category": "Databases",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-mysql"],
"env_vars": [
{"name": "MYSQL_HOST", "description": "MySQL host", "secret": false},
{"name": "MYSQL_USER", "description": "MySQL username", "secret": false},
{"name": "MYSQL_PASSWORD", "description": "MySQL password", "secret": true},
{"name": "MYSQL_DATABASE", "description": "MySQL database name", "secret": false}
]
},
{
"name": "mongodb",
"title": "MongoDB",
@ -145,9 +100,9 @@
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-mongodb"],
"args": ["-y", "mongodb-mcp-server"],
"env_vars": [
{"name": "MONGODB_CONNECTION_STRING", "description": "MongoDB connection string", "secret": true}
{"name": "MDB_MCP_CONNECTION_STRING", "description": "MongoDB connection string", "secret": true}
]
},
{
@ -158,10 +113,13 @@
"category": "Databases",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-redis"],
"command": "uvx",
"args": ["redis-mcp-server"],
"env_vars": [
{"name": "REDIS_URL", "description": "Redis connection URL (e.g., redis://localhost:6379)", "secret": true}
{"name": "REDIS_HOST", "description": "Redis host (e.g., localhost)", "secret": false},
{"name": "REDIS_PORT", "description": "Redis port (e.g., 6379)", "secret": false},
{"name": "REDIS_USERNAME", "description": "Redis username", "secret": false},
{"name": "REDIS_PWD", "description": "Redis password", "secret": true}
]
},
{
@ -202,35 +160,6 @@
"url": "https://drivemcp.googleapis.com/mcp/v1",
"env_vars": []
},
{
"name": "google_calendar",
"title": "Google Calendar",
"description": "Manage events and calendars in Google Calendar",
"icon_url": "https://cdn.simpleicons.org/googlecalendar",
"category": "Productivity",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-google-calendar"],
"env_vars": [
{"name": "GOOGLE_CLIENT_ID", "description": "Google OAuth Client ID", "secret": false},
{"name": "GOOGLE_CLIENT_SECRET", "description": "Google OAuth Client Secret", "secret": true}
]
},
{
"name": "obsidian",
"title": "Obsidian",
"description": "Read, search, and manage Obsidian vault notes and files",
"icon_url": "https://cdn.simpleicons.org/obsidian",
"category": "Productivity",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-obsidian"],
"env_vars": [
{"name": "OBSIDIAN_VAULT_PATH", "description": "Path to Obsidian vault directory", "secret": false}
]
},
{
"name": "brave_search",
"title": "Brave Search",
@ -267,7 +196,7 @@
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-tavily"],
"args": ["-y", "tavily-mcp"],
"env_vars": [
{"name": "TAVILY_API_KEY", "description": "Tavily API Key", "secret": true}
]
@ -293,7 +222,7 @@
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-playwright"],
"args": ["-y", "@playwright/mcp", "--headless"],
"env_vars": []
},
{
@ -305,10 +234,11 @@
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-browserbase"],
"args": ["-y", "@browserbasehq/mcp"],
"env_vars": [
{"name": "BROWSERBASE_API_KEY", "description": "Browserbase API Key", "secret": true},
{"name": "BROWSERBASE_PROJECT_ID", "description": "Browserbase Project ID", "secret": false}
{"name": "BROWSERBASE_PROJECT_ID", "description": "Browserbase Project ID", "secret": false},
{"name": "GEMINI_API_KEY", "description": "Gemini API Key for the default Stagehand model", "secret": true}
]
},
{
@ -319,8 +249,8 @@
"category": "Cloud",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-aws"],
"command": "uvx",
"args": ["awslabs.aws-api-mcp-server"],
"env_vars": [
{"name": "AWS_ACCESS_KEY_ID", "description": "AWS Access Key ID", "secret": true},
{"name": "AWS_SECRET_ACCESS_KEY", "description": "AWS Secret Access Key", "secret": true},
@ -350,18 +280,6 @@
"args": ["-y", "@modelcontextprotocol/server-filesystem"],
"env_vars": []
},
{
"name": "docker",
"title": "Docker",
"description": "Manage Docker containers, images, and networks",
"icon_url": "https://cdn.simpleicons.org/docker",
"category": "System",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-docker"],
"env_vars": []
},
{
"name": "stripe",
"title": "Stripe",
@ -373,36 +291,6 @@
"url": "https://mcp.stripe.com",
"env_vars": []
},
{
"name": "shopify",
"title": "Shopify",
"description": "Manage Shopify stores, products, orders, and customers",
"icon_url": "https://cdn.simpleicons.org/shopify",
"category": "E-Commerce",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-shopify"],
"env_vars": [
{"name": "SHOPIFY_ACCESS_TOKEN", "description": "Shopify Admin API Access Token", "secret": true},
{"name": "SHOPIFY_STORE_URL", "description": "Shopify Store URL (e.g., mystore.myshopify.com)", "secret": false}
]
},
{
"name": "twilio",
"title": "Twilio",
"description": "Send SMS, make calls, and manage communication via Twilio",
"icon_url": "/ui/assets/logos/twilio.svg",
"category": "Communication",
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-twilio"],
"env_vars": [
{"name": "TWILIO_ACCOUNT_SID", "description": "Twilio Account SID", "secret": false},
{"name": "TWILIO_AUTH_TOKEN", "description": "Twilio Auth Token", "secret": true}
]
},
{
"name": "supabase",
"title": "Supabase",
@ -412,10 +300,9 @@
"registry_url": null,
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-supabase"],
"args": ["-y", "@supabase/mcp-server-supabase"],
"env_vars": [
{"name": "SUPABASE_URL", "description": "Supabase Project URL", "secret": false},
{"name": "SUPABASE_SERVICE_ROLE_KEY", "description": "Supabase Service Role Key", "secret": true}
{"name": "SUPABASE_ACCESS_TOKEN", "description": "Supabase Personal Access Token", "secret": true}
]
}
]

View file

@ -0,0 +1,30 @@
import json
from collections.abc import Iterator, Mapping, Sequence
from pathlib import Path
from typing import Final
import litellm.proxy
REGISTRY_SERVERS: Final[Sequence[Mapping[str, object]]] = json.loads(
(Path(litellm.proxy.__file__).parent / "mcp_registry.json").read_text()
)["servers"]
def _scoped_npm_packages() -> Iterator[str]:
for server in REGISTRY_SERVERS:
if server.get("command") != "npx":
continue
args = server.get("args")
yield from (arg for arg in args if isinstance(arg, str) and arg.startswith("@")) if isinstance(args, list) else ()
def test_no_stdio_server_installs_from_the_nonexistent_anthropic_npm_scope() -> None:
"""
https://github.com/BerriAI/litellm/issues/24769 - picking one of these from the discovery
page failed tool discovery with an npm 404. registry.npmjs.org answered 404 for every
`@anthropic/mcp-server-*` name the registry used when checked on 2026-09-29
"""
packages: Final = tuple(_scoped_npm_packages())
assert packages
assert [package for package in packages if package.startswith("@anthropic/")] == []

View file

@ -57,7 +57,6 @@ describe("MCPDiscovery", () => {
["exa", "/ui/assets/logos/exa_ai.png"],
["tavily", "/ui/assets/logos/tavily.png"],
["slack", "/ui/assets/logos/slack.svg"],
["twilio", "/ui/assets/logos/twilio.svg"],
[
"playwright",
"https://raw.githubusercontent.com/microsoft/playwright/2f6148bcd1a96ec687d55ce08645fc6315b1514e/packages/recorder/public/playwright-logo.svg",