Express MCP Handler

by jhgaylor

Integrations

  • Provides integration with Express, allowing developers to easily add Model Context Protocol (MCP) capabilities to Express applications with both stateful session management and stateless request handling options.

Express-MCP-Handler

Eine Middleware zur Integration des Model Context Protocol (MCP) mit Express-Anwendungen, die eine nahtlose Kommunikation zwischen LLMs und Tools ermöglicht.

Was ist das Model Context Protocol (MCP)?

Model Context Protocol (MCP) ist ein offenes Protokoll zur Integration großer Sprachmodelle (LLMs) mit externen Datenquellen und Tools. Es ermöglicht KI-Assistenten den Zugriff auf Echtzeitdaten, die Ausführung von Operationen und die Interaktion mit verschiedenen Diensten über eine standardisierte Schnittstelle.

Merkmale

  • Stateful Handler : Kann einmalige Anfragen verarbeiten oder langlebige Sitzungen mit Sitzungs-IDs und Server-Sent Events (SSE) aufrechterhalten.
  • Stateless Handler : Behandelt jede Anfrage vollständig isoliert für einfache, einmalige Interaktionen.
  • SSE-Handler : Verarbeitet Model Context Protocol (MCP) über Server-Sent Events (SSE) mit dedizierten GET- und POST-Endpunkten.
  • Typsichere API : Erstellt mit TypeScript für zuverlässige Integration.
  • Flexible Konfiguration : Anpassbare Fehlerbehandlung, Sitzungsverwaltung und Lebenszyklus-Hooks.
  • Express-Integration : Lässt sich mit Middleware-Muster direkt in Express-Routen einbinden.

Installation

Über npm installieren:

npm install express-mcp-handler

Oder Garn:

yarn add express-mcp-handler

Oder pnpm:

pnpm add express-mcp-handler

Peer-Abhängigkeiten

Dieses Paket erfordert die folgenden Peer-Abhängigkeiten:

  • express >= 4.0.0
  • @modelcontextprotocol/sdk >= 1.10.2
  • zod >= 3.0.0

Installieren Sie sie, falls Sie dies noch nicht getan haben:

npm install express @modelcontextprotocol/sdk zod

Schnellstart

Hier ist ein einfaches Beispiel für den Einstieg:

import express from 'express'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { statelessHandler } from 'express-mcp-handler'; const app = express(); app.use(express.json()); // Create a factory function that returns a new McpServer instance for each request const serverFactory = () => new McpServer({ name: 'my-mcp-server', version: '1.0.0', }); // Mount the stateless handler app.post('/mcp', statelessHandler(serverFactory)); app.listen(3000, () => { console.log('Express MCP server running on port 3000'); });

Verwendung

Express-mcp-handler bietet drei Handlertypen für unterschiedliche Anwendungsfälle:

Stateful-Modus

Verwenden Sie statefulHandler , um wiederverwendbare Sitzungen zwischen Client und Server einzurichten. Dies ist ideal, um den Kontext über mehrere Interaktionen hinweg aufrechtzuerhalten:

import express from 'express'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { statefulHandler } from 'express-mcp-handler'; import { randomUUID } from 'node:crypto'; const app = express(); app.use(express.json()); // Create an MCP server instance const server = new McpServer({ name: 'my-server', version: '1.0.0', }); // Configure handler options const handlerOptions = { sessionIdGenerator: randomUUID, // Function to generate unique session IDs onSessionInitialized: (sessionId: string) => { console.log(`Session initialized: ${sessionId}`); // You could store session metadata or initialize resources here }, onSessionClosed: (sessionId: string) => { console.log(`Session closed: ${sessionId}`); // Perform cleanup logic here }, onError: (error: Error, sessionId?: string) => { console.error(`Error in session ${sessionId}:`, error); // Handle errors for monitoring or logging } }; // Mount the handlers for different HTTP methods app.post('/mcp', statefulHandler(server, handlerOptions)); app.get('/mcp', statefulHandler(server, handlerOptions)); app.delete('/mcp', statefulHandler(server, handlerOptions)); app.listen(3000, () => { console.log('Express MCP server running on port 3000'); });

Der Stateful-Handler:

  • Initialisiert eine neue Sitzung bei der ersten Anfrage (ohne mcp-session-id Header)
  • Gibt einen mcp-session-id Header zurück, den Clients in nachfolgende Anfragen einschließen müssen
  • Verwaltet Server-Sent Events (SSE), um Nachrichten vom Server an den Client zu senden
  • Bereinigt Sitzungen automatisch, wenn sie geschlossen werden

Zustandsloser Modus

Verwenden Sie statelessHandler für die einmalige Anforderungsverarbeitung ohne Sitzungsverwaltung, perfekt für serverlose Umgebungen oder einfache Anforderungen:

import express from 'express'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { statelessHandler } from 'express-mcp-handler'; const app = express(); app.use(express.json()); // Function that creates a fresh McpServer for each request const serverFactory = () => new McpServer({ name: 'stateless-mcp-server', version: '1.0.0', }); // Configure with custom error handling const options = { onError: (error: Error) => { console.error('MCP error:', error); // Add custom error reporting logic here } }; app.post('/mcp', statelessHandler(serverFactory, options)); app.listen(3000, () => { console.log('Express Stateless MCP server running on port 3000'); });

Jede zustandslose Anfrage:

  • Erstellt eine neue Transport- und Serverinstanz
  • Gewährleistet vollständige Isolierung ohne Sitzungsverfolgung
  • Ist für einfache oder serverlose Umgebungen geeignet

SSE-Modus

Verwenden Sie sseHandlers , um Model Context Protocol (MCP) über Server-Sent Events (SSE) zu verarbeiten, ideal für Streaming-Antworten in Echtzeit:

import express from 'express'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { sseHandlers } from 'express-mcp-handler'; const app = express(); app.use(express.json()); // Provide a factory function that returns a fresh McpServer for each SSE connection const serverFactory = () => new McpServer({ name: 'sse-mcp-server', version: '1.0.0', }); // Configure SSE handlers const handlers = sseHandlers(serverFactory, { onError: (error: Error, sessionId?: string) => { console.error(`[SSE][${sessionId || 'unknown'}]`, error); }, onClose: (sessionId: string) => { console.log(`[SSE] transport closed: ${sessionId}`); // Clean up any session resources }, }); // Mount the SSE endpoints app.get('/sse', handlers.getHandler); app.post('/messages', handlers.postHandler); app.listen(3002, () => { console.log('Express MCP SSE server running on port 3002'); });

SSE-Handler bieten:

  • GET /sse : Erstellt den SSE-Stream und gibt einen mcp-session-id Header zurück
  • POST /messages : Sendet MCP-Nachrichten über den SSE-Transport unter Verwendung des Abfrageparameters mcp-session-id

API-Referenz

StatefulHandler

function statefulHandler( server: McpServer, options: { sessionIdGenerator: () => string; onSessionInitialized?: (sessionId: string) => void; onSessionClosed?: (sessionId: string) => void; onError?: (error: Error, sessionId?: string) => void; onInvalidSession?: (req: express.Request) => void; } ): express.RequestHandler;
ParameterTypBeschreibung
serverMcpServerInstanz von McpServer zur Handhabung der Protokolllogik
options.sessionIdGenerator() => stringFunktion, die eine eindeutige Sitzungs-ID zurückgibt
options.onSessionInitialized(sessionId: string) => void(optional) Rückruf mit der neuen Sitzungs-ID
options.onSessionClosed(sessionId: string) => void(optional) Rückruf, der beim Schließen einer Sitzung aufgerufen wird
options.onError(error: Error, sessionId?: string) => void(optional) Rückruf bei Fehlern
options.onInvalidSession(req: express.Request) => void(optional) Rückruf, der beim Zugriff auf eine ungültige Sitzung aufgerufen wird

zustandsloser Handler

function statelessHandler( serverFactory: () => McpServer, options?: { sessionIdGenerator?: () => string; onClose?: (req: express.Request, res: express.Response) => void; onError?: (error: Error) => void; } ): express.RequestHandler;
ParameterTypBeschreibung
serverFactory() => McpServerFunktion, die für jede Anfrage eine neue Serverinstanz zurückgibt
options.sessionIdGenerator() => string(optional) Generierung der Transportsitzungs-ID überschreiben
options.onClose(req: express.Request, res: express.Response) => void(optional) Rückruf wird ausgelöst, wenn der Anfrage-/Antwortzyklus endet
options.onError(error: Error) => void(optional) Rückruf, der bei Fehlern während der Verarbeitung ausgelöst wird

sseHandlers

function sseHandlers( serverFactory: ServerFactory, options: SSEHandlerOptions ): { getHandler: express.RequestHandler; postHandler: express.RequestHandler; };
ParameterTypBeschreibung
serverFactoryServerFactoryFactory-Funktion, die für jede SSE-Verbindung einen neuen McpServer zurückgibt
options.onError(error: Error, sessionId?: string) => void(optional) Rückruf wird bei Fehlern aufgerufen, empfängt error und optionale sessionId
options.onClose(sessionId: string) => void(optional) Rückruf, der aufgerufen wird, wenn eine SSE-Sitzung geschlossen wird, empfängt sessionId

Fehlerbehandlung

Alle Handlertypen unterstützen die benutzerdefinierte Fehlerbehandlung über ihre Optionen:

// Example of custom error handling for stateful handler const handlerOptions = { // ... other options onError: (error: Error, sessionId?: string) => { console.error(`Error in session ${sessionId}:`, error); // Send error to monitoring service Sentry.captureException(error, { extra: { sessionId } }); } };

TypeScript-Unterstützung

Dieses Paket ist in TypeScript geschrieben und bietet Typdefinitionen für alle Exporte. Bei Verwendung von TypeScript profitieren Sie von vollständigem IntelliSense und Typprüfung.

