You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(skills): support MCP-served Agent Skills per the skills-over-MCP SEP
Implements the host side of the pre-submission SEP draft at
modelcontextprotocol/experimental-ext-skills#69 ("io.modelcontextprotocol/skills")
so that skills served by connected MCP servers are discovered, surfaced in
the model's context, and loaded on demand through Goose's existing
skills pipeline — identical treatment to filesystem-based skills.
Discovery
- New crates/goose/src/agents/platform_extensions/mcp_skills.rs reads each
connected server's skill://index.json at extension-connect time (5s
timeout, graceful on failure) and caches concrete skill entries on the
owning Extension. Scheme-agnostic: index entries MAY use any URI scheme
per the SEP, so the cache stores whatever the index gave us.
- Capability declaration (capabilities.extensions["io.modelcontextprotocol/skills"])
is recognized via rmcp's typed ExtensionCapabilities but not gated on —
direct resource/read of skill://index.json always runs.
Dynamic instructions
- New McpClientTrait::get_dynamic_instructions hook, queried per-turn from
ExtensionManager::get_extensions_info. SkillsClient implements it to
render an MCP-skills section alongside the existing FS list, with
<server>__<name> disambiguation on name collisions.
Loading
- load_skill now routes to MCP skills by name (or <server>__<name>), with
supporting-file composition against the cached base_uri. URI-shaped
inputs are rejected with a redirect hint pointing at read_resource
(which already exists on the extensionmanager platform extension).
Hardening
- developer/edit.rs: added reject_uri_path guard on file_read, file_write,
and file_edit so the model can't accidentally Path()-resolve a URI
(a documented pitfall from fast-agent's SEP host implementation).
- Sharpened extensionmanager's read_resource tool description to steer
the model toward load_skill for named skills.
API / UI
- SlashCommand gains an optional `origin` field identifying MCP-served
skills; /config/slash_commands accepts an optional session_id to
include that session's MCP skills. SkillsView renders a "MCP · <server>"
pill on MCP-origin entries.
Security (per SEP)
- MCP skill content is treated as untrusted model input. Only `name` and
`description` are parsed from frontmatter; no hook / pre-post / shell
fields are honored.
Tests
- 13 new unit tests: MCP index discovery (6), load_skill MCP routing (5),
URI rejection in developer tools (2).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
"'{}' is an MCP resource URI, not a filesystem path. Use the read_resource tool (it takes server + uri) for raw URIs, or load_skill for named skills.",
0 commit comments