Image generation in Goose: MCP extension setup
Goose calls MCP servers extensions: run goose configure → Add Extension → Remote Extension (Streamable HTTP), or add a streamable_http block to ~/.config/goose/config.yaml. Goose runs long autonomous sessions, which is exactly where missing images hurt most — it will happily finish a twenty-step build and leave every asset as a TODO. The extension turns those into steps it can actually complete.
Add the server
- Where the config lives
- ~/.config/goose/config.yaml
- The key it nests under
- extensions
- 1
Create an API key. Create a key in the imagemcpserver dashboard.
- 2
Run goose configure. Choose Add Extension, then Remote Extension (Streamable HTTP).
- 3
Enter the URI and header. Give it a name, the endpoint as the URI, and the key as an x-api-key header.
- 4
Or edit config.yaml. The wizard writes ~/.config/goose/config.yaml — the same block can be written by hand.
# ~/.config/goose/config.yaml
extensions:
imagemcp:
enabled: true
type: streamable_http
name: imagemcp
uri: https://mcp.imagemcpserver.com/mcp
headers:
x-api-key: sk-img-gen-…
timeout: 300$ goose configure
┌ Add Extension
│
◆ What type of extension would you like to add?
│ ○ Built-in Extension
│ ○ Command-line Extension
│ ● Remote Extension (Streamable HTTP)
│
◇ Extension name imagemcp
◇ URI https://mcp.imagemcpserver.com/mcp
◇ Add a header? x-api-key: sk-img-gen-…
└ Added imagemcpuri, not url — and an underscore, not a hyphen
Goose disagrees with the rest of this list twice in the same three lines. The endpoint goes in uri where everyone else uses url, and the transport is streamable_http with an underscore where Roo and Kilo want streamable-http with a hyphen and VS Code just says http. It is also YAML rather than JSON, so indentation is load-bearing.
The endpoint and the key are identical in every client. The wrapper around them is not, and that wrapper is where almost every “correct” config that does nothing goes wrong. Checked September 2026 against Goose’s own documentation — see the sources below.
Three ways to send the key
The server resolves your API key from any of these, checked in this order. That matters when a client only gives you a URL field and no way to set a header — you are not stuck, and you do not need a bridge process.
Query parameter
?apikey=sk-img-gen-…Checked first. The fallback for a client whose config is a bare URL field.
x-api-key header
x-api-key: sk-img-gen-…The documented default, and what every client below uses unless noted.
Authorization header
Authorization: Bearer sk-img-gen-…Accepted as a bearer token, which is what a client with only a token field will send.
A key in a query string ends up in shell history, process listings and any log the client keeps, so prefer a header where the client allows one. Where it does not, treat the whole URL as the secret and rotate it as freely as you would a password.
What each tool costs
Wherever Goose lets you approve tools individually, the useful line to draw is not between image tools and other tools — it is between calls with a fixed price and calls that route to a model.
get_user_infolist_modelsfree
Safe to auto-approve wherever the client supports it. These are how the agent finds out what it can afford before it spends anything.
compress_imageconvert_format1 credit
Deterministic and cheap. Auto-approving these makes an optimisation pass over a whole folder painless.
remove_backgroundtext_to_svgupscale_image5–15 credits
Fixed prices, no model routing. Auto-approve once you trust the workflow.
generate_imageedit_imagegenerate_transparent_imagemulticallmodel-priced
These route to an image model and are the ones that can run up a bill in a loop. Keep approval on.
Goose questions
How do I add a remote MCP server to Goose?
goose configure → Add Extension → Remote Extension (Streamable HTTP), then supply a name, the URI and any headers. Editing ~/.config/goose/config.yaml directly produces exactly the same result.
Why does Goose reject my url field?
Goose uses uri, not url, for remote extensions. It is the single most common transcription error when moving a config in from another client. Checked September 2026.
Is it streamable_http or streamable-http?
In Goose, streamable_http with an underscore. Roo Code and Kilo Code use a hyphen, and VS Code uses plain http. The transport is identical; only the spelling differs.
Goose runs autonomously — how do I keep costs down?
Two things. Tell it the budget in your goosehints, and lean on the fact that the cheap tools are genuinely cheap: format conversion and compression cost a single credit, so an optimisation pass over a whole folder is not where the money goes. Generation is.
Can I limit which image tools Goose sees?
Yes — extensions can be enabled and disabled individually in config.yaml, so you can keep the image extension switched off for sessions that have no business making pictures.
Sources & references