OpenGrok AOSP MCP

OpenGrok AOSP MCP

Enables intelligent code navigation and analysis for AOSP development using OpenGrok, with 18 tools for searching definitions, references, AIDL, Binder, system services, and more.

Category
Visit Server

README

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 条结果

快速开始

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 中禁用认证

开发路线

  • [x] Milestone 1: 基础框架 + 5 个基础工具
  • [x] Milestone 2: AIDL + Binder 分析工具
  • [x] Milestone 3: System Service + JNI 工具
  • [x] Milestone 4-7: Advanced AOSP 工具(HAL、Broadcast、SELinux、Resource、Init、Build)
  • [x] Milestone 8: 智能分析工具

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

许可证

Apache 2.0

致谢

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured