Skip to main content
Glama
BarryHsia

OpenGrok AOSP MCP

by BarryHsia

OpenGrok AOSP MCP Server

为 AOSP 开发设计的 MCP 服务器,通过 OpenGrok 提供智能代码导航和分析。

功能特性

18 个工具(完整实现)

基础搜索工具 (5)

工具

功能

参数

search_definitions

查找符号定义

symbol, project, path, file_type, limit

search_references

查找符号引用

symbol, project, path, file_type, limit

search_full

全文搜索

query, project, path, file_type, limit

get_file_content

获取文件内容

path, start_line, end_line

list_projects

列出项目

AIDL + Binder 工具 (2)

工具

功能

参数

find_aidl_impl

分析 AIDL 接口

interface_name, limit

trace_binder_chain

追踪 Binder 调用链

interface_name, method_name, limit

System Service + JNI 工具 (3)

工具

功能

参数

analyze_system_service

分析系统服务

service_name, limit

find_jni_bridge

查找 JNI 桥接

java_class, limit

trace_permission

追踪权限检查

permission, limit

Advanced AOSP 工具 (6)

工具

功能

参数

find_hal_interface

查找 HAL 接口

hal_name, hal_type, limit

trace_broadcast

追踪广播流程

action, limit

search_selinux_policy

搜索 SELinux 策略

query, limit

find_resource_overlay

查找资源和 RRO

resource_name, limit

trace_init_service

追踪 Init 服务

service_name, limit

analyze_build_module

分析构建模块

module_name, limit

Intelligent 工具 (2)

工具

功能

参数

explain_code_flow

智能代码流程解释

symbol, limit

find_similar_patterns

查找相似代码模式

pattern, file_type, limit

Token 优化

  • 路径缩写:frameworks/basef/b

  • 代码片段限制 5 行

  • 24 小时缓存

  • 默认返回 10 条结果

Related MCP server: vHal MCP Server

快速开始

1. 安装

git clone <repo-url> opengrok-aosp-mcp
cd opengrok-aosp-mcp
./install.sh

2. 配置

编辑 config.json

{
  "opengrok": {
    "base_url": "http://localhost:8080",
    "token": null
  }
}

3. 测试

# 测试连接
uv run python test_connection.py

# 测试所有工具
uv run python test_all.py

4. 配置 Kiro CLI

编辑 ~/.kiro/settings/mcp.json

{
  "mcpServers": {
    "opengrok-aosp": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/opengrok-aosp-mcp",
        "run",
        "python",
        "server.py"
      ]
    }
  }
}

5. 使用

kiro-cli chat

# 在 Kiro 中
/tools trust-all

# 测试工具
搜索 ActivityManagerService 的定义
查找 startActivity 的引用

工具使用示例

1. search_definitions - 查找符号定义

用途:查找函数、类、方法的定义位置

参数

  • symbol (必需): 符号名称,如 "ActivityManagerService"

  • project (可选): 项目过滤

  • path (可选): 路径过滤,如 "frameworks/base"

  • file_type (可选): 文件类型,如 "java", "cpp"

  • limit (可选): 最大结果数,默认 10

示例

User: 查找 ActivityManagerService 的定义
Kiro: [调用 search_definitions("ActivityManagerService")]

User: 在 frameworks/base 中查找 PowerManager 的定义
Kiro: [调用 search_definitions("PowerManager", path="frameworks/base")]

返回格式

[
  {
    "path": "f/b/services/core/java/com/android/server/am/ActivityManagerService.java",
    "line": 123,
    "snippet": "public class ActivityManagerService extends IActivityManager.Stub",
    "url": "http://localhost:8080/xref/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java#123"
  }
]

2. search_references - 查找符号引用

用途:查找符号在哪些地方被使用

参数:同 search_definitions

示例

User: 查找 startActivity 在哪里被调用
Kiro: [调用 search_references("startActivity")]

User: 查找 PowerManager.WakeLock 的所有使用
Kiro: [调用 search_references("WakeLock", path="frameworks")]

3. search_full - 全文搜索

用途:搜索包含特定文本的代码(支持正则表达式)

参数

  • query (必需): 搜索文本或正则表达式

  • 其他参数同上

示例

User: 搜索包含 "Binder transaction" 的代码
Kiro: [调用 search_full("Binder transaction")]

