diff --git a/packages/dbmole-mcp/src/server.ts b/packages/dbmole-mcp/src/server.ts index 1b47eb4..1aa8410 100644 --- a/packages/dbmole-mcp/src/server.ts +++ b/packages/dbmole-mcp/src/server.ts @@ -1,11 +1,12 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' +import pkg from '../package.json' with { type: 'json' } import type { DbRegistry } from './config/registry.js' import type { DbManager } from './db/manager.js' import { registerConnectionTools } from './tools/connections.js' import { registerQueryTools } from './tools/query.js' import { registerSchemaTools } from './tools/schema.js' -export const SERVER_VERSION = '0.1.0' +export const SERVER_VERSION = pkg.version export const createServer = (registry: DbRegistry, manager: DbManager): McpServer => { const server = new McpServer({ name: 'dbmole-mcp', version: SERVER_VERSION }) diff --git a/packages/dbmole-mcp/test/unit/server.test.ts b/packages/dbmole-mcp/test/unit/server.test.ts index 8a719cb..2a4a432 100644 --- a/packages/dbmole-mcp/test/unit/server.test.ts +++ b/packages/dbmole-mcp/test/unit/server.test.ts @@ -2,8 +2,9 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import pkg from '../../package.json' with { type: 'json' } import { createRegistry } from '../../src/config/registry.js' -import { createServer } from '../../src/server.js' +import { createServer, SERVER_VERSION } from '../../src/server.js' import { connectClient, fakeManager } from './helpers.js' describe('createServer', () => { @@ -17,6 +18,25 @@ describe('createServer', () => { rmSync(dir, { recursive: true, force: true }) }) + it('reports the package version over MCP', () => { + expect(SERVER_VERSION).toBe(pkg.version) + }) + + it('publishes a typed inputSchema for add_connection, not an empty object', async () => { + const registry = createRegistry({ storePath: join(dir, 'connections.json'), env: {} }) + const server = createServer(registry, fakeManager()) + const client = await connectClient(server) + const { tools } = await client.listTools() + const add = tools.find((tool) => tool.name === 'add_connection') + const schema = add?.inputSchema + expect(Object.keys(schema?.properties ?? {})).toEqual( + expect.arrayContaining(['name', 'host', 'port', 'user', 'password', 'type', 'database']) + ) + expect(schema?.required ?? []).toEqual(expect.arrayContaining(['name', 'host', 'type'])) + expect(schema?.additionalProperties).toBe(false) + await client.close() + }) + it('registers all nine tools', async () => { const registry = createRegistry({ storePath: join(dir, 'connections.json'), env: {} }) const server = createServer(registry, fakeManager()) diff --git a/packages/esmole-mcp/src/server.ts b/packages/esmole-mcp/src/server.ts index 8686407..6b0ee88 100644 --- a/packages/esmole-mcp/src/server.ts +++ b/packages/esmole-mcp/src/server.ts @@ -1,6 +1,7 @@ import { registerConnectionTools } from '@dbmole/core' import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' import * as z from 'zod' +import pkg from '../package.json' with { type: 'json' } import type { EsBackend } from './es/backend.js' import { ping } from './esBackend.js' import { esFormatError } from './esError.js' @@ -16,7 +17,7 @@ import { } from './schema.js' import { registerEsTools } from './tools/index.js' -export const SERVER_VERSION = '0.1.1' +export const SERVER_VERSION = pkg.version const patchSchema = z .object({ diff --git a/packages/esmole-mcp/test/unit/server.test.ts b/packages/esmole-mcp/test/unit/server.test.ts index 94085ba..a549af2 100644 --- a/packages/esmole-mcp/test/unit/server.test.ts +++ b/packages/esmole-mcp/test/unit/server.test.ts @@ -5,6 +5,7 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js' import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js' import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import pkg from '../../package.json' with { type: 'json' } import { createManager } from '../../src/manager.js' import { createRegistry } from '../../src/registry.js' import { createServer, SERVER_VERSION } from '../../src/server.js' @@ -27,8 +28,8 @@ describe('createServer', () => { rmSync(dir, { recursive: true, force: true }) }) - it('exports SERVER_VERSION', () => { - expect(SERVER_VERSION).toBe('0.1.1') + it('reports the package version over MCP', () => { + expect(SERVER_VERSION).toBe(pkg.version) }) it('registers exactly the ten tools and names the server esmole-mcp', async () => { diff --git a/tsconfig.base.json b/tsconfig.base.json index 43124cc..48edd62 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -3,6 +3,7 @@ "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", + "resolveJsonModule": true, "strict": true, "skipLibCheck": true, "esModuleInterop": true,