import { z } from 'zod';
import { LimitlessClient } from '../../lib/limitless-client.js';
import { Tool } from '@modelcontextprotocol/sdk/types.js';
export const askAISchema = z.object({
query: z.string().describe('Natural language question about your memories'),
dateFrom: z.string().optional().describe('Start date for context (YYYY-MM-DD)'),
dateTo: z.string().optional().describe('End date for context (YYYY-MM-DD)'),
lifelogIds: z.array(z.string()).optional().describe('Specific lifelog IDs to search within'),
includeContext: z.boolean().optional().describe('Include source context in response'),
});
export type AskAIParams = z.infer<typeof askAISchema>;
export interface AskAIResponse {
answer: string;
sources?: Array<{
lifelogId: string;
title: string;
date: string;
relevantContent: string;
}>;
confidence?: number;
}
export const askAITool: Tool = {
name: 'limitless_ask_ai',
description: 'Ask AI questions about your memories and get intelligent answers based on your lifelogs',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Natural language question about your memories' },
dateFrom: { type: 'string', description: 'Start date for context (YYYY-MM-DD)' },
dateTo: { type: 'string', description: 'End date for context (YYYY-MM-DD)' },
lifelogIds: {
type: 'array',
items: { type: 'string' },
description: 'Specific lifelog IDs to search within'
},
includeContext: { type: 'boolean', description: 'Include source context in response' },
},
required: ['query'],
},
};
export async function askAI(params: AskAIParams, client: LimitlessClient): Promise<AskAIResponse> {
const requestBody: any = {
query: params.query,
};
if (params.dateFrom) requestBody.dateFrom = params.dateFrom;
if (params.dateTo) requestBody.dateTo = params.dateTo;
if (params.lifelogIds && params.lifelogIds.length > 0) requestBody.lifelogIds = params.lifelogIds;
if (params.includeContext !== undefined) requestBody.includeContext = params.includeContext;
return await client.post<AskAIResponse>('/ai/ask', requestBody);
}