noodle-perplexity-mcp
Version:
A Perplexity API Model Context Protocol (MCP) server that unlocks Perplexity's search-augmented AI capabilities for LLM agents. Features robust error handling, secure input validation, and transparent reasoning with the showThinking parameter. Built with
219 lines (218 loc) • 8.16 kB
TypeScript
/**
* @fileoverview Defines the core logic, schemas, and types for the `perplexity_deep_research` tool.
* This tool interfaces with the Perplexity API to perform exhaustive multi-source research using the sonar-deep-research model.
* @module src/mcp-server/tools/perplexityDeepResearch/logic
*/
import { z } from 'zod';
import { RequestContext } from '../../../utils/index.js';
export declare const PerplexityDeepResearchInputSchema: z.ZodObject<{
query: z.ZodString;
reasoning_effort: z.ZodDefault<z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>>;
return_related_questions: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
search_recency_filter: z.ZodOptional<z.ZodString>;
search_domain_filter: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
search_after_date_filter: z.ZodOptional<z.ZodString>;
search_before_date_filter: z.ZodOptional<z.ZodString>;
search_mode: z.ZodOptional<z.ZodEnum<["web", "academic"]>>;
}, "strip", z.ZodTypeAny, {
return_related_questions: boolean;
reasoning_effort: "low" | "medium" | "high";
query: string;
search_domain_filter?: string[] | undefined;
search_recency_filter?: string | undefined;
search_after_date_filter?: string | undefined;
search_before_date_filter?: string | undefined;
search_mode?: "web" | "academic" | undefined;
}, {
query: string;
search_domain_filter?: string[] | undefined;
search_recency_filter?: string | undefined;
search_after_date_filter?: string | undefined;
search_before_date_filter?: string | undefined;
return_related_questions?: boolean | undefined;
search_mode?: "web" | "academic" | undefined;
reasoning_effort?: "low" | "medium" | "high" | undefined;
}>;
declare const SearchResultSchema: z.ZodObject<{
title: z.ZodString;
url: z.ZodString;
date: z.ZodOptional<z.ZodNullable<z.ZodString>>;
last_updated: z.ZodOptional<z.ZodNullable<z.ZodString>>;
snippet: z.ZodOptional<z.ZodString>;
}, "strip", z.ZodTypeAny, {
url: string;
title: string;
date?: string | null | undefined;
last_updated?: string | null | undefined;
snippet?: string | undefined;
}, {
url: string;
title: string;
date?: string | null | undefined;
last_updated?: string | null | undefined;
snippet?: string | undefined;
}>;
declare const CostBreakdownSchema: z.ZodObject<{
input_tokens_cost: z.ZodNumber;
output_tokens_cost: z.ZodNumber;
citation_tokens_cost: z.ZodNumber;
reasoning_tokens_cost: z.ZodNumber;
search_queries_cost: z.ZodNumber;
total_cost: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
input_tokens_cost: number;
output_tokens_cost: number;
citation_tokens_cost: number;
reasoning_tokens_cost: number;
search_queries_cost: number;
total_cost: number;
}, {
input_tokens_cost: number;
output_tokens_cost: number;
citation_tokens_cost: number;
reasoning_tokens_cost: number;
search_queries_cost: number;
total_cost: number;
}>;
export declare const PerplexityDeepResearchResponseSchema: z.ZodObject<{
rawResultText: z.ZodString;
responseId: z.ZodString;
modelUsed: z.ZodString;
createdTimestamp: z.ZodNumber;
usage: z.ZodObject<{
prompt_tokens: z.ZodNumber;
completion_tokens: z.ZodNumber;
total_tokens: z.ZodNumber;
citation_tokens: z.ZodOptional<z.ZodNumber>;
reasoning_tokens: z.ZodOptional<z.ZodNumber>;
num_search_queries: z.ZodOptional<z.ZodNumber>;
}, "strip", z.ZodTypeAny, {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
citation_tokens?: number | undefined;
num_search_queries?: number | undefined;
reasoning_tokens?: number | undefined;
}, {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
citation_tokens?: number | undefined;
num_search_queries?: number | undefined;
reasoning_tokens?: number | undefined;
}>;
costBreakdown: z.ZodOptional<z.ZodObject<{
input_tokens_cost: z.ZodNumber;
output_tokens_cost: z.ZodNumber;
citation_tokens_cost: z.ZodNumber;
reasoning_tokens_cost: z.ZodNumber;
search_queries_cost: z.ZodNumber;
total_cost: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
input_tokens_cost: number;
output_tokens_cost: number;
citation_tokens_cost: number;
reasoning_tokens_cost: number;
search_queries_cost: number;
total_cost: number;
}, {
input_tokens_cost: number;
output_tokens_cost: number;
citation_tokens_cost: number;
reasoning_tokens_cost: number;
search_queries_cost: number;
total_cost: number;
}>>;
searchResults: z.ZodOptional<z.ZodArray<z.ZodObject<{
title: z.ZodString;
url: z.ZodString;
date: z.ZodOptional<z.ZodNullable<z.ZodString>>;
last_updated: z.ZodOptional<z.ZodNullable<z.ZodString>>;
snippet: z.ZodOptional<z.ZodString>;
}, "strip", z.ZodTypeAny, {
url: string;
title: string;
date?: string | null | undefined;
last_updated?: string | null | undefined;
snippet?: string | undefined;
}, {
url: string;
title: string;
date?: string | null | undefined;
last_updated?: string | null | undefined;
snippet?: string | undefined;
}>, "many">>;
citations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
estimatedCost: z.ZodOptional<z.ZodNumber>;
}, "strip", z.ZodTypeAny, {
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
citation_tokens?: number | undefined;
num_search_queries?: number | undefined;
reasoning_tokens?: number | undefined;
};
responseId: string;
rawResultText: string;
modelUsed: string;
createdTimestamp: number;
estimatedCost?: number | undefined;
citations?: string[] | undefined;
searchResults?: {
url: string;
title: string;
date?: string | null | undefined;
last_updated?: string | null | undefined;
snippet?: string | undefined;
}[] | undefined;
costBreakdown?: {
input_tokens_cost: number;
output_tokens_cost: number;
citation_tokens_cost: number;
reasoning_tokens_cost: number;
search_queries_cost: number;
total_cost: number;
} | undefined;
}, {
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
citation_tokens?: number | undefined;
num_search_queries?: number | undefined;
reasoning_tokens?: number | undefined;
};
responseId: string;
rawResultText: string;
modelUsed: string;
createdTimestamp: number;
estimatedCost?: number | undefined;
citations?: string[] | undefined;
searchResults?: {
url: string;
title: string;
date?: string | null | undefined;
last_updated?: string | null | undefined;
snippet?: string | undefined;
}[] | undefined;
costBreakdown?: {
input_tokens_cost: number;
output_tokens_cost: number;
citation_tokens_cost: number;
reasoning_tokens_cost: number;
search_queries_cost: number;
total_cost: number;
} | undefined;
}>;
export type PerplexityDeepResearchInput = z.infer<typeof PerplexityDeepResearchInputSchema>;
export type PerplexityDeepResearchResponse = z.infer<typeof PerplexityDeepResearchResponseSchema>;
export type SearchResult = z.infer<typeof SearchResultSchema>;
export type CostBreakdown = z.infer<typeof CostBreakdownSchema>;
/**
* 3. IMPLEMENT and export the core logic function.
* It must remain pure: its only concerns are its inputs and its return value or thrown error.
* @throws {McpError} If the logic encounters an unrecoverable issue.
*/
export declare function perplexityDeepResearchLogic(params: PerplexityDeepResearchInput, context: RequestContext): Promise<PerplexityDeepResearchResponse>;
export {};