UNPKG

mcp-gdrive-enhanced-markov

Version:

MCP server for Google Drive and Sheets with write capabilities, AI-powered PDF analysis, SQLite document indexing, and advanced directory exploration tools

142 lines (141 loc) 6.61 kB
import { z } from 'zod'; import { dbV2 } from './database_v2.js'; export const name = 'gdrive_search_advanced'; export const description = 'Advanced search in the indexed Google Drive documents with filters and smart queries'; export const inputSchema = z.object({ query: z.string().optional().describe('Search query for names and content'), docType: z.enum(['contract', 'invoice', 'proposal', 'project_plan', 'report']).optional() .describe('Filter by document type'), dateFrom: z.string().optional().describe('Filter by date from (ISO format YYYY-MM-DD)'), dateTo: z.string().optional().describe('Filter by date to (ISO format YYYY-MM-DD)'), minValue: z.number().optional().describe('Minimum value/amount'), maxValue: z.number().optional().describe('Maximum value/amount'), contractsExpiring: z.number().optional().describe('Find contracts expiring in N days'), overdueInvoices: z.boolean().optional().describe('Find overdue unpaid invoices'), limit: z.number().optional().default(25).describe('Maximum results to return') }); export const schema = { name, description, inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Search query for names and content' }, docType: { type: 'string', enum: ['contract', 'invoice', 'proposal', 'project_plan', 'report'], description: 'Filter by document type' }, dateFrom: { type: 'string', description: 'Filter by date from (ISO format)' }, dateTo: { type: 'string', description: 'Filter by date to (ISO format)' }, minValue: { type: 'number', description: 'Minimum value/amount' }, maxValue: { type: 'number', description: 'Maximum value/amount' }, contractsExpiring: { type: 'number', description: 'Find contracts expiring in N days' }, overdueInvoices: { type: 'boolean', description: 'Find overdue unpaid invoices' }, limit: { type: 'number', description: 'Maximum results to return', default: 25 } }, required: [] } }; export async function gdrive_search_advanced(args) { try { let results = []; let searchType = 'General search'; // Special searches if (args.contractsExpiring) { searchType = `Contracts expiring in ${args.contractsExpiring} days`; const contracts = await dbV2.getExpiringContracts(args.contractsExpiring); results = contracts.slice(0, args.limit); } else if (args.overdueInvoices) { searchType = 'Overdue invoices'; const invoices = await dbV2.getOverdueInvoices(); results = invoices.slice(0, args.limit); } else { // Regular search with filters const filters = {}; if (args.docType) filters.doc_type = args.docType; if (args.dateFrom) filters.date_from = args.dateFrom; if (args.dateTo) filters.date_to = args.dateTo; if (args.minValue) filters.min_value = args.minValue; if (args.maxValue) filters.max_value = args.maxValue; results = await dbV2.searchDocuments(args.query || '', filters); results = results.slice(0, args.limit); } if (results.length === 0) { return { content: [{ type: 'text', text: `No documents found matching your criteria.` }], isError: false }; } const output = [`${searchType} - Found ${results.length} document(s):\n`]; results.forEach((doc, index) => { output.push(`${index + 1}. ${doc.name}`); output.push(` ID: ${doc.id} | Drive ID: ${doc.drive_id}`); output.push(` Type: ${doc.doc_type || 'unknown'}`); output.push(` Path: ${doc.drive_path || 'Unknown path'}`); if (doc.synopsis) { output.push(` Synopsis: ${doc.synopsis}`); } // Add type-specific information if (args.contractsExpiring && doc.expiration_date) { const daysUntil = Math.ceil((new Date(doc.expiration_date).getTime() - Date.now()) / (1000 * 60 * 60 * 24)); output.push(` ⚠️ Expires: ${doc.expiration_date} (${daysUntil} days)`); if (doc.total_value) { output.push(` Value: ${doc.currency || '$'}${doc.total_value.toLocaleString()}`); } if (doc.auto_renewal !== null) { output.push(` Auto-renewal: ${doc.auto_renewal ? 'Yes' : 'No'}`); } } if (args.overdueInvoices && doc.due_date) { const daysOverdue = Math.ceil((Date.now() - new Date(doc.due_date).getTime()) / (1000 * 60 * 60 * 24)); output.push(` ⚠️ Due: ${doc.due_date} (${daysOverdue} days overdue)`); if (doc.total_amount) { output.push(` Amount: ${doc.currency || '$'}${doc.total_amount.toLocaleString()}`); } if (doc.customer_name) { output.push(` Customer: ${doc.customer_name}`); } } if (doc.confidence_score) { output.push(` Confidence: ${(doc.confidence_score * 100).toFixed(0)}%`); } output.push(''); }); // Add summary statistics if (args.contractsExpiring && results.length > 0) { const totalValue = results.reduce((sum, c) => sum + (c.total_value || 0), 0); output.push(`Total contract value at risk: $${totalValue.toLocaleString()}`); } if (args.overdueInvoices && results.length > 0) { const totalOverdue = results.reduce((sum, i) => sum + (i.total_amount || 0), 0); output.push(`Total overdue amount: $${totalOverdue.toLocaleString()}`); } return { content: [{ type: 'text', text: output.join('\n') }], isError: false }; } catch (error) { return { content: [{ type: 'text', text: `Error searching documents: ${error instanceof Error ? error.message : 'Unknown error'}` }], isError: true }; } }