rag_search
Search your personal document corpus to find relevant information from notes, documents, and web pages using natural language queries.
Instructions
Поиск по личному корпусу документов
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Максимальное количество результатов | |
| query | Yes | Поисковый запрос |
Implementation Reference
- src/server.ts:43-61 (registration)Registration of 'rag_search' tool in MCP server, including input schema definition.{ name: 'rag_search', description: 'Поиск по личному корпусу документов', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Поисковый запрос', }, limit: { type: 'number', description: 'Максимальное количество результатов', default: 5, }, }, required: ['query'], }, },
- src/server.ts:187-190 (handler)MCP tool call handler for 'rag_search' that delegates to RAGService.search.case 'rag_search': return { content: await this.ragService.search(args.query as string, (args.limit as number) || 5) };
- src/rag/rag-service.ts:17-37 (handler)RAGService.search method: obtains SQLiteClient from pool and calls its search method.async search(query: string, limit: number = 5): Promise<SearchResult[]> { try { console.log(`🔍 Поиск: "${query}" (лимит: ${limit})`); // Получаем SQLiteClient из пула соединений const sqliteClient = await this.connectionPool.getSQLiteClient(); // Выполняем поиск через SQLite const results = await sqliteClient.search(query, { limit }); if (results.isErr()) { throw new Error(`Ошибка поиска: ${results.error.message}`); } console.log(`✅ Найдено результатов: ${results.value.length}`); return results.value; } catch (error) { console.error('Ошибка поиска:', error); throw new Error(`Ошибка поиска: ${error}`); } }
- src/rag/sqlite-client.ts:485-531 (handler)SQLiteClient.search: core implementation using FTS5 search with fallback to keyword search, scoring, snippets, and highlights.async search(query: string, options: SearchOptions = {}): Promise<Result<SearchResult[], SQLiteError>> { const { limit = 10, offset = 0, includeSnippets = true, highlightTerms = true, minScore = 0.1 } = options; try { // Try FTS search first let results = await this.performFTSSearch(query, limit, offset); if (results.length === 0) { // Fallback to simple search results = await this.performSimpleSearch(query, limit, offset); } // Filter by minimum score const filteredResults = results.filter(r => r.score >= minScore); // Add snippets and highlights if requested if (includeSnippets || highlightTerms) { filteredResults.forEach(result => { if (includeSnippets) { result.snippet = this.generateSnippet(result.text, query, 200); } if (highlightTerms) { result.highlights = this.extractHighlights(result.text, query); } }); } this.metrics.recordOperation('search'); this.logger.info('Search completed', { query, resultsCount: filteredResults.length }); return ok(filteredResults); } catch (error) { this.metrics.recordError('search'); return err(new SQLiteError( `Search failed: ${error instanceof Error ? error.message : String(error)}`, 'SEARCH_ERROR', undefined, error instanceof Error ? error : undefined )); } }