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
JavaScript
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
};
}
}