安卓代码搜索MCP服务器
一 MCP(模型上下文协议) 允许AI助手搜索和浏览 安卓开源项目(AOSP) 远程源代码——无需本地签出。
它连接到与电源相同的后端 cs.android.com 并通过MCP stdio传输公开了五个工具。
建筑
┌──────────────┐ stdio ┌──────────────────────┐ HTTPS ┌─────────────────────────────────┐
│ MCP Client │ ◄──────► │ androidcodesearchmcp│ ──────► │ grimoireoss-pa.clients6.google │
│ (Claude, │ JSON-RPC│ (this server) │ │ /batch (search, suggest) │
│ VSCode…) │ │ │ ──────► │ /$rpc/… (file content, gRPC) │
└──────────────┘ │ Python / httpx │ └─────────────────────────────────┘
│ │ HTTPS ┌─────────────────────────────────┐
│ │ ──────► │ android.googlesource.com │
└──────────────────────┘ │ Gitiles JSON API (dir browse) │
└─────────────────────────────────┘后端API
| 能力 | 端点 | 协议 |
|---|---|---|
| 代码搜索 | grimoireoss-pa.clients6.google.com/batch → /v1/contents/search | 多部分包装的JSON POST |
| 符号建议 | 相同 /batch → /v1/contents/suggest | 多部分包装的JSON POST |
| 文件内容 | grimoireoss-pa.clients6.google.com/$rpc/devtools.grimoire.FileService/GetContentsStreaming | gRPC web(JSON+protobuf) |
| 目录列表 | android.googlesource.com/{repo}/+/refs/heads/{branch}/{path}/ | Gitiles JSON(?format=JSON) |
所有端点都是公共的,不需要身份验证。服务器使用嵌入cs.android.com前端的相同API密钥。
______________________________________________________________________
工具
1. search_android_code
在所有AOSP存储库中进行全文和正则表达式搜索。
参数:
| 名称 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
query | 字符串 | 是 | -- | 搜索查询(请参阅下面的运算符) |
project | enum | 否 | "android" | 其中之一: android, androidx, android-studio, android-llvm |
repository | string | no | -- | 仅限于特定的仓库,例如。 platform/frameworks/base |
branch | string | 否 | "master" | 要搜索的分支或引用 |
page_size | 整数 | 否 | 20 | 每页结果(最多50个) |
page_token | string | 否 | "" | 来自先前响应的分页标记 |
context_lines | 整数 | 否 | 2 | 围绕每个匹配的源上下文行 |
搜索运算符:
| 运算符 | 示例 | 它的作用 |
|---|---|---|
| *(无)* | ActivityThread | 普通关键字/正则表达式搜索 |
file: | file:ActivityManager.java | 将匹配限制为文件名 |
class: | class:Activity | 匹配类定义 |
function: | function:dispatchTouchEvent | 匹配函数/方法名称 |
package: | package:android.app | 匹配包声明 |
操作员可以组合: class:Activity file:Activity.java
退货: 匹配文件的列表,每个文件都有代码片段,显示匹配的行及其周围的上下文,以及一个直接的cs.android.com URL。如果存在更多结果 page_token 包含用于分页。
它在内部是如何工作的:
- 使用以下命令构建JSON正文
queryString,searchOptions(页面大小、上下文行、存储库范围),以及snippetOptions - 将其包装在多部分/混合批处理信封中(模仿cs.android.com前端)
- POST到
grimoireoss-pa.clients6.google.com/batch→/v1/contents/search - 解析多部分响应,提取包含以下内容的内部JSON
searchResults[]包含文件规格和代码片段
______________________________________________________________________
2. get_file_content
检索单个文件的完整源代码。
参数:
| 名称 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
path | 字符串 | 是 | -- | 存储库中的文件路径(例如。 core/java/android/app/Activity.java) |
project | enum | 否 | "android" | 项目ID |
repository | string | 否 | "platform/superproject" | 存储库名称 |
branch | string | 否 | "master" | 分支机构或参考 |
退货: 文件元数据(大小、MIME类型)后面是用语法突出显示的代码块包裹的完整源代码。
它在内部是如何工作的:
- 构建一个包含存储库密钥、分支和文件路径的位置JSON数组(protobuf样式)
- 到gRPC web端点的POST
/$rpc/devtools.grimoire.FileService/GetContentsStreaming - 响应是一个深度嵌套的JSON数组;解析器递归地遍历它以找到:
- 源内容(第一个包含换行符的长字符串) - MIME类型(以开头的字符串 text/) - 文件大小(短数字字符串)
______________________________________________________________________
3. suggest_symbols
类名、方法名和文件路径的自动补全。有助于在搜索或获取之前发现符号的确切名称或位置。
参数:
| 名称 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
query | 字符串 | 是 | -- | 要填写的部分名称(例如。 ActivityThr) |
max_results | 整数 | 否 | 10 | 返回的最大建议数 |
退货: 一份建议清单,每项建议都包括:
- 符号标题和类型(类、方法等)
- 定义符号的文件路径和行号
- 匹配的源线
它在内部是如何工作的:
- 将部分查询发送到
/v1/contents/suggest通过批量信封 - 作语法分析
suggestions[]从响应中提取文件规格、行号和匹配文本
______________________________________________________________________
4. browse_directory
列出给定路径下的文件和子目录。使用 Gitiles JSON API 上 android.googlesource.com (与Grimoire搜索后端分开)。
参数:
| 名称 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
path | string | 否 | "" (root) | 列表的目录路径 |
branch | string | 否 | "master" | 分行名称 |
repository | string | 否 | "platform/superproject" | 要浏览的存储库 |
退货: 按字母顺序排列的条目列表(先是目录,然后是文件)。每个条目都显示其名称、类型图标和完整路径。子模块用链接图标标记。
重要提示: AOSP超级项目包含许多 子模块 (例如。 frameworks/base).这些显示为类型 submodule 在目录列表中。浏览 *里面* 子模块,您必须明确指定其存储库:
# Lists the superproject root — frameworks/base shows as a submodule link
browse_directory(path="frameworks")
# To browse inside frameworks/base, specify the repo:
browse_directory(repository="platform/frameworks/base", path="core/java/android/app")它在内部是如何工作的:
- 构造一个Gitiles URL:
https://android.googlesource.com/{repo}/+/refs/heads/{branch}/{path}/ - 附加
?format=JSON请求JSON而不是HTML - 剥去
)]}'响应中的XSSI前缀 - 解析条目,将每个条目分类为
dir(树),file(blob),或submodule(承诺)
______________________________________________________________________
5. list_projects
返回可搜索的可用Android源项目列表。
参数: 没有。
退货:
| 项目ID | 名称 | 默认存储库 | 默认分支 |
|---|---|---|---|
android | 安卓系统(AOSP) | platform/superproject | master |
androidx | AndroidX/Jetpack | platform/frameworks/support | androidx-main |
android-studio | 安卓工作室 | platform/tools/adt/idea | mirror-goog-studio-main |
android-llvm | 安卓LLVM | toolchain/llvm-project | main |
______________________________________________________________________
安装
需要Python 3.11+和 紫外线.
# Clone and install
cd androidcodesearchmcp
uv sync跑步
# Via the installed entry point
.venv/Scripts/androidcodesearchmcp.exe # Windows
.venv/bin/androidcodesearchmcp # Linux/macOS
# Or via uv
uv run androidcodesearchmcp
# Or as a Python module
uv run python -m androidcodesearchmcp服务器通过以下方式进行通信 标准 (stdin/stdout JSON-RPC),因此它看起来会挂起——这是正常的。它正在等待MCP客户端连接。
MCP客户端配置
克劳德代码(VS代码扩展/CLI)
增添 ~/.claude.json:
Linux/macOS:
{
"mcpServers": {
"androidcodesearch": {
"type": "stdio",
"command": "/absolute/path/to/.venv/bin/androidcodesearchmcp",
"args": []
}
}
}窗户:
{
"mcpServers": {
"androidcodesearch": {
"type": "stdio",
"command": "C:\\absolute\\path\\to\\.venv\\Scripts\\androidcodesearchmcp.exe",
"args": []
}
}
}或添加到 .mcp.json 在项目根目录中,用于项目范围的访问。
克劳德桌面
增添 claude_desktop_config.json:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json - 窗户:
%APPDATA%\Claude\claude_desktop_config.json
Linux/macOS:
{
"mcpServers": {
"androidcodesearch": {
"command": "/absolute/path/to/.venv/bin/androidcodesearchmcp",
"args": []
}
}
}窗户:
{
"mcpServers": {
"androidcodesearch": {
"command": "C:\\absolute\\path\\to\\.venv\\Scripts\\androidcodesearchmcp.exe",
"args": []
}
}
}项目结构
androidcodesearchmcp/
├── pyproject.toml # Project metadata, dependencies, entry point
├── .mcp.json # Project-scoped MCP config
├── src/androidcodesearchmcp/
│ ├── __init__.py
│ ├── __main__.py # python -m support
│ ├── api.py # Async API client (httpx)
│ │ ├── _batch_request() # Multipart batch transport (search, suggest)
│ │ ├── _grpc_request() # gRPC-web transport (file content)
│ │ ├── search_code() # → /v1/contents/search
│ │ ├── suggest_symbols() # → /v1/contents/suggest
│ │ ├── get_file_content() # → /$rpc/.../GetContentsStreaming
│ │ ├── browse_directory() # → Gitiles JSON API
│ │ └── list_projects() # Static project list
│ └── server.py # MCP server (tool definitions + handlers)
│ ├── _lifespan() # Creates shared httpx.AsyncClient
│ ├── list_tools() # Registers 5 tools with schemas
│ ├── call_tool() # Dispatches tool calls → api.py
│ └── main() # Entry point (asyncio + stdio transport)
└── uv.lock # Locked dependencies