From 8c04c8193277859b2d1e00eb693dc4319db5fc6b Mon Sep 17 00:00:00 2001 From: Ryan Buchmayer Date: Mon, 27 Jul 2026 10:58:45 -0700 Subject: [PATCH 1/3] feat: expose the server factory as a library entry point (v1.1.0) The package was bin-only: dist/index.js starts a stdio server at import time, so there was no way to embed the MCP server in another Node process. Add a proper exports map pointing at dist/server.js (side effect free) with TypeScript declarations, so hosts can import { createPerplexityServer } and mount their own transport. The perplexity-mcp bin and npx behavior are unchanged. --- .claude-plugin/marketplace.json | 4 ++-- package-lock.json | 4 ++-- package.json | 15 +++++++++++++-- perplexity-ai-mcp-server-1.0.0.tgz | Bin 0 -> 15860 bytes server.json | 4 ++-- tsconfig.json | 1 + 6 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 perplexity-ai-mcp-server-1.0.0.tgz diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index b6233aa..65b8970 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.0.0" + "version": "1.1.0" }, "plugins": [ { "name": "perplexity", "source": "./", "description": "Real-time web search, reasoning, and research through Perplexity's API", - "version": "1.0.0", + "version": "1.1.0", "author": { "name": "Perplexity AI", "email": "api@perplexity.ai" diff --git a/package-lock.json b/package-lock.json index fb03157..61dd964 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@perplexity-ai/mcp-server", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@perplexity-ai/mcp-server", - "version": "1.0.0", + "version": "1.1.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", diff --git a/package.json b/package.json index 3cb6761..6153285 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@perplexity-ai/mcp-server", - "version": "1.0.0", + "version": "1.1.0", "mcpName": "ai.perplexity/mcp-server", "description": "Real-time web search, reasoning, and research through Perplexity's API", "keywords": [ @@ -23,14 +23,25 @@ "access": "public" }, "type": "module", - "main": "dist/index.js", + "main": "dist/server.js", + "types": "dist/server.d.ts", + "exports": { + ".": { + "types": "./dist/server.d.ts", + "default": "./dist/server.js" + }, + "./package.json": "./package.json" + }, "bin": { "perplexity-mcp": "dist/index.js" }, "files": [ "dist/*.js", + "dist/*.d.ts", "!dist/*.test.js", + "!dist/*.test.d.ts", "!dist/vitest.config.js", + "!dist/vitest.config.d.ts", "README.md", ".claude-plugin" ], diff --git a/perplexity-ai-mcp-server-1.0.0.tgz b/perplexity-ai-mcp-server-1.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f97ee7605077e5119f769c577f9c96b6344e070d GIT binary patch literal 15860 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 KYt8xq>;M2%6!EG6 literal 0 HcmV?d00001 diff --git a/server.json b/server.json index 2f456ac..c904821 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.0.0", + "version": "1.1.0", "packages": [ { "registryType": "npm", "identifier": "@perplexity-ai/mcp-server", - "version": "1.0.0", + "version": "1.1.0", "transport": { "type": "stdio" } diff --git a/tsconfig.json b/tsconfig.json index 190e48e..c8c1125 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "module": "ESNext", "outDir": "./dist", "rootDir": "./src", + "declaration": true, "strict": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, From 452216f754f7f9f3d169a6a9241909e4327f886d Mon Sep 17 00:00:00 2001 From: Ryan Buchmayer Date: Mon, 27 Jul 2026 11:08:20 -0700 Subject: [PATCH 2/3] feat: add recency and domain filters to perplexity_search perplexity_ask and perplexity_reason already expose search_recency_filter and search_domain_filter; perplexity_search did not, even though the search endpoint supports both. Reuse the same shared schema fields and pass them through to the search request. --- README.md | 2 +- src/server.ts | 18 +++++++++++++++--- src/transport.test.ts | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3e9fd69..86f3773 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ The official MCP server implementation for the Perplexity API Platform, providin ## Available Tools ### **perplexity_search** -Direct web search using the Perplexity Search API. Returns ranked search results with metadata, perfect for finding current information. +Direct web search using the Perplexity Search API. Returns ranked search results with metadata, perfect for finding current information. Supports recency filters (`search_recency_filter`) and domain restrictions (`search_domain_filter`). ### **perplexity_ask** General-purpose conversational AI with real-time web search, backed by the Agent API `fast` preset. Great for quick questions and everyday searches. diff --git a/src/server.ts b/src/server.ts index a6f03cd..509bd19 100644 --- a/src/server.ts +++ b/src/server.ts @@ -462,6 +462,7 @@ export async function performSearch( maxResults: number = 10, maxTokensPerPage: number = 1024, country?: string, + filters?: Pick, serviceOrigin?: string ): Promise { const body: Record = { @@ -469,6 +470,8 @@ export async function performSearch( max_results: maxResults, max_tokens_per_page: maxTokensPerPage, ...(country && { country }), + ...(filters?.search_recency_filter && { search_recency_filter: filters.search_recency_filter }), + ...(filters?.search_domain_filter && { search_domain_filter: filters.search_domain_filter }), }; const response = await makeApiRequest("search", body, serviceOrigin); @@ -524,7 +527,7 @@ export function createPerplexityServer(serviceOrigin?: string) { { instructions: "Perplexity AI server for web-grounded search, research, and reasoning, backed by the Perplexity Agent API. " + - "Use perplexity_search for finding URLs, facts, and recent news. " + + "Use perplexity_search for finding URLs, facts, and recent news. Supports recency filters and domain restrictions. " + "Use perplexity_ask for quick AI-answered questions with citations. Supports recency filters, domain restrictions, and search context size control. " + "Use perplexity_research for in-depth multi-source investigation (slow, can take minutes). " + "Use perplexity_reason for complex analysis requiring step-by-step logic. Supports recency filters, domain restrictions, and search context size control. " + @@ -699,6 +702,8 @@ export function createPerplexityServer(serviceOrigin?: string) { .describe("Maximum tokens to extract per webpage (default: 1024)"), country: z.string().optional() .describe("ISO 3166-1 alpha-2 country code for regional results (e.g., 'US', 'GB')"), + search_recency_filter: searchRecencyFilterField, + search_domain_filter: searchDomainFilterField, }; const searchOutputSchema = { @@ -712,6 +717,7 @@ export function createPerplexityServer(serviceOrigin?: string) { description: "Search the web and return a ranked list of results with titles, URLs, snippets, and dates. " + "Best for: finding specific URLs, checking recent news, verifying facts, discovering sources. " + "Returns formatted results (title, URL, snippet, date) with no AI synthesis. " + + "Supports recency filters and domain restrictions. " + "For AI-generated answers with citations, use perplexity_ask instead.", inputSchema: searchInputSchema as any, outputSchema: searchOutputSchema as any, @@ -723,17 +729,23 @@ export function createPerplexityServer(serviceOrigin?: string) { }, }, async (args: any) => { - const { query, max_results, max_tokens_per_page, country } = args as { + const { query, max_results, max_tokens_per_page, country, search_recency_filter, search_domain_filter } = args as { query: string; max_results?: number; max_tokens_per_page?: number; country?: string; + search_recency_filter?: "hour" | "day" | "week" | "month" | "year"; + search_domain_filter?: string[]; }; const maxResults = typeof max_results === "number" ? max_results : 10; const maxTokensPerPage = typeof max_tokens_per_page === "number" ? max_tokens_per_page : 1024; const countryCode = typeof country === "string" ? country : undefined; + const filters = { + ...(search_recency_filter && { search_recency_filter }), + ...(search_domain_filter && { search_domain_filter }), + }; - const result = await performSearch(query, maxResults, maxTokensPerPage, countryCode, serviceOrigin); + const result = await performSearch(query, maxResults, maxTokensPerPage, countryCode, filters, serviceOrigin); return { content: [{ type: "text" as const, text: result }], structuredContent: { results: result }, diff --git a/src/transport.test.ts b/src/transport.test.ts index 5c3e962..dc8b429 100644 --- a/src/transport.test.ts +++ b/src/transport.test.ts @@ -348,6 +348,38 @@ describe("Transport Integration Tests", () => { } }); + it("should forward search filters to the search API request body", async () => { + global.fetch = vi.fn().mockResolvedValue({ + ok: true, + json: async () => ({ results: [] }), + } as Response); + + const { client, server } = await connectInMemoryClient(); + try { + const result: any = await client.callTool({ + name: "perplexity_search", + arguments: { + query: "test", + search_recency_filter: "week", + search_domain_filter: ["wikipedia.org", "-reddit.com"], + }, + }); + + expect(result.isError).toBeFalsy(); + const upstreamBody = JSON.parse( + (global.fetch as ReturnType).mock.calls[0][1].body as string + ); + expect(upstreamBody).toMatchObject({ + query: "test", + search_recency_filter: "week", + search_domain_filter: ["wikipedia.org", "-reddit.com"], + }); + } finally { + await client.close(); + await server.close(); + } + }); + it("should emit progress notifications when the client requests progress", async () => { const events = [ { type: "response.created", response: { id: "resp_progress" } }, From 31a3bee6b47be3a5d0f644ed0c978d720b026212 Mon Sep 17 00:00:00 2001 From: Ryan Buchmayer Date: Mon, 27 Jul 2026 11:20:11 -0700 Subject: [PATCH 3/3] fix: bump advertised server version to 1.1.0 and drop stray tarball The MCP initialize response and User-Agent come from a VERSION constant that was still 1.0.0. Bump it, add a test pinning the advertised version to package.json so they cannot drift again, remove an accidentally committed pack tarball, and gitignore *.tgz. --- .gitignore | 2 ++ perplexity-ai-mcp-server-1.0.0.tgz | Bin 15860 -> 0 bytes src/server.ts | 2 +- src/transport.test.ts | 14 ++++++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) delete mode 100644 perplexity-ai-mcp-server-1.0.0.tgz diff --git a/.gitignore b/.gitignore index 6101699..3fb67a6 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,5 @@ Desktop.ini *.pem mcp-publisher migrate-namespace.sh + +*.tgz diff --git a/perplexity-ai-mcp-server-1.0.0.tgz b/perplexity-ai-mcp-server-1.0.0.tgz deleted file mode 100644 index f97ee7605077e5119f769c577f9c96b6344e070d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15860 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 KYt8xq>;M2%6!EG6 diff --git a/src/server.ts b/src/server.ts index 509bd19..ccf82ce 100644 --- a/src/server.ts +++ b/src/server.ts @@ -14,7 +14,7 @@ import { AgentResponseSchema, SearchResponseSchema } from "./validation.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.0.0"; +const VERSION = "1.1.0"; // Agent API presets backing each tool: https://docs.perplexity.ai/docs/agent-api/presets export const ASK_PRESET = "fast"; diff --git a/src/transport.test.ts b/src/transport.test.ts index dc8b429..dacd104 100644 --- a/src/transport.test.ts +++ b/src/transport.test.ts @@ -6,6 +6,7 @@ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js"; import express from "express"; import cors from "cors"; import { Server } from "http"; +import { readFileSync } from "node:fs"; function agentSseResponse(text: string): Response { const completed = { @@ -267,6 +268,19 @@ describe("Transport Integration Tests", () => { }); describe("Backward Compatibility", () => { + it("should advertise the package.json version to clients", async () => { + const { client, server } = await connectInMemoryClient(); + try { + const pkg = JSON.parse( + readFileSync(new URL("../package.json", import.meta.url), "utf8") + ); + expect(client.getServerVersion()?.version).toBe(pkg.version); + } finally { + await client.close(); + await server.close(); + } + }); + it("should keep the historical response shape including the citations block", async () => { global.fetch = vi .fn()