NestJS MCP: Offizielles Modul in bestehende Apps integrieren

Zurück
Kevin Riedl

16 min Lesezeit · 4. November 2026
Zuletzt geprüft

Weiter
Entsteht auf deinem Gerät, ohne Instagram-Verbindung. Den Beitragslink kopieren wir für deinen Link-Sticker.

Dein NestJS-Backend weiß bereits, wer eine Rechnung lesen darf und welche Vorgänge sie verändern können. Ein KI-Assistent soll diese Funktionen nutzen, ohne dass du die Regeln deiner Anwendung ein zweites Mal implementierst.

Für die MCP-Anbindung einer bestehenden NestJS-App prüfst du zuerst die Kompatibilität, registrierst McpModule und gibst ausgewählte Provider-Methoden frei. Zugriffsrechte auf einzelne Datensätze und Geschäftslogik bleiben in deinen Anwendungsservices. Prüfe Schemas, Guards und Ergebnisse über einen MCP-Client. Teste anschließend den HTTP-Endpunkt, bevor du einen entfernten Assistenten verbindest.

Geprüft und getestet am 4. November 2026. Wir haben ein Beispiel zur Abfrage des Rechnungsstatus mit @nestjs/mcp 0.0.2 kompiliert und zehn Verhaltensprüfungen ausgeführt, zwei davon über echtes HTTP. Das Testprojekt zum Download verwendet synthetische Daten und Test-Tokens.

Was bringt das offizielle NestJS-MCP-Modul?

NestJS MCP stellt ausgewählte Provider-Methoden als Tools, Ressourcen und Prompts bereit. Das offizielle Modul übernimmt das Protokoll und bindet die Methoden in Dependency Injection und Ausführungspipeline von Nest ein. Du entscheidest, welche Funktionen freigegeben werden. Andere Service-Methoden bleiben außerhalb der MCP-Schnittstelle.

Die README der Release-Version dokumentiert Streamable HTTP mit Express, Fastify und dem Node-Adapter sowie stdio für lokal gestartete Prozesse. Die offizielle Integration heißt @nestjs/mcp; @rekog/mcp-nest ist ein separates Community-Paket. NestJS Observe bietet außerdem einen MCP-Server für seine Observability-Daten.

Ein Support-Assistent kann denselben Rechnungsservice aufrufen wie dein Dashboard. Transaktionsregeln und Mandantenprüfungen bleiben dadurch an einer Stelle. Wir würden mit einem Lesezugriff beginnen. Prüfe, welche Datensätze der Aufrufer sehen darf, welche Felder die Anwendung verlassen und welche Antwort der Assistent bei einem Fehler erhält.

Ist deine bestehende NestJS-App mit dieser Version kompatibel?

@nestjs/mcp 0.0.2 deklariert NestJS 12 und MCP SDK ^2.4.0 als Peer-Dependencies. NestJS 10 und 11 liegen außerhalb dieses Versionsbereichs. Prüfe zuerst deinen Abhängigkeitsbaum. Ein Framework-Upgrade gehört in eine eigene Änderung mit passenden Regressionstests.

Das Paketmanifest von 0.0.2 nennt die folgenden Versionsanforderungen. Unser Testprojekt prüft eine konkret festgelegte Kombination innerhalb dieser Bereiche.

Abhängigkeit oder LaufzeitVersionsanforderung oder dokumentierte Schema-UnterstützungWas du prüfen solltest
@nestjs/common und @nestjs/core^12.0.0Halte Framework, HTTP-Adapter und Testpakete auf zueinander passenden Versionen.
@modelcontextprotocol/server^2.4.0Das ist das v2-Serverpaket. Ältere Imports aus dem gemeinsamen SDK passen dazu nicht automatisch.
Node.js>=20.19.0 für dieses ModulPrüfe zusätzlich die Engine-Anforderungen aller weiteren Abhängigkeiten.
Zod4.2 oder neuerPrüfe die Auswirkungen auf vorhandene Zod-3-Schemas vor dem Versionswechsel.
@modelcontextprotocol/clientOptionaler Peer ^2.4.0Für die Clienttests im Speicher brauchst du dieses Paket.
PaketformatESM-ExportsPrüfe das Zusammenspiel mit Build und Laufzeit deiner Anwendung.
npm ls @nestjs/core @nestjs/common @modelcontextprotocol/server zod

