""" Tool Layer - wiki_query 工具 基于 SQLite 索引查询 wiki,支持关键词(FTS5)和标签搜索。 参考设计文档:第 2.2 节 """ import logging from typing import List, Dict, Any from ..services import QueryService logger = logging.getLogger(__name__) class WikiQueryTool: """wiki_query 工具实现""" def __init__(self, query_service: QueryService): self.query_service = query_service async def handle(self, query: str = "", tags: List[str] = None, limit: int = 10) -> Dict[str, Any]: """ 查询 wiki 页面 Args: query: 查询关键词(FTS5 全文搜索) tags: 标签过滤 limit: 返回数量限制 Returns: { "results": [ { "path": "practices/moziplus-orchestration.md", "title": "moziplus 编排实践", "category": "practices", "tags": ["moziplus", "orchestration"], "summary": "...", "lifecycle": "verified", "updated_at": "2024-06-15T10:30:00", "wikilink": "[[practices/moziplus-orchestration.md|moziplus 编排实践]]" } ], "total": 5, "query": "...", "tags": [...] } """ if tags is None: tags = [] results = [] # 组合查询 if query and tags: # 先 FTS5 搜索,再标签过滤 fts_results = await self.query_service.search(query, limit * 2) filtered = [r for r in fts_results if any(t in r.tags for t in tags)] pages = filtered[:limit] elif query: # 仅 FTS5 搜索 pages = await self.query_service.search(query, limit) elif tags: # 仅标签搜索 pages = await self.query_service.search_by_tags(tags[:5]) # 限制标签数量 pages = pages[:limit] else: # 无查询条件,返回最近更新的页面 pages = [] # 格式化结果 for page in pages: results.append({ "path": page.path, "title": page.title, "category": page.category, "tags": page.tags, "summary": page.summary, "lifecycle": page.lifecycle, "updated_at": page.updated_at, "wikilink": f"[[{page.path}|{page.title}]]" }) return { "results": results, "total": len(results), "query": query, "tags": tags } def get_schema(self) -> dict: """返回 MCP Tool schema""" return { "name": "wiki_query", "description": "查询 wiki 页面,支持关键词(FTS5)和标签搜索", "inputSchema": { "type": "object", "properties": { "query": { "type": "string", "description": "查询关键词(FTS5 全文搜索)" }, "tags": { "type": "array", "items": {"type": "string"}, "description": "标签过滤" }, "limit": { "type": "integer", "default": 10, "description": "返回数量限制" } } } }