mcp-anything

Puerta de enlace Meta-MCP: busca ~75k servidores MCP en los registros públicos mediante cinco meta-herramientas y llama a cualquiera de ellos sobre la marcha — local-primero, con protección SSRF y lista blanca de stdio.

Documentación

mcp-anything

CI npm License: MIT Node >= 20

Un servidor MCP que puede descubrir y llamar a (casi) cualquier servidor MCP del mundo.

mcp-anything demo: searching the MCP ecosystem from the terminal

mcp-anything es un servidor MCP meta: en lugar de configurar docenas de servidores MCP en tu host (Claude Desktop, Claude Code, Cursor, ...), configuras exactamente uno. Indexa el registro oficial de MCP localmente y expone cinco pequeñas meta-herramientas que permiten al modelo buscar servidores, inspeccionarlos y llamar a sus herramientas sobre la marcha — sin cargar nunca miles de esquemas de herramientas en la ventana de contexto.

Host / LLM
    │  (5 meta-tools, constant context cost)
    ▼
mcp-anything ──── local BM25 index ◄──┬── official MCP registry   (moderated, richest metadata)
    │        (cross-source dedupe,    ├── PulseMCP    (~22k servers, stars & downloads)
    │         popularity-boosted      ├── npm         (~67k packages tagged mcp)
    │         ranking)                └── Glama       (~75k indexed servers)
    │
    │  security policy: SSRF guard · stdio allowlist · secrets injection · timeouts
    ▼
downstream MCP servers   (streamable-http / sse / stdio via npx·uvx)

Por qué

  • Descubrimiento: existen miles de servidores MCP; tu host solo conoce los que configuraste manualmente.
  • Contexto: cargar muchos servidores consume tu ventana de contexto. Las meta-herramientas mantienen el costo constante — el modelo busca capacidades en dos fases (buscar → inspeccionar → llamar), el mismo patrón que usa Tool Search de Anthropic.
  • Una sola configuración: una única entrada en la configuración de tu cliente MCP en lugar de una por servidor.

Inicio rápido

# Run directly (Node >= 20):
npx mcp-anything sync     # first-time index download (~few seconds)
npx mcp-anything serve    # start the meta-MCP server on stdio

Claude Code

claude mcp add anything -- npx -y mcp-anything serve

Claude Desktop / otros hosts

{
  "mcpServers": {
    "anything": {
      "command": "npx",
      "args": ["-y", "mcp-anything", "serve"]
    }
  }
}

Luego solo pídele a tu modelo cosas como "encuentra un servidor MCP que pueda consultar Postgres y lista sus herramientas" — usará las meta-herramientas por sí mismo.

Modo HTTP y descubrimiento alojado

mcp-anything serve --http                    # streamable HTTP on :8080 (POST /mcp)
mcp-anything serve --http --discovery-only   # safe for public hosting: search/describe only

Una instancia pública con ejecución habilitada sería un proxy abierto — nunca alojes una instancia completa públicamente. El Dockerfile usa solo descubrimiento por defecto precisamente por esta razón. Una instancia de descubrimiento alojada permite que cualquier cliente MCP busque en el ecosistema; conectar y llamar herramientas es para lo que sirve la instalación local.

CLI

mcp-anything sync             # refresh the registry index
mcp-anything search "weather" # search the index from your terminal
mcp-anything serve            # stdio MCP server (default command)

Las meta-herramientas

HerramientaQué hace
search_mcp_serversBúsqueda por palabras clave (BM25 + difusa) sobre el registro indexado. Devuelve candidatos con un veredicto de conectividad.
describe_mcp_serverMetadatos completos del registro: transportes, paquetes, variables de entorno / secretos requeridos, veredicto de política.
list_mcp_toolsSe conecta en vivo (según política) y lista las herramientas reales del servidor con esquemas JSON.
call_mcp_toolEjecuta una herramienta en un servidor descendente. Las sesiones se agrupan y reutilizan.
sync_registryFuerza una actualización del índice (de lo contrario, se actualiza automáticamente al expirar el TTL).

Modelo de seguridad

Conectar un LLM a servidores arbitrarios de un registro público es peligroso por defecto. mcp-anything incluye valores predeterminados conservadores y hace explícita cada relajación:

  • Servidores remotos (streamable-http / sse): permitidos, pero las direcciones privadas/loopback/link-local (incluidos los endpoints de metadatos de nube como 169.254.169.254) y http: sin cifrar están bloqueados — una protección SSRF para entradas del registro que apunten a tu red. Puedes desactivarlo con remote.allowPrivateNetwork (útil solo para desarrollo local).
  • Servidores stdio (que lanzan procesos npx / uvx): deshabilitados por defecto. Ejecutar un paquete de un registro público es ejecución de código arbitrario en tu máquina. Habilítalo solo con una lista de permitidos explícita por paquete.
  • Secretos: las claves de API nunca se indexan ni se exponen al modelo. Las mapeas por servidor en tu configuración; se inyectan al momento de conectar (encabezados para remoto, env para stdio).
  • Salida no confiable: los resultados y descripciones de herramientas de servidores descendentes se etiquetan como datos de terceros para que el modelo los trate como datos, no como instrucciones. Esto reduce el riesgo de inyección de prompts; no lo elimina — consulta SECURITY.md.
  • Límites: tiempos de espera de conexión/llamada, truncamiento del tamaño de respuesta, grupo de sesiones acotado.