npm install --save-exact @nestjs/[email protected] \
  @modelcontextprotocol/[email protected] [email protected]

npm install --save-dev --save-exact @modelcontextprotocol/[email protected]

Unser Testprojekt kombiniert diese Versionen mit NestJS 12.3.3 und Node.js 24.22.1. Eine ESM-Abhängigkeit verlangt nicht automatisch, deine CommonJS-App umzuschreiben. Prüfe den tatsächlichen Import- und Build-Pfad. Ein Override der Peer-Dependencies weist keine Kompatibilität nach.

Beim Upgrade zählt auch die Schema-Aufbereitung im Quellcode. Zod 3 wird abgelehnt. ArkType wird unterstützt; Valibot benötigt toStandardJsonSchema() aus @valibot/to-json-schema. Vorhandenes JSON Schema lässt sich über fromJsonSchema() aus dem MCP-Serverpaket einbinden. Tool-Argumente brauchen ein Objektschema, das sich entsprechend umwandeln lässt.

Wie integrierst du NestJS MCP in eine bestehende App?

Registriere McpModule und einen Tool-Provider, der den benötigten Anwendungsservice injiziert. Begrenze die automatische Erkennung auf das betreffende Fachmodul. Bevor du sensible Tools über einen geschützten HTTP-Endpunkt erreichbar machst, brauchst du einen echten Token-Verifier.

Die folgende Konfiguration zeigt die Einbindung. InvoicesModule, IdentityModule und IdentityTokenVerifier ergänzt du aus deiner Anwendung.

McpModule.forRoot({
  name: 'billing-assistant',
  version: '1.0.0',
  include: [InvoicesModule],
  imports: [IdentityModule],
  auth: {
    verifier: IdentityTokenVerifier,
    resource: 'https://api.example.com/mcp',
    authorizationServers: ['https://login.example.com'],
  },
})

Importiere außerdem InvoicesModule in die Anwendung und trage InvoiceTools in dessen providers ein. Über die Moduloption imports erhält der Verifier Zugriff auf exportierte Abhängigkeiten. Die Provider-Registry findet dekorierte Methoden beim Start. include legt fest, welche Module sie dafür durchsucht.

Dieser Provider-Ausschnitt stammt aus unserem ausgeführten Testprojekt. Der Download enthält den zugehörigen Service, die Zugriffshilfe, den Guard und das Testmodul.

export const InvoiceInput = z.object({
  invoiceId: z.string().regex(/^inv_[a-z0-9]+$/).max(64),
}).strict();

export const InvoiceStatus = z.object({
  invoiceId: z.string(),
  status: z.enum(['open', 'paid']),
});

@Injectable()
export class InvoiceTools {
  constructor(
    private readonly invoices: InvoicesService,
    private readonly access: InvoiceAccess,
  ) {}

  @Tool({
    name: 'get-invoice-status',
    description: 'Read the status of one invoice available to the signed-in user. Does not modify an invoice.',
    inputSchema: InvoiceInput,
    outputSchema: InvoiceStatus,
    scopes: ['invoices:read'],
    annotations: { readOnlyHint: true },
  })
  @UseGuards(SupportTeamGuard)
  async status(input: z.infer<typeof InvoiceInput>, ctx: McpContext) {
    const actor = this.access.requirePrincipal(ctx);
    return this.invoices.statusForActor(actor, input.invoiceId, ctx.signal);
  }
}

InvoiceAccess liest Benutzeridentität und Mandant aus dem verifizierten Kontext. InvoicesService prüft den Zugriff auf die konkrete Rechnung. Das Modell liefert nur deren Kennung. Ein zusätzlich übergebenes Mandantenfeld kann keine Berechtigung schaffen; das strikte Schema weist nicht deklarierte Felder ab.

Das Beispiel gibt ausschließlich Kennung und Status zurück. Ein ORM-Rechnungsobjekt könnte zusätzlich Adressen, Steuerinformationen oder interne Notizen enthalten. Lege deshalb ausdrücklich fest, welche Felder der Assistent erhalten darf.

Fehlt der Endpunkt, prüfe globales Präfix und Versionierung. Fehlt ein Tool in der Auflistung, prüfe Provider-Registrierung, include und Startfehler. Ein Decorator allein macht eine nicht registrierte Klasse nicht auffindbar.

