Erste Schritte
Wähle einen kompatiblen OAuth 2.1- oder OpenID Connect-Anbieter
Die MCP-Spezifikation hat einige spezifische Anforderungen für die Autorisierung:
- OAuth 2.1 IETF DRAFT
- OAuth 2.0 Authorization Server Metadata (RFC 8414)
- OAuth 2.0 Dynamic Client Registration Protocol (RFC 7591)
Während die letzten beiden nicht zwingend erforderlich sind, ist die erste notwendig, um eine sichere und konforme Implementierung zu gewährleisten.
Im neuen MCP-Entwurf wird RFC 8414 für Autorisierungsserver (Anbieter) verpflichtend sein. Wir werden die Dokumentation aktualisieren, sobald der neue Entwurf finalisiert ist.
Du kannst die Liste der MCP-kompatiblen Anbieter prüfen, um zu sehen, ob dein Anbieter unterstützt wird.
Installiere MCP Auth SDK
MCP Auth ist sowohl für Python als auch für TypeScript verfügbar. Lass uns wissen, wenn du Unterstützung für eine andere Sprache oder ein anderes Framework benötigst!
- Python
- Node.js
pip install mcpauth
Oder ein anderer Paketmanager deiner Wahl, wie pipenv oder poetry.
npm install mcp-auth
Oder ein anderer Paketmanager deiner Wahl, wie pnpm oder yarn.
Initialisiere MCP Auth
Der erste Schritt ist die Initialisierung der MCP Auth-Instanz mit den Metadaten deines Anbieter-Autorisierungsservers. Wenn dein Anbieter eine der folgenden Spezifikationen unterstützt:
kannst du die eingebaute Funktion verwenden, um die Metadaten abzurufen und die MCP Auth-Instanz zu initialisieren:
- Python
- Node.js
from mcpauth import MCPAuth
from mcpauth.config import AuthServerType
from mcpauth.utils import fetch_server_config
mcp_auth = MCPAuth(
server=fetch_server_config(
'<auth-server-url>',
type=AuthServerType.OIDC # oder AuthServerType.OAUTH
)
)
import { MCPAuth, fetchServerConfig } from 'mcp-auth';
const mcpAuth = new MCPAuth({
server: await fetchServerConfig('<auth-server-issuer>', { type: 'oidc' }), // oder 'oauth'
});
Wenn du die Metadaten-URL oder Endpunkte manuell angeben musst, siehe Weitere Möglichkeiten zur Initialisierung von MCP Auth.
Binde den Metadaten-Endpunkt ein
Um der aktuellen MCP-Spezifikation zu entsprechen, bindet MCP Auth den OAuth 2.0 Authorization Server Metadata-Endpunkt (/.well-known/oauth-authorization-server
) in deinen MCP-Server ein:
- Python
- Node.js
from starlette.applications import Starlette
app = Starlette(routes=[
mcp_auth.metadata_route(),
])
import express from 'express';
const app = express();
app.use(mcpAuth.delegatedRouter());
Die URLs in den Metadaten bleiben unverändert, sodass die Rolle des Autorisierungsservers vollständig an den Anbieter delegiert wird. Du kannst den Metadaten-Endpunkt testen, indem du /.well-known/oauth-authorization-server
in deinem MCP-Server aufrufst.
Warum nur der Metadaten-Endpunkt?
Du wirst vielleicht sehen, dass die offiziellen SDKs einen Auth-Router bereitstellen, der Autorisierungsendpunkte wie /authorize
, /token
usw. einbindet. Hier ist der Grund, warum wir das nicht tun:
- Nur den Metadaten-Endpunkt einzubinden, ermöglicht es dir, die vollen Fähigkeiten deines Anbieters zu nutzen, ohne das Rad neu zu erfinden und unnötige Komplexität in deinen MCP-Server zu bringen.
- Es gibt außerdem Bestrebungen, die Rolle des MCP-Servers zu einem Ressourcenserver zu verschieben und OAuth 2.0 Protected Resource Metadata (RFC 9728) zu verlangen. Das bedeutet, dass der MCP-Server keine Autorisierungslogik mehr übernimmt (einschließlich des Metadaten-Endpunkts), sondern nur noch als Ressourcenserver dient, der sich für Authentifizierung und Autorisierung auf den Anbieter verlässt.
Wir werden MCP Auth aktualisieren, um die neue MCP-Spezifikation zu unterstützen, sobald sie finalisiert ist. In der Zwischenzeit kannst du die aktuelle Version verwenden, die mit der aktuellen Spezifikation kompatibel ist.
Verwende das Bearer-Auth-Middleware
Sobald die MCP Auth-Instanz initialisiert ist, kannst du das Bearer-Auth-Middleware anwenden, um deine MCP-Routen zu schützen:
- Python
- Node.js
from starlette.applications import Starlette
from starlette.middleware import Middleware
from starlette.routing import Mount
from mcpauth import MCPAuth
from mcp.server.fastmcp import FastMCP
mcp = FastMCP()
mcp_auth = MCPAuth(
# Initialisiere mit deiner Auth-Server-Konfiguration
)
bearer_auth = mcp_auth.bearer_auth_middleware(
"jwt", required_scopes=["read", "write"]
)
app = Starlette(routes=[
mcp_auth.metadata_route(),
Mount(
"/",
app=mcp.sse_app(),
middleware=[Middleware(bearer_auth)],
),
])
import express from 'express';
import { MCPAuth } from 'mcp-auth';
const app = express();
const server = new McpServer(/* ... */);
const mcpAuth = new MCPAuth({
/* ... */
});
app.use(mcpAuth.bearerAuth('jwt', { requiredScopes: ['read', 'write'] }));
Im obigen Beispiel haben wir den Token-Typ jwt
angegeben und die Berechtigungen read
und write
gefordert. Es wird automatisch das JWT (JSON Web Token) validieren und ein Objekt mit den Informationen des authentifizierten Benutzers befüllen.
Noch nie von JWT (JSON Web Token) gehört? Keine Sorge, du kannst die Dokumentation einfach weiterlesen – wir erklären es, wenn es nötig ist. Du kannst auch das Auth Wiki für eine kurze Einführung besuchen.
Weitere Informationen zur Bearer-Auth-Konfiguration findest du unter Bearer-Auth konfigurieren.
Auth-Informationen in deiner MCP-Implementierung abrufen
Sobald das Bearer-Auth-Middleware angewendet ist, kannst du auf die Informationen des authentifizierten Benutzers (oder der Identität) in deiner MCP-Implementierung zugreifen:
- Python
- Node.js
MCP Auth speichert die Informationen des authentifizierten Benutzers nach erfolgreicher Authentifizierung in einer Kontextvariablen, sobald das Bearer-Auth-Middleware angewendet wurde. Du kannst darauf in deinen MCP-Tool-Handlern wie folgt zugreifen:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP()
mcp_auth = MCPAuth(
# Initialisiere mit deiner Auth-Server-Konfiguration
)
@mcp.tool()
def add(a: int, b: int):
"""
Ein Tool, das zwei Zahlen addiert.
Die Informationen des authentifizierten Benutzers sind im Kontext verfügbar.
"""
auth_info = mcp_auth.auth_info # Zugriff auf die Auth-Informationen im aktuellen Kontext
if auth_info:
print(f"Authentifizierter Benutzer: {auth_info.claims}")
return a + b
Das zweite Argument des Tool-Handlers enthält das authInfo
-Objekt, das die Informationen des authentifizierten Benutzers enthält:
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
const server = new McpServer(/* ... */);
server.tool('add', { a: z.number(), b: z.number() }, async ({ a, b }, { authInfo }) => {
// Jetzt kannst du das `authInfo`-Objekt verwenden, um auf die authentifizierten Informationen zuzugreifen
});
Nächste Schritte
Lies weiter, um ein End-to-End-Beispiel zu erfahren, wie du MCP Auth mit deinem MCP-Server integrierst und wie du den Auth-Flow in MCP-Clients handhabst.