diff --git a/docs/turn-loop/mcp.md b/docs/turn-loop/mcp.md index 0ea3378f..06446a7c 100644 --- a/docs/turn-loop/mcp.md +++ b/docs/turn-loop/mcp.md @@ -206,7 +206,10 @@ status hint moved to the wake prompt + UI header. ## Tool whitelist (`mcp_config::ALLOWED_BUILTIN_TOOLS`) -- Allowed built-ins: `Edit`, `Glob`, `Grep`, `Read`, `Write`. +- Allowed built-ins: `Edit`, `Glob`, `Grep`, `Read`, `Skill`, `Write`. + `Skill` is what makes an installed plugin's `SKILL.md` invokable — + without it, a skill's `description` frontmatter never gets seen by + the model no matter how well it matches the task. - Tool-group-gated built-ins: `WebFetch`, `WebSearch` (added when the `web_tools` tool group is enabled — see P3RM1SS10NS tab). - Denied by omission (absent from the harness `--tools` / diff --git a/hive-agent/src/mcp_config.rs b/hive-agent/src/mcp_config.rs index 15476d87..2f4820c7 100644 --- a/hive-agent/src/mcp_config.rs +++ b/hive-agent/src/mcp_config.rs @@ -22,13 +22,17 @@ pub const DEFAULT_MCP_HTTP_PORT: u16 = 8790; /// in this list (or added by `extra_builtin_tools`) literally doesn't /// exist in the session. Web egress (`WebFetch`/`WebSearch`) are /// tool-group-gated (`web_tools`) — off by default. Nested agents -/// (`Task`) are intentionally omitted. `Bash` is disallowed — shell +/// (`Task`/`Agent`) are intentionally omitted. `Bash` is disallowed — shell /// execution goes through `mcp__bash__run` (background tasks /// with structured output via `hive-bash-mcp`) instead of a raw interactive shell. `TodoWrite` /// is omitted because the todo list lives in claude's in-process session /// state and silently evaporates on /compact or session reset — agents -/// should plan in /state notes instead. -pub const ALLOWED_BUILTIN_TOOLS: &[&str] = &["Edit", "Glob", "Grep", "Read", "Write"]; +/// should plan in /state notes instead. `Skill` is included so installed +/// plugin skills (`base@hyperhive` and friends) are actually invokable — +/// without it here, every `SKILL.md`'s `description` frontmatter is inert: +/// the model never sees the tool that triggers a skill, no matter how well +/// it matches the task at hand. +pub const ALLOWED_BUILTIN_TOOLS: &[&str] = &["Edit", "Glob", "Grep", "Read", "Skill", "Write"]; /// Env var written by the meta renderer with a comma-separated list of /// `hive_sh4re::ToolGroup` `snake_case` names (e.g. `"messaging,inbox,meta"`).