Welche Methoden werden zu Tools, Ressourcen oder Prompts?

Nutze NestJS-MCP-Tools für parametrisierte Vorgänge, Ressourcen für Daten mit einer URI und Prompts für wiederverwendbare Nachrichtenvorlagen. Jeder dieser Bausteine sollte eine klar umrissene Aufgabe erfüllen. So kannst du Berechtigungen und Fehlerverhalten gemeinsam beurteilen.

Die offizielle Dokumentation der MCP-Bausteine beschreibt Decorators und Rückgabewerte. Für eine Anwendung zur Rechnungsbearbeitung würden wir die Aufgaben so aufteilen:

Aufgabe des ClientsMCP-BausteinUmsetzung in der Anwendung
Status einer freigegebenen Rechnung abfragen@Tool() mit inputSchemaGezielte Abfrage über die bestehende Zugriffsprüfung.
Veröffentlichte Abrechnungsregeln lesen@Resource() mit uriVersionierte Referenzdaten mit klar festgelegtem Empfängerkreis.
Eine berechtigte Rechnung per URI lesen@ResourceTemplate() mit uriTemplateDieselbe Berechtigung auf Datensatzebene prüfen wie beim Abfrage-Tool.
Vorlage für eine Support-Antwort vorbereiten@Prompt() mit argsSchemaNachrichten für den Client zurückgeben. Ein späterer Versand braucht eine eigene Autorisierung.

Ein allgemeines Tool wie run-sql oder call-any-service ist schwerer zu prüfen. Wir bevorzugen eine benannte Geschäftsfunktion mit begrenzten Eingaben. Bei ihr lassen sich erlaubte Datensätze und mögliche Änderungen klarer erkennen.

Funktionieren deine bestehenden Guards bei MCP-Aufrufen?

Bestehende Guards können bei NestJS-MCP-Aufrufen laufen, wenn sie den Ausführungskontext mcp unterstützen. Prüfe dieselbe Annahme bei Interceptors, Pipes und Exception Filters. Wer ausschließlich einen HTTP-Kontext erwartet, kann die falschen Argumente lesen, obwohl der Guard korrekt registriert ist.

Der Helper für den MCP-Ausführungskontext liefert Eingaben, Aufrufkontext und Authentifizierungsinformationen. Unser Guard für dieses Tool liest einen Abteilungs-Claim, den der Verifier des Testprojekts bereitstellt:

@Injectable()
export class SupportTeamGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const ctx = McpExecutionContext.create(context).getContext();
    return ctx.authInfo?.extra?.department === 'support';
  }
}

Wende den Guard auf den MCP-Provider oder dessen Methode an. Ein globaler Guard, den du auch für HTTP-Routen nutzt, muss nach Kontexttyp unterscheiden und in jedem Zweig die passende Policy durchsetzen. Für einen unbekannten Kontext true zurückzugeben, würde diese Prüfung umgehen.

Übergib Benutzer- und Mandantenzustand über Argumente oder den Aufrufkontext. Ein anderer Request kann this.currentTenant auf einem gemeinsam genutzten Provider überschreiben. Die Registry lehnt Abhängigkeitsbäume mit Request-Scope ab. Injiziert ein Provider einen mandantenspezifischen Service mit Request-Scope, musst du diese Konstruktion ändern.

In Version 0.0.2 ist McpContext ein Union-Typ für Client- und interne Agentenkontexte. Prüfe ctx.transport, bevor du reine Client-Felder wie server oder era verwendest. Der optionale idempotencyKey des internen Agenten verhindert wiederholte Schreibzugriffe über entfernte MCP-Clients nicht automatisch.

Interceptors sollten Vorgang, Ergebnis, Korrelationskennung und Laufzeit erfassen. Bearer-Tokens und vollständige Rechnungsinhalte gehören nicht ins Log. Prüfe auch Fehlermeldungen: Eine bewusst geworfene HttpException kann ihren Nachrichtentext an den Aufrufer weitergeben. Formuliere ihn so, dass der Client sinnvoll reagieren kann, ohne interne Datensätze oder Zugangsdaten offenzulegen.

Wie greifen OAuth-Scopes und Benutzerrechte ineinander?

