feat(esmole): server wiring and stdio entry
This commit is contained in:
1 parent
49fb98c18b
commit
5aad5f9304
3 files changed
+195
-1
No files matched your search
@@ -0,0 +1,88 @@
|
||||
import { mkdtempSync, rmSync } from 'node:fs'
|
||||
import { tmpdir } from 'node:os'
|
||||
import { join } from 'node:path'
|
||||
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 { createManager } from '../../src/manager.js'
|
||||
import { createRegistry } from '../../src/registry.js'
|
||||
import { createServer, SERVER_VERSION } from '../../src/server.js'
|
||||
|
||||
const connectClient = async (server: McpServer): Promise<Client> => {
|
||||
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair()
|
||||
const client = new Client({ name: 'test-client', version: '0.0.0' })
|
||||
await Promise.all([client.connect(clientTransport), server.connect(serverTransport)])
|
||||
return client
|
||||
}
|
||||
|
||||
describe('createServer', () => {
|
||||
let dir: string
|
||||
|
||||
beforeEach(() => {
|
||||
dir = mkdtempSync(join(tmpdir(), 'esmole-server-'))
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
rmSync(dir, { recursive: true, force: true })
|
||||
})
|
||||
|
||||
it('exports SERVER_VERSION', () => {
|
||||
expect(SERVER_VERSION).toBe('0.1.0')
|
||||
})
|
||||
|
||||
it('registers exactly the ten tools and names the server esmole-mcp', async () => {
|
||||
const registry = createRegistry({ storePath: join(dir, 'connections.json'), env: {} })
|
||||
const manager = createManager(registry)
|
||||
const server = createServer(registry, manager)
|
||||
const client = await connectClient(server)
|
||||
const { tools } = await client.listTools()
|
||||
expect(tools.map((tool) => tool.name).sort()).toEqual([
|
||||
'add_connection',
|
||||
'es_cluster_health',
|
||||
'es_get_mapping',
|
||||
'es_list_indices',
|
||||
'es_request',
|
||||
'es_search',
|
||||
'list_connections',
|
||||
'remove_connection',
|
||||
'test_connection',
|
||||
'update_connection'
|
||||
])
|
||||
expect(client.getServerVersion()?.name).toBe('esmole-mcp')
|
||||
await client.close()
|
||||
})
|
||||
|
||||
it('list_connections renders the public view of a stored connection', async () => {
|
||||
const registry = createRegistry({ storePath: join(dir, 'connections.json'), env: {} })
|
||||
registry.add({
|
||||
name: 'prod',
|
||||
type: 'elasticsearch',
|
||||
host: 'es.example.com',
|
||||
apiKey: 'secret-key',
|
||||
scheme: 'https',
|
||||
verifyTls: true,
|
||||
readonly: false
|
||||
})
|
||||
const server = createServer(registry, createManager(registry))
|
||||
const client = await connectClient(server)
|
||||
const result = await client.callTool({ name: 'list_connections', arguments: {} })
|
||||
const content = result.content as Array<{ type: string; text: string }>
|
||||
const view = JSON.parse(content[0].text)
|
||||
expect(view).toEqual([
|
||||
{
|
||||
name: 'prod',
|
||||
type: 'elasticsearch',
|
||||
scheme: 'https',
|
||||
host: 'es.example.com',
|
||||
port: 9200,
|
||||
auth: 'apiKey',
|
||||
verifyTls: true,
|
||||
readonly: false,
|
||||
source: 'store',
|
||||
ssh: false
|
||||
}
|
||||
])
|
||||
await client.close()
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user