User: 搜索 TODO 注释
Kiro: [调用 search_full("TODO:")]

4. get_file_content - 获取文件内容

用途:读取指定文件的内容(带行号)

参数

  • path (必需): 文件路径

  • start_line (可选): 起始行,默认 1

  • end_line (可选): 结束行,默认 50

示例

User: 查看 ActivityManagerService.java 的前 100 行
Kiro: [调用 get_file_content("frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java", start_line=1, end_line=100)]

返回格式

{
  "path": "f/b/services/core/java/com/android/server/am/ActivityManagerService.java",
  "start_line": 1,
  "end_line": 100,
  "total_lines": 5234,
  "text": "1: package com.android.server.am;\n2: \n3: import android.app.ActivityManager;\n..."
}

5. list_projects - 列出项目

用途:列出 OpenGrok 中所有可用的项目

参数:无

示例

User: 列出所有项目
Kiro: [调用 list_projects()]

6. find_aidl_impl - 分析 AIDL 接口

用途:分析 AIDL 接口的完整实现(接口定义、Stub、Proxy、服务注册)

参数

  • interface_name (必需): AIDL 接口名,如 "IActivityManager"

  • limit (可选): 每个类型的最大结果数,默认 10

示例

User: 分析 IActivityManager 接口
Kiro: [调用 find_aidl_impl("IActivityManager")]

User: 查看 IWindowManager 的实现
Kiro: [调用 find_aidl_impl("IWindowManager")]

返回格式

{
  "interface": {
    "path": "f/b/core/java/android/app/IActivityManager.aidl",
    "line": 1,
    "snippet": "interface IActivityManager {",
    "url": "http://localhost:8080/xref/..."
  },
  "stub": [
    {
      "path": "f/b/core/java/android/app/IActivityManager.java",
      "line": 123,
      "snippet": "public static abstract class Stub extends Binder",
      "url": "http://localhost:8080/xref/..."
    }
  ],
  "proxy": [...],
  "registration": [...]
}

7. trace_binder_chain - 追踪 Binder 调用链

用途:追踪 Binder IPC 调用链,从 Java 接口到 Native 实现

参数

  • interface_name (必需): 接口名,如 "IActivityManager"

  • method_name (必需): 方法名,如 "startActivity"

  • limit (可选): 每层的最大结果数,默认 10

示例

User: 追踪 IActivityManager.startActivity 的调用链
Kiro: [调用 trace_binder_chain("IActivityManager", "startActivity")]

User: 查看 IWindowManager.addWindow 的实现路径
Kiro: [调用 trace_binder_chain("IWindowManager", "addWindow")]

返回格式

{
  "java_interface": [...],  // Java 接口定义
  "java_impl": [...],       // Java 实现(Stub)
  "jni_bridge": [...],      // JNI 桥接
  "native_impl": [...]      // Native 实现
}

8. analyze_system_service - 分析系统服务

用途:分析系统服务的完整生命周期(启动、注册、客户端使用)

参数

  • service_name (必需): 服务名,如 "activity", "power", "window"

  • limit (可选): 每个类型的最大结果数,默认 10

示例

User: 分析 ActivityManagerService
Kiro: [调用 analyze_system_service("activity")]

User: PowerManagerService 是如何启动的?
Kiro: [调用 analyze_system_service("power")]

返回格式

{
  "service_class": [...],    // 服务类定义
  "registration": [...],     // 服务注册
  "startup": [...],          // 启动逻辑
  "client_usage": [...]      // 客户端使用
}

9. find_jni_bridge - 查找 JNI 桥接

用途:查找 Java 类的 Native 方法和 JNI 实现

参数

  • java_class (必需): Java 类全名,如 "android.os.Process"

  • limit (可选): 每个类型的最大结果数,默认 10

示例

User: android.os.Process 的 JNI 实现在哪里?
Kiro: [调用 find_jni_bridge("android.os.Process")]

User: 查找 Binder 的 native 方法
Kiro: [调用 find_jni_bridge("android.os.Binder")]

返回格式

{
  "java_native_methods": [...],  // Java 中的 native 方法声明
  "jni_registration": [...],     // JNI 方法注册
  "native_impl": [...]           // Native 实现
}

