Android代码搜索服务器

一个MCP服务器,允许AI助手远程搜索和浏览Android开源项目(AOSP)源代码,无需本地检出。

  • by JiaweiHan88
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 JiaweiHan88/android-codesearch-mcp

使用说明

安卓代码搜索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 包含用于分页。

它在内部是如何工作的:

  1. 使用以下命令构建JSON正文 queryString, searchOptions (页面大小、上下文行、存储库范围),以及 snippetOptions
  2. 将其包装在多部分/混合批处理信封中(模仿cs.android.com前端)
  3. POST到 grimoireoss-pa.clients6.google.com/batch → /v1/contents/search
  4. 解析多部分响应,提取包含以下内容的内部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类型)后面是用语法突出显示的代码块包裹的完整源代码。

它在内部是如何工作的:

  1. 构建一个包含存储库密钥、分支和文件路径的位置JSON数组(protobuf样式)
  2. 到gRPC web端点的POST /$rpc/devtools.grimoire.FileService/GetContentsStreaming
  3. 响应是一个深度嵌套的JSON数组;解析器递归地遍历它以找到:
    • 源内容(第一个包含换行符的长字符串)
    • MIME类型(以开头的字符串 text/)
    • 文件大小(短数字字符串)

3. suggest_symbols

类名、方法名和文件路径的自动补全。有助于在搜索或获取之前发现符号的确切名称或位置。

参数:

名称 类型 必填 默认 描述
query 字符串 是 -- 要填写的部分名称(例如。 ActivityThr)
max_results 整数 否 10 返回的最大建议数

退货: 一份建议清单,每项建议都包括:

  • 符号标题和类型(类、方法等)
  • 定义符号的文件路径和行号
  • 匹配的源线

它在内部是如何工作的:

  1. 将部分查询发送到 /v1/contents/suggest 通过批量信封
  2. 作语法分析 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")

它在内部是如何工作的:

  1. 构造一个Gitiles URL: https://android.googlesource.com/{repo}/+/refs/heads/{branch}/{path}/
  2. 附加 ?format=JSON 请求JSON而不是HTML
  3. 剥去 )]}' 响应中的XSSI前缀
  4. 解析条目,将每个条目分类为 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