test(repository-plugin): cover MCP activation cleanup
This commit is contained in:
@@ -261,6 +261,60 @@ describe('prepared repository plugin Loader composition', () => {
|
|||||||
await ctx.fiber.dispose()
|
await ctx.fiber.dispose()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('mounts and removes tools discovered from a repository MCP server', async () => {
|
||||||
|
const root = await temporaryDirectory('mcp-loader-success')
|
||||||
|
const server = join(root, 'mcp-server.mjs')
|
||||||
|
await writeFile(server, [
|
||||||
|
"import { createInterface } from 'node:readline'",
|
||||||
|
'const lines = createInterface({ input: process.stdin })',
|
||||||
|
'for await (const line of lines) {',
|
||||||
|
' const request = JSON.parse(line)',
|
||||||
|
" if (!('id' in request)) continue",
|
||||||
|
' let result',
|
||||||
|
" if (request.method === 'initialize') {",
|
||||||
|
' result = {',
|
||||||
|
' protocolVersion: request.params.protocolVersion,',
|
||||||
|
' capabilities: { tools: {} },',
|
||||||
|
" serverInfo: { name: 'repository-fixture', version: '0.0.0' },",
|
||||||
|
' }',
|
||||||
|
" } else if (request.method === 'tools/list') {",
|
||||||
|
' result = {',
|
||||||
|
' tools: [{',
|
||||||
|
" name: 'proof',",
|
||||||
|
" description: 'Repository MCP proof.',",
|
||||||
|
" inputSchema: { type: 'object', properties: {} },",
|
||||||
|
' }],',
|
||||||
|
' }',
|
||||||
|
' } else {',
|
||||||
|
' result = {}',
|
||||||
|
' }',
|
||||||
|
" process.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', id: request.id, result })}\\n`)",
|
||||||
|
'}',
|
||||||
|
'',
|
||||||
|
].join('\n'))
|
||||||
|
await writeFile(join(root, '.mcp.json'), JSON.stringify({
|
||||||
|
mcpServers: { online: { command: process.execPath, args: [server] } },
|
||||||
|
}))
|
||||||
|
const directory = await writePlugin(root, 'mcp-loader-success-fixture', { mcpServers: '../.mcp.json' })
|
||||||
|
await RepositoryPlugin.prepareDshPlugin(directory)
|
||||||
|
|
||||||
|
const ctx = new Context()
|
||||||
|
ctx.baseUrl = pathToFileURL(directory).href + '/'
|
||||||
|
await ctx.plugin(Loader)
|
||||||
|
await ctx.plugin(SystemPrompt)
|
||||||
|
await ctx.plugin(ToolRegistry)
|
||||||
|
await ctx.plugin(RepositoryPlugin)
|
||||||
|
const id = await ctx.loader.create({
|
||||||
|
name: pathToFileURL(join(directory, RepositoryPlugin.PREPARED_ENTRY_FILENAME)).href,
|
||||||
|
})
|
||||||
|
await ctx.loader.await()
|
||||||
|
expect(ctx.tools.get('mcp__online__proof')).toBeDefined()
|
||||||
|
|
||||||
|
await ctx.loader.remove(id)
|
||||||
|
expect(ctx.tools.get('mcp__online__proof')).toBeUndefined()
|
||||||
|
await ctx.fiber.dispose()
|
||||||
|
})
|
||||||
|
|
||||||
it('fails an MCP repository plugin load when its declared server cannot connect', async () => {
|
it('fails an MCP repository plugin load when its declared server cannot connect', async () => {
|
||||||
const root = await temporaryDirectory('mcp-loader')
|
const root = await temporaryDirectory('mcp-loader')
|
||||||
await writeFile(join(root, '.mcp.json'), JSON.stringify({
|
await writeFile(join(root, '.mcp.json'), JSON.stringify({
|
||||||
|
|||||||
Reference in New Issue
Block a user