feat: support dynamic MCP tool loading

This commit is contained in:
lofyer
2026-08-11 23:49:18 +08:00
parent 98d7166ab3
commit 6a44335238
15 changed files with 695 additions and 140 deletions
+23
View File
@@ -6,6 +6,7 @@ const mocks = vi.hoisted(() => {
connect: vi.fn(),
listTools: vi.fn(),
getServerVersion: vi.fn(),
getServerCapabilities: vi.fn(),
close: vi.fn()
}
return {
@@ -55,6 +56,7 @@ const common = {
name: 'Test MCP',
description: '',
enabled: true,
allowDynamicTools: false,
assignments: ['model'] as Array<'model' | 'opencode' | 'continue'>,
secretConfigured: false
}
@@ -75,6 +77,9 @@ describe('testMcpServer', () => {
name: 'test-server',
version: '1.0.0'
})
mocks.client.getServerCapabilities.mockReturnValue({
tools: { listChanged: false }
})
mocks.client.close.mockResolvedValue(undefined)
})
@@ -98,11 +103,29 @@ describe('testMcpServer', () => {
expect(result).toEqual({
serverName: 'test-server',
serverVersion: '1.0.0',
dynamicToolsSupported: false,
toolCount: 1,
tools: [{ name: 'search', description: 'Search documents' }]
})
})
it('reports support for dynamic tool-list notifications', async () => {
mocks.client.getServerCapabilities.mockReturnValue({
tools: { listChanged: true }
})
await expect(
testMcpServer({
...common,
transport: 'stdio',
command: 'node',
args: ['server.js']
} satisfies ResolvedMcpServer)
).resolves.toMatchObject({
dynamicToolsSupported: true
})
})
it('injects a bearer token only into the remote transport', async () => {
await testMcpServer({
...common,