内容
# Orihime
<!-- mcp-name: io.github.srinivasan-sundaresan95/orihime -->
[](https://pypi.org/project/orihime/)
[](https://opensource.org/licenses/MIT)
[](https://modelcontextprotocol.io)
[](https://glama.ai/mcp/servers/srinivasan-sundaresan95/orihime)
跨仓库代码知识图,用于Java/Kotlin/JavaScript/TypeScript代码库。Orihime使用[tree-sitter](https://tree-sitter.github.io/)将源代码索引到嵌入式[KuzuDB](https://kuzudb.com/)图数据库中,并通过**MCP服务器**(用于AI助手)、本地Web UI和CLI公开图。
> **神话**:Orihime(織姫)是织女——织造宇宙织物的公主。她织造连接。 该工具将您的代码库编织成一个单独的图。

---
## 功能
- **跨仓库调用图** —— 谁调用什么,跨服务边界,包括解析为目标端点的REST调用
- **跨仓库污点分析** —— 跟踪用户控制的数据从HTTP/Kafka/JMS入口点通过调用图到危险的汇聚点(SQL注入、路径遍历、XXE、反序列化、SSRF、日志注入等)
- **安全报告** —— OWASP Top 10、CWE、PCI DSS、STIG框架;二级注入检测;通过YAML进行自定义源/汇聚点
- **入口点可达性过滤** —— 消除死代码的误报;仅显示从实际入口点(HTTP处理程序、`@KafkaListener`、`@Scheduled`、`@JmsListener`、`@RabbitListener`)可达的发现结果
- **复杂度提示** —— 静态O(n²)循环检测、N+1 JPA风险、无界查询、递归调用 —— 无需分析器
- **性能关联** —— 导入Gatling/JMeter负载测试结果;与调用图关联以查找确认的热点和Little's Law容量上限每个端点
- **许可证合规性** —— 扫描Maven/Gradle依赖项与SPDX标识符;标记商业项目中的GPL/AGPL/LGPL
- **增量重新索引** —— 基于git blob-hash的跳过;仅在后续运行中重新解析更改的文件
- **多语言** —— Java、Kotlin、JavaScript、TypeScript(Next.js、Express、React)
---
## 快速入门 — AI优先 (Claude 代码)
使用Orihime的主要方式是通过MCP使用AI助手。您只需索引一次,然后用自然语言提问 —— 无需Cypher,无需grep,无需阅读源文件。
### 1. 安装
```bash
git clone https://github.com/srinivasan-sundaresan95/orihime.git
cd orihime
pip install -e .
```
### 2. 注册Claude Code(一次性设置)
```bash
python -m orihime register # 将MCP服务器条目写入 ~/.claude/settings.json
python -m orihime install-skills # 将Claude Code技能复制到 ~/.claude/skills/
```
重启Claude Code。`orihime` MCP工具和技能(`/orihime-call-flow`、`/orihime-security-audit`、`/orihime-perf-analysis`、`/orihime-change-impact`)现已激活。
### 3. 索引您的仓库
```bash
python -m orihime index --repo /path/to/your/service-a --name service-a
python -m orihime index --repo /path/to/your/service-b --name service-b
```
### 4. 提问
```
跟踪服务a中GET /api/orders的调用流程
查找服务b中的SQL注入风险
如果我更改OrderService.processPayment,会发生什么?
哪些端点接近饱和?
```
无需阅读源文件。无需grep。Claude直接使用图 —— 通常5-8个工具调用,而源代码分析则需要30+个调用。
> **CLI替代**:上述所有操作也作为Python命令(`python -m orihime index`、`python -m orihime ui`等)提供,如果您更喜欢在AI助手之外工作。请参见下面的[CLI参考](#cli参考)。
---
## 功能比较
| 功能 | Orihime | GitNexus | SonarQube 社区版 | SonarQube 开发者版 | SonarQube 企业版 |
|---|---|---|---|---|---|
| 跨仓库调用图 | ✓ | ✓ | ✗ | ✗ | ✗ |
| REST端点解析 | ✓ | ✓ | ✗ | ✗ | ✗ |
| MCP集成(AI助手) | ✓ | ✓ | ✓¹ | ✓¹ | ✓¹ |
| Claude Code钩子 + 技能 | ✓ | ✓ | ✗ | ✗ | ✗ |
| 跨文件污点(SAST / 注入) | ✓ | ✗ | ✗ | ✓ | ✓ |
| 二级注入 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 入口点可达性过滤 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 自定义源/汇聚点(YAML) | ✓ | ✗ | ✗ | ✗ | ✓² |
| OWASP/CWE/PCI/STIG合规报告 | ✓ | ✗ | ✗ | ✗ | ✓ |
| 参数级污点(值流) | ✓ | ✗ | ✗ | ✗ | ✗ |
| 复杂度提示(O(n²), N+1) | ✓ | ✗ | 部分 | 部分 | 部分 |
| I/O扇出 + 串行/并行分析 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 性能摄入 + 容量模型 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 跨服务级联风险 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 许可证合规性 | ✓ | ✗ | ✗ | ✗ | ✓³ |
| 嵌入式数据库(无服务器守护进程) | ✓ | ✓ | ✗ | ✗ | ✗ |
| 索引Java / Kotlin | ✓ | ✓ | ✓ | ✓ | ✓ |
| 索引JS / TS | ✓ | ✓ | ✓ | ✓ | ✓ |
| 许可证 | MIT | PolyForm NC | LGPL | 商业 | 商业 |
> ¹ 通过官方[sonarqube-mcp-server](https://github.com/SonarSource/sonarqube-mcp-server)(SonarSource,生产就绪)。适用于所有SonarQube版本。
> ² 自定义污点源/汇聚点需要高级安全插件(Enterprise+)。
> ³ 许可证合规性(SBOM + 策略强制执行)需要高级安全插件(Enterprise+)。
>
> **GitNexus**(PolyForm 非商业)提供跨仓库调用图和MCP集成,支持14种语言,包括Java和Kotlin。它不涵盖SAST、性能分析或合规性报告。
---
## MCP 工具参考
### 调用图
| 工具 | 描述 |
|---|---|
| `find_callers(method_fqn)` | 调用给定方法的所有方法 |
| `find_callees(method_fqn)` | 给定方法调用的所有方法 |
| `blast_radius(method_fqn, max_depth)` | 传递调用者集合,最大N跳 |
| `find_endpoint_callers(http_method, path_pattern)` | 跟踪HTTP端点到其调用者 |
| `find_implementations(interface_fqn)` | 实现接口的所有类 |
| `find_superclasses(class_fqn, max_depth)` | 继承链 |
| `find_external_calls(repo_name)` | 索引仓库外部的所有方法调用 |
### 发现
| 工具 | 描述 |
|---|---|
| `search_symbol(query)` | 跨类/方法完全限定名的全文搜索 |
| `get_file_location(fqn)` | 任意类或方法的路径和行号 |
| `list_repos()` | 所有索引仓库 |
| `list_branches(repo_name)` | 仓库的所有索引分支 |
| `list_endpoints(repo_name)` | 仓库的所有HTTP端点 |
| `list_unresolved_calls(repo_name)` | 未匹配到端点的REST调用 |
| `find_repo_dependencies(repo_name)` | 跨服务DEPENDS_ON边 |
### ORM / JPA
| 工具 | 描述 |
|---|---|
| `list_entity_relations(repo_name)` | 所有JPA实体关系 — 也用于设计审查(第1.5阶段) |
| `find_eager_fetches(repo_name)` | EAGER获取的集合(N+1风险) |
### 安全(SAST)
| 工具 | 描述 |
|---|---|
| `find_taint_sinks(repo_name)` | 调用图中可达的所有污点汇聚点 |
| `find_taint_flows(repo_name)` | 值流污点:参数→参数跨调用边 |
| `find_cross_service_taint(repo_name, max_depth)` | 通过REST跨服务边界的污点 |
| `find_second_order_injection(repo_name)` | 污点存储到DB然后重新读取并用作汇聚点 |
| `find_entry_points(repo_name)` | 所有HTTP/Kafka/计划/JMS/RabbitMQ入口点 |
| `find_reachable_sinks(repo_name, show_all)` | 仅可从入口点过滤的污点汇聚点 |
| `generate_security_report(repo_name, framework)` | OWASP / CWE / PCI / STIG格式的报告 |
| `list_security_config()` | 显示YAML配置中的活动源、汇聚点和净化器 |
### 复杂度和性能
| 工具 | 描述 |
|---|---|
| `find_complexity_hints(repo_name, min_severity)` | 标记为O(n²)、N+1、无界查询、递归的方法 |
| `ingest_perf_results(repo_name, file_path)` | 加载Gatling模拟.log、JMeter XML或JSON性能数据 |
| `find_hotspots(repo_name)` | 复杂度提示 × p99延迟,按风险评分排序 |
| `estimate_capacity(repo_name)` | 每个端点的Little's Law容量;标记接近饱和的端点 |
| `find_cascade_risk(repo_name)` | 跨服务级联:上游端点受下游饱和度限制 |
### 许可证合规性
| 工具 | 描述 |
|---|---|
| `find_license_violations(repo_name, allowed, skip_lookup)` | 通过Maven Central标记GPL/AGPL/LGPL依赖项 |
### 索引
| 工具 | 描述 |
|---|---|
| `index_repo_tool(repo_path, repo_name)` | 从MCP会话内部触发索引 |
---
## CLI 参考
所有操作也可以直接通过AI助手访问:
```
python -m orihime index --repo PATH --name NAME [--db PATH] [--force] [--branch NAME]
python -m orihime ui [--port 7700] [--db PATH]
python -m orihime serve
python -m orihime serve-sse [--port 7702] [--db PATH]
python -m orihime resolve [--db PATH]
python -m orihime write-server [--port 7701] [--db PATH]
python -m orihime register [--db PATH] [--python PATH]
python -m orihime install-skills
```
| 命令 | 描述 |
|---|---|
| `index` | 解析仓库并将其图写入KuzuDB |
| `ui` | 在7700端口启动本地Web UI |
| `serve` | 在stdio上启动MCP服务器(用于Claude Code、Claude Desktop、任何MCP客户端) |
| `serve-sse` | 启动带有SSE传输的MCP服务器(用于CI运行器和远程客户端) |
| `resolve` | 将RestCall URL模式与所有索引仓库中的端点匹配 |
| `write-server` | 为团队/服务器部署启动写序列化服务器 |
| `register` | 将Orihime MCP服务器条目写入`~/.claude/settings.json` |
| `install-skills` | 将捆绑的技能复制到目标AI助手的配置目录(`--agent claude\|cursor\|codex\|copilot\|all`) |
---
## Web UI
```
http://localhost:7700
```
| 页面 | 描述 |
|---|---|
| `/` | 调用图浏览器:搜索方法、跟踪调用者/被调用者、视觉CALLS图 |
| `/findings` | 安全 + 复杂度发现表 — 按OWASP类别、严重性、文件过滤 |
| `/api/…` | 支持UI的JSON端点(也可直接使用) |
---
## 配置
### 环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
| `ORIHIME_DB_PATH` | `~/.orihime/orihime.db` | KuzuDB数据库目录路径 |
| `ORIHIME_SERVER_URL` | _(未设置)_ | 写序列化服务器的URL(团队模式) |
### 自定义源和汇聚点
创建`~/.orihime/security_config.yaml`(或设置`ORIHIME_SECURITY_CONFIG`):
```yaml
sources:
- method_pattern: ".*getCustomUserInput"
description: "自定义输入源"
sinks:
- method_pattern: ".*legacyExec"
sink_type: "COMMAND_INJECTION"
description: "旧shell执行器"
sanitizers:
- method_pattern: ".*sanitizeForLegacy"
```
内置配置涵盖了`HttpServletRequest`、`@RequestParam`、`@PathVariable`、`@RequestBody`、JDBC `execute*`、JPA原生查询、`Runtime.exec`、`ProcessBuilder`、XML解析器、`ObjectInputStream`、`Files.get`、`Paths.get`、`new URL`、日志调用等。
---
## 文档
| 文档 | 描述 |
|---|---|
| [MCP 服务器](docs/mcp-server.md) | 所有MCP工具,含参数和示例 |
| [提取器](docs/extractors.md) | Java/Kotlin/JS/TS如何解析;ExtractResult模式 |
| [安全配置](docs/security-config.md) | 自定义源、汇聚点、净化器 — YAML参考 |
| [CI集成](docs/ci-integration.md) | GitHub Actions PR审查工作流设置 |
| [Docker](docs/docker.md) | 服务器部署的Docker Compose设置 |
| [添加语言](docs/adding-a-language.md) | 如何添加新的语言提取器 |
| [跨仓库解析](docs/resolver.md) | REST调用如何与跨仓库的端点匹配 |
---
## 团队/服务器模式
KuzuDB具有单一写入者约束。在团队部署中,当多个开发人员同时重新索引时,运行写序列化服务器:
```bash
# 在共享服务器上 — 拥有KuzuDB连接
python -m orihime write-server --port 7701 --db /shared/orihime.db
# 每个开发人员的索引器将写入发送到服务器
ORIHIME_SERVER_URL=http://server:7701 python -m orihime index --repo /path --name my-service
```
本地运行的开发人员无需`ORIHIME_SERVER_URL`即可直接打开KuzuDB。Web UI和MCP服务器始终直接从KuzuDB读取(读取不会通过写入服务器)。
---
## 架构
```
源文件
│
▼ tree-sitter (Java, Kotlin, JS, TS)
ParseResult(纯Python字典,可pickle)
│
▼ ProcessPoolExecutor(并行解析工作线程)
第2阶段:KuzuDB写入(按表批处理,500边事务)
│
▼
KuzuDB 嵌入式图 ←──────────────────────────────┐
│ │
├── MCP 服务器(FastMCP,stdio) │
├── Web UI(Starlette,端口7700) │
└── 写服务器(FastAPI,端口7701,团队模式) ──┘
```
**图模式**(SCHEMA_VERSION 10):
| 节点 | 关键字段 |
|---|---|
| `Repo` | id, name, root_path |
| `File` | path, language, blob_hash, branch_name |
| `Class` | fqn, annotations, is_interface |
| `Method` | fqn, line_start, annotations, is_entry_point, complexity_hint |
| `Endpoint` | http_method, path, path_regex |
| `RestCall` | http_method, url_pattern |
| `EntityRelation` | source_class, target_class, fetch_type, relation_type |
| `PerfSample` | endpoint_fqn, p50_ms, p99_ms, rps, source |
| `CapacityEstimate` | endpoint_fqn, saturation_rps, ceiling_concurrency, risk_level |
| 关系 | 描述 |
|---|---|
| `CALLS` | 方法 → 方法;携带 callee_name, caller_arg_pos, callee_param_pos |
| `CALLS_REST` | 方法 → 端点(已解析的跨服务调用) |
| `UNRESOLVED_CALL` | 方法 → RestCall(尚未解析) |
| `CONTAINS_CLASS` | 文件 → 类 |
| `CONTAINS_METHOD` | 类 → 方法 |
| `EXPOSES` | 仓库 → 端点 |
| `DEPENDS_ON` | 仓库 → 仓库(跨服务依赖) |
| `EXTENDS` | 类 → 类 |
| `IMPLEMENTS` | 类 → 类 |
| `HAS_RELATION` | 类 → EntityRelation |
| `OBSERVED_AT` | 方法 → PerfSample |
---
## 性能
### 查询性能(图数据库)
在 845 个文件的Java/Kotlin服务上进行基准测试:
| 操作 | 时间 |
|---|---|
| 冷索引 | ~67s |
| 增量重新索引(无更改) | ~34s |
| `find_callers` | <5ms |
| `blast_radius`(深度3) | <15ms |
| `find_taint_sinks`(整个仓库) | <25ms |
批量写入加速比朴素的逐行写入:**12倍**。
---
### AI 助手基准 — 跟踪单个调用流程
#### Java/Kotlin 代码库(845 + 224 文件,实测)
在同一代码库上,使用 GitNexus v1.6.3、Orihime v1.9 和 grep+源代码读取基准线进行基准测试。GitNexus v1.6.3、Orihime v1.9 和一个 grep+源代码读取基准线都在同一硬件(WSL2/Ubuntu,Intel i7,2026-04-30)上进行测量。
| 方法 | 冷索引 | 查询延迟 | 平均令牌/查询 | 读取文件 |
|---|---|---|---|---|
| **基准线** — Claude 直接读取源文件 | — | ~4–5 分钟 | ~14,000 | 27 |
| **GitNexus v1.6.3** | 51.4秒 | 2–10秒⁴ | ~1,490 | 0 |
| **Orihime v1.9** | **66.6秒** | **3–22毫秒** | **~683** | **0** |
**Orihime vs 基准线:95% 更少的令牌 · 200–1,400 倍更快的查询**
**Orihime vs GitNexus:2.2 倍更少的令牌 · 200–1,400 倍更快的查询 · 原生 MCP 支持**
7 个 Orihime 工具调用产生了 ~80% 的结构化图片(完整的控制器→服务→仓库→上游链,27 个测试方法浮现,弹性线路自动发现)。剩余 ~20% — 上游 API URL、身份验证头、分支级控制流程 — 需要有针对性的源代码读取,限定在 ~5 个特定文件而不是 27 个。
GitNexus 冷索引在 NTFS 上快 1.3 倍(Node.js 解析吞吐量优势)。在原生 Linux 上,这一差距缩小到接近同等。
> ⁴ GitNexus 查询延迟主要受 GitHub API 往返调用主导(每个查询 1–3 次 × 500–2,000 毫秒每次,取决于速率限制)。Blast radius 返回错误方向的结果(上游导入而不是下游依赖)。
---
## 许可证
MIT
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器