import { statefulHandler, StatefulHandlerOptions } from 'express-mcp-handler'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; // Type-safe options const options: StatefulHandlerOptions = { sessionIdGenerator: () => Date.now().toString(), onError: (error, sessionId) => { // TypeScript knows the types of these parameters console.error(`Error in session ${sessionId}:`, error); } }; const server = new McpServer({ name: 'typed-server', version: '1.0.0', }); // Type-safe handler app.post('/mcp', statefulHandler(server, options));

Entwicklung

So tragen Sie zu diesem Projekt bei:

git clone https://github.com/jhgaylor/express-mcp-handler.git cd express-mcp-handler npm install npm run build npm test

Testabdeckung

Das Projekt verfügt über eine solide Testabdeckung und verspricht, diese aufrechtzuerhalten.

Alle Änderungen werden über unsere CI/CD-Pipeline überprüft, wobei Jest zum Testen und Codecov zum Berichten der Abdeckung verwendet wird.

Kontinuierliche Integration

Dieses Projekt nutzt GitHub Actions für kontinuierliche Integration. Jeder Push zum Hauptzweig und Pull Request führt zu:

  1. Führen Sie den Lint-Check durch
  2. Erstellen des Projekts
  3. Führen Sie Tests mit Abdeckung durch
  4. Abdeckungsberichte zu Codecov hochladen

Sie können den aktuellen CI-Status im Badge oben in dieser README-Datei oder auf der Registerkarte „Aktionen“ des GitHub-Repositorys anzeigen.

Lizenz

MIT-Lizenz

Veröffentlichen auf npm

Melden Sie sich bei npm an, falls Sie dies noch nicht getan haben:

npm login

Veröffentlichen Sie das Paket in npm (führt Ihren PrepublishOnly-Build aus):

npm publish

So erhöhen, markieren und pushen Sie eine neue Version:

npm version patch # or minor, major git push origin main --tags

Handlertypen im Überblick

HandlerSzenarioSitzungenStreaming
zustandsloser HandlerEinmalige oder serverlose WorkloadsNEINNEIN
StatefulHandlerMultiturn-InteraktionenJaJa
sseHandlersSSE-Streaming in EchtzeitJaJa

Fehlerbehebung

Fehlender mcp-session-id Header
Stellen Sie sicher, dass der Client den mcp-session-id Header einschließt, der bei der ursprünglichen Anforderung zurückgegeben wurde.

Verkehrsanbindung vorzeitig geschlossen
Überprüfen Sie die Netzwerkkonnektivität und stellen Sie sicher, dass der Client SSE-Ereignisse ordnungsgemäß verarbeitet.

Änderungsprotokoll

Alle wesentlichen Änderungen an diesem Projekt sind im CHANGELOG.md dokumentiert.

-
security - not tested
F
license - not found
-
quality - not tested

remote-capable server

The server can be hosted and run remotely because it primarily relies on remote services or has no dependency on the local environment.

Ein Dienstprogramm, das Model Context Protocol (MCP) in Express-Anwendungen integriert und sowohl Optionen für die zustandsbehaftete Sitzungsverwaltung als auch für die zustandslose Anforderungsverarbeitung bietet.

  1. Was ist das Model Context Protocol (MCP)?
    1. Merkmale
      1. Installation
        1. Peer-Abhängigkeiten
      2. Schnellstart
        1. Verwendung
          1. Stateful-Modus
          2. Zustandsloser Modus
          3. SSE-Modus
        2. API-Referenz
          1. StatefulHandler
          2. zustandsloser Handler
          3. sseHandlers
        3. Fehlerbehandlung
          1. TypeScript-Unterstützung
            1. Entwicklung
              1. Testabdeckung
              2. Kontinuierliche Integration
            2. Lizenz
              1. Veröffentlichen auf npm
                1. Handlertypen im Überblick
                  1. Fehlerbehebung
                    1. Änderungsprotokoll

                      Related MCP Servers

                      • -
                        security
                        A
                        license
                        -
                        quality
                        MCP Server simplifies the implementation of the Model Context Protocol by providing a user-friendly API to create custom tools and manage server workflows efficiently.
                        Last updated -
                        4
                        3
                        TypeScript
                        MIT License
                      • -
                        security
                        A
                        license
                        -
                        quality
                        MCP Server provides a simpler API to interact with the Model Context Protocol by allowing users to define custom tools and services to streamline workflows and processes.
                        Last updated -
                        13
                        2
                        TypeScript
                        MIT License
                      • A
                        security
                        A
                        license
                        A
                        quality
                        A Model Context Protocol (MCP) server that provides tools for managing todo items, including creation, updating, completion, deletion, searching, and summarizing tasks.
                        Last updated -
                        10
                        4
                        TypeScript
                        MIT License
                      • A
                        security
                        F
                        license
                        A
                        quality
                        A Model Context Protocol (MCP) server that provides a simple sleep/wait tool, useful for adding delays between operations such as waiting between API calls or testing eventually consistent systems.
                        Last updated -
                        1
                        6
                        7
                        JavaScript

                      View all related MCP servers

                      ID: sn20luzb4s