mcp-openapi-server
OpenAPI MCP Server
Ein Model Context Protocol (MCP)-Server, der OpenAPI-Endpunkte als MCP-Tools bereitstellt, mit optionaler Unterstützung für MCP-Prompts und -Ressourcen. Dieser Server ermöglicht es großen Sprachmodellen, REST-APIs, die durch OpenAPI-Spezifikationen definiert sind, über das MCP-Protokoll zu entdecken und mit ihnen zu interagieren.
📖 Dokumentation
Benutzerhandbuch - Für Benutzer, die diesen MCP-Server mit Claude Desktop, Cursor oder anderen MCP-Clients verwenden möchten
Verwendung als Bibliothek - Für Entwickler, die mit diesem Paket als Bibliothek eigene MCP-Server erstellen
Entwicklerhandbuch - Für Mitwirkende und Entwickler, die an der Codebasis arbeiten
AuthProvider-Leitfaden - Detaillierte Authentifizierungsmuster und Beispiele
Benutzerhandbuch
Dieser Abschnitt erläutert, wie Sie den MCP-Server als Endbenutzer mit Claude Desktop, Cursor oder anderen MCP-kompatiblen Tools verwenden.
Übersicht
Dieser MCP-Server kann auf zwei Arten verwendet werden:
CLI-Tool: Verwenden Sie
npx @ivotoby/openapi-mcp-serverdirekt mit Befehlszeilenargumenten für eine schnelle Einrichtung.Bibliothek: Importieren und verwenden Sie die Klasse
OpenAPIServerin Ihren eigenen Node.js-Anwendungen für individuelle Implementierungen.
Der Server unterstützt zwei Transportmethoden:
Stdio-Transport (Standard): Für die direkte Integration in KI-Systeme wie Claude Desktop, die MCP-Verbindungen über Standardeingabe/-ausgabe verwalten.
Streamable HTTP-Transport: Zum Verbinden mit dem Server über HTTP, sodass Web-Clients und andere HTTP-fähige Systeme das MCP-Protokoll nutzen können.
Schnellstart für Benutzer
Option 1: Verwendung mit Claude Desktop (Stdio-Transport)
Sie müssen dieses Repository nicht klonen. Konfigurieren Sie einfach Claude Desktop für die Verwendung dieses MCP-Servers:
Suchen oder erstellen Sie Ihre Claude-Desktop-Konfigurationsdatei:
Unter macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Fügen Sie die folgende Konfiguration hinzu:
{
"mcpServers": {
"openapi": {
"command": "npx",
"args": ["-y", "@ivotoby/openapi-mcp-server"],
"env": {
"API_BASE_URL": "https://api.example.com",
"OPENAPI_SPEC_PATH": "https://api.example.com/openapi.json",
"API_HEADERS": "Authorization:Bearer token123,X-API-Key:your-api-key"
}
}
}
}Ersetzen Sie die Umgebungsvariablen durch Ihre tatsächliche API-Konfiguration:
API_BASE_URL: Die Basis-URL Ihrer APIOPENAPI_SPEC_PATH: URL oder Pfad zu Ihrer OpenAPI-SpezifikationAPI_HEADERS: Durch Kommas getrennte key:value-Paare für API-Authentifizierungs-Header
Option 2: Verwendung mit HTTP-Clients (HTTP-Transport)
Um den Server mit HTTP-Clients zu verwenden:
Keine Installation erforderlich! Verwenden Sie npx, um das Paket direkt auszuführen:
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--headers "Authorization:Bearer token123" \
--transport http \
--port 3000Interagieren Sie über HTTP-Anfragen mit dem Server:
# Initialize a session (first request)
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl-client","version":"1.0.0"}}}'
# The response includes a Mcp-Session-Id header that you must use for subsequent requests
# and the InitializeResult directly in the POST response body.
# Send a request to list tools
# This also receives its response directly on this POST request.
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: your-session-id" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# Open a streaming connection for other server responses (e.g., tool execution results)
# This uses Server-Sent Events (SSE).
curl -N http://localhost:3000/mcp -H "Mcp-Session-Id: your-session-id"
# Example: Execute a tool (response will arrive on the GET stream)
# curl -X POST http://localhost:3000/mcp \
# -H "Content-Type: application/json" \
# -H "Mcp-Session-Id: your-session-id" \
# -d '{"jsonrpc":"2.0","id":2,"method":"tools/execute","params":{"name":"yourToolName", "arguments": {}}}'
# Terminate the session when done
curl -X DELETE http://localhost:3000/mcp -H "Mcp-Session-Id: your-session-id"Konfigurationsoptionen
Der Server kann über Umgebungsvariablen oder Befehlszeilenargumente konfiguriert werden:
Umgebungsvariablen
API_BASE_URL- Basis-URL für die API-EndpunkteOPENAPI_SPEC_PATH- Pfad oder URL zur OpenAPI-SpezifikationOPENAPI_SPEC_FROM_STDIN- Auf "true" setzen, um die OpenAPI-Spezifikation von der Standardeingabe zu lesenOPENAPI_SPEC_INLINE- Inhalt der OpenAPI-Spezifikation direkt als Zeichenfolge bereitstellenAPI_HEADERS- Durch Kommas getrennte key:value-Paare für API-HeaderCLIENT_CERT_PATH- Pfad zur PEM-Datei des Client-Zertifikats für gegenseitiges TLSCLIENT_KEY_PATH- Pfad zur PEM-Datei des privaten Clientschlüssels für gegenseitiges TLSCA_CERT_PATH- Pfad zur benutzerdefinierten PEM-Datei des CA-Zertifikats für private/interne ZertifizierungsstellenCLIENT_KEY_PASSPHRASE- Passphrase für einen verschlüsselten privaten ClientschlüsselREJECT_UNAUTHORIZED- Gibt an, ob nicht vertrauenswürdige Serverzertifikate abgelehnt werden sollen (Standard:true)SERVER_NAME- Name für den MCP-Server (Standard: "mcp-openapi-server")SERVER_VERSION- Version des Servers (Standard: "1.0.0")TRANSPORT_TYPE- Zu verwendender Transporttyp: "stdio" oder "http" (Standard: "stdio")HTTP_PORT- Port für den HTTP-Transport (Standard: 3000)HTTP_HOST- Host für den HTTP-Transport (Standard: "127.0.0.1")ENDPOINT_PATH- Endpunktpfad für den HTTP-Transport (Standard: "/mcp")TOOLS_MODE- Lademodus für Tools: "all" (alle endpunktbasierten Tools laden), "dynamic" (nur Meta-Tools laden) oder "explicit" (nur die in includeTools angegebenen Tools laden) (Standard: "all")DISABLE_ABBREVIATION- Namensoptimierung deaktivieren (dies kann Fehler verursachen, wenn der Name länger als 64 Zeichen ist)VERBOSE- Betriebsprotokollierung aktivieren (standardmäßigtrue; auffalsesetzen, um nicht unbedingt erforderliche Protokolle zu unterdrücken)PROMPTS_PATH- Pfad oder URL zur JSON/YAML-Datei für PromptsPROMPTS_INLINE- Prompts direkt als JSON-Zeichenfolge bereitstellenRESOURCES_PATH- Pfad oder URL zur JSON/YAML-Datei für RessourcenRESOURCES_INLINE- Ressourcen direkt als JSON-Zeichenfolge bereitstellen
Befehlszeilenargumente
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--headers "Authorization:Bearer token123,X-API-Key:your-api-key" \
--exclude-tag admin \
--client-cert ./certs/client.pem \
--client-key ./certs/client-key.pem \
--name "my-mcp-server" \
--server-version "1.0.0" \
--transport http \
--port 3000 \
--host 127.0.0.1 \
--path /mcp \
--disable-abbreviation true \
--verbose falseGegenseitiges TLS (mTLS)
Wenn Ihre vorgelagerte API eine Client-Zertifikatsauthentifizierung erfordert, können Sie TLS-Anmeldeinformationen direkt an ausgehende Anfragen anhängen.
npx @ivotoby/openapi-mcp-server \
--api-base-url https://secure-api.example.com \
--openapi-spec https://secure-api.example.com/openapi.json \
--client-cert ./certs/client.pem \
--client-key ./certs/client-key.pem \
--headers "Authorization:Bearer token123"Dies ist orthogonal zur Authentifizierung auf HTTP-Ebene, sodass mTLS mit statischen Headern oder einem AuthProvider kombiniert werden kann.
TLS-bezogene Optionen gelten nur, wenn --api-base-url https:// verwendet.
Für private Zertifizierungsstellen oder verschlüsselte Schlüssel:
npx @ivotoby/openapi-mcp-server \
--api-base-url https://internal-api.example.com \
--openapi-spec ./openapi.yaml \
--client-cert ./certs/client.pem \
--client-key ./certs/client-key.pem \
--client-key-passphrase "$CLIENT_KEY_PASSPHRASE" \
--ca-cert ./certs/internal-ca.pem \
--reject-unauthorized false--client-cert/CLIENT_CERT_PATH: PEM-Datei des Client-Zertifikats--client-key/CLIENT_KEY_PATH: PEM-Datei des privaten Clientschlüssels--client-key-passphrase/CLIENT_KEY_PASSPHRASE: Passphrase für verschlüsselte private Schlüssel--ca-cert/CA_CERT_PATH: Benutzerdefiniertes CA-Bündel für private/interne Zertifizierungsstellen--reject-unauthorized/REJECT_UNAUTHORIZED: Nur auffalsesetzen, wenn Sie absichtlich selbstsignierte oder anderweitig nicht vertrauenswürdige Serverzertifikate zulassen möchten
Setzen Sie --verbose false oder VERBOSE=false, wenn der Server in Skripten oder eingebetteten Umgebungen still bleiben soll.
Laden der OpenAPI-Spezifikation
Der MCP-Server unterstützt mehrere Methoden zum Laden von OpenAPI-Spezifikationen und bietet so Flexibilität für verschiedene Bereitstellungsszenarien:
1. Laden per URL (Standard)
Laden Sie die OpenAPI-Spezifikation von einer entfernten URL:
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json2. Laden aus lokaler Datei
Laden Sie die OpenAPI-Spezifikation aus einer lokalen Datei:
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec ./path/to/openapi.yaml3. Laden über die Standardeingabe
Lesen Sie die OpenAPI-Spezifikation von der Standardeingabe (nützlich für Piping oder containerisierte Umgebungen):
# Pipe from file
cat openapi.json | npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--spec-from-stdin
# Pipe from curl
curl -s https://api.example.com/openapi.json | npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--spec-from-stdin
# Using environment variable
export OPENAPI_SPEC_FROM_STDIN=true
echo '{"openapi": "3.0.0", ...}' | npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com4. Inline-Spezifikation
Stellen Sie den Inhalt der OpenAPI-Spezifikation direkt als Befehlszeilenargument bereit:
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--spec-inline '{"openapi": "3.0.0", "info": {"title": "My API", "version": "1.0.0"}, "paths": {}}'
# Using environment variable
export OPENAPI_SPEC_INLINE='{"openapi": "3.0.0", ...}'
npx @ivotoby/openapi-mcp-server --api-base-url https://api.example.comUnterstützte Formate
Alle Lademethoden unterstützen sowohl JSON- als auch YAML-Formate. Der Server erkennt das Format automatisch und parst entsprechend.
Docker- und Container-Nutzung
Für containerisierte Bereitstellungen können Sie OpenAPI-Spezifikationen einhängen oder stdin verwenden:
# Mount local file
docker run -v /path/to/spec:/app/spec.json your-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec /app/spec.json
# Use stdin with docker
cat openapi.json | docker run -i your-mcp-server \
--api-base-url https://api.example.com \
--spec-from-stdinFehlerbehandlung
Der Server liefert detaillierte Fehlermeldungen für Fehler beim Laden der Spezifikation:
Laden per URL: HTTP-Statuscodes und Netzwerkfehler
Laden aus Datei: Dateisystemfehler (nicht gefunden, Berechtigungen usw.)
Laden über stdin: Leere Eingabe oder Lesefehler
Inline-Laden: Fehler bei fehlendem Inhalt
Parsing-Fehler: Detaillierte JSON/YAML-Syntaxfehlermeldungen
Validierung
Es kann jeweils nur eine Spezifikationsquelle verwendet werden. Der Server validiert, dass genau eine der folgenden Optionen angegeben ist:
--openapi-spec(URL oder Dateipfad)--spec-from-stdin--spec-inline
Wenn mehrere Quellen angegeben werden, beendet sich der Server mit einer Fehlermeldung.
Tool-Laden & Filteroptionen
Basierend auf dem Stainless-Artikel „What We Learned Converting Complex OpenAPI Specs to MCP Servers" (https://www.stainless.com/blog/what-we-learned-converting-complex-openapi-specs-to-mcp-servers) wurden die folgenden Flags hinzugefügt, um zu steuern, welche API-Endpunkte (Tools) geladen werden:
--tools <all|dynamic|explicit>: Wählen Sie den Modus zum Laden der Tools:all(Standard): Lädt alle Tools aus der OpenAPI-Spezifikation und wendet alle angegebenen Filter an.dynamic: Lädt nur dynamische Meta-Tools (list-api-endpoints,get-api-endpoint-schema,invoke-api-endpoint).--exclude-taggilt weiterhin für die dynamische Endpunkt-Erkennung und -Aufrufung.explicit: Lädt nur Tools, die explizit in--tool-Optionen aufgeführt sind, und ignoriert Include-Filter.--exclude-taggilt weiterhin als Deny-Filter.
--tool <toolId>: Importiert nur angegebene Tool-IDs oder -Namen. Kann mehrfach verwendet werden. Im Modusallumgeht dies--tag,--resourceund--operation, nicht jedoch--exclude-tag.--tag <tag>: Importiert nur Tools mit dem angegebenen OpenAPI-Tag. Kann mehrfach verwendet werden.--exclude-tag <tag>: Schließt Tools mit dem angegebenen OpenAPI-Tag aus. Kann mehrfach verwendet werden. Ausgeschlossene Tags haben Vorrang vor--tool.--resource <resource>: Importiert nur Tools unter den angegebenen Ressourcenpfad-Präfixen. Kann mehrfach verwendet werden.--operation <method>: Importiert nur Tools für die angegebenen HTTP-Methoden (get, post usw.). Kann mehrfach verwendet werden.
Tag-Filter sind Kontrollen auf Tool-Ebene, keine Autorisierung. Schützen Sie sensible Endpunkte weiterhin mit dem Authentifizierungsmodell der vorgelagerten API. Endpunkte ohne Tag werden von --exclude-tag nicht beeinflusst.
Beispiele:
# Load only dynamic meta-tools
npx @ivotoby/openapi-mcp-server --api-base-url https://api.example.com --openapi-spec https://api.example.com/openapi.json --tools dynamic
# Load only explicitly specified tools (ignores other filters)
npx @ivotoby/openapi-mcp-server --api-base-url https://api.example.com --openapi-spec https://api.example.com/openapi.json --tools explicit --tool GET::users --tool POST::users
# Load only the GET /users endpoint tool (using all mode with filtering)
npx @ivotoby/openapi-mcp-server --api-base-url https://api.example.com --openapi-spec https://api.example.com/openapi.json --tool GET-users
# Load tools tagged with "user" under the "/users" resource
npx @ivotoby/openapi-mcp-server --api-base-url https://api.example.com --openapi-spec https://api.example.com/openapi.json --tag user --resource users
# Exclude admin and internal endpoints from any tool loading mode
npx @ivotoby/openapi-mcp-server --api-base-url https://api.example.com --openapi-spec https://api.example.com/openapi.json --exclude-tag admin --exclude-tag internal
# Load only POST operations
npx @ivotoby/openapi-mcp-server --api-base-url https://api.example.com --openapi-spec https://api.example.com/openapi.json --operation postPrompts und Ressourcen
Zusätzlich zur Bereitstellung von OpenAPI-Endpunkten als Tools kann dieser Server über das MCP-Protokoll auch Prompts (wiederverwendbare Vorlagen) und Ressourcen (statische Inhalte) bereitstellen.
Was sind Prompts und Ressourcen?
Funktion | Zweck | Anwendungsfall |
Tools | API-Endpunkte, die die KI ausführen kann | API-Aufrufe durchführen |
Prompts | Vorlagenbasierte Nachrichten mit Argumentersetzung | Wiederverwendbare Workflow-Vorlagen |
Ressourcen | Schreibgeschützter Inhalt für den Kontext | API-Dokumentation, Schemas |
Laden von Prompts
Prompts können aus Dateien, URLs oder Inline-JSON geladen werden:
# Load from local file
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--prompts ./prompts.json
# Load from URL
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--prompts https://example.com/mcp/prompts.json
# Inline JSON
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--prompts-inline '[{"name":"greet","title":"Greeting","template":"Hello {{name}}!"}]'Prompts-Dateiformat (JSON):
[
{
"name": "api_request",
"title": "API Request Helper",
"description": "Helps generate API request templates",
"arguments": [
{ "name": "endpoint", "description": "API endpoint path", "required": true },
{ "name": "method", "description": "HTTP method", "required": false }
],
"template": "Create a {{method}} request to {{endpoint}} with proper parameters."
}
]Laden von Ressourcen
Ressourcen können aus Dateien, URLs oder Inline-JSON geladen werden:
# Load from local file
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--mcp-resources ./resources.json
# Load from URL
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--mcp-resources https://example.com/mcp/resources.json
# Inline JSON
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--mcp-resources-inline '[{"uri":"docs://readme","name":"readme","text":"# Welcome"}]'Ressourcen-Dateiformat (JSON):
[
{
"uri": "docs://api/overview",
"name": "api-overview",
"title": "API Overview",
"description": "Overview of the API",
"mimeType": "text/markdown",
"text": "# API Overview\n\nThis API provides..."
}
]Kombinieren von Tools, Prompts und Ressourcen
npx @ivotoby/openapi-mcp-server \
--api-base-url https://api.example.com \
--openapi-spec https://api.example.com/openapi.json \
--prompts ./prompts.json \
--mcp-resources ./resources.json \
--transport http \
--port 3000Mit dieser Konfiguration macht der Server Fähigkeiten für alle drei bekannt:
{
"capabilities": {
"tools": { "list": true, "execute": true },
"prompts": {},
"resources": {}
}
}Transportarten
Stdio-Transport (Standard)
Der Stdio-Transport ist für die direkte Integration in KI-Systeme wie Claude Desktop konzipiert, die MCP-Verbindungen über Standardeingabe/-ausgabe verwalten. Dies ist die einfachste Einrichtung und erfordert keine Netzwerkkonfiguration.
Wann verwenden: Bei der Integration mit Claude Desktop oder anderen Systemen, die stdio-basierte MCP-Kommunikation unterstützen.
Streamable HTTP-Transport
Der HTTP-Transport ermöglicht den Zugriff auf den MCP-Server über HTTP, sodass Webanwendungen und andere HTTP-fähige Clients mit dem MCP-Protokoll interagieren können. Er unterstützt Sitzungsverwaltung, Streaming-Antworten und Standard-HTTP-Methoden.
Hauptmerkmale:
Sitzungsverwaltung mit Mcp-Session-Id-Header
HTTP-Antworten auf
initialize- undtools/list-Anfragen werden synchron über die POST-Anfrage gesendet.Andere Server-zu-Client-Nachrichten (z. B.
tools/execute-Ergebnisse, Benachrichtigungen) werden über eine GET-Verbindung mit Server-Sent Events (SSE) gestreamt.Unterstützung für POST/GET/DELETE-Methoden
Wann verwenden: Wenn Sie den MCP-Server für Web-Clients oder Systeme bereitstellen müssen, die über HTTP statt über stdio kommunizieren.
Health-Check-Endpunkt
Bei Verwendung des HTTP-Transports ist unter /health ein Health-Check-Endpunkt für Überwachung und Service-Discovery verfügbar:
# Check server health
curl http://localhost:3000/health
# Response:
# {
# "status": "healthy",
# "activeSessions": 2,
# "uptime": 3600
# }Felder der Health-Antwort:
status: Gibt immer "healthy" zurück, wenn der Server läuftactiveSessions: Anzahl der aktiven MCP-Sitzungenuptime: Uptime des Servers in Sekunden
Hauptmerkmale:
Keine Authentifizierung erforderlich
Funktioniert mit jeder HTTP-Methode (GET, POST usw.)
Ideal für Load Balancer, Kubernetes-Probes und Überwachungssysteme
Integrationsbeispiele:
# Kubernetes liveness probe
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 3
periodSeconds: 10
# Docker healthcheck
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:3000/health || exit 1Sicherheitshinweise
Der HTTP-Transport validiert Origin-Header, um DNS-Rebinding-Angriffe zu verhindern
Standardmäßig bindet der HTTP-Transport nur an localhost (127.0.0.1)
Wenn Sie den Zugriff auf andere Hosts ermöglichen, sollten Sie eine zusätzliche Authentifizierung implementieren
Debugging
So zeigen Sie Debug-Protokolle an:
Bei Verwendung des Stdio-Transports mit Claude Desktop:
Die Protokolle erscheinen in den Claude-Desktop-Protokollen
Bei Verwendung des HTTP-Transports:
npx @ivotoby/openapi-mcp-server --transport http &2>debug.log
Verwendung als Bibliothek
Dieser Abschnitt richtet sich an Entwickler, die dieses Paket als Bibliothek verwenden möchten, um eigene MCP-Server zu erstellen.
🚀 Verwendung als Bibliothek
Erstellen Sie dedizierte MCP-Server für spezifische APIs, indem Sie die OpenAPIServer-Klasse importieren und konfigurieren. Dieser Ansatz ist ideal für:
Benutzerdefinierte Authentifizierung: Implementieren Sie komplexe Authentifizierungsmuster mit dem
AuthProvider-InterfaceAPI-spezifische Optimierungen: Filtern Sie Endpunkte, passen Sie die Fehlerbehandlung an und optimieren Sie für bestimmte Anwendungsfälle
Verteilung: Verpacken Sie Ihren Server als eigenständiges npm-Modul zum einfachen Teilen
Integration: Betten Sie den Server in größere Anwendungen ein oder fügen Sie benutzerdefinierte Middleware hinzu
Grundlegende Verwendung der Bibliothek
import { OpenAPIServer } from "@ivotoby/openapi-mcp-server"
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
const config = {
name: "my-api-server",
version: "1.0.0",
apiBaseUrl: "https://api.example.com",
openApiSpec: "https://api.example.com/openapi.json",
specInputMethod: "url" as const,
headers: {
Authorization: "Bearer your-token",
"X-API-Key": "your-api-key",
},
transportType: "stdio" as const,
toolsMode: "all" as const, // Options: "all", "dynamic", "explicit"
}
const server = new OpenAPIServer(config)
const transport = new StdioServerTransport()
await server.start(transport)Lademodi für Tools
Die Konfigurationsoption toolsMode steuert, welche Tools aus Ihrer OpenAPI-Spezifikation geladen werden:
// Load all tools from the spec (default)
const config = {
// ... other config
toolsMode: "all" as const,
// Optional: Apply filters to control which tools are loaded
includeTools: ["GET::users", "POST::users"], // Only these tools
includeTags: ["public"], // Only tools with these tags
excludeTags: ["admin", "internal"], // Never expose tools with these tags
includeResources: ["users"], // Only tools under these resources
includeOperations: ["get", "post"], // Only these HTTP methods
}
// Load only dynamic meta-tools for API exploration
const config = {
// ... other config
toolsMode: "dynamic" as const,
// Provides: list-api-endpoints, get-api-endpoint-schema, invoke-api-endpoint
// excludeTags still hides matching operations from discovery and invocation
}
// Load only explicitly specified tools (include filters are ignored)
const config = {
// ... other config
toolsMode: "explicit" as const,
includeTools: ["GET::users", "POST::users"], // Only these exact tools
excludeTags: ["admin"], // Still applied as a deny filter
// includeTags, includeResources, includeOperations are ignored in explicit mode
}Konfiguration von Prompts und Ressourcen
Stellen Sie neben Ihren API-Tools wiederverwendbare Prompts und statische Ressourcen bereit:
import { OpenAPIServer } from "@ivotoby/openapi-mcp-server"
const config = {
name: "my-api-server",
version: "1.0.0",
apiBaseUrl: "https://api.example.com",
openApiSpec: "https://api.example.com/openapi.json",
specInputMethod: "url" as const,
transportType: "stdio" as const,
toolsMode: "all" as const,
// Define prompts with argument templates
prompts: [
{
name: "api_request",
title: "API Request Helper",
description: "Helps generate API request templates",
arguments: [
{ name: "endpoint", description: "API endpoint path", required: true },
{ name: "method", description: "HTTP method", required: false },
],
template: "Create a {{method}} request to {{endpoint}} with proper parameters.",
},
],
// Define resources with static content
resources: [
{
uri: "docs://api/overview",
name: "api-overview",
title: "API Overview",
description: "Overview of the API capabilities",
mimeType: "text/markdown",
text: "# API Overview\n\nThis API provides...",
},
],
}
const server = new OpenAPIServer(config)Hinzufügen zusätzlicher benutzerdefinierter Tools
Sie können neben den aus Ihrer OpenAPI-Spezifikation generierten Tools auch einige handgeschriebene MCP-Tools bereitstellen:
import { OpenAPIServer } from "@ivotoby/openapi-mcp-server"
const extraTools = [
{
id: "add",
tool: {
name: "add",
description: "Add two numbers",
inputSchema: {
type: "object",
properties: {
a: { type: "number" },
b: { type: "number" },
},
required: ["a", "b"],
},
},
handler: async (args) => {
const a = Number(args.a)
const b = Number(args.b)
const result = a + b
return {
content: [{ type: "text", text: JSON.stringify({ result }) }],
structuredContent: { result },
}
},
},
]
const server = new OpenAPIServer({
name: "my-api-server",
version: "1.0.0",
apiBaseUrl: "https://api.example.com",
openApiSpec: "https://api.example.com/openapi.json",
specInputMethod: "url",
transportType: "stdio",
toolsMode: "all",
extraTools,
})Hinweise:
extraToolsgibt es in dieser ersten Version nur für die Bibliothek; es gibt kein CLI-Format für Funktions-HandlerDie IDs der zusätzlichen Tools und die MCP-Toolnamen müssen sowohl bei benutzerdefinierten als auch bei OpenAPI-generierten Tools eindeutig sein
Handler für zusätzliche Tools müssen ein normales MCP-
tools/call-Ergebnisobjekt zurückgeben
Dynamische Verwaltung von Prompts und Ressourcen
Sie können auch nach der Servererstellung dynamisch Prompts und Ressourcen hinzufügen:
const server = new OpenAPIServer(config)
// Add prompts dynamically
const promptsManager = server.getPromptsManager()
if (promptsManager) {
promptsManager.addPrompt({
name: "debug_error",
title: "Error Debugger",
template: "Debug this API error: {{error_message}}",
})
}
// Add resources dynamically
const resourcesManager = server.getResourcesManager()
if (resourcesManager) {
resourcesManager.addResource({
uri: "docs://changelog",
name: "changelog",
title: "API Changelog",
mimeType: "text/markdown",
text: "# Changelog\n\n## v1.0.0\n- Initial release",
})
}Format für Prompt-Definitionen
interface PromptDefinition {
name: string // Unique identifier
title?: string // Human-readable display title
description?: string // Description of the prompt
arguments?: {
// Template arguments
name: string
description?: string
required?: boolean
}[]
template: string // Template with {{argName}} placeholders
}Format für Ressourcendefinitionen
interface ResourceDefinition {
uri: string // Unique URI identifier
name: string // Resource name
title?: string // Human-readable display title
description?: string // Description of the resource
mimeType?: string // Content MIME type
text?: string // Static text content
blob?: string // Static binary content (base64)
contentProvider?: () => Promise<string | { blob: string }> // Dynamic content
}Erweiterte Authentifizierung mit AuthProvider
Für APIs mit Token-Ablauf, Aktualisierungsanforderungen oder komplexer Authentifizierung:
import { OpenAPIServer, AuthProvider } from "@ivotoby/openapi-mcp-server"
import { AxiosError } from "axios"
class MyAuthProvider implements AuthProvider {
async getAuthHeaders(): Promise<Record<string, string>> {
// Called before each request - return fresh headers
if (this.isTokenExpired()) {
await this.refreshToken()
}
return { Authorization: `Bearer ${this.token}` }
}
async handleAuthError(error: AxiosError): Promise<boolean> {
// Called on 401/403 errors - return true to retry
if (error.response?.status === 401) {
await this.refreshToken()
return true // Retry the request
}
return false
}
}
const authProvider = new MyAuthProvider()
const config = {
// ... other config
authProvider: authProvider, // Use AuthProvider instead of static headers
}**📚 Siehe das Verzeichnis examples/ für vollständige funktionsfähige Beispiele, **:
Einfache Bibliotheksnutzung mit statischer Authentifizierung
AuthProvider-Implementierungen für verschiedene Szenarien
Integration der realen Beatport-API
Produktionsreife Verpackungsmuster
🔐 Dynamische Authentifizierung mit AuthProvider
Das AuthProvider-Interface ermöglicht komplexe Authentifizierungsszenarien, die statische Header nicht unterstützen können:
Key-Funktionen
Dynamische Headers: Für jede Anfrage frische Auth-Header
Behandlung von Token-Abläufen: Automatische Erkennung und Fehlerbehandlung
Wiederherstellung bei Authentifizierungsfehlern: Wiederholungslogik für behebbare Fehler
Benutzerdefinierte Fehlermeldungen: Klare und hilfreiche Anweisungen für Benutzer
Das AuthProvider-Interface
interface AuthProvider {
/**
* Get authentication headers for the current request
* Called before each API request to get fresh headers
*/
getAuthHeaders(): Promise<Record<string, string>>
/**
* Handle authentication errors from API responses
* Called when the API returns 401 or 403 errors
* Return true to retry the request, false otherwise
*/
handleAuthError(error: AxiosError): Promise<boolean>
}Häufige Muster
Automatische Token-Aktualisierung
class RefreshableAuthProvider implements AuthProvider {
async getAuthHeaders(): Promise<Record<string, string>> {
if (this.isTokenExpired()) {
await this.refreshToken()
}
return { Authorization: `Bearer ${this.accessToken}` }
}
async handleAuthError(error: AxiosError): Promise<boolean> {
if (error.response?.status === 401) {
await this.refreshToken()
return true // Retry with fresh token
}
return false
}
}Manuelle Token-Verwaltung (z. B. Beatport)
class ManualTokenAuthProvider implements AuthProvider {
async getAuthHeaders(): Promise<Record<string, string>> {
if (!this.token || this.isTokenExpired()) {
throw new Error(
"Token expired. Please get a new token from your browser:\n" +
"1. Go to the API website and log in\n" +
"2. Open browser dev tools (F12)\n" +
"3. Copy the Authorization header from any API request\n" +
"4. Update your token using updateToken()",
)
}
return { Authorization: `Bearer ${this.token}` }
}
updateToken(token: string): void {
this.token = token
this.tokenExpiry = new Date(Date.now() + 3600000) // 1 hour
}
}API-Schlüssel-Authentifizierung
class ApiKeyAuthProvider implements AuthProvider {
constructor(private apiKey: string) {}
async getAuthHeaders(): Promise<Record<string, string>> {
return { "X-API-Key": this.apiKey }
}
async handleAuthError(error: AxiosError): Promise<boolean> {
throw new Error("API key authentication failed. Please check your key.")
}
}📖 You can find this documentation and examples in docs/auth-provider-guide.md
Verarbeitung von OpenAPI-Schemata
Referenzauflösung
Der MCP-Server unterstützt eine robuste $ref-Auflösung von OpenAPI-Referenzen, um API-Schemata genau darzustellen:
Parameterreferenzen: Löst
$ref-Referenzen auf Parameter-Komponenten in der OpenAPI-Spec vollständig aufSchemareferenzen: Verarbeitet verschachtelte Schema-Referenzen in den Param-/Body-Dateien
Rekursive Referenzen: Verhindert Endlosschleifen durch automatische Zirkular-Erkennung
Verschachtelte Eigenschaften: Enthält komplexe Objekt- und Array-Strukturen inklusive ihrer Attribute
Zusammensetzung des Eingabeschemas
Der Server kombiniert Parameter und Request-Bodies und ein zusammengesetztes Schema für jedes Tool:
Parameter & Request-Body-Combining: Gleichschaltung von Path-, Query- und Body-Parametern in einem einzigen Schema
Konfliktbehandlung: Löst Name-Konflikte auf, indem kollidierende Properties mit
body_www.Typenerhalt: Behält die ursprünglichen Typinformationen für alle Schema-Elemente
Erhalt der Metadaten: Diese und weitere Attribute, Formate, Defaults und Enum-Werte werden nicht angetastet
Unterstützung komplexer Schemata
Der MCP-Server verfügt über aller lassen Sie uns umgehen. Mit Satz OpenAPI`-Schemata:
Primitive-Bodys: Nicht-Objekt-Bodys werden in die "body"-Property eingeklappt
Objekt-Bodys: Objekteigenschaften werden in dasTool-Eingabeschema eingefügt
Array-Bodys: Arrays werden mit ihren verschachtelten Elementen korrekt verarbeitet
Required-Felder-Auszeichnung: Speichert und behandelt Pflichtfelder
Informationen für Entwickler
Für Entwickler
Entwicklungs-Tools
npm run build– Buildet den TypeScript-Quellcodenpm run clean– Entfernt Build-Artefaktenpm test– Startet die Vitest-Testsuitenpm run typecheck– Führt Type-Typ Überprüfungnpm run lint– Lintsrc/**/*.tstype-awarenpm run dev– Watch-Quelldateien und baut bei Änderungen neunpm run inspect-watch– Startet den Inspector mit Auto-Reload automatisch
Vorbereitung für Pull Requests
Führen Sie die vollständigen lokalen Verifikations-Suites aus, bevor Sie Ihr PR stellen:
npm run build
npm test
npm run typecheck
npm run lintnpm run build regeneriert dist/ so, dass die CLI-Tests mit dem aktuellen Code laufen npm run lint ist bewusst type-aware und sollte für alle Quell-Dateien fehlerfrei sein.
Entwicklungsworkflow
Klonen Sie das Repository
Installieren Sie die Abhängigkeiten:
npm installStarten Sie die Entwicklungsumgebung:
npm run inspect-watchÄndern Sie die TypeScript-Dateien in
src/Der Server wird automatisch neu gebaut und neu gestartet
Beiträge
Erstellen Sie einen Fork des Repos
Erstellen Sie einen Feature-
branchNehmen Sie Ihre Änderungen vor
Führen Sie Build, Tests, Typecheck und Lint aus:
npm run build && npm test && npm run typecheck && npm run lintErstellen Sie einen Pull-Request
📖 Für die komplette Entwickler-Doku siehe docs/developer-guide.md
FAQ
F: Was ist ein „Tool”? A: Ein „Tool“ ist in diesem Zusammenhang ein API-Endpunkt, der aus Ihrer OpenAPI-Spezifikation kommt und als MCP-Ressource verfügbar gemacht wird.
F: Wie verwende ich das Paket in meinem Projekt?
A: Importieren Sie die OpenAPIServer-Klasse und verwenden Sie sie als Bibliothek in Ihrer Node.js-Anwendung. Das erlaubt Ihnen dedizierte MCP-Server für eine API mit eigener Auth, Filterung und Fehlerbehandlung zu bauen. Siehe examples/ für Komplettlösungen.
F: Was ist der Unterschied zwischen der CLI und der Bibliotheknutzung?
A: Die CLI ist ideal für Quick-Setup und Test. Im Library-Modus können Sie eigene Pakete für bestimmte APIs anlegen, benutzerdefinierte Auth (mit AuthProvider) implementieren, eigene Logik hinzufügen und Ihren Server als npm-Modul mit anderen teilen.
F: Wie handle ich APIs mit ablaufenden Tokens?
A: Verwenden Sie das AuthProvider-Interface statt statischer Header. Der Provider kann Sie verwenden und Ihnen frische Token-Entity bereitstellen: track expiry, refresh and during falls. Und lesen die AuthProvider-Doku für Muster.
F: Was ist AuthProvider und wann nutze ich sie?
A: AuthProvider ist eine Schnittstelle für dynamische Authentifizierung, die die neuen Header before jedem Request liefert und Auth-Fehler behandelt. Nutzen Sie ihn, wenn Token ablaufen, ein automatisches Refresh nötig ist, also eine Api mit complex Auth, die static header nicht liefert.
F: Wie filtere ich, welche Tools geladen werden?
A: Filtern über die Flags --tool, --tag, --exclude-tag, --resource und --operation mit --tools all (Standard). Setzen Sie --tools dynamic für nur Agenten-System oder --tools explicit für in --to. Mit --exclude-tag` gilt dynamisch/in.
F: Wann sollte ich den dynamischen Modus verwenden?
A: dynamische Modus hat Tool-Metadaten (list-api-endpoints, get-api-endpoint-schema, invoke-api-endpoint) zum Anzeigen und Aufrufen von Endpunkten – ohne dass alle Sensoren im Voraus geladen sind; empfohlen bei großen oder API-Variablen.
F: Was sind Prompts and Ressources?
A: Prompts sind wiederverwendbare Nachrichtenvorlagen mit Platzhaltern wie {{name}}, die über MCP prompts/get and die Resources are static oder dynamic Inhalte (Textieren / Binär), die mit resources/read aus Engelesen werden können. Beide sind optional, zusätzlich conf.
F: Wie man sie über die CLI Pin
A: Aufruf --prompts <path|url> für Prompts (idd) oder --resource. Sie können außerdem --prompts-inline and --resources-json verwenden. Details im Abschnitt „Prompts und Resources“ im Benutzerhandbuch.
F: Wo gebe ich Custom Header für den Request an?
A: CLI: --headers oder API_HEADERS umgeben mit key:value, Komma. Bei einiger Bibliothek-Option headers Option verwenden oder einen eigenen AuthProvider implementieren, der dynamisch Headers.
F: Welche Transport-Arten gibt es? A: Server unterstützt Stdio (Standard) für AI und HTTP (mit SSE-Streaming) für Browser.
F: Wie werden schwierige Schemas behandelt?
A: Sie vollständige $ref- und Schema Attributes auf und behält zirkulares. Sehen OpenAPI Schema Processing für die Details.
F: Bei Namenskonflikten zwischen Parametri und Body?
A: Der Server erkennt sie und versieht body-Eigenschaften automatisch mit body_, so dass alle zugreifbar bleiben.
F: Kann ich meinen Server weiter verteilen?
A: Ja! Der Bibliothekansatz ist ideal. Erstellen Sie ein natürlich oder npm-Paket gemäß dem „Beatport“-Beispiel, verpacken Sie in robuste npx your-api-mcp-server zu verbereiten und auszuliefern.
F: Wo gibt's Entwicklungs- und Mitwirkungs Guideline? A: Im Entwicklerleitfaden für Architektur besonders, Konzepte, den Entwicklungsworkflow und viele Beitragsleitfaden.
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Point Gecko at an OpenAPI spec; get first-call-correct, auth-hidden agent tools.
MCP server for AI access to Swagger by SmartBear.
MCP server exposing the Backtest360 engine API as tools for AI agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TuanLdv/mcp-openapi-server-demo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server