Bei NestJS MCP erlaubt ein OAuth-Scope eine bestimmte Funktion. Die Anwendung entscheidet zusätzlich, auf welche Objekte der Aufrufer zugreifen darf. Das HTTP-Modul prüft Tokens deines Identity Providers. Auch mit einem gültigen Token und dem Scope zum Lesen von Rechnungen brauchst du die Berechtigung für die konkrete Rechnung.

Das Authorization Gate verbindet deinen Verifier mit den OAuth-Challenges. Validiere Aussteller, Signatur beziehungsweise Introspection-Ergebnis, Audience und Ablaufzeit. Ein JWT lediglich zu dekodieren und die konfigurierte Ressourcen-URL zurückzugeben, beweist nicht, dass dieses Token für die Ressource ausgestellt wurde.

Unser Service prüft den Zugriff des Akteurs auf die Rechnung, nachdem der Scope invoices:read die Funktion freigegeben hat. authInfo.clientId identifiziert den OAuth-Client. Benutzeridentität und Mandant musst du gesondert ermitteln. Unsere Architektur für MCP-Autorisierung in Unternehmen behandelt diesen übergreifenden Entwurf.

Für die Integration von @CurrentUser() und @Can() brauchst du konfigurierte Versionen von @nestjs/authentication ab 0.1.3 und @nestjs/authorization ab 0.1.1. Die Integrationstests des Projekts zeigen, wie beide Module Benutzerinformationen und Policies bei Tool-Aufrufen verarbeiten.

Die dokumentierte Einstellung decorators: [Public()] nimmt die Endpunktroute vom Authentication Guard aus. Dadurch kann MCP seine eigene Challenge für die OAuth-Erkennung zurückgeben. Dazu gehören zwingend die MCP-Konfiguration auth und die vorgesehene Autorisierung der Provider. @Public() pauschal auf Tool-Provider anzuwenden, wäre keine gleichwertige Konfiguration.

Bei einem HTTP-Endpunkt führt die Deklaration von Tool-Scopes ohne durchsetzende Auth-Konfiguration zu einem Startfehler. Stdio hat ein eigenes Sicherheitsmodell. Ein OAuth-Scope am Decorator schützt einen lokalen stdio-Aufruf für sich allein nicht.

Was unterscheidet HTTP, stdio und ältere Clients?

NestJS MCP bedient entfernte Clients über Streamable HTTP und lokale Prozesse über stdio. HTTP-Anfragen sind unabhängig voneinander; bei stdio bleibt eine Prozessverbindung bestehen. Gleiche die benötigten Interaktionen deines Clients mit Transport und Protokollgeneration ab. Das ist besonders relevant, wenn ein Tool den Benutzer um weitere Eingaben bittet.

Die Transportdokumentation beschreibt die verfügbaren Möglichkeiten:

VerbindungUnterstütztes VerhaltenWas du gesondert prüfen musst
HTTP, Clients für 2026-07-28Unabhängige Anfragen, JSON- oder SSE-Antworten und unterstützte Abläufe mit angeforderter Benutzereingabe.OAuth, Proxy-Routing, erlaubte Origins, Größenlimits und die tatsächliche Funktionsunterstützung des Clients.
HTTP, ältere Clients von 2025Gewöhnliche Aufrufe über denselben zustandslosen Endpunkt.Interaktive Elicitation, die eine Server-zu-Client-Sitzung benötigt, steht nicht zur Verfügung.
StdioEin Client startet den Serverprozess; beide Protokollgenerationen werden unterstützt.Kein HTTP-Request und keine Durchsetzung von HTTP-OAuth-Scopes. Lege lokale Identität und Berechtigungen ausdrücklich fest.

Durch zustandsloses HTTP benötigt das Modul keine festen Transport-Sitzungen auf einer bestimmten Instanz. Datenbank, Job-Queue, Rate Limits und fachliche Idempotenz brauchen weiterhin die Konsistenz, die ihre Operationen verlangen. Unser Leitfaden zur Migration auf zustandslose MCP-Server behandelt den Wechsel auf Protokollebene.

Unterscheide bei Browser-Clients zwischen der hostnamebasierten Option allowedOrigins des Moduls und den CORS-Origins von Nest. Anfragen ohne Origin-Header können die Origin-Prüfung passieren. Diese Prüfung ersetzt deshalb keine Authentifizierung. Ein vorgeschalteter HTTP-Body-Parser kann außerdem eine Anfrage ablehnen, bevor das Größenlimit des Moduls greift.

