diff options
| author | christine betts <[email protected]> | 2025-07-25 20:56:33 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-25 20:56:33 +0000 |
| commit | eb65034117f7722554a717de034e891ba1996e93 (patch) | |
| tree | f279bee5ca55b0e447eabc70a11e96de307d76f3 /packages/core/src/tools/mcp-client.test.ts | |
| parent | de968877895a8ae5f0edb83a43b37fa190cc8ec9 (diff) | |
Load and use MCP server prompts as slash commands in the CLI (#4828)
Co-authored-by: harold <[email protected]>
Co-authored-by: N. Taylor Mullen <[email protected]>
Diffstat (limited to 'packages/core/src/tools/mcp-client.test.ts')
| -rw-r--r-- | packages/core/src/tools/mcp-client.test.ts | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/packages/core/src/tools/mcp-client.test.ts b/packages/core/src/tools/mcp-client.test.ts index 428c9d2d..4560982c 100644 --- a/packages/core/src/tools/mcp-client.test.ts +++ b/packages/core/src/tools/mcp-client.test.ts @@ -11,6 +11,7 @@ import { createTransport, isEnabled, discoverTools, + discoverPrompts, } from './mcp-client.js'; import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'; import * as SdkClientStdioLib from '@modelcontextprotocol/sdk/client/stdio.js'; @@ -18,6 +19,7 @@ import * as ClientLib from '@modelcontextprotocol/sdk/client/index.js'; import * as GenAiLib from '@google/genai'; import { GoogleCredentialProvider } from '../mcp/google-auth-provider.js'; import { AuthProviderType } from '../config/config.js'; +import { PromptRegistry } from '../prompts/prompt-registry.js'; vi.mock('@modelcontextprotocol/sdk/client/stdio.js'); vi.mock('@modelcontextprotocol/sdk/client/index.js'); @@ -50,6 +52,77 @@ describe('mcp-client', () => { }); }); + describe('discoverPrompts', () => { + const mockedPromptRegistry = { + registerPrompt: vi.fn(), + } as unknown as PromptRegistry; + + it('should discover and log prompts', async () => { + const mockRequest = vi.fn().mockResolvedValue({ + prompts: [ + { name: 'prompt1', description: 'desc1' }, + { name: 'prompt2' }, + ], + }); + const mockedClient = { + request: mockRequest, + } as unknown as ClientLib.Client; + + await discoverPrompts('test-server', mockedClient, mockedPromptRegistry); + + expect(mockRequest).toHaveBeenCalledWith( + { method: 'prompts/list', params: {} }, + expect.anything(), + ); + }); + + it('should do nothing if no prompts are discovered', async () => { + const mockRequest = vi.fn().mockResolvedValue({ + prompts: [], + }); + const mockedClient = { + request: mockRequest, + } as unknown as ClientLib.Client; + + const consoleLogSpy = vi + .spyOn(console, 'debug') + .mockImplementation(() => { + // no-op + }); + + await discoverPrompts('test-server', mockedClient, mockedPromptRegistry); + + expect(mockRequest).toHaveBeenCalledOnce(); + expect(consoleLogSpy).not.toHaveBeenCalled(); + + consoleLogSpy.mockRestore(); + }); + + it('should log an error if discovery fails', async () => { + const testError = new Error('test error'); + testError.message = 'test error'; + const mockRequest = vi.fn().mockRejectedValue(testError); + const mockedClient = { + request: mockRequest, + } as unknown as ClientLib.Client; + + const consoleErrorSpy = vi + .spyOn(console, 'error') + .mockImplementation(() => { + // no-op + }); + + await discoverPrompts('test-server', mockedClient, mockedPromptRegistry); + + expect(mockRequest).toHaveBeenCalledOnce(); + expect(consoleErrorSpy).toHaveBeenCalledWith( + `Error discovering prompts from test-server: ${testError.message}`, + ); + + consoleErrorSpy.mockRestore(); + }); + }); + describe('appendMcpServerCommand', () => { it('should do nothing if no MCP servers or command are configured', () => { const out = populateMcpServerCommand({}, undefined); |
