search_docs
Search documentation by query to find relevant information, with options to filter by document category and control result quantity.
Instructions
Search documentation
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| max_results | No | Maximum number of results | |
| doc_name | No | Filter by document category | |
| offset | No | Number of results to skip |
Implementation Reference
- src/index.ts:631-644 (handler)MCP tool handler for 'search_docs': extracts query parameters, calls SearchEngine.search(), and formats results as text content blocks.case "search_docs": { const query = String(request.params.arguments?.query); const maxResults = Number(request.params.arguments?.max_results) || 3; const docName = request.params.arguments?.doc_name ? String(request.params.arguments.doc_name) : undefined; const offset = Number(request.params.arguments?.offset) || 0; const results = await searchEngine.search(query, maxResults, docName, 0.2, offset); return { content: results.map(result => ({ type: "text", text: `[${result.score.toFixed(2)}] ${result.title}\n${result.excerpt}\n---` })) }; }
- src/index.ts:461-488 (registration)Registers the 'search_docs' tool in ListToolsRequestSchema response, including name, description, and input schema definition.{ name: "search_docs", description: "Search documentation", inputSchema: { type: "object", properties: { query: { type: "string", description: "Search query" }, max_results: { type: "number", description: "Maximum number of results", default: 3 }, doc_name: { type: "string", description: "Filter by document category" }, offset: { type: "number", description: "Number of results to skip", default: 0 } }, required: ["query"] } },
- src/search.ts:86-113 (helper)SearchEngine.search(): Performs full-text search using Lunr index, applies filters for docName and minimum score, paginates results, and generates highlighted excerpts.async search(query: string, maxResults = 3, docName?: string, minScore = 0.2, offset = 0) { if (!this.index) { throw new Error('Index not initialized'); } let results = this.index.search(query); // 按文档分类筛选 if (docName) { results = results.filter(result => { const doc = this.docStore[result.ref]; return doc.title.startsWith(`${docName}/`); }); } // 按分数筛选 results = results.filter(result => result.score >= minScore); return results.slice(offset, offset + maxResults).map(result => { const doc = this.docStore[result.ref]; return { path: doc.path, score: result.score, title: doc.title, excerpt: this.createExcerpt(doc.content, query) }; }); }