From c4fc83b5c930283c26481fabc091441f20f69c8d Mon Sep 17 00:00:00 2001 From: Ryan Buchmayer Date: Wed, 26 Aug 2026 17:35:02 -0700 Subject: [PATCH 1/3] fix: advertise JSON Schema 2020-12 in tools/list (v1.2.1) --- .claude-plugin/marketplace.json | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- server.json | 4 ++-- src/index.test.ts | 4 ++-- src/server.test.ts | 28 ++++++++++++++++++++++ src/server.ts | 42 ++++++++++++++++++++++++++++++++- 7 files changed, 78 insertions(+), 10 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index c8e81cc..c3355fc 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,14 +6,14 @@ }, "metadata": { "description": "Official Perplexity AI plugin providing real-time web search, reasoning, and research capabilities", - "version": "1.2.0" + "version": "1.2.1" }, "plugins": [ { "name": "perplexity", "source": "./", "description": "Real-time web search, reasoning, and research through Perplexity's API", - "version": "1.2.0", + "version": "1.2.1", "author": { "name": "Perplexity AI", "email": "api@perplexity.ai" diff --git a/package-lock.json b/package-lock.json index 29c2eb7..5145f15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@perplexity-ai/mcp-server", - "version": "1.2.0", + "version": "1.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@perplexity-ai/mcp-server", - "version": "1.2.0", + "version": "1.2.1", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", diff --git a/package.json b/package.json index 0c971ae..66491ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@perplexity-ai/mcp-server", - "version": "1.2.0", + "version": "1.2.1", "mcpName": "ai.perplexity/mcp-server", "description": "Real-time web search, reasoning, and research through Perplexity's API", "keywords": [ diff --git a/server.json b/server.json index 34fcb5a..7434249 100644 --- a/server.json +++ b/server.json @@ -3,12 +3,12 @@ "name": "ai.perplexity/mcp-server", "title": "Perplexity API Platform", "description": "Real-time web search, reasoning, and research through Perplexity's API", - "version": "1.2.0", + "version": "1.2.1", "packages": [ { "registryType": "npm", "identifier": "@perplexity-ai/mcp-server", - "version": "1.2.0", + "version": "1.2.1", "transport": { "type": "stdio" } diff --git a/src/index.test.ts b/src/index.test.ts index 6c05141..dd82e95 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -127,9 +127,9 @@ describe("Perplexity MCP Server", () => { headers: { "Content-Type": "application/json", Authorization: "Bearer test-api-key", - "User-Agent": "perplexity-mcp/1.2.0", + "User-Agent": "perplexity-mcp/1.2.1", "X-Source": "pplx-mcp-server", - "X-Pplx-Integration": "perplexity-mcp/1.2.0", + "X-Pplx-Integration": "perplexity-mcp/1.2.1", }, body: JSON.stringify({ preset: "fast", diff --git a/src/server.test.ts b/src/server.test.ts index 0d5eac3..66a45f2 100644 --- a/src/server.test.ts +++ b/src/server.test.ts @@ -366,3 +366,31 @@ describe("Server Utility Functions", () => { }); }); }); + +describe("createPerplexityServer tools/list schemas", () => { + it("advertises JSON Schema 2020-12 on every input and output schema", async () => { + vi.stubEnv("PERPLEXITY_API_KEY", "pplx-test"); + const { Client } = await import("@modelcontextprotocol/sdk/client/index.js"); + const { InMemoryTransport } = await import("@modelcontextprotocol/sdk/inMemory.js"); + const { createPerplexityServer } = await import("./server.js"); + + const server = createPerplexityServer(); + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + await server.connect(serverTransport); + const client = new Client({ name: "test", version: "0.0.0" }); + await client.connect(clientTransport); + + const { tools } = await client.listTools(); + expect(tools.length).toBeGreaterThan(0); + for (const tool of tools) { + expect(tool.inputSchema.$schema, `${tool.name} inputSchema`).toBe( + "https://json-schema.org/draft/2020-12/schema" + ); + expect(tool.outputSchema?.$schema, `${tool.name} outputSchema`).toBe( + "https://json-schema.org/draft/2020-12/schema" + ); + } + await client.close(); + await server.close(); + }); +}); diff --git a/src/server.ts b/src/server.ts index ad11f35..a07bd74 100644 --- a/src/server.ts +++ b/src/server.ts @@ -18,7 +18,7 @@ export type { ApiKeyProvider, PerplexityServerOptions } from "./types.js"; const PERPLEXITY_API_KEY = process.env.PERPLEXITY_API_KEY; const PERPLEXITY_BASE_URL = process.env.PERPLEXITY_BASE_URL || "https://api.perplexity.ai"; -const VERSION = "1.2.0"; +const VERSION = "1.2.1"; // Agent API presets backing each tool: https://docs.perplexity.ai/docs/agent-api/presets export const ASK_PRESET = "fast"; @@ -776,5 +776,45 @@ export function createPerplexityServer(serviceOrigin?: string, serverOptions?: P } ); + advertiseJsonSchema202012(server.server); + return server.server; } + +// The MCP TypeScript SDK stamps draft-07 on zod-derived schemas in tools/list +// (modelcontextprotocol/typescript-sdk#2084), and 2020-12-only clients reject +// every tool before invocation. Our schemas are valid under both dialects, so +// only the declared dialect needs rewriting; this mirrors what the upstream +// fix (typescript-sdk#2085) does for zod v3 schemas. Remove once that fix is +// released and the SDK dependency is bumped past it. +const JSON_SCHEMA_2020_12 = "https://json-schema.org/draft/2020-12/schema"; + +function advertiseJsonSchema202012(server: McpServer["server"]) { + type ListToolsHandler = (request: unknown, extra: unknown) => Promise<{ + tools: Array<{ + inputSchema?: { $schema?: string }; + outputSchema?: { $schema?: string }; + }>; + }>; + // _requestHandlers is private; acceptable here because this shim is + // temporary and pinned to the SDK versions we test against. + const handlers = (server as unknown as { + _requestHandlers: Map; + })._requestHandlers; + const listTools = handlers.get("tools/list"); + if (!listTools) { + return; + } + handlers.set("tools/list", async (request, extra) => { + const result = await listTools(request, extra); + for (const tool of result.tools ?? []) { + if (tool.inputSchema?.$schema) { + tool.inputSchema.$schema = JSON_SCHEMA_2020_12; + } + if (tool.outputSchema?.$schema) { + tool.outputSchema.$schema = JSON_SCHEMA_2020_12; + } + } + return result; + }); +} From 7253135957fb40fb5d0b4d0a884975dcf8ab525c Mon Sep 17 00:00:00 2001 From: Ryan Buchmayer Date: Wed, 26 Aug 2026 17:36:43 -0700 Subject: [PATCH 2/3] fix: sync plugin.json version to 1.2.1 --- plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.json b/plugin.json index 78e9234..30c96d7 100644 --- a/plugin.json +++ b/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "perplexity", - "version": "1.2.0", + "version": "1.2.1", "description": "Real-time web search, reasoning, and research through Perplexity's API", "author": { "name": "Perplexity AI", From 62607011e6e2e153f8b68d9534fc574c74dd0a14 Mon Sep 17 00:00:00 2001 From: Ryan Buchmayer Date: Wed, 26 Aug 2026 17:38:05 -0700 Subject: [PATCH 3/3] chore: trim shim comments --- src/server.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/server.ts b/src/server.ts index a07bd74..743c7d9 100644 --- a/src/server.ts +++ b/src/server.ts @@ -781,12 +781,10 @@ export function createPerplexityServer(serviceOrigin?: string, serverOptions?: P return server.server; } -// The MCP TypeScript SDK stamps draft-07 on zod-derived schemas in tools/list -// (modelcontextprotocol/typescript-sdk#2084), and 2020-12-only clients reject -// every tool before invocation. Our schemas are valid under both dialects, so -// only the declared dialect needs rewriting; this mirrors what the upstream -// fix (typescript-sdk#2085) does for zod v3 schemas. Remove once that fix is -// released and the SDK dependency is bumped past it. +// The MCP TypeScript SDK stamps draft-07 on tools/list schemas +// (modelcontextprotocol/typescript-sdk#2084); 2020-12-only clients reject +// them. The schemas are valid under both dialects, so only the declared +// dialect needs rewriting. Remove once typescript-sdk#2085 ships. const JSON_SCHEMA_2020_12 = "https://json-schema.org/draft/2020-12/schema"; function advertiseJsonSchema202012(server: McpServer["server"]) { @@ -796,8 +794,7 @@ function advertiseJsonSchema202012(server: McpServer["server"]) { outputSchema?: { $schema?: string }; }>; }>; - // _requestHandlers is private; acceptable here because this shim is - // temporary and pinned to the SDK versions we test against. + // _requestHandlers is private SDK state; goes away with this shim. const handlers = (server as unknown as { _requestHandlers: Map; })._requestHandlers;