Goose MCP extension not starting, not connecting, or not used: the fixes
By Jake Marsh, who builds Taskhold. Updated 2026-11-11. Facts about other tools checked 2026-11-11. 5 min read.
Short answer: Goose keeps extensions in ~/.config/goose/config.yaml. An extension only runs when enabled: true, and one Goose turns on mid-session is gone next session. "Could not run extension command" means the package runner (npx or uvx) is missing or blocked. Remote extensions sign in with OAuth on their own unless the server needs a pre-registered client.
You added an MCP server to Goose as an extension and it doesn't work: it fails to start, it's off again in the next session, or its sign-in never finishes. Goose names MCP servers extensions and has its own config file, its own package runners and a malware check, so the fixes differ from other clients'.
The last section covers Taskhold's extension, which feeds the live board where Goose's tasks, steps and questions show up. Setup is on the Goose page.
Check the entry in config.yaml
Goose Desktop's Extensions page and goose configure both write to ~/.config/goose/config.yaml (on macOS and Linux). Open it to see what Goose has loaded:
extensions:
github:
name: GitHub
type: stdio
cmd: npx
args: [-y, "@modelcontextprotocol/server-github"]
envs: { "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>" }
enabled: true
timeout: 300
remote-example:
name: Remote Example
type: streamable_http
uri: https://example.com/mcp
enabled: true
timeout: 300- enabled: false keeps the extension and stops it loading. In the CLI, goose configure lists extensions and the space bar toggles each one.
- Extensions Goose turns on by itself during a session, when a request needs one, stay on for that session only. Enable it in settings or config.yaml to keep it.
- goose session --with-builtin developer starts a session with a built-in extension on, again for that session only.
"Could not run extension command"
Failed to start extension ... Could not run extension command ... No such file or directory means Goose couldn't launch cmd. Most local extensions run through a package runner, npx for Node packages and uvx for Python ones, so check that Node.js or uv is installed and that the command runs in a terminal.
- Goose Desktop uses its own packaged npx and uvx, which download their runtimes through Hermit. On a corporate, offline or firewalled network those downloads fail. Goose's workaround: symlink your own runner under another name (for example runnpx) and use that name as cmd.
- On Windows, "Node.js installer script not found" means Goose expects Node.js in C:\Program Files\nodejs\. If where.exe node shows another folder, link that folder to the expected path and restart Goose.
- "Blocked malicious package" means Goose's OSV check found malware in an npx or uvx package the extension uses. Use another extension; report a false positive to Goose.
Remote extensions and sign-in
- A streamable_http extension that needs OAuth gets its client ID on its own, through Client ID Metadata Documents or Dynamic Client Registration, and Goose opens the sign-in in your browser.
- A server that supports neither needs client_id (and client_secret_key for confidential clients) on the extension. The secret itself stays out of the file: client_secret_key names an env or secret-store key.
- Goose serves the OAuth callback on 127.0.0.1 with a random port. For a server that only allows one fixed redirect URI, set GOOSE_OAUTH_CALLBACK_PORT.
- Install links use goose://extension?url=<encoded url>&type=streamable_http&id=...&name=... ; every parameter must be URL-encoded.
Calls that time out
timeout is how long Goose waits for a tool call from that extension, in seconds. A long-running tool on a low value fails partway; raise it in config.yaml or the extension's settings in Goose Desktop, then start a new session.
Collect diagnostics
Goose bundles system info, config, session data and recent logs into one JSON file. In Goose Desktop, click the bug icon in the chat toolbar during a session. In the CLI, run goose session list for the session ID, then goose session diagnostics --session-id <id>. Read it, or attach it to a bug report, after removing any keys.
Taskhold-specific checks
Taskhold is a remote extension at https://taskhold.com/api/mcp. When its tools don't show up in Goose, check these in order:
- The extension is type streamable_http with uri set to exactly https://taskhold.com/api/mcp, enabled: true, and no Authorization header. Goose then signs in in your browser, with no sign-up first: the first time Goose uses Taskhold it gives you the link to start the 7-day trial. The Add to Goose button on the Goose page writes this entry for you.
- If you set an Authorization header with an atd_sk_ key instead, the key reaches Taskhold only if TASKHOLD_API_KEY is listed under env_keys. Taskhold's 401 names the cause: missing_key, bad_header, not_a_taskhold_key or unknown_key.
- Start a new session after any change, then ask Goose to call the taskhold list tool. Settings in Taskhold shows the connection once the first call arrives.
With the extension on and the workflow from the Goose page in your instructions, every task Goose starts, its steps and its questions show on the live board next to your other agents. More clients: MCP server not connecting, fixes for every client.
Answer your coding agents from anywhere.
$12/month or $120/year after the trial. Card up front. Cancel before day 7 and you pay nothing. Every agent you run is included.
Or connect your agent first, no sign-up: add https://taskhold.com/api/mcp as an MCP server. The first time it uses Taskhold, it gives you the trial link.
Questions
- Where is Goose's config file?
- ~/.config/goose/config.yaml on macOS and Linux. Extensions live under the extensions key; Goose Desktop's Extensions page and goose configure edit the same file.
- Why does my Goose extension turn off between sessions?
- Extensions Goose enables on its own during a session, and ones started with --with-builtin, last for that session only. Set enabled: true in config.yaml or turn the extension on in settings to keep it.
- What does "Could not run extension command" mean in Goose?
- Goose couldn't launch the extension's command, usually because npx or uvx isn't installed, or Goose's own runners can't download their runtimes on a restricted network.
Sources
- Goose docs: using extensions (config.yaml, deeplinks, OAuth clients, enabling, sessions), checked 2026-11-11
- Goose docs: known issues (package runners, Windows Node.js, malicious packages, airgapped networks), checked 2026-11-11
- Goose docs: diagnostics and reporting, checked 2026-11-11
Related
Updated 2026-11-11. Something wrong or out of date? Email hello@greatwork.company.