omichelbraga/esentire-atlas-mcp
GitHub: omichelbraga/esentire-atlas-mcp
面向 eSentire Atlas API 的 MCP 服务器,将安全发现、工单管理、漏洞扫描和威胁情报查询封装为可供远程 MCP 客户端调用的标准化工具。
Stars: 0 | Forks: 0
# eSentire Atlas MCP Server
一个 MCP server,将 eSentire **Atlas API**(Findings、Ticketing、MVS)和
**Threat Intelligence** 数据源(IP Watch、Advanced/STIX)作为工具公开。
专为 HTTP 传输构建,因此它可以作为容器在反向代理后运行,并供远程 MCP 客户端调用。
## 凭据
Atlas 颁发**四种不同的凭据类型**,且它们**不可互换** —— 提供错误的类型将返回 `402`/`403`:
| Atlas 凭据类型 | 环境变量 | 涵盖范围 |
|---|---|---|
| `Atlas` | `ATLAS_API_TOKEN` | `/finding`, `/tickets`, `/mvs` — 读取**和**写入 |
| `Atlas Readonly` | `ATLAS_API_TOKEN` | 相同路径,仅限读取 |
| `Threat Intelligence` | `ESENTIRE_TI_TOKEN` | `/ti/ipwatch`, `/ti/indicators` |
| `GenAI` | — | 未实现(未公开的端点) |
在 **Atlas → Settings → New API Credentials** 中创建它们。选择
**Authentication: Token** —— 静态 token 流程是 Atlas API
参考指南中所记录的流程。可选地,为您的 Docker 主机的出口地址添加 IP 限制。
## 配置
| 变量 | 默认值 | 用途 |
|---|---|---|
| `ATLAS_API_TOKEN` | — | Atlas 凭据(Findings / Ticketing / MVS) |
| `ESENTIRE_TI_TOKEN` | — | Threat Intelligence 凭据 |
| `ESENTIRE_API_BASE` | `https://api.esentire.com` | API 根路径 |
| `ESENTIRE_CUSTOMER_CODE` | — | 默认租户代码,以便调用方可以省略它 |
| `ESENTIRE_ENABLED_SURFACES` | `findings,tickets,ti,mvs` | 逗号分隔列表;如果未授权请移除 `mvs` |
| `ESENTIRE_READ_ONLY` | `false` | `1` 将直接拒绝所有修改性调用 |
| `MCP_TRANSPORT` | `http` | `http` 或 `stdio` |
| `MCP_HOST` / `MCP_PORT` | `0.0.0.0` / `3000` | 绑定地址 |
| `MCP_PUBLIC_URL` | — | 外部 URL;OAuth 所必需 |
| `MCP_AUTH` | `none` | `none` \| `bearer` \| `oauth`/`azure` \| `github` |
| `MCP_BEARER_TOKEN` | — | 当 `MCP_AUTH=bearer` 时的共享密钥 |
| `AZURE_TENANT_ID` / `AZURE_CLIENT_ID` / `AZURE_CLIENT_SECRET` | — | 用于 `MCP_AUTH=oauth` 的 Entra 应用 |
| `TI_CACHE_TTL` | `3600` | 秒。与数据源的小时刷新率相匹配 |
| `MAX_RESPONSE_CHARS` | `40000` | 单个工具响应上限 |
| `LOG_LEVEL` | `info` | |
`MCP_AUTH` 是**前门** —— MCP 客户端如何对此服务器进行身份验证。
它与 eSentire token 无关,后者用于此服务器向上游进行身份验证。
## 工具
**Findings** — `findings_search`, `findings_search_advanced`, `finding_update`
**Ticketing** — `tickets_case_type_configs`, `tickets_list_cases`,
`tickets_get_case`, `tickets_create_case`, `tickets_update_case`,
`tickets_list_comments`, `tickets_list_emails`, `tickets_list_attachments`,
`tickets_get_attachment_link`, `tickets_upload_attachment`,
`tickets_delete_attachment`, `tickets_list_contacts`, `tickets_list_locations`
**Threat Intelligence** — `ti_ipwatch`, `ti_check_ip`, `ti_indicators`,
`ti_indicators_paged`, `ti_indicators_misp`
**MVS** — `mvs_list_assets`, `mvs_get_asset`,
`mvs_asset_details`, `mvs_get_asset_vulnerability`, `mvs_list_vulnerabilities`,
`mvs_get_vulnerability`, `mvs_list_missing_patches`, `mvs_assets_affected_by`
### 设计说明
- **Filter 是原生对象。** Atlas 需要为 `query`、`sorts` 和 `filters` 提供 URL 编码的 JSON。
请传入真实的列表/字典;编码会在内部处理。
- **`assignee_email` 意味着 `use_v2`。** 除非 V2 查询引擎处于活动状态,否则 Atlas 会默默忽略 assignee filter,因此 `findings_search` 会自动为您启用它,而不是悄悄返回错误的结果。
- **STIX 默认会被展平。** `ti_indicators` 会将 bundle 精简为简洁的 indicator/observable 列表。传入 `summarize=False` 可获取原始的 STIX 2.1。
- **当编码后的 filter payload 长到可能突破 query-string 限制时,MVS 会自动切换 GET → POST**。
- **MVS 需要单独授权。** 它的工具默认会被注册,但如果您的账户未开通该服务,它们会返回“token 类型错误/未授权”的消息。从 `ESENTIRE_ENABLED_SURFACES` 中移除 `mvs` 即可隐藏它们。
- **`page` 和 `per_page` 在 `/finding/findings` 中是必需的。** 这在 Atlas 指南中未记录,但如果缺少它们,Atlas 将返回 `400 Missing required query parameter`,因此 `findings_search` 总是会发送这两个参数(默认值为 1 / 50)。
- **Findings 和 MVS 使用不同的封装结构。** Findings 返回
`{count, items, total_count}`;MVS 返回 `{data, paging}`。
- **`401` 的响应体会被原样展示。** `" is not authorized"`
意味着 token 有效但未订阅该服务;而简单的
`"Unauthorized"` 则意味着 token 本身被拒绝了。这两者的解决方法截然不同。
- **尾部斜杠会被去除。** 如果 URL 以 `/` 结尾,Atlas 会返回 `404`。
- **Token 以原始形式发送**,在 `Authorization` 头中 —— 没有 `Bearer` 前缀。
- **`/health` 不会调用上游。** token 过期或 eSentire 服务中断绝不能导致 Docker 陷入重启循环,从而影响一个原本健康的容器。
## 本地开发
```
uv venv --python 3.12
uv pip install -e .
MCP_TRANSPORT=stdio ATLAS_API_TOKEN=... uv run python -m esentire_mcp
```
## 部署
作为 Portainer stack 部署,直接在 Docker 主机上构建此代码库 —— 参见 `docker-compose.yml`。不需要本地 Docker 或镜像仓库。
## 安全
`tickets_create_case` 会向 **eSentire 的 SOC 提交真实的支持工单**。在调用它之前请先与人工确认。冒烟测试请使用 `case_type: "Atlas API Test"`。已关闭的工单永远无法重新打开;已解决的工单则可以 —— 优先选择“解决”。设置 `ESENTIRE_READ_ONLY=1` 可禁用所有修改操作。
标签:API集成, MCP服务, 可观测性, 威胁情报, 安全运营, 工单管理, 开发者工具, 扫描框架, 请求拦截, 逆向工具