// config file
config.yaml
Extensions live under extensions in ~/.config/goose/config.yaml. goose configure → Add Extension writes the same kind of entry for you.
For Goose users
Goose does its work through extensions, and every extension is an MCP server. Maguyva is the one that indexes your codebase, so Goose asks where things are instead of listing directories.
Free tier: 3 repos, 50K indexed lines, no card.
Use .goosehints for how to work. Use Maguyva for what the code says now. Four facts specific to Goose.
// config file
Extensions live under extensions in ~/.config/goose/config.yaml. goose configure → Add Extension writes the same kind of entry for you.
// transport
Maguyva is a streamable_http extension, so Goose connects to the endpoint itself: no local process, no Node.js. The URL goes in uri, not url.
// key
Goose sends the headers map with every request, so the key goes in the Authorization header. Goose can also fill it from an environment variable listed under env_keys.
// tool filter
An extension can expose a subset of its tools: list the ones you want under available_tools, or leave it empty for all of them.
# .goosehints
- Use pnpm, not npm.
- Run the integration tests before you call a change done.Goose loads AGENTS.md and .goosehints by default: global hints from ~/.config/goose/.goosehints, project hints from the repo, and nested files as it works in subfolders. Hints need the Developer extension. They are the right place for:
Hints describe the project. They do not answer “what depends on this?”
Three gaps Goose fills with shell commands, one file at a time.
On an unfamiliar repo, Goose orients with directory listings and file reads. Each one spends context before the task starts.
A text search cannot tell a real call from a comment, a mock, or a method with the same name.
A hints file written last quarter describes last quarter’s layout. Goose follows it anyway.
One extensions entry gives Goose:
Hints tell Goose how to work.
Maguyva gives Goose a map of the code.
Map first, then let Goose run.
// workflow 01
goose> why do some exports finish with zero rows? semantic_search("export job empty result") src/export/runner.ts:118 flushBatch() src/export/filters.ts:40 applyTenantFilter() → Goose reads two files, not the whole export package. [exit 0]
Ranked results narrow the search before Goose opens a shell.
// workflow 02
goose> split the Notifier class into email and SMS dependency_search("Notifier", dependents) 11 references across 5 packages → The plan covers all eleven before the first edit. [exit 0]
Goose gets the full dependent list in one call instead of a chain of greps.
Three steps. Free tier: 3 repos, 50K indexed lines, no card.
// step 01
Pick one you already know, so you can grade the answers.
// step 02
~/.config/goose/config.yaml
extensions:
maguyva:
name: maguyva
type: streamable_http
uri: https://maguyva.tools/mcp
enabled: true
headers:
Authorization: Bearer mgv_xxxx
timeout: 300
// step 03
Swap mgv_xxxx for your API key, run goose session, and ask one question whose answer you already know. YAML is indentation-sensitive: use spaces, not tabs.