diff --git a/package-lock.json b/package-lock.json index ebce146d2..93f5afd50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tableau/mcp-server", - "version": "1.18.7", + "version": "1.18.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@tableau/mcp-server", - "version": "1.18.7", + "version": "1.18.8", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", diff --git a/package.json b/package.json index fdb4716b2..c237d60b8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tableau/mcp-server", "description": "Helping agents see and understand data.", - "version": "1.18.7", + "version": "1.18.8", "repository": { "type": "git", "url": "git+https://github.com/tableau/tableau-mcp.git" diff --git a/src/index.ts b/src/index.ts index 108a5b90e..90da29623 100644 --- a/src/index.ts +++ b/src/index.ts @@ -42,7 +42,7 @@ async function startServer(): Promise { server.registerRequestHandlers(); const transport = new StdioServerTransport(); - await server.connect(transport); + await server.mcpServer.connect(transport); setNotificationLevel(server, logLevel); notifier.info(server, `${server.name} v${server.version} running on stdio`); diff --git a/src/logging/notification.test.ts b/src/logging/notification.test.ts index 3c6493b52..3c7265587 100644 --- a/src/logging/notification.test.ts +++ b/src/logging/notification.test.ts @@ -44,7 +44,7 @@ describe('notification', () => { const server = new Server(); setNotificationLevel(server, 'debug', { silent: true }); setNotificationLevel(server, 'debug', { silent: true }); - expect(server.server.notification).not.toHaveBeenCalled(); + expect(server.mcpServer.server.notification).not.toHaveBeenCalled(); }); }); @@ -120,7 +120,7 @@ describe('notification', () => { await notifier.info(server, 'test message', { notifier: 'test-logger' }); - expect(server.server.notification).toHaveBeenCalledWith( + expect(server.mcpServer.server.notification).toHaveBeenCalledWith( { method: 'notifications/message', params: { @@ -141,7 +141,7 @@ describe('notification', () => { await notifier.debug(server, 'test message', { notifier: 'test-logger' }); - expect(server.server.notification).not.toHaveBeenCalled(); + expect(server.mcpServer.server.notification).not.toHaveBeenCalled(); }); it('should use server name as default logger', async () => { @@ -150,7 +150,7 @@ describe('notification', () => { await notifier.info(server, 'test message'); - expect(server.server.notification).toHaveBeenCalledWith( + expect(server.mcpServer.server.notification).toHaveBeenCalledWith( { method: 'notifications/message', params: { @@ -176,7 +176,7 @@ describe('notification', () => { await notifier.info(server, logMessage, { notifier: 'test-logger' }); - expect(server.server.notification).toHaveBeenCalledWith( + expect(server.mcpServer.server.notification).toHaveBeenCalledWith( { method: 'notifications/message', params: { diff --git a/src/logging/notification.ts b/src/logging/notification.ts index 3a0d22f7d..dbe800824 100644 --- a/src/logging/notification.ts +++ b/src/logging/notification.ts @@ -105,7 +105,7 @@ function getSendNotificationMessageFn(level: LoggingLevel) { // server.sendNotification doesn't provide a way to provide the relatedRequestId // so we're using server.notification directly. - return server.server.notification( + return server.mcpServer.server.notification( { method: 'notifications/message', params: { diff --git a/src/server.test.ts b/src/server.test.ts index 6c4fcf50a..1f5b194d3 100644 --- a/src/server.test.ts +++ b/src/server.test.ts @@ -30,7 +30,7 @@ describe('server', () => { const disabledFlags = await Promise.all(allTools.map((tool) => Provider.from(tool.disabled))); const tools = allTools.filter((_, i) => !disabledFlags[i]); for (const tool of tools) { - expect(server.registerTool).toHaveBeenCalledWith( + expect(server.mcpServer.registerTool).toHaveBeenCalledWith( tool.name, { description: await Provider.from(tool.description), @@ -54,7 +54,7 @@ describe('server', () => { ); const disabledTools = allDisabledTools.filter((_, i) => disabledToolFlags[i]); for (const tool of disabledTools) { - expect(server.registerTool).not.toHaveBeenCalledWith( + expect(server.mcpServer.registerTool).not.toHaveBeenCalledWith( tool.name, expect.anything(), expect.anything(), @@ -68,7 +68,7 @@ describe('server', () => { await server.registerTools(); const tool = getQueryDatasourceTool(server, testProductVersion); - expect(server.registerTool).toHaveBeenCalledWith( + expect(server.mcpServer.registerTool).toHaveBeenCalledWith( tool.name, { description: await Provider.from(tool.description), @@ -90,13 +90,13 @@ describe('server', () => { ); for (const [i, tool] of tools.entries()) { if (tool.name === 'query-datasource' || excludeDisabledFlags[i]) { - expect(server.registerTool).not.toHaveBeenCalledWith( + expect(server.mcpServer.registerTool).not.toHaveBeenCalledWith( tool.name, expect.anything(), expect.anything(), ); } else { - expect(server.registerTool).toHaveBeenCalledWith( + expect(server.mcpServer.registerTool).toHaveBeenCalledWith( tool.name, { description: await Provider.from(tool.description), @@ -128,15 +128,15 @@ describe('server', () => { it('should register request handlers', async () => { const server = getServer(); - server.server.setRequestHandler = vi.fn(); + server.mcpServer.server.setRequestHandler = vi.fn(); server.registerRequestHandlers(); - expect(server.server.setRequestHandler).toHaveBeenCalled(); + expect(server.mcpServer.server.setRequestHandler).toHaveBeenCalled(); }); }); function getServer(): InstanceType { const server = new Server(); - server.registerTool = vi.fn(); + server.mcpServer.registerTool = vi.fn(); return server; } diff --git a/src/server.ts b/src/server.ts index a3b039882..ceac44c27 100644 --- a/src/server.ts +++ b/src/server.ts @@ -26,7 +26,8 @@ export const userAgent = `${serverName}/${serverVersion}`; export type ClientInfo = InitializeRequest['params']['clientInfo']; -export class Server extends McpServer { +export class Server { + readonly mcpServer: McpServer; readonly name: string; readonly version: string; @@ -41,22 +42,24 @@ export class Server extends McpServer { private readonly _clientInfo: ClientInfo | undefined; get clientInfo(): ClientInfo | undefined { - return this._clientInfo ?? this.server.getClientVersion(); + return this._clientInfo ?? this.mcpServer.server.getClientVersion(); } - constructor({ clientInfo }: { clientInfo?: ClientInfo } = {}) { - super( - { - name: serverName, - version: serverVersion, - }, - { - capabilities: { - logging: {}, - tools: {}, + constructor({ clientInfo, mcpServer }: { clientInfo?: ClientInfo; mcpServer?: McpServer } = {}) { + this.mcpServer = + mcpServer ?? + new McpServer( + { + name: serverName, + version: serverVersion, }, - }, - ); + { + capabilities: { + logging: {}, + tools: {}, + }, + }, + ); this.name = serverName; this.version = serverVersion; @@ -114,7 +117,7 @@ export class Server extends McpServer { return tableauToolCallback(args, tableauRequestHandlerExtra); }; - this.registerTool( + this.mcpServer.registerTool( name, { description: await Provider.from(description), @@ -127,7 +130,7 @@ export class Server extends McpServer { }; registerRequestHandlers = (): void => { - this.server.setRequestHandler(SetLevelRequestSchema, async (request) => { + this.mcpServer.server.setRequestHandler(SetLevelRequestSchema, async (request) => { setNotificationLevel(this, request.params.level); return {}; }); diff --git a/src/server/express.ts b/src/server/express.ts index 90ff7e266..4a01b1db1 100644 --- a/src/server/express.ts +++ b/src/server/express.ts @@ -127,7 +127,7 @@ export async function startExpressServer({ res.on('close', () => { transport.close(); - server.close(); + server.mcpServer.close(); }); await connect(server, transport, logLevel, getTableauAuthInfo(req.auth)); @@ -183,7 +183,7 @@ async function connect( await server.registerTools(authInfo); server.registerRequestHandlers(); - await server.connect(transport); + await server.mcpServer.connect(transport); setNotificationLevel(server, logLevel); } diff --git a/src/testSetup.ts b/src/testSetup.ts index dbafa117a..4660b5766 100644 --- a/src/testSetup.ts +++ b/src/testSetup.ts @@ -6,8 +6,10 @@ vi.mock('./server.js', async (importOriginal) => ({ ...(await importOriginal()), Server: vi.fn().mockImplementation(() => ({ name: 'test-server', - server: { - notification: vi.fn(), + mcpServer: { + server: { + notification: vi.fn(), + }, }, })), })); diff --git a/src/tools/pulse/listMetricSubscriptions/listPulseMetricSubscriptions.test.ts b/src/tools/pulse/listMetricSubscriptions/listPulseMetricSubscriptions.test.ts index 7deedcfdc..db7f85f50 100644 --- a/src/tools/pulse/listMetricSubscriptions/listPulseMetricSubscriptions.test.ts +++ b/src/tools/pulse/listMetricSubscriptions/listPulseMetricSubscriptions.test.ts @@ -186,6 +186,6 @@ async function getToolResult(): Promise { function getServer(): InstanceType { const server = new Server(); - server.tool = vi.fn(); + server.mcpServer.registerTool = vi.fn(); return server; }