Configuración

~/.config/mcp-anything/config.json (o --config <path>, o MCP_ANYTHING_CONFIG):

{
  "registryUrl": "https://registry.modelcontextprotocol.io",
  "sources": ["official"],
  "qualityFilter": true,
  "cacheTtlHours": 24,
  "maxServers": 10000,
  "policy": {
    "remote": {
      "enabled": true,
      "allowPrivateNetwork": false,
      "headers": {
        "io.github.example/github": { "Authorization": "Bearer ghp_..." }
      }
    },
    "stdio": {
      "enabled": false,
      "allowPackages": ["@modelcontextprotocol/server-filesystem"],
      "env": {
        "io.github.example/postgres": { "DATABASE_URL": "postgres://..." }
      }
    },
    "limits": {
      "callTimeoutMs": 60000,
      "connectTimeoutMs": 20000,
      "maxSessions": 8,
      "maxResultChars": 100000
    }
  }
}

Cada campo es opcional; los valores predeterminados anteriores (menos los encabezados/env de ejemplo) son lo que obtienes sin configuración alguna. registryUrl acepta cualquier registro que implemente la API REST oficial — incluido uno privado/autoalojado.

Fuentes de índice — ampliando el alcance

sources controla cuánto del ecosistema se indexa:

FuenteEscalaQué añade
official (predeterminada)milesEntradas moderadas con los metadatos más ricos (transportes, variables de entorno, versiones)
pulsemcp~22kCatálogo amplio + estrellas de GitHub y conteos de descargas (alimenta el ranking)
npm~67k paquetes etiquetadosEl grupo bruto más grande de servidores stdio, con descargas mensuales
glama~75kEl índice más amplio (adaptador de mejor esfuerzo)
{ "sources": ["official", "pulsemcp", "npm"] }

Las entradas que aparecen en varios catálogos se deduplican por URL de repositorio normalizada e identificador de paquete; la fuente más confiable gana la identidad, los metadatos se completan desde las demás, y las estrellas/descargas se acumulan. El ranking combina entonces la relevancia BM25 con un impulso de popularidad en escala logarítmica (y una bonificación para entradas del registro oficial), de modo que search_mcp_servers muestra la implementación mantenida de una capacidad en lugar del clon abandonado número cien. qualityFilter (activado por defecto) descarta entradas sin forma de conectar y sin descripción utilizable — con fuentes amplias, más solo es mejor si la basura se mantiene fuera del top-5. Una fuente fallida degrada con elegancia: la sincronización conserva lo que devolvieron las otras fuentes e informa del fallo.

Notas de diseño

  • Búsqueda léxica, no embeddings. Totalmente local, costo de API cero, sin paso de construcción de índice — y para descubrimiento de herramientas, la búsqueda por palabras clave con coincidencia difusa rinde de manera comparable en la práctica (Tool Search de Anthropic tomó la misma decisión con BM25/regex).
  • Sesiones, no llamadas sin estado. MCP está orientado a sesiones (handshake de inicialización, negociación de capacidades). Las conexiones descendentes se agrupan y reutilizan entre llamadas con evicción LRU.
  • Degradación elegante. Si el registro no está disponible, la caché de la última sincronización sigue funcionando.

Trabajo previo y posicionamiento

Este espacio está activo: MetaMCP y otras puertas de enlace agregan servidores que tú configuras; Rube de Composio enruta hacia su propio catálogo curado; los hosts están incorporando búsqueda de herramientas nativa. El nicho de mcp-anything es la combinación abierta: el registro público como catálogo, un único binario local-first y una política de seguridad explícita — sin cuenta en la nube, sin bloqueo de curación, autoalojable contra un registro privado.

Hoja de ruta

  • Comprobaciones de salud en vivo y señales de calidad de resultados en el ranking
  • Búsqueda por herramienta (no solo por servidor) indexando tools/list de servidores populares
  • Paso a través del flujo OAuth para servidores remotos que lo requieran
  • Sandboxing de contenedor/Wasm para servidores stdio como alternativa a la lista de permitidos
  • Múltiples registros con federación y deduplicación
  • Modo de servicio streamable-http opcional (para despliegue compartido/en equipo)

Desarrollo

npm install
npm test              # unit + end-to-end (mock registry + real downstream MCP server)
npm run typecheck
npm run build
node scripts/smoke.mjs  # spawns the built CLI as a real stdio MCP server

Consulta CONTRIBUTING.md. Licenciado bajo MIT.