Skip to main content
Glama
jhgaylor

Express MCP Handler

by jhgaylor

익스프레스-mcp-핸들러

Express 애플리케이션과 MCP(Model Context Protocol)를 통합하기 위한 미들웨어로, LLM과 도구 간의 원활한 통신을 지원합니다.

npm 버전 npm 다운로드 라이센스: MIT Node.js 버전 타입스크립트 씨아이 코드코브

모델 컨텍스트 프로토콜(MCP)이란 무엇입니까?

모델 컨텍스트 프로토콜(MCP) 은 대규모 언어 모델(LLM)을 외부 데이터 소스 및 도구와 통합하기 위한 개방형 프로토콜입니다. AI 비서가 표준화된 인터페이스를 통해 실시간 데이터에 접근하고, 작업을 실행하고, 다양한 서비스와 상호 작용할 수 있도록 지원합니다.

Related MCP server: MCP Hub

특징

  • 상태 저장 핸들러 : 세션 ID와 SSE(서버 전송 이벤트)를 사용하여 일회성 요청을 처리하거나 장기 세션을 유지할 수 있습니다.

  • 상태 비저장 핸들러 : 간단하고 일회성 상호작용을 위해 각 요청을 완전히 격리하여 처리합니다.

  • SSE 핸들러 : 전용 GET 및 POST 엔드포인트를 사용하여 SSE(Server-Sent Events)를 통해 MCP(Model Context Protocol)를 처리합니다.

  • Type-Safe API : 안정적인 통합을 위해 TypeScript로 구축되었습니다.

  • 유연한 구성 : 사용자 정의 가능한 오류 처리, 세션 관리 및 라이프사이클 후크.

  • Express 통합 : 미들웨어 패턴을 사용하여 Express 경로에 직접 연결됩니다.

설치

npm을 통해 설치:

지엑스피1

또는 실:

yarn add express-mcp-handler

또는 pnpm:

pnpm add express-mcp-handler

피어 종속성

이 패키지에는 다음과 같은 피어 종속성이 필요합니다.

  • express >= 4.0.0

  • @modelcontextprotocol/sdk >= 1.10.2

  • zod >= 3.0.0

아직 설치하지 않았다면 설치하세요.

npm install express @modelcontextprotocol/sdk zod

빠른 시작

시작하는 데 도움이 되는 기본적인 예는 다음과 같습니다.

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');
});

용법

Express-mcp-handler는 다양한 사용 사례에 맞게 세 가지 핸들러 유형을 제공합니다.

상태 저장 모드

statefulHandler 사용하면 클라이언트와 서버 간에 재사용 가능한 세션을 설정할 수 있으며, 이는 여러 상호작용에서 컨텍스트를 유지하는 데 이상적입니다.

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');
});

상태 저장 핸들러:

  • 첫 번째 요청( mcp-session-id 헤더 없음)에서 새 세션을 초기화합니다.

  • 클라이언트가 후속 요청에 포함해야 하는 mcp-session-id 헤더를 반환합니다.

  • 서버에서 클라이언트로 메시지를 푸시하기 위해 SSE(Server-Sent Events)를 관리합니다.

  • 닫을 때 세션을 자동으로 정리합니다.

상태 비저장 모드

세션 관리 없이 일회성 요청 처리를 위해 statelessHandler 사용하세요. 서버리스 환경이나 간단한 요청에 적합합니다.

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');
});

각 무국적 요청:

  • 새로운 전송 및 서버 인스턴스를 생성합니다.

  • 세션 추적 없이 완전한 격리를 보장합니다.

  • 단순 또는 서버리스 환경에 적합합니다.

SSE 모드

sseHandlers 사용하여 SSE(Server-Sent Events)를 통한 MCP(Model Context Protocol)를 처리합니다. 실시간 스트리밍 응답에 이상적입니다.

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 핸들러는 다음을 제공합니다.

  • GET /sse : SSE 스트림을 설정하고 mcp-session-id 헤더를 반환합니다.

  • POST /messages : mcp-session-id 쿼리 매개변수를 사용하여 SSE 전송을 통해 MCP 메시지를 보냅니다.

API 참조

상태 저장 핸들러

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;

매개변수

유형

설명

server

McpServer

프로토콜 논리를 처리하기 위한 McpServer 인스턴스

options.sessionIdGenerator

() => string

고유한 세션 ID를 반환하는 함수

options.onSessionInitialized

(sessionId: string) => void

(선택 사항) 새 세션 ID로 호출되는 콜백

options.onSessionClosed

(sessionId: string) => void

(선택 사항) 세션이 닫힐 때 호출되는 콜백

options.onError

(error: Error, sessionId?: string) => void

(선택 사항) 오류 발생 시 호출되는 콜백

