ACP+ Extension Schema for Goose #9562
lifeizhou-ap
started this conversation in
General
Replies: 1 comment
|
This sounds great. It's a good mix of following the protocol and keeping goose-custom functionality. |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Problem
ACP
newSessioncurrently supportsmcpServers, but Goose extensions are broader than MCP servers. Goose also has builtin extensions, platform extensions, inline Python extensions, and frontend-provided tools.Using only
mcpServersis lossy for Goose-aware clients because it cannot represent those other extension types or Goose-specific config such as display metadata, default enabled state, and secret-backed environment variables.This proposal adds a Goose-specific extension schema for ACP while keeping
mcpServersas the compatibility path for generic ACP clients.Goals
mcpServersunchanged.New Session
Goose-aware clients can pass an explicit extension set through
_meta.extensions.{ "cwd": "/repo", "mcpServers": [], "_meta": { "extensions": [ { "type": "builtin", "name": "developer" }, { "type": "mcp", "server": { "type": "stdio", "name": "github", "command": "github-mcp-server", "args": ["stdio"] }, "envKeys": ["GITHUB_TOKEN"] }, { "type": "inline_python", "name": "python-tools", "code": "..." } ] } }Recommended precedence:
Presence should be based on the field existing, not on the list being non-empty. This allows a client to explicitly request an empty extension set:
{ "_meta": { "extensions": [] } }At the API level,
_meta.extensionsmeans the client supplied the explicit extension set.Custom Methods
Available Extensions
Returns Goose-owned extension definitions that this server can offer. For the first version this returns builtin and platform extensions only.
Persistent Config
Persistent config controls which extensions future sessions use by default.
AddConfigExtensionRequestis an upsert for user-authored extension configs.SetConfigExtensionEnabledRequestupdates only the enabled default and is the supported way to enable or disable server-owned definitions such as builtin and platform extensions.Session Extensions
Session extension APIs operate on the active extension set for one session.
Session enabled state is represented by membership in the active extension set:
Shared Types
GooseExtensionis the extension definition.GooseExtensionEntrywraps a definition with persistent config state.Notes
MCP Wrapper
The MCP variant wraps ACP
McpServerinstead of duplicating stdio/http transport schemas:{ "type": "mcp", "server": { "type": "stdio", "name": "github", "command": "github-mcp-server" } }envKeysis Goose-specific and supports the desktop flow where secret values are stored separately and only environment variable names are persisted in extension config. ACPMcpServercan carry literal environment values, but it does not represent Goose secret references.Tool Filtering
Goose core has an
available_toolsallowlist for tool filtering, but this ACP extension lifecycle schema intentionally does not expose it. The desktop UI does not currently edit this field, and extensions created through this ACP schema should default to all tools available.Ownership and Editing
Server-owned definitions:
builtinplatformFor these extensions, the server owns identity and implementation metadata. Clients should not edit those fields. Clients may still enable or disable them as user preferences through
config/extensions/set-enabled.User-authored extension configs:
mcpinline_pythonfrontend, if persistent frontend extensions are supportedThese can be added and updated through
config/extensions/add.Recommended public operation rules:
The server should enforce these rules. Client-side checks are only UX.
All reactions