# Table of Contents - [Getting Started | codename goose](#getting-started-codename-goose) - [Tutorials | codename goose](#tutorials-codename-goose) - [Install Goose | codename goose](#install-goose-codename-goose) - [Guides | codename goose](#guides-codename-goose) - [Using Extensions | codename goose](#using-extensions-codename-goose) - [Troubleshooting | codename goose](#troubleshooting-codename-goose) - [Quickstart | codename goose](#quickstart-codename-goose) - [Configure LLM Provider | codename goose](#configure-llm-provider-codename-goose) - [Architecture Overview | codename goose](#architecture-overview-codename-goose) - [Building Custom Extensions | codename goose](#building-custom-extensions-codename-goose) - [Asana Extension | codename goose](#asana-extension-codename-goose) - [Providing Hints to Goose | codename goose](#providing-hints-to-goose-codename-goose) - [AgentQL Extension | codename goose](#agentql-extension-codename-goose) - [Set LLM Rate Limits | codename goose](#set-llm-rate-limits-codename-goose) - [Blender Extension | codename goose](#blender-extension-codename-goose) - [CI/CD Environments | codename goose](#ci-cd-environments-codename-goose) - [Error Handling | codename goose](#error-handling-codename-goose) - [Computer Controller Extension | codename goose](#computer-controller-extension-codename-goose) - [Developer Extension | codename goose](#developer-extension-codename-goose) - [Managing Goose Sessions | codename goose](#managing-goose-sessions-codename-goose) - [Fetch Extension | codename goose](#fetch-extension-codename-goose) - [Figma Extension | codename goose](#figma-extension-codename-goose) - [Updating Goose | codename goose](#updating-goose-codename-goose) - [Filesystem Extension | codename goose](#filesystem-extension-codename-goose) - [Google Drive Extension | codename goose](#google-drive-extension-codename-goose) - [GitHub Extension | codename goose](#github-extension-codename-goose) - [Goose Architecture | codename goose](#goose-architecture-codename-goose) - [Google Maps Extension | codename goose](#google-maps-extension-codename-goose) - [JetBrains Extension | codename goose](#jetbrains-extension-codename-goose) - [Goose Permission Modes | codename goose](#goose-permission-modes-codename-goose) - [Extensions Design | codename goose](#extensions-design-codename-goose) - [Knowledge Graph Memory Extension | codename goose](#knowledge-graph-memory-extension-codename-goose) - [Observability with Langfuse | codename goose](#observability-with-langfuse-codename-goose) - [Sharing a Goose Agent | codename goose](#sharing-a-goose-agent-codename-goose) - [Memory Extension | codename goose](#memory-extension-codename-goose) - [PDF Reader Extension | codename goose](#pdf-reader-extension-codename-goose) - [PostgreSQL Extension | codename goose](#postgresql-extension-codename-goose) - [Quick Goose Tips | codename goose](#quick-goose-tips-codename-goose) - [Puppeteer Extension | codename goose](#puppeteer-extension-codename-goose) - [Repomix Extension | codename goose](#repomix-extension-codename-goose) - [CLI Commands | codename goose](#cli-commands-codename-goose) - [YouTube Transcript Extension | codename goose](#youtube-transcript-extension-codename-goose) - [Selenium Extension | codename goose](#selenium-extension-codename-goose) - [Goose Logging System | codename goose](#goose-logging-system-codename-goose) - [File Management | codename goose](#file-management-codename-goose) - [Tavily Web Search Extension | codename goose](#tavily-web-search-extension-codename-goose) - [Speech Extension | codename goose](#speech-extension-codename-goose) - [Tutorial Extension | codename goose](#tutorial-extension-codename-goose) - [Adjusting Tool Output Verbosity | codename goose](#adjusting-tool-output-verbosity-codename-goose) - [VS Code Extension | codename goose](#vs-code-extension-codename-goose) - [Benchmarking with Goose | codename goose](#benchmarking-with-goose-codename-goose) - [Running Tasks | codename goose](#running-tasks-codename-goose) - [Prevent Goose from Accessing Files | codename goose](#prevent-goose-from-accessing-files-codename-goose) - [Building Goose in Docker | codename goose](#building-goose-in-docker-codename-goose) - [Experimental Features | codename goose](#experimental-features-codename-goose) --- # Getting Started | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) [πŸ“„οΈ Install Goose\ -----------------\ \ Choose to install Goose on CLI and/or Desktop:](/goose/docs/getting-started/installation) [πŸ“„οΈ Configure LLM Provider\ --------------------------\ \ Goose is compatible with a wide range of LLM providers, allowing you to choose and integrate your preferred model.](/goose/docs/getting-started/providers) [πŸ“„οΈ Using Extensions\ --------------------\ \ Extensions are add-ons that provide a way to extend the functionality of Goose by connecting with applications and tools you already use in your workflow. These extensions can be used to add new features, access data and resources, or integrate with other systems.](/goose/docs/getting-started/using-extensions) --- # Tutorials | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) [πŸ“„οΈ Building Custom Extensions\ ------------------------------\ \ Create your own custom MCP Server to use as a Goose extension](/goose/docs/tutorials/custom-extensions) [πŸ“„οΈ AgentQL Extension\ ---------------------\ \ Add AgentQL MCP Server as a Goose Extension](/goose/docs/tutorials/agentql-mcp) [πŸ“„οΈ Asana Extension\ -------------------\ \ Add Asana MCP Server as a Goose Extension](/goose/docs/tutorials/asana-mcp) [πŸ“„οΈ Blender Extension\ ---------------------\ \ Add Blender MCP Server as a Goose Extension](/goose/docs/tutorials/blender-mcp) [πŸ“„οΈ CI/CD Environments\ ----------------------\ \ Set up Goose in your CI/CD pipeline to automate tasks](/goose/docs/tutorials/cicd) [πŸ“„οΈ Computer Controller Extension\ ---------------------------------\ \ Use Computer Controller MCP Server as a Goose Extension](/goose/docs/tutorials/computer-controller-mcp) [πŸ“„οΈ Developer Extension\ -----------------------\ \ Use Developer MCP Server as a Goose Extension](/goose/docs/tutorials/developer-mcp) [πŸ“„οΈ Fetch Extension\ -------------------\ \ Add Fetch MCP Server as a Goose Extension](/goose/docs/tutorials/fetch-mcp) [πŸ“„οΈ Figma Extension\ -------------------\ \ Add Figma MCP Server as a Goose Extension](/goose/docs/tutorials/figma-mcp) [πŸ“„οΈ Filesystem Extension\ ------------------------\ \ Add Filesystem MCP Server as Goose Extension](/goose/docs/tutorials/filesystem-mcp) [πŸ“„οΈ GitHub Extension\ --------------------\ \ Add GitHub MCP Server as a Goose Extension](/goose/docs/tutorials/github-mcp) [πŸ“„οΈ Google Drive Extension\ --------------------------\ \ Add Google Drive MCP Server as a Goose Extension](/goose/docs/tutorials/google-drive-mcp) [πŸ“„οΈ Google Maps Extension\ -------------------------\ \ Add Google Maps MCP Server as a Goose Extension](/goose/docs/tutorials/google-maps-mcp) [πŸ“„οΈ JetBrains Extension\ -----------------------\ \ Use JetBrains MCP Server as a Goose Extension](/goose/docs/tutorials/jetbrains-mcp) [πŸ“„οΈ Knowledge Graph Memory Extension\ ------------------------------------\ \ Add Knowledge Graph Memory MCP Server as a Goose Extension](/goose/docs/tutorials/knowledge-graph-mcp) [πŸ“„οΈ Observability with Langfuse\ -------------------------------\ \ Integrate Goose with Langfuse to observe performance](/goose/docs/tutorials/langfuse) [πŸ“„οΈ Memory Extension\ --------------------\ \ Use Memory MCP Server as a Goose Extension](/goose/docs/tutorials/memory-mcp) [πŸ“„οΈ PDF Reader Extension\ ------------------------\ \ Add PDF Reader MCP Server as a Goose Extension](/goose/docs/tutorials/pdf-mcp) [πŸ“„οΈ PostgreSQL Extension\ ------------------------\ \ Add PostgreSQL MCP Server as a Goose Extension](/goose/docs/tutorials/postgres-mcp) [πŸ“„οΈ Puppeteer Extension\ -----------------------\ \ Add Puppeteer MCP Server as a Goose Extension](/goose/docs/tutorials/puppeteer-mcp) [πŸ“„οΈ Repomix Extension\ ---------------------\ \ Add Repomix MCP Server as a Goose Extension](/goose/docs/tutorials/repomix-mcp) [πŸ“„οΈ Selenium Extension\ ----------------------\ \ Add Selenium MCP Server as a Goose Extension](/goose/docs/tutorials/selenium-mcp) [πŸ“„οΈ Speech Extension\ --------------------\ \ Add Speech MCP Server as a Goose Extension](/goose/docs/tutorials/speech-mcp) [πŸ“„οΈ Tavily Web Search Extension\ -------------------------------\ \ Add Tavily MCP Server as a Goose Extension](/goose/docs/tutorials/tavily-mcp) [πŸ“„οΈ Tutorial Extension\ ----------------------\ \ Learn how to use Goose's built-in Tutorial extension for guided learning](/goose/docs/tutorials/tutorial-extension) [πŸ“„οΈ VS Code Extension\ ---------------------\ \ Use VS Code MCP Server as a Goose Extension for file operations and VS Code integration](/goose/docs/tutorials/vscode-mcp) [πŸ“„οΈ YouTube Transcript Extension\ --------------------------------\ \ Add YouTube Transcript MCP Server as a Goose Extension for accessing YouTube video transcripts](/goose/docs/tutorials/youtube-transcript) --- # Install Goose | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Supported Environments The Goose CLI currently works on **macOS** and **Linux** systems and supports both **ARM** and **x86** architectures. On **Windows**, Goose CLI can run via WSL. If you'd like to request support for additional operating systems, please [vote on GitHub](https://github.com/block/goose/discussions/867) . * macOS * Linux * Windows Choose to install Goose on CLI and/or Desktop: * Goose CLI * Goose Desktop Run the following command to install the latest version of Goose on macOS: curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | bash This script will fetch the latest version of Goose and set it up on your system. If you'd like to install without interactive configuration, disable `CONFIGURE`: curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash Updating Goose It's best to keep Goose updated. To update Goose, run: goose update Install Goose directly from the browser or with [Homebrew](https://brew.sh/) . ### Option 1: Install via Download To download Goose Desktop for macOS, click one of the buttons below: [macOS Silicon](https://github.com/block/goose/releases/download/stable/Goose.zip) [macOS Intel](https://github.com/block/goose/releases/download/stable/Goose_intel_mac.zip) 1. Unzip the downloaded zip file. 2. Run the executable file to launch the Goose desktop application. Updating Goose It's best to keep Goose updated by periodically running the installation steps again. ### Option 2: Install via Homebrew Homebrew downloads the [same app](https://github.com/Homebrew/homebrew-cask/blob/master/Casks/b/block-goose.rb) but can take care of updates too. brew install --cask block-goose * * * Permissions If you’re on an Apple Mac M3 and the Goose desktop app shows no window on launch, check and update the following: Ensure the `~/.config` directory has read and write access. Goose needs this access to create the log directory and file. Once permissions are granted, the app should load correctly. For steps on how to do this, refer to the [Troubleshooting Guide](/goose/docs/troubleshooting#macos-permission-issues) Run the following command to install the Goose CLI on Linux: curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | bash This script will fetch the latest version of Goose and set it up on your system. If you'd like to install without interactive configuration, disable `CONFIGURE`: curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash There isn't native installation support for Windows, however you can run Goose using WSL (Windows Subsystem for Linux). 1. Open [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows) as Administrator and install WSL and the default Ubuntu distribution: wsl --install 2. Restart your computer if prompted. 3. Run the Goose installation script: curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | bash tip If you encounter any issues on download, you might need to install `bzip2` to extract the downloaded file: sudo apt update && sudo apt install bzip2 -y If you'd like to install without interactive configuration, disable `CONFIGURE`: curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash Set LLM Provider[​](#set-llm-provider "Direct link to Set LLM Provider") ------------------------------------------------------------------------- Goose works with a set of [supported LLM providers](/goose/docs/getting-started/providers) , and you’ll need an API key to get started. When you use Goose for the first time, you’ll be prompted to select a provider and enter your API key. * Goose CLI * Goose Desktop Upon installing, Goose will automatically enter its configuration screen. Here is where you can set up your LLM provider. Windows Users Choose to not store to keyring when prompted. Example: β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Configure Providersβ”‚β—‡ Which model provider should we use?β”‚ OpenAIβ”‚β—‡ Provider openai requires OPENAI_API_KEY, please enter a valueβ”‚β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ”‚β—‡ Enter a model from that provider:β”‚ gpt-4oβ”‚β—‡ Welcome aboard! You're all set to start using this agentβ€”let's achieve great things together!β”‚β”” Configuration saved successfully Windows Users On initial run, you may encounter errors about keyrings when setting your API Keys. Set the needed environment variables manually, e.g.: export OPENAI_API_KEY={your_api_key} To make the changes persist in WSL across sessions, add the goose path and export commands to your `.bashrc` or `.bash_profile` file so you can load it later. echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrcecho 'export OPENAI_API_KEY=your_api_key' >> ~/.bashrcsource ~/.bashrc Upon installing, the Provider screen will appear. Here is where you can choose your LLM Provider. ![Set Up a Provider UI](/goose/assets/images/set-up-provider-ui-a6ba5f66d16937ee91dbad22c101c232.png) Once selecting your provider, you'll be prompted to enter an API key if applicable. Do so, and click `Submit`. Update Provider[​](#update-provider "Direct link to Update Provider") ---------------------------------------------------------------------- * Goose CLI * Goose Desktop **To update your LLM provider and API key:** 1. Run the following command: goose configure 2. Select `Configure Providers` from the menu. 3. Follow the prompts to choose your LLM provider and enter or update your API key. **Example:** To select an option during configuration, use the up and down arrows to highlight your choice then press Enter. β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Configure Providersβ”‚β—‡ Which model provider should we use?β”‚ Google Geminiβ”‚β—‡ Provider Google Gemini requires GOOGLE_API_KEY, please enter a valueβ”‚β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ”‚β—‡ Enter a model from that provider:β”‚ gemini-2.0-flash-expβ”‚β—‡ Hello there! You're all set to use me, so please ask away!β”‚β”” Configuration saved successfully **To update your LLM provider and API key:** 1. Click on the three dots in the top-right corner. 2. Select `Provider Settings` from the menu. 3. Choose a provider from the list. 4. Click Edit, enter your API key, and click `Set as Active`. Billing [Google Gemini](https://aistudio.google.com/app/apikey) offers a free tier you can get started with. Otherwise, you'll need to ensure that you have credits available in your LLM Provider account to successfully make requests. Some providers also have rate limits on API usage, which can affect your experience. Check out our [Handling Rate Limits](/goose/docs/guides/handling-llm-rate-limits-with-goose) guide to learn how to efficiently manage these limits while using Goose. Running Goose[​](#running-goose "Direct link to Running Goose") ---------------------------------------------------------------- * Goose CLI * Goose Desktop From your terminal, navigate to the directory you'd like to start from and run: goose session Starting a session in the Goose Desktop is straightforward. After choosing your provider, you’ll see the session interface ready for use. Type your questions, tasks, or instructions directly into the input field, and Goose will get to work immediately. Additional Resources[​](#additional-resources "Direct link to Additional Resources") ------------------------------------------------------------------------------------- You can also configure Extensions to extend Goose's functionality, including adding new ones or toggling them on and off. For detailed instructions, visit the [Using Extensions Guide](/goose/docs/getting-started/using-extensions) . * [Set LLM Provider](#set-llm-provider) * [Update Provider](#update-provider) * [Running Goose](#running-goose) * [Additional Resources](#additional-resources) --- # Guides | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) [πŸ“„οΈ Managing Sessions\ ---------------------\ \ A session is a single, continuous interaction between you and Goose, providing a space to ask questions and prompt action. In this guide, we'll cover how to start, exit, and resume a session.](/goose/docs/guides/managing-goose-sessions) [πŸ“„οΈ Updating Goose\ ------------------\ \ The Goose CLI and desktop apps are under active and continuous development. To get the newest features and fixes, you should periodically update your Goose client using the following instructions.](/goose/docs/guides/updating-goose) [πŸ“„οΈ Goose Permissions\ ---------------------\ \ Goose’s permissions determine how much autonomy it has when modifying files, using extensions, and performing automated actions. By selecting a permission mode, you have full control over how Goose interacts with your development environment.](/goose/docs/guides/goose-permissions) [πŸ“„οΈ Using Goosehints\ --------------------\ \ .goosehints is a text file used to provide additional context about your project and improve the communication with Goose. The use of goosehints ensures that Goose understands your requirements better and can execute tasks more effectively.](/goose/docs/guides/using-goosehints) [πŸ“„οΈ Share Goose Agents\ ----------------------\ \ A shared Agent in Goose is like a collaborative workspace where multiple people can work with the AI assistant together in real-time. Think of it similar to a shared Google Doc, but for AI assistance.](/goose/docs/guides/share-goose-sessions) [πŸ“„οΈ Quick Tips\ --------------\ \ Here is a collection of tips for working with Goose:](/goose/docs/guides/tips) [πŸ“„οΈ CLI Commands\ ----------------\ \ Goose provides a command-line interface (CLI) with several commands for managing sessions, configurations and extensions. Below is a list of the available commands and their descriptions:](/goose/docs/guides/goose-cli-commands) [πŸ“„οΈ LLM Rate Limits\ -------------------\ \ Rate limiting is the process of restricting the number of requests a user or application can send to an LLM API within a specific timeframe. LLM providers enforce this with the purpose of managing resources and preventing abuse.](/goose/docs/guides/handling-llm-rate-limits-with-goose) [πŸ“„οΈ Logging System\ ------------------\ \ Goose uses a unified storage system for conversations and interactions. All conversations and interactions (both CLI and Desktop) are stored locally in the following locations:](/goose/docs/guides/logs) [πŸ“„οΈ File Management\ -------------------\ \ As an autonomous agent, Goose is designed to carry out tasks following specified instructions. This may sometimes involve working with local files. It's essential to follow best practices for safe file modification to monitor changes and revert anywhere necessary.](/goose/docs/guides/file-management) [πŸ“„οΈ Adjust Tool Output\ ----------------------\ \ When working with the Goose CLI, you can control the verbosity of tool output.](/goose/docs/guides/adjust-tool-output) [πŸ“„οΈ Benchmark with Goose\ ------------------------\ \ The Goose benchmarking system allows you to evaluate goose performance on complex tasks with one or more system](/goose/docs/guides/benchmarking) [πŸ“„οΈ Run Tasks\ -------------\ \ When working with the Goose CLI, you can pass files and instructions to the goose run command to execute tasks and workflows. This could be a simple one-liner command or a complex set of instructions stored in a file.](/goose/docs/guides/running-tasks) [πŸ“„οΈ Using Gooseignore\ ---------------------\ \ .gooseignore is a text file that defines patterns for files and directories that Goose will not access. This means Goose cannot read, modify, delete, or run shell commands on these files when using the Developer extension's tools.](/goose/docs/guides/using-gooseignore) [πŸ“„οΈ Goose in Docker\ -------------------\ \ There are various scenarios where you might want to build Goose in Docker. If the instructions below do not meet your needs, please contact us by replying to our discussion topic.](/goose/docs/guides/goose-in-docker) [πŸ“„οΈ Experimental Features\ -------------------------\ \ Goose is an open source project that is constantly being improved, and new features are added regularly. Some of these features are considered experimental, meaning they are still in development and may not be fully stable or ready for production use. This guide covers how to enable and use experimental features in Goose, as well as how to provide feedback on them.](/goose/docs/guides/experimental-features) --- # Using Extensions | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Extensions are add-ons that provide a way to extend the functionality of Goose by connecting with applications and tools you already use in your workflow. These extensions can be used to add new features, access data and resources, or integrate with other systems. Extensions are based on the [Model Context Protocol (MCP)](https://github.com/modelcontextprotocol) , so you can connect Goose to a wide ecosystem of capabilities. Tutorials Check out the [step-by-step tutorials](/goose/docs/category/tutorials) for adding and using several Goose Extensions Built-in Extensions[​](#built-in-extensions "Direct link to Built-in Extensions") ---------------------------------------------------------------------------------- Out of the box, Goose is installed with a few extensions but with only the `Developer` extension enabled by default. Here are the built-in extensions: 1. **Developer**: provides a set of general development tools that are useful for software development. 2. **Computer Controller**: provides general computer control tools for webscraping, file caching, and automations. 3. **Memory**: teaches goose to remember your preferences as you use it 4. **JetBrains**: provides an integration for working with JetBrains IDEs. #### Toggling Built-in Extensions[​](#toggling-built-in-extensions "Direct link to Toggling Built-in Extensions") * Goose CLI * Goose Desktop If you know the exact name of the extension you'd like to add, run: goose mcp {name} To navigate through available extensions: 1. Run the following command: goose configure 2. Select `Add Extension` from the menu. 3. Choose the type of extension you’d like to add: * `Built-In Extension`: Use an extension that comes pre-installed with Goose. * `Command-Line Extension`: Add a local command or script to run as an extension. * `Remote Extension`: Connect to a remote system via SSE (Server-Sent Events). 4. Follow the prompts based on the type of extension you selected. **Example: Adding Built-in Extension** To select an option during configuration, hover over it and press Enter. β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extension β”‚β—† Which built-in extension would you like to enable?β”‚ β—‹ Developer Tools β”‚ β—‹ Computer Controller (controls for webscraping, file caching, and automations)β”‚ β—‹ Google Drive β”‚ β—‹ Memory β”‚ ● JetBrains β”‚ β—‡ Please set the timeout for this tool (in secs):β”‚ 300β”‚ β”” Enabled jetbrains extension 1. Click `...` in the top right corner of the Goose Desktop. 2. Select `Settings` from the menu. 3. Under `Extensions`, you can toggle the built-in extensions on or off. info All of Goose's built-in extensions are MCP servers in their own right. If you'd like to use the MCP servers included with Goose with any other agent, you are free to do so. Discovering Extensions[​](#discovering-extensions "Direct link to Discovering Extensions") ------------------------------------------------------------------------------------------- Goose provides a [central directory](https://block.github.io/goose/v1/extensions) of extensions that you can install and use. You can also add any other [MCP Server](#mcp-servers) as a Goose extension, even if it's not listed in our directory. Adding Extensions[​](#adding-extensions "Direct link to Adding Extensions") ---------------------------------------------------------------------------- Extensions can be installed directly via the [extensions directory](https://block.github.io/goose/v1/extensions) , CLI, or UI. ### MCP Servers[​](#mcp-servers "Direct link to MCP Servers") You can install any MCP server as a Goose extension. MCP Server Directory See available servers in the **[MCP Server Directory](https://www.pulsemcp.com/servers) **. * Goose CLI * Goose Desktop 1. Run the following command: goose configure 2. Select `Add Extension` from the menu. 3. Choose the type of extension you’d like to add: * `Built-In Extension`: Use an extension that comes pre-installed with Goose. * `Command-Line Extension`: Add a local command or script to run as an extension. * `Remote Extension`: Connect to a remote system via SSE (Server-Sent Events). 4. Follow the prompts based on the type of extension you selected. #### Example of adding the [Knowledge Graph Memory MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/memory) :[​](#example-of-adding-the-knowledge-graph-memory-mcp-server "Direct link to example-of-adding-the-knowledge-graph-memory-mcp-server") * Node * Python * Java β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extension β”‚β—‡ What would you like to call this extension?β”‚ Knowledge Graph Memoryβ”‚β—‡ What command should be run?β”‚ npx -y @modelcontextprotocol/server-memoryβ”‚β—‡ Please set the timeout for this tool (in secs):β”‚ 300β”‚β—† Would you like to add environment variables?β”‚ No β”‚β”” Added Knowledge Graph Memory extension β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Add Extensionβ”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extensionβ”‚β—‡ What would you like to call this extension?β”‚ Wikipedia Readerβ”‚β—‡ What command should be run?β”‚ uvx mcp-wikiβ”‚β—‡ Please set the timeout for this tool (in secs):β”‚ 300β”‚β—† Would you like to add environment variables?β”‚ Noβ”‚β”” Added Wikipedia Reader extension Note: Java and Kotlin extensions are only support on Linux and macOS β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Add Extensionβ”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extensionβ”‚β—‡ What would you like to call this extension?β”‚ Spring Data Explorerβ”‚β—‡ What command should be run?β”‚ jbang -Dspring.profiles.active=dev org.example:spring-data-mcp:1.0.0β”‚β—‡ Please set the timeout for this tool (in secs):β”‚ 300β”‚β—† Would you like to add environment variables?β”‚ Yesβ”‚β—‡ Environment variable name:β”‚ SPRING_DATASOURCE_URLβ”‚β—‡ Environment variable value:β”‚ jdbc:postgresql://localhost:5432/mydbβ”‚β—‡ Add another environment variable?β”‚ Noβ”‚β”” Added Spring Data Explorer extension 1. Click `...` in the top right corner of the Goose Desktop. 2. Select `Settings` from the menu. 3. Under `Extensions`, click `Add custom extension`. 4. On the `Add custom extension` modal, enter the necessary details * If adding an environment variable, click `Add` button to the right of the variable * The `Timeout` field lets you set how long Goose should wait for a tool call from this extension to complete 5. Click `Add` button #### Example of adding the [Knowledge Graph Memory MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/memory) :[​](#example-of-adding-the-knowledge-graph-memory-mcp-server-1 "Direct link to example-of-adding-the-knowledge-graph-memory-mcp-server-1") * **Type**: `Standard IO` * **ID**: `kgm-mcp` (_set this to whatever you want_) * **Name**: `Knowledge Graph Memory` (_set this to whatever you want_) * **Description**: `maps and stores complex relationships between concepts` (_set this to whatever you want_) * **Command**: `npx -y @modelcontextprotocol/server-memory` ### Config Entry[​](#config-entry "Direct link to Config Entry") For advanced users, you can also directly edit the config file (`~/.config/goose/config.yaml`) to add, remove, or update an extension: extensions: fetch: name: GitHub cmd: npx args: [-y @modelcontextprotocol/server-github] enabled: true envs: { "GITHUB_PERSONAL_ACCESS_TOKEN": "" } type: stdio timeout: 300 Enabling/Disabling Extensions[​](#enablingdisabling-extensions "Direct link to Enabling/Disabling Extensions") --------------------------------------------------------------------------------------------------------------- You can enable or disable installed extensions based on your workflow needs. * Goose CLI * Goose Desktop 1. Run the following command to open up Goose's configurations: goose configure 2. Select `Toggle Extensions` from the menu. 3. A list of already installed extensions will populate. 4. Press the `space bar` to toggle the extension. Solid means enabled. **Example:** β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Toggle Extensions β”‚β—† enable extensions: (use "space" to toggle and "enter" to submit)β”‚ β—Ό developer β”‚ β—» fetch β”” 1. Click the three dots in the top-right corner of the application. 2. Select `Settings` from the menu, scroll down to the `Extensions` section. 3. Use the toggle switch next to each extension to enable or disable it. Removing Extensions[​](#removing-extensions "Direct link to Removing Extensions") ---------------------------------------------------------------------------------- You can remove installed extensions. * Config file * Goose Desktop info To remove an extension, you must [disable](#enablingdisabling-extensions) it first. 1. Run the following command to open up Goose's configurations: goose configure 2. Select `Remove` from the menu. Disabled extensions will be listed. 3. Arrow down to the extension you want to remove. 4. Press the `space bar` to select the extension. Solid means selected. β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Remove Extension β”‚β—† Select extensions to remove (note: you can only remove disabled extensions - use "space" to toggle and "enter" to submit)β”‚ β—Ό fetch β”” 5. Press Enter to save 1. Click `...` in the top right corner of the Goose Desktop. 2. Select `Settings` from the menu. 3. Under `Extensions`, find the extension you'd like to remove and click on the settings icon beside it. 4. In the dialog that appears, click `Remove Extension`. Starting Session with Extensions[​](#starting-session-with-extensions "Direct link to Starting Session with Extensions") ------------------------------------------------------------------------------------------------------------------------- You can start a tailored Goose session with specific extensions directly from the CLI. Notes * The extension will not be installed. It will only be enabled for the current session. * There's no need to do this if you already have the extensions enabled. ### Built-in Extensions[​](#built-in-extensions-1 "Direct link to Built-in Extensions") To enable a built-in extension while starting a session, run the following command: goose session --with-builtin "{extension_id}" For example, to enable the Developer and Computer Controller extensions and start a session, you'd run: goose session --with-builtin "developer,computercontroller" Or alternatively: goose session --with-builtin developer --with-builtin computercontroller ### External Extensions[​](#external-extensions "Direct link to External Extensions") To enable an extension while starting a session, run the following command: goose session --with-extension "{extension command}" --with-extension "{another extension command}" For example, to start a session with the [Fetch extension](https://github.com/modelcontextprotocol/servers/tree/main/src/fetch) , you'd run: goose session --with-extension "uvx mcp-server-fetch" #### Environment Variables[​](#environment-variables "Direct link to Environment Variables") Some extensions require environment variables. You can include these in your command: goose session --with-extension "VAR=value command arg1 arg2" For example, to start a session with the [GitHub extension](https://github.com/modelcontextprotocol/servers/tree/main/src/github) , you'd run: goose session --with-extension "GITHUB_PERSONAL_ACCESS_TOKEN= npx -y @modelcontextprotocol/server-github" info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. ### Remote Extensions over SSE[​](#remote-extensions-over-sse "Direct link to Remote Extensions over SSE") To enable a remote extension over SSE while starting a session, run the following command: goose session --with-remote-extension "{extension URL}" --with-remote-extension "{another extension URL}" For example, to start a session with a remote extension running on localhost on port 8080, you'd run: goose session --with-remote-extension "http://localhost:8080/sse" Developing Extensions[​](#developing-extensions "Direct link to Developing Extensions") ---------------------------------------------------------------------------------------- Goose extensions are implemented with MCP, a standard protocol that allows AI models and agents to securely connect with local or remote resources. Learn how to build your own [extension as an MCP server](https://modelcontextprotocol.io/quickstart/server) . * [Built-in Extensions](#built-in-extensions) * [Discovering Extensions](#discovering-extensions) * [Adding Extensions](#adding-extensions) * [MCP Servers](#mcp-servers) * [Config Entry](#config-entry) * [Enabling/Disabling Extensions](#enablingdisabling-extensions) * [Removing Extensions](#removing-extensions) * [Starting Session with Extensions](#starting-session-with-extensions) * [Built-in Extensions](#built-in-extensions-1) * [External Extensions](#external-extensions) * [Remote Extensions over SSE](#remote-extensions-over-sse) * [Developing Extensions](#developing-extensions) --- # Troubleshooting | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose, like any system, may run into occasional issues. This guide provides solutions for common problems. ### Goose Edits Files[​](#goose-edits-files "Direct link to Goose Edits Files") Goose can and will edit files as part of its workflow. To avoid losing personal changes, use version control to stage your personal edits. Leave Goose edits unstaged until reviewed. Consider separate commits for Goose's edits so you can easily revert them if needed. * * * ### Interrupting Goose[​](#interrupting-goose "Direct link to Interrupting Goose") If Goose is heading in the wrong direction or gets stuck, you can interrupt it by pressing `CTRL+C`. This will stop Goose and give you the opportunity to correct its actions or provide additional information. * * * ### Stuck in a Loop or Unresponsive[​](#stuck-in-a-loop-or-unresponsive "Direct link to Stuck in a Loop or Unresponsive") In rare cases, Goose may enter a "doom spiral" or become unresponsive during a long session. This is often resolved by ending the current session, and starting a new session. 1. Hold down `Ctrl+C` to cancel 2. Start a new session: goose session tip For particularly large or complex tasks, consider breaking them into smaller sessions. * * * ### Context Length Exceeded Error[​](#context-length-exceeded-error "Direct link to Context Length Exceeded Error") This error occurs when the input provided to Goose exceeds the maximum token limit of the LLM being used. To resolve this, try breaking down your input into smaller parts. You can also use `.goosehints` as a way to provide goose with detailed context. Refer to the [Using Goosehints Guide](/goose/docs/guides/using-goosehints) for more information. * * * ### Using Ollama Provider[​](#using-ollama-provider "Direct link to Using Ollama Provider") Ollama provides local LLMs, which means you must first [download Ollama and run a model](/goose/docs/getting-started/providers#local-llms-ollama) before attempting to use this provider with Goose. If you do not have the model downloaded, you'll run into the following error: > ExecutionError("error sending request for url ([http://localhost:11434/v1/chat/completions](http://localhost:11434/v1/chat/completions) > )") Another thing to note is that the DeepSeek models do not support tool calling, so all Goose [extensions must be disabled](/goose/docs/getting-started/using-extensions#enablingdisabling-extensions) to use one of these models. Unfortunately, without the use of tools, there is not much Goose will be able to do autonomously if using DeepSeek. However, Ollama's other models such as `qwen2.5` do support tool calling and can be used with Goose extensions. * * * ### Handling Rate Limit Errors[​](#handling-rate-limit-errors "Direct link to Handling Rate Limit Errors") Goose may encounter a `429 error` (rate limit exceeded) when interacting with LLM providers. The recommended solution is to use OpenRouter. See [Handling LLM Rate Limits](/goose/docs/guides/handling-llm-rate-limits-with-goose) for more info. * * * ### Hermit Errors[​](#hermit-errors "Direct link to Hermit Errors") If you see an issue installing an extension in the app that says "hermit:fatal", you may need to reset your hermit cache. We use a copy of hermit to ensure npx and uvx are consistently available. If you have already used an older version of hermit, you may need to cleanup the cache - on Mac this cache is at sudo rm -rf ~/Library/Caches/hermit * * * ### API Errors[​](#api-errors "Direct link to API Errors") Users may run into an error like the one below when there are issues with their LLM API tokens, such as running out of credits or incorrect configuration: Traceback (most recent call last): File "/Users/admin/.local/pipx/venvs/goose-ai/lib/python3.13/site-packages/exchange/providers/utils.py",line 30, in raise_for_status response.raise_for_status() ~~~~~~~~~~~~~~~~~~~~~~~~~^^ File "/Users/admin/.local/pipx/venvs/goose-ai/lib/python3.13/site-packages/httpx/_models.py",line 829, in raise_for_status raise HTTPStatusError(message, request=request, response=self)httpx.HTTPStatusError: Client error '404 Not Found' for url'https://api.openai.com/v1/chat/completions'... This error typically occurs when LLM API credits are exhausted or your API key is invalid. To resolve this issue: 1. Check Your API Credits: * Log into your LLM provider's dashboard * Verify that you have enough credits. If not, refill them 2. Verify API Key: * Run the following command to reconfigure your API key: goose configure For detailed steps on updating your LLM provider, refer to the [Installation](/goose/docs/getting-started/installation) Guide. * * * ### Uninstall Goose or Remove Cached Data[​](#uninstall-goose-or-remove-cached-data "Direct link to Uninstall Goose or Remove Cached Data") You may need to uninstall Goose or clear existing data before re-installing. Goose stores data in a few places. Secrets, such as API keys, are stored exclusively in the system keychain. Logs and configuration data are stored in `~/.config/goose`. And the app stores a small amount of data in `~/Library/Application Support/Goose`. You can remove all of this data by following these steps. * stop any copies of goose running (CLI or GUI) * consider confirming you've stopped them all via the activity monitor * open the keychain and delete the credential called "goose", which contains all secrets stored by goose * `rm -rf ~/.config/goose` If you are using Goose Desktop on macOS, you may also need to remove the app itself. * `rm -rf ~/Library/Application Support/Goose` * Delete the "Goose" app from your Applications folder After this cleanup, if you are looking to try out a fresh install of Goose, you can now start from the usual install instructions. * * * ### Keychain/Keyring Errors[​](#keychainkeyring-errors "Direct link to Keychain/Keyring Errors") Goose tries to use the system keyring to store secrets. In environments where there is no keyring support, you may see an error like: Error Failed to access secure storage (keyring): Platform secure storage failure: DBus error: The name org.freedesktop.secrets was not provided by any .service filesPlease check your system keychain and run 'goose configure' again.If your system is unable to use the keyring, please try setting secret key(s) via environment variables. In this case, you will need to set your provider specific environment variable(s), which can be found at [Supported LLM Providers](/goose/docs/getting-started/providers) . You can set them either by doing: * `export GOOGLE_API_KEY=$YOUR_KEY_HERE` - for the duration of your session * in your `~/.bashrc` or `~/.zshrc` - (or equivalents) so it persists on new shell each new session Then select the `No` option when prompted to save the value to your keyring. $ goose configureWelcome to goose! Let's get you set up with a provider. you can rerun this command later to update your configurationβ”Œ goose-configureβ”‚β—‡ Which model provider should we use?β”‚ Google Geminiβ”‚β—‡ GOOGLE_API_KEY is set via environment variableβ”‚β—‡ Would you like to save this value to your keyring?β”‚ Noβ”‚β—‡ Enter a model from that provider:β”‚ gemini-2.0-flash-exp * * * ### Package Runners[​](#package-runners "Direct link to Package Runners") Many of the external extensions require a package runner. For example, if you run into an error like this one: Failed to start extension: {extension name}, "No such file or directory (os error 2)"Please check extension configuration for {extension name}. ... it signals that the extension may not have been installed and you need the package runner in order to do so. An example is the GitHub extension whose command is `npx -y @modelcontextprotocol/server-github`. You'd need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * * * ### macOS Permission Issues[​](#macos-permission-issues "Direct link to macOS Permission Issues") If you encounter an issue where the Goose Desktop app shows no window on launch, it may be due to file and folder permissions. This typically happens because Goose needs read and write access to the `~/.config` directory to create its log directory and file. Similarly, if tools fail to create files or directories during use, it could be caused by the same permission issue. #### How to Check and Fix Permissions:[​](#how-to-check-and-fix-permissions "Direct link to How to Check and Fix Permissions:") 1. Open Terminal. 2. Run the following command to check the current permissions for ~/.config: ls -ld ~/.config **Example output:** drwx------ 7 yourusername staff 224 Jan 15 12:00 /Users/yourusername/.config `rwx` indicates you have read (r), write (w), and execute (x) permissions for your user. If you do not see `rwx` for your user, follow the steps below. #### How to Grant Read and Write Permissions:[​](#how-to-grant-read-and-write-permissions "Direct link to How to Grant Read and Write Permissions:") 1. To add the correct permissions, run the following commands: chmod u+rw ~/.config If the ~/.config directory does not exist, create it and then assign permissions: mkdir -p ~/.configchmod u+rw ~/.config 2. Verify the change: ls -ld ~/.config If you still experience issues after fixing permissions, try launching Goose with superuser (admin) privileges: sudo /Applications/Goose.app/Contents/MacOS/Goose note Running Goose with sudo may create files owned by root, which could lead to further permission issues. Use this as a troubleshooting step rather than a permanent fix. #### Update permission in System Settings (macOs)[​](#update-permission-in-system-settings-macos "Direct link to Update permission in System Settings (macOs)") 1. Go to `System Settings` -> `Privacy & Security` -> `Files & Folders` 2. Grant Goose access * * * ### Connection Error with Ollama Provider on WSL[​](#connection-error-with-ollama-provider-on-wsl "Direct link to Connection Error with Ollama Provider on WSL") If you encounter an error like this when setting up Ollama as the provider in Goose: Execution error: error sending request for url (http://localhost:11434/v1/chat/completions) This likely means that the local host address is not accessible from WSL. 1. Check if the service is running: curl http://localhost:11434/api/tags If you receive a `failed to connect` error, it’s possible that WSL is using a different IP for localhost. In that case, run the following command to find the correct IP address for WSL: ip route show | grep -i default | awk '{ print $3 }' 2. Once you get the IP address, use it in your Goose configuration instead of localhost. For example: http://172.24.80.1:11434 If you still encounter a `failed to connect` error, you can try using WSL's [Mirrored Networking](https://learn.microsoft.com/en-us/windows/wsl/networking#mirrored-mode-networking) setting if you using Windows 11 22H2 or higher * * * ### Need Further Help?[​](#need-further-help "Direct link to Need Further Help?") If you have questions, run into issues, or just need to brainstorm ideas join the [Discord Community](https://discord.gg/block-opensource) ! * [Goose Edits Files](#goose-edits-files) * [Interrupting Goose](#interrupting-goose) * [Stuck in a Loop or Unresponsive](#stuck-in-a-loop-or-unresponsive) * [Context Length Exceeded Error](#context-length-exceeded-error) * [Using Ollama Provider](#using-ollama-provider) * [Handling Rate Limit Errors](#handling-rate-limit-errors) * [Hermit Errors](#hermit-errors) * [API Errors](#api-errors) * [Uninstall Goose or Remove Cached Data](#uninstall-goose-or-remove-cached-data) * [Keychain/Keyring Errors](#keychainkeyring-errors) * [Package Runners](#package-runners) * [macOS Permission Issues](#macos-permission-issues) * [Connection Error with Ollama Provider on WSL](#connection-error-with-ollama-provider-on-wsl) * [Need Further Help?](#need-further-help) --- # Quickstart | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Supported Environments The Goose CLI currently works on **macOS** and **Linux** systems and supports both **ARM** and **x86** architectures. On **Windows**, Goose CLI can run via WSL. If you'd like to request support for additional operating systems, please [vote on GitHub](https://github.com/block/goose/discussions/867) . Goose is an open source AI agent that supercharges your software development by automating coding tasks. This quick tutorial will guide you through getting started with Goose! Install Goose[​](#install-goose "Direct link to Install Goose") ---------------------------------------------------------------- You can use Goose via CLI or Desktop application. * Goose CLI * Goose Desktop (macOS only) Run the following command to install the latest version of Goose: curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | bash To install the latest version of Goose, click the **button** below: [download goose desktop for macOS](https://github.com/block/goose/releases/download/stable/Goose.zip) 1. Unzip the downloaded `Goose.zip` file. 2. Run the executable file to launch the Goose desktop application. Configure Provider[​](#configure-provider "Direct link to Configure Provider") ------------------------------------------------------------------------------- Goose works with [supported LLM providers](/goose/docs/getting-started/providers) . When you install Goose, you'll be prompted to choose your preferred LLM and supply an API key. * Goose CLI * Goose Desktop Use the up and down arrow keys to navigate the CLI menu, and press Enter once you've selected a choice. β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Configure Providersβ”‚β—‡ Which model provider should we use?β”‚ Google Geminiβ”‚β—‡ Provider Google Gemini requires GOOGLE_API_KEY, please enter a valueβ”‚β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ”‚β—‡ Enter a model from that provider:β”‚ gemini-2.0-flash-expβ”‚β—‡ Hello! You're all set and ready to go, feel free to ask me anything!β”‚β”” Configuration saved successfully ![Set Up a Provider UI](/goose/assets/images/set-up-provider-ui-a6ba5f66d16937ee91dbad22c101c232.png) Billing [Google Gemini](https://aistudio.google.com/app/apikey) offers a free tier you can get started with. Otherwise, you'll need to ensure that you have credits available in your LLM Provider account to successfully make requests. Some providers also have rate limits on API usage, which can affect your experience. Check out our [Handling Rate Limits](/goose/docs/guides/handling-llm-rate-limits-with-goose) guide to learn how to efficiently manage these limits while using Goose. Model Selection Goose relies heavily on tool calling capabilities and currently works best with Anthropic's Claude 3.5 Sonnet and OpenAI's GPT-4o (2024-11-20) model. Start Session[​](#start-session "Direct link to Start Session") ---------------------------------------------------------------- Sessions are single, continuous conversations between you and Goose. Let's start one. * Goose CLI * Goose Desktop 1. Make an empty directory (e.g. `goose-demo`) and navigate to that directory from the terminal. 2. To start a new session, run: goose session After choosing an LLM provider, you’ll see the session interface ready for use. Type your questions, tasks, or instructions directly into the input field, and Goose will immediately get to work. Write Prompt[​](#write-prompt "Direct link to Write Prompt") ------------------------------------------------------------- From the prompt, you can interact with Goose by typing your instructions exactly as you would speak to a developer. Let's ask Goose to make a tic-tac-toe game! create an interactive browser-based tic-tac-toe game in javascript where a player competes against a bot Goose will create a plan and then get right to work on implementing it. Once done, your directory should contain a JavaScript file as well as an HTML page for playing. Install an Extension[​](#install-an-extension "Direct link to Install an Extension") ------------------------------------------------------------------------------------- While you're able to manually navigate to your working directory and open the HTML file in a browser, wouldn't it be better if Goose did that for you? Let's give Goose the ability to open a web browser by enabling the `Computer Controller` extension. * Goose CLI * Goose Desktop 1. End the current session by entering `Ctrl+C` so that you can return to the terminal's command prompt. 2. Run the configuration command goose configure 3. Choose `Add extension` > `Built-in Extension` > `Computer Controller`, and set timeout to 300s. This [extension](https://block.github.io/goose/v1/extensions/detail/nondeveloper) enables webscraping, file caching, and automations. β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Add Extensionβ”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extensionβ”‚β—‡ Which built-in extension would you like to enable?β”‚ β—‹ Developer Toolsβ”‚ ● Computer Controller (controls for webscraping, file caching, and automations)β”‚ β—‹ Google Driveβ”‚ β—‹ Memoryβ”‚ β—‹ JetBrainsβ”‚ β—‡ Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” Enabled Computer Controller extension 4. Now that Goose has browser capabilities, let's resume your last session: goose session -r 5. Ask Goose to launch your game in a browser: 1. Locate the menu (`...`) in the top right corner of the Goose Desktop. 2. Select `Settings` from the menu. 3. Under the `Extensions` section, toggle the `Computer Controller` extension to enable it. This [extension](https://block.github.io/goose/v1/extensions/detail/nondeveloper) enables webscraping, file caching, and automations. 4. Click `<- Back` in the upper left corner to return to your session. 5. Now that Goose has browser capabilities, let's ask it to launch your game in a browser: open index.html in a browser Go ahead and play your game, I know you want to πŸ˜‚ ... good luck! Next Steps[​](#next-steps "Direct link to Next Steps") ------------------------------------------------------- Congrats, you've successfully used Goose to develop a web app! πŸŽ‰ Here are some ideas for next steps: * Continue your session with Goose and it improve your game (styling, functionality, etc). * Browse other available [extensions](/goose/docs/getting-started/using-extensions) and install more to enhance Goose's functionality even further. * Provide Goose with a [set of hints](/goose/docs/guides/using-goosehints) to use within your sessions. * [Install Goose](#install-goose) * [Configure Provider](#configure-provider) * [Start Session](#start-session) * [Write Prompt](#write-prompt) * [Install an Extension](#install-an-extension) * [Next Steps](#next-steps) --- # Configure LLM Provider | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose is compatible with a wide range of LLM providers, allowing you to choose and integrate your preferred model. Model Selection Goose relies heavily on tool calling capabilities and currently works best with Anthropic's Claude 3.5 Sonnet and OpenAI's GPT-4o (2024-11-20) model. [Berkeley Function-Calling Leaderboard](https://gorilla.cs.berkeley.edu/leaderboard.html) can be a good guide for selecting models. Available Providers[​](#available-providers "Direct link to Available Providers") ---------------------------------------------------------------------------------- | Provider | Description | Parameters | | --- | --- | --- | | [Amazon Bedrock](https://aws.amazon.com/bedrock/) | Offers a variety of foundation models, including Claude, Jurassic-2, and others. **AWS environment variables must be set in advance, not configured through `goose configure`** | `AWS_PROFILE`, or `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`, ... | | [Anthropic](https://www.anthropic.com/) | Offers Claude, an advanced AI model for natural language tasks. | `ANTHROPIC_API_KEY`, `ANTHROPIC_HOST` (optional) | | [Azure OpenAI](https://learn.microsoft.com/en-us/azure/ai-services/openai/) | Access Azure-hosted OpenAI models, including GPT-4 and GPT-3.5. | `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_ENDPOINT`, `AZURE_OPENAI_DEPLOYMENT_NAME` | | [Databricks](https://www.databricks.com/) | Unified data analytics and AI platform for building and deploying models. | `DATABRICKS_HOST`, `DATABRICKS_TOKEN` | | [Gemini](https://ai.google.dev/gemini-api/docs) | Advanced LLMs by Google with multimodal capabilities (text, images). | `GOOGLE_API_KEY` | | [GCP Vertex AI](https://cloud.google.com/vertex-ai) | Google Cloud's Vertex AI platform, supporting Gemini and Claude models. **Credentials must be configured in advance. Follow the instructions at [https://cloud.google.com/vertex-ai/docs/authentication](https://cloud.google.com/vertex-ai/docs/authentication)
.** | `GCP_PROJECT_ID`, `GCP_LOCATION` and optional `GCP_MAX_RETRIES` (6), `GCP_INITIAL_RETRY_INTERVAL_MS` (5000), `GCP_BACKOFF_MULTIPLIER` (2.0), `GCP_MAX_RETRY_INTERVAL_MS` (320\_000). | | [Groq](https://groq.com/) | High-performance inference hardware and tools for LLMs. | `GROQ_API_KEY` | | [Ollama](https://ollama.com/) | Local model runner supporting Qwen, Llama, DeepSeek, and other open-source models. **Because this provider runs locally, you must first [download and run a model](/goose/docs/getting-started/providers#local-llms-ollama)
.** | `OLLAMA_HOST` | | [OpenAI](https://platform.openai.com/api-keys) | Provides gpt-4o, o1, and other advanced language models. Also supports OpenAI-compatible endpoints (e.g., self-hosted LLaMA, vLLM, KServe). **o1-mini and o1-preview are not supported because Goose uses tool calling.** | `OPENAI_API_KEY`, `OPENAI_HOST` (optional), `OPENAI_ORGANIZATION` (optional), `OPENAI_PROJECT` (optional), `OPENAI_CUSTOM_HEADERS` (optional) | | [OpenRouter](https://openrouter.ai/) | API gateway for unified access to various models with features like rate-limiting management. | `OPENROUTER_API_KEY` | Configure Provider[​](#configure-provider "Direct link to Configure Provider") ------------------------------------------------------------------------------- To configure your chosen provider or see available options, run `goose configure` in the CLI or visit the `Provider Settings` page in the Goose Desktop. * Goose CLI * Goose Desktop 1. Run the following command: goose configure 2. Select `Configure Providers` from the menu and press Enter. β”Œ goose-configure β”‚β—† What would you like to configure?β”‚ ● Configure Providers (Change provider or update credentials)β”‚ β—‹ Toggle Extensions β”‚ β—‹ Add Extension β”” 3. Choose a model provider and press Enter. β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Configure Providers β”‚β—† Which model provider should we use?β”‚ ● Anthropic (Claude and other models from Anthropic)β”‚ β—‹ Databricks β”‚ β—‹ Google Gemini β”‚ β—‹ Groq β”‚ β—‹ Ollama β”‚ β—‹ OpenAI β”‚ β—‹ OpenRouter β”” 4. Enter your API key (and any other configuration details) when prompted β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Configure Providers β”‚β—‡ Which model provider should we use?β”‚ Anthropic β”‚β—† Provider Anthropic requires ANTHROPIC_API_KEY, please enter a valueβ”‚ β”” **To update your LLM provider and API key:** 1. Click `...` in the upper right corner 2. Click `Settings` 3. Next to `Models`, click `Browse` 4. Click `Configure` in the upper right corner 5. Press the `+` button next to the provider of your choice 6. Add additional configurations (API key, host, etc) then press `submit` **To change provider model** 1. Click `...` in the upper right corner 2. Click `Settings` 3. Next to `Models`, click `Browse` 4. Scroll down to `Add Model` 5. Select a Provider from drop down menu 6. Enter Model name 7. Press `+ Add Model` You can explore more models by selecting a `provider` name under `Browse by Provider`. A link will appear, directing you to the provider's website. Once you've found the model you want, return to step 6 and paste the model name. Using Custom OpenAI Endpoints[​](#using-custom-openai-endpoints "Direct link to Using Custom OpenAI Endpoints") ---------------------------------------------------------------------------------------------------------------- Goose supports using custom OpenAI-compatible endpoints, which is particularly useful for: * Self-hosted LLMs (e.g., LLaMA, Mistral) using vLLM or KServe * Private OpenAI-compatible API servers * Enterprise deployments requiring data governance and security compliance * OpenAI API proxies or gateways ### Configuration Parameters[​](#configuration-parameters "Direct link to Configuration Parameters") | Parameter | Required | Description | | --- | --- | --- | | `OPENAI_API_KEY` | Yes | Authentication key for the API | | `OPENAI_HOST` | No | Custom endpoint URL (defaults to api.openai.com) | | `OPENAI_ORGANIZATION` | No | Organization ID for usage tracking and governance | | `OPENAI_PROJECT` | No | Project identifier for resource management | | `OPENAI_CUSTOM_HEADERS` | No | Additional headers to include in the request. Can be set via environment variable, configuration file, or CLI, in the format `HEADER_A=VALUE_A,HEADER_B=VALUE_B`. | ### Example Configurations[​](#example-configurations "Direct link to Example Configurations") * vLLM Self-Hosted * KServe Deployment * Enterprise OpenAI * Custom Headers If you're running LLaMA or other models using vLLM with OpenAI compatibility: OPENAI_HOST=https://your-vllm-endpoint.internalOPENAI_API_KEY=your-internal-api-key For models deployed on Kubernetes using KServe: OPENAI_HOST=https://kserve-gateway.your-clusterOPENAI_API_KEY=your-kserve-api-keyOPENAI_ORGANIZATION=your-org-idOPENAI_PROJECT=ml-serving For enterprise OpenAI deployments with governance: OPENAI_API_KEY=your-api-keyOPENAI_ORGANIZATION=org-id123OPENAI_PROJECT=compliance-approved For OpenAI-compatible endpoints that require custom headers: OPENAI_API_KEY=your-api-keyOPENAI_ORGANIZATION=org-id123OPENAI_PROJECT=compliance-approvedOPENAI_CUSTOM_HEADERS="X-Header-A=abc,X-Header-B=def" ### Setup Instructions[​](#setup-instructions "Direct link to Setup Instructions") * Goose CLI * Goose Desktop 1. Run `goose configure` 2. Select `Configure Providers` 3. Choose `OpenAI` as the provider 4. Enter your configuration when prompted: * API key * Host URL (if using custom endpoint) * Organization ID (if using organization tracking) * Project identifier (if using project management) 1. Click `...` in the upper right corner 2. Click `Settings` 3. Next to `Models`, click the `browse` link 4. Click the `configure` link in the upper right corner 5. Press the `+` button next to OpenAI 6. Fill in your configuration details: * API Key (required) * Host URL (for custom endpoints) * Organization ID (for usage tracking) * Project (for resource management) 7. Press `submit` Enterprise Deployment For enterprise deployments, you can pre-configure these values using environment variables or configuration files to ensure consistent governance across your organization. Using Goose for Free[​](#using-goose-for-free "Direct link to Using Goose for Free") ------------------------------------------------------------------------------------- Goose is a free and open source AI agent that you can start using right away, but not all supported [LLM Providers](/goose/docs/getting-started/providers) provide a free tier. Below, we outline a couple of free options and how to get started with them. Limitations These free options are a great way to get started with Goose and explore its capabilities. However, you may need to upgrade your LLM for better performance. ### Google Gemini[​](#google-gemini "Direct link to Google Gemini") Google Gemini provides a free tier. To start using the Gemini API with Goose, you need an API Key from [Google AI studio](https://aistudio.google.com/app/apikey) . To set up Google Gemini with Goose, follow these steps: * Goose CLI * Goose Desktop 1. Run: goose configure 2. Select `Configure Providers` from the menu. 3. Follow the prompts to choose `Google Gemini` as the provider. 4. Enter your API key when prompted. 5. Enter the Gemini model of your choice. β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Configure Providersβ”‚β—‡ Which model provider should we use?β”‚ Google Geminiβ”‚β—‡ Provider Google Gemini requires GOOGLE_API_KEY, please enter a valueβ”‚β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ”‚ β—‡ Enter a model from that provider:β”‚ gemini-2.0-flash-expβ”‚β—‡ Hello! You're all set and ready to go, feel free to ask me anything!β”‚β”” Configuration saved successfully **To update your LLM provider and API key:** 1. Click on the three dots in the top-right corner. 2. Select `Provider Settings` from the menu. 3. Choose `Google Gemini` as provider from the list. 4. Click Edit, enter your API key, and click `Set as Active`. ### Local LLMs (Ollama)[​](#local-llms-ollama "Direct link to Local LLMs (Ollama)") Ollama provides local LLMs, which requires a bit more set up before you can use it with Goose. 1. [Download Ollama](https://ollama.com/download) . 2. Run any [model supporting tool-calling](https://ollama.com/search?c=tools) : Limited Support for models without tool calling Goose extensively uses tool calling, so models without it (e.g. `DeepSeek-r1`) can only do chat completion. If using models without tool calling, all Goose [extensions must be disabled](/goose/docs/getting-started/using-extensions#enablingdisabling-extensions) . As an alternative, you can use a [custom DeepSeek-r1 model](/goose/docs/getting-started/providers#deepseek-r1) we've made specifically for Goose. Example: ollama run qwen2.5 3. In a separate terminal window, configure with Goose: goose configure 4. Choose to `Configure Providers` β”Œ goose-configure β”‚β—† What would you like to configure?β”‚ ● Configure Providers (Change provider or update credentials)β”‚ β—‹ Toggle Extensions β”‚ β—‹ Add Extension β”” 5. Choose `Ollama` as the model provider β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Configure Providers β”‚β—† Which model provider should we use?β”‚ β—‹ Anthropic β”‚ β—‹ Databricks β”‚ β—‹ Google Gemini β”‚ β—‹ Groq β”‚ ● Ollama (Local open source models)β”‚ β—‹ OpenAI β”‚ β—‹ OpenRouter β”” 5. Enter the host where your model is running Endpoint For Ollama, if you don't provide a host, we set it to `localhost:11434`. When constructing the URL, we preprend `http://` if the scheme is not `http` or `https`. If you're running Ollama on port 80 or 443, you'll have to set `OLLMA_HOST=http://host:{port}` β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Configure Providers β”‚β—‡ Which model provider should we use?β”‚ Ollama β”‚β—† Provider Ollama requires OLLAMA_HOST, please enter a valueβ”‚ http://localhost:11434β”” 6. Enter the model you have running β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Configure Providers β”‚β—‡ Which model provider should we use?β”‚ Ollama β”‚β—‡ Provider Ollama requires OLLAMA_HOST, please enter a valueβ”‚ http://localhost:11434β”‚β—‡ Enter a model from that provider:β”‚ qwen2.5β”‚β—‡ Welcome! You're all set to explore and utilize my capabilities. Let's get started on solving your problems together!β”‚β”” Configuration saved successfully ### DeepSeek-R1[​](#deepseek-r1 "Direct link to DeepSeek-R1") Ollama provides open source LLMs, such as `DeepSeek-r1`, that you can install and run locally. Note that the native `DeepSeek-r1` model doesn't support tool calling, however, we have a [custom model](https://ollama.com/michaelneale/deepseek-r1-goose) you can use with Goose. warning Note that this is a 70B model size and requires a powerful device to run smoothly. 1. Download and install Ollama from [ollama.com](https://ollama.com/download) . 2. In a terminal window, run the following command to install the custom DeepSeek-r1 model: ollama run michaelneale/deepseek-r1-goose * Goose CLI * Goose Desktop 3. In a separate terminal window, configure with Goose: goose configure 4. Choose to `Configure Providers` β”Œ goose-configure β”‚β—† What would you like to configure?β”‚ ● Configure Providers (Change provider or update credentials)β”‚ β—‹ Toggle Extensions β”‚ β—‹ Add Extension β”” 5. Choose `Ollama` as the model provider β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Configure Providers β”‚β—† Which model provider should we use?β”‚ β—‹ Anthropic β”‚ β—‹ Databricks β”‚ β—‹ Google Gemini β”‚ β—‹ Groq β”‚ ● Ollama (Local open source models)β”‚ β—‹ OpenAI β”‚ β—‹ OpenRouter β”” 5. Enter the host where your model is running β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Configure Providers β”‚β—‡ Which model provider should we use?β”‚ Ollama β”‚β—† Provider Ollama requires OLLAMA_HOST, please enter a valueβ”‚ http://localhost:11434β”” 6. Enter the installed model from above β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Configure Providers β”‚β—‡ Which model provider should we use?β”‚ Ollama β”‚β—‡ Provider Ollama requires OLLAMA_HOST, please enter a valueβ”‚ http://localhost:11434 β”‚ β—‡ Enter a model from that provider:β”‚ michaelneale/deepseek-r1-gooseβ”‚β—‡ Welcome! You're all set to explore and utilize my capabilities. Let's get started on solving your problems together!β”‚β”” Configuration saved successfully 3. Click `...` in the top-right corner. 4. Navigate to `Settings` -> `Browse Models` -> and select `Ollama` from the list. 5. Enter `michaelneale/deepseek-r1-goose` for the model name. * * * If you have any questions or need help with a specific provider, feel free to reach out to us on [Discord](https://discord.gg/block-opensource) or on the [Goose repo](https://github.com/block/goose) . * [Available Providers](#available-providers) * [Configure Provider](#configure-provider) * [Using Custom OpenAI Endpoints](#using-custom-openai-endpoints) * [Configuration Parameters](#configuration-parameters) * [Example Configurations](#example-configurations) * [Setup Instructions](#setup-instructions) * [Using Goose for Free](#using-goose-for-free) * [Google Gemini](#google-gemini) * [Local LLMs (Ollama)](#local-llms-ollama) * [DeepSeek-R1](#deepseek-r1) --- # Architecture Overview | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) [πŸ“„οΈ Goose Architecture\ ----------------------\ \ Goose, an open source AI Agent, builds upon the basic interaction framework of Large Language Models (LLMs), which primarily functions as a text-based conversational interface. It processes text input and generates text output. This "text in, text out" approach is enhanced with tool integrations, which allows the AI agent to complete tasks, creating Goose.](/goose/docs/goose-architecture/) [πŸ“„οΈ Extensions Design\ ---------------------\ \ This document describes the design and implementation of the Extensions framework in Goose, which enables AI agents to interact with different extensions through a unified tool-based interface.](/goose/docs/goose-architecture/extensions-design) [πŸ“„οΈ Error Handling\ ------------------\ \ Error handling is a key performance-driving part of Goose. There are many ways that the non-determinism](/goose/docs/goose-architecture/error-handling) --- # Building Custom Extensions | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose allows you to extend its functionality by creating your own custom extensions, which are built as MCP servers. These extensions are compatible with Goose because it adheres to the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) . MCP is an open protocol that standardizes how applications provide context to LLMs. It enables a consistent way to connect LLMs to various data sources and tools, making it ideal for extending functionality in a structured and interoperable way.Β  In this guide, we build an MCP server using the [Python SDK for MCP](https://github.com/modelcontextprotocol/python-sdk) . We’ll demonstrate how to create an MCP server that reads Wikipedia articles and converts them to Markdown, integrate it as an extension in Goose. You can follow a similar process to develop your own custom extensions for Goose. You can checkout other examples in this [MCP servers repository](https://github.com/modelcontextprotocol/servers) . MCP SDKs are also available in [Typescript](https://github.com/modelcontextprotocol/typescript-sdk) and [Kotlin](https://github.com/modelcontextprotocol/kotlin-sdk) . info Goose currently supports Tools and Resources for [MCP Server features](https://spec.modelcontextprotocol.io/specification/2024-11-05/server/) . We will be adding support for MCP Prompts soon. * * * Step 1: Initialize Your Project[​](#step-1-initialize-your-project "Direct link to Step 1: Initialize Your Project") --------------------------------------------------------------------------------------------------------------------- The first step is to create a new project using [uv](https://docs.astral.sh/uv/getting-started/) . We will name our project `mcp-wiki`. Run the following commands in your terminal to set up a basic structure for your MCP server: uv init mcp-wikicd mcp-wikirm hello.pymkdir -p src/mcp_wikitouch src/mcp_wiki/server.py # Your MCP server code (tool, resources, prompts)touch src/mcp_wiki/__init__.py # Primary CLI entry pointtouch src/mcp_wiki/__main__.py # To enable running as a Python module Your project directory structure should look like this: .β”œβ”€β”€ README.mdβ”œβ”€β”€ pyproject.tomlβ”œβ”€β”€ srcβ”‚ └── mcp_wikiβ”‚ β”œβ”€β”€ __init__.pyβ”‚ β”œβ”€β”€ __main__.pyβ”‚ └── server.py└── uv.lock * * * Step 2: Write Your MCP Server Code[​](#step-2-write-your-mcp-server-code "Direct link to Step 2: Write Your MCP Server Code") ------------------------------------------------------------------------------------------------------------------------------ In this step, we’ll implement the core functionality of the MCP server. Here is a breakdown of the key components: 1. **`server.py`**: This file holds the main MCP server code. In this example, we define a single tool to read Wikipedia articles. You can add your own custom tools, resources, and prompts here. 2. **`__init__.py`**: This is the primary CLI entry point for your MCP server. 3. **`__main__.py`**: This file allows your MCP server to be executed as a Python module. Below is the example implementation for the Wikipedia MCP server: ### `server.py`[​](#serverpy "Direct link to serverpy") import requestsfrom requests.exceptions import RequestExceptionfrom bs4 import BeautifulSoupfrom html2text import html2textfrom mcp.server.fastmcp import FastMCPfrom mcp.shared.exceptions import McpErrorfrom mcp.types import ErrorData, INTERNAL_ERROR, INVALID_PARAMSmcp = FastMCP("wiki")@mcp.tool()def read_wikipedia_article(url: str) -> str: """ Fetch a Wikipedia article at the provided URL, parse its main content, convert it to Markdown, and return the resulting text. Usage: read_wikipedia_article("https://en.wikipedia.org/wiki/Python_(programming_language)") """ try: # Validate input if not url.startswith("http"): raise ValueError("URL must start with http or https.") response = requests.get(url, timeout=10) if response.status_code != 200: raise McpError( ErrorData( INTERNAL_ERROR, f"Failed to retrieve the article. HTTP status code: {response.status_code}" ) ) soup = BeautifulSoup(response.text, "html.parser") content_div = soup.find("div", {"id": "mw-content-text"}) if not content_div: raise McpError( ErrorData( INVALID_PARAMS, "Could not find the main content on the provided Wikipedia URL." ) ) # Convert to Markdown markdown_text = html2text(str(content_div)) return markdown_text except ValueError as e: raise McpError(ErrorData(INVALID_PARAMS, str(e))) from e except RequestException as e: raise McpError(ErrorData(INTERNAL_ERROR, f"Request error: {str(e)}")) from e except Exception as e: raise McpError(ErrorData(INTERNAL_ERROR, f"Unexpected error: {str(e)}")) from e ### `__init__.py`[​](#__init__py "Direct link to __init__py") import argparsefrom .server import mcpdef main(): """MCP Wiki: Read Wikipedia articles and convert them to Markdown.""" parser = argparse.ArgumentParser( description="Gives you the ability to read Wikipedia articles and convert them to Markdown." ) parser.parse_args() mcp.run()if __name__ == "__main__": main() ### `__main__.py`[​](#__main__py "Direct link to __main__py") from mcp_wiki import mainmain() * * * Step 3: Define Project Configuration[​](#step-3-define-project-configuration "Direct link to Step 3: Define Project Configuration") ------------------------------------------------------------------------------------------------------------------------------------ Configure your project using `pyproject.toml`.Β This configuration defines the CLI script so that the mcp-wiki command is available as a binary. Below is an example configuration: [project]name = "mcp-wiki"version = "0.1.0"description = "MCP Server for Wikipedia"readme = "README.md"requires-python = ">=3.13"dependencies = [ "beautifulsoup4>=4.12.3", "html2text>=2024.2.26", "mcp[cli]>=1.2.0", "requests>=2.32.3",][project.scripts]mcp-wiki = "mcp_wiki:main"[build-system]requires = ["hatchling"]build-backend = "hatchling.build" * * * Step 4: Test Your MCP Server[​](#step-4-test-your-mcp-server "Direct link to Step 4: Test Your MCP Server") ------------------------------------------------------------------------------------------------------------ ### Using MCP Inspector[​](#using-mcp-inspector "Direct link to Using MCP Inspector") 1. Setup the project environment: uv sync 2. Activate your virtual environment: source .venv/bin/activate 3. Run your server in development mode: mcp dev src/mcp_wiki/server.py 4. Go to `http://localhost:5173` in your browser to open the MCP Inspector UI. 5. In the UI, you can click "Connect" to initialize your MCP server. Then click on "Tools" tab > "List Tools" and you should see the `read_wikipedia_article` tool. Then you can try to call the `read_wikipedia_article` tool with URL set to "[https://en.wikipedia.org/wiki/Bangladesh](https://en.wikipedia.org/wiki/Bangladesh) " and click "Run Tool". ![MCP Inspector UI](/goose/assets/images/custom-extension-mcp-inspector-aca22c16eb49051723a6ed413fd53fe7.png) ### Testing the CLI[​](#testing-the-cli "Direct link to Testing the CLI") 1. Install your project locally: uv pip install . 2. Check the executable in your virtual environment: ls .venv/bin/ # Verify your CLI is available 3. Test the CLI: mcp-wiki --help You should see output similar to: ❯ mcp-wiki --helpusage: mcp-wiki [-h]Gives you the ability to read Wikipedia articles and convert them to Markdown.options: -h, --help show this help message and exit * * * Step 5: Integrate with Goose[​](#step-5-integrate-with-goose "Direct link to Step 5: Integrate with Goose") ------------------------------------------------------------------------------------------------------------ To add your MCP server as an extension in Goose: 1. Go to `Settings > Extensions > Add`. 2. Set the `Type` to `StandardIO`. 3. Provide the ID, name, and description for your extension. 4. In the `Command` field, provide the absolute path to your executable. For example: uv run /full/path/to/mcp-wiki/.venv/bin/mcp-wiki Alternatively in Step 3, you can also publish your package to pypi.Β Once published, the server can be run directly using uvx. For example: uvx mcp-wiki For the purposes on this guide, we will show you how to run the local version.Β  ![Goose Settings for Adding Custom Extension](/goose/assets/images/custom-extension-settings-2f8639f68e9bde86c64af6518d2c0a2a.png) * * * Step 6: Use Your Extension in Goose[​](#step-6-use-your-extension-in-goose "Direct link to Step 6: Use Your Extension in Goose") --------------------------------------------------------------------------------------------------------------------------------- Once integrated, you can start using your extension in Goose. Open the Goose chat interface and call your tool as needed. You can verify that Goose has picked up the tools from your custom extension by asking it "what tools do you have?" ![Goose Chat - Ask about tools](/goose/assets/images/custom-extension-tools-9d440447ae99b18ae92819e652148abe.png) Then, you can try asking questions that require using the extension you added. ![Goose Chat - Use custom extension](/goose/assets/images/custom-extension-chat-dade20fed6d387174db32667977bdae1.png) πŸŽ‰ **Congratulations!** You’ve successfully built and integrated a custom MCP server with Goose. * [Step 1: Initialize Your Project](#step-1-initialize-your-project) * [Step 2: Write Your MCP Server Code](#step-2-write-your-mcp-server-code) * [`server.py`](#serverpy) * [`__init__.py`](#__init__py) * [`__main__.py`](#__main__py) * [Step 3: Define Project Configuration](#step-3-define-project-configuration) * [Step 4: Test Your MCP Server](#step-4-test-your-mcp-server) * [Using MCP Inspector](#using-mcp-inspector) * [Testing the CLI](#testing-the-cli) * [Step 5: Integrate with Goose](#step-5-integrate-with-goose) * [Step 6: Use Your Extension in Goose](#step-6-use-your-extension-in-goose) --- # Asana Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page This tutorial covers how to add the [Asana MCP Server](https://github.com/roychri/mcp-server-asana) as a Goose extension to enable task automation, project tracking, and team collaboration. TLDR **Command** npx -y @roychri/mcp-server-asana **Environment Variable** ASANA_ACCESS_TOKEN: Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ Asana β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Asana β”‚ β—† What command should be run? β”‚ npx -y @roychri/mcp-server-asana β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extension β”‚β—‡ What would you like to call this extension?β”‚ Asanaβ”‚β—‡ What command should be run?β”‚ npx -y @roychri/mcp-server-asanaβ”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” 6. Obtain a [Asana Access Token](https://app.asana.com/0/my-apps) and paste it in. info See [Asana's developer docs](https://developers.asana.com/docs/personal-access-token) if you need detailed instructions on creating an access token. β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Asana β”‚ β—‡ What command should be run? β”‚ npx -y @roychri/mcp-server-asana β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ Yes β”‚ β—‡ Environment variable name: β”‚ ASANA_ACCESS_TOKEN β”‚ β—‡ Environment variable value: β”‚ β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺ β”‚ β—‡ Add another environment variable? β”‚ No β”” Added Asana extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40roychri%2Fmcp-server-asana&id=asana&name=Asana&description=enable%20task%20automation%2C%20project%20tracking%2C%20and%20team%20collaboration&env=ASANA_ACCESS_TOKEN%3DAsana%20Access%20Token) 2. Press `Yes` to confirm the installation 3. Obtain a [Asana Access Token](https://app.asana.com/0/my-apps) and paste it in info See [Asana's developer docs](https://developers.asana.com/docs/personal-access-token) if you need detailed instructions on creating an access token. 4. Click `Save Configuration` 5. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- LLM OpenAI's GPT-4o was used for this task. There's an [open bug](https://github.com/block/goose/issues/1804) for Amazon Bedrock models. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") > _Goose, I have one hour. Look through uncompleted tasks assigned to me in Asana and show me ones that you estimate will take an hour or less. Order them by deadline._ ### Goose Output[​](#goose-output "Direct link to Goose Output") Note that IDs have been changed to generic ones CLI Tool Calls ─── asana\_search\_tasks | abcdefgh ────────────────────────── assignee.any: me completed: false workspace: 1234567890123 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000001 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000002 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000003 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000004 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000005 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000006 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000007 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000008 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000009 ─── asana\_get\_task | abcdefgh ────────────────────────── opt\_fields: due\_on,estimated\_hours task\_id: 1100000000000010 Here are your uncompleted tasks in Asana estimated to take an hour or less, ordered by their deadline: 1. **Task:** Review team meeting notes * **Due Date:** 2025-03-21 2. **Task:** Draft quick status update * **Due Date:** 2025-03-21 3. **Task:** Proofread blog post * **Due Date:** 2025-03-21 4. **Task:** Send reminder to partners * **Due Date:** 2025-03-27 Please let me know if you'd like more information or help with any specific task! * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Providing Hints to Goose | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page `.goosehints` is a text file used to provide additional context about your project and improve the communication with Goose. The use of `goosehints` ensures that Goose understands your requirements better and can execute tasks more effectively. Developer extension required To make use of the hints file, you need to have the `Developer` extension [enabled](/goose/docs/getting-started/using-extensions) . This guide will walk you through creating and using your `.goosehints` file to streamline your workflow with custom instructions and context. Creating your hints file[​](#creating-your-hints-file "Direct link to Creating your hints file") ------------------------------------------------------------------------------------------------- Goose supports two types of hint files: * **Global hints file** - These hints will apply to all your sessions with Goose, regardless of directory. * **Local hints file** - These hints will only apply when working in a specific directory. tip You can use both global and local hints at the same time. When both exist, Goose will consider both your global preferences and project-specific requirements. If the instructions in your local hints file conflict with your global preferences, Goose will prioritize the local hints. * Manual * Goose Desktop * **Global hints file** - Create a `.goosehints` file in `~/.config/goose`. * **Local hints file** - Create a `.goosehints` file at the root of the directory you'd like it applied to. #### Global hints file[​](#global-hints-file "Direct link to Global hints file") 1. Create a `.goosehints` file in `~/.config/goose`. #### Local hints file[​](#local-hints-file "Direct link to Local hints file") 1. Change the directory to where you'd like to set up the file. You can do this by clicking the directory path in the lower left bottom of the screen 2. Click `...` in the upper right corner 3. Click `Configure .goosehints` 4. Enter your local tips into the textarea 5. Click `Save` tip You may have to adjust the screen size to fully see the Save and Cancel buttons. The `.goosehints` file can include any instructions or contextual details relevant to your projects. A good time to consider adding a `.goosehints` file is when you find yourself repeating prompts, or providing the same kind of instructions multiple times. It's also a great way to provide a lot of context which might be better suited in a file. Setting up hints[​](#setting-up-hints "Direct link to Setting up hints") ------------------------------------------------------------------------- The `.goosehints` file supports natural language. ### Example global `.goosehints` file[​](#example-global-goosehints-file "Direct link to example-global-goosehints-file") Always use TypeScript for new Next.js projects.Follow the [Google Style Guide](https://google.github.io/styleguide/pyguide.html) for Python code.Run unit tests before committing any changes.Prefer functional programming patterns where applicable. ### Example local `.goosehints` file[​](#example-local-goosehints-file "Direct link to example-local-goosehints-file") This is a simple example JavaScript web application that uses the Express.js framework. View [Express documentation](https://expressjs.com/) for extended guidance.Go through the README.md for information on how to build and test it as needed.Make sure to confirm all changes with me before applying.Run tests with `npm run test` ideally after each change. Common use cases[​](#common-use-cases "Direct link to Common use cases") ------------------------------------------------------------------------- Here are some ways people have used hints to provide additional context to Goose: * **Decision-Making**: Specify if Goose should autonomously make changes or confirm actions with you first. * **Validation Routines**: Provide test cases or validation methods that Goose should perform to ensure changes meet project specifications. * **Feedback Loop**: Include steps that allow Goose to receive feedback and iteratively improve its suggestions. * **Point to more detailed documentation**: Indicate important files like `README.md`, `CONTRIBUTING.md`, or others that Goose should consult for detailed explanations. Like prompts, this is not an extensive list to shape your `.goosehints` file. You can include as much context as you need. Best practices[​](#best-practices "Direct link to Best practices") ------------------------------------------------------------------- * **Keep file updated**: Regularly update the `.goosehints` file to reflect any changes in project protocols or priorities. * **Be concise**: Make sure the content is straightforward and to the point, ensuring Goose can quickly parse and act on the information. * **Start small**: Create a small set of clear, specific hints and gradually expand them based on your needs. This makes it easier to understand how Goose interprets and applies your instructions. * [Creating your hints file](#creating-your-hints-file) * [Setting up hints](#setting-up-hints) * [Example global `.goosehints` file](#example-global-goosehints-file) * [Example local `.goosehints` file](#example-local-goosehints-file) * [Common use cases](#common-use-cases) * [Best practices](#best-practices) --- # AgentQL Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page This tutorial covers how to add the [AgentQL MCP Server](https://github.com/tinyfish-io/agentql-mcp) as a Goose extension to extract and transform unstructured web content into structured data. TLDR **Command** npx -y agentql-mcp **Environment Variable** AGENTQL_API_KEY: Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ agentql β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ agentql β”‚ β—† What command should be run? β”‚ npx -y agentql-mcp β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ agentql β”‚ β—‡ What command should be run? β”‚ npx -y agentql-mcp β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Obtain an [AgentQL API Key](https://dev.agentql.com/api-keys) and paste it in. β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ agentql β”‚ β—‡ What command should be run? β”‚ npx -y agentql-mcp β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ Yes β”‚ β—‡ Environment variable name: β”‚ AGENTQL_API_KEY β”‚ β—‡ Environment variable value: β”‚ β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺ β”‚ β—‡ Add another environment variable? β”‚ No β”” Added agentql extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=agentql-mcp&id=agentql&name=AgentQL&description=Transform%20unstructured%20web%20content%20into%20structured%20data&env=AGENTQL_API_KEY%3DAgentQL%20API%20Key) 2. Press `Yes` to confirm the installation 3. Obtain an [AGENTQL\_API\_KEY](https://dev.agentql.com/api-keys) and paste it in 4. Click `Save Configuration` 5. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- Let's use the AgentQL extension to gather and structure tech conference data to help plan speaking engagements. LLM Anthropic's Claude 3.5 Sonnet was used for this task. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") I'm a tech conference speaker planning my 2025-2026 submissions. Extract for developer conferences (attendance > 500) occurring between 2022-2024:- Conference name- Conference dates- CFP timeline To identify:- Consistent monthly patterns- Whether conferences stick to same months yearly- If CFP windows are consistent year-to-year- Any shifts in traditional timingStructure results as JSON ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you analyze conference patterns using the web data extraction tool. Let me break this down into a few queries to get comprehensive data.─── extract-web-data | agentql ──────────────────────────prompt: ...url: ...Let me get some historical data to compare patterns:─── extract-web-data | agentql ──────────────────────────prompt: ....url: ....Based on my research and the available data, I'll provide an analysis of major tech conference patterns. Here's the structured JSON with my findings:{ "analysis": { "major_conference_patterns": { "timing_consistency": { "spring_events": { "typical_months": ["March", "April", "May"], "notable_conferences": [ "Google I/O", "Microsoft Build", "DevOpsDays (various locations)" ], "cfp_patterns": "Usually opens 4-6 months before event, closes 2-3 months before" }, "fall_events": { "typical_months": ["September", "October", "November"], "notable_conferences": [ "AWS re:Invent", "KubeCon + CloudNativeCon" ], "cfp_patterns": "Usually opens 6-8 months before event, closes 4-5 months before" } }, "observed_trends": { "timing_consistency": "High - Most major conferences maintain consistent months year-over-year", "cfp_windows": { "typical_duration": "6-12 weeks", "advance_notice": "4-8 months before event", "variation": "Regional events tend to have shorter CFP windows (4-6 weeks)" }, "recent_shifts": [ "Increased hybrid/virtual options post-2022", "More regional editions of major conferences", "Earlier CFP deadlines for larger events" ] } }, "recommendations_for_2025_2026": { "spring_submissions": { "prepare_by": "September-October of previous year", "submit_during": "November-December of previous year" }, "fall_submissions": { "prepare_by": "February-March", "submit_during": "March-April" } } }}Key Insights for Your Planning:1. **Monthly Patterns**: - Spring conference season: March-May - Fall conference season: September-November - Summer tends to be lighter for major tech conferences - December-January typically quiet except for regional events2. **Year-to-Year Consistency**: - Major conferences (AWS re:Invent, KubeCon, Google I/O) are very consistent with their timing - Regional versions of major conferences (like DevOpsDays) show more date flexibility - Most maintain the same quarter/season year over year3. **CFP Windows**: - Larger conferences: 6-8 months before event - Regional conferences: 3-4 months before event - Trend toward longer review periods for major conferences - Many now have rolling or multi-phase CFP processes4. **Recent Shifts**: - Earlier CFP deadlines compared to pre-2022 - More hybrid/virtual components - Increased number of regional editions of major conferences - Longer review periods for submissionsFor 2025-2026 planning, I recommend:- Start preparing fall 2025 submissions by February-March 2025- Start preparing spring 2026 submissions by September-October 2025- Consider regional versions of major conferences as they often have later deadlines- Keep track of multi-track conferences as they might have different CFP deadlines for different tracksWould you like me to focus on any specific aspect of these patterns or provide more detailed information about particular conferences? * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Set LLM Rate Limits | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Rate limiting is the process of restricting the number of requests a user or application can send to an LLM API within a specific timeframe. LLM providers enforce this with the purpose of managing resources and preventing abuse. Since Goose is working very quickly to implement your tasks, you may need to manage rate limits imposed by the provider. If you frequently hit rate limits, consider upgrading your LLM plan to access higher tier limits or using OpenRouter. Using OpenRouter[​](#using-openrouter "Direct link to Using OpenRouter") ------------------------------------------------------------------------- OpenRouter provides a unified interface for LLMs that allows you to select and switch between different providers automatically - all under a single billing plan. With OpenRouter, you can utilize free models or purchase credits for paid models. 1. Go to [openrouter.ai](https://openrouter.ai) and create an account. 2. Once verified, create your [API key](https://openrouter.ai/settings/keys) . * Goose CLI * Goose Desktop 1. Run the Goose configuration command: goose configure 2. Select `Configure Providers` from the menu. 3. Follow the prompts to choose OpenRouter as your provider and enter your OpenRouter API key when prompted. 1. Click on the three dots in the top-right corner. 2. Select `Settings` from the menu. 3. Click on "Browse" in the `Models` section. 4. Click on `Configure` 5. Select `OpenRouter` from the list of available providers. 6. Enter your OpenRouter API key in the dialog that appears. Now Goose will send your requests through OpenRouter which will automatically switch models when necessary to avoid interruptions due to rate limiting. * [Using OpenRouter](#using-openrouter) --- # Blender Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [Blender MCP Server](https://github.com/ahujasid/blender-mcp) as a Goose extension to create 3D scenes, control Blender with natural language, generate models, apply materials, and more. TLDR **Command** uvx blender-mcp **Requirement** Download [Blender Application](https://www.blender.org/download/) and [Blender MCP Addon file](https://github.com/ahujasid/blender-mcp/blob/main/addon.py) Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [uv](https://docs.astral.sh/uv/#installation) installed on your system to run this command, as it uses `uvx`. 1. Download [Blender Application](https://www.blender.org/download/) 2. Add Blender MCP Addon * Download the `addon.py` file from the [Blender MCP repository](https://github.com/ahujasid/blender-mcp/blob/main/addon.py) . * Open Blender * Navigate to `Edit` > `Preferences` > `Add-ons`. * Click the down arrow, select `install from disk`, add the `addon.py` file you downloaded. * After installing, check the box to enable `Blender MCP`. 3. Start Blender MCP server * In Blender, press N to open the sidebar. * Go to the Blender MCP tab. * Click `connect to MCP server` ### Add Blender MCP Server[​](#add-blender-mcp-server "Direct link to Add Blender MCP Server") * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ blender β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ blender β”‚ β—† What command should be run? β”‚ uvx blender-mcp β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extension β”‚β—‡ What would you like to call this extension?β”‚ blenderβ”‚β—‡ What command should be run?β”‚ uvx blender-mcpβ”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” 6. Choose No when asked to add environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ blender β”‚ β—‡ What command should be run? β”‚ uvx blender-mcp β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No | β”” Added blender extension 1. [Launch the installer](goose://extension?cmd=uvx&arg=blender-mcp&id=blender&name=Blender&description=Blender%203D%20scene%20creation%20integration) 2. Press `Yes` to confirm the installation 3. Click `Save Configuration` 4. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I’ll show you how to use Goose with the Blender Extension to build an entire 3D campfire scene from scratch. By automating Blender controls through natural language, Goose can create objects like logs and fireballs, apply realistic materials, add lighting effects, generate particles for sparks, create subtle smoke, and even animate the fire to gently pulse over time. In this example, I’ll show you how to use Goose with the Blender Extension to build a full 3D campfire scene, including logs, fireballs, lighting, and subtle fire animation, just by describing what you want. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") > Build a cozy campfire scene. Add a ground plane, place a few logs in a circle, and add a glowing fireball in the middle. Set the lighting to a warm tone like a sunset, and angle the camera for a dramatic shot. Give the logs a rough wood texture and make the fireball emit light. ### Goose Output[​](#goose-output "Direct link to Goose Output") CLI I'll help you create a cozy campfire scene in Blender. Let's break this down into steps and use a combination of basic objects, textures from PolyHaven, and proper lighting. First, let's check what we're working with. ─── **Get Scene Info** ─── Let's build the scene step by step: First, let's remove the default cube and set up our ground plane: ─── **Execute Blender Code** ─── 2. Now let's create the logs in a circle: ─── **Execute Blender Code** ─── 3. Let's create the glowing fireball in the middle: ─── **Execute Blender Code** ─── Let me fix the fireball material: ─── **Execute Blender Code** ─── 4. Finally, let's set up the lighting and camera for a dramatic sunset shot: ─── **Execute Blender Code** ─── I've created a cozy campfire scene with the following elements: 1. A large ground plane with a dark brown material 2. 5 logs arranged in a circle, with a rough wood material 3. A glowing fireball in the center with emission material 4. A point light to create the fire's glow effect 5. Adjusted the main sun light to create a warm sunset atmosphere 6. Positioned the camera for a dramatic angle 7. Set up the scene for better rendering with Cycles The scene has a warm, cozy atmosphere with the logs arranged naturally around the glowing fireball. The lighting simulates a sunset with warm tones, and the camera is positioned to capture the scene from an interesting angle. If you'd like to make any adjustments, such as: * Changing the size or position of any elements * Adjusting the lighting intensity * Modifying the camera angle * Adding more details like small rocks or additional logs Just let me know and I'll help you refine the scene further! #### Blender Image[​](#blender-image "Direct link to Blender Image") ![Blender MCP Scene](/goose/assets/images/blender-6a9190b0fd17a51a2c0c86b8301aafb4.png) * [Configuration](#configuration) * [Add Blender MCP Server](#add-blender-mcp-server) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # CI/CD Environments | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose isn’t just useful on your local machine, it can also streamline tasks in CI/CD environments. By integrating Goose into your pipeline, you can automate tasks such as: * Code reviews * Documentation checks * Build and deployment workflows * Infrastructure and environment management * Rollbacks and recovery processes * Intelligent test execution This guide walks you through setting up Goose in your CI/CD pipeline, with a focus on using GitHub Actions for code reviews. Using Goose with GitHub Actions[​](#using-goose-with-github-actions "Direct link to Using Goose with GitHub Actions") ---------------------------------------------------------------------------------------------------------------------- You can run Goose directly within GitHub Actions. Follow these steps to set up your workflow. TLDR Copy the GitHub Workflow goose.yml name: Gooseon: pull_request: types: [opened, synchronize, reopened, labeled]permissions: contents: write pull-requests: write issues: writeenv: PROVIDER_API_KEY: ${{ secrets.REPLACE_WITH_PROVIDER_API_KEY }} PR_NUMBER: ${{ github.event.pull_request.number }}jobs: goose-comment: runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Gather PR information run: | { echo "# Files Changed" gh pr view $PR_NUMBER --json files \ -q '.files[] | "* " + .path + " (" + (.additions|tostring) + " additions, " + (.deletions|tostring) + " deletions)"' echo "" echo "# Changes Summary" gh pr diff $PR_NUMBER } > changes.txt - name: Install Goose CLI run: | mkdir -p /home/runner/.local/bin curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh \ | CONFIGURE=false INSTALL_PATH=/home/runner/.local/bin bash echo "/home/runner/.local/bin" >> $GITHUB_PATH - name: Configure Goose run: | mkdir -p ~/.config/goose cat < ~/.config/goose/config.yaml GOOSE_PROVIDER: REPLACE_WITH_PROVIDER GOOSE_MODEL: REPLACE_WITH_MODEL keyring: false EOF - name: Create instructions for Goose run: | cat < instructions.txt Create a summary of the changes provided. Don't provide any session or logging details. The summary for each file should be brief and structured as: - dot points of changes You don't need any extensions, don't mention extensions at all. The changes to summarise are: $(cat changes.txt) EOF - name: Test run: cat instructions.txt - name: Run Goose and filter output run: | goose run --instructions instructions.txt | \ # Remove ANSI color codes sed -E 's/\x1B\[[0-9;]*[mK]//g' | \ # Remove session/logging lines grep -v "logging to /home/runner/.config/goose/sessions/" | \ grep -v "^starting session" | \ grep -v "^Closing session" | \ # Trim trailing whitespace sed 's/[[:space:]]*$//' \ > pr_comment.txt - name: Post comment to PR run: | cat -A pr_comment.txt gh pr comment $PR_NUMBER --body-file pr_comment.txt\ \ ### 1\. Create the Workflow File[​](#1-create-the-workflow-file "Direct link to 1. Create the Workflow File")\ \ Create a new file in your repository at `.github/workflows/goose.yml`. This will contain your GitHub Actions workflow.\ \ ### 2\. Define the Workflow Triggers and Permissions[​](#2-define-the-workflow-triggers-and-permissions "Direct link to 2. Define the Workflow Triggers and Permissions")\ \ Configure the action such that it:\ \ * Triggers the workflow when a pull request is opened, updated, reopened, or labeled\ * Grants the necessary permissions for Goose to interact with the repository\ * Configures environment variables for your chosen LLM provider\ \ name: Gooseon: pull_request: types: [opened, synchronize, reopened, labeled]permissions: contents: write pull-requests: write issues: writeenv: PROVIDER_API_KEY: ${{ secrets.REPLACE_WITH_PROVIDER_API_KEY }} PR_NUMBER: ${{ github.event.pull_request.number }}\ \ ### 3\. Install and Configure Goose[​](#3-install-and-configure-goose "Direct link to 3. Install and Configure Goose")\ \ To install and set up Goose in your workflow, add the following steps:\ \ steps: - name: Install Goose CLI run: | mkdir -p /home/runner/.local/bin curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh \ | CONFIGURE=false INSTALL_PATH=/home/runner/.local/bin bash echo "/home/runner/.local/bin" >> $GITHUB_PATH - name: Configure Goose run: | mkdir -p ~/.config/goose cat < ~/.config/goose/config.yaml GOOSE_PROVIDER: REPLACE_WITH_PROVIDER GOOSE_MODEL: REPLACE_WITH_MODEL keyring: false EOF\ \ Replacements\ \ Replace `REPLACE_WITH_PROVIDER` and `REPLACE_WITH_MODEL` with your LLM provider and model names and add any other necessary configuration required.\ \ ### 4\. Gather PR Changes and Prepare Instructions[​](#4-gather-pr-changes-and-prepare-instructions "Direct link to 4. Gather PR Changes and Prepare Instructions")\ \ This step extracts pull request details and formats them into structured instructions for Goose.\ \ - name: Create instructions for Goose run: | cat < instructions.txt Create a summary of the changes provided. Don't provide any session or logging details. The summary for each file should be brief and structured as: - dot points of changes You don't need any extensions, don't mention extensions at all. The changes to summarise are: $(cat changes.txt) EOF\ \ ### 5\. Run Goose and Clean Output[​](#5-run-goose-and-clean-output "Direct link to 5. Run Goose and Clean Output")\ \ Now, run Goose with the formatted instructions and clean the output by removing ANSI color codes and unnecessary log messages.\ \ - name: Run Goose and filter output run: | goose run --instructions instructions.txt | \ # Remove ANSI color codes sed -E 's/\x1B\[[0-9;]*[mK]//g' | \ # Remove session/logging lines grep -v "logging to /home/runner/.config/goose/sessions/" | \ grep -v "^starting session" | \ grep -v "^Closing session" | \ # Trim trailing whitespace sed 's/[[:space:]]*$//' \ > pr_comment.txt\ \ ### 6\. Post Comment to PR[​](#6-post-comment-to-pr "Direct link to 6. Post Comment to PR")\ \ Finally, post the Goose output as a comment on the pull request:\ \ - name: Post comment to PR run: | cat -A pr_comment.txt gh pr comment $PR_NUMBER --body-file pr_comment.txt\ \ With this workflow, Goose will run on pull requests, analyze the changes, and post a summary as a comment on the PR.\ \ This is just one example of what's possible. Feel free to modify your GitHub Action to meet your needs.\ \ * * *\ \ Security Considerations[​](#security-considerations "Direct link to Security Considerations")\ \ ----------------------------------------------------------------------------------------------\ \ When running Goose in a CI/CD enviroment, keep these security practices in mind:\ \ 1. **Secret Management**\ \ * Store your sensitive credentials (like API keys) as GitHub Secrets.\ * Never expose these credentials in logs or PR comments.\ 2. **Principle of Least Privilege**\ \ * Grant only the necessary permissions in your workflow and regularly audit them.\ 3. **Input Validation**\ \ * Ensure any inputs passed to Goose are sanitized and validated to prevent unexpected behavior.\ \ * [Using Goose with GitHub Actions](#using-goose-with-github-actions)\ * [1\. Create the Workflow File](#1-create-the-workflow-file)\ \ * [2\. Define the Workflow Triggers and Permissions](#2-define-the-workflow-triggers-and-permissions)\ \ * [3\. Install and Configure Goose](#3-install-and-configure-goose)\ \ * [4\. Gather PR Changes and Prepare Instructions](#4-gather-pr-changes-and-prepare-instructions)\ \ * [5\. Run Goose and Clean Output](#5-run-goose-and-clean-output)\ \ * [6\. Post Comment to PR](#6-post-comment-to-pr)\ \ * [Security Considerations](#security-considerations) --- # Error Handling | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Error handling is a key performance-driving part of Goose. There are many ways that the non-determinism in the LLM can introduce an error that it can in turn recover from. In a typical Goose session, it's expected for there to be several agent errors that the model can see directly and correct, perhaps entirely behind the scenes. Traditional Errors[​](#traditional-errors "Direct link to Traditional Errors") ------------------------------------------------------------------------------- While the agent is operating, there can be intermittent issues in the network, availability of the foundational model, etc. These are raised as errors in the agent API to the caller, who can decide how to handle that. We generally handle these with [anyhow::Error](https://docs.rs/anyhow/latest/anyhow/) . Agent Errors[​](#agent-errors "Direct link to Agent Errors") ------------------------------------------------------------- There are several types of errors where everything is working correctly, but the model generations themselves are somehow causing errors. Things like generating an unknown tool name, incorrect parameters, or a well formed tool call that results in an error in the tool itself. All of these can be surfaced to the LLM to have it attempt to recover. The error messages are in some ways prompting - they give instructions to the LLM on how it might go about recovering. We handle these with [thiserror::Error](https://docs.rs/thiserror/latest/thiserror/) and carefully maintain a collection. To cover all these cases, both `ToolUse` and `ToolResult` are typically passed through the API as part of a `Result`. An error in a `ToolUse` will immediately become an error in a `ToolResult` and passed back to the LLM. A valid `ToolUse` might still end up in an error `ToolResult`, which is also passed back to the LLM. The providers then handle translating the agent errors into the various API specs as valid messages. * [Traditional Errors](#traditional-errors) * [Agent Errors](#agent-errors) --- # Computer Controller Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * The Computer Controller extension helps automate everyday computer tasks and web interactions such as searching the web, controlling system settings, processing data files, and controlling applications without needing to know how to code. This tutorial covers enabling and using the Computer Controller MCP Server, which is a built-in Goose extension. tip Let Goose complete its tasks without interruption - avoid using your mouse or keyboard until it's done. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- 1. Ensure extension is enabled: * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Built-in Extension` β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—† What type of extension would you like to add?β”‚ ● Built-in Extension (Use an extension that comes with Goose)β”‚ β—‹ Command-line Extension β”‚ β—‹ Remote Extension β”” 3. Select the `Computer Controller` extension β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extension β”‚β—† Which built-in extension would you like to enable?β”‚ β—‹ Developer Tools β”‚ ● Computer Controller β”‚ β—‹ Memory | β—‹ JetBrainsβ”” Enabled Computer Controller extension 4. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extension β”‚β—† Which built-in extension would you like to enable?β”‚ Computer Controller β”‚ β—† Please set the timeout for this tool (in secs):β”‚ 300β”” Enabled Computer Controller extension 1. Click `...` in the upper right corner 2. Click `Settings` 3. Under `Extensions`, toggle `Computer Controller` to on. Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I'll show you how Goose can multitask, handling everything from system controls and music playback to web research and data organization. LLM Anthropic's Claude 3.5 Sonnet was used for this task. * Goose CLI * Goose Desktop 1. Open a terminal and start a new Goose session: goose session 1. Open a new session in Goose Desktop ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Goose, I need to decompress while researching AI models for tomorrow's meeting. Can you create a relaxing environment and help me research?1. Play classical music in Safari2. Dim screen brightness (2 levels)3. Research current flagship AI models (Anthropic, OpenAI, Google): * Verify availability * Collect: release date, features, pricing, context window * Use official sources only4. Create "ai-models-comparison.csv" on desktop with collected data5. Launch Numbers and open the CSV file6. Reset brightness and close Safari ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you create a relaxing research environment and gather information about AI models. I'll break this down into steps:1. First, let's set up the relaxing environment with classical music and dimmed screen:─── computer_control | computercontroller ──────────────────────────script: ...2. Now, let's research the AI models. I'll use web search and scraping to gather information from official sources:─── web_search | computercontroller ──────────────────────────query: Claude─── web_search | computercontroller ──────────────────────────query: GPT4─── web_search | computercontroller ──────────────────────────query: Gemini3. Let's create the CSV file with the collected information:─── automation_script | computercontroller ──────────────────────────language: shellscript: ...4. Now, let's open the CSV file in Numbers and reset the environment:─── computer_control | computercontroller ──────────────────────────script: ...I've completed all the requested tasks:1. βœ… Played classical music in Safari2. βœ… Dimmed screen brightness3. βœ… Researched current flagship AI models4. βœ… Created the CSV file on desktop5. βœ… Launched Numbers and opened the CSV file6. βœ… Reset brightness and closed SafariThe CSV file has been created on your desktop with the following information for each model:- Model name- Company- Release date- Key features- Context window size- Pricing informationThe file is now open in Numbers for your review. The environment has been reset to normal settings. Is there anything specific about any of the models you'd like me to elaborate on? ### Results[​](#results "Direct link to Results") ![Computer Controller MCP Output](/goose/assets/images/computer-controller-csv-result-e70478e8b2736ac21c595dba9e4cee3a.png) * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) * [Results](#results) --- # Developer Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * The Developer extension allows Goose to automate developer-centric tasks such as file editing, shell command execution, and project setup. This tutorial will cover enabling and using the Developer MCP Server, which is a built-in Goose extension. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info The Developer extension is already enabled by default when Goose is installed. 1. Ensure extension is enabled: * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to `Toggle Extensions` β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Toggle Extensions β”‚β—† Enable extensions: (use "space" to toggle and "enter" to submit)β”‚ ● developerβ”” Extension settings updated successfully 1. Click `...` in the upper right corner 2. Click `Settings` 3. Under `Extensions`, toggle `Developer` to on. Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I'm going to have Goose automate setting up my JavaScript developer environment with Express, Mongoose, Nodemon, Dotenv and initialize Git. LLM Anthropic's Claude 3.5 Sonnet was used for this task. * Goose CLI * Goose Desktop 1. Open a terminal and start a new Goose session: goose session 1. Open a new session in Goose Desktop ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") set up a new JavaScript project with Express, Mongoose, Nodemon, and Dotenv? Fetch the latest package versions, generate a README with those versions, and initialize Git After 1 minute, Goose was done setting up my entire dev environment! πŸŽ‰ ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you set up a new JavaScript project with those dependencies. I'll break this down into steps:1. First, let's create a new directory and initialize the project2. Then install the dependencies3. Create a detailed README4. Initialize git5. Create some starter files6. Let's begin:[... shell commands, files created ...]Great! I've set up a complete Express project with MongoDB and Dotenv integrations:1. Created a new project directory and initialized npm2. Installed Express, Mongoose, and dotenv dependencies3. set up the basic project structure with directories for: - config/ - models/ - routes/ - controllers/4. Created essential files: - index.js (main server file) - .env (environment variables) - .ignore (with common node.js ignores)5. Added a basic user model with basic name and email fields6. Created a user controller with two methods: - getUsers (GET all users) - createUser (POST new user)7. Added user routes under `/api/routes`8. Updated package.json with start scripts9. Created a comprehensive README.md with: - Installation scripts - Project structure - Available scripts - Environment variables - Latest package versionsThe project structure is:my-express-app/β”œβ”€β”€ config/ # Configuration filesβ”œβ”€β”€ models/ # MongoDB modelsβ”‚ └── User.js # User modelβ”œβ”€β”€ routes/ # API routesβ”‚ └── userRoutes.jsβ”œβ”€β”€ controllers/ # Route controllersβ”‚ └── userController.jsβ”œβ”€β”€ .env # Environment variablesβ”œβ”€β”€ .gitignore # Git ignore fileβ”œβ”€β”€ index.js # Entry point└── package.json # Project dependencies and scriptsTo start developing you can:1. Run `npm install` to install dependencies2. start the server with `npm run dev` The API will be available at: - `http://localhost:3000/api/users` (GET to get all users) - `http://localhost:3000/api/users` (POST to create a new user)To test out the API you can use tools like postman or curl, for example, to create a new user:curl x POST http://localhost:3000/api/users \-H "Content-Type: application/json" \-d '{"name": "Ebony Louis" , "email": "ebony@example.com"}'Would you like me to add any additional features or make other improvements to the setup? * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Managing Goose Sessions | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page A session is a single, continuous interaction between you and Goose, providing a space to ask questions and prompt action. In this guide, we'll cover how to start, exit, and resume a session. Start Session[​](#start-session "Direct link to Start Session") ---------------------------------------------------------------- * Goose CLI * Goose Desktop From your terminal, navigate to the directory from which you'd like to start, and run: goose session After choosing an LLM provider, you’ll see the session interface ready for use. Type your questions, tasks, or instructions directly into the input field, and Goose will immediately get to work. To start a new session at any time, click the three dots in the top-right corner of the application and select **New Session** from the dropdown menu. info If this is your first session, Goose will prompt you for an API key to access an LLM (Large Language Model) of your choice. For more information on setting up your API key, see the [Installation Guide](/goose/docs/getting-started/installation#set-llm-provider) . Here is the list of [supported LLMs](/goose/docs/getting-started/providers) . Name Session[​](#name-session "Direct link to Name Session") ------------------------------------------------------------- * Goose CLI * Goose Desktop By default, Goose names your session using the current timestamp in the format `YYYYMMDD_HHMMSS`. If you'd like to provide a specific name, this is where you'd do so. For example to name your session `react-migration`, you would run: goose session -n react-migration You'll know your session has started when your terminal looks similar to the following: starting session | provider: openai model: gpt-4ologging to ~/.local/share/goose/sessions/react-migration.json1 Within the Desktop app, sessions are automatically named using the current timestamp in the format `YYYYMMDD_HHMMSS`. Goose also provides a description of the session based on context. Exit Session[​](#exit-session "Direct link to Exit Session") ------------------------------------------------------------- Note that sessions are automatically saved when you exit. * Goose CLI * Goose Desktop To exit a session, type `exit`. Alternatively, you exit the session by holding down `Ctrl+C`. Your session will be stored locally in `~/.local/share/goose/sessions`. To exit a session, simply close the application. Resume Session[​](#resume-session "Direct link to Resume Session") ------------------------------------------------------------------- * Goose CLI * Goose Desktop To resume your latest session, you can run the following command: goose session -r To resume a specific session, run the following command: goose session -r --name For example, to resume the session named `react-migration`, you would run: goose session -r --name react-migration tip While you can resume sessions using the commands above, we recommend creating new sessions for new tasks to reduce the chance of [doom spiraling](/goose/docs/troubleshooting#stuck-in-a-loop-or-unresponsive) . 1. Click `...` in the upper right corner 2. Click `Previous Sessions` 3. Click a session 4. Click `Resume Session` in the upper right corner ### Resume Session Across Interfaces[​](#resume-session-across-interfaces "Direct link to Resume Session Across Interfaces") You can resume a CLI session in Desktop and vice versa. * Goose CLI * Goose Desktop To resume a Desktop session within CLI, get the name of the session from the Desktop app. Note that unless you specifically named the session, its default name is a timestamp in the format `YYYYMMDD_HHMMSS`. 1. Open Goose Desktop 2. Click `...` in the upper right corner 3. Click `Previous Sessions` 4. Find the session that you want to resume, and copy the basename (without the `.jsonl` extension). Example **Desktop Session** | Session Description | Session Filename | | --- | --- | | GitHub PR Access Issue | **20250305\_113223**.jsonl | **CLI Command** goose session -r --name 20250305_113223 All saved sessions are listed in the Desktop app, even CLI sessions. To resume a CLI session within the Desktop: 1. Click `...` in the upper right corner 2. Click `Previous Sessions` 3. Click the session you'd like to resume tip If you named the session, you'll recognize the filename. However, if you don't remember the exact session name, there is a description of the topic. 4. Click `Resume Session` in the upper right corner Example **CLI Command** goose session -n react-migration **Desktop Session** | Session Description | Session Filename | | --- | --- | | Code Migration to React | **react-migration**.jsonl | * [Start Session](#start-session) * [Name Session](#name-session) * [Exit Session](#exit-session) * [Resume Session](#resume-session) * [Resume Session Across Interfaces](#resume-session-across-interfaces) --- # Fetch Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * Known Limitation The Fetch extension [does not work](https://github.com/block/goose/issues/1184) with Google models (e.g. gemini-2.0-flash) because this extension uses `format: uri` in its JSON schema which Google doesn't support. This tutorial covers how to add the [Fetch MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/fetch) as a Goose extension to retrieve and process content from the web. TLDR **Command** uvx mcp-server-fetch Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [uv](https://docs.astral.sh/uv/#installation) installed on your system to run this command, as it uses `uvx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ fetch β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ fetch β”‚ β—† What command should be run? β”‚ uvx mcp-server-fetch β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ fetch β”‚ β—‡ What command should be run? β”‚ uvx mcp-server-fetch β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Choose No when asked to add environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ fetch β”‚ β—‡ What command should be run? β”‚ uvx mcp-server-fetch β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—‡ Would you like to add environment variables? β”‚ No β”‚ β”” Added fetch extension 1. [Launch the installer](goose://extension?cmd=uvx&arg=mcp-server-fetch&id=fetch&name=Fetch&description=Web%20content%20fetching%20and%20processing%20capabilities) 2. Press `Yes` to confirm the installation Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- Let's use the Fetch extension to get random programming jokes from the [Official Joke API](https://official-joke-api.appspot.com/random_joke) . info While this API does not require an API key, many APIs do. If you need to provide an API key, you can set it as an environment variable and tell Goose its name. Example: _"get tomorrow's weather for New Orleans from the weatherapi. Don't use the key directly but instead use a script that gets the value from the env var WEATHER\_API\_KEY"_ ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") make a web page that tells jokes for programmers. The page should ask the user the setup of the joke, allow them to guess the punchline and then tell them if they are right or wrong. Include a button that allows them to request another joke. you can fetch the jokes from the official joke api ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you create a web page that uses the Official Joke API to display programming jokes. I'll break this down into steps:First, let's verify the API endpoint and see what kind of data we getThen create an HTML file with the necessary structureAdd JavaScript to handle the interactionsLet me check the API first:FETCHurl: https://official-joke-api.appspot.com/jokes/programming/randomOutputContent type application/json; charset=utf-8 cannot be simplified to markdown, but here is the raw content:Contents of https://official-joke-api.appspot.com/jokes/programming/random:[{"type":"programming","setup":"A SQL query walks into a bar, walks up to two tables and asks...","punchline":"'Can I join you?'","id":23}]Perfect! Now I'll create an HTML file with the necessary structure and JavaScript code:TEXT_EDITORcommand: writefile_text: Programmer Jokes

Programmer Jokes

Loading joke...
* [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) * [Results](#results) --- # Figma Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [Figma MCP Server](https://github.com/hapins/figma-mcp) as a Goose extension to enable interaction with Figma files, designs, and components. TLDR **Command** npx @hapins/figma-mcp **Environment Variable** FIGMA_ACCESS_TOKEN: Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ figma β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ figma β”‚ β—† What command should be run? β”‚ npx @hapins/figma-mcp β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ figma β”‚ β—‡ What command should be run? β”‚ npx @hapins/figma-mcp β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β”” 6. Obtain a [Figma Access Token](https://www.figma.com/developers/api#access-tokens) and paste it in. info You can generate an access token from your Figma account settings under the Personal access tokens section. β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ figma β”‚ β—‡ What command should be run? β”‚ npx @hapins/figma-mcp β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ Yes β”‚ β—‡ Environment variable name: β”‚ FIGMA_ACCESS_TOKEN β”‚ β—‡ Environment variable value: β”‚ β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺ β”‚ β—‡ Add another environment variable? β”‚ No β”” Added figma extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40hapins%2Ffigma-mcp&id=figma&name=Figma&description=Figma%20design%20tool%20integration&env=FIGMA_ACCESS_TOKEN%3DAccess%20token%20from%20Figma%20user%20settings) 2. Press `Yes` to confirm the installation 3. Obtain a [Figma Access Token](https://www.figma.com/developers/api#access-tokens) and paste it in 4. Click `Save Configuration` 5. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- The Figma MCP server allows you to interact with your Figma files and designs programmatically. When creating your access token, make sure you give it the appropriate access and scope: 1. Read access for files 2. Write access for Comments 3. And any other scopes of your choice. Given this [Community Figma design](https://www.figma.com/community/file/1037030891378807455) , we'll have Goose build a webpage. ![Figma Design](/goose/assets/images/figma-mcp-design-dac4a1618225011a385bb592858e3b3b.png) tip Get the Figma File ID from the URL. For example, `https://www.figma.com/file/KvR8Wpe6ITaCD3et3H7l6k/AI-Landing-Page` has a file ID of `KvR8Wpe6ITaCD3et3H7l6k`. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") ( O)> Convert my figma design with file ID 7r0mLHWx2rrjwn79mcNVNE into a webpage. Get specific detailed information and styling about each element and components within each frame. Make sure to implement any interactions or animations and use a placeholder div with a gray background for images. Some elements are centralized, some are duplicated, make sure to get them correct. And ensure correct alignment and spacing between elements. ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you convert your Figma design into a webpage. Let's break this down into steps and gather all the necessary information from your Figma file.1. First, let's get the file information to understand the overall structure:─── get_file_info | figma ──────────────────────────depth: 4file_key: 7r0mLHWx2rrjwn79mcNVNELet me help you convert this Figma design into a webpage. I'll create the HTML and CSS based on the design specifications from the Figma file. I'll break it down into sections and implement all the styling and interactions.Let's create the files:─── text_editor | developer ──────────────────────────path: ~/D/w/l/m/figma-example/index.htmlcommand: writefile_text: ...### .../figma-example/index.html--- HTML content hidden ---Now, let's create the CSS file with all the styling:─── text_editor | developer ──────────────────────────path: ~/D/w/l/m/figma-example/styles.csscommand: writefile_text: ...### .../figma-example/styles.css--- CSS content hidden ---I've created a complete implementation of the Figma design with the following features and considerations:1. **Typography**:- Used the exact fonts from the design: Poppins, Overpass, Nunito Sans, Public Sans, and Raleway- Implemented correct font weights, sizes, and letter spacing- Maintained the text hierarchy as shown in the design2. **Colors**:- Used the exact color codes from the Figma file- Implemented the proper background colors (#250b71 for header and footer)- Used correct text colors for different sections3. **Layout**:- Created a responsive layout that matches the design- Implemented proper spacing and alignment- Used CSS Grid for the book cards- Used Flexbox for navigation and content alignment4. **Components**:- Navigation bar with social media links- About Me section with placeholder for image- Education section with ordered list- Book cards with proper styling- Mood section with image placeholders- Footer with copyright text5. **Interactive Elements**:- Hover effects on navigation links- "Next Section" buttons with icons- "Go on Top" button at the bottom6. **Responsive Design**:- Added media queries for different screen sizes- Responsive adjustments for mobile and tablet views- Flexible layouts that adapt to different screen sizes7. **Images**:- Used placeholder divs with background colors for images- Maintained aspect ratios from the original design8. **Accessibility**:- Semantic HTML structure- Proper heading hierarchy- Alt text placeholders for images- Readable text contrastTo use this implementation:1. Make sure all the fonts are properly loaded (they're being loaded from Google Fonts)2. Replace the image placeholders with actual images3. Add proper links to the social media navigation4. Add any additional interactive features or animations as neededThe implementation maintains the visual hierarchy and styling of the original Figma design while ensuring it's responsive and accessible. You can further customize the colors, spacing, and other properties by modifying the CSS variables if needed.Would you like me to add any specific interactions or make any adjustments to the implementation? ### Result[​](#result "Direct link to Result") The Figma design has been successfully converted into a webpage with the styling, content and components from the original design. ![Figma MCP Output](/goose/assets/images/figma-mcp-output-3fa01318977684f5673d44f5b9ad7a19.png) tip In cases where you need to make additional changes, or the final output is not as expected - you can continue to interact with Goose to make adjustments. * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) * [Result](#result) --- # Updating Goose | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) The Goose CLI and desktop apps are under active and continuous development. To get the newest features and fixes, you should periodically update your Goose client using the following instructions. * Goose CLI * Goose Desktop You can update Goose by running: goose update Additional [options](/goose/docs/guides/goose-cli-commands#update-options) : # Update to latest canary (development) versiongoose update --canary# Update and reconfigure settingsgoose update --reconfigure Or you can run the [installation](/goose/docs/getting-started/installation) script again: curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash To check your current Goose version, use the following command: goose --version info To update Goose to the latest stable version, reinstall using the instructions below 1. To download Goose Desktop for macOS, click one of the buttons below: [macOS Silicon](https://github.com/block/goose/releases/download/stable/Goose.zip) [macOS Intel](https://github.com/block/goose/releases/download/stable/Goose_intel_mac.zip) 2. Unzip the downloaded zip file. 3. Run the executable file to launch the Goose Desktop application. 4. Overwrite the existing Goose application with the new version. 5. Run the executable file to launch the Goose desktop application. --- # Filesystem Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [Filesystem MCP server](https://github.com/modelcontextprotocol/servers/tree/HEAD/src/filesystem) as a Goose extension, enabling powerful code analysis and file management. With this extension, Goose can analyze project structures, edit and organize files, detect unused dependencies, and generate documentation to improve software maintainability. TLDR **Command** npx -y @modelcontextprotocol/server-filesystem You can specify multiple allowed directories by separating them with a space. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this commands, as is uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ filesystem β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ filesystem β”‚ β—† What command should be run? β”‚ npx -y @modelcontextprotocol/server-filesystem /path/to/allowed/directory β”” Multiple Directories You can specify multiple allowed directories by separating them with a space. 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ filesystem β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-filesystem /path/to/allowed/directory β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Choose No when asked to add environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ filesystem β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-filesystem /path/to/allowed/directory β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No β”‚ β”” Added filesystem extension 1. Click `...` in the upper right corner 2. Click `Settings` 3. Under `Extensions`, click the `Add` link 4. On the `Add Extension Manually` modal, enter the following: * **Type**: `Standard IO` * **ID**: `filesystem-mcp` (_set this to whatever you want_) * **Name**: `filesystem` (_set this to whatever you want_) * **Description**: `filesystem MCP Server` (_set this to whatever you want_) * **Command**: `npx -y @modelcontextprotocol/server-filesystem /path/to/allowed/directory` 5. Click `Add Extension` button Multiple Directories You can specify multiple directories by separating them with a space. Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I'll use Goose to perform a comprehensive security audit across multiple projects, including a payment processing system, authentication service, and e-commerce dashboard. I need to identify security vulnerabilities, implement fixes, and ensure sensitive data and operations are properly protected. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Hey Goose, I need to perform a security audit and implement fixes across multiple projects: 1. Please analyze these codebases for security issues: - /Users/ebonyl/e-commerce-dashboard - /Users/ebonyl/client-projects/payment-system - /Users/ebonyl/internal/auth-service 2. Look for: - Hardcoded credentials (API keys, passwords, secrets) - Insecure cryptographic practices (weak hashing, encryption) - SQL injection vulnerabilities - Exposed configuration files - Insecure session handling - Logging of sensitive data - Outdated dependencies in package.json - Unsafe authentication methods 3. For each vulnerability found: - Show me the problematic code - Explain the security risk - Provide a secure implementation - Help me apply and test the fixes 4. Create a detailed security report including: - Critical findings by project - Risk severity levels - Exact file locations and snippets - Applied fixes and improvements - Verification steps takenPlease focus particularly on the payment system and authentication service as they handle sensitive data. ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you conduct the security audit, starting with the payment system project since it handles sensitive financial data. Let me first check if we have access to these directories.--- List Allowed Directories ---Great, we have access to all the required directories. Let's start with the payment system project. First, I'll analyze its structure and files.--- Directory Tree ---Let's start by examining the key files for security issues. I'll first check the configuration and main payment processing files for potential vulnerabilities.--- Read Multiple Files ---I've identified several critical security vulnerabilities in the payment system. Let's address them one by one:1. Hardcoded Credentials (CRITICAL)Location: Both config/production.js and payment.js Risk: Exposed sensitive credentials in source code can lead to unauthorized access. // Current (Unsafe):const STRIPE_SECRET = 'sk_live_abcdef123456';const AWS_KEY = 'AKIA12345EXAMPLE';// Recommended Fix:const STRIPE_SECRET = process.env.STRIPE_SECRET_KEY;const AWS_KEY = process.env.AWS_ACCESS_KEY_ID;Let's create a secure environment configuration: Let's create a new secure version of the payment processor:--- Write File ---Let's also update the package.json to fix vulnerable dependencies:--- Read File ---Let's update the dependencies to their latest secure versions:--- Write File ---Security Report for Payment SystemCritical Findings1. Hardcoded Credentials (CRITICAL) - Multiple sensitive credentials in source code - Fixed by implementing environment variables - Added .env.example template 2. Insecure Cryptographic Implementation (HIGH) - Weak encryption key - Improper key management - Fixed with proper AES-256-GCM implementation3. SSL/TLS Configuration (HIGH) - Disabled SSL verification - Fixed by enforcing TLS 1.2 and certificate validation4. Sensitive Data Exposure (HIGH) - Logging of sensitive card data - Fixed by removing sensitive logging - Implemented secure data encryption5. Race Conditions (MEDIUM) - Unsecured balance updates - Fixed with proper database transactions6. Vulnerable Dependencies (MEDIUM) - Outdated packages with known vulnerabilities - Updated all dependencies to latest secure versions - Added security audit npm scriptVerification Steps 1. Create a proper .env file from the template 2. Run npm install to update dependencies 3. Run npm run security-audit to verify no known vulnerabilities 4. Test the payment processing with test credentials 5. Verify SSL/TLS configuration 6. Test encryption/decryption functionality 7. Verify secure balance updates with concurrent transactionsI'll continue with the security audit of the remaining projects.--- Directory Tree ---Let's examine the key files for security issues. I'll start with the main application file and database configuration:--- Read Multiple Files ---Now, let's check the auth-service project:--- Directory Tree ------ Read Multiple Files ---Based on the security audit of all three projects, I'll provide a comprehensive security report and implement fixes for each project.Comprehensive Security Audit Report1. Payment System Security Fixes (Already Implemented)βœ… Removed hardcoded credentials βœ… Implemented secure cryptography βœ… Fixed SSL/TLS configuration βœ… Removed sensitive data exposure βœ… Fixed race conditions βœ… Updated vulnerable dependencies2. E-commerce Dashboard Security IssuesLet's create secure implementations for the e-commerce dashboard. First, let's create a .env template:--- Write File ---Now, let's update the main application with security fixes:--- Write File ---Let's update the database configuration:--- Write File ---3. Auth Service Security IssuesLet's create secure implementations for the auth service. First, let's create a .env template:--- Write File ---Update the configuration:--- Write File ---Update the auth service with security fixes:--- Write File ---Update package.json with secure dependencies:--- Write File ---Final Security ReportCritical Findings Summary1. Payment System βœ… Credentials moved to environment variables βœ… Secure cryptography implemented βœ… SSL/TLS properly configured βœ… Sensitive data protection added βœ… Race conditions resolved βœ… Dependencies updated2. E-commerce Dashboard βœ… SQL injection vulnerabilities fixed βœ… Command injection risks mitigated βœ… Path traversal vulnerabilities resolved βœ… XSS protection implemented βœ… Secure session management added βœ… Rate limiting implemented βœ… CORS properly configured βœ… Error handling secured βœ… Database connection hardened βœ… Dependencies updated3. Auth Service βœ… Weak JWT secret replaced βœ… Password requirements strengthened βœ… Secure session management implemented βœ… Rate limiting added βœ… File upload security improved βœ… Input validation added βœ… Error handling secured βœ… Audit logging implemented βœ… Dependencies updatedVerification Steps: 1. Environment Setup: # For each projectcp .env.example .env# Fill in secure values in .env files 2. Update Dependencies: # In each project directorynpm installnpm audit 3. Test Security Measures: # Rate limitingcurl -X POST http://localhost:3000/api/login -d '{"username":"test","password":"test"}' -H 'Content-Type: application/json'# File uploadcurl -X POST http://localhost:3000/api/upload -F 'file=@test.jpg' -H 'Authorization: Bearer YOUR_TOKEN'# Protected routescurl http://localhost:3000/api/protected -H 'Authorization: Bearer YOUR_TOKEN' 4. Security Headers Check: curl -I http://localhost:3000# Verify security headers are present Recommended Additional Steps1. Regular Security Audits: - Schedule monthly dependency updates - Run npm audit weekly - Monitor security advisories2. Monitoring: - Implement centralized logging - Set up alerts for suspicious activities - Monitor rate limit triggers3. Backup and Recovery: - Implement automated backups - Test recovery procedures - Document incident response4. Training: - Security awareness training for developers - Code review guidelines - Security best practices documentationWould you like me to help implement any additional security measures or explain any of the implemented fixes in more detail? * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Google Drive Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [Google Drive MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/gdrive) as a Goose extension, allowing you to list, read, and search files in Google Drive. TLDR **Authentication Command** In your terminal, run the following: GDRIVE_OAUTH_PATH=/Users//.config/gcp-oauth.keys.json \ GDRIVE_CREDENTIALS_PATH=/Users//.config/.gdrive-server-credentials.json \ npx -y @modelcontextprotocol/server-gdrive auth **Command** npx -y @modelcontextprotocol/server-gdrive **Environment Variables** GDRIVE_CREDENTIALS_PATH: ~/.config/.gdrive-server-credentials.json GDRIVE_OAUTH_PATH: ~/.config/gcp-oauth.keys.json Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. To obtain your Google Drive server credentials and oauth keys, follow the steps below: 1. Set up your Google Cloud Credentials, to enable API access: * Create Google Cloud Project * Go to [Google Cloud Console](https://console.cloud.google.com/projectcreate) and create a new project * You can leave `location` as `No organization` * Enable Google Drive API * In your project, go to the [API Product Library\`](https://console.cloud.google.com/workspace-api/products) * Confirm you're in the right project by checking the top left corner * Search `Google Drive API` and enable it 2. Configure OAuth Consent Screen * Go to the [OAuth Consent Screen](https://console.cloud.google.com/auth/overview/create) * Enter required information, `project name` , `user support email` * Choose `Internal` for `Audience` and press `create` * If you are unable to choose `Internal` select `External` and follow these additional steps: * Navigate to the [Audience](https://console.cloud.google.com/auth/audience) screen * Under `Test users` click `Add Users` 3. Create OAuth Credential * Go to [OAuth Clients](https://console.cloud.google.com/apis/credentials/oauthclient) * Click `Create Client` * Choose **Application Type: Desktop App** * Download the JSON key file * Rename it to `gcp-oauth.keys.json` * Move it to a secure location where the extension can access it: mv ~/Downloads/gcp-oauth.keys.json ~/.config/gcp-oauth.keys.json 4. Connect Google Account To connect your Google account, run the following authentication command in your terminal: GDRIVE_OAUTH_PATH=/Users//.config/gcp-oauth.keys.json \ GDRIVE_CREDENTIALS_PATH=/Users//.config/.gdrive-server-credentials.json \ npx -y @modelcontextprotocol/server-gdrive auth A browser window will open for authentication. Follow the prompts to connect your Google account and complete the OAuth process. At this stage, your environment variable `GDRIVE_CREDENTIALS_PATH` will be set with the saved credentials. tip You'll need to re-authenticate once a day when using the Google Drive extension. To re-authenticate, simply re-run the authentication command in your terminal. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ google drive β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ google drive β”‚ β—† What command should be run? β”‚ npx -y @modelcontextprotocol/server-gdrive β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ google drive β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-gdrive β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” tip You may need to use absolute paths (rather than relying on shell exapansion for `~`) for the `GDRIVE_CREDENTIALS_PATH` and `GDRIVE_OAUTH_PATH`. 6. Add your environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ google drive β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-gdrive β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ Yes β”‚ β—‡ Environment variable name: β”‚ GDRIVE_CREDENTIALS_PATH β”‚ β—‡ Environment variable value: β”‚ ~/.config/.gdrive-server-credentials.json β”‚ β—‡ Add another environment variable? β”‚ yes | β—‡ Environment variable name: β”‚ GDRIVE_OAUTH_PATH β”‚ β—‡ Environment variable value: β”‚ ~/.config/gcp-oauth.keys.json β”‚ β”” Added google drive extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40modelcontextprotocol%2Fserver-gdrive&id=google-drive&name=Google%20Drive&description=Google%20Drive%20integration&env=GDRIVE_CREDENTIALS_PATH%3DPath%20to%20Google%20Drive%20credentials&env=GDRIVE_OAUTH_PATH%3DPath%20to%20OAuth%20token) 2. Press `Yes` to confirm the installation 3. For `GDRIVE_CREDENTIALS_PATH`, enter the following: ~/.config/.gdrive-server-credentials.json 4. For `GDRIVE_OAUTH_PATH`, enter the following: ~/.config/gcp-oauth.keys.json 5. Click `Save Configuration` 6. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I’ll use Goose to quickly gather and summarize important information for my upcoming marketing budget review meeting in 30 minutes. I’ll ask Goose to find relevant documents from my Google Drive, summarize Q1 performance, highlight critical decisions on marketing automation and video production, and identify any outstanding action items from our last meeting. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") I have an important marketing budget review meeting in 30 minutes and I need your help getting prepared. I have several documents in my Google Drive from our previous meetings and planning sessions. Could you help me by:1. Finding all relevant documents about our marketing budget and performance2. Giving me a quick summary of our Q1 performance3. Highlighting the key decisions we need to make about the marketing automation tool and video production4. Identifying any outstanding action items from our last meetingI need a quick but comprehensive overview so I can walk into this meeting well-prepared. ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you prepare for your meeting. Let me first list available resources from Google Drive to make sure we access the correct files. [... list resources ...]Great! I can see several relevant documents. Let me access them one by one to gather the information you need. [... reads resources ...]Based on all these documents, here's your comprehensive overview for the meeting: Q1 Performance Summary: - Overall 5% under budget ($104,200 spent vs $107,000 budgeted) - Digital Marketing performing well with highest ROI: - Email marketing: 3.2 ROI - Google Ads: 2.4 ROI - Content Marketing: 2.1 ROI - Social media engagement up 23% from previous quarter - Content marketing blog posts generating 2x expected leadsKey Decisions Needed: 1. Marketing Automation Tool (License Renewal Due): - Current tool (BasicAutomation Pro): $12,000/year - Options: - GrowthStack ($15,000/year) - recommended option, balanced features/price - MarketingHub Enterprise ($18,000/year) - premium option with AI features - Decision needed on whether to upgrade or maintain current solution - Implementation would take 6 weeks if changing providers 2. Video Production Investment: - Three vendor options: - CreativeForce Media ($16,200) - most comprehensive, unlimited revisions - VisualCraft Studios ($14,500) - solid middle option - Digital Narrative Pro ($12,800) - basic package - CreativeForce Media is recommended despite higher cost due to comprehensive deliverables - Timeline ranges from 3-5 weeks depending on vendor choiceOutstanding Action Items from Last Meeting: 1. Sarah needs to present ROI analysis for video content investment 2. John needs to complete software license review 3. Lisa to present new PPC strategy 4. Mike has completed the video production agency quotesQ2 Planning Considerations: - Proposed 12% budget increase for Q2 ($120,000 total) - Potential reallocation needed based on new tool and video production decisions - PPC strategy review pendingWould you like me to focus on any particular aspect of this overview in more detail? * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # GitHub Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [GitHub MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/github) as a Goose extension to enable file operations, repository management, search functionality, and more. TLDR **Command** npx -y @modelcontextprotocol/server-github **Environment Variable** GITHUB_PERSONAL_ACCESS_TOKEN: Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ github β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ github β”‚ β—† What command should be run? β”‚ npx -y @modelcontextprotocol/server-github β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ github β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-github β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β”” 6. Obtain a [GitHub Personal Access Token](https://github.com/settings/personal-access-tokens) and paste it in. info When creating your access token, you can specify the repositories and granular permissions you'd like Goose to have access to. β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ github β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-github β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ Yes β”‚ β—‡ Environment variable name: β”‚ GITHUB_PERSONAL_ACCESS_TOKEN β”‚ β—‡ Environment variable value: β”‚ β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺ β”‚ β—‡ Add another environment variable? β”‚ No β”” Added github extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40modelcontextprotocol%2Fserver-github&id=github&name=GitHub&description=GitHub%20API&env=GITHUB_PERSONAL_ACCESS_TOKEN%3DGitHub%20Personal%20Access%20Token) 2. Press `Yes` to confirm the installation 3. Obtain a [GitHub Personal Access Token](https://github.com/settings/personal-access-tokens) and paste it in 4. Click `Save Configuration` 5. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- When creating my [GitHub Personal Access Token](https://github.com/settings/personal-access-tokens) , I gave it the following access: * Repository: [goose-demo](https://github.com/angiejones/goose-demo) * Read access to metadata * Read and Write access to code, commit status, issues, and pull requests ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") create a new branch called hello-world in my angiejones/goose-demo repository. Update the README.md file to say "this was written by goose" and commit it. Open a pull request with your changes. ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you create a new branch, update the README, and open a pull request. Let me break this down into steps:1. First, let's create the new branch called "hello-world" in your repository2. Then update the README.md file3. Finally, create a pull requestLet me execute these steps:1. Creating the new branch:─── create_branch | github ──────────────────────────branch: hello-worldowner: angiejonesrepo: goose-demo2. Now, updating the README.md file in the new branch:─── create_or_update_file | github ──────────────────────────branch: hello-worldcontent: this was written by goosemessage: Update README.md with Goose messageowner: angiejonespath: README.mdrepo: goose-demo3. Finally, creating the pull request:─── create_pull_request | github ──────────────────────────base: mainbody: ...head: hello-worldowner: angiejonesrepo: goose-demotitle: Update README.mdGreat! I've completed all the requested tasks:1. Created a new branch called "hello-world"2. Updated the README.md file with the text "this was written by goose"3. Created a pull request to merge these changes into the main branchYou can view the pull request at: https://github.com/angiejones/goose-demo/pull/1The pull request is now ready for your review. Would you like me to do anything else with it? * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Goose Architecture | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose, an open source AI Agent, builds upon the basic interaction framework of Large Language Models (LLMs), which primarily functions as a text-based conversational interface. It processes text input and generates text output. This "text in, text out" approach is enhanced with tool integrations, which allows the AI agent to complete tasks, creating Goose. Goose Components[​](#goose-components "Direct link to Goose Components") ------------------------------------------------------------------------- Goose operates using three main components, the **interface**, the **agent**, and the **connected [extensions](/goose/docs/getting-started/using-extensions) **. * **Interface**: This is the desktop application or CLI that the user is using to run Goose. It collects input from the user and displays outputs to the user * **Agent**: The agent runs Goose's core logic, managing the interactive loop. * **Extensions**: Extensions are components that provide specific tools and capabilities for the agent to use. These tools enable Goose to perform actions such as running commands and managing files. In a typical session, the interface spins up an instance of the agent, which then connects to one or more extensions simultaneously. The interface can also create multiple agents to handle different tasks concurrently. Extensions and the interactive loop are important parts of Goose's functionality. The next sections will explain how Goose connects to extensions and processes user requests. Interoperability with Extensions[​](#interoperability-with-extensions "Direct link to Interoperability with Extensions") ------------------------------------------------------------------------------------------------------------------------- [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard that allows for interoperability between data sources and AI agents. Goose utilizes MCP to connect to [MCP systems/servers](https://github.com/modelcontextprotocol/servers?tab=readme-ov-file#model-context-protocol-servers) . In Goose, these systems/servers are referred to as extensions. Extensions expose their functionality to Goose through tools. Tools are the functions that allow extensions to perform specific actions, such as running commands, or performing file operations. For example, the Google Drive extension includes a tool for searching documents. That tool is what gives Goose the ability to perform that action. Goose comes with a set of [built-in extensions](/goose/docs/getting-started/using-extensions#built-in-extensions) , each designed to enhance your interaction. These include tools for development, web scraping, automation, memory, and integrations with JetBrains and Google Drive. Goose also supports [connecting to external extensions](/goose/docs/getting-started/using-extensions#adding-extensions) or [creating custom extensions](/goose/docs/tutorials/custom-extensions) as MCP servers. To learn more about the design and implementation of extensions and tools, refer to the [Extensions Design Guide](/goose/docs/goose-architecture/extensions-design#tools) . Interactive Loop[​](#interactive-loop "Direct link to Interactive Loop") ------------------------------------------------------------------------- ![interactive loop](/goose/assets/images/interactive-loop-55558c45ba877033b3bd355c500150ef.png) Let's take a closer look at the interactive loop shown above. 1. **Human Request**: The process begins and ends with you. Once you give Goose a request, question, command, or problem to solve, the flow begins. 2. **Provider Chat**: Goose sends your request along with a list of available tools to the [LLM provider](/goose/docs/getting-started/providers) you've connected. The provider processes it, and if necessary, creates a tool call as part of its response. 3. **Model Extension Call**: The LLM is capable of creating a tool call request but not able to execute it, that's when Goose steps in. Goose takes the tool call which is formatted in JSON, runs it, and gathers the results. 4. **Response to Model**: After executing the tool call, Goose sends the results back to the model. If more extensions are needed, those steps will repeat. 5. **Context Revision**: Goose will remove any old or irrelevant information, ensuring the LLM focuses solely on the information that matters the most. This helps with token management. 6. **Model Response**: Once all the tool calls are done, the LLM sends a final response back to you and restarts the loop once you respond. Error Handling in Goose[​](#error-handling-in-goose "Direct link to Error Handling in Goose") ---------------------------------------------------------------------------------------------- As opposed to allowing an error to break the flow, Goose captures and handles traditional errors along with execution errors. Errors such as invalid JSON, missing tools, etc. are sent back to the model as tool responses giving the LLM the information it needs to resolve the error and continue. For more details on how Goose handles errors, refer to the [Error Handling in Goose](/goose/docs/goose-architecture/error-handling) Guide. Context Revision: Token Management[​](#context-revision-token-management "Direct link to Context Revision: Token Management") ------------------------------------------------------------------------------------------------------------------------------ While Goose is free and open source, there is typically a cost associated with LLM token usage. Everything competes for token usage including messages, tool requests, resources, file content, instructions, etc. This is where Content Revision comes into play to help reduce some of those costs. There are a few things that are done to assist with this: * Goose summarizes with faster and smaller LLMs * Goose includes everything versus a semantic search * Goose uses algorithms to delete old or irrelevant content * Goose will use find and replace instead of rewriting large files, use ripgrep to skip system files, and summarize verbose command outputs * [Goose Components](#goose-components) * [Interoperability with Extensions](#interoperability-with-extensions) * [Interactive Loop](#interactive-loop) * [Error Handling in Goose](#error-handling-in-goose) * [Context Revision: Token Management](#context-revision-token-management) --- # Google Maps Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page This tutorial covers how to add the [Google Maps MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/google-maps) as a Goose extension to enable geocoding, place searching, distance calculations, elevation data retrieval, and directions. TLDR **Command** npx -y @modelcontextprotocol/server-google-maps **Environment Variable** GOOGLE_MAPS_API_KEY: Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ Google Maps β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Google Maps β”‚ β—† What command should be run? β”‚ npx -y @modelcontextprotocol/server-google-maps β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Google Maps β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-google-maps β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Obtain a [Google Maps API Key](https://developers.google.com/maps/documentation/javascript/get-api-key) and paste it in. β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Google Maps β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-google-maps β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ Yes β”‚ β—‡ Environment variable name: β”‚ GOOGLE_MAPS_API_KEY β”‚ β—‡ Environment variable value: β”‚ β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺ β”‚ β—‡ Add another environment variable? β”‚ No β”” Added github extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40modelcontextprotocol%2Fserver-google-maps&id=google-maps&name=Google%20Maps&description=Google%20Maps%20API%20integration&env=GOOGLE_MAPS_API_KEY%3DGoogle%20Maps%20API%20key) 2. Press `Yes` to confirm the installation 3. Obtain a [GOOGLE\_MAPS\_API\_KEY](https://developers.google.com/maps/documentation/javascript/get-api-key) and paste it in 4. Click `Save Configuration` 5. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- Goose acts as an autonomous agent that tracks a delivery driver’s location, updates the customer in real-time, and adjusts ETAs dynamically based on Google Maps traffic data. Goose can: **Monitor Driver Location** * Goose gets the driver’s GPS coordinates every few seconds. * If the driver’s location is significantly behind schedule, Goose recalculates the ETA. **Traffic-Aware ETA Adjustments** * Goose queries Google Maps for live traffic conditions. * If delays are detected, Goose updates the customer’s tracker with a new estimated time. **Dynamic Customer Notifications** * If the driver is stuck in traffic, Goose sends an alert to the customer: β€œYour driver is running late due to traffic. Updated ETA: 7:25 PM.” * If the driver is ahead of schedule, Goose notifies the restaurant to prepare the food earlier. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Track the live GPS location of driver ID #12345. Query Google Maps for real-time traffic data and adjust the estimated delivery time if delays exceed 5 minutes. If ETA changes, update the customer’s live tracker and send an SMS notification. If the delay is greater than 20 minutes, check if another driver within a 1-mile radius can take over the delivery. ### Goose Output[​](#goose-output "Direct link to Goose Output") CLI Okay, I will track Driver #12345, query Google Maps for traffic data, adjust the ETA, and notify the customer. **Track Driver's GPS Location** * **Driver ID:** #12345 * **Starting Point:** 1955 Broadway, Suite 600, Oakland, CA 94612 Driver #12345's movement: 2025-02-23 08:20:00: Latitude: 37.8074, Longitude: -122.2697 (Starting point)2025-02-23 08:21:00: Latitude: 37.8080, Longitude: -122.26902025-02-23 08:22:00: Latitude: 37.8090, Longitude: -122.26802025-02-23 08:23:00: Latitude: 37.8100, Longitude: -122.2670 **Geocode Destination Address** * **Customer Address:** 2111 Mission Street, San Francisco, CA I will convert this address into geographic coordinates: `─── maps_geocode | googlemaps ──────────────────────────` address: 2111 Mission Street, San Francisco, CA Latitude: 37.7631446Longitude: -122.4192073 **Get Initial Directions and ETA** I will get the initial route and ETA from the driver's starting point to the customer's address. `─── maps_directions | googlemaps ──────────────────────────` destination: 2111 Mission St, San Francisco, CA mode: driving origin: ... Distance: 12.1 milesInitial ETA: 21 minutesEstimated arrival at: 08:41 AM **Monitor Traffic and Adjust ETA** I will monitor traffic updates and recalculate the ETA periodically. Remaining Distance: 8 milesUpdated ETA: 15 minutesEstimated arrival at: 08:45 AM There is no significant delay. _At 08:35 AM:_ There's a traffic incident. `─── maps_directions | googlemaps ──────────────────────────` destination: 2111 Mission St, San Francisco, CA mode: driving origin: Latitude: 37.8100, Longitude: -122.2670 I apologize, I am unable to use the lat/long for the request. I will call google maps api with names instead. `─── maps_directions | googlemaps ──────────────────────────` destination: 2111 Mission St, San Francisco, CA mode: driving origin: ... Remaining Distance: 7 milesUpdated ETA: 26 minutesEstimated arrival at: 08:46 AM The ETA has increased by 5 minutes from the original ETA of 08:41 AM. The directions now include a message: "Expect delays due to congestion." **Update Customer and Send SMS** \[... other extensions used (e.g. Webhooks, MySQL, ClickSend)...\] * **Update Live Tracker:** The customer's live tracking interface is updated to reflect the new ETA of 08:46 AM. * **Send SMS Notification:** _"Your delivery is now expected to arrive at approximately 08:46 AM due to traffic. We apologize for the inconvenience."_ * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # JetBrains Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * The JetBrains extension is designed to work within your IDE. Goose can accomplish a lot of the developer-centric tasks with the Developer extension that is enabled on install, however, the JetBrains extension provides a more integrated and project-aware way to work with code. This tutorial covers how to enable and use the JetBrains MCP Server as a built-in Goose extension to integrate with any JetBrains IDE. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- 1. Add the [MCP Server plugin](https://plugins.jetbrains.com/plugin/26071-mcp-server) to your IDE. 2. Enable built-in Goose extension: * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Built-in Extension` β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—† What type of extension would you like to add?β”‚ ● Built-in Extension (Use an extension that comes with Goose)β”‚ β—‹ Command-line Extension β”‚ β—‹ Remote Extension β”” 3. Arrow down to the `JetBrains` extension and press Enter β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extension β”‚β—† Which built-in extension would you like to enable?β”‚ β—‹ Developer Tools β”‚ β—‹ Computer Controller β”‚ β—‹ Google Drive β”‚ β—‹ Memory β”‚ ● JetBrains (Connect to jetbrains IDEs)β”” 4. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extension β”‚β—‡ Which built-in extension would you like to enable?β”‚ JetBrainsβ”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” Enabled jetbrains extension 1. Click `...` in the upper right corner 2. Click `Settings` 3. Under `Extensions`, toggle `Jetbrains` to on. Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I'm going to upgrade a Java project to the latest LTS version. LLM Anthropic's Claude 3.5 Sonnet was used for this task. * Goose CLI * Goose Desktop 1. Open [IntelliJ](https://www.jetbrains.com/idea/download) (JetBrains' Java and Kotlin IDE) 2. Open a terminal within your IDE and start a new Goose session: goose session 1. Open [IntelliJ](https://www.jetbrains.com/idea/download) (JetBrains' Java and Kotlin IDE) 2. Open a new session in Goose Desktop note You will interact with two separate apps: the Goose Desktop app and the IntelliJ IDE. tip When using Goose to refactor code, it's recommended to commit your code to version control _before_ making changes. This way, you have a clean snapshot to compare against, making it easy to review Goose’s modifications, revert if needed, and track improvements. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") using the JetBrains IDE tools, upgrade this project to use the latest Java LTS version and refactor the codebase to use newer Java features where beneficial. After 2 minutes, Goose was done with the upgrade! πŸŽ‰ ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll make several improvements to modernize this codebase to use Java 21 (latest LTS) features. Here are the changes I'll implement:1. Update the `pom.xml` to use Java 212. Use newer Java features [... code changes ...]Here's a summary of the modernization changes made:1. `pom.xml`: - Set Java version to 21 - Enabled preview features - Updated all dependencies to their latest stable versions2. `AccountsOverviewPage.java`: - Made the class `final` since it extends the sealed `Page` class - Updated stream collection to use `.toList()` instead of `collect(Collectors.toList())` - Made fields final for better immutability3. `Page.java`: - Converted to a sealed class - Restricted which classes can extend it using `permits` - Made fields protected and final where appropriate - Added pattern matching for exception handling - Implemented Optional for null safety - Used String Templates for error messages - Added functional programming concepts with Supplier - Enhanced error handling with specific exception types4. `LoginComponent.java`: - Added a private record for credentials - Implemented pattern matching with record patterns - Made fields final for better immutability5. `AccountTests.java`: - Implemented structured concurrency using `StructuredTaskScope` - Used parallel execution for UI and API tasks - Improved error handling with structured task management - Used pattern matching and type inference with `var`6. `BaseTests.java`: - Implemented structured concurrency for setup tasks - Improved resource management - Better exception handling - Used modern Duration API7. `APIUtil.java`: - Implemented String Templates (Java 21 preview feature) - Used modern text blocks8. `Customers.java`: - Added sealed interface for customer types - Implemented pattern matching for switch expressions - Added pattern matching for instanceof - Enhanced type safety with recordsKey modern Java features used:- String Templates (Java 21 Preview)- Pattern Matching for switch (Java 21)- Sealed Classes and Interfaces (Java 17)- Records (Java 16)- Pattern Matching for instanceof (Java 16)- Text Blocks (Java 15)- Switch Expressions (Java 14)The codebase is now using the latest Java LTS version (21) and incorporates many modern Java features that improve:- Type safety- Null safety- Code readability- Error handling- Performance Using the JetBrains extension provided several advantages and made it easier for Goose to: * navigate through the codebase * track changes * make consistent modifications across files * verify the content of files before and after changes * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Goose Permission Modes | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose’s permissions determine how much autonomy it has when modifying files, using extensions, and performing automated actions. By selecting a permission mode, you have full control over how Goose interacts with your development environment. Permission Modes[​](#permission-modes "Direct link to Permission Modes") ------------------------------------------------------------------------- | Mode | Description | Best For | | --- | --- | --- | | **Completely Autonomous** | Goose can modify files, use extensions, and delete files **without requiring approval**. | Users who want **full automation** and seamless integration into their workflow. | | **Manual Approval** | Goose **asks for confirmation** before using any tools or extensions. | Users who want to **review and approve** every change and tool usage. | | **Smart Approval** | Goose uses a risk-based approach to **automatically approve low-risk actions** and **flag others** for approval. | Users who want a **balanced mix of autonomy and oversight** based on the action’s impact. | | **Chat Only** | Goose **only engages in chat**, with no extension use or file modifications. | Users who prefer a **conversational AI experience** without automation. | | | | | warning `Autonoumous Mode` is applied by default. Configuring Goose Mode[​](#configuring-goose-mode "Direct link to Configuring Goose Mode") ------------------------------------------------------------------------------------------- Here's how to configure: * Goose CLI * Goose Desktop * In Session * From Settings To change modes mid-session, use the `/mode` command. * Autonoumous: `/mode auto` * Approve: `/mode approve` * Chat: `/mode chat` 1. Run the following command: goose configure 2. Select `Goose Settings` from the menu and press Enter. β”Œ goose-configureβ”‚β—† What would you like to configure?| β—‹ Configure Providers| β—‹ Add Extension| β—‹ Toggle Extensions| β—‹ Remove Extension| ● Goose Settings (Set the Goose Mode, Tool Output, Experiment and more)β”” 3. Choose `Goose Mode` from the menu and press Enter. β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Goose Settingsβ”‚β—† What setting would you like to configure?β”‚ ● Goose Mode (Configure Goose mode)| β—‹ Tool Outputβ”” 4. Choose the Goose mode you would like to configure. β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Goose Settingsβ”‚β—‡ What setting would you like to configure?β”‚ Goose Modeβ”‚β—† Which Goose mode would you like to configure?β”‚ ● Auto Mode| β—‹ Approve Mode| β—‹ Smart Approve Mode | β—‹ Chat Mode|β”” Set to Auto Mode - full file modification enabled You can change modes before or during a session and it will take effect immediately. * In Session * From Settings Click the Goose Mode option from the bottom menu. 1. Click `...` in the upper right corner 2. Click `Settings` 3. Under `Mode Selection`, choose the mode you'd like info If you choose `Approve` mode, you will see "Allow" and "Deny" buttons in your session windows during tool calls. Goose will only ask for permission for tools that it deems are 'write' tools, e.g. any 'text editor write', 'text editor edit', 'bash - rm, cp, mv' commands. Read/write approval makes best effort attempt at classifying read or write tools. This is interpreted by your LLM provider. * [Permission Modes](#permission-modes) * [Configuring Goose Mode](#configuring-goose-mode) --- # Extensions Design | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page This document describes the design and implementation of the [Extensions framework](/goose/docs/getting-started/using-extensions) in Goose, which enables AI agents to interact with different extensions through a unified tool-based interface. Core Concepts[​](#core-concepts "Direct link to Core Concepts") ---------------------------------------------------------------- ### Extension[​](#extension "Direct link to Extension") An Extension represents any component that can be operated by an AI agent. Extensions expose their capabilities through Tools and maintain their own state. The core interface is defined by the `Extension` trait: #[async_trait]pub trait Extension: Send + Sync { fn name(&self) -> &str; fn description(&self) -> &str; fn instructions(&self) -> &str; fn tools(&self) -> &[Tool]; async fn status(&self) -> AnyhowResult>; async fn call_tool(&self, tool_name: &str, parameters: HashMap) -> ToolResult;} ### Tools[​](#tools "Direct link to Tools") Tools are the primary way Extensions expose functionality to agents. Each tool has: * A name * A description * A set of parameters * An implementation that executes the tool's functionality A tool must take a Value and return an `AgentResult` (it must also be async). This is what makes it compatible with the tool calling framework from the agent. async fn echo(&self, params: Value) -> AgentResult Architecture[​](#architecture "Direct link to Architecture") ------------------------------------------------------------- ### Component Overview[​](#component-overview "Direct link to Component Overview") 1. **Extension Trait**: The core interface that all extensions must implement 2. **Error Handling**: Specialized error types for tool execution 3. **Proc Macros**: Simplify tool definition and registration \[_not yet implemented_\] ### Error Handling[​](#error-handling "Direct link to Error Handling") The system uses two main error types: * `ToolError`: Specific errors related to tool execution * `anyhow::Error`: General purpose errors for extension status and other operations This split allows precise error handling for tool execution while maintaining flexibility for general extension operations. Best Practices[​](#best-practices "Direct link to Best Practices") ------------------------------------------------------------------- ### Tool Design[​](#tool-design "Direct link to Tool Design") 1. **Clear Names**: Use clear, action-oriented names for tools (e.g., "create\_user" not "user") 2. **Descriptive Parameters**: Each parameter should have a clear description 3. **Error Handling**: Return specific errors when possible, the errors become "prompts" 4. **State Management**: Be explicit about state modifications ### Extension Implementation[​](#extension-implementation "Direct link to Extension Implementation") 1. **State Encapsulation**: Keep extension state private and controlled 2. **Error Propagation**: Use `?` operator with `ToolError` for tool execution 3. **Status Clarity**: Provide clear, structured status information 4. **Documentation**: Document all tools and their effects ### Example Implementation[​](#example-implementation "Direct link to Example Implementation") Here's a complete example of a simple extension: use goose_macros::tool;struct FileSystem { registry: ToolRegistry, root_path: PathBuf,}impl FileSystem { #[tool( name = "read_file", description = "Read contents of a file" )] async fn read_file(&self, path: String) -> ToolResult { let full_path = self.root_path.join(path); let content = tokio::fs::read_to_string(full_path) .await .map_err(|e| ToolError::ExecutionError(e.to_string()))?; Ok(json!({ "content": content })) }}#[async_trait]impl Extension for FileSystem { // ... implement trait methods ...} Testing[​](#testing "Direct link to Testing") ---------------------------------------------- Extensions should be tested at multiple levels: 1. Unit tests for individual tools 2. Integration tests for extension behavior 3. Property tests for tool invariants Example test: #[tokio::test]async fn test_echo_tool() { let extension = TestExtension::new(); let result = extension.call_tool( "echo", hashmap!{ "message" => json!("hello") } ).await; assert_eq!(result.unwrap(), json!({ "response": "hello" }));} * [Core Concepts](#core-concepts) * [Extension](#extension) * [Tools](#tools) * [Architecture](#architecture) * [Component Overview](#component-overview) * [Error Handling](#error-handling) * [Best Practices](#best-practices) * [Tool Design](#tool-design) * [Extension Implementation](#extension-implementation) * [Example Implementation](#example-implementation) * [Testing](#testing) --- # Knowledge Graph Memory Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [Knowledge Graph Memory MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/memory) as a Goose extension. This enables Goose to analyze relationships, detect patterns, and gain a deeper understanding of your data. The knowledge graph builds on the [memory extension](/goose/docs/tutorials/memory-mcp) by mapping complex relationships between concepts and providing persistent memory across Goose sessions. TLDR **Command** npx -y @modelcontextprotocol/server-memory Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ knowledge graph memory β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ knowledge graph memory β”‚ β—† What command should be run? β”‚ npx -y @modelcontextprotocol/server-memory β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ knowledge graph memory β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-memory β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Choose No when asked to add environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ knowledge graph memory β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-memory β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No β”‚ β”” Added knowledge graph memory extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40modelcontextprotocol%2Fserver-memory&id=knowledge_graph_memory&name=Knowledge%20Graph%20Memory&description=Graph-based%20memory%20system%20for%20persistent%20knowledge%20storage) 2. Press `Yes` to confirm the installation 3. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I'll show you how Goose can become an intelligent security reviewer by using connected knowledge patterns to detect and analyze vulnerabilities. Goose will be able to understand the relationship between security issues, their impacts, and mitigations. This means Goose doesn't just spot issues - it understands how vulnerabilities connect to real world impacts and can suggest comprehensive solutions. ### Step 1: Teach Goose About Security Patterns[​](#step-1-teach-goose-about-security-patterns "Direct link to Step 1: Teach Goose About Security Patterns") #### Goose Prompt #1[​](#goose-prompt-1 "Direct link to Goose Prompt #1") goose, learn these security vulnerability patterns and their relationships:1. SQL Injection relates to: - Unvalidated database inputs - Data theft risks - Parameterized query solutions 2. XSS Vulnerabilities connect to: - Unescaped user output - Session hijacking risks - Content sanitization fixes3.Authentication Weaknesses link to: - Session management - Account compromise - JWT-based solutions #### Goose Output[​](#goose-output "Direct link to Goose Output") I'll store this security knowledge in the Knowledge Graph Memory with proper entities and relationships[.... Create Entities .....]Now, let's create the relationships between these security concepts:[.... Create Relations .....]Let me verify what's been stored:[... Read Graph ...]I've now stored your security knowledge in the graph with:1. Vulnerability Entities: - SQL Injection (with observations about unvalidated inputs and data theft) - XSS Vulnerabilities (with observations about unescaped output and session risks) - Authentication Weaknesses (with observations about session management)2. Solution Entities: - Parameterized Queries - Content Sanitization - JWT Authentication 3. Connected Relationships: - Vulnerabilities β†’ their potential impacts - Solutions β†’ the vulnerabilities they mitigateThe knowledge is now structured in a way that I can: - Trace vulnerability impact chains - Identify appropriate solutions for each vulnerability - Understand how different security issues are related ### Step 2: Use Connected Knowledge for Code Review[​](#step-2--use-connected-knowledge-for-code-review "Direct link to Step 2: Use Connected Knowledge for Code Review") #### Goose Prompt # 2[​](#goose-prompt--2 "Direct link to Goose Prompt # 2") Review this API endpoint for security issues: app.post('/api/login', (req, res) => { const { username, password } = req.body; const query = `SELECT * FROM users WHERE username = '${username}'`; db.query(query, (err, result) => { if (err) throw err; if (result.length > 0) { res.cookie('user', username); res.json({ success: true }); } });}); #### Goose Output[​](#goose-output-1 "Direct link to Goose Output") I'll analyze this code using our connected knowledge graph to trace security vulnerabilities and their implications:[.... Search Nodes ... Open Nodes ...]Based on our knowledge graph analysis, I've found multiple critical security issues:1. SQL Injection Vulnerability: - Issue: Using string concatenation in query WHERE username = '${username}' - Impact Chain: SQL Injection β†’ Data Theft - Risk Level: Critical - Solution (from parameterized_queries): Use parameterized queries instead2. Authentication Weakness: - Issue: Using basic cookie-based session res.cookie('user', username) - Impact Chain: Auth Weakness β†’ Account Compromise - Risk Level: High - Solution (from jwt_auth): Implement JWT with proper expiration Here's the secure implementation based on our stored patterns:app.post('/api/login', async (req, res) => { try { // Input validation if (!req.body.username || !req.body.password) { return res.status(400).json({ success: false, error: 'Username and password required' }); } // Parameterized query (prevents SQL injection) const query = 'SELECT * FROM users WHERE username = ?'; const result = await db.query(query, [req.body.username]); if (!result.length) { return res.status(401).json({ success: false, error: 'Invalid credentials' }); } // Password verification would go here // const validPassword = await bcrypt.compare(req.body.password, result[0].password); // JWT-based session management (prevents session hijacking) const token = jwt.sign( { userId: result[0].id }, process.env.JWT_SECRET, { expiresIn: '1h' } ); res.json({ success: true, token: token }); } catch (error) { res.status(500).json({ success: false, error: 'Internal server error' }); }}); The fixes address the vulnerability chains our knowledge graph identified: 1. SQL Injection β†’ Data Theft: Mitigated by parameterized queries 2. Auth Weakness β†’ Account Compromise: Mitigated by JWT implementation Additional security improvements based on connected patterns: - Added input validation - Proper error handling - No exposure of internal errors - Token-based instead of cookie-based auth - Expiration time on authentication Would you like me to: 1. Explain any of these security relationships in more detail? 2. Show how to implement additional security patterns? 3. Analyze another endpoint? * [Configuration](#configuration) * [Example Usage](#example-usage) * [Step 1: Teach Goose About Security Patterns](#step-1-teach-goose-about-security-patterns) * [Step 2: Use Connected Knowledge for Code Review](#step-2--use-connected-knowledge-for-code-review) --- # Observability with Langfuse | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page This tutorial covers how to integrate Goose with Langfuse to monitor your Goose requests and understand how the agent is performing. What is Langfuse[​](#what-is-langfuse "Direct link to What is Langfuse") ------------------------------------------------------------------------- [Langfuse](https://langfuse.com/) is an [open-source](https://github.com/langfuse/langfuse) LLM engineering platform that enables teams to collaboratively monitor, evaluate, and debug their LLM applications. Set up Langfuse[​](#set-up-langfuse "Direct link to Set up Langfuse") ---------------------------------------------------------------------- Sign up for Langfuse Cloud [here](https://cloud.langfuse.com) or self-host Langfuse [Docker Compose](https://langfuse.com/self-hosting/local) to get your Langfuse API keys. Configure Goose to Connect to Langfuse[​](#configure-goose-to-connect-to-langfuse "Direct link to Configure Goose to Connect to Langfuse") ------------------------------------------------------------------------------------------------------------------------------------------- Set the environment variables so that Goose (written in Rust) can connect to the Langfuse server. export LANGFUSE_INIT_PROJECT_PUBLIC_KEY=pk-lf-...export LANGFUSE_INIT_PROJECT_SECRET_KEY=sk-lf-...export LANGFUSE_URL=https://cloud.langfuse.com # EU data region πŸ‡ͺπŸ‡Ί# https://us.cloud.langfuse.com if you're using the US region πŸ‡ΊπŸ‡Έ# https://localhost:3000 if you're self-hosting Run Goose with Langfuse Integration[​](#run-goose-with-langfuse-integration "Direct link to Run Goose with Langfuse Integration") ---------------------------------------------------------------------------------------------------------------------------------- Now, you can run Goose and monitor your AI requests and actions through Langfuse. With Goose running and the environment variables set, Langfuse will start capturing traces of your Goose activities. _[Example trace (public) in Langfuse](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/cea4ed38-0c44-4b0a-8c20-4b0b6b9e8d73?timestamp=2025-01-31T15%3A52%3A30.362Z&observation=7c8e5807-3c29-4c28-9c6f-7d7427be401f) _ ![Goose trace in Langfuse](https://langfuse.com//images/docs/goose-integration/goose-example-trace.png) * [What is Langfuse](#what-is-langfuse) * [Set up Langfuse](#set-up-langfuse) * [Configure Goose to Connect to Langfuse](#configure-goose-to-connect-to-langfuse) * [Run Goose with Langfuse Integration](#run-goose-with-langfuse-integration) --- # Sharing a Goose Agent | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page A shared Agent in Goose is like a collaborative workspace where multiple people can work with the AI assistant together in real-time. Think of it similar to a shared Google Doc, but for AI assistance. Create a shared Agent[​](#create-a-shared-agent "Direct link to Create a shared Agent") ---------------------------------------------------------------------------------------- When you create an Agent to be shared, you are creating a host Agent. When your host terminates, the shared Agents are disconnected and collaborators can no longer see activity in the host. ### Setup recipe[​](#setup-recipe "Direct link to Setup recipe") To create a custom session (whether using the desktop app or CLI), you'll need: * Instructions for the AI * Activities it should perform * A custom prompt (optional) The CLI calls this a "recipe." The desktop app shows these same options in the Agent Created dialog when you create a new shared session. tip Both tools need the same information, they just use different names for it. ### Agent setup instructions[​](#agent-setup-instructions "Direct link to Agent setup instructions") When you share your Goose Agent setup (either through the command line or desktop app), you'll get a chance to review and edit the setup instructions. These instructions come from your current session, but they might need some extra details to work well for others. Here's an example: Let's say you were working with Goose to make debug a new application and you need help with the debug logs. In this case, you should add a note like this to your instructions: "I asked Goose to review the debug logs from this application: [https://github.com/square/connect-api-examples/tree/master/connect-examples/v2/node\_orders-payments](https://github.com/square/connect-api-examples/tree/master/connect-examples/v2/node_orders-payments) . The log files are in this folder: [https://github.com/square/connect-api-examples/blob/master/my\_app/v2/logs/](https://github.com/square/connect-api-examples/blob/master/my_app/v2/logs/) " This tells the new shared Agent (or new local session) what the context is for your debugging collaboration. The critical context that the shared Agent (or session) needs is the location of the application source code and the folder where log files are written. With this context, the teammate you are working with can ask Goose to clone the GitHub repo, open the project in an IDE, and build the project. ### Agent setup activities[​](#agent-setup-activities "Direct link to Agent setup activities") When you work with Goose, it keeps track of everything you do together. Before sharing your setup with others, you should review this list of activities. Think of it like cleaning up your workspace before inviting colleagues over: * Look at the list of activities when creating your shared setup * Pick only the activities that matter for your project * Remove any activities that aren't relevant for your teammates For example: If you used Goose for both writing the application UI and helping you debug it, but only want to share the debugging part, you can remove the coding the application activities. * Goose CLI * Goose Desktop To create a shared Agent using the CLI, you need a recipe. Think of a Goose "recipe" like a blueprint - it contains the instructions to recreate your agent for someone else. Here's what you need to know: * A recipe is different from sharing a live agent session * The recipe tells Goose how to build a copy of your agent * It includes things like: * Instructions for how the agent should behave * What activities the agent can do When you use the Goose desktop app to share an agent, it shows you a window where you can review and customize these settings before creating the recipe. With the CLI, the `/recipe` command creates a .yaml file that you can edit to customize the shared Agent that you want to create. Note: This is like sharing a cooking recipe with a friend - you're not giving them your actual meal, but the instructions to make the same thing themselves! In your terminal with a Goose session running, input the following: ( O)> /recipe Goose generates `recipe.yaml` and saves it for you as shown in the following output: Generating RecipeSaved recipe to .../my-shared-project/goose/recipe.yaml ### Recipe.yaml specification[​](#recipeyaml-specification "Direct link to Recipe.yaml specification") The .yaml file contains an editable set of fields that let you customize the shared Agent that gets created. ---# Required fieldsversion: 1.0.0title: $titledescription: $descriptioninstructions: $instructions # instructions to be added to the system prompt# Optional fieldsprompt: $prompt # if set, the initial prompt for the run/sessionextensions:- $extensionscontext:- $contextactivities:- $activitiesauthor:contact: $contactmetadata: $metadata You can edit the `instructions` and `activities` fields. Instructions can be edited to add context that isn't in the session that you are creating the shared Agent from. You can also add additional activites such as "Please ask users for their zipcode so you can provide their local weather forecast." Send the file to the Goose CLI user that wants to start a shared Agent. For more information about the `recipe` prompt completion command, see the [recipe](/goose/docs/guides/goose-cli-commands#recipe) CLI prompt. To share an Agent at any time, 1. click the three dots in the top-right corner of the application 2. select **Make Agent from this session** from the dropdown menu. Goose will create a shareable version of your Agent and show you a dialog with: * A shareable URL * Instructions for the new agent * Example activities the agent can help with Customizing your shared Agent[​](#customizing-your-shared-agent "Direct link to Customizing your shared Agent") ---------------------------------------------------------------------------------------------------------------- Before sharing, you can review and edit how your agent will help others: ### Instructions[​](#instructions "Direct link to Instructions") These tell the agent how to help other users. Goose creates these automatically based on your conversation, but you can edit them to add more guidance. #### For example:[​](#for-example "Direct link to For example:") Let's say you want the agent to help users check their local weather. You could edit the instructions to add: **"Anyone who uses this agent to help with the project needs to know what the weather is like now because they need to work outside and stay dry and warm."** ### Activities[​](#activities "Direct link to Activities") The activities list includes all of the tasks that you've asked Goose to perform in this session. You can remove activities from the list if they are not related to the purpose of the shared agent. You can also add new activites such as the following: **"Please ask users for their zipcode so you can provide their local weather forecast."** ### What the user experiences[​](#what-the-user-experiences "Direct link to What the user experiences") When someone uses your shared Agent, it will follow your instructions. Using our weather example: user: "will it be sunny and warm today?"Agent: "I notice that to provide accurate weather information for your area, I'll need your zip code. Could you please provide your zip code so I can check the current weather conditions for your specific location? - This is important since the instructions mention that users of this project need to know the weather conditions as they'll be working outside and need to stay dry and warm.Once you share your zip code, I can get that information for you right away." Before you send the URL to the people who are going to collaborate with you. Their browser will create a new shared Agent in Goose when it reads the URL in the address bar. Start the shared Agent[​](#start-the-shared-agent "Direct link to Start the shared Agent") ------------------------------------------------------------------------------------------- * Goose CLI * Goose Desktop When another Goose CLI user sends you a recipe file, save it in the directory where you want to start your shared Agent. From your terminal, navigate to the directory where you saved the file, and run: goose run -- The Goose CLI loads the recipe and creates a session with all of the components shared in the original session. For infomration about the Goose `run` command, see the [run](/goose/docs/guides/goose-cli-commands#run-options) CLI command. When another Goose desktop user wants to share an Agent, they send you an URL which you use to start the new shared Agent. Open a new tab on your browser and paste the shared Agent URL into the address bar and press the **enter** key on your keyboard. The browser requests your permission to start a new Goose session with the shared components. The new Goose session shows a set of activities that you can run. Any prompts that you give the Agent are processed in the context provided by the recipe created by the hosting user. Accessing conversation history in shared sessions[​](#accessing-conversation-history-in-shared-sessions "Direct link to Accessing conversation history in shared sessions") ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- When you join a shared session, you automatically get access to: * The full conversation history (chat messages) from when the session started * All tool outputs and results * Any files or content created during the session ### How It Works[​](#how-it-works "Direct link to How It Works") When you click the shared link, you'll join the active session. The conversation history will automatically load in your Goose window. You'll see all messages and interactions in real-time and can scroll up to view earlier parts of the conversation. ### Important Notes[​](#important-notes "Direct link to Important Notes") The history is synchronized live - you'll see new messages as they happen. You don't need to take any special steps to access the history. The conversation remains available as long as the session is active. Once the host ends the session, the shared access ends. ### Troubleshooting[​](#troubleshooting "Direct link to Troubleshooting") If you're having trouble accessing the conversation history when joining a shared session, you might want to: * Make sure you're using the most recent version of Goose * Try refreshing your session * Check with the host to ensure the session is still active Remember that the shared session ends when the host closes it, so make sure to save any important information you need before the session ends. Tool outputs in a shared session[​](#tool-outputs-in-a-shared-session "Direct link to Tool outputs in a shared session") ------------------------------------------------------------------------------------------------------------------------- In a shared session, participants can see: * All conversation messages * Tool outputs and results * Files or content created during the session * Active extensions and their configurations ### How tool outputs work in shared sessions[​](#how-tool-outputs-work-in-shared-sessions "Direct link to How tool outputs work in shared sessions") When any participant uses a tool, all members can see: * The tool being called * The parameters used * The results/output of the tool These outputs appear in the conversation just like messages and they're synchronized in real-time for all participants. ### Important Notes[​](#important-notes-1 "Direct link to Important Notes") * Tool outputs are treated as part of the conversation history * All participants can see the results, even if they didn't initiate the tool use * The outputs remain visible as long as the session is active * Like other shared content, tool outputs are only available during the active session This means that when you're in a shared session, you have full visibility into all tool interactions and their results, making it effective for collaborative troubleshooting or working together on tasks that require tool use. File access in shared sessions[​](#file-access-in-shared-sessions "Direct link to File access in shared sessions") ------------------------------------------------------------------------------------------------------------------- Files created during a session are meant to be accessible to all participants. However, a file that is created in one shared Agent instance is not created in parallel on the other instances. To give everyone access to the file, we suggest any of the following strategies: * **Ask the Host**: When a collaborator creates a file, ask them to: 1. Share the file's location or path 2. Confirm how they intend to share access to the file * **Use Shared Tools**: When files need to be shared: 1. Use collaborative tools like Google Drive (if the extension is available) 2. Share file contents directly in the conversation where possible 3. Consider using version control systems for code files * **Document Important Files**: 1. Keep track of important files created during the session 2. Save or copy relevant content before the session ends What gets shared?[​](#what-gets-shared "Direct link to What gets shared?") --------------------------------------------------------------------------- You might start a project in a Goose session and realize your teammate needs access to that context through a shared agent. But at the same time, you may have shared things with Goose that you’d rather keep private. ### Shared components[​](#shared-components "Direct link to Shared components") The shared agent includes these components: * Conversation history (all messages) * Tool outputs and results * Files or content created during the session * Active extensions and their configurations * Project context (when working within a project) ### Private components[​](#private-components "Direct link to Private components") The following components are not included in a shared agent: * Global memories (stored in `~/.config/goose/memory`) * Local memories (stored in .goose/memory) * Personal API keys or credentials * System-level configurations Common use cases[​](#common-use-cases "Direct link to Common use cases") ------------------------------------------------------------------------- There are many reasons why you might want to create a shared agent. The following shared agent use cases are just a starting point. ### Team Collaboration[​](#team-collaboration "Direct link to Team Collaboration") * Working together on coding projects * Troubleshooting technical issues * Brainstorming sessions * Training & Onboarding ### Teaching new team members[​](#teaching-new-team-members "Direct link to Teaching new team members") * Demonstrating workflows * Sharing best practices * Pair Programming ### Real-time code collaboration[​](#real-time-code-collaboration "Direct link to Real-time code collaboration") * Code reviews * Debugging sessions * [Create a shared Agent](#create-a-shared-agent) * [Setup recipe](#setup-recipe) * [Agent setup instructions](#agent-setup-instructions) * [Agent setup activities](#agent-setup-activities) * [Recipe.yaml specification](#recipeyaml-specification) * [Customizing your shared Agent](#customizing-your-shared-agent) * [Instructions](#instructions) * [Activities](#activities) * [What the user experiences](#what-the-user-experiences) * [Start the shared Agent](#start-the-shared-agent) * [Accessing conversation history in shared sessions](#accessing-conversation-history-in-shared-sessions) * [How It Works](#how-it-works) * [Important Notes](#important-notes) * [Troubleshooting](#troubleshooting) * [Tool outputs in a shared session](#tool-outputs-in-a-shared-session) * [How tool outputs work in shared sessions](#how-tool-outputs-work-in-shared-sessions) * [Important Notes](#important-notes-1) * [File access in shared sessions](#file-access-in-shared-sessions) * [What gets shared?](#what-gets-shared) * [Shared components](#shared-components) * [Private components](#private-components) * [Common use cases](#common-use-cases) * [Team Collaboration](#team-collaboration) * [Teaching new team members](#teaching-new-team-members) * [Real-time code collaboration](#real-time-code-collaboration) --- # Memory Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * The Memory extension turns Goose into a knowledgeable assistant by allowing you to teach it personalized key information (e.g. commands, code snippets, preferences and configurations) that it can recall and apply later. Whether it’s project-specific (local) or universal (global) knowledge, Goose learns and remembers what matters most to you. This tutorial covers enabling and using the Memory MCP Server, which is a built-in Goose extension. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- 1. Ensure extension is enabled: * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Built-in Extension` β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—† What type of extension would you like to add?β”‚ ● Built-in Extension (Use an extension that comes with Goose)β”‚ β—‹ Command-line Extension β”‚ β—‹ Remote Extension β”” 3. Arrow down to the `Memory` extension and press Enter β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extension β”‚β—† Which built-in extension would you like to enable?β”‚ β—‹ Developer Tools β”‚ β—‹ Computer Controller β”‚ ● Memory | β—‹ JetBrainsβ”” 4. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extension β”‚β—‡ Which built-in extension would you like to enable?β”‚ Memory β”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”” Enabled Memory extension 1. Click `...` in the upper right corner 2. Click `Settings` 3. Under `Extensions`, toggle `Memory` to on. 4. Scroll to the top and click `Exit` from the upper left corner Why Use Memory?[​](#why-use-memory "Direct link to Why Use Memory?") --------------------------------------------------------------------- With the Memory extension, you’re not just storing static notes, you’re teaching Goose how to assist you better. Imagine telling Goose: > _learn everything about MCP servers and save it to memory._ Later, you can ask: > _utilizing our MCP server knowledge help me build an MCP server._ Goose will recall everything you’ve saved as long as you instruct it to remember. This makes it easier to have consistent results when working with Goose. Trigger Words and When to Use Them[​](#trigger-words-and-when-to-use-them "Direct link to Trigger Words and When to Use Them") ------------------------------------------------------------------------------------------------------------------------------- Goose also recognizes certain trigger words that signal when to store, retrieve, or remove memory. | **Trigger Words** | **When to Use** | | --- | --- | | remember | Store useful info for later use | | forget | Remove a stored memory | | memory | General memory-related actions | | save | Save a command, config, or preference | | remove memory | Delete specific stored data | | clear memory | Wipe all stored memories | | search memory | Find previously stored data | | find memory | Locate specific saved information | Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I’ll show you how to make Goose a knowledgeable development assistant by teaching it about your project’s API standards. With the Memory extension, Goose can store structured information and recall it when needed, helping you stay consistent in your work. This means you no longer have to repeat yourself. Goose will remember your project’s requirements and automatically apply them to new tasks. tip If you frequently work with API standards or other structured knowledge, Goose may automatically suggest saving them to memory for you when it detects a pattern in your workflow. * Goose CLI * Goose Desktop 1. Open a terminal and start a new Goose session: goose session 1. Open a new session in Goose Desktop ### Step 1: Teach Goose Your API Standards[​](#step-1-teach-goose-your-api-standards "Direct link to Step 1: Teach Goose Your API Standards") #### Goose Prompt #1[​](#goose-prompt-1 "Direct link to Goose Prompt #1") Goose, learn our API development standards:- All endpoints must use TypeScript interfaces- Error responses follow RFC 7807 Problem Details spec- Rate limiting headers are required- Authentication uses JWT in Authorization header- All endpoints need OpenAPI documentationRemember this so you can help me follow these practices. #### Goose Output[​](#goose-output "Direct link to Goose Output") I've learned your API standards. I'll help enforce these requirements when working on API endpoints.Storing in: - Category: development_standards - Tags: #api #typescript #security #documentation - Scope: global (these are general standards)I can now help with: - API endpoint implementation - Error handling patterns - Authentication flows - Documentation requirements ### Step 2: Use Stored Knowledge to Create a New API Endpoint[​](#step-2-use-stored-knowledge-to-create-a-new-api-endpoint "Direct link to Step 2: Use Stored Knowledge to Create a New API Endpoint") #### Goose Prompt # 2[​](#goose-prompt--2 "Direct link to Goose Prompt # 2") Help me create a new endpoint for user preferences #### Goose Output[​](#goose-output-1 "Direct link to Goose Output") I see you need a new endpoint. Based on our API development standards that I have stored in memory, I'll ensure it meets all our requirements.[.. Checking stored API standards ...]I've included all our required elements:βœ… TypeScript interfacesβœ… RFC 7807 error response formatβœ… Rate limitingβœ… JWT auth headerβœ… OpenAPI documentationHere's your compliant endpoint:interface UserPreferences { userId: string; theme: 'light' | 'dark'; notifications: boolean; timezone: string;}interface ErrorResponse { type: string; title: string; status: number; detail: string; instance: string;}@Route('/api/users/:userId/preferences')class UserPreferencesController { @Get() @RateLimit(100) // Adding required rate limiting @OpenAPI({ ... }) // Including mandatory OpenAPI docs async getUserPreferences( @Header('Authorization') token: string, // JWT auth as per our standard @Param('userId') userId: string ): Promise { // Implementation following our error handling pattern }}Would you like me to implement the full endpoint logic? * [Configuration](#configuration) * [Why Use Memory?](#why-use-memory) * [Trigger Words and When to Use Them](#trigger-words-and-when-to-use-them) * [Example Usage](#example-usage) * [Step 1: Teach Goose Your API Standards](#step-1-teach-goose-your-api-standards) * [Step 2: Use Stored Knowledge to Create a New API Endpoint](#step-2-use-stored-knowledge-to-create-a-new-api-endpoint) --- # PDF Reader Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [PDF Reader MCP Server](https://github.com/michaelneale/mcp-read-pdf) as a Goose extension, enabling Goose to read and extract text from protected and unprotected PDFs. TLDR **Command** uvx mcp-read-pdf Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [uv](https://docs.astral.sh/uv/#installation) installed on your system to run this command, as it uses `uvx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Add Extensionβ”‚β—† What type of extension would you like to add?β”‚ β—‹ Built-in Extensionβ”‚ ● Command-line Extension (Run a local command or script)β”‚ β—‹ Remote Extensionβ”” 3. Give your extension a name β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Add Extensionβ”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extensionβ”‚β—† What would you like to call this extension?β”‚ pdfβ”” 4. Enter the command β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Add Extensionβ”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extensionβ”‚β—‡ What would you like to call this extension?β”‚ pdfβ”‚β—† What command should be run?β”‚ uvx mcp-read-pdfβ”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Add Extensionβ”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extensionβ”‚β—‡ What would you like to call this extension?β”‚ pdfβ”‚β—‡ What command should be run?β”‚ uvx mcp-read-pdfβ”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” 6. Choose No when asked to add environment variables β”Œ goose-configureβ”‚β—‡ What would you like to configure?β”‚ Add Extensionβ”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extensionβ”‚β—‡ What would you like to call this extension?β”‚ pdfβ”‚β—‡ What command should be run?β”‚ uvx mcp-read-pdfβ”‚β—‡ Please set the timeout for this tool (in secs):β”‚ 300β”‚β—† Would you like to add environment variables?β”‚ Noβ”‚β”” Added pdf extension 1. [Launch the installer](goose://extension?cmd=uvx&arg=mcp-read-pdf&id=pdf_read&name=PDF%20Reader&description=Read%20large%20and%20complex%20PDF%20documents) 2. Press `Yes` to confirm the installation 3. Click `Save Configuration` 4. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- This example shows how to use the PDF Reader Extension to analyze an applicant's resume for specific attributes. With the PDF Reader extension, Goose can read specific pages or entire documents as well as extract text from large and complex PDFs. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Read the resume at ~/Downloads/resume.pdf and evaluate how well this candidate aligns with the following role requirements: - 5+ years of backend development experience - Strong system design and distributed systems knowledge - Cloud infrastructure experience (AWS preferred) - Prior experience leading technical projects or teams - Bonus: familiarity with LLMs or AI/ML toolsGive a score out of 5 for each requirement, supporting evidence, and a summary at the end with pros, cons, and a decision: Strong Fit / Moderate Fit / Weak Fit. ### Goose Output[​](#goose-output "Direct link to Goose Output") CLI I'll help analyze the resume against those requirements. Let me read the PDF first. ─── read\_pdf | pdf ────────────────── file\_path: ~/Downloads/resume.pdf I'll now evaluate the candidate against each requirement based on the resume content: **1\. Backend Development Experience (5+ years)** **Score: 5/5** * 7+ years of experience as a Software Engineer at various companies * Extensive backend development work with Java, Python, and Go * Built and maintained multiple backend services and APIs * Deep experience with microservices architecture and RESTful APIs **2\. System Design and Distributed Systems Knowledge** **Score: 4.5/5** * Designed and implemented distributed caching systems * Experience with high-throughput message queuing systems * Implemented service mesh architecture for microservices * Strong understanding of scalability and reliability patterns * Worked on systems processing millions of daily transactions **3\. Cloud Infrastructure Experience (AWS preferred)** **Score: 4/5** * Significant AWS experience including: * EC2, ECS, and Lambda * S3 and DynamoDB * CloudWatch and CloudFormation * Experience with infrastructure as code * Kubernetes deployment and management * CI/CD pipeline implementation in cloud environments **4\. Prior Experience Leading Technical Projects or Teams** **Score: 4.5/5** * Led a team of 5 engineers in developing a new payment processing system * Mentored junior developers and conducted technical interviews * Managed multiple critical projects from inception to delivery * Successfully coordinated cross-functional teams * Demonstrated technical leadership in architecture decisions **5\. Bonus: Familiarity with LLMs or AI/ML Tools** **Score: 3.5/5** * Recent experience implementing ML model deployment pipelines * Worked with natural language processing systems * Basic understanding of ML concepts and frameworks * Some exposure to LLM integration, though not extensive **Summary** **Pros:** * Exceeds the required years of backend development experience * Strong technical depth across multiple domains * Proven leadership and project management capabilities * Comprehensive cloud infrastructure experience * Good foundation in modern AI/ML technologies **Cons:** * While experienced with AWS, some newer cloud services experience could be beneficial * AI/ML experience is good but not deeply specialized in LLMs * Could benefit from more experience with specific cloud-native patterns **Decision: Strong Fit** The candidate demonstrates exceptional strength in core requirements, particularly in backend development and system design. Their leadership experience and cloud infrastructure knowledge are very solid. While their AI/ML experience isn't extensive, it's sufficient for the role where it's listed as a bonus qualification. The breadth and depth of their technical experience, combined with demonstrated leadership capabilities, make them a strong fit for the position. Their overall profile suggests they would be able to make immediate contributions while having the capacity to grow into any areas where they might need additional expertise. The strong foundation in distributed systems and proven track record of leading teams makes them particularly valuable for a technical leadership role. **Overall Scores Summary:** 1. Backend Development: 5/5 2. System Design: 4.5/5 3. Cloud Infrastructure: 4/5 4. Leadership Experience: 4.5/5 5. AI/ML (Bonus): 3.5/5 **Total Score: 21.5/25** (not including bonus) * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # PostgreSQL Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page The PostgreSQL MCP Server extension allows Goose to interact directly with your PostgreSQL databases, enabling database operations, querying, and schema management capabilities. This makes it easy to work with your databases through natural language interactions. TLDR **Command** npx -y @modelcontextprotocol/server-postgres postgresql://localhost/mydb Customizing Your Connection[​](#customizing-your-connection "Direct link to Customizing Your Connection") ---------------------------------------------------------------------------------------------------------- It's worth noting that this MCP server only allows connecting to a single predefined database at this time, and the connection URL must be specified in the command. We're using `postgresql://localhost/mydb` as an example here to access a local database, but you can configure this for your own environment. The PostgreSQL connection URL follows this format: postgresql://username:password@hostname:5432/database Where: * `username`: Your PostgreSQL user * `password`: Your PostgreSQL password * `hostname`: The host where PostgreSQL is running (e.g., localhost, IP address, or domain) * `5432`: The default PostgreSQL port (change if using a different port) * `database`: The name of your database Examples: * Local database: `postgresql://localhost/mydb` * Local with credentials: `postgresql://myuser:mypass@localhost/mydb` * Remote database: `postgresql://user:pass@db.example.com:5432/production` caution Never commit connection strings with credentials to version control! Use environment variables or secure configuration management. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Name your extension β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ PostgreSQL β”” 4. Enter the command with your database connection URL β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What would you like to call this extension? β”‚ PostgreSQL β”‚ β—† What command should be run? β”‚ npx -y @modelcontextprotocol/server-postgres postgresql://localhost/mydb β”” 5. Set the timeout (default 300s is usually sufficient) β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What would you like to call this extension? β”‚ PostgreSQL β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-postgres postgresql://localhost/mydb β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Configure your PostgreSQL connection URL β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What would you like to call this extension? β”‚ PostgreSQL β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-postgres postgresql://localhost/mydb β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No β”” Added PostgreSQL extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=@modelcontextprotocol/server-postgres&id=postgres&name=PostgreSQL&description=PostgreSQL%20database%20integration&env=POSTGRES_URL%3DYour%20PostgreSQL%20connection%20URL) 2. Press `Yes` to confirm the installation 3. Enter your PostgreSQL connection URL in the format: `postgresql://username:password@hostname:5432/database` 4. Click `Save Configuration` 5. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- The PostgreSQL extension enables you to query and analyze data or give you information about the table structures. The extension is only capable of _read-only_ operations, so you can use it to get information about your database, but not to modify it. Just describe what you want to do in natural language, and Goose will help you accomplish it using the appropriate SQL commands and PostgreSQL features. #### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Search my database for any students whose current GPA is higher than the average in their current grade level. Tell me their name, grade, and how much they exceed their grade’s average GPA, and the average GPA. #### Goose Output[​](#goose-output "Direct link to Goose Output") Based on the query results, here are the students who are performing above their grade level average:Grade 11 Emma Johnson GPA: 4.00 Grade Average: 3.90 Exceeds average by: 0.10 pointsGrade 12 John Smith GPA: 3.85 Grade Average: 3.78 Exceeds average by: 0.08 pointsBoth students are performing well above their respective grade level averages. Emma Johnson in Grade 11 shows the highest difference above the grade average, exceeding it by 0.10 points, while John Smith in Grade 12 exceeds his grade's average by 0.08 points. * [Customizing Your Connection](#customizing-your-connection) * [Configuration](#configuration) * [Example Usage](#example-usage) --- # Quick Goose Tips | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Here is a collection of tips for working with Goose: ### Goose can and will edit files[​](#goose-can-and-will-edit-files "Direct link to Goose can and will edit files") Use a git strategy to avoid losing anything - such as staging your personal edits and leaving Goose edits unstaged until reviewed. Consider using individual commits which can be reverted. See more on [File Management](/goose/docs/guides/file-management) . ### Goose can and will run commands[​](#goose-can-and-will-run-commands "Direct link to Goose can and will run commands") Goose will check commands for safety, however, you can also ask Goose to check with you before running commands if you are concerned. ### You can interrupt Goose with `CTRL+C`[​](#you-can-interrupt-goose-with-ctrlc "Direct link to you-can-interrupt-goose-with-ctrlc") Use this command to stop Goose in the event that you need to correct it or give it more info. ### Goose works best when solving concrete problems[​](#goose-works-best-when-solving-concrete-problems "Direct link to Goose works best when solving concrete problems") Experiment with how far you need to break a problem down to get Goose to solve it. Be specific! For example, it will likely fail to "create a banking app", but probably does a good job if prompted with "create a Fastapi app with an endpoint for deposit and withdrawal and with account balances stored in mysql keyed by id". ### Goose can troubleshoot[​](#goose-can-troubleshoot "Direct link to Goose can troubleshoot") If something goes wrong, Goose can help troubleshoot issues by examining logs, analyzing error messages, and suggesting possible resolutions. ### Leverage Goose to learn[​](#leverage-goose-to-learn "Direct link to Leverage Goose to learn") Use Goose to learn new technologies or frameworks by asking it to explain things like code snippets, concepts, or best practices relevant to your project. ### Goose needs context[​](#goose-needs-context "Direct link to Goose needs context") If Goose doesn't have enough context to start with, it might go in the wrong direction. Tell it to read files that you are referring to or search for objects in code. Even better, ask it to summarize them for you, which will help it set up its own next steps. You can create a [goosehints](/goose/docs/guides/using-goosehints) file to help with this. ### Use easy search terms[​](#use-easy-search-terms "Direct link to Use easy search terms") Refer to any objects in files with something that is easy for Goose to search for, such as "the MyExample class". ### Teach Goose how you test[​](#teach-goose-how-you-test "Direct link to Teach Goose how you test") Goose _loves_ to know how to run tests to get a feedback loop going, just like you do. If you tell it how you test things locally and quickly, it can make use of that when working on your project. ### Goose can do scripting tasks[​](#goose-can-do-scripting-tasks "Direct link to Goose can do scripting tasks") You can use Goose for tasks that would require scripting. It can even look at your screen and correct designs, or help you fix bugs. Try asking it to help you in a way you would ask a person. ### Goose will make mistakes[​](#goose-will-make-mistakes "Direct link to Goose will make mistakes") Sometimes Goose will go in the wrong direction. Feel free to correct it, or start over again. ### Goose can run tasks continuously if asked[​](#goose-can-run-tasks-continuously-if-asked "Direct link to Goose can run tasks continuously if asked") You can tell Goose to run things for you continuously and it will iterate, try, and retry. ### Goose can run anywhere[​](#goose-can-run-anywhere "Direct link to Goose can run anywhere") It doesn't have to be in a repo. Just ask Goose! ### Keep Goose updated[​](#keep-goose-updated "Direct link to Keep Goose updated") Regularly update Goose to benefit from the latest features, bug fixes, and performance improvements. For the CLI, the best way to keep it updated is by re-running the [Goose installation script](https://block.github.io/goose/docs/quickstart/#installation) . For Goose Desktop, check the [GitHub Releases page](https://github.com/block/goose/releases/stable) regularly for updates. * [Goose can and will edit files](#goose-can-and-will-edit-files) * [Goose can and will run commands](#goose-can-and-will-run-commands) * [You can interrupt Goose with `CTRL+C`](#you-can-interrupt-goose-with-ctrlc) * [Goose works best when solving concrete problems](#goose-works-best-when-solving-concrete-problems) * [Goose can troubleshoot](#goose-can-troubleshoot) * [Leverage Goose to learn](#leverage-goose-to-learn) * [Goose needs context](#goose-needs-context) * [Use easy search terms](#use-easy-search-terms) * [Teach Goose how you test](#teach-goose-how-you-test) * [Goose can do scripting tasks](#goose-can-do-scripting-tasks) * [Goose will make mistakes](#goose-will-make-mistakes) * [Goose can run tasks continuously if asked](#goose-can-run-tasks-continuously-if-asked) * [Goose can run anywhere](#goose-can-run-anywhere) * [Keep Goose updated](#keep-goose-updated) --- # Puppeteer Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [Puppeteer MCP Server](https://github.com/modelcontextprotocol/servers/tree/HEAD/src/puppeteer) as a Goose extension, enabling Goose to interact with websites - navigating pages, filling forms, clicking buttons, taking screenshots, and executing JavaScript in a real browser environment. TLDR **Command** npx -y @modelcontextprotocol/server-puppeteer Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ Puppeteer β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Puppeteer β”‚ β—† What command should be run? β”‚ npx -y @modelcontextprotocol/server-puppeteer β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Puppeteer β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-puppeteer β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Choose No when asked to add environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Puppeteer β”‚ β—‡ What command should be run? β”‚ npx -y @modelcontextprotocol/server-puppeteer β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No β”‚ β”” Added puppeteer extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40modelcontextprotocol%2Fserver-puppeteer&id=puppeteer&name=Puppeteer&description=Headless%20browser%20automation) 2. Press `Yes` to confirm the installation 3. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I’ll show you how to use Goose with the Puppeteer Extension to perform an accessibility audit on a website. By automating browser interactions, Goose can navigate the site, test keyboard navigation, check color contrast, analyze ARIA attributes, and generate a detailed report with recommendations and code fixes. This allows you to quickly identify and resolve accessibility issues without manually inspecting each page. * Goose CLI * Goose Desktop 1. Open a terminal and start a new Goose session: goose session 1. Open a new session in Goose Desktop ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Can you check if my website is accessible? Please conduct a full accessibility audit, focusing on the following:1. Keyboard Navigation: Test all interactive elements (links, buttons, dropdowns, etc.) to ensure they are accessible without a mouse.2. Color Contrast Analysis: Verify that all text and UI elements meet WCAG contrast ratio standards.3. Screen Reader Compatibility: Test whether a screen reader can properly interpret content and navigation.4. ARIA & Semantic HTML Validation: Identify any missing or misused ARIA attributes and ensure proper semantic structure.5. Error Identification & Screenshots: Provide a comprehensive report with identified issues, along with screenshots if necessary.6. Fixes & Code Recommendations: Suggest HTML, CSS, or JavaScript changes to resolve any compliance issues.Here is the website to test: https://broken-workshop.dequelabs.com/. I want to ensure that our documentation meets accessibility standards. Please generate a detailed report with steps to fix any issues found. ### Goose Output[​](#goose-output "Direct link to Goose Output") Desktop I'll help you conduct a comprehensive accessibility audit of the website. I'll use a combination of automated and manual testing approaches to evaluate different accessibility aspects. 1. First, let's navigate to the site 2. Take screenshots and perform keyboard navigation testing 3. Run accessibility audits including color contrast analysis 4. Document findings **Let's begin:** `─── Puppeteer Navigate ──────────────────────────` **Let's take a screenshot of the homepage for reference:** `─── Puppeteer Screenshot ────────────────────────` I'll conduct a detailed accessibility audit of the recipe dashboard website. From the initial view, I can already identify several accessibility concerns. Let me break down the findings by category: **1\. Keyboard Navigation Issues:** * The "COOK" buttons for recipes appear to lack proper focus indicators * The edit icons (pencil icons) on recipe cards don't seem to have keyboard focus states * The navigation sequence may not be logical as there's no clear tab order **2\. Color Contrast Issues:** * The light gray text used for "Difficulty" labels may not meet WCAG contrast requirements * The green "Beginner" text appears to have insufficient contrast against the white background * The bar chart in the "YUMMINESS" section uses colors that may be difficult to distinguish **3\. Semantic Structure Problems:** * The heading hierarchy is unclear - "RECIPE DASHBOARD" appears to be an h1, but recipe titles don't seem to use proper heading tags * The statistics (9 EGGS USED, 10 RECIPES MADE, etc.) don't appear to use semantic list structures * The chart lacks proper ARIA labels for screen readers **4\. ARIA and Screen Reader Issues:** * The recipe cards don't appear to have proper aria-labelledby associations * The edit buttons lack aria-labels describing their purpose * The chart data isn't properly accessible to screen readers * No ARIA landmarks are visible for main navigation areas Let me run some additional tests to verify these issues: `─── Puppeteer Evaluate ──────────────────────────` Let me capture some specific sections for detailed analysis: `─── Puppeteer Screenshot ──────────────────────────` Based on my analysis, here's a detailed report with recommendations: **ACCESSIBILITY AUDIT REPORT** **1\. Structural Issues:**
Chocolate Cake

Chocolate Cake

**2\. Interactive Elements:** **3\. Image Accessibility:** Chocolate cake with dark chocolate frosting **4\. Chart Accessibility:**
**5\. Color Contrast Fixes:** /* Current */.difficulty-beginner { color: #90EE90;}/* Recommended */.difficulty-beginner { color: #2E7D32; /* Darker green for better contrast */} **6\. Focus Management:** /* Add to CSS */:focus { outline: 3px solid #2196F3; outline-offset: 2px;}.cook-button:focus { box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.4);} **Priority Fixes Needed:** **1\. High Priority:** * Add proper heading structure using h1-h6 tags * Implement keyboard focus indicators * Add alt text to all recipe images * Fix color contrast for difficulty labels **2\. Medium Priority:** * Add ARIA labels to interactive elements * Implement proper list structure for statistics * Add skip links for keyboard navigation * Make chart data accessible via screen reader **3\. Low Priority:** * Enhance focus order * Add ARIA landmarks * Implement announcement of dynamic content changes **Additional Recommendations:** **1\. Add a skip link:** **2\. Implement proper form labels:** **3\. Add ARIA live regions for dynamic updates:**
**Testing Tools Recommended:** 1. WAVE Web Accessibility Evaluation Tool 2. axe DevTools 3. Keyboard-only navigation testing 4. Screen reader testing with VoiceOver (Mac) This audit reveals several critical accessibility issues that should be addressed to ensure WCAG 2.1 compliance. The most urgent concerns are the lack of proper semantic structure, insufficient color contrast, and missing ARIA attributes. Would you like me to provide more specific details about implementing any of these fixes? ### Further Automation with GitHub Extension[​](#further-automation-with-github-extension "Direct link to Further Automation with GitHub Extension") You can take this accessibility audit a step further by combining the [GitHub Extension](/goose/docs/tutorials/github-mcp) with the Puppeteer Extension. With this setup, Goose doesn’t just find issues and apply fixes, it can also handle the entire Git workflow for you. The GitHub Extension allows Goose to commit changes, create a pull request, and even generate a PR description, so all you have to do is review and merge. 1. Enable the GitHub extension by following the steps in the **[GitHub Extension Tutorial](/goose/docs/tutorials/github-mcp#configuration) **. tip Ensure your GitHub Personal Access Token has the necessary permissions for repository access and pull request creation when using this combined approach. 2. Ask Goose to: * Create a new branch * Commit the accessibility improvements * Open a pull request ### Goose prompt:[​](#goose-prompt-1 "Direct link to Goose prompt:") Can you create a new branch called 'accessibility-improvements', apply the accessibility fixes you suggested, and open a pull request with these changes? Goose will then: * βœ… Create a branch: `accessibility-improvements` * βœ… Apply the recommended accessibility fixes * βœ… Commit the changes with a descriptive message * βœ… Open a pull request with a summary of improvements * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) * [Further Automation with GitHub Extension](#further-automation-with-github-extension) * [Goose prompt:](#goose-prompt-1) --- # Repomix Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page This tutorial covers how to add the [Repomix MCP Server](https://github.com/yamadashy/repomix) as a Goose extension to enable automated repository packing, codebase analysis, architecture summaries, test generation, and code exploration, all while compressing the codebase to minimize token usage and stay within your LLM's context limits. TLDR **Command** npx -y repomix --mcp Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ repomix β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ repomix β”‚ β—† What command should be run? β”‚ npx -y repomix --mcp β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extension β”‚β—‡ What would you like to call this extension?β”‚ repomixβ”‚β—‡ What command should be run?β”‚ npx -y repomix --mcpβ”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” 6. Choose No when asked to add environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ repomix β”‚ β—‡ What command should be run? β”‚ npx -y repomix --mcp β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No β”‚ β”” Added repomix extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=repomix&arg=--mcp&id=repomix&name=Repomix&description=Pack%20repositories%20into%20AI-friendly%20formats%20for%20Goose) 2. Press `Yes` to confirm the installation 3. Click `Save Configuration` 4. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, I’ll show you how to use Goose with the Repomix Extension to analyze the compressed Axios repository. Goose will focus on the `lib/core/Axios.js` file, explain its role in the architecture, spot missing tests, write new unit tests, and suggest improvements to the testing strategy and code maintainability. By compressing the entire codebase into an AI-friendly format, Repomix helps Goose stay within token limits while providing detailed, file-specific insights. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") > Review the file lib/core/Axios.js from the Axios repository and identify any missing unit tests needed to thoroughly cover its core functions and classes. Explain the role this file plays in the overall Axios architecture, how it integrates with other modules, and how well it is currently tested. Write new unit tests to improve coverage, and recommend improvements to the testing strategy or refactoring opportunities to make the code more maintainable. ### Goose Output[​](#goose-output "Direct link to Goose Output") CLI I'll help analyze the Axios.js core file and its testing coverage. Let's break this down into steps: 1. First, let's fetch and examine the Axios repository using repomix 2. Then analyze the specific file and its related tests 3. Finally provide recommendations and new unit tests Let's start by getting the repository: \--- Pack Remote Repository --- Now let's read the core Axios.js file and its related test files: \--- Read Repomix Output --- Based on my analysis of the Axios codebase, I'll provide you with a comprehensive overview of the project structure and create an improved README. Let me break this down into sections: **Role in Axios Architecture** The `Axios.js` file is one of the most critical core components of the Axios library. It serves several key purposes: 1. Request Handling: It contains the main `Axios` class that processes and dispatches HTTP requests 2. Configuration Management: Handles merging of default configs with request-specific configs 3. Interceptor Management: Manages request and response interceptors 4. HTTP Method Convenience: Provides convenience methods for different HTTP verbs (get, post, etc.) The file integrates with other core modules through: * `InterceptorManager` for handling request/response interceptors * `dispatchRequest` for making the actual HTTP requests * `mergeConfig` for configuration processing * `buildFullPath` for URL resolution * `AxiosHeaders` for header management **Current Test Coverage Analysis** The current test coverage for Axios.js is fairly good but has some gaps. Looking at the test files: 1. `test/unit/core/Axios.js` - Focuses mainly on error handling cases, particularly un-writable error stacks 2. `test/specs/api.spec.js` - Tests the public API surface 3. `test/specs/interceptors.spec.js` - Tests interceptor functionality 4. `test/specs/instance.spec.js` - Tests instance creation and configuration **Missing Test Coverage** 1. Error Handling: // Missing tests for error propagation in request chain_request(configOrUrl, config) { // Error handling here needs more coverage} 2. Config Processing: // Missing edge cases for config validationrequest(configOrUrl, config) { // Config validation edge cases not fully tested} 3. Method Aliases: // Missing tests for all HTTP method aliases with various parameter combinationsutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { // Missing tests for these methods with different data types}); 4. Interceptor Chain: // Missing tests for complex interceptor chains and error scenariosconst chain = [dispatchRequest.bind(this), undefined];chain.unshift.apply(chain, requestInterceptorChain);chain.push.apply(chain, responseInterceptorChain); **New Unit Tests** Here are new unit tests to improve coverage: describe('core::Axios', function() { describe('request method', function() { it('should handle null/undefined config values', function(done) { const instance = new Axios({}); instance.request({ url: '/foo', params: null, data: undefined }).then(function(response) { expect(response.config.params).toBeNull(); expect(response.config.data).toBeUndefined(); done(); }).catch(done); }); it('should properly merge nested config objects', function(done) { const instance = new Axios({ headers: { common: { 'X-Common': 'common' }, get: { 'X-Method': 'get' } } }); instance.request({ method: 'get', headers: { 'X-Custom': 'custom' } }).then(function(response) { expect(response.config.headers['X-Common']).toBe('common'); expect(response.config.headers['X-Method']).toBe('get'); expect(response.config.headers['X-Custom']).toBe('custom'); done(); }).catch(done); }); }); describe('interceptor chain', function() { it('should handle async interceptors correctly', async function() { const instance = new Axios({}); const order = []; instance.interceptors.request.use(async function(config) { await new Promise(resolve => setTimeout(resolve, 100)); order.push(1); return config; }); instance.interceptors.request.use(async function(config) { await new Promise(resolve => setTimeout(resolve, 50)); order.push(2); return config; }); instance.interceptors.response.use(async function(response) { await new Promise(resolve => setTimeout(resolve, 100)); order.push(3); return response; }); await instance.request('/foo'); expect(order).toEqual([2, 1, 3]); // Interceptors should execute in correct order }); it('should handle interceptor errors properly', function(done) { const instance = new Axios({}); const error = new Error('Interceptor Error'); instance.interceptors.request.use(function() { throw error; }); instance.request('/foo').catch(function(e) { expect(e).toBe(error); done(); }); }); }); describe('HTTP method aliases', function() { it('should handle various data types in post/put/patch', function(done) { const instance = new Axios({}); const testCases = [ {method: 'post', data: {foo: 'bar'}}, {method: 'put', data: 'string data'}, {method: 'patch', data: new URLSearchParams('foo=bar')}, {method: 'post', data: new FormData()}, {method: 'put', data: new Blob(['test'])}, {method: 'patch', data: null} ]; Promise.all(testCases.map(({method, data}) => { return instance[method]('/foo', data).then(response => { expect(response.config.data).toEqual(data); return response; }); })).then(() => done()).catch(done); }); });}); **Recommendations for Testing Strategy** 1. Modular Testing: * Break down tests into smaller, focused units * Test each HTTP method alias separately * Create dedicated test suites for config processing, interceptors, and error handling 2. Mock Integration Points: * Use dependency injection for better isolation * Mock external dependencies consistently * Create reusable mock factories 3. Error Handling: * Add more tests for error cases * Test error propagation through interceptor chains * Verify error object properties and inheritance 4. Config Processing: * Test complex config merging scenarios * Verify default values are applied correctly * Test config validation edge cases 5. Interceptor Testing: * Test complex chains of interceptors * Verify async interceptor behavior * Test interceptor error handling **Refactoring Opportunities** 1. Error Handling: // Current_request(configOrUrl, config) { try { return this.request(configOrUrl, config); } catch (err) { // Error handling }}// Suggestedasync _request(configOrUrl, config) { try { return await this.request(configOrUrl, config); } catch (err) { if (err instanceof AxiosError) { throw err; } throw AxiosError.from(err); }} 2. Config Processing: // Currentrequest(configOrUrl, config) { // Config processing}// Suggestedrequest(configOrUrl, config) { const normalizedConfig = this._normalizeConfig(configOrUrl, config); this._validateConfig(normalizedConfig); return this._processRequest(normalizedConfig);} 3. Interceptor Chain: // Current// Interceptor chain building mixed with request logic// Suggestedclass InterceptorChain { constructor(request, config) { this.request = request; this.config = config; this.chain = []; } addRequestInterceptors(interceptors) { // Add request interceptors } addResponseInterceptors(interceptors) { // Add response interceptors } execute() { // Execute chain }} These improvements would make the code more maintainable and easier to test, while also improving error handling and separation of concerns. The current test coverage is good but could be improved in these specific areas to ensure more robust functionality. The suggested new tests and refactoring opportunities would help catch edge cases and make the code more maintainable. * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # CLI Commands | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose provides a command-line interface (CLI) with several commands for managing sessions, configurations and extensions. Below is a list of the available commands and their descriptions: Commands[​](#commands "Direct link to Commands") ------------------------------------------------- ### help[​](#help "Direct link to help") Used to display the help menu **Usage:** goose --help * * * ### configure \[options\][​](#configure-options "Direct link to configure [options]") Configure Goose settings - providers, extensions, etc. **Usage:** goose configure * * * ### session \[options\][​](#session-options "Direct link to session [options]") * Start a session and give it a name **Options:** **`-n, --name `** **Usage:** goose session --name * Resume a previous session **Options:** **`-r, --resume`** **Usage:** goose session --resume --name * Start a session with the specified extension **Options:** **`--with-extension `** **Usage:** goose session --with-extension **Examples:** goose session --with-extension "npx -y @modelcontextprotocol/server-memory" With environment variable: goose session --with-extension "GITHUB_PERSONAL_ACCESS_TOKEN= npx -y @modelcontextprotocol/server-github" * Start a session with the specified remote extension over SSE **Options:** **`--with-remote-extension `** **Usage:** goose session --with-remote-extension **Examples:** goose session --with-remote-extension "http://localhost:8080/sse" * Start a session with the specified [built-in extension](/goose/docs/getting-started/using-extensions#built-in-extensions) enabled (e.g. 'developer') **Options:** **`--with-builtin `** **Usage:** goose session --with-builtin **Example:** goose session --with-builtin computercontroller * * * ### session list \[options\][​](#session-list-options "Direct link to session list [options]") List all saved sessions. * **`-v, --verbose`**: (Optional) Includes session file paths in the output. * **`-f, --format `**: Specify output format (`text` or `json`). Default is `text`. **Usage:** # List all sessions in text format (default)goose session list # List sessions with file pathsgoose session list --verbose # List sessions in JSON formatgoose session list --format json * * * ### info \[options\][​](#info-options "Direct link to info [options]") Shows Goose information, including the version, configuration file location, session storage, and logs. * **`-v, --verbose`**: (Optional) Show detailed configuration settings, including environment variables and enabled extensions. **Usage:** goose info * * * ### version[​](#version "Direct link to version") Used to check the current Goose version you have installed **Usage:** goose --version * * * ### update \[options\][​](#update-options "Direct link to update [options]") Update the Goose CLI to a newer version. **Options:** * **`--canary, -c`**: Update to the canary (development) version instead of the stable version * **`--reconfigure, -r`**: Forces Goose to reset configuration settings during the update process **Usage:** # Update to latest stable versiongoose update# Update to latest canary versiongoose update --canary# Update and reconfigure settingsgoose update --reconfigure * * * ### mcp[​](#mcp "Direct link to mcp") Run an enabled MCP server specified by `` (e.g. `'Google Drive'`) **Usage:** goose mcp * * * ### run \[options\][​](#run-options "Direct link to run [options]") Execute commands from an instruction file or stdin. Check out the [full guide](/goose/docs/guides/running-tasks) for more info. **Options:** * **`-i, --instructions `**: Path to instruction file containing commands. Use - for stdin. * **`-t, --text `**: Input text to provide to Goose directly * **`-s, --interactive`**: Continue in interactive mode after processing initial input * **`-n, --name `**: Name for this run session (e.g. `daily-tasks`) * **`-r, --resume`**: Resume from a previous run * **`--recipe `**: Load a custom recipe in current session * **`-p, --path `**: Path for this run session (e.g. `./playground.jsonl`) * **`--with-extension `**: Add stdio extensions (can be used multiple times in the same command) * **`--with-builtin `**: Add builtin extensions by name (e.g., 'developer' or multiple: 'developer,github') **Usage:** goose run --instructions plan.md#Load a recipe with a prompt that Goose executes and then exits goose run --recipe recipe.yaml#Load a recipe from this chat and then stays in an interactive sessiongoose run --recipe recipe.yaml -s#Load a recipe containing a prompt which Goose executes and then drops into an interactive sessiongoose run --recipe recipe.yaml --interactive#Generates an error: no text provided for prompt in headless modegoose run --recipe recipe_no_prompt.yaml * * * ### agents[​](#agents "Direct link to agents") Used to show the available implementations of the agent loop itself **Usage:** goose agents ### bench[​](#bench "Direct link to bench") Used to evaluate system-configuration across a range of practical tasks. See the [detailed guide](/goose/docs/guides/benchmarking) for more information. **Usage:** goose bench ...etc. ### recipe[​](#recipe "Direct link to recipe") Used to validate a recipe file and get a link to share the recipe (aka "shared agent") with another Goose user. goose recipe **Options:** * **`--help, -h`**: Print this message or the help for the subcommand **Command Usage:** # Validate a recipe filegoose recipe validate $FILE.yaml# Generate a deeplink for a recipe filegoose recipe deeplink $FILE.yaml# Print this message or the help for the given commandgoose recipe help * * * Prompt Completion[​](#prompt-completion "Direct link to Prompt Completion") ---------------------------------------------------------------------------- The CLI provides a set of slash commands that can be accessed during a session. These commands support tab completion for easier use. #### Available Commands[​](#available-commands "Direct link to Available Commands") * `/exit` or `/quit` - Exit the current session * `/t` - Toggle between Light/Dark/Ansi themes * `/extension ` - Add a stdio extension (format: ENV1=val1 command args...) * `/builtin ` - Add builtin extensions by name (comma-separated) * `/prompts [--extension ]` - List all available prompts, optionally filtered by extension * `/prompt [--info] [key=value...]` - Get prompt info or execute a prompt * `/mode ` - Set the goose mode to use ('auto', 'approve', 'chat') * `/plan ` - Create a structured plan based on the given message * `/?` or `/help` - Display this help message * `/recipe ` - Generate and save a session recipe to `recipe.yaml` or the filename specified by the command parameter. All commands support tab completion. Press `` after a slash (/) to cycle through available commands or to complete partial commands. #### Examples[​](#examples "Direct link to Examples") # Create a plan for triaging test failures/plan let's create a plan for triaging test failures# List all prompts from the developer extension/prompts --extension developer# Switch to chat mode/mode chat * * * Keyboard Shortcuts[​](#keyboard-shortcuts "Direct link to Keyboard Shortcuts") ------------------------------------------------------------------------------- Goose CLI supports several shortcuts and built-in commands for easier navigation. * **`Ctrl+C`** - Interrupt the current request * **`Ctrl+J`** - Add a newline * **Up/Down arrows** - Navigate through command history * [Commands](#commands) * [help](#help) * [configure \[options\]](#configure-options) * [session \[options\]](#session-options) * [session list \[options\]](#session-list-options) * [info \[options\]](#info-options) * [version](#version) * [update \[options\]](#update-options) * [mcp](#mcp) * [run \[options\]](#run-options) * [agents](#agents) * [bench](#bench) * [recipe](#recipe) * [Prompt Completion](#prompt-completion) * [Keyboard Shortcuts](#keyboard-shortcuts) --- # YouTube Transcript Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [YouTube Transcript MCP Server](https://github.com/jkawamoto/mcp-youtube-transcript) as a Goose extension to enable fetching and working with YouTube video transcripts. TLDR **Command** npx @jkawamoto/mcp-youtube-transcript No environment variables are required for this extension. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ youtube-transcript β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ youtube-transcript β”‚ β—† What command should be run? β”‚ npx @jkawamoto/mcp-youtube-transcript β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extension β”‚β—‡ What would you like to call this extension?β”‚ youtube-transcriptβ”‚β—‡ What command should be run?β”‚ npx @jkawamoto/mcp-youtube-transcriptβ”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” 6. No environment variables are required for this extension β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ youtube-transcript β”‚ β—‡ What command should be run? β”‚ npx @jkawamoto/mcp-youtube-transcript β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No β”” Added youtube-transcript extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40jkawamoto%2Fmcp-youtube-transcript&id=youtube-transcript&name=YouTube%20Transcript&description=Access%20YouTube%20video%20transcripts) 2. Press `Yes` to confirm the installation 3. Click `Save Configuration` 4. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- The YouTube Transcript extension allows you to fetch and work with transcripts from YouTube videos. You'll need the video ID from the YouTube URL you want to get the transcript for. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Get me the transcript for this YouTube video: https://www.youtube.com/watch?v=dQw4w9WgXcQ ### Goose Output[​](#goose-output "Direct link to Goose Output") CLI I'll help you get the transcript for that video. The video ID is "dQw4w9WgXcQ". Let me fetch the transcript for you. Here's the transcript: \[Transcript content would appear here with timestamps and text\] I've retrieved the transcript for Rick Astley's "Never Gonna Give You Up" music video. The transcript shows the lyrics of the song, though there are some minor transcription errors due to the automated nature of the system. The transcript includes the iconic chorus and verses of this famous 1987 song, which has become one of the most well-known internet memes, often used for "rickrolling." Would you like me to help you with anything else regarding the video or its transcript? * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Selenium Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page This tutorial covers how to add the [Selenium MCP Server](https://github.com/angiejones/mcp-selenium) as a Goose extension to automate browser interactions such as navigating web pages and completing forms. TLDR **Command** npx -y @angiejones/mcp-selenium Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ Selenium β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Selenium β”‚ β—† What command should be run? β”‚ npx -y @angiejones/mcp-selenium β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extension β”‚β—‡ What would you like to call this extension?β”‚ Seleniumβ”‚β—‡ What command should be run?β”‚ npx -y @angiejones/mcp-seleniumβ”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” 6. Choose No when asked to add environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ Selenium β”‚ β—‡ What command should be run? β”‚ npx -y @angiejones/mcp-selenium β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No β”‚ β”” Added Selenium extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=%40angiejones%2Fmcp-selenium&id=selenium-mcp&name=Selenium%20MCP&description=automates%20browser%20interactions) 2. Press `Yes` to confirm the installation 3. Click `Save Configuration` 4. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- Let's use Goose to build a test automation project from scratch! We'll use the Selenium MCP to automate filling out a web form, then have Goose generate a Selenium project with the code so that we can run these tests again when needed. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") > Use selenium to go to the heroku formy site and fill out the form page with generic data. then can you turn what you've done into an automation script for me? I would like it in Java. Also use the Page Object Model pattern. ### Goose Output[​](#goose-output "Direct link to Goose Output") * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Goose Logging System | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose uses a unified storage system for conversations and interactions. All conversations and interactions (both CLI and Desktop) are stored **locally** in the following locations: | **Type** | **Unix-like (macOS, Linux)** | **Windows** | | --- | --- | --- | | **Command History** | `~/.config/goose/history.txt` | `%APPDATA%\Block\goose\data\history.txt` | | **Session Records** | `~/.local/share/goose/sessions/` | `%APPDATA%\Block\goose\data\sessions\` | | **System Logs** | `~/.local/state/goose/logs/` | `%APPDATA%\Block\goose\data\logs\` | Privacy Goose is a local application and all log files are stored locally. These logs are never sent to external servers or third parties, ensuring that all data remains private and under your control. Command History[​](#command-history "Direct link to Command History") ---------------------------------------------------------------------- Goose stores command history persistently across chat sessions, allowing Goose to recall previous commands. Command history logs are stored in: * Unix-like: `~/.config/goose/history.txt` * Windows: `%APPDATA%\Block\goose\data\history.txt` Session Records[​](#session-records "Direct link to Session Records") ---------------------------------------------------------------------- Goose maintains session records in `~/.local/share/goose/sessions/` that track the conversation history and interactions for each session. These files use the `.jsonl` format (JSON Lines), where each line is a valid JSON object representing a message or interaction. Session files are named with the pattern `[session-id].jsonl` where the session ID matches the identifier used in the corresponding log files. For example, `ccK9OTmS.jsonl` corresponds to log files like `20250211_133920-ccK9OTmS.log`. Each session file contains a chronological record of: * User messages and commands (commands are also stored persistently in `history.txt`) * Assistant (Goose) responses * Tool requests and their results * Timestamps for all interactions * Role information (user/assistant) * Message content and formatting * Tool call details including: * Tool IDs * Arguments passed * Results returned * Success/failure status Each line in a session file is a JSON object with the following key fields: * `role`: Identifies the source ("user" or "assistant") * `created`: Timestamp of the interaction * `content`: Array of interaction elements, which may include: * Text messages * Tool requests * Tool responses * Error messages System Logs[​](#system-logs "Direct link to System Logs") ---------------------------------------------------------- ### Main System Log[​](#main-system-log "Direct link to Main System Log") The main system log locations: * Unix-like: `~/.local/state/goose/logs/goose.log` * Windows: `%APPDATA%\Block\goose\data\logs\goose.log` This log contains general application-level logging including: * Session file locations * Token usage statistics as well as token counts (input, output, total) * LLM information (model names, versions) ### Desktop Application Log[​](#desktop-application-log "Direct link to Desktop Application Log") The desktop application maintains its own logs: * macOS: `~/Library/Application Support/Goose/logs/main.log` * Windows: `%APPDATA%\Block\goose\logs\main.log` The Desktop application follows platform conventions for its own operational logs and state data, but uses the standard Goose [session records](#session-records) for actual conversations and interactions. This means your conversation history is consistent regardless of which interface you use to interact with Goose. ### CLI Logs[​](#cli-logs "Direct link to CLI Logs") CLI logs are stored in: * Unix-like: `~/.local/state/goose/logs/cli/` * Windows: `%APPDATA%\Block\goose\data\logs\cli\` CLI session logs contain: * Tool invocations and responses * Command execution details * Session identifiers * Timestamps Extension logs contain: * Tool initialization * Tool capabilities and schemas * Extension-specific operations * Command execution results * Error messages and debugging information * Extension configuration states * Extension-specific protocol information ### Server Logs[​](#server-logs "Direct link to Server Logs") Server logs are stored in: * Unix-like: `~/.local/state/goose/logs/server/` * Windows: `%APPDATA%\Block\goose\data\logs\server\` The Server logs contain information about the Goose daemon (`goosed`), which is a local server process that runs on your computer. This server component manages communication between the CLI, extensions, and LLMs. Server logs include: * Server initialization details * JSON-RPC communication logs * Server capabilities * Protocol version information * Client-server interactions * Extension loading and initialization * Tool definitions and schemas * Extension instructions and capabilities * Debug-level transport information * System capabilities and configurations * Operating system information * Working directory information * Transport layer communication details * Message parsing and handling information * Request/response cycles * Error states and handling * Extension initialization sequences * [Command History](#command-history) * [Session Records](#session-records) * [System Logs](#system-logs) * [Main System Log](#main-system-log) * [Desktop Application Log](#desktop-application-log) * [CLI Logs](#cli-logs) * [Server Logs](#server-logs) --- # File Management | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page As an autonomous agent, Goose is designed to carry out tasks following specified instructions. This may sometimes involve working with local files. It's essential to follow best practices for safe file modification to monitor changes and revert anywhere necessary. Here are a few tips to help you manage file operations effectively while maintaining the integrity and safety of your codebase. ### Version Control[​](#version-control "Direct link to Version Control") Always use a version control system like Git to track changes to your codebase. This prevents accidental overwriting and allows you to revert back to previous states easily. Ensure you commit changes before running Goose on your codebase. Use branches to separate experimental changes from the main codebase. ### Validation and Testing[​](#validation-and-testing "Direct link to Validation and Testing") Implement validation and testing steps before and after Goose modifies any files. Run your unit tests to verify changes made by Goose. Use a staging environment to ensure changes integrate well with the entire system. ### Change Review[​](#change-review "Direct link to Change Review") Manually review or use automated code reviews to ensure the quality of generated code or changes. Integrate tools such as diff tools to visualize changes made by Goose. Implement a review process with team members or CI/CD pipelines. ### Codebase Organization[​](#codebase-organization "Direct link to Codebase Organization") Structure your codebase into well-defined modules or subdirectories to manage them efficiently. Use a modular approach to isolate parts of the code Goose needs to access. You can also provide specific directories or file paths you want Goose to work on. * [Version Control](#version-control) * [Validation and Testing](#validation-and-testing) * [Change Review](#change-review) * [Codebase Organization](#codebase-organization) --- # Tavily Web Search Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [Tavily Web Search MCP Server](https://github.com/tavily-ai/tavily-mcp) as a Goose extension to enable AI-powered web search functionality. TLDR **Command** npx -y tavily-mcp **Environment Variable** TAVILY_API_KEY: Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [uv](https://docs.astral.sh/uv/#installation) installed on your system to run this command, as it uses `uvx`. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ tavily β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ tavily β”‚ β—† What command should be run? β”‚ npx -y tavily-mcp β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ tavily β”‚ β—‡ What command should be run? β”‚ npx -y tavily-mcp β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Obtain a [Tavily API Key](https://tavily.com/) and paste it in. info You can get your API key by signing up at [tavily.com](https://app.tavily.com/) and navigating to your account settings. β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ tavily β”‚ β—‡ What command should be run? β”‚ npx -y tavily-mcp β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ Yes β”‚ β—‡ Environment variable name: β”‚ TAVILY_API_KEY β”‚ β—‡ Environment variable value: β”‚ β–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺβ–ͺ β”‚ β—‡ Add another environment variable? β”‚ No β”” Added tavily extension 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=tavily-mcp&id=tavily&name=Tavily%20Web%20Search&description=Search%20the%20web%20with%20Tavily%20MCP&env=TAVILY_API_KEY%3DTavily%20API%20Key) 2. Press `Yes` to confirm the installation 3. Obtain a [TAVILY\_API\_KEY](https://tavily.com/) and paste it in 4. Click `Save Configuration` 5. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- The Tavily MCP server enables AI-powered web search functionality in your Goose interactions. When you obtain your API key, you'll have access to Tavily's advanced search capabilities including: 1. Real-time web search 2. Structured data extraction 3. Content analysis 4. Topic-specific search ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Search for recent news about artificial intelligence breakthroughs in medicine and summarize the key findings. ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll use the Tavily news search tool to find recent news about AI breakthroughs in medicine.─── tavily_news_search | tavily ──────────────────────────max_results: 5query: ...Let me summarize the key findings from the recent news about AI in medicine:1. Personalized AI-Driven Healthcare:- Development of AI systems that act as "personal doctors" that work alongside human clinicians rather than replacing them- Focus on augmenting clinical capabilities while maintaining human oversight2. Breakthrough in Medical Imaging:- A significant advancement in CT scan analysis has been reported in Nature- Development of a "Unified total-body CT image" (Uni-CT) algorithm that: - Automatically generates single series of total-body CT images - Concatenates multiple images of segmented organs using organ-specific window settings - Reduces diagnosis time by 35% without compromising accuracy - Improves efficiency in trauma cases3. Future Trends:- Movement toward democratized AI in healthcare, potentially reducing the gap between large and small healthcare providers- Development of hyper-personalized medical experiences powered by AI- Integration of AI systems that can perform human-like reasoning in medical contextsThe most concrete breakthrough appears to be in medical imaging, with the Uni-CT algorithm showing promising results in improving both the speed and accuracy of trauma diagnosis. This represents a practical application of AI that could have immediate benefits in emergency medicine.Would you like me to search for more specific information about any of these developments or explore other areas of AI in medicine? tip You can adjust the [search parameters](https://github.com/tavily-ai/tavily-mcp#tavily-search-examples) for different types of queries and depths of information. The extension supports both quick searches and comprehensive research. * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) --- # Speech Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [Speech MCP Server](https://github.com/Kvadratni/speech-mcp) as a Goose extension to enable real-time voice interaction, audio/video transcription, text-to-speech conversion, and multi-speaker audio generation. TLDR **Command** uvx -p 3.10.14 speech-mcp@latest **Requirement** [PortAudio](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/scripts/readme-gen/templates/install_portaudio.tmpl.rst#install-portaudio) is required for PyAudio to capture audio from your microphone Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [uv](https://docs.astral.sh/uv/#installation) installed on your system to run this command, as it uses `uvx`. Before adding this extension, make sure [PortAudio](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/scripts/readme-gen/templates/install_portaudio.tmpl.rst#install-portaudio) is installed on your system. **PortAudio is required** for PyAudio to capture audio from your microphone. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ speech β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ speech β”‚ β—† What command should be run? β”‚ uvx -p 3.10.14 speech-mcp@latest β”” 5. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ speech β”‚ β—‡ What command should be run? β”‚ uvx -p 3.10.14 speech-mcp@latest β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” 6. Choose No when asked to add environment variables β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ speech β”‚ β—‡ What command should be run? β”‚ uvx -p 3.10.14 speech-mcp@latest β”‚ β—‡ Please set the timeout for this tool (in secs): β”‚ 300 β”‚ β—† Would you like to add environment variables? β”‚ No β”‚ β”” Added speech extension 1. [Launch the installer](goose://extension?cmd=uvx&&arg=-p&arg=3.10.14&arg=speech-mcp@latest&id=speech_mcp&name=Speech%20Interface&description=Voice%20interaction%20with%20audio%20visualization%20for%20Goose) 2. Press `Yes` to confirm the installation 3. Click `Save Configuration` 4. Scroll to the top and click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- In this example, you'll see how to use Goose with the Speech MCP Server Extension to turn voice commands into code. By speaking directly to Goose, you can launch the speech interface, give a spoken prompt, and have Goose generate and open a webpage based on your request. This allows you to build with Goose hands-free, making development more accessible and interactive. * Goose CLI * Goose Desktop 1. Open a terminal and start a new Goose session: goose session 1. Open a new session in Goose Desktop ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Here are some things you can say to activate the speech interface: * β€œGoose, I don’t feel like typing today.” * β€œLet’s talk using voice.” * β€œCan we have a voice conversation?” * β€œI’d like to speak instead of typing.” * β€œGoose, launch the speech UI.” Goose I don't feel like talking today ### Goose Output[​](#goose-output "Direct link to Goose Output") I understand! In that case, I can help you use voice commands instead. I'll launch the speech interface so you can speak your requests rather than type them---- Launch Speech UI ---- ### Goose Speech πŸŽ™οΈ[​](#goose-speech-️ "Direct link to Goose Speech πŸŽ™οΈ") **Goose:** > _I've launched the speech interface. You can now speak your requests instead of typing. Just speak after you hear my voice and see the microphone activate. What would you like help with?_ **Max:** > _Goose, lets create a simple page with the word 'vibes' on it and maybe change colors and make it move around the page and then open this page in the browser once you're done_ * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) * [Goose Speech πŸŽ™οΈ](#goose-speech-️) --- # Tutorial Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page The Tutorial extension is a built-in feature of Goose that provides interactive, step-by-step guidance for learning various aspects of Goose and its capabilities. It's designed to help users get comfortable with Goose's features through hands-on practice. The Tutorial extension serves as an interactive learning tool that: * Provides structured, step-by-step tutorials * Allows hands-on practice with Goose features * Offers immediate feedback and guidance Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- 1. Ensure the Tutorial extension is enabled: * Goose CLI * Goose Desktop goose configure 2. Choose to add a `Built-in Extension` β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—† What type of extension would you like to add?β”‚ ● Built-in Extension (Use an extension that comes with Goose)β”‚ β—‹ Command-line Extension β”‚ β—‹ Remote Extension β”” 3. Select the `Tutorial` extension β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Built-in Extension β”‚β—† Which built-in extension would you like to enable?β”‚ β—‹ Developer Tools β”‚ β—‹ Computer Controller β”‚ ● Tutorialβ”‚ β—‹ Memory | β—‹ JetBrainsβ”” 4. Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Built-in Extension β”‚ β—‡ Which built-in extension would you like to enable? β”‚ Tutorial β”‚ β—† Please set the timeout for this tool (in secs): β”‚ 300 β”” Enabled Tutorials extension 1. Click `...` in the upper right corner 2. Click `Settings` 3. Under `Extensions`, toggle `Tutorial` to on. Available Tutorials[​](#available-tutorials "Direct link to Available Tutorials") ---------------------------------------------------------------------------------- Currently, the following tutorials are available: * **build-mcp-extension**: Learn how to build an extension using the Model Context Protocol (MCP) * **first-game**: Create your first game with Goose More tutorials are being added regularly to cover additional features and use cases. Using the Tutorial Extension[​](#using-the-tutorial-extension "Direct link to Using the Tutorial Extension") ------------------------------------------------------------------------------------------------------------- ### Starting a Tutorial[​](#starting-a-tutorial "Direct link to Starting a Tutorial") There are two main ways to interact with tutorials: 1. **Ask Goose directly**: You can simply ask about a topic you're interested in, and Goose will suggest relevant tutorials. ( O)> I'd like to learn how to build an extension for Goose 2. **Request a specific tutorial**: You can directly request a tutorial by name. ( O)> Can you walk me through the first-game tutorial? ### During the Tutorial[​](#during-the-tutorial "Direct link to During the Tutorial") While going through a tutorial: 1. Goose will guide you step-by-step through the process 2. You'll receive clear instructions before any actions are taken 3. You can ask questions at any time for clarification 4. You can take breaks and resume later ### Best Practices[​](#best-practices "Direct link to Best Practices") * **Take your time**: Don't rush through the tutorials. Make sure you understand each step before moving on. * **Ask questions**: If something isn't clear, ask Goose to explain it further. * **Experiment**: Feel free to try variations of what you're learning. * **Take notes**: Document any interesting findings or techniques you learn. Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- ### Starting a Tutorial Session[​](#starting-a-tutorial-session "Direct link to Starting a Tutorial Session") Here's an example of how to start learning about building extensions: ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") I'd like to learn how to build an extension for Goose ### Goose Output[​](#goose-output "Direct link to Goose Output") I'll help you learn about building extensions! The "build-mcp-extension" tutorial would be perfect for this. Let me load it and guide you through it.─── load_tutorial | tutorial ──────────────────────────name: build-mcp-extensionBefore we dive into building your extension, I need to understand a few things to better guide you:1. Which SDK would you prefer to use? We have three options: - Python (beginner-friendly, great for prototyping) - TypeScript (great for web-based tools) - Kotlin (robust, type-safe, good for complex applications)2. What type of extension would you like to build? For example: - A tool that performs specific actions - A resource that provides data to the LLM - Or do you have a specific idea in mind?Let me know your preferences, and I'll help you get started with the appropriate setup and implementation!For reference, here's what we'll cover:1. Setting up your development environment2. Creating the basic MCP server3. Implementing your specific functionality4. Testing and debuggingWhich SDK would you like to use to get started? Next Steps[​](#next-steps "Direct link to Next Steps") ------------------------------------------------------- After completing tutorials, you can: * Apply learned concepts to your own projects * Contribute to the Goose community by sharing your experiences * Suggest new tutorial topics that would be helpful for others ### Need Further Help?[​](#need-further-help "Direct link to Need Further Help?") If you have questions, run into issues, or just need to brainstorm ideas join the [Discord Community](https://discord.gg/block-opensource) ! * [Configuration](#configuration) * [Available Tutorials](#available-tutorials) * [Using the Tutorial Extension](#using-the-tutorial-extension) * [Starting a Tutorial](#starting-a-tutorial) * [During the Tutorial](#during-the-tutorial) * [Best Practices](#best-practices) * [Example Usage](#example-usage) * [Starting a Tutorial Session](#starting-a-tutorial-session) * [Goose Prompt](#goose-prompt) * [Goose Output](#goose-output) * [Next Steps](#next-steps) * [Need Further Help?](#need-further-help) --- # Adjusting Tool Output Verbosity | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) When working with the Goose CLI, you can control the verbosity of tool output. To adjust the tool output, run: goose configure Then choose `Adjust Tool Output` β”Œ goose-configure β”‚β—† What would you like to configure?β”‚ β—‹ Configure Providers β”‚ β—‹ Add Extension β”‚ β—‹ Toggle Extensions β”‚ β—‹ Remove Extensionβ”‚ ● Adjust Tool Output (Show more or less tool output)β”” Next, choose one of the available modes: β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Adjust Tool Output β”‚β—† Which tool output would you like to show?β”‚ β—‹ High Importance β”‚ β—‹ Medium Importance β”‚ β—‹ All β”” * **High Importance** * Shows only the most important tool outputs * Most minimal output level * **Medium Importance** * Shows medium and high importance outputs * Example: Results of file-write operations * **All** * Shows all tool outputs * Example: Shell command outputs * Most verbose level --- # VS Code Extension | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page πŸŽ₯Plug & Play Watch the demo * * * This tutorial covers how to add the [VS Code MCP Server](https://github.com/block/vscode-mcp) as a Goose extension to enable VS Code integration, file operations, and development workflow management. TLDR **Command** npx vscode-mcp-server **Required Setup** Install the [VS Code MCP Extension](https://marketplace.visualstudio.com/items?itemName=block.vscode-mcp-extension) from the Visual Studio Marketplace. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- info Note that you'll need [Node.js](https://nodejs.org/) installed on your system to run this command, as it uses `npx`. 1. Add the [VS Code MCP Extension](https://marketplace.visualstudio.com/items?itemName=block.vscode-mcp-extension) to your VS Code. No additional settings required in VS Code. * Goose CLI * Goose Desktop 1. Run the `configure` command: goose configure 2. Choose to add a `Command-line Extension` β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—† What type of extension would you like to add? β”‚ β—‹ Built-in Extension β”‚ ● Command-line Extension (Run a local command or script) β”‚ β—‹ Remote Extension β”” 3. Give your extension a name β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—† What would you like to call this extension? β”‚ vscode-mcp β”” 4. Enter the command β”Œ goose-configure β”‚ β—‡ What would you like to configure? β”‚ Add Extension β”‚ β—‡ What type of extension would you like to add? β”‚ Command-line Extension β”‚ β—‡ What would you like to call this extension? β”‚ vscode-mcp β”‚ β—† What command should be run? β”‚ npx vscode-mcp-server β”” 5. Enter the timeout value (default 300s is recommended) β”Œ goose-configure β”‚β—‡ What would you like to configure?β”‚ Add Extension β”‚β—‡ What type of extension would you like to add?β”‚ Command-line Extension β”‚β—‡ What would you like to call this extension?β”‚ vscode-mcpβ”‚β—‡ What command should be run?β”‚ npx vscode-mcp-server installβ”‚β—† Please set the timeout for this tool (in secs):β”‚ 300β”‚β”” 6. No additional environment variables are required for basic setup 1. [Launch the installer](goose://extension?cmd=npx&arg=-y&arg=vscode-mcp-server&id=vscode-mcp&name=VS%20Code%20MCP&description=VS%20Code%20integration%20and%20file%20operations) 2. Press `Yes` to confirm the installation 3. Click `Save Configuration` 4. Click `Exit` from the upper left corner Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- The VS Code MCP extension enables Goose to interact with your VS Code environment, managing files, projects, and development workflows. The key strength of the VS Code MCP Server is its ability to: * Show diffs before making changes * Integrate file operations with VS Code's interface * Manage project workspaces * Provide immediate visual feedback in the editor note Every time you start a Goose session with the VS Code MCP server enabled, it checks to see if a matching project is open in VS Code. If not, it will prompt you to open the project before proceeding. ### Goose Prompt[​](#goose-prompt "Direct link to Goose Prompt") Update the contributing guide with instructions on how to start docusaurus dev server Result[​](#result "Direct link to Result") ------------------------------------------- ![session showing goose making updates and VS Code prompting user to accept or reject changes](/goose/assets/images/vscode-mcp-5e15828d0c528e5fd84b538ccd28c04a.png) * [Configuration](#configuration) * [Example Usage](#example-usage) * [Goose Prompt](#goose-prompt) * [Result](#result) --- # Benchmarking with Goose | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page The Goose benchmarking system allows you to evaluate goose performance on complex tasks with one or more system configurations. This guide covers how to use the `goose bench` command to run benchmarks and analyze results. ### Quick Start[​](#quick-start "Direct link to Quick Start") 1. The benchmarking system includes several evaluation suites. Run the following to see a listing of every valid selector: goose bench selectors 2. Create a basic configuration file: goose bench init-config -n bench-config.jsoncat bench-config.json{ "models": [ { "provider": "databricks", "name": "goose", "parallel_safe": true } ], "evals": [ { "selector": "core", "parallel_safe": true } ], "repeat": 1}...etc. 2. Run the benchmark: goose bench run -c bench-config.json Configuration File[​](#configuration-file "Direct link to Configuration File") ------------------------------------------------------------------------------- The benchmark configuration is specified in a JSON file with the following structure: { "models": [ { "provider": "databricks", "name": "goose", "parallel_safe": true, "tool_shim": { "use_tool_shim": false, "tool_shim_model": null } } ], "evals": [ { "selector": "core", "post_process_cmd": null, "parallel_safe": true } ], "include_dirs": [], "repeat": 2, "run_id": null, "eval_result_filename": "eval-results.json", "run_summary_filename": "run-results-summary.json", "env_file": null} ### Configuration Options[​](#configuration-options "Direct link to Configuration Options") #### Models Section[​](#models-section "Direct link to Models Section") Each model entry in the `models` array specifies: * `provider`: The model provider (e.g., "databricks") * `name`: Model identifier * `parallel_safe`: Whether the model can be run in parallel * `tool_shim`: Optional configuration for tool shimming * `use_tool_shim`: Enable/disable tool shimming * `tool_shim_model`: Optional model to use for tool shimming #### Evals Section[​](#evals-section "Direct link to Evals Section") Each evaluation entry in the `evals` array specifies: * `selector`: The evaluation suite to run (e.g., "core") * `post_process_cmd`: Optional path to a post-processing script * `parallel_safe`: Whether the evaluation can run in parallel #### General Options[​](#general-options "Direct link to General Options") * `include_dirs`: Additional directories to include in the evaluation * `repeat`: Number of times to repeat each evaluation * `run_id`: Optional identifier for the benchmark run * `eval_result_filename`: Name of the evaluation results file * `run_summary_filename`: Name of the summary results file * `env_file`: Optional path to an environment file ##### Mechanics of include\_dirs option[​](#mechanics-of-include_dirs-option "Direct link to Mechanics of include_dirs option") The `include_dirs` config parameter makes the items at all paths listed within the option, available to all evaluations. It accomplishes this by: * copying each included asset into the top-level directory created for each model/provider pair * at evaluation run-time * whichever assets is explicitly required by an evaluation gets copied into the eval-specific directory * only if the evaluation-code specifically pulls it in * and only if the evaluation actually is covered by one of the configured selectors and therefore runs ### Customizing Evaluations[​](#customizing-evaluations "Direct link to Customizing Evaluations") You can customize runs in several ways: 1. Using Post-Processing Commands after evaluation: { "evals": [ { "selector": "core", "post_process_cmd": "/path/to/process-script.sh", "parallel_safe": true } ]} 2. Including Additional Data: { "include_dirs": [ "/path/to/custom/eval/data" ]} 3. Setting Environment Variables: { "env_file": "/path/to/env-file"} Output and Results[​](#output-and-results "Direct link to Output and Results") ------------------------------------------------------------------------------- The benchmark generates two main output files within a file-hierarchy similar to the following. Results from running ach model/provider pair are stored within their own directory: benchmark-${datetime}/ ${model}-${provider}[-tool-shim[-${shim-model}]]/ run-${i}/ ${an-include_dir-asset} run-results-summary.json core/developer/list_files/ ${an-include_dir-asset} run-results-summary.json 1. `eval-results.json`: Contains detailed results from each evaluation, including: * Individual test case results * Model responses * Scoring metrics * Error logs 2. `run-results-summary.json`: A collection of all eval results across all suites. ### Debug Mode[​](#debug-mode "Direct link to Debug Mode") For detailed logging, you can enable debug mode: RUST_LOG=debug goose bench bench-config.json Advanced Usage[​](#advanced-usage "Direct link to Advanced Usage") ------------------------------------------------------------------- ### Tool Shimming[​](#tool-shimming "Direct link to Tool Shimming") Tool shimming allows you to use a non-tool-capable models with Goose, provided Ollama is installed on the system. See this guide for important details on [tool shimming](/goose/docs/guides/experimental-features) . * [Quick Start](#quick-start) * [Configuration File](#configuration-file) * [Configuration Options](#configuration-options) * [Customizing Evaluations](#customizing-evaluations) * [Output and Results](#output-and-results) * [Debug Mode](#debug-mode) * [Advanced Usage](#advanced-usage) * [Tool Shimming](#tool-shimming) --- # Running Tasks | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page When working with the Goose CLI, you can pass files and instructions to the `goose run` command to execute tasks and workflows. This could be a simple one-liner command or a complex set of instructions stored in a file. Basic Usage[​](#basic-usage "Direct link to Basic Usage") ---------------------------------------------------------- The `goose run` command starts a new session, begins executing using any arguments provided and exits the session automatically once the task is complete. There are multiple ways to run tasks with Goose; check out the [list of options](/goose/docs/guides/goose-cli-commands#run-options) . ### Text in the command[​](#text-in-the-command "Direct link to Text in the command") goose run -t "your instructions here" Using the `-t` flag, one is able to pass a text instruction directly to the command. This is great for quick, one-off commands where you do not need an interactive session with Goose. The instructions will be executed, and the session will end. An example usage could be using in a CI/CD pipeline or running alongside other scripts. ### Using an instruction file[​](#using-an-instruction-file "Direct link to Using an instruction file") If you have a complex set of instructions or a workflow that you want to automate, you can store them in a file and pass it to the `goose run` command: goose run -i instructions.md Here's an example of an instruction file that runs a security audit on project dependencies: # Dependency Security Audit1. Analyze project dependencies: - Check package.json and requirements.txt files - List all dependencies with versions - Identify outdated packages2. Security check: - Run npm audit (for JavaScript packages) - Check for known vulnerabilities in Python packages - Identify dependencies with critical security issues3. Create an upgrade plan: - List packages requiring immediate updates - Note breaking changes in latest versions - Estimate impact of required updatesSave findings in 'security_audit.md' with severity levels highlighted. ### With stdin[​](#with-stdin "Direct link to With stdin") You can also pass instructions to Goose using standard input via `-i -`. This is useful when you want to pipe commands from another tool or script into Goose. #### Simple echo pipe[​](#simple-echo-pipe "Direct link to Simple echo pipe") echo "What is 2+2?" | goose run -i - #### Multi-line instructions[​](#multi-line-instructions "Direct link to Multi-line instructions") cat << EOF | goose run -i -Please help me with these tasks:1. Calculate 15% of 852. Convert 32Β°C to FahrenheitEOF Key Features[​](#key-features "Direct link to Key Features") ------------------------------------------------------------- ### Interactive Mode[​](#interactive-mode "Direct link to Interactive Mode") If you don't want Goose to exit at the end of the task, you can pass the `-s` or `--interactive` flag to start an interactive session after processing your initial commands: goose run -i instructions.txt -s This is useful when you want to continue working with Goose after your initial commands are processed. ### Session Management[​](#session-management "Direct link to Session Management") You can name and manage your sessions: # Start a new named sessiongoose run -n my-project -t "initial instructions"# Resume a previous sessiongoose run -n my-project -r ### Working with Extensions[​](#working-with-extensions "Direct link to Working with Extensions") If you want to ensure specific extensions are available when running your task, you can indicate this with arguments. This can be done using the `--with-extension`, `--with-remote-extension`, or `--with-builtin` flags: * Using built-in extensions e.g developer and computercontroller extensions goose run --with-builtin "developer,computercontroller" -t "your instructions" * Using custom extensions goose run --with-extension "ENV1=value1 custom-extension-args" -t "your instructions" * Using remote extensions goose run --with-remote-extension "url" -t "your instructions" Common Use Cases[​](#common-use-cases "Direct link to Common Use Cases") ------------------------------------------------------------------------- ### Running Script Files[​](#running-script-files "Direct link to Running Script Files") Create an instruction file (e.g., `build-script.txt`): Check the current branchRun the test suiteBuild the documentation Then run it: goose run -i build-script.txt ### Quick Commands[​](#quick-commands "Direct link to Quick Commands") For one-off commands, use the text option: goose run -t "Create a CHANGELOG.md entry comparing current git branch with main" ### Development Workflows[​](#development-workflows "Direct link to Development Workflows") Start a session with specific extensions: goose run --with-builtin "developer,git" -n dev-session -s ### Combining Options[​](#combining-options "Direct link to Combining Options") You can combine multiple options to create powerful workflows: # Complex example combining multiple optionsgoose run \ --with-builtin "developer,git" \ --with-extension "API_KEY=xyz123 custom-tool" \ -n project-setup \ -t "Initialize project" This command: 1. Loads the developer and git built-in extensions 2. Adds a custom extension with an API key 3. Names the session "project-setup" 4. Starts with "Initialize project" instruction 5. Exits automatically after processing the command. * [Basic Usage](#basic-usage) * [Text in the command](#text-in-the-command) * [Using an instruction file](#using-an-instruction-file) * [With stdin](#with-stdin) * [Key Features](#key-features) * [Interactive Mode](#interactive-mode) * [Session Management](#session-management) * [Working with Extensions](#working-with-extensions) * [Common Use Cases](#common-use-cases) * [Running Script Files](#running-script-files) * [Quick Commands](#quick-commands) * [Development Workflows](#development-workflows) * [Combining Options](#combining-options) --- # Prevent Goose from Accessing Files | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page `.gooseignore` is a text file that defines patterns for files and directories that Goose will not access. This means Goose cannot read, modify, delete, or run shell commands on these files when using the Developer extension's tools. Developer extension only The .gooseignore feature currently only affects tools in the [Developer](/goose/docs/tutorials/developer-mcp) extension. Other extensions are not restricted by these rules. This guide will show you how to use `.gooseignore` files to prevent Goose from changing specific files and directories. Creating your `.gooseignore` file[​](#creating-your-gooseignore-file "Direct link to creating-your-gooseignore-file") ---------------------------------------------------------------------------------------------------------------------- Goose supports two types of `.gooseignore` files: * **Global ignore file** - Create a `.gooseignore` file in `~/.config/goose`. These restrictions will apply to all your sessions with Goose, regardless of directory. * **Local ignore file** - Create a `.gooseignore` file at the root of the directory you'd like it applied to. These restrictions will only apply when working in a specific directory. tip You can use both global and local `.gooseignore` files simultaneously. When both exist, Goose will combine the restrictions from both files to determine which paths are restricted. Example `.gooseignore` file[​](#example-gooseignore-file "Direct link to example-gooseignore-file") ---------------------------------------------------------------------------------------------------- In your `.gooseignore` file, you can write patterns to match files you want Goose to ignore. Here are some common patterns: # Ignore specific files by namesettings.json # Ignore only the file named "settings.json"# Ignore files by extension*.pdf # Ignore all PDF files*.config # Ignore all files ending in .config# Ignore directories and their contentsbackup/ # Ignore everything in the "backup" directorydownloads/ # Ignore everything in the "downloads" directory# Ignore all files with this name in any directory**/credentials.json # Ignore all files named "credentials.json" in any directory# Complex patterns*.log # Ignore all .log files!error.log # Except for error.log file Default patterns[​](#default-patterns "Direct link to Default patterns") ------------------------------------------------------------------------- By default, if you haven't created any `.gooseignore` files, Goose will not modify files matching these patterns: **/.env**/.env.***/secrets.* Common use cases[​](#common-use-cases "Direct link to Common use cases") ------------------------------------------------------------------------- Here are some typical scenarios where `.gooseignore` is helpful: * **Generated Files**: Prevent Goose from modifying auto-generated code or build outputs * **Third-Party Code**: Keep Goose from changing external libraries or dependencies * **Important Configurations**: Protect critical configuration files from accidental modifications * **Version Control**: Prevent changes to version control files like `.git` directory * [Creating your `.gooseignore` file](#creating-your-gooseignore-file) * [Example `.gooseignore` file](#example-gooseignore-file) * [Default patterns](#default-patterns) * [Common use cases](#common-use-cases) --- # Building Goose in Docker | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) Tell Us What You Need There are various scenarios where you might want to build Goose in Docker. If the instructions below do not meet your needs, please contact us by replying to our [discussion topic](https://github.com/block/goose/discussions/1496) . You can build Goose from the source file within a Docker container. This approach not only provides security benefits by creating an isolated environment but also enhances consistency and portability. For example, if you need to troubleshoot an error on a platform you don't usually work with (such as Ubuntu), you can easily debug it using Docker. To begin, you will need to modify the `Dockerfile` and `docker-compose.yml` files to suit your requirements. Some changes you might consider include: * **Required:** Setting your API key, provider, and model in the `docker-compose.yml` file as environment variables because the keyring settings do not work on Ubuntu in Docker. This example uses the Google API key and its corresponding settings, but you can [find your own list of API keys](https://github.com/block/goose/blob/main/ui/desktop/src/components/settings/models/hardcoded_stuff.tsx) and the [corresponding settings](https://github.com/block/goose/blob/main/ui/desktop/src/components/settings/models/hardcoded_stuff.tsx) . * **Optional:** Changing the base image to a different Linux distribution in the `Dockerfile`. This example uses Ubuntu, but you can switch to another distribution such as CentOS, Fedora, or Alpine. * **Optional:** Mounting your personal Goose settings and hints files in the `docker-compose.yml` file. This allows you to use your personal settings and hints files within the Docker container. After setting the credentials, you can build the Docker image using the following command: docker-compose -f documentation/docs/docker/docker-compose.yml build Next, run the container and connect to it using the following command: docker-compose -f documentation/docs/docker/docker-compose.yml run --rm goose-cli Inside the container, run the following command to configure Goose: goose configure When prompted to save the API key to the keyring, select `No`, as you are already passing the API key as an environment variable. Configure Goose a second time, and this time, you can [add any extensions](/goose/docs/getting-started/using-extensions) you need. After that, you can start a session: goose session You should now be able to connect to Goose with your configured extensions enabled. --- # Experimental Features | codename goose [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Goose is an open source project that is constantly being improved, and new features are added regularly. Some of these features are considered experimental, meaning they are still in development and may not be fully stable or ready for production use. This guide covers how to enable and use experimental features in Goose, as well as how to provide feedback on them. Available Experimental Features[​](#available-experimental-features "Direct link to Available Experimental Features") ---------------------------------------------------------------------------------------------------------------------- note The list of experimental features may change as Goose development progresses. Some features may be promoted to stable features, while others might be modified or removed.This section will be updated with specific experimental features as they become available ### Ollama Tool Shim[​](#ollama-tool-shim "Direct link to Ollama Tool Shim") The Ollama tool shim is an experimental feature that enables tool calling capabilities for language models that don't natively support tool calling (like DeepSeek). It works by instructing the primary model to output json for intended tool usage, the interpretive model uses ollama structured outputs to translate the primary model's message into valid json, and then that json is translated into valid tool calls to be invoked. #### How to use the Ollama Tool Shim[​](#how-to-use-the-ollama-tool-shim "Direct link to How to use the Ollama Tool Shim") 1. Make sure you have [Ollama](https://ollama.com/download) installed and running 2. The default interpreter model is `mistral-nemo`, if you want to proceed with this, you have to pull it from ollama server by running: ollama pull mistral-nemo 3. If you want to use a different model, make sure to pull it first from the Ollama server. Then override the default interpreter model using the `GOOSE_TOOLSHIM_OLLAMA_MODEL` environment variable. For example, to use the `llama3.2` model, run: ollama pull llama3.2 Then, GOOSE_TOOLSHIM_OLLAMA_MODEL=llama3.2 4. For optimal performance, run the Ollama server with an increased context length: OLLAMA_CONTEXT_LENGTH=32768 ollama serve 5. Enable the tool shim by setting the `GOOSE_TOOLSHIM` environment variable: GOOSE_TOOLSHIM=1 Start a new Goose session with your tool shim preferences: GOOSE_TOOLSHIM=1 GOOSE_TOOLSHIM_OLLAMA_MODEL=llama3.2 cargo run --bin goose session Feedback[​](#feedback "Direct link to Feedback") ------------------------------------------------- If you encounter any issues with these features, check if the issue is already reported in the [GitHub issues](https://github.com/goose/goose/issues) or join the [Discord community](https://discord.gg/block-opensource) to share. * [Available Experimental Features](#available-experimental-features) * [Ollama Tool Shim](#ollama-tool-shim) * [Feedback](#feedback) ---