perplexity-deep-mcp
Provides tools to start, check, and list deep research jobs via Perplexity's async API, enabling long-running research tasks that would otherwise time out in MCP clients.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@perplexity-deep-mcpstart deep research on neural networks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
perplexity-deep-mcp
An MCP server that makes Perplexity's Sonar Deep Research usable from MCP clients that enforce a request timeout.
No dependencies. One file. Runs on node server.js.
The problem
Perplexity's sonar-deep-research model runs for two to twenty minutes depending on reasoning effort. MCP clients don't wait that long. Claude Desktop cancels the tool call and returns:
MCP error -32001: Request timed outThe official Perplexity MCP server calls the synchronous /chat/completions endpoint, so deep research is effectively unavailable from inside the client. Raising the timeout doesn't help. The limit lives in the client's bundled MCP SDK, which on a packaged install sits inside a signed application bundle you can't edit. Config keys like timeout and MCP_SERVER_REQUEST_TIMEOUT are ignored.
Perplexity solved this on their side with an async API. This server exposes it.
Related MCP server: MCP Perplexity Pro
How it works
The job is split across three requests that each return in under a second:
pplx_deep_research_start POST /v1/async/sonar submit, get a job id back
pplx_deep_research_check GET /v1/async/sonar/{id} poll status, fetch result
pplx_deep_research_list GET /v1/async/sonar recover ids, see what's runningNothing blocks. Research length stops being a constraint. Results stay retrievable for seven days, so a job started in one conversation can be collected in another.
check takes an optional wait_seconds (max 40). The server holds and polls internally, which cuts the number of round trips without going near the client's limit.
Install
Node 18 or later. Nothing else.
git clone https://github.com/Aakashanil67/perplexity-deep-mcp.gitGet an API key from the Perplexity API portal.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"perplexity-deep": {
"command": "node",
"args": ["/absolute/path/to/perplexity-deep-mcp/server.js"],
"env": {
"PERPLEXITY_API_KEY": "pplx-your-key-here"
}
}
}
}On Windows, use "C:\\Program Files\\nodejs\\node.exe" as the command if bare node doesn't resolve. Quit the app fully — from the system tray, not just the window — and reopen.
Claude Code
claude mcp add perplexity-deep --env PERPLEXITY_API_KEY="pplx-your-key-here" -- node /absolute/path/to/server.jsEnvironment
Variable | Required | Default |
| yes | — |
| no |
|
Tools
pplx_deep_research_start
Submits a job and returns immediately.
Parameter | Type | Notes |
| string, required | Longer and more structured prompts produce noticeably better reports here |
|
| Default |
|
|
|
|
| |
| string[] | Max 10. Prefix with |
| string |
|
| string | Shapes tone and structure of the report |
pplx_deep_research_check
Parameter | Type | Notes |
| string, required | From |
| number, 0–40 | Hold and poll internally before reporting back |
| boolean | Strips |
Returns the full report with sources and cost once the job reaches COMPLETED. While it's running you get the status and elapsed time. A FAILED job surfaces Perplexity's error message.
pplx_deep_research_list
Optional status and limit. Returns a table of recent jobs.
Known limitation
The async endpoint returns citations: [] and search_results: [] even on jobs that ran many searches, and the model omits inline [n] markers. The synchronous endpoint doesn't have this problem. Verified 25 July 2026 against two jobs that ran eight and four search queries respectively; both came back with empty source arrays. Injecting a system prompt instructing the model to write full URLs into the prose was tried and did not work.
The practical effect is that you get a long, well-organised, unattributed report. That is fine for scoping an unfamiliar topic and not fine for anything you intend to cite.
The server handles this rather than hiding it. If the citation arrays are empty it scans the report body for URLs and lists whatever it finds, labelled as recovered rather than cited. If nothing turns up it says so in plain language at the end of the report. formatCompleted() reads the proper fields first, so if Perplexity ships a fix the correct sources appear with no code change.
This is upstream. There are open reports on the Perplexity community forum describing the same behaviour.
Why there are no dependencies
The MCP TypeScript SDK is the normal way to build one of these. It's a good SDK. It also means a build step, a node_modules tree, and a lockfile to keep current, all to wrap a protocol that is JSON-RPC 2.0 over newline-delimited stdio.
For a server with three tools and two endpoints that trade wasn't worth making. server.js implements the protocol directly: initialize echoes the client's requested version, tools/list returns the schemas, tools/call dispatches, and resources/list and prompts/list return empty rather than erroring, which keeps stricter clients happy. Notifications get no reply. Unknown methods return -32601.
Two details worth knowing if you adapt this:
Everything written to stdout has to be a JSON-RPC frame. A stray console.log corrupts the stream and the client drops the connection with no useful error. All logging here goes to stderr.
The process tracks in flight requests and won't exit on stdin close while a call is still awaiting the API. Without that guard a closing client can drop a reply that was about to be written.
Errors
Failures return isError: true with a message aimed at whoever has to fix it, not a stack trace. A 401 says the key was rejected. A 404 on a job lookup mentions the seven-day expiry. A 429 says to wait. Network timeouts distinguish themselves from research timeouts, because the two look identical from the client side and the fix is different.
Development
node --check server.jsDrive it by hand over stdio:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| PERPLEXITY_API_KEY=your-key node server.jsOr use the official inspector:
npx @modelcontextprotocol/inspector node server.jsCost
Billed by Perplexity per request. Observed on short test jobs: $0.08 for four search queries, $0.13 for eight. Real research runs at high effort cost substantially more. Each result reports its own cost.
License
MIT. See LICENSE.
Available Tools
3 toolspplx_deep_research_checkARead-onlyIdempotent
Check a deep research job and retrieve the full report once it is finished. Returns immediately with the current status. If the job is still running, call again. Results stay retrievable for 7 days.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The id returned by pplx_deep_research_start. | |
| wait_seconds | No | Optionally hold for up to 40 seconds before reporting, polling internally. Reduces the number of tool calls needed. Default 0. | |
| strip_thinking | No | Remove <think> reasoning blocks from the report. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description adds valuable context beyond annotations: it returns immediately with current status, supports polling, and results remain retrievable for 7 days. This enriches understanding without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four short sentences, each carrying distinct information: purpose, immediate return, polling behavior, and 7-day retention. It is front-loaded with the primary action and contains no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters and no output schema, the description covers the main behavioral aspects: what it does, when to call, and how long results persist. It does not detail the exact return format, but 'full report' and 'current status' give reasonable guidance. With sibling context, this is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with descriptions for all three parameters (job_id, wait_seconds, strip_thinking). The tool description itself adds no additional parameter-specific meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: checking a deep research job and retrieving the full report once finished. It uses specific verbs ('check', 'retrieve') and identifies the resource ('deep research job'), distinguishing it from siblings like pplx_deep_research_start (starts jobs) and pplx_deep_research_list (lists jobs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it is for checking a job started via pplx_deep_research_start, and explicitly advises 'If the job is still running, call again.' It also mentions the 7-day retention period. However, it does not explicitly state when not to use it or compare it to list alternatives, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pplx_deep_research_listARead-onlyIdempotent
List recent deep research jobs with their ids, models and statuses. Use this to recover a job_id you lost, or to see what is still running.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max jobs to show, newest first. Default 20. | |
| status | No | Optionally show only jobs with this status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds that it lists 'recent' jobs, implying a temporal ordering, and that it returns ids, models, and statuses, but it does not disclose additional behavioral traits such as pagination or error conditions. This is consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first defines the action and output, the second gives practical use cases. It is front-loaded with the verb and resource, with zero filler words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two optional parameters, and the schema plus annotations already provide the necessary context. The description explicitly lists the returned fields (ids, models, statuses), which compensates for the lack of an output schema, and the use cases make the tool's purpose clear. This is complete for a list-style tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, with descriptions for both 'limit' and 'status', so the baseline is 3. The description does not add any extra explanation of the parameters beyond the schema; it only references the returned 'ids' which are not a parameter. Therefore no additional credit is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and identifies the resource ('deep research jobs') plus the returned attributes ('ids, models and statuses'). It also distinguishes itself from siblings by explaining the use case of recovering a lost job_id, which differs from starting or checking specific jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this to recover a job_id you lost, or to see what is still running,' providing clear scenarios for when to invoke this tool. It does not name the sibling alternatives or state when not to use it, so it falls short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pplx_deep_research_startARead-only
Start a Perplexity Sonar Deep Research job. Returns a job_id immediately (does not wait for the research to finish). Use this for exhaustive multi-source investigation: literature reviews, market and competitor analysis, regulatory landscapes. After calling this, poll pplx_deep_research_check with the returned job_id. Jobs typically take 2-20 minutes. For quick factual lookups this is overkill and expensive - use a normal web search instead.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The research question. Be specific and state exactly what you want covered, including any sub-questions, sectors, date ranges, or types of evidence required. Longer, more structured prompts produce far better results here. | |
| search_mode | No | Corpus to search. Use "academic" for peer-reviewed literature (best for thesis work), "sec" for US company filings, "web" for everything else. Default web. | |
| system_prompt | No | Optional system instruction shaping tone, structure, or output format of the final report. | |
| reasoning_effort | No | How much effort the model spends. minimal/low finish faster and cost less; high runs many more searches and takes much longer. Default medium. | |
| search_domain_filter | No | Restrict or exclude domains, max 10. Plain domain to allow (e.g. "sars.gov.za"); prefix with "-" to exclude (e.g. "-pinterest.com"). Use this to force high-quality sources and shut out content farms. | |
| search_recency_filter | No | Only use sources published within this window. Omit for no recency limit. | |
| search_after_date_filter | No | Only sources published after this date, format MM/DD/YYYY. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotation contradiction: The annotations declare readOnlyHint=true, but the description says 'Start a ... job' and 'Returns a job_id', implying a state-changing operation (creating an async job). This directly contradicts the readOnlyHint. The description does add useful timing info (2-20 minutes) and polling instruction, but the contradiction forces a score of 1 per rules.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core action, then usage context, then follow-up and caveats. Every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (async job, polling, duration, cost), the description covers all essential operational context: immediate return, polling with job_id, typical duration, and cost/overkill warning. It also distinguishes from normal web search. The contradictory annotation is a separate issue, but the description itself is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters. The tool description adds no parameter-level guidance beyond the schema. Per the baseline rule, score is 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Start a Perplexity Sonar Deep Research job' with the specific verb 'start' and resource. It distinguishes from sibling tools by noting 'After calling this, poll pplx_deep_research_check with the returned job_id' and implies listing via 'start' vs 'list'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use cases: 'exhaustive multi-source investigation: literature reviews, market and competitor analysis, regulatory landscapes.' It also tells when NOT to use it: 'For quick factual lookups this is overkill and expensive - use a normal web search instead.' This is clear guidance with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v1.0.0- First observed
pplx_deep_research_check - First observed
pplx_deep_research_list - First observed
pplx_deep_research_start
TDQS
Each tool has a clearly distinct role: start initiates a job, check polls/retrieves results, and list enumerates existing jobs. There is no overlap or ambiguity between them.
All tools follow a consistent verb_noun pattern with the pplx_deep_research_ prefix (start, check, list). The naming is uniform and predictable.
Three tools are perfectly scoped for the deep research job lifecycle: initiate, monitor, and list. Each tool serves a necessary function with no redundancy.
The core workflow (start, check, list) is fully covered. A minor gap is the lack of a cancel/delete operation for long-running jobs, but this is not essential for the primary use case.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
MCP server for Google search results via SERP API
Related MCP Servers
- MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server that provides intelligent access to Perplexity AI's search and reasoning models with automatic model selection, conversation management, and project-aware storage. Supports real-time search, deep research, chat sessions, and async operations for complex queries.293MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that connects to OpenRouter's API to provide Perplexity's models (Sonar, Sonar Deep Research, Sonar Reasoning) for use with any MCP-compatible client.8MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI agents to perform search-augmented queries and deep multi-source research using the Perplexity API.7525Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Aakashanil67/perplexity-deep-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server