diff --git a/client/src/lib/hooks/__tests__/useConnection.test.tsx b/client/src/lib/hooks/__tests__/useConnection.test.tsx index 4907a085b..ce97215f9 100644 --- a/client/src/lib/hooks/__tests__/useConnection.test.tsx +++ b/client/src/lib/hooks/__tests__/useConnection.test.tsx @@ -518,12 +518,68 @@ describe("useConnection", () => { }), expect.objectContaining({ capabilities: expect.objectContaining({ - elicitation: {}, + elicitation: expect.objectContaining({ + form: {}, + }), }), }), ); }); + test("declines URL elicitation requests and continues supporting form requests", async () => { + const mockOnElicitationRequest = jest.fn(); + const propsWithElicitation = { + ...defaultProps, + onElicitationRequest: mockOnElicitationRequest, + }; + + const { result } = renderHook(() => useConnection(propsWithElicitation)); + + await act(async () => { + await result.current.connect(); + }); + + const elicitRequestHandlerCall = + mockClient.setRequestHandler.mock.calls.find((call) => { + try { + const schema = call[0]; + const testRequest = { + method: "elicitation/create", + params: { + mode: "url", + message: "please continue", + url: "https://example.com", + elicitationId: "id-1", + }, + }; + const parseResult = + schema.safeParse && schema.safeParse(testRequest); + return parseResult?.success; + } catch { + return false; + } + }); + + expect(elicitRequestHandlerCall).toBeDefined(); + const [, handler] = elicitRequestHandlerCall; + + let urlResult: unknown; + await act(async () => { + urlResult = await handler({ + method: "elicitation/create", + params: { + mode: "url", + message: "please continue", + url: "https://example.com", + elicitationId: "id-1", + }, + }); + }); + + expect(urlResult).toEqual({ action: "decline" }); + expect(mockOnElicitationRequest).not.toHaveBeenCalled(); + }); + test("sets up elicitation request handler when onElicitationRequest is provided", async () => { const mockOnElicitationRequest = jest.fn(); const propsWithElicitation = { diff --git a/client/src/lib/hooks/useConnection.ts b/client/src/lib/hooks/useConnection.ts index e14d1037f..ec5e82d4c 100644 --- a/client/src/lib/hooks/useConnection.ts +++ b/client/src/lib/hooks/useConnection.ts @@ -452,7 +452,9 @@ export function useConnection({ const clientCapabilities = { capabilities: { sampling: {}, - elicitation: {}, + elicitation: { + form: {}, + }, roots: { listChanged: true, }, @@ -1056,6 +1058,14 @@ export function useConnection({ if (onElicitationRequest) { client.setRequestHandler(ElicitRequestSchema, (request) => { + const requestedMode = ( + request as { params?: { mode?: "form" | "url" } } + ).params?.mode; + + if (requestedMode === "url") { + return Promise.resolve({ action: "decline" }); + } + const taskSpec = (request as { params?: { task?: { ttl?: number } } }) .params?.task;