Leite Anwendungslogs bei stdio über McpStdioLogger; stdout transportiert die Protokollnachrichten. Eine erfolgreiche lokale Verbindung prüft weder OAuth-Erkennung noch TLS oder Proxy-Verhalten deines entfernten Deployments.

Was ändert sich bei der Migration von mcp-nest?

Bei der Migration von @rekog/mcp-nest musst du die APIs deiner Community-Paketversion auf die Provider-, Schema- und Kontext-APIs des offiziellen Moduls abbilden. Erfasse zuerst die Funktionen, die du verwendest. Ähnliche Decorator-Namen können unterschiedliches Autorisierungs- oder Transportverhalten verdecken.

Prüfe die folgenden Änderungen anhand des offiziellen Migrationsleitfadens für die 1.x- und 2.x-APIs des Community-Pakets.

Bisherige IntegrationÄnderung im offiziellen ModulKonsequenz für deine Prüfung
Imports aus @modelcontextprotocol/sdkDie v2-API von @modelcontextprotocol/server verwenden.Prüfe Typen und weitere Nutzer der alten Abhängigkeit, bevor du sie entfernst.
parametersinputSchema bei Tools; argsSchema bei Prompts.Prüfe veröffentlichte Schemas und die Ablehnung ungültiger Argumente.
mcpEndpoint und die Moduloption guardspath und decorators am Endpunkt.Unterscheide Guards auf Routenebene von der Autorisierung am Provider.
@McpController() und Strategy-Bootstrap aus 2.xGewöhnliche injizierbare Provider und der Anwendungs-Bootstrap.Verschiebe Klassen nach providers. Prüfe andere Microservices, bevor du ihren Bootstrap entfernst.
Auslesen des RPC-KontextsMcpExecutionContext.Passe gemeinsam genutzte Guards, Interceptors und Filters an.
Eingebauter Authorization ServerExterner Identity Provider und ein Verifier.Token-Ausstellung und Client-Anmeldung benötigen eine eigene Migration.
Provider mit Request-Scope oder Registrierung zur LaufzeitIn dieser Version nicht unterstützt.Ändere den Entwurf oder behalte die bisherige Integration, bis die Voraussetzungen passen.

Der alte HTTP+SSE-Transport von 2024 und mehrere MCP-Server innerhalb einer Anwendung gehören ebenfalls nicht zum unterstützten Umfang dieser Version. Bei aktivierter HTTP-Authentifizierung lassen sich die anonymen Ausnahmen für einzelne Tools aus dem Community-Modul nicht übernehmen.

Migriere zuerst ein Lese-Tool. Behalte nach Möglichkeit seinen Namen und seinen Schnittstellenvertrag bei. Vergleiche Erkennung, Ergebnisse und abgelehnte Zugriffe mit der bisherigen Integration, bevor du Schreiboperationen und deren Verhalten bei Wiederholungen angehst.

Wie testest du das MCP-Verhalten aus Sicht des Assistenten?

Prüfe das Verhalten von NestJS MCP mit connectMcpClient(). Teste anschließend die HTTP-Route für Middleware und Deployment-Eigenschaften. Direkte Provider-Tests allein überspringen die Protokollpipeline mit Argumentvalidierung, Scope-Prüfung, Guards und Serialisierung der Ergebnisse.

Der Helper für Tests im Speicher ruft den HTTP-Service ohne Socket auf, einschließlich dessen Host- und Origin-Prüfungen. Er überspringt die Middleware des Endpunkts und Routenguards aus decorators. Als Request verwendet er ein vereinfachtes Objekt für http://localhost/mcp.

TestebeneWas du prüfstWas einen weiteren Test braucht
Direkter Service- oder Provider-TestFachliche Entscheidungen, zurückgegebene Felder und Transaktionsverhalten.Protokollpipeline und HTTP-Route.
MCP-Client im SpeicherErkennung, Ein- und Ausgabeverträge, Token-Prüfungen, Scopes, Provider-Guards und Ergebnisstruktur.HTTP-Middleware, Endpunkt-Guards, echte CORS-Preflight-Anfragen, Proxys und Body-Parser.
Echtes HTTP und der vorgesehene ClientOAuth-Discovery-Challenge, Routing, Browserverhalten, Verbindungsbehandlung und Client-Kompatibilität.Für jede fachliche Änderung bleibt eine ausdrückliche Prüfung des resultierenden Zustands erforderlich.

