feat(mcp): allowlist EXTRA merges with default; add Trilium keys to default

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-05-12 17:39:14 +08:00
parent d16791fb7d
commit 48d5e468e6
6 changed files with 97 additions and 10 deletions

View file

@ -232,8 +232,13 @@
- 生效:`oclaw/tools/mcp/adapter.py`
- `AIA_MCP_ENV_ALLOWLIST`
- 默认:内置 allowlist(Brave/Google/GitHub/Context7/DashScope)
- 作用:MCP 子进程可透传环境变量白名单
- 默认:未设置时使用内置 allowlist(Brave/Google/GitHub/Context7/DashScope、Trilium MCP 等,见 `mcp_env._DEFAULT_ALLOWLIST`)
- 作用:若**非空**,则整表替换内置默认(仅列出的名可传入 MCP 子进程);用于刻意缩小暴露面
- 生效:`oclaw/runtime/operations/mcp_env.py`
- `AIA_MCP_ENV_ALLOWLIST_EXTRA`(兼容 `OPS_MCP_ENV_ALLOWLIST_EXTRA`)
- 默认:空
- 作用:在「当前主列表」(内置默认,或 `AIA_MCP_ENV_ALLOWLIST` 替换后的列表)之后**追加**变量名,合并去重;新增第三方 MCP 时优先用此项,无需手抄整份默认名单
- 生效:`oclaw/runtime/operations/mcp_env.py`
- `AIA_MCP_FILESYSTEM_EXTRA_ROOTS`

View file

@ -64,8 +64,11 @@
- `AIA_IMAGE_EXPERT_REQUEST_EXTRA`:图片专家顶层 JSON;旧名 **`AIA_LEGACY_IMAGE_REQUEST_EXTRA`** 仍作别名可读。
- `DASHSCOPE_IMAGE_*`(零散变量):由 `image_legacy_client` 映射为请求体顶层字段。
- **`AIA_OCR_*`**(四项):仅存 **`query_image_attachment` / OCR 降级** 链路;已与图片专家链路拆分。
- `AIA_MCP_ENV_ALLOWLIST_EXTRA`(兼容 `OPS_MCP_ENV_ALLOWLIST_EXTRA`):在默认主表或 `AIA_MCP_ENV_ALLOWLIST` 替换表之后追加 MCP 子进程可透传的变量名,合并去重,避免为单个 MCP 手抄整份默认名单。
- 内置 MCP 环境透传默认名单增加 `TRILIUM_API_URL`、`TRILIUM_API_TOKEN`、`PERMISSIONS`、`VERBOSE`([triliumnext-mcp](https://github.com/tan-yong-sheng/triliumnext-mcp))。
### Changed
- `mcp_env.mcp_env_allowlist_keys()`:除「`AIA_MCP_ENV_ALLOWLIST` 非空则整表替换内置默认」外,`EXTRA` 始终追加到当前主表之后。
- `send_ocr_image_messages` 未配 `AIA_OCR_MODEL`(且未传 `model`)失败;图片专家 **`send_legacy_image_messages`** 首选 **用户所选会话/专家绑定的模型的 `model`/`base_url`/`api_key`**,缺省时再回落 **`AIA_IMAGE_EXPERT_*`**(不读取 `AIA_OCR_*`);服务端若模型不支持看图则直接报错,不做备用 payload。
### Removed(OCR 通道)

View file

@ -505,13 +505,13 @@ Keep responses deterministic and JSON-serializable.
- **作用**:按库名/版本拉取较新的官方文档片段,减少「API 记错版本」类幻觉。
- **安装**:`python scripts/install_mcp_context7.py`,或管理台 `POST /admin/api/mcp/install` 使用 [`examples/mcp_install_context7.json`](../examples/mcp_install_context7.json) 中的 `payload`。
- **密钥**:在 **`oclaw/_local/mcp_local.env`**(推荐)或 `data/mcp_local.env`(兼容)设置 `CONTEXT7_API_KEY`(见 [context7.com/dashboard](https://context7.com/dashboard))。两处都存在时**同键以 `oclaw/_local/mcp_local.env` 为准**(覆盖 `data` 中的同键)。未自定义 `OPS_MCP_ENV_ALLOWLIST` 时,网关默认 allowlist 已包含 `CONTEXT7_API_KEY`(见 `oclaw/runtime/operations/mcp_env.py`);若你自定义了 allowlist,请手动追加该键。
- **密钥**:在 **`oclaw/_local/mcp_local.env`**(推荐)或 `data/mcp_local.env`(兼容)设置 `CONTEXT7_API_KEY`(见 [context7.com/dashboard](https://context7.com/dashboard))。两处都存在时**同键以 `oclaw/_local/mcp_local.env` 为准**(覆盖 `data` 中的同键)。内置默认 allowlist 已包含 `CONTEXT7_API_KEY`(见 `oclaw/runtime/operations/mcp_env.py`);若你用 **`AIA_MCP_ENV_ALLOWLIST` 整表替换**默认,须在该列表里显式保留 `CONTEXT7_API_KEY`,或改用 **`AIA_MCP_ENV_ALLOWLIST_EXTRA`** 只追加新变量名而不动默认集合。
- **装完后**:`Health` → `Sync Tools` → 将 `mcp-context7` 加入通识 specialist 的 MCP 绑定(若脚本已成功 Sync,会自动追加)。
### Bailian WebSearch(DashScope)
- **密钥**:在 `oclaw/_local/mcp_local.env`(推荐)设置 `DASHSCOPE_API_KEY=...`。
- **关键注意**:如果你自定义了 `AIA_MCP_ENV_ALLOWLIST` / `OPS_MCP_ENV_ALLOWLIST`,必须显式包含 `DASHSCOPE_API_KEY`,否则 MCP 子进程拿不到该密钥,常见表现是:
- **关键注意**:若使用 **`AIA_MCP_ENV_ALLOWLIST` 整表替换**内置默认,须在该列表里显式包含 `DASHSCOPE_API_KEY`,否则 MCP 子进程拿不到该密钥。更省事的做法是:**不要设置** `AIA_MCP_ENV_ALLOWLIST`,只在 **`AIA_MCP_ENV_ALLOWLIST_EXTRA`** 里追加其它 MCP 需要的变量名(与默认名单自动合并)。常见表现是:
- `error_code: mcp_runtime_empty_response`
- `error: empty_response`
- **排查顺序**: