Any OpenAPI
Un servidor que crea dinámicamente endpoints MCP a partir de cualquier URL de especificación OpenAPI.
Documentación
Servidor MCP: Descubrimiento de Endpoints OpenAPI Escalable y Herramienta de Solicitud de API
TODO
- La imagen de docker es de 2GB sin modelos precargados. ¡¡Es de 3.76GB con modelos precargados!! Demasiado grande, alguien por favor ayúdeme a reducir el tamaño.
Configuración
Personaliza mediante variables de entorno. GLOBAL_TOOL_PROMPT es IMPORTANTE!
OPENAPI_JSON_DOCS_URL: URL al JSON de especificación OpenAPI (por defecto https://api.staging.readymojo.com/openapi.json)MCP_API_PREFIX: Espacio de nombres de herramienta personalizable (por defecto "any_openapi"):# Creates tools: custom_api_request_schema and custom_make_request docker run -e MCP_API_PREFIX=finance ...GLOBAL_TOOL_PROMPT: Texto opcional para anteponer a todas las descripciones de herramientas. Esto es crucial para que Claude seleccione o no seleccione tu herramienta con precisión.# Adds "Access to insights apis for ACME Financial Services abc.com . " to the beginning of all tool descriptions docker run -e GLOBAL_TOOL_PROMPT="Access to insights apis for ACME Financial Services abc.com ." ...
TL'DR
Por qué creo esto: Quiero servir mi API privada, cuyos documentos swagger openapi tienen un tamaño de unos cientos de KB.
- Claude MCP simplemente falla al procesar archivos de este tamaño
- Intenté convertir el resultado a YAML, no es lo suficientemente pequeño y tiene muchos errores. FALLÓ
- Intenté proporcionar una categoría de API y luego pedir al Cliente MCP (Claude Desktop) que obtuviera el documento de API por grupo. Sigue siendo demasiado grande, FALLÓ.
Finalmente llegué a esta solución:
- Utiliza búsqueda semántica en memoria para encontrar endpoints de API relevantes mediante lenguaje natural (como listar productos)
- Devuelve la documentación completa del endpoint (como la diseñé para almacenar un endpoint como un fragmento) en milisegundos (ya que está en memoria)
Boom, Claude ahora sabe qué API llamar, ¡con los parámetros completos!
Espera, tuve que crear otra herramienta en este servidor para hacer la solicitud restful real, porque el servidor "fetch" simplemente no funciona, y no quiero depurar por qué.
https://github.com/user-attachments/assets/484790d2-b5a7-475d-a64d-157e839ad9b0
Aspectos técnicos destacados:
query -> [Embedding] -> FAISS TopK -> OpenAPI docs -> MCP Client (Claude Desktop)
MCP Client -> Construct OpenAPI Request -> Execute Request -> Return Response
Características
- 🧠 Usa archivo json openapi remoto como fuente, sin acceso al sistema de archivos local, sin necesidad de actualizar para cambios de API
- 🔍 Búsqueda semántica usando el modelo optimizado MiniLM-L3 (43MB vs 90MB original)
- 🚀 Servidor basado en FastAPI con soporte asíncrono
- 🧠 Fragmentación de especificaciones OpenAPI basada en endpoints (maneja documentos de 100KB+), sin pérdida de contexto del endpoint
- ⚡ Búsqueda vectorial FAISS en memoria para descubrimiento instantáneo de endpoints
Limitaciones
- No soporta linux/arm/v7 (la compilación falla en la librería Transformer)
- 🐢 Penalización de arranque en frío (~15s para carga de modelo) si no se usa la imagen docker
- [Obsoleto] La imagen docker actual deshabilitó la descarga de modelos. Tienes una dependencia de huggingface. Cuando cargas Claude Desktop, tarda un tiempo en descargar el modelo. Si huggingface está caído, tu servidor no se iniciará.
- La última imagen docker incluye modelos precargados. Si hay problemas, volvería a la anterior.
Ejemplo de configuración multi-instancia
Aquí está el ejemplo de configuración multi-instancia. Lo diseñé para que pueda usarse de manera más flexible para múltiples conjuntos de APIs:
{
"mcpServers": {
"finance_openapi": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OPENAPI_JSON_DOCS_URL=https://api.finance.com/openapi.json",
"-e",
"MCP_API_PREFIX=finance",
"-e",
"GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com .'",
"buryhuang/mcp-server-any-openapi:latest"
]
},
"healthcare_openapi": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OPENAPI_JSON_DOCS_URL=https://api.healthcare.com/openapi.json",
"-e",
"MCP_API_PREFIX=healthcare",
"-e",
"GLOBAL_TOOL_PROMPT='Access to insights apis for Healthcare API services efg.com .",
"buryhuang/mcp-server-any-openapi:latest"
]
}
}
}
En este ejemplo:
- El servidor extraerá automáticamente las URLs base de los documentos OpenAPI:
https://api.finance.compara APIs de finanzashttps://api.healthcare.compara APIs de salud
- Opcionalmente puedes sobrescribir la URL base usando la variable de entorno
API_REQUEST_BASE_URL:
{
"mcpServers": {
"finance_openapi": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OPENAPI_JSON_DOCS_URL=https://api.finance.com/openapi.json",
"-e",
"API_REQUEST_BASE_URL=https://api.finance.staging.com",
"-e",
"MCP_API_PREFIX=finance",
"-e",
"GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com .'",
"buryhuang/mcp-server-any-openapi:latest"
]
}
}
}
Ejemplo de uso en Claude Desktop
Prompt de proyecto de Claude Desktop:
You should get the api spec details from tools financial_api_request_schema
You task is use financial_make_request tool to make the requests to get response. You should follow the api spec to add authorization header:
Authorization: Bearer <xxxxxxxxx>
Note: The base URL will be returned in the api_request_schema response, you don't need to specify it manually.
En el chat, puedes hacer:
Get prices for all stocks
Instalación
Instalación mediante Smithery
Para instalar Scalable OpenAPI Endpoint Discovery and API Request Tool para Claude Desktop automáticamente mediante Smithery:
npx -y @smithery/cli install @baryhuang/mcp-server-any-openapi --client claude
Usando pip
pip install mcp-server-any-openapi
Herramientas disponibles
El servidor proporciona las siguientes herramientas (donde {prefix} está determinado por MCP_API_PREFIX):
{prefix}_api_request_schema
Obtén los esquemas de endpoints de API que coincidan con tu intención. Devuelve detalles del endpoint, incluyendo ruta, método, parámetros y formatos de respuesta.
Esquema de entrada:
{
"query": {
"type": "string",
"description": "Describe what you want to do with the API (e.g., 'Get user profile information', 'Create a new job posting')"
}
}
{prefix}_make_request
Esencial para una ejecución confiable con APIs complejas donde las implementaciones simplificadas fallan. Proporciona:
Esquema de entrada:
{
"method": {
"type": "string",
"description": "HTTP method (GET, POST, PUT, DELETE, PATCH)",
"enum": ["GET", "POST", "PUT", "DELETE", "PATCH"]
},
"url": {
"type": "string",
"description": "Fully qualified API URL (e.g., https://api.example.com/users/123)"
},
"headers": {
"type": "object",
"description": "Request headers (optional)",
"additionalProperties": {
"type": "string"
}
},
"query_params": {
"type": "object",
"description": "Query parameters (optional)",
"additionalProperties": {
"type": "string"
}
},
"body": {
"type": "object",
"description": "Request body for POST, PUT, PATCH (optional)"
}
}
Formato de respuesta:
{
"status_code": 200,
"headers": {
"content-type": "application/json",
...
},
"body": {
// Response data
}
}
Soporte Docker
Compilaciones Multi-Arquitectura
Las imágenes oficiales soportan 3 plataformas:
# Build and push using buildx
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 \
-t buryhuang/mcp-server-any-openapi:latest \
--push .
Nombres de Herramientas Flexibles
Controla los nombres de las herramientas mediante MCP_API_PREFIX:
# Produces tools with "finance_api" prefix:
docker run -e MCP_API_PREFIX=finance_ ...
Plataformas Soportadas
- linux/amd64
- linux/arm64
Opción 1: Usar Imagen Preconstruida (Docker Hub)
docker pull buryhuang/mcp-server-any-openapi:latest
Opción 2: Compilación de Desarrollo Local
docker build -t mcp-server-any-openapi .
Ejecutar el Contenedor
docker run \
-e OPENAPI_JSON_DOCS_URL=https://api.example.com/openapi.json \
-e MCP_API_PREFIX=finance \
buryhuang/mcp-server-any-openapi:latest
Componentes Clave
-
EndpointSearcher: Clase principal que maneja:
- Análisis de especificaciones OpenAPI
- Creación de índice de búsqueda semántica
- Formateo de documentación de endpoints
- Procesamiento de consultas en lenguaje natural
-
Implementación del Servidor:
- Servidor FastAPI asíncrono
- Soporte de protocolo MCP
- Manejo de registro e invocación de herramientas
Ejecutar desde el Código Fuente
python -m mcp_server_any_openapi
Integración con Claude Desktop
Configura el servidor MCP en la configuración de tu Claude Desktop:
{
"mcpServers": {
"any_openapi": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OPENAPI_JSON_DOCS_URL=https://api.example.com/openapi.json",
"-e",
"MCP_API_PREFIX=finance",
"-e",
"GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com .",
"buryhuang/mcp-server-any-openapi:latest"
]
}
}
}
Contribuciones
- Haz un fork del repositorio
- Crea tu rama de características (
git checkout -b feature/amazing-feature) - Realiza tus cambios (
git commit -m 'Add some amazing feature') - Empuja a la rama (
git push origin feature/amazing-feature) - Abre una Solicitud de Extracción (Pull Request)
Licencia
Este proyecto está licenciado bajo los términos incluidos en el archivo LICENSE.
Notas de Implementación
- Procesamiento Centrado en Endpoints: A diferencia del análisis a nivel de documento que falla con especificaciones grandes, indexamos endpoints individuales con:
- Ruta + Método como identificadores únicos
- Incrustaciones conscientes de parámetros
- Contexto del esquema de respuesta
- Manejo Optimizado de Especificaciones: Procesa especificaciones OpenAPI de hasta 10MB (~5,000 endpoints) mediante:
- Carga perezosa de componentes de esquema
- Análisis paralelo de elementos de ruta
- Generación selectiva de incrustaciones (omite descripciones redundantes)