Dieser Ausschnitt prüft, dass ungültige Eingaben den Rechnungsservice gar nicht erreichen. Das Testprojekt stellt Testmodul und authentifizierten Client bereit und schließt beide anschließend.

const service = moduleRef.get(InvoicesService);
const before = service.calls;

const result = await client.callTool({
  name: 'get-invoice-status',
  arguments: { invoiceId: 123 },
});

assert.equal(result.isError, true);
assert.equal(service.calls, before);

Der Testleitfaden unterscheidet Tool-Fehler von Authentifizierungsfehlern: Ungültige Argumente können isError: true zurückliefern, fehlende Scopes lösen InsufficientScopeError aus, und ohne erforderliches Token scheitert bereits die Verbindung. Wenn du bei jedem Fehler eine abgelehnte Promise erwartest, übersiehst du Fehler in Tool-Ergebnissen.

Wenn du in Produktion allowedHosts setzt, berücksichtige die localhost-URL des Helpers in einer ausschließlich für Tests verwendeten Konfiguration. Behalte die Host-Policy für die Produktion bei.

Was hat unser kleiner Integrationstest nachgewiesen?

Unser NestJS-MCP-Testprojekt bestand acht Prüfungen im Speicher und zwei echte HTTP-Prüfungen mit Express. Es verwendet eine synthetische Rechnung, einen Service-Ersatz mit Mandantenprüfung und feste Test-Tokens. Die Ergebnisse zeigen, wie dieses Beispiel erlaubte und abgelehnte Aufrufe unter diesen Bedingungen behandelt.

Getestet wurden @nestjs/mcp 0.0.2, NestJS 12.3.3, MCP-Client und -Server 2.4.0, Zod 4.6.7, TypeScript 7.0.2 und Node.js 24.22.1. Quellcode, Lockfile der Abhängigkeiten und aufgezeichnete Ausgabe findest du im NestJS-MCP-Testprojekt zum Download.

Ausgeführte PrüfungBeobachtetes Ergebnis
Tool-ErkennungDas vorgesehene Tool wurde mit seinen Ein- und Ausgabeschemas aufgelistet.
Berechtigte AbfrageDie strukturierten Daten enthielten inv_demo und open.
Ungültige EingabeTool-Fehler; die Anzahl der Aufrufe des Rechnungsservices blieb unverändert.
Anderer Mandant mit gültigem TokenDie angefragte Rechnung war nicht verfügbar.
Fehlender ScopeInsufficientScopeError; kein Service-Aufruf.
Falsche AbteilungDer Provider-Guard lehnte den Aufruf ab; kein Service-Aufruf.
Fehlendes TokenDie Client-Verbindung wurde abgelehnt.
Ältere Client-ProtokollgenerationDer berechtigte Lesezugriff lieferte ein erfolgreiches Ergebnis.
Echte HTTP-Anfrage ohne Authentifizierung401 mit einer OAuth-Challenge für die Ressourcenmetadaten.
Nicht erlaubte Browser-Origin über HTTP403.

Um die Prüfungen zu wiederholen, entpacke das Testprojekt und führe in dessen Verzeichnis diese Befehle aus:

npm ci
npm test

Node meldet 12 bestandene Tests, weil es zwei übergeordnete Tests zusätzlich zu den zehn Prüfungen zählt. Der simulierte Verifier gehört ausschließlich in den Testcode. Dieses Beispiel prüft weder Fastify noch den Node-Adapter, produktive Identity Provider, gleichzeitige Schreibzugriffe oder das Verhalten hinter einem Load Balancer.

Was brauchst du vor der Freigabe von Tools mit Schreibzugriff?

Bevor du ein NestJS-MCP-Tool mit Schreibzugriff freigibst, definiere Autorisierung, dauerhafte Vorgangskennung, Regeln für gleichzeitige Zugriffe und Fehlerbehandlung. Der Anwendungsservice muss entscheiden, was bei einer Wiederholung nach einem Timeout passiert. Ein Decorator kann nicht entscheiden, ob eine Zahlung erneut ausgeführt werden darf.

