内容
# misp-galaxy-mcp
<img width="2172" height="724" alt="image" src="https://github.com/user-attachments/assets/e57f4c8d-b79a-4139-a2ee-4cee834140d4" />
一个用于搜索 [MISP galaxy](https://github.com/MISP/MISP-galaxy) 知识库的小型模型上下文协议(MCP)服务器。
与 [`misp-mcp`](https://github.com/MISP/misp-mcp)(与实时MISP实例通信)不同,该服务器完全基于静态的MISP-galaxy数据,这些数据作为git子模块提供。它 **不需要MISP实例,不需要API密钥,也不需要运行时网络访问**。
它提供了两个工具,返回每个匹配的规范MISP galaxy标签,例如 `misp-galaxy:threat-actor="APT28"`。
## 工具
### `search_galaxy_clusters(query, galaxy_type=None, limit=50)`
对每个集群的名称(`value`)及其 `synonyms` 进行关键词搜索,使用先精确后模糊的匹配方式:
1. 如果存在不区分大小写的 **精确** 匹配,则返回;否则
2. 返回不区分大小写的 **子字符串** 匹配。
这样可以防止像 `apt1` 这样的精确查询拖累 `apt11` / `apt28`,而像 `apt` 这样的宽松查询仍然可以 fallback 到子字符串匹配。描述信息永远不会被搜索。
### `search_galaxy_clusters_by_meta(key, value, galaxy_type=None, limit=50)`
通过 `values[].meta` 下的任意元数据键值对搜索集群,仅使用 **不区分大小写的精确匹配**(无子字符串fallback)。对于列表或嵌套元数据,任何元素的匹配都算数。
```
search_galaxy_clusters_by_meta("synonyms", "Sofacy") -> APT28
search_galaxy_clusters_by_meta("country", "RU") -> 所有俄罗斯威胁演员
search_galaxy_clusters_by_meta("cfr-suspected-victims", "Germany")
```
### `list_galaxies(galaxy_type=None)`
发现助手。如果没有参数,则返回每个星系(`galaxy_type`、`galaxy_name`、`cluster_count`),以便您知道要传递什么作为 `galaxy_type`。如果有 `galaxy_type`,它还会返回该星系集群上存在的 `meta_keys` —— 即您可以传递给 `search_galaxy_clusters_by_meta` 的键。
### 结果形状
两个搜索工具都返回:
```json
{
"query": "apt28",
"galaxy_type": null,
"match_mode": "exact",
"count": 1,
"truncated": false,
"results": [
{
"tag": "misp-galaxy:threat-actor=\"APT28\"",
"galaxy_type": "threat-actor",
"value": "APT28",
"uuid": "5b4ee3ea-eee3-4c8e-8323-85ae32658754"
}
]
}
```
`match_mode` 是 `"exact"`、`"substring"` 或 `"none"`。当存在比 `limit` 更多匹配时,`truncated` 为 `true`。
## 安装
```bash
git clone --recurse-submodules git@github.com:MISP/misp-galaxy-mcp.git
cd misp-galaxy-mcp
# 如果您已经克隆但没有使用 --recurse-submodules:
git submodule update --init --recursive
pip install -e . # 或:uv pip install -e .
```
MISP-galaxy 数据位于 `MISP-galaxy/` 子模块中。要拉取新的星系数据,请更新子模块并重启服务器:
```bash
git submodule update --remote MISP-galaxy
```
默认情况下,服务器读取 `MISP-galaxy/clusters/`。如果您的检出位于其他位置,请使用环境变量 `MISP_GALAXY_PATH` 进行覆盖。
## 运行
```bash
misp-galaxy-mcp # stdio 传输
```
### MCP 客户端配置(Claude Desktop / Claude Code)
```json
{
"mcpServers": {
"misp-galaxy": {
"command": "uv",
"args": ["run", "--directory", "/path/to/misp-galaxy-mcp", "misp-galaxy-mcp"]
}
}
}
```
(或 `"command": "misp-galaxy-mcp"`,一旦它安装在您的 `PATH` 上)。
## 测试
```bash
pip install -e ".[dev]"
pytest
```
测试运行在 `tests/fixtures/` 中的小型合成fixtures上,因此它们不依赖于子模块。
## 许可证
MIT — 请参阅 [LICENSE](LICENSE)。