feat: [OSS26] 按关键词搜代码 search_code_by_keyword (#130) - #147
Open
wryyyds7 wants to merge 3 commits into
Open
Conversation
Implement the unified MCP Server framework as the runtime base for all upcoming YASA MCP tools (Issue antgroup#129). Framework: - Dual transport: stdio (default) / streamable-http - Tool registration via @mcp_tool decorator + auto-discovery - Unified input validation (Pydantic), error handling, logging (stderr) - Health check endpoint GET /healthz in HTTP mode - Built-in demo tool ping returning server status Modules: - yasa_mcp/config.py: CLI args + env var parsing - yasa_mcp/server.py: FastMCP lifecycle management - yasa_mcp/registry.py: decorator-based tool auto-registration - yasa_mcp/transport/http.py: streamable-http + /healthz - yasa_mcp/tools/ping.py: demo health-check tool - yasa_mcp/errors.py: unified error codes - yasa_mcp/logging_config.py: stderr logging with level control Tests (44 passing): - test_registry.py: tool registration, auto-discovery, schema - test_validation.py: param validation, error handling - test_logging.py: stderr output, format, level filtering - test_config.py: CLI parsing, env vars, error exit Docs: - docs/mcp/requirements.md: functional/non-functional requirements - docs/mcp/system-design.md: architecture, module design, data flow - docs/mcp/development-guide.md: step-by-step implementation guide - yasa_mcp/README.md: usage + Claude Desktop/Cline config examples
- registry.py: prevent duplicate tool registration via __module__ check - http.py: use app.add_route() instead of direct app.routes manipulation - http.py: remove unused Route import - http.py + server.py: pass log_level to uvicorn instead of hardcoding - errors.py: fix empty string message fallback bug - test_registry.py: use asyncio.run() instead of deprecated get_event_loop() - test_validation.py: remove unused imports - config.py: convert repo_root to absolute path - logging_config.py: precise logger namespace check - pyproject.toml: fix build-backend to setuptools.build_meta - .gitignore: add .venv/ and Python project ignore rules
- Support plain string and regex search modes - Support case_sensitive toggle - Support path_prefix filtering - Exclude .git/, node_modules/, target/, build/, dist/, __pycache__/ - Skip binary files (detect via null byte in first 8KB) - Return file_path, line_number, column_start/end, line_content, context_before (3 lines), context_after (3 lines) - max_results default 100, capped at 1000 - 28 unit tests covering all acceptance criteria
wryyyds7
requested review from
AntJiuFo,
Arielwyy and
alipaydeshui
as code owners
July 29, 2026 09:06
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
实现
search_code_by_keywordMCP 工具,在指定代码仓库内按关键词检索代码,支持普通字符串与正则两种模式,返回所有命中的文件路径、行号与代码片段(含上下文行)。实现
搜索逻辑 (
_search_file)re.search(pattern, line_content)匹配模式支持
is_regex=False(默认): 普通字符串模式,自动用re.escape()转义特殊字符is_regex=True: 正则模式,直接编译用户输入大小写控制
case_sensitive=False(默认):re.IGNORECASEcase_sensitive=True: 不添加 IGNORECASE flag范围控制
path_prefix: 限定搜索子目录 (如"src/main/java/").git,node_modules,target,build,dist,__pycache__,.venv,venv,.idea,.vscodedirnames阻止os.walk进入排除目录文件过滤
\x00则判定为二进制并跳过 (_is_binary)max_results截断 (上限 1000),达到上限后立即停止上下文行
_CONTEXT_LINES = 3)测试
单元测试
Closes #130