xai-live-search-mcp
Version:
🔥 xAI Live Search integration for Claude Code via MCP - BEAST MODE!
85 lines • 3.63 kB
JavaScript
import { z } from 'zod';
// xAI Official Live Search API Types (based on official docs)
export const XAIMessageSchema = z.object({
role: z.enum(['user', 'assistant', 'system']),
content: z.string(),
});
// Search Parameters Schema (from official docs)
export const SearchSourceSchema = z.object({
type: z.enum(['web', 'x', 'news', 'rss']),
country: z.string().optional(), // ISO alpha-2 code for web/news
excluded_websites: z.array(z.string()).max(5).optional(), // max 5 websites for web/news
safe_search: z.boolean().optional(), // web/news safe search (default: true)
x_handles: z.array(z.string()).optional(), // X handles for X search
links: z.array(z.string()).optional(), // RSS feed URLs (max 1 currently)
});
export const SearchParametersSchema = z.object({
mode: z.enum(['auto', 'on', 'off']).default('auto'),
sources: z.array(SearchSourceSchema).optional(), // defaults to web + x
return_citations: z.boolean().optional(),
from_date: z.string().optional(), // ISO8601 format YYYY-MM-DD
to_date: z.string().optional(), // ISO8601 format YYYY-MM-DD
max_search_results: z.number().min(1).max(50).default(20),
});
export const XAIChatCompletionSchema = z.object({
id: z.string(),
object: z.literal('chat.completion'),
created: z.number(),
model: z.string(),
choices: z.array(z.object({
index: z.number(),
message: XAIMessageSchema,
finish_reason: z.string().optional(),
})),
usage: z.object({
prompt_tokens: z.number(),
completion_tokens: z.number(),
total_tokens: z.number(),
}),
citations: z.array(z.string()).optional(), // URLs from live search
});
export const XAIApiErrorSchema = z.object({
error: z.object({
message: z.string(),
type: z.string().optional(),
code: z.string().optional(),
}),
});
// Configuration Types
export const XAIConfigSchema = z.object({
apiKey: z.string(),
baseUrl: z.string().default('https://api.x.ai'),
model: z.string().default('grok-3-latest'), // Updated to official model name
maxTokens: z.number().default(4096),
temperature: z.number().min(0).max(2).default(0.7),
});
// MCP Tool Parameter Types
export const LiveSearchParamsSchema = z.object({
query: z.string().min(1, 'Query cannot be empty'),
mode: z.enum(['auto', 'on', 'off']).default('auto'),
sources: z.array(z.enum(['web', 'x', 'news', 'rss'])).optional(),
maxResults: z.number().min(1).max(50).default(20),
returnCitations: z.boolean().default(true),
fromDate: z.string().optional(), // YYYY-MM-DD format
toDate: z.string().optional(), // YYYY-MM-DD format
country: z.string().optional(), // ISO alpha-2 code
excludedWebsites: z.array(z.string()).max(5).optional(),
safeSearch: z.boolean().default(true),
xHandles: z.array(z.string()).optional(),
rssLinks: z.array(z.string()).optional(),
});
export const ChatWithSearchParamsSchema = z.object({
message: z.string().min(1, 'Message cannot be empty'),
searchMode: z.enum(['auto', 'on', 'off']).default('auto'),
sources: z.array(z.enum(['web', 'x', 'news', 'rss'])).optional(),
returnCitations: z.boolean().default(true),
maxSearchResults: z.number().min(1).max(50).default(10),
fromDate: z.string().optional(),
toDate: z.string().optional(),
country: z.string().optional(),
excludedWebsites: z.array(z.string()).max(5).optional(),
safeSearch: z.boolean().default(true),
xHandles: z.array(z.string()).optional(),
rssLinks: z.array(z.string()).optional(),
});
//# sourceMappingURL=types.js.map