Halte bei einer Rechnungskorrektur die freigegebene Aktion und ihre Eingaben fest. Prüfe den Zugriff bei der Ausführung erneut und behalte dieselbe Vorgangskennung über Wiederholungen hinweg bei. Lehne geänderte Argumente unter derselben Kennung ab. Wurde der erste Versuch bereits gespeichert, aber die Antwort ging verloren, liefere das festgehaltene Ergebnis zurück oder gleiche den tatsächlichen Ausgang ab.

Das ist ein Entwurfsvorschlag und vom ausgeführten Testprojekt mit Lesezugriff zu unterscheiden. Dafür brauchst du Transaktions- und Nebenläufigkeitstests mit deinem tatsächlichen Datenspeicher. Erfindet das Modell bei jedem Versuch einen neuen Idempotency Key, umgeht es eine darauf basierende Duplikatprüfung.

Die MCP-Maintainer beschreiben Tool-Annotationen als Hinweise. readOnlyHint und idempotentHint informieren Clients über das beabsichtigte Verhalten. Die Hinweise setzen es nicht durch. Ebenso wenig begründet ein Prompt, der eine Bestätigung verlangt, die Berechtigung zur Ausführung.

Vor dem ersten Rollout mit Schreibzugriff würden wir diese beobachtbaren Ergebnisse verlangen:

  • Ein unberechtigter Akteur oder ein nicht erlaubtes Zielobjekt wird vor jeder dauerhaften Änderung abgewiesen.
  • Zwei gleichzeitige Versuche derselben freigegebenen Aktion bewirken genau die beabsichtigte einmalige Änderung.
  • Geänderte Eingaben unter derselben Vorgangskennung werden abgelehnt.
  • Tritt nach dem Commit ein Timeout auf, lässt sich das Ergebnis abgleichen, ohne die Änderung blind zu wiederholen.
  • Ein Audit-Eintrag nennt Akteur, Vorgang, Autorisierungsentscheidung und resultierenden Zustand, ohne Tokens zu speichern.

Setze dieselben Datenzugriffsrechte durch, unabhängig davon, ob die Operation über REST, einen Queue-Job oder MCP erreicht wird. Unser Leitfaden zur Durchsetzung von Datenzugriffsrechten für Agenten erläutert diese Grenze genauer.

Wann würden wir das offizielle NestJS-MCP-Modul einsetzen?

Wir würden das offizielle NestJS-MCP-Modul einsetzen, wenn die Anwendung seine Versionsanforderungen erfüllt und fachliche Berechtigungen bereits in Services durchsetzt. Beginne mit einem Provider-Adapter, dessen Rechte, Ausgabe und Fehlerpfade du nachvollziehen kannst. Prüfe sie über das Protokoll des Clients.

Bei einem Produkt auf NestJS 10 oder 11 musst du zuerst über das Framework-Upgrade entscheiden, bevor du eine MCP-Installation zusagst. Ist dein System auf Provider mit Request-Scope, Tool-Registrierung zur Laufzeit oder mehrere getrennte MCP-Server in einem Prozess angewiesen, kläre diese Abweichung vor dem Austausch einer funktionierenden Integration.

Wavects NestJS-Entwicklung umfasst die dafür nötigen Änderungen an deiner Anwendung. Mit unserer MCP-Server-Entwicklung können wir die Tool-Schnittstelle definieren, die Autorisierung anbinden und Abnahmeprüfungen aufbauen. Die PromptID-Fallstudie zeigt verwandte Arbeiten an einer KI-Anwendung.

Mit der Software-QA-Checkliste vor dem Launch ordnest du die Tool-Tests in die gesamte Release-Entscheidung ein. Starte mit einem Lesezugriff, dessen Berechtigungen und Ausgabe du erklären kannst. Weise auch die Ablehnung unzulässiger Aufrufe nach. Erweitere die Schnittstelle anschließend um jeweils eine Geschäftsfunktion.

Häufige Fragen zur NestJS-MCP-Integration

