diff --git a/eslint.config.mts b/eslint.config.mts index f65cf1c..f1e765e 100644 --- a/eslint.config.mts +++ b/eslint.config.mts @@ -37,15 +37,6 @@ export default tseslint.config( "obsidianmd/ui/sentence-case": ["error", { allowAutoFix: true }], }, }, - // MCP SDK's Server class is deprecated in favor of McpServer, but McpServer - // requires Zod schemas for tool registration. This codebase uses raw JSON Schema - // with setRequestHandler, which is only available on the deprecated Server class. - { - files: ["src/mcp-server.ts", "src/utils/mcp-server-pool.ts"], - rules: { - "@typescript-eslint/no-deprecated": "off", - }, - }, // builtin-modules is build-tooling only (esbuild.config.mjs), not plugin code. // js-yaml is used for YAML parsing in Bases API — no built-in alternative exists. // diff --git a/src/mcp-server.ts b/src/mcp-server.ts index 9c867dc..40cedf1 100644 --- a/src/mcp-server.ts +++ b/src/mcp-server.ts @@ -3,7 +3,7 @@ import cors from 'cors'; import { App, Notice } from 'obsidian'; import { createServer as createHttpServer, Server } from 'http'; import { Server as HttpsServer } from 'https'; -import { Server as MCPServer } from '@modelcontextprotocol/sdk/server/index.js'; +import { McpServer as MCPServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; import { isInitializeRequest diff --git a/src/utils/mcp-server-pool.ts b/src/utils/mcp-server-pool.ts index bfb7271..b9c34f6 100644 --- a/src/utils/mcp-server-pool.ts +++ b/src/utils/mcp-server-pool.ts @@ -1,4 +1,4 @@ -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { ListToolsRequestSchema, CallToolRequestSchema, @@ -35,7 +35,7 @@ interface PluginWithSettings { } interface PooledServer { - server: Server; + server: McpServer; sessionId: string; createdAt: number; lastActivityAt: number; @@ -80,7 +80,7 @@ export class MCPServerPool extends EventEmitter { /** * Get or create an MCP server for a session */ - getOrCreateServer(sessionId: string): Server { + getOrCreateServer(sessionId: string): McpServer { // Check if server exists let pooledServer = this.servers.get(sessionId); @@ -118,8 +118,12 @@ export class MCPServerPool extends EventEmitter { /** * Create a new MCP server instance with handlers */ - private createNewServer(sessionId: string): Server { - const server = new Server( + private createNewServer(sessionId: string): McpServer { + // Construct via McpServer (the non-deprecated class) and register our + // raw JSON-Schema handlers on its underlying .server — the advanced + // low-level handle it deliberately exposes — so the deprecated Server + // symbol never appears in our source. We don't use registerTool/Zod. + const mcpServer = new McpServer( { name: 'Semantic Notes Vault MCP', version: getVersion() @@ -133,6 +137,7 @@ export class MCPServerPool extends EventEmitter { ...(this.initializeInstructions ? { instructions: this.initializeInstructions } : {}) } ); + const server = mcpServer.server; // Create session-specific API instance // Always create SecureObsidianAPI if the main API has security settings @@ -372,7 +377,7 @@ export class MCPServerPool extends EventEmitter { throw new Error(`Unknown resource: ${uri}`); }); - return server; + return mcpServer; } /**