mirror of
https://github.com/modelcontextprotocol/servers.git
synced 2026-04-22 22:05:28 +02:00
Adding resource subscriptions:
* Updated architecture.md
* In server/index.ts
- imported Transport, setSubscriptionHandlers,beginSimulatedResourceUpdates, and stopSimulatedResourceUpdates
- call setSubscriptionHandlers passing server
- in returned object,
- refactor/renamed startNotificationIntervals placehodler to clientConnected, which takes a transport argument and calls beginSimulatedResourceUpdates, passing the transport
- replaced cleanup placeholder with a function that takes an optional sessionId and calls stopSimulatedResourceUpdates, passing the sessionId
* In sse.ts, stdio.ts, and streamableHttp.ts
- when transport is connected, called clientConnect, passing transport
- when disconnecting, called cleanup, passing sessionId
* Added subscriptions.ts
- tracks subscriber session id lists by URI
- tracks transport by session id
- tracks subscription update intervals by sessionId
- in setSubscriptionHandlers
- set request handlers for SubscribeRequestSchema and UnsubscribeRequestSchema
- in beginSimulatedResourceUpdates
- starts an interval to send updates to the transport for all subscribed resources
- in stopSimulatedResourceUpdates
- removes intervals and transport for gien session id
78 lines
2.0 KiB
TypeScript
78 lines
2.0 KiB
TypeScript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
import { dirname, join } from "path";
|
|
import { readFileSync } from "fs";
|
|
import { fileURLToPath } from "url";
|
|
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
import {
|
|
setSubscriptionHandlers,
|
|
beginSimulatedResourceUpdates,
|
|
stopSimulatedResourceUpdates
|
|
} from "../resources/subscriptions.js";
|
|
import { registerTools } from "../tools/index.js";
|
|
import { registerResources } from "../resources/index.js";
|
|
import { registerPrompts } from "../prompts/index.js";
|
|
|
|
// Everything Server factory
|
|
export const createServer = () => {
|
|
// Read the server instructions
|
|
const instructions = readInstructions();
|
|
|
|
// Create the server
|
|
const server = new McpServer(
|
|
{
|
|
name: "mcp-servers/everything",
|
|
title: "Everything Reference Server",
|
|
version: "2.0.0",
|
|
},
|
|
{
|
|
capabilities: {
|
|
tools: {},
|
|
logging: {},
|
|
prompts: {},
|
|
resources: {
|
|
subscribe: true,
|
|
},
|
|
},
|
|
instructions,
|
|
}
|
|
);
|
|
|
|
// Register the tools
|
|
registerTools(server);
|
|
|
|
// Register the resources
|
|
registerResources(server);
|
|
|
|
// Register the prompts
|
|
registerPrompts(server);
|
|
|
|
// Set resource subscription handlers
|
|
setSubscriptionHandlers(server);
|
|
|
|
return {
|
|
server,
|
|
clientConnected: (transport: Transport) => {
|
|
beginSimulatedResourceUpdates(transport);
|
|
// TODO simulated logging
|
|
},
|
|
cleanup: (sessionId?: string) => {
|
|
stopSimulatedResourceUpdates(sessionId);
|
|
},
|
|
};
|
|
};
|
|
|
|
// Read the server instructions from a file
|
|
function readInstructions(): string {
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
const filePath = join(__dirname, "..", "docs", "server-instructions.md");
|
|
let instructions;
|
|
|
|
try {
|
|
instructions = readFileSync(filePath, "utf-8");
|
|
} catch (e) {
|
|
instructions = "Server instructions not loaded: " + e;
|
|
}
|
|
return instructions;
|
|
}
|