
Security News
Axios Supply Chain Attack Reaches OpenAI macOS Signing Pipeline, Forces Certificate Rotation
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.
mcp-server-sdk
Advanced tools
Enhanced MCP server SDK with session management, message routing, and distributed capabilities
Enhanced Model Context Protocol (MCP) server SDK with session management, message routing, and distributed capabilities.
@modelcontextprotocol/sdknpm install mcp-server-sdk @modelcontextprotocol/sdk
The SDK supports a distributed architecture where:
import { createMCPServer } from "mcp-server-sdk";
// Create server instance (singleton pattern recommended)
const server = createMCPServer({
name: "my-mcp-server",
version: "1.0.0",
title: "My MCP Server",
websiteUrl: "https://example.com"
});
// Register tools
server.tool("hello", "Say hello", async () => {
return {
content: [{ type: "text", text: "Hello from MCP!" }]
};
});
// Register resources
server.resource("config", "file:///config.json", async (uri) => {
return {
contents: [{
uri: uri.href,
text: JSON.stringify({ setting: "value" }),
mimeType: "application/json"
}]
};
});
console.log(`Server instance ID: ${server.getInstanceId()}`);
import express from "express";
import { createMCPServer } from "mcp-server-sdk";
import { DistributedStreamableHttpServerTransport } from "@human4.ai/distributed-streamable-http-server-transport";
const app = express();
const server = createMCPServer({
name: "distributed-mcp-server",
version: "1.0.0"
});
// Register your tools, resources, and prompts
server.tool("process-data", "Process data", async (args) => {
return {
content: [{ type: "text", text: `Processed: ${JSON.stringify(args)}` }]
};
});
// Handle incoming requests
app.use("/mcp", async (req, res) => {
try {
// Create per-request transport
const transport = new DistributedStreamableHttpServerTransport();
// Create or resume session
const sessionId = req.headers["x-session-id"] as string;
const session = await server.connectWithSession(transport, sessionId);
// Set session header for client
res.setHeader("X-Session-ID", session.sessionId);
// Handle the request
await transport.handleRequest(req, res);
// Update session activity
server.updateSessionActivity(session.sessionId);
} catch (error) {
console.error("MCP request error:", error);
res.status(500).json({
jsonrpc: "2.0",
error: { code: -32603, message: "Internal server error" },
id: null
});
}
});
app.listen(3000, () => {
console.log("MCP server listening on port 3000");
});
const server = createMCPServer(
{ name: "my-server", version: "1.0.0" },
{
sessionTimeout: 30 * 60 * 1000, // 30 minutes
enableMessageRouting: true
}
);
// Listen to session events
server.on("session:created", (session) => {
console.log(`Session created: ${session.sessionId}`);
});
server.on("session:closed", (session) => {
console.log(`Session closed: ${session.sessionId}`);
});
// Get active sessions
const sessions = server.getActiveSessions();
console.log(`Active sessions: ${sessions.length}`);
// Manually close a session
await server.closeSession("session-id");
import { createMCPServer, InMemoryMessageStorage } from "mcp-server-sdk";
const server = createMCPServer(
{ name: "my-server", version: "1.0.0" },
{
messageStorage: new InMemoryMessageStorage(),
enableMessageRouting: true
}
);
// Listen to message events
server.on("message:stored", (message) => {
console.log(`Message stored: ${message.id}`);
});
// Retrieve session messages for replay
const messages = await server.getMessages("session-id", {
limit: 100,
offset: 0
});
console.log(`Retrieved ${messages.length} messages`);
Implement your own storage backend:
import { MessageStorage, Message } from "mcp-server-sdk";
import { createClient } from "redis";
class RedisMessageStorage implements MessageStorage {
private client = createClient();
async store(message: Message): Promise<void> {
await this.client.connect();
const key = `messages:${message.sessionId}`;
await this.client.rPush(key, JSON.stringify(message));
await this.client.expire(key, 86400); // 24 hour TTL
}
async retrieve(
sessionId: string,
options?: { limit?: number; offset?: number }
): Promise<Message[]> {
await this.client.connect();
const key = `messages:${sessionId}`;
const start = options?.offset || 0;
const end = start + (options?.limit || 100) - 1;
const data = await this.client.lRange(key, start, end);
return data.map((item) => JSON.parse(item));
}
async delete(sessionId: string): Promise<void> {
await this.client.connect();
await this.client.del(`messages:${sessionId}`);
}
}
const server = createMCPServer(
{ name: "my-server", version: "1.0.0" },
{ messageStorage: new RedisMessageStorage() }
);
createMCPServer(serverInfo, options)Creates a new MCP server instance with enhanced capabilities.
Parameters:
serverInfo: Implementation - Server metadata
name: string - Server name (required)version: string - Server version (required)title?: string - Display titlewebsiteUrl?: string - Website URLicons?: Array - Server iconsoptions?: McpServerOptions - Configuration options
instanceId?: string - Unique server instance ID (auto-generated if omitted)distributed?: boolean - Enable distributed features (default: true)messageStorage?: MessageStorage - Message storage implementationenableMessageRouting?: boolean - Enable message routing (default: true)sessionTimeout?: number - Session timeout in ms (default: 1800000 / 30 min)Returns: MCPServer
MCPServerMain server class extending McpServer from @modelcontextprotocol/sdk.
Session Methods:
createSession(metadata?: Record<string, unknown>): SessionInfo - Create a new sessiongetSession(sessionId: string): SessionInfo | undefined - Get session by IDupdateSessionActivity(sessionId: string): void - Update session activity timestampcloseSession(sessionId: string): Promise<void> - Close a specific sessiongetActiveSessions(): SessionInfo[] - Get all active sessionsMessage Methods:
storeMessage(message: Omit<Message, "id" | "timestamp">): Promise<Message> - Store a messagegetMessages(sessionId: string, options?: { limit?: number; offset?: number }): Promise<Message[]> - Retrieve messagesConnection Methods:
connect(transport: Transport): Promise<void> - Connect to transport (standard MCP)connectWithSession(transport: Transport, sessionId?: string): Promise<SessionInfo> - Connect with session supportclose(): Promise<void> - Close all connections and sessionsInstance Methods:
getInstanceId(): string - Get the unique instance identifierisDistributed(): boolean - Check if distributed mode is enabledEvent Methods:
on(event: string, listener: (...args: unknown[]) => void): this - Listen to eventsoff(event: string, listener: (...args: unknown[]) => void): this - Remove event listenerInherited Methods:
All methods from McpServer:
tool() - Register toolsresource() - Register resourcesprompt() - Register promptssendLoggingMessage() - Send log messagesSession Events:
session:created - Emitted when a session is createdsession:closed - Emitted when a session is closedMessage Events:
message:stored - Emitted when a message is storedinterface SessionInfo {
sessionId: string;
instanceId: string;
createdAt: Date;
lastActivity: Date;
metadata?: Record<string, unknown>;
}
interface Message {
id: string;
sessionId: string;
timestamp: Date;
direction: "request" | "response" | "notification";
payload: unknown;
metadata?: Record<string, unknown>;
}
interface MessageStorage {
store(message: Message): Promise<void>;
retrieve(sessionId: string, options?: { limit?: number; offset?: number }): Promise<Message[]>;
delete(sessionId: string): Promise<void>;
}
InMemoryMessageStorage
In-memory implementation of MessageStorage interface. Suitable for development and testing.
import { InMemoryMessageStorage } from "mcp-server-sdk";
const storage = new InMemoryMessageStorage();
Single server instance handling multiple HTTP requests with SSE for streaming responses.
Maintain sessions across WebSocket connections with message replay on reconnection.
Multiple server instances with shared session storage (e.g., Redis) for load balancing.
In-memory storage for rapid development without external dependencies.
Full TypeScript support with exported types:
import type {
Implementation,
Transport,
ToolCallback,
RegisteredTool,
ResourceTemplate,
CallToolResult,
SessionInfo,
Message,
MessageStorage,
McpServerOptions,
} from "mcp-server-sdk";
Legacy exports are maintained for backward compatibility:
import { DistributedMcpServer, createDistributedMcpServer } from "mcp-server-sdk";
// Aliases for MCPServer and createMCPServer
@modelcontextprotocol/sdk >= 1.0.0MIT
Contributions are welcome! This SDK is designed to be extended for specific distributed use cases.
FAQs
Enhanced MCP server SDK with session management, message routing, and distributed capabilities
We found that mcp-server-sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.

Security News
Open source is under attack because of how much value it creates. It has been the foundation of every major software innovation for the last three decades. This is not the time to walk away from it.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.