perplexity-mcp-server
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
284 lines (283 loc) • 10.7 kB
TypeScript
import { z } from 'zod';
import { RequestContext } from '../utils/index.js';
export declare const PerplexityChatCompletionRequestSchema: z.ZodObject<{
model: z.ZodEnum<["sonar", "sonar-pro", "sonar-reasoning", "sonar-reasoning-pro", "sonar-deep-research"]>;
messages: z.ZodArray<z.ZodObject<{
role: z.ZodEnum<["system", "user", "assistant"]>;
content: z.ZodString;
}, "strip", z.ZodTypeAny, {
role: "system" | "user" | "assistant";
content: string;
}, {
role: "system" | "user" | "assistant";
content: string;
}>, "many">;
max_tokens: z.ZodOptional<z.ZodNumber>;
temperature: z.ZodOptional<z.ZodNumber>;
top_p: z.ZodOptional<z.ZodNumber>;
top_k: z.ZodOptional<z.ZodNumber>;
stream: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
presence_penalty: z.ZodOptional<z.ZodNumber>;
frequency_penalty: z.ZodOptional<z.ZodNumber>;
return_images: z.ZodOptional<z.ZodBoolean>;
return_related_questions: z.ZodOptional<z.ZodBoolean>;
response_format: z.ZodOptional<z.ZodObject<{
type: z.ZodEnum<["json_object"]>;
}, "strip", z.ZodTypeAny, {
type: "json_object";
}, {
type: "json_object";
}>>;
web_search_options: z.ZodOptional<z.ZodObject<{
search_context_size: z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>;
search_domain_filter: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
search_recency_filter: z.ZodOptional<z.ZodEnum<["last_day", "last_week", "last_month", "last_year"]>>;
search_after_date_filter: z.ZodOptional<z.ZodString>;
search_before_date_filter: z.ZodOptional<z.ZodString>;
}, "strip", z.ZodTypeAny, {
search_context_size?: "low" | "medium" | "high" | undefined;
search_domain_filter?: string[] | undefined;
search_recency_filter?: "last_day" | "last_week" | "last_month" | "last_year" | undefined;
search_after_date_filter?: string | undefined;
search_before_date_filter?: string | undefined;
}, {
search_context_size?: "low" | "medium" | "high" | undefined;
search_domain_filter?: string[] | undefined;
search_recency_filter?: "last_day" | "last_week" | "last_month" | "last_year" | undefined;
search_after_date_filter?: string | undefined;
search_before_date_filter?: string | undefined;
}>>;
search_domain_filter: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
search_recency_filter: z.ZodOptional<z.ZodString>;
search_after_date_filter: z.ZodOptional<z.ZodString>;
search_before_date_filter: z.ZodOptional<z.ZodString>;
search_mode: z.ZodOptional<z.ZodEnum<["web", "academic"]>>;
reasoning_effort: z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>;
}, "strip", z.ZodTypeAny, {
model: "sonar-reasoning-pro" | "sonar" | "sonar-pro" | "sonar-reasoning" | "sonar-deep-research";
messages: {
role: "system" | "user" | "assistant";
content: string;
}[];
stream: boolean;
search_domain_filter?: string[] | undefined;
search_recency_filter?: string | undefined;
search_after_date_filter?: string | undefined;
search_before_date_filter?: string | undefined;
max_tokens?: number | undefined;
temperature?: number | undefined;
top_p?: number | undefined;
top_k?: number | undefined;
presence_penalty?: number | undefined;
frequency_penalty?: number | undefined;
return_images?: boolean | undefined;
return_related_questions?: boolean | undefined;
response_format?: {
type: "json_object";
} | undefined;
web_search_options?: {
search_context_size?: "low" | "medium" | "high" | undefined;
search_domain_filter?: string[] | undefined;
search_recency_filter?: "last_day" | "last_week" | "last_month" | "last_year" | undefined;
search_after_date_filter?: string | undefined;
search_before_date_filter?: string | undefined;
} | undefined;
search_mode?: "web" | "academic" | undefined;
reasoning_effort?: "low" | "medium" | "high" | undefined;
}, {
model: "sonar-reasoning-pro" | "sonar" | "sonar-pro" | "sonar-reasoning" | "sonar-deep-research";
messages: {
role: "system" | "user" | "assistant";
content: string;
}[];
search_domain_filter?: string[] | undefined;
search_recency_filter?: string | undefined;
search_after_date_filter?: string | undefined;
search_before_date_filter?: string | undefined;
max_tokens?: number | undefined;
temperature?: number | undefined;
top_p?: number | undefined;
top_k?: number | undefined;
stream?: boolean | undefined;
presence_penalty?: number | undefined;
frequency_penalty?: number | undefined;
return_images?: boolean | undefined;
return_related_questions?: boolean | undefined;
response_format?: {
type: "json_object";
} | undefined;
web_search_options?: {
search_context_size?: "low" | "medium" | "high" | undefined;
search_domain_filter?: string[] | undefined;
search_recency_filter?: "last_day" | "last_week" | "last_month" | "last_year" | undefined;
search_after_date_filter?: string | undefined;
search_before_date_filter?: string | undefined;
} | undefined;
search_mode?: "web" | "academic" | undefined;
reasoning_effort?: "low" | "medium" | "high" | undefined;
}>;
export type PerplexityChatCompletionRequest = z.infer<typeof PerplexityChatCompletionRequestSchema>;
declare const FinalResponsePayloadSchema: z.ZodObject<{
id: z.ZodString;
model: z.ZodString;
created: z.ZodNumber;
usage: z.ZodObject<{
prompt_tokens: z.ZodNumber;
completion_tokens: z.ZodNumber;
total_tokens: z.ZodNumber;
search_context_size: z.ZodOptional<z.ZodString>;
citation_tokens: z.ZodOptional<z.ZodNumber>;
num_search_queries: z.ZodOptional<z.ZodNumber>;
reasoning_tokens: z.ZodOptional<z.ZodNumber>;
}, "strip", z.ZodTypeAny, {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
search_context_size?: string | undefined;
citation_tokens?: number | undefined;
num_search_queries?: number | undefined;
reasoning_tokens?: number | undefined;
}, {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
search_context_size?: string | undefined;
citation_tokens?: number | undefined;
num_search_queries?: number | undefined;
reasoning_tokens?: number | undefined;
}>;
object: z.ZodLiteral<"chat.completion">;
choices: z.ZodArray<z.ZodObject<{
index: z.ZodNumber;
finish_reason: z.ZodString;
message: z.ZodObject<{
role: z.ZodEnum<["system", "user", "assistant"]>;
content: z.ZodString;
}, "strip", z.ZodTypeAny, {
role: "system" | "user" | "assistant";
content: string;
}, {
role: "system" | "user" | "assistant";
content: string;
}>;
delta: z.ZodOptional<z.ZodObject<{
role: z.ZodOptional<z.ZodString>;
content: z.ZodOptional<z.ZodString>;
}, "strip", z.ZodTypeAny, {
role?: string | undefined;
content?: string | undefined;
}, {
role?: string | undefined;
content?: string | undefined;
}>>;
}, "strip", z.ZodTypeAny, {
message: {
role: "system" | "user" | "assistant";
content: string;
};
index: number;
finish_reason: string;
delta?: {
role?: string | undefined;
content?: string | undefined;
} | undefined;
}, {
message: {
role: "system" | "user" | "assistant";
content: string;
};
index: number;
finish_reason: string;
delta?: {
role?: string | undefined;
content?: string | undefined;
} | undefined;
}>, "many">;
citations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
search_results: z.ZodOptional<z.ZodArray<z.ZodObject<{
title: z.ZodString;
url: z.ZodString;
date: z.ZodOptional<z.ZodString>;
}, "strip", z.ZodTypeAny, {
url: string;
title: string;
date?: string | undefined;
}, {
url: string;
title: string;
date?: string | undefined;
}>, "many">>;
}, "strip", z.ZodTypeAny, {
object: "chat.completion";
model: string;
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
search_context_size?: string | undefined;
citation_tokens?: number | undefined;
num_search_queries?: number | undefined;
reasoning_tokens?: number | undefined;
};
id: string;
created: number;
choices: {
message: {
role: "system" | "user" | "assistant";
content: string;
};
index: number;
finish_reason: string;
delta?: {
role?: string | undefined;
content?: string | undefined;
} | undefined;
}[];
citations?: string[] | undefined;
search_results?: {
url: string;
title: string;
date?: string | undefined;
}[] | undefined;
}, {
object: "chat.completion";
model: string;
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
search_context_size?: string | undefined;
citation_tokens?: number | undefined;
num_search_queries?: number | undefined;
reasoning_tokens?: number | undefined;
};
id: string;
created: number;
choices: {
message: {
role: "system" | "user" | "assistant";
content: string;
};
index: number;
finish_reason: string;
delta?: {
role?: string | undefined;
content?: string | undefined;
} | undefined;
}[];
citations?: string[] | undefined;
search_results?: {
url: string;
title: string;
date?: string | undefined;
}[] | undefined;
}>;
export type PerplexityChatCompletionResponse = z.infer<typeof FinalResponsePayloadSchema>;
declare class PerplexityApiService {
private axiosInstance;
private apiKey;
constructor();
chatCompletion(requestData: PerplexityChatCompletionRequest, context: RequestContext): Promise<PerplexityChatCompletionResponse>;
}
export declare const perplexityApiService: PerplexityApiService;
export {};