10. trace_permission - 追踪权限检查

用途:追踪权限的定义、检查点和强制执行

参数

  • permission (必需): 权限全名,如 "android.permission.CAMERA"

  • limit (可选): 每个类型的最大结果数,默认 10

示例

User: CAMERA 权限在哪里检查?
Kiro: [调用 trace_permission("android.permission.CAMERA")]

User: 追踪 WRITE_EXTERNAL_STORAGE 权限
Kiro: [调用 trace_permission("android.permission.WRITE_EXTERNAL_STORAGE")]

返回格式

{
  "permission_definition": [...],  // 权限定义
  "check_points": [...],           // 检查点
  "enforcement": [...]             // 强制执行
}

典型使用场景

场景 1:理解某个类的实现

User: ActivityManagerService 是如何实现的?

Kiro 会:
1. search_definitions("ActivityManagerService") - 找到定义
2. get_file_content(...) - 查看类的主要代码
3. search_references("ActivityManagerService") - 查看哪里使用了它

场景 2:追踪方法调用链

User: startActivity 方法的调用链是什么?

Kiro 会:
1. search_definitions("startActivity") - 找到定义
2. search_references("startActivity") - 找到所有调用点
3. 逐层追踪调用关系

场景 3:查找特定功能的实现

User: 权限检查是如何实现的?

Kiro 会:
1. search_full("checkPermission") - 全文搜索
2. search_definitions("checkPermission") - 找到具体实现
3. get_file_content(...) - 查看实现细节

场景 4:分析 AIDL 接口

User: IActivityManager 接口是如何实现的?

Kiro 会:
1. find_aidl_impl("IActivityManager") - 分析接口、Stub、Proxy
2. 查看服务注册点
3. 理解 Binder 通信机制

场景 5:追踪 Binder 调用链

User: startActivity 是如何通过 Binder 调用的?

Kiro 会:
1. trace_binder_chain("IActivityManager", "startActivity")
2. 展示 Java → JNI → Native 的完整调用路径
3. 帮助理解跨进程通信流程

场景 6:分析系统服务

User: PowerManagerService 是如何工作的?

Kiro 会:
1. analyze_system_service("power")
2. 查看服务启动、注册和客户端使用
3. 理解系统服务架构

场景 7:查找 JNI 实现

User: android.os.Process 的 native 方法在哪里实现?

Kiro 会:
1. find_jni_bridge("android.os.Process")
2. 展示 Java native 声明和 C++ 实现
3. 理解 Java-Native 交互

场景 8:追踪权限检查

User: CAMERA 权限在哪里被检查?

Kiro 会:
1. trace_permission("android.permission.CAMERA")
2. 找到权限定义、检查点和强制执行
3. 理解权限机制

项目结构

opengrok-aosp-mcp/
├── README.md              # 本文件
├── config.json            # 配置文件
├── server.py              # MCP 服务器入口
├── install.sh             # 安装脚本
├── test_all.py            # 测试所有工具
├── test_connection.py     # 测试 OpenGrok 连接
├── core/
│   ├── opengrok_client.py # OpenGrok API 客户端
│   ├── cache.py           # 查询缓存
│   └── token_optimizer.py # Token 优化
└── tools/
    └── basic.py           # 5 个基础工具实现

故障排查

OpenGrok 连接失败

# 测试连接
curl http://localhost:8080/api/v1/search?full=test&maxresults=1

# 检查 OpenGrok 是否运行
ps aux | grep opengrok

搜索结果为空

  • 确认 OpenGrok 已索引源码

  • 检查搜索的符号是否存在

  • 尝试使用 search_full 进行全文搜索

认证错误 (401)

  • config.json 中配置 token

  • 或在 OpenGrok 中禁用认证

开发路线

  • Milestone 1: 基础框架 + 5 个基础工具

  • Milestone 2: AIDL + Binder 分析工具

  • Milestone 3: System Service + JNI 工具

  • Milestone 4-7: Advanced AOSP 工具(HAL、Broadcast、SELinux、Resource、Init、Build)

  • Milestone 8: 智能分析工具

🎉 项目已完成所有功能,共 18 个工具!

许可证

Apache 2.0

致谢

A
license - permissive license
-
quality - not tested
F
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/BarryHsia/opengrok-aosp-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server