diff --git a/litellm/proxy/mcp_registry.json b/litellm/proxy/mcp_registry.json index b117f35600d..fbdedd76d31 100644 --- a/litellm/proxy/mcp_registry.json +++ b/litellm/proxy/mcp_registry.json @@ -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", "--read-only", "--project-ref="], "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} ] } ] diff --git a/tests/unit/proxy/test_mcp_registry.py b/tests/unit/proxy/test_mcp_registry.py new file mode 100644 index 00000000000..86990486be6 --- /dev/null +++ b/tests/unit/proxy/test_mcp_registry.py @@ -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/")] == [] diff --git a/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcp_discovery.integration.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcp_discovery.integration.test.tsx index 02e04a0aa97..5aeb0cbf45a 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcp_discovery.integration.test.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcp_discovery.integration.test.tsx @@ -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",