options.onInvalidSession

(req: express.Request) => void

(선택 사항) 유효하지 않은 세션에 액세스하면 호출되는 콜백

statelessHandler

function statelessHandler(
  serverFactory: () => McpServer,
  options?: {
    sessionIdGenerator?: () => string;
    onClose?: (req: express.Request, res: express.Response) => void;
    onError?: (error: Error) => void;
  }
): express.RequestHandler;

매개변수

유형

설명

serverFactory

() => McpServer

각 요청에 대해 새로운 서버 인스턴스를 반환하는 함수

options.sessionIdGenerator

() => string

(선택 사항) 전송 세션 ID 생성 재정의

options.onClose

(req: express.Request, res: express.Response) => void

(선택 사항) 요청/응답 주기가 종료되면 콜백이 실행됩니다.

options.onError

(error: Error) => void

(선택 사항) 처리 중 오류 발생 시 콜백이 실행됩니다.

sse핸들러

function sseHandlers(
  serverFactory: ServerFactory,
  options: SSEHandlerOptions
): {
  getHandler: express.RequestHandler;
  postHandler: express.RequestHandler;
};

매개변수

유형

설명

serverFactory

ServerFactory

각 SSE 연결에 대해 새로운 McpServer 반환하는 팩토리 함수

options.onError

(error: Error, sessionId?: string) => void

(선택 사항) 오류 발생 시 호출되는 콜백으로 error 및 선택적 sessionId 수신합니다.

options.onClose

(sessionId: string) => void

(선택 사항) SSE 세션이 닫힐 때 호출되는 콜백, sessionId 수신

오류 처리

모든 핸들러 유형은 다음 옵션을 통해 사용자 정의 오류 처리를 지원합니다.

// 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 지원

이 패키지는 TypeScript로 작성되었으며 모든 export에 대한 타입 정의를 제공합니다. TypeScript를 사용하면 완전한 IntelliSense 및 타입 검사를 활용할 수 있습니다.

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));

개발

이 프로젝트에 기여하려면:

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

테스트 범위

이 프로젝트는 견고한 테스트 범위를 갖추고 있으며, 이를 유지할 것을 약속합니다.

모든 변경 사항은 테스트를 위해 Jest를 사용하고, 커버리지 보고를 위해 Codecov를 사용하는 CI/CD 파이프라인을 통해 검증됩니다.

지속적인 통합

이 프로젝트는 지속적인 통합을 위해 GitHub Actions를 사용합니다. 메인 브랜치에 대한 모든 푸시와 풀 리퀘스트는 다음과 같은 작업을 수행합니다.

  1. 린트 검사를 실행하세요

  2. 프로젝트를 빌드하세요

  3. 커버리지로 테스트 실행

  4. Codecov 에 적용 범위 보고서 업로드

이 README 상단의 배지나 GitHub 저장소의 작업 탭 에서 현재 CI 상태를 볼 수 있습니다.

특허

MIT 라이센스

npm에 게시하기

아직 npm에 로그인하지 않았다면 로그인하세요.

npm login

npm에 패키지를 게시합니다(prepublishOnly 빌드가 실행됩니다):

npm publish

새 버전을 범프, 태그 및 푸시하려면 다음을 수행합니다.

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

핸들러 유형 한눈에 보기

매니저

대본

세션

스트리밍

statelessHandler

일회성 또는 서버리스 워크로드

아니요

아니요

상태 저장 핸들러

멀티턴 상호작용

예

예

sse핸들러

실시간 SSE 스트리밍

예

예

문제 해결

mcp-session-id 헤더가 없습니다.
클라이언트가 초기 요청에서 반환된 mcp-session-id 헤더를 포함하는지 확인하세요.

교통 연결이 조기에 종료되었습니다.
네트워크 연결을 확인하고 클라이언트가 SSE 이벤트를 적절하게 처리하는지 확인합니다.

변경 사항

이 프로젝트의 모든 주요 변경 사항은 CHANGELOG.md 에 기록되어 있습니다.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive ElysiaJS plugin for building Model Context Protocol (MCP) servers with HTTP transport, session management, and support for tools, resources, and prompts.
    11,932 npm
    49
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    An Express server implementation of Model Context Protocol that allows websites to connect to LLMs through streamable HTTP and stdio transports, with a built-in chat UI for testing responses.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    A lightweight Hono.js middleware for building Model Context Protocol servers using a simple, fluent API and supporting both SSE and HTTP transports. It enables developers to create type-safe, edge-ready MCP-compatible APIs with built-in session management.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    A robust runtime for the official Model Context Protocol (MCP) that adds proxying, session management, JWT auth, persistent user storage with scopes, and progress notifications.
    9
    Apache 2.0