Braucht @nestjs/mcp einen LLM-API-Key?
Das MCP-Modul stellt einem Client Funktionen deiner Anwendung bereit. Um Tools, Ressourcen oder Prompts anzubieten, benötigt es keinen LLM-API-Key. Der Assistent oder Agent, der diese Funktionen nutzt, kann eigene Modellzugänge und Kosten haben. Ruft ein Tool selbst ein Modell auf, entsteht diese zusätzliche Abhängigkeit durch deinen Anwendungscode.
Kann der MCP-Endpunkt neben meiner REST-API laufen?
Ja. Das offizielle Modul ergänzt die bestehende Nest-Anwendung um einen HTTP-Endpunkt, standardmäßig unter /mcp. Globales Präfix und Endpunktversionierung können die endgültige Route verändern. Halte REST-Controller und MCP-Provider so schlank, dass beide dieselben Anwendungsservices aufrufen. Ändert sich deren gemeinsames Verhalten, teste beide Zugangswege.
Bleiben Tools für Aufrufer ohne passenden Scope unsichtbar?
Nein. Ein Scope begrenzt die Ausführung, nicht die Sichtbarkeit der Tool-Definition. Schreibe keine Geheimnisse, Kundennamen oder sensiblen Betriebsdetails in Tool-Namen und Beschreibungen unter der Annahme, dass ein Aufrufer ohne ausreichende Scopes sie nicht auflisten kann. Der Zugriff auf einzelne Datensätze muss weiterhin bei der Ausführung autorisiert werden.
Kann ein MCP-Provider einen Mandantenservice mit Request-Scope nutzen?
Die geprüfte Version lehnt Abhängigkeitsbäume mit Request-Scope bei der Erkennung ab. Wenn deine Anwendungsservices es unterstützen, kannst du den verifizierten Mandanten und Akteur stattdessen über Aufrufargumente übergeben. Prüfe die gesamte Abhängigkeitskette. Auch ein scheinbarer Singleton-Provider kann weiter unten von Zustand mit Request-Scope abhängen.
Macht der Abbruch eines Aufrufs einen abgeschlossenen Schreibzugriff rückgängig?
Ein Abbruch kann eine bereits gespeicherte Änderung nicht von sich aus zurücknehmen. Gib das AbortSignal des Aufrufs an Operationen weiter, die Abbrüche unterstützen. Unterscheide zwischen einem Abbruch vor dem Commit und einer verlorenen Antwort nach dem Commit. Mit einem dauerhaft gespeicherten Vorgang kann der Aufrufer das Ergebnis wiederfinden. Rollback oder Kompensation brauchen einen eigenen Entwurf in der Anwendung.
Ist das der MCP-Server von NestJS Observe?
Nein. Mit diesem Paket baust du eine MCP-Schnittstelle für deine eigene Anwendung. Der MCP-Server von NestJS Observe stellt Funktionen des Observability-Produkts bereit. Ein Suchtreffer über die Verbindung eines Assistenten mit Observe erklärt nicht, wie du einen eigenen Provider registrierst, einen Rechnungsvorgang absicherst oder eine Community-Integration für NestJS MCP migrierst.
Kann ein Prompt die Berechtigung für ein Schreib-Tool erteilen?
Ein Prompt liefert Anweisungen oder Nachrichten an den Client. Die Berechtigung ergibt sich weiterhin aus authentifizierter Identität, konfigurierten Scopes und der Autorisierung durch die Anwendung zum Ausführungszeitpunkt. Auch wenn der Client eine menschliche Bestätigung einholt, musst du diese an die vorgesehene Operation und ihre Eingaben binden. Prüfe den Zugriff erneut, bevor der Service gespeicherte Daten verändert.

Deine Anwendung für Assistenten öffnen

Definiere das erste nützliche Tool, binde Berechtigungen an und prüfe die Antworten beim Client. Wavect hilft dir, diese MCP-Schnittstelle in deinem bestehenden Backend umzusetzen und zu verifizieren.

Hilfe bei der Umsetzung:

Postfach, ohne Lärm

Folge der Arbeit, die für dich zählt

Du bekommst eine kurze E-Mail, wenn wir etwas Neues veröffentlichen. Folge dem ganzen Blog oder nur den Themen, die dich interessieren.

Was möchtest du erhalten?
Themen auswählen

Kostenlos, Double-Opt-in, ohne Tracking-Pixel.

Zurück
Kevin Riedl

16 min Lesezeit · 4. November 2026
Zuletzt geprüft

Weiter

Erhalte die nächste Feldnotiz zu Delivery und QA

Eine kurze E-Mail, wenn wir veröffentlichen. Ohne Tracking-Pixel und ohne Postfachfüller.

Kostenlos, Double-Opt-in, ohne Tracking-Pixel.