mirror of
https://github.com/aljazceru/goose.git
synced 2026-02-23 15:34:27 +01:00
1464 lines
417 KiB
XML
1464 lines
417 KiB
XML
<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
|
||
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||
<channel>
|
||
<title>codename goose Blog</title>
|
||
<link>https://block.github.io/goose/blog</link>
|
||
<description>codename goose Blog</description>
|
||
<lastBuildDate>Fri, 27 Jun 2025 00:00:00 GMT</lastBuildDate>
|
||
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
|
||
<generator>https://github.com/jpmonette/feed</generator>
|
||
<language>en</language>
|
||
<item>
|
||
<title><![CDATA[5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/06/27/everyday-usecases-ai</link>
|
||
<guid>https://block.github.io/goose/blog/2025/06/27/everyday-usecases-ai</guid>
|
||
<pubDate>Fri, 27 Jun 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Forget the flashy demos. Here's everyday use cases for AI.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/everyday-usage-of-ai-69f4444328b28bdc945e5ff9fc92034d.png" width="1200" height="630" class="img_ev3q"></p>
|
||
<p>Whenever people talk about AI, they highlight the flashiest use cases like fully coded apps built by agents or cinematic video generation. Those things are certainly cool, but most days I'm just delegating mundane tasks to the bots.</p>
|
||
<p>Today, I didn't build an app. I didn't write a screenplay. I just got stuff done.</p>
|
||
<p>Here are 5 real, everyday tasks I gave to my AI agent, <a href="https://block.github.io/goose/">Goose</a>, that saved me hours. None of them took more than one minute from prompt to result.</p>
|
||
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>LLM</div><div class="admonitionContent_BuS1"><p>For all of these, I used Anthropic's Claude 4 Sonnet</p></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1️⃣-summarizing-github-activity-into-actionable-insights">1️⃣ Summarizing GitHub Activity into Actionable Insights<a href="https://block.github.io/goose/blog/2025/06/27/everyday-usecases-ai#1%EF%B8%8F%E2%83%A3-summarizing-github-activity-into-actionable-insights" class="hash-link" aria-label="Direct link to 1️⃣ Summarizing GitHub Activity into Actionable Insights" title="Direct link to 1️⃣ Summarizing GitHub Activity into Actionable Insights"></a></h2>
|
||
<p><strong>Task</strong></p>
|
||
<p>I asked Goose to review all closed GitHub issues across my organization for the month and give me a breakdown. I wanted to see where our time went, how work was distributed, and any patterns or dependencies across projects.</p>
|
||
<p><strong>Result</strong></p>
|
||
<p>In under a minute, Goose gave me a report with productivity metrics, workload distribution, and notable dependencies between issue threads (e.g. one fix blocking another).</p>
|
||
<p>This kind of synthesis normally requires me to manually scan a bunch of repos and cross-reference PRs or issue comments. Not today.</p>
|
||
<p><strong>MCPs used</strong></p>
|
||
<ul>
|
||
<li><a href="https://block.github.io/goose/docs/mcp/github-mcp">GitHub</a></li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2️⃣-extracting-action-items-from-a-long-slack-thread">2️⃣ Extracting Action Items from a Long Slack Thread<a href="https://block.github.io/goose/blog/2025/06/27/everyday-usecases-ai#2%EF%B8%8F%E2%83%A3-extracting-action-items-from-a-long-slack-thread" class="hash-link" aria-label="Direct link to 2️⃣ Extracting Action Items from a Long Slack Thread" title="Direct link to 2️⃣ Extracting Action Items from a Long Slack Thread"></a></h2>
|
||
<p><strong>Task</strong></p>
|
||
<p>You know when a Slack thread starts as a quick brainstorm and somehow grows into a novel? Ours had 169 replies today 😂, and buried in there were some important ideas.</p>
|
||
<p>So, I asked Goose to analyze the entire thread and extract a clean list of action items.</p>
|
||
<p><strong>Result</strong></p>
|
||
<p>In one minute, I had a focused to-do list with responsible parties, deadlines (when mentioned), and themes. These takeaways will likely shape our Q3 goals, and when I'm ready, I can even have Goose go create GitHub issues for all of them!</p>
|
||
<p><strong>MCPs used</strong></p>
|
||
<ul>
|
||
<li>Slack</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3️⃣-creating-a-roadmap-from-community-feedback">3️⃣ Creating a Roadmap from Community Feedback<a href="https://block.github.io/goose/blog/2025/06/27/everyday-usecases-ai#3%EF%B8%8F%E2%83%A3-creating-a-roadmap-from-community-feedback" class="hash-link" aria-label="Direct link to 3️⃣ Creating a Roadmap from Community Feedback" title="Direct link to 3️⃣ Creating a Roadmap from Community Feedback"></a></h2>
|
||
<p><strong>Task</strong></p>
|
||
<p>Our Goose community is active across GitHub, Slack, and Discord. There's tons of feedback, but it's scattered.
|
||
I had Goose pull and analyze open questions, bug reports, feature requests, and discussion threads across all three platforms.</p>
|
||
<p><strong>Results</strong></p>
|
||
<p>A ranked list of the top 10 items we need to address, including a short description of each issue along with the estimated effort of the tasks. This gave us a nice jumpstart on our roadmap planning.</p>
|
||
<p><strong>MCPs used</strong></p>
|
||
<ul>
|
||
<li><a href="https://block.github.io/goose/docs/mcp/github-mcp">GitHub</a></li>
|
||
<li>Slack</li>
|
||
<li><a href="https://github.com/hanweg/mcp-discord" target="_blank" rel="noopener noreferrer">Discord</a></li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4️⃣-fixing-my-css-breakpoints-because-i-gave-up">4️⃣ Fixing My CSS Breakpoints (Because I Gave Up)<a href="https://block.github.io/goose/blog/2025/06/27/everyday-usecases-ai#4%EF%B8%8F%E2%83%A3-fixing-my-css-breakpoints-because-i-gave-up" class="hash-link" aria-label="Direct link to 4️⃣ Fixing My CSS Breakpoints (Because I Gave Up)" title="Direct link to 4️⃣ Fixing My CSS Breakpoints (Because I Gave Up)"></a></h2>
|
||
<p><strong>Task</strong></p>
|
||
<p>Confession: CSS and I are not friends. After 30 minutes of fighting with breakpoints, spacing, and container widths, I gave the problem to Goose by showing it a screenshot of the page.</p>
|
||
<p><strong>Result</strong></p>
|
||
<p>Goose spotted the issue immediately and rewrote my media query logic as well as some other key CSS I was missing.</p>
|
||
<p><strong>MCPs used</strong></p>
|
||
<ul>
|
||
<li><a href="https://block.github.io/goose/docs/mcp/developer-mcp">Developer</a></li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="5️⃣-fixing-broken-links-after-a-big-doc-restructure">5️⃣ Fixing Broken Links After a Big Doc Restructure<a href="https://block.github.io/goose/blog/2025/06/27/everyday-usecases-ai#5%EF%B8%8F%E2%83%A3-fixing-broken-links-after-a-big-doc-restructure" class="hash-link" aria-label="Direct link to 5️⃣ Fixing Broken Links After a Big Doc Restructure" title="Direct link to 5️⃣ Fixing Broken Links After a Big Doc Restructure"></a></h2>
|
||
<p><strong>Task</strong></p>
|
||
<p>I restructured a big internal doc set and needed to update all internal links, reroute old paths, and make sure nothing was broken.
|
||
I handled the restructure manually (it was delicate so I wanted to do it myself), then asked Goose to crawl the doc, find broken or outdated links, fix them and add redirects where needed.</p>
|
||
<p><strong>Result</strong></p>
|
||
<p>No dead ends. No 404s. Just tidy documentation.</p>
|
||
<p><strong>MCP used</strong></p>
|
||
<ul>
|
||
<li><a href="https://block.github.io/goose/docs/mcp/developer-mcp">Developer</a></li>
|
||
</ul>
|
||
<hr>
|
||
<p>Most AI posts show off what's possible. I'm focused on what was promised.
|
||
The whole point was to offload the tedious stuff so we could focus on the work that actually matters, and that's exactly what I'm using AI for.</p>
|
||
<p>What everyday tasks are you delegating to AI agents? Let us know in <a href="https://discord.gg/block-opensource" target="_blank" rel="noopener noreferrer">Discord</a>.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Isolated Dev Environments in Goose with container-use]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/06/19/isolated-development-environments</link>
|
||
<guid>https://block.github.io/goose/blog/2025/06/19/isolated-development-environments</guid>
|
||
<pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Never worry about breaking your development setup again with containerized, git-branch-isolated development environments powered by container-use]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/sandbox-0b0f5e6f871cbf48ea1a0be243440aa1.png" width="2240" height="1260" class="img_ev3q"></p>
|
||
<p>Over ten years ago, Docker came onto the scene and introduced developers en masse to the concept and practice of containers. These containers helped solve deployment and build-time problems, and in some cases, issues with development environments. They quickly became mainstream. The technology underlying containers included copy-on-write filesystems and lightweight, virtual-machine-like environments that helped isolate processes and simplify cleanup.</p>
|
||
<p>Dagger, the project and company founded by Docker’s creator <a href="https://www.linkedin.com/in/solomonhykes" target="_blank" rel="noopener noreferrer">Solomon Hykes</a>, has furthered the reach of containers for developers.</p>
|
||
<p>One project that emerged from this work is <a href="https://github.com/dagger/container-use" target="_blank" rel="noopener noreferrer">Container Use</a>, an MCP server that gives agents an interface for working in isolated containers and git branches. It supports clear lifecycles, easy rollbacks, and safer experimentation, without sacrificing the ergonomics developers expect from local agents.</p>
|
||
<p>Container Use brings containerized, git-branch-isolated development directly into your <a href="https://block.github.io/goose/">Goose</a> workflow. While still early in its development, it's evolving quickly and already offers helpful tools for lightweight, branch-specific isolation when you need it.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-problem-with-local-only-development">The Problem with Local-Only Development<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#the-problem-with-local-only-development" class="hash-link" aria-label="Direct link to The Problem with Local-Only Development" title="Direct link to The Problem with Local-Only Development"></a></h2>
|
||
<p>Traditionally, developers build directly on their local machines, but that approach carries risks such as:</p>
|
||
<ul>
|
||
<li>Dependencies can conflict between projects</li>
|
||
<li>System changes might break other tools</li>
|
||
<li>Experimental code risks your stable codebase</li>
|
||
<li>Cleanup after failed experiments is tedious</li>
|
||
<li>Processes are left running, resources consumed that aren't freed</li>
|
||
<li>Changes are made which can't easily be undone</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-safer-alternative-isolated-development-environments">A Safer Alternative: Isolated Development Environments<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#a-safer-alternative-isolated-development-environments" class="hash-link" aria-label="Direct link to A Safer Alternative: Isolated Development Environments" title="Direct link to A Safer Alternative: Isolated Development Environments"></a></h2>
|
||
<p>Container Use solves these problems by giving Goose the ability to work in completely isolated environments. Every experiment gets its own sandbox where nothing can affect your main development setup.</p>
|
||
<ul>
|
||
<li><strong>Git branch isolation</strong>: Each experiment automatically gets its own git branch, keeping code changes separate from your main codebase.</li>
|
||
<li><strong>Container isolation</strong>: Your code runs in clean, reproducible containers with exactly the dependencies it needs—nothing more, nothing less.</li>
|
||
<li><strong>Easy reset</strong>: When you're done experimenting, simply exit the environment. No cleanup required, no residual changes to worry about.</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started">Getting Started<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-install-container-use">1. Install Container Use<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#1-install-container-use" class="hash-link" aria-label="Direct link to 1. Install Container Use" title="Direct link to 1. Install Container Use"></a></h3>
|
||
<p><strong>macOS (recommended):</strong></p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">brew install dagger/tap/container-use</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p><strong>All platforms:</strong></p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://raw.githubusercontent.com/dagger/container-use/main/install.sh | bash</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-add-to-goose">2. Add to Goose<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#2-add-to-goose" class="hash-link" aria-label="Direct link to 2. Add to Goose" title="Direct link to 2. Add to Goose"></a></h3>
|
||
<p>Click this link to automatically add the extension:</p>
|
||
<p><strong><a href="goose://extension?cmd=cu&arg=stdio&id=container-use&name=container%20use&description=use%20containers%20with%20dagger%20and%20git%20for%20isolated%20environments" target="_blank" rel="noopener noreferrer">🚀 Add Container Use to Goose</a></strong></p>
|
||
<p>Or manually add to <code>~/.config/goose/config.yaml</code>:</p>
|
||
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">extensions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">container-use</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> container</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">use</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> stdio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">cmd</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">args</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> stdio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">envs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="real-world-use-cases">Real-World Use Cases<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#real-world-use-cases" class="hash-link" aria-label="Direct link to Real-World Use Cases" title="Direct link to Real-World Use Cases"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="experimenting-with-new-dependencies">Experimenting with New Dependencies<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#experimenting-with-new-dependencies" class="hash-link" aria-label="Direct link to Experimenting with New Dependencies" title="Direct link to Experimenting with New Dependencies"></a></h3>
|
||
<ul>
|
||
<li>
|
||
<p><strong>Prompt</strong>: "I want to try adding Redis to this project, but I'm not sure if it's the right fit. Can you set up an isolated environment?"</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Result</strong>: Goose creates a new git branch, spins up a container with Redis, and lets you experiment. If it doesn't work out, simply exit—no cleanup needed.</p>
|
||
</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="risky-refactors">Risky Refactors<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#risky-refactors" class="hash-link" aria-label="Direct link to Risky Refactors" title="Direct link to Risky Refactors"></a></h3>
|
||
<ul>
|
||
<li>
|
||
<p><strong>Prompt</strong>: "I want to completely restructure this codebase, but I need to be able to roll back easily."</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Result</strong>: Work in an isolated branch and container where you can make sweeping changes without fear. Test your new architecture thoroughly. If the refactor succeeds, merge it back to main. If it fails, delete the branch and container.</p>
|
||
</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="learning-new-technologies">Learning New Technologies<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#learning-new-technologies" class="hash-link" aria-label="Direct link to Learning New Technologies" title="Direct link to Learning New Technologies"></a></h3>
|
||
<ul>
|
||
<li>
|
||
<p><strong>Prompt</strong>: "I want to try this new framework without installing dependencies on my main system."</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Result</strong>: Experiment in a pre-configured container with all the tools you need. Learn at your own pace without cluttering your host system or worrying about version conflicts.</p>
|
||
</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="split-testing-features">Split Testing Features<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#split-testing-features" class="hash-link" aria-label="Direct link to Split Testing Features" title="Direct link to Split Testing Features"></a></h3>
|
||
<ul>
|
||
<li>
|
||
<p><strong>Prompt</strong>: "I want to test two different approaches to this feature - one using a REST API and another with GraphQL. Can you run both experiments simultaneously?"</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Result</strong>: Goose spins up two isolated environments, each with its own git branch and container. One agent works on the REST implementation while another tackles GraphQL, both running in parallel without interfering with each other or your main codebase. Compare results and merge the winner.</p>
|
||
</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="guide">Guide<a href="https://block.github.io/goose/blog/2025/06/19/isolated-development-environments#guide" class="hash-link" aria-label="Direct link to Guide" title="Direct link to Guide"></a></h2>
|
||
<p><strong><a href="https://block.github.io/goose/docs/tutorials/isolated-development-environments">Get started with the full guide →</a></strong></p>
|
||
<hr>
|
||
<p><em>Questions? Join our <a href="https://github.com/block/goose" target="_blank" rel="noopener noreferrer">GitHub discussions</a> or <a href="https://discord.gg/block-opensource" target="_blank" rel="noopener noreferrer">Discord</a>. Learn more about Dagger at <a href="https://dagger.io/" target="_blank" rel="noopener noreferrer">dagger.io</a>.</em></p>
|
||
<!-- -->
|
||
<div style="width:100%;max-width:800px;margin:0 auto"><iframe width="560" height="315" src="https://www.youtube.com/embed/pGce9T4E5Yw?si=1D3Aoa6oiFgJ0E5w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></div>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Why I Used Goose to Build a Chaotic Emotion Detection App]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app</link>
|
||
<guid>https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app</guid>
|
||
<pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[The joys of experimenting with computer vision using Goose, an MCP host]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/emotion-powered-ui-83b0e779f22a3a060eef7bb29e04090d.png" width="2240" height="1260" class="img_ev3q"></p>
|
||
<p>Developers deserve to have fun. There was a time when the internet felt magical. I remember going to the library just to create a character on The Doll Palace. At home, I'd spend hours changing fonts with WordArt. But as I grew up, the industry did too. We've shifted away from marquees and glittery cursors. Grown-up me started using ones and zeros to build reliable systems for insurance, banking, and healthcare companies. There's pride in that, but it's harder to justify doing something just because it's fun.</p>
|
||
<p>That's why I tapped into my inner child and used <a href="https://block.github.io/goose/">Goose</a> to <a href="https://chaotic-emotion-detector-production.up.railway.app/" target="_blank" rel="noopener noreferrer">build a UI that reacts to users' emotions</a>.</p>
|
||
<p>Sometimes I want to write every line of code. Other times, I just want a quick dopamine hit from seeing my idea go from vision to execution in minutes. Other developers may relate to this feeling, and it's partly why AI agents and vibe coding have become so popular. They've rekindled that sense of playful experimentation that motivates our minds to solve problems more creatively.</p>
|
||
<p>In an <a href="https://www.oreilly.com/radar/takeaways-from-coding-with-ai/" target="_blank" rel="noopener noreferrer">article</a> by Tim O’Reilly on AI-assisted coding, Kent Beck and Nikola Balic share their enthusiasm:</p>
|
||
<blockquote>
|
||
<p>"This is the most fun I've ever had." - Beck</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>"It brought back the joy of programming." - Balic</p>
|
||
</blockquote>
|
||
<p>Playing with code and experimenting with technology motivates our minds to solve problems more creatively.</p>
|
||
<p>To celebrate the return of joyful programming, I started a livestream series called <a href="https://www.youtube.com/watch?v=wS5-4hXcnL4&list=PLyMFt_U2IX4v-yCUa11zgRGDgJbUUWKan" target="_blank" rel="noopener noreferrer"><strong>The Great Goose Off</strong></a>, where two people compete to prompt Goose, an open source AI agent, to create the silliest, most chaotic apps possible.</p>
|
||
<p>Participants face challenges like building:</p>
|
||
<ul>
|
||
<li>A login form you can't log into</li>
|
||
<li>Error messages that are sassy</li>
|
||
<li>Buttons that run away from your cursor</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="my-strategy">My Strategy<a href="https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app#my-strategy" class="hash-link" aria-label="Direct link to My Strategy" title="Direct link to My Strategy"></a></h2>
|
||
<p>Hosting The Great Goose Off gave me a new perspective on Goose. It is good at writing code, but it is even better at being silly. That inspired me to build a computer vision app that not only detects emotion but responds to it. I used Goose as my creative partner to shape how the interface would behave.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="let-the-agent-lead">Let the Agent Lead<a href="https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app#let-the-agent-lead" class="hash-link" aria-label="Direct link to Let the Agent Lead" title="Direct link to Let the Agent Lead"></a></h3>
|
||
<p>I observed that participants (of The Great Goose Off) who were not engineers often created the most imaginative applications. They gave Goose room to interpret prompts without narrowing its scope too early. This resulted in outputs that felt fresh and unpredictable. I took a similar approach. I gave high-level instructions and allowed the agent to explore how to implement them.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="choosing-a-performant-model">Choosing a Performant Model<a href="https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app#choosing-a-performant-model" class="hash-link" aria-label="Direct link to Choosing a Performant Model" title="Direct link to Choosing a Performant Model"></a></h3>
|
||
<p>As my manager Angie Jones says, Claude Sonnet 4 was “born to code.” I chose it because it helps Goose pivot quickly when something breaks. It’s also great at documenting code and anticipating next steps. That came in handy when the face-api CDN failed to load. Goose immediately switched to downloading the models locally instead.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="prompt-chaining">Prompt Chaining<a href="https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app#prompt-chaining" class="hash-link" aria-label="Direct link to Prompt Chaining" title="Direct link to Prompt Chaining"></a></h3>
|
||
<p>Instead of trying to build everything in one huge prompt like "Create a face detection app that uses webcam input to detect emotions and makes the UI react chaotically with color changes, screen shakes, and spinning elements," I broke the complex task down into smaller, sequential subtasks:</p>
|
||
<ul>
|
||
<li><strong>First prompt</strong>: "Create a webcam application in JavaScript"</li>
|
||
<li><strong>Second prompt</strong>: "Enable a face detection mode using face-api.js"</li>
|
||
<li><strong>Third prompt</strong>: "Enable an emotion detection mode"</li>
|
||
<li><strong>Fourth prompt</strong>: "Can we add a 'Chaotic Mode' toggle to the app? When enabled, the UI should react in silly ways when an emotion is detected from the webcam. Some fun ideas for chaotic reactions (based on emotion changes):<!-- -->
|
||
<ul>
|
||
<li>Change the background color</li>
|
||
<li>Randomly reposition or rotate buttons</li>
|
||
<li>Add screen shake or CSS filters (like invert or hue-rotate)</li>
|
||
<li>Trigger emoji overlays"</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="version-control">Version Control<a href="https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app#version-control" class="hash-link" aria-label="Direct link to Version Control" title="Direct link to Version Control"></a></h3>
|
||
<p>After each step, I committed changes to GitHub to enable easy rollbacks if needed. This iterative approach allowed me to test functionality incrementally and refine the application's behavior.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-result">The Result<a href="https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app#the-result" class="hash-link" aria-label="Direct link to The Result" title="Direct link to The Result"></a></h2>
|
||
<p>In the end, Goose and I built a delightfully chaotic application where the interface responds to my facial expressions. For example:</p>
|
||
<ul>
|
||
<li>If I make an angry face, the screen turns red and starts to shake</li>
|
||
<li>If I smile, multiple colorful hues appear across the interface</li>
|
||
<li>If I look disgusted, the entire layout spins around</li>
|
||
</ul>
|
||
<!-- -->
|
||
<div style="width:100%;max-width:800px;margin:0 auto"><iframe width="560" height="315" src="https://www.youtube.com/embed/ieniCTqbnV0?autoplay=1&mute=1&loop=1&playlist=ieniCTqbnV0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="its-okay-to-have-fun">It’s Okay to Have Fun<a href="https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app#its-okay-to-have-fun" class="hash-link" aria-label="Direct link to It’s Okay to Have Fun" title="Direct link to It’s Okay to Have Fun"></a></h2>
|
||
<p>It's okay to not build for utility sometimes. In fact, our industry needs more delightful chaos. I believe that maintaining a sense of wonder and fun keeps us passionate about what we do.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it-out">Try it Out<a href="https://block.github.io/goose/blog/2025/06/17/goose-emotion-detection-app#try-it-out" class="hash-link" aria-label="Direct link to Try it Out" title="Direct link to Try it Out"></a></h2>
|
||
<ul>
|
||
<li>Use the <a href="https://chaotic-emotion-detector-production.up.railway.app/" target="_blank" rel="noopener noreferrer">app</a></li>
|
||
<li>Fork the <a href="https://github.com/blackgirlbytes/chaotic-emotion-detector" target="_blank" rel="noopener noreferrer">GitHub Repository</a></li>
|
||
<li>Use the <a href="goose://recipe?config=eyJpZCI6InVudGl0bGVkIiwibmFtZSI6IlVudGl0bGVkIFJlY2lwZSIsImRlc2NyaXB0aW9uIjoiTWFrZSB5b3VyIFVJIHJlYWN0IHRvIHlvdXIgZW1vdGlvbnMiLCJpbnN0cnVjdGlvbnMiOiJJIGhlbHAgYnVpbGQgaW50ZXJhY3RpdmUgd2ViIGFwcGxpY2F0aW9ucyB1c2luZyB2YW5pbGxhIEphdmFTY3JpcHQsIEhUTUwsIGFuZCBDU1MuIEkgY3JlYXRlIGNvbXBsZXRlLCBmdW5jdGlvbmFsIGFwcGxpY2F0aW9ucyB3aXRoIG1vZGVybiBVSSBkZXNpZ24sIHJlYWwtdGltZSBmZWF0dXJlcywgYW5kIGVuZ2FnaW5nIHVzZXIgaW50ZXJhY3Rpb25zLiBXaGVuIGJ1aWxkaW5nIHdlYmNhbSBvciBjYW1lcmEtYmFzZWQgYXBwbGljYXRpb25zLCBJIGludGVncmF0ZSBhZHZhbmNlZCBmZWF0dXJlcyBsaWtlIGZhY2UgZGV0ZWN0aW9uIHVzaW5nIEZhY2UtQVBJLmpzIGxpYnJhcnksIGVtb3Rpb24gcmVjb2duaXRpb24sIGFuZCBjcmVhdGl2ZSBVSSByZXNwb25zZXMuIEkgcHJvdmlkZSBhbGwgbmVjZXNzYXJ5IGZpbGVzIGluY2x1ZGluZyBIVE1MIHN0cnVjdHVyZSwgQ1NTIHN0eWxpbmcsIEphdmFTY3JpcHQgZnVuY3Rpb25hbGl0eSwgYW5kIGEgc2ltcGxlIE5vZGUuanMgc2VydmVyLiBJIGFsc28gZG93bmxvYWQgYW5kIHNlcnZlIHJlcXVpcmVkIG1vZGVsIGZpbGVzIGxvY2FsbHkgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuIFRoZSBhcHBsaWNhdGlvbnMgYXJlIGRlc2lnbmVkIHRvIGJlIHByaXZhY3ktZm9jdXNlZCB3aXRoIGxvY2FsIHN0b3JhZ2UgYW5kIHByb2Nlc3NpbmcuIiwiYWN0aXZpdGllcyI6WyJCdWlsZCB3ZWJjYW0gYXBwcyIsIkFkZCBmYWNlIGRldGVjdGlvbiIsIkNyZWF0ZSBlbW90aW9uIHJlY29nbml0aW9uIiwiRGVzaWduIGNoYW90aWMgVUkgZWZmZWN0cyIsIkltcGxlbWVudCBsb2NhbCBmaWxlIHNlcnZlcnMiXSwicHJvbXB0IjoiIiwidGl0bGUiOiJDaGFvdGljIEVtb3Rpb24gRGV0ZWN0b3IiLCJleHRlbnNpb25zIjpbXX0=" target="_blank" rel="noopener noreferrer">recipe</a> to build your own. Please note, that you must install <a href="https://block.github.io/goose/docs/getting-started/installation">Goose</a> to use the recipe.</li>
|
||
</ul>
|
||
<p>Happy experimenting!</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Treating LLMs Like Tools in a Toolbox: A Multi-Model Approach to Smarter AI Agents]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/06/16/multi-model-in-goose</link>
|
||
<guid>https://block.github.io/goose/blog/2025/06/16/multi-model-in-goose</guid>
|
||
<pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[How Goose uses multiple LLMs within a single task, optimizing for speed, cost, and reliability in AI agent workflows]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/multi-model-ai-agent-d408feaeba3e13cafdbfe9377980bc3d.png" width="1200" height="630" class="img_ev3q"></p>
|
||
<p>Not every task needs a genius. And not every step should cost a fortune.</p>
|
||
<p>That's something we've learned while scaling Goose, our open source AI agent. The same model that's great at unpacking a planning request might totally fumble a basic shell command, or worse - it might burn through your token budget doing it.</p>
|
||
<p>So we asked ourselves: what if we could mix and match models in a single session?</p>
|
||
<p>Not just switching based on user commands, but building Goose with an actual system for routing tasks between different models, each playing to their strengths.</p>
|
||
<p>This is the gap the lead/worker model is designed to fill.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-problem-with-single-model-sessions">The Problem with Single-Model Sessions<a href="https://block.github.io/goose/blog/2025/06/16/multi-model-in-goose#the-problem-with-single-model-sessions" class="hash-link" aria-label="Direct link to The Problem with Single-Model Sessions" title="Direct link to The Problem with Single-Model Sessions"></a></h2>
|
||
<p>Originally, every Goose session used a single model from start to finish. That worked fine for short tasks, but longer sessions were harder to tune:</p>
|
||
<ul>
|
||
<li>Go too cheap, and the model might miss nuance or break tools.</li>
|
||
<li>Go too premium, and your cost graph starts looking like a ski slope.</li>
|
||
</ul>
|
||
<p>There was no built-in way to adapt on the fly.</p>
|
||
<p>We saw this tension in real usage where agents would start strong, then stall out when the model struggled to follow through. Sometimes users would manually switch models mid-session. But that's not scalable, and definitely not agent like.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="designing-the-leadworker-system">Designing the Lead/Worker System<a href="https://block.github.io/goose/blog/2025/06/16/multi-model-in-goose#designing-the-leadworker-system" class="hash-link" aria-label="Direct link to Designing the Lead/Worker System" title="Direct link to Designing the Lead/Worker System"></a></h2>
|
||
<p>The core idea is simple:</p>
|
||
<ul>
|
||
<li>Start the session with a lead model that's strong at reasoning and planning.</li>
|
||
<li>After a few back and forths between you and the model (what we call "turns"), hand off to a worker model that's faster and cheaper, but still capable.</li>
|
||
<li>If the worker gets stuck, Goose can detect the failure and temporarily bring the lead back in.</li>
|
||
</ul>
|
||
<p>You can configure how many turns the lead handles upfront (<code>GOOSE_LEAD_TURNS</code>), how many consecutive failures trigger fallback (<code>GOOSE_LEAD_FAILURE_THRESHOLD</code>), and how long the fallback lasts before Goose retries the worker.</p>
|
||
<p>This gives you a flexible, resilient setup where each model gets used where it shines.</p>
|
||
<p>One of the trickiest parts of this feature was defining what failure looks like.</p>
|
||
<p>We didn't want Goose to swap models just because an API timed out. Instead, we focused on real task failures:</p>
|
||
<ul>
|
||
<li>Tool execution errors</li>
|
||
<li>Syntax mistakes in generated code</li>
|
||
<li>File not found or permission errors</li>
|
||
<li>User corrections like "that's wrong" or "try again"</li>
|
||
</ul>
|
||
<p>Goose tracks these signals and knows when to escalate. And once the fallback model stabilizes things, it switches back without missing a beat.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-value-of-multi-model-design">The Value of Multi-Model Design<a href="https://block.github.io/goose/blog/2025/06/16/multi-model-in-goose#the-value-of-multi-model-design" class="hash-link" aria-label="Direct link to The Value of Multi-Model Design" title="Direct link to The Value of Multi-Model Design"></a></h2>
|
||
<p>Cost savings are a nice side effect, but the real value is in how this shifts the mental model: treating AI models like tools in a toolbox, each with its own role to play. Some are built for strategy. Some are built for speed. The more your agent can switch between them intelligently, the closer it gets to feeling like a true collaborator.</p>
|
||
<p>We've found that this multi-model design unlocks new workflows:</p>
|
||
<ul>
|
||
<li><strong>Long dev sessions</strong> where planning and execution ebb and flow</li>
|
||
<li><strong>Cross-provider setups</strong> (Claude for planning, OpenAI for execution)</li>
|
||
<li><strong>Lower-friction defaults</strong> for teams worried about LLM spend</li>
|
||
</ul>
|
||
<p>It also opens the door for even smarter routing in the future with things like switching based on tasks, ensemble voting, or maybe even letting Goose decide which model to call based on tool context.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it-out">Try It Out<a href="https://block.github.io/goose/blog/2025/06/16/multi-model-in-goose#try-it-out" class="hash-link" aria-label="Direct link to Try It Out" title="Direct link to Try It Out"></a></h2>
|
||
<p>Lead/worker mode is already available in Goose. To enable, export these variables with two models that have already been configured in Goose:</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export GOOSE_LEAD_MODEL="gpt-4o"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export GOOSE_MODEL="claude-4-sonnet"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>From there, Goose takes care of the hand off, the fallback, and the recovery. You just... keep vibing.</p>
|
||
<p>If you're curious how it all works under the hood, we've got a <a href="https://block.github.io/goose/docs/tutorials/lead-worker">full tutorial</a>.</p>
|
||
<hr>
|
||
<p>If you're experimenting with multi-model setups, <a href="https://discord.gg/block-opensource" target="_blank" rel="noopener noreferrer">share what's working and what isn't</a>.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Democratizing Detection Engineering at Block: Taking Flight with Goose and Panther MCP]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp</link>
|
||
<guid>https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp</guid>
|
||
<pubDate>Mon, 02 Jun 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[A comprehensive overview of how Block leverages Goose and Panther MCP to democratize and accelerate security detection engineering.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/goose-panther-header-25b5891acdd70e6a7bbe6b84e34f08f0.png" width="1534" height="879" class="img_ev3q"></p>
|
||
<p>Detection engineering stands at the forefront of cybersecurity, yet it’s often a tangled web of complexity. Traditional detection writing involves painstaking manual processes encompassing log format and schema comprehension, intricate query creation, threat modeling, and iterative manual detection testing and refinement, leading to time expenditure and reliance on specialized expertise. This can lead to gaps in threat coverage and an overwhelming number of alerts. At Block, we face the relentless challenge of evolving threats and intricate system complexities. To stay ahead, we've embraced AI-driven solutions, notably Goose, Block’s open-source AI agent, and Panther MCP, to allow the broader organization to contribute high-quality rules that are contextual to their area of expertise. This post delves into how we're transforming complicated detection workflows into streamlined, AI-powered, accessible processes for all stakeholders.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-detection-engineering-challenge">The Detection Engineering Challenge<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#the-detection-engineering-challenge" class="hash-link" aria-label="Direct link to The Detection Engineering Challenge" title="Direct link to The Detection Engineering Challenge"></a></h2>
|
||
<p>Historically, creating effective detections has been a niche skill, requiring deep technical knowledge and coding proficiency. This has created significant obstacles such as:</p>
|
||
<ul>
|
||
<li><strong>Steep Learning Curve:</strong> Crafting detections typically requires extensive technical expertise, often limiting participation.</li>
|
||
<li><strong>Resources Constraints:</strong> Even expert security teams often struggle with bandwidth, hindering their ability to develop and deploy new detections quickly.</li>
|
||
<li><strong>Evolving Threat Landscape:</strong> Advanced threats, particularly those from sophisticated nation-states actors, continuously evolve, outpacing traditional detection development processes.</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="vision">Vision<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#vision" class="hash-link" aria-label="Direct link to Vision" title="Direct link to Vision"></a></h2>
|
||
<p>We envision a future where anyone at Block can effortlessly create and deploy security detections, revolutionizing our defenses through intelligent automation and empowering a democratized security posture.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introducing-panther-mcp">Introducing Panther MCP<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#introducing-panther-mcp" class="hash-link" aria-label="Direct link to Introducing Panther MCP" title="Direct link to Introducing Panther MCP"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-panther-mcp">What is Panther MCP?<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#what-is-panther-mcp" class="hash-link" aria-label="Direct link to What is Panther MCP?" title="Direct link to What is Panther MCP?"></a></h3>
|
||
<p><a href="https://github.com/panther-labs/mcp-panther" target="_blank" rel="noopener noreferrer">Panther MCP</a> is an open-source model context protocol server born from the collaboration between <a href="https://panther.com/" target="_blank" rel="noopener noreferrer">Panther</a> and Block to democratize security operations workflows. By tightly integrating with Goose as an extension, Panther MCP allows security teams at Block to translate natural language instructions into precise, executable SIEM detection logic, making threat detection contributions easier and faster than ever.</p>
|
||
<p>This integration empowers analysts and engineers across Block to interact with Panther’s security analytics platform seamlessly. It shifts detection development from a coding-heavy process into an intuitive workflow accessible to everyone, regardless of technical background. Goose serves as an intermediary agent, coordinating calls to Panther MCP, reviewing the output, creating rule content, testing it, and making necessary edits for correctness or style. This AI-driven feedback loop saves countless hours of time.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="key-features">Key Features<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#key-features" class="hash-link" aria-label="Direct link to Key Features" title="Direct link to Key Features"></a></h3>
|
||
<p>Panther MCP offers dozens of tools that enhance and accelerate detection engineering workflows powered by Goose:</p>
|
||
<ol>
|
||
<li><strong>Natural Language to Detection Logic</strong><br>
|
||
<!-- -->Engineers define detections using plain English prompts, which Panther MCP translates directly into Panther-compatible detection rules that can be checked into their <a href="https://github.com/panther-labs/panther-analysis" target="_blank" rel="noopener noreferrer">panther-analysis</a> repository.</li>
|
||
<li><strong>Interactive Data Exploration and Usage</strong><br>
|
||
<!-- -->Engineers can rapidly explore log sources and perform searches on data and previously generated alerts through quick, natural-language driven interactions.</li>
|
||
<li><strong>Unified Alert Triage and Response</strong><br>
|
||
<!-- -->Enables AI-led alert triage with insights drawn from historical data and existing detections.</li>
|
||
</ol>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="accelerating-detection-creation-with-goose">Accelerating Detection Creation with Goose<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#accelerating-detection-creation-with-goose" class="hash-link" aria-label="Direct link to Accelerating Detection Creation with Goose" title="Direct link to Accelerating Detection Creation with Goose"></a></h2>
|
||
<p>Goose significantly accelerates security detection creation by using AI to automate traditionally manual tasks like log analysis and rule generation. This drastically reduces effort, improves the speed of developing and deploying threat coverage, and enhances agility against evolving threats.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="integrating-panther-mcp-as-a-goose-extension">Integrating Panther MCP as a Goose Extension<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#integrating-panther-mcp-as-a-goose-extension" class="hash-link" aria-label="Direct link to Integrating Panther MCP as a Goose Extension" title="Direct link to Integrating Panther MCP as a Goose Extension"></a></h3>
|
||
<p>Panther MCP functions as a Goose extension, seamlessly embedding its capabilities within the Goose environment through the following process:</p>
|
||
<ol>
|
||
<li><strong>Extension Registration:</strong> Panther MCP is registered within Goose, making its suite of tools readily accessible via the Goose interface.</li>
|
||
<li><strong>API Connectivity:</strong> The extension establishes a connection to Panther's backend API, enabling seamless context retrieval.</li>
|
||
<li><strong>Available Tools:</strong> Panther MCP provides Goose with a range of tools designed for efficient detection creation, intuitive data interaction, and streamlined alert management.</li>
|
||
</ol>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="leveraging-enhanced-context-with-goosehints">Leveraging Enhanced Context with <code>.goosehints</code><a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#leveraging-enhanced-context-with-goosehints" class="hash-link" aria-label="Direct link to leveraging-enhanced-context-with-goosehints" title="Direct link to leveraging-enhanced-context-with-goosehints"></a></h3>
|
||
<p>The integration between Panther MCP and Goose is enhanced through the use of the <a href="https://block.github.io/goose/docs/guides/using-goosehints/" target="_blank" rel="noopener noreferrer">.goosehints</a> file—a Goose feature that supplies additional context like rule examples and best practices. This enriched context enables Goose to generate more accurate and efficient detections, aligned with Block’s standards and requirements.</p>
|
||
<p>Let's illustrate this with an example: creating a rule to detect users adding themselves to privileged Okta groups, a common privilege escalation technique.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-down-the-barriers">Breaking Down the Barriers<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#breaking-down-the-barriers" class="hash-link" aria-label="Direct link to Breaking Down the Barriers" title="Direct link to Breaking Down the Barriers"></a></h2>
|
||
<p>Traditionally, creating this detection would require:</p>
|
||
<ol>
|
||
<li>Deep knowledge of Okta and its log structure</li>
|
||
<li>Understanding of Panther’s detection framework</li>
|
||
<li>Python programming skills</li>
|
||
<li>Familiarity with different testing frameworks</li>
|
||
</ol>
|
||
<p>With Goose and Panther MCP, this becomes as simple as:</p>
|
||
<blockquote>
|
||
<p>“Write a detection rule for users adding themselves to privileged Okta groups.”</p>
|
||
</blockquote>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-intelligence-behind-the-simplicity">The Intelligence Behind the Simplicity<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#the-intelligence-behind-the-simplicity" class="hash-link" aria-label="Direct link to The Intelligence Behind the Simplicity" title="Direct link to The Intelligence Behind the Simplicity"></a></h2>
|
||
<p>When a natural language request like "Write a detection rule for users adding themselves to privileged Okta groups" is received, Goose leverages a sophisticated, multi-stage process powered by Panther MCP to generate production-ready detection logic. This automated approach mirrors the workflow of an experienced detection engineer, encompassing threat research, relevant log identification, detection goal definition, logic outlining, sample log analysis, rule development, false positive consideration, severity/context assignment, thorough testing, refinement/optimization, and documentation. However, Goose executes these steps with the speed and scalability afforded by AI and automation.</p>
|
||
<p>Goose first parses the natural language input to understand the core intent and requirements. It identifies key entities like "users", "privileged Okta groups", and the action "adding themselves". This understanding forms the basis for outlining the detection's objective, the necessary log source (<code>Okta.SystemLog</code>), and the fundamental logic: identifying events where the actor (user initiating the action) is the same as the target user (the user being added to the group), and the group being joined is designated as privileged. Goose also considers potential false positives (e.g., legitimate automated processes) and assigns a preliminary severity level based on the potential impact of the detected activity (privilege escalation).</p>
|
||
<p><img decoding="async" loading="lazy" alt="Process overview diagram" src="https://block.github.io/goose/assets/images/process-overview-diagram-11aa53158f5a0484351b12fe602dae1b.png" width="1443" height="289" class="img_ev3q"></p>
|
||
<p>To ensure the generated logic is accurate and operates on valid data, Goose interacts with Panther MCP to retrieve the schema of the specified log source (<code>Okta.SystemLog</code>). This provides Goose with a structured understanding of the available fields and their data types within Okta logs. Furthermore, Goose utilizes Panther MCP's querying capabilities to fetch sample log events related to group membership changes. This step is crucial for:</p>
|
||
<ul>
|
||
<li><strong>Identifying Common Event Patterns:</strong> Analyzing real-world logs allows Goose to understand the typical structure and values associated with relevant events (e.g., <code>group.user_membership.add</code>).</li>
|
||
<li><strong>Inferring Privileged Group Naming Conventions:</strong> By examining historical data, Goose can identify patterns and keywords commonly used in the naming of privileged groups within the organization's Okta instance (e.g., "admin", "administrator", "security-admin").</li>
|
||
<li><strong>Discovering Edge Cases:</strong> Examining diverse log samples helps uncover potential variations in event data or less common scenarios that the detection logic needs to accommodate.</li>
|
||
<li><strong>Mapping Typical User Behavior:</strong> Understanding baseline user behavior around group membership changes helps refine the detection logic and reduce the likelihood of false positives.</li>
|
||
</ul>
|
||
<p>The interaction with Panther MCP at this stage involves API calls to retrieve schema information and execute analytical queries, enabling Goose to ground its reasoning in actual log data.</p>
|
||
<p><img decoding="async" loading="lazy" alt="Goose interacts with Panther MCP" src="https://block.github.io/goose/assets/images/goose-panther-mcp-interaction-ae32c310d436afad5c67ae632649c0c3.png" width="1448" height="426" class="img_ev3q"></p>
|
||
<p>Goose doesn't operate in isolation; it accesses a repository of existing Panther detection rules to identify similar logic or reusable components. This promotes consistency across the detection landscape, encourages the reuse of well-tested helper functions (like <code>okta_alert_context</code>), and ensures adherence to established rule standards within our security ecosystem. Learning from existing detections is a core component of Goose’s intelligence, allowing it to build upon prior knowledge and avoid reinventing the wheel.</p>
|
||
<p><img decoding="async" loading="lazy" alt="Rule context reuse" src="https://block.github.io/goose/assets/images/context-reuse-example-8a77763351f738734fe87068dabfba87.png" width="1451" height="184" class="img_ev3q"></p>
|
||
<p>Based on the understanding of the detection goal, the analysis of log data, and the knowledge gleaned from existing detections facilitated by Panther MCP, Goose generates the complete Panther detection rule in Python. This includes:</p>
|
||
<ul>
|
||
<li><strong>Rule Function (<code>rule()</code>):</strong> This function contains the core logic for evaluating each log event. In the example, it checks for the <code>group.user_membership.add</code> event type, verifies that the actor and target user IDs (or emails) are the same, and confirms that the target group's display name contains keywords indicative of a privileged group (defined in the <code>PRIVILEGED_GROUPS</code> set).</li>
|
||
<li><strong>Metadata Functions (<code>title()</code>, <code>alert_context()</code>, <code>severity()</code>, <code>destinations()</code>):</strong> These functions provide crucial context and operational information for triggered alerts.</li>
|
||
</ul>
|
||
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> panther_okta_helpers </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> okta_alert_context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Define privileged Okta groups - customize this list based on your organization's needs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PRIVILEGED_GROUPS </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"_group_admin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Administrator roles</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"admin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"administrator"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application-admin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws_"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># AWS roles can be privileged</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cicd_corp_system"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># CI/CD admin access </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"grc-okta"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"okta-administrators"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"okta_admin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"okta_admin_svc_accounts"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Admin roles</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"okta_resource-set_"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Resource sets are typically privileged</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"security-admin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superadministrators"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rule</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:#e3116c">"""Determine if a user added themselves to a privileged group"""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Only focus on group membership addition events</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"eventType"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"group.user_membership.add"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Ensure both actor and target exist in the event</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> actor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"actor"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> targets </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"target"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> actor </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34"><</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> actor_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> actor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"alternateId"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> actor_user_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> actor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Extract target user and group</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> target_user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> target_group </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">></span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># The first target should be a user and the second should be a group</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> target_user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"type"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"User"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> target_group</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"type"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UserGroup"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> target_user_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> target_user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> target_user_email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> target_user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"alternateId"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> group_name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> target_group</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"displayName"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Check if the actor added themselves to the group</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> is_self_add </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">actor_user_id </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> target_user_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">actor_id </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> target_user_email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Check if the group is privileged</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> is_privileged_group </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">any</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">priv_group </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> group_name </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> priv_group </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> PRIVILEGED_GROUPS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> is_self_add </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> is_privileged_group</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">title</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:#e3116c">"""Generate a descriptive title for the alert"""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> actor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"actor"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> targets </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"target"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> actor_name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> actor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"displayName"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Unknown User"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> actor_email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> actor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"alternateId"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"unknown@example.com"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> target_group </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">></span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> group_name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> target_group</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"displayName"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Unknown Group"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"User [</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">actor_name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> (</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">actor_email</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">)] added themselves "</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f"to privileged Okta group [</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">group_name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">]"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">alert_context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:#e3116c">"""Return additional context for the alert"""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> okta_alert_context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Add specific information about the privileged group</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> targets </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"target"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">></span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> target_group </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"privileged_group"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> target_group</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> target_group</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"displayName"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">severity</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:#e3116c">"""Calculate severity based on group name - more sensitive groups get higher severity"""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> targets </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"target"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34"><=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Medium"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> target_group </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> group_name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> target_group</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"displayName"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Higher severity for direct admin groups</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">any</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> group_name </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"admin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"administrator"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superadministrators"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Critical"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"High"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">destinations</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:#e3116c">"""Send to staging destination for review"""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"staging_destination"</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>Beyond the Python code, Goose also generates the corresponding YAML-based rule configuration file. This file contains essential metadata about the detection:</p>
|
||
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">AnalysisType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Detects when a user adds themselves to a privileged Okta group</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> which could indicate privilege escalation attempts or unauthorized access.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">DisplayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Users Adding Themselves to Privileged Okta Groups"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">DedupPeriodMinutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">LogTypes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Okta.SystemLog</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">RuleID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"goose.Okta.Self.Privileged.Group.Add"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Threshold</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Filename</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> goose_okta_self_privileged_group_add.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Reference</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">></span><span class="token scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> https://developer.okta.com/docs/reference/api/system-log/</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> https://attack.mitre.org/techniques/T1078/004/</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> https://attack.mitre.org/techniques/T1484/001/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Runbook</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">></span><span class="token scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> 1. Verify if the user should have access to the privileged group they added themselves to</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> 2. If unauthorized, revoke the group membership immediately</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> 3. Check for other group membership changes made by the same user</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> 4. Review the authentication context and security context for suspicious indicators</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> 5. Interview the user to determine intent</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Reports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">MITRE ATT&CK</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> TA0004</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">T1078.004 </span><span class="token comment" style="color:#999988;font-style:italic"># Privileged Accounts: Cloud Accounts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> TA0004</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">T1484.001 </span><span class="token comment" style="color:#999988;font-style:italic"># Domain Policy Modification: Group Policy Modification</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Severity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> High</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> author</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">tomasz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> coauthor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">goose</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Tests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> User adds themselves to privileged group</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ExpectedResult</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Log</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">actor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">alternateId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jane.doe@company.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Jane Doe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 00u1234abcd5678</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">authenticationContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">authenticationStep</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">externalSessionId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xyz1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">device</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Computer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">geographicalContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">city</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> San Francisco</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">country</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> United States</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">geolocation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">37.7749</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lon</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-122.4194</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">postalCode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"94105"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> California</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ipAddress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 192.168.1.100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">userAgent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">browser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CHROME</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">os</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Mac OS X</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">rawUserAgent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> like Gecko) Chrome/108.0.0.0 Safari/537.36</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">zone</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"null"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">debugContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">debugData</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">requestId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> req123456</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">requestUri</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /api/v1/groups/00g123456/users/00u1234abcd5678</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /api/v1/groups/00g123456/users/00u1234abcd5678</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">displayMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add user to group membership</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">eventType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> group.user_membership.add</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">legacyEventType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> group.user_membership.add</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">outcome</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">result</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> SUCCESS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">published</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-07-15 14:25:30.811"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">request</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ipChain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">geographicalContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">city</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> San Francisco</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">country</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> United States</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">geolocation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">37.7749</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lon</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-122.4194</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">postalCode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"94105"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> California</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ip</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 192.168.1.100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> V4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">securityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">asNumber</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">12345</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">asOrg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Example ISP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">domain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> example.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">isProxy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">isp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Example ISP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">severity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> INFO</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">alternateId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jane.doe@company.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Jane Doe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 00u1234abcd5678</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">alternateId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unknown</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> okta_admin_person_role_super_admin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 00g5678abcd1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> UserGroup</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">transaction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">detail</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> transaction123</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> WEB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">uuid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">123</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">p_event_time</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-07-15 14:25:30.811"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">p_parse_time</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-07-15 14:26:00.000"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">p_log_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Okta.SystemLog"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> User adds another user to privileged group</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ExpectedResult</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Log</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">actor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">alternateId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> admin@company.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Admin User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 00u5678abcd1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">authenticationContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">authenticationStep</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">externalSessionId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xyz5678</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">device</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Computer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">geographicalContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">city</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> San Francisco</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">country</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> United States</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">geolocation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">37.7749</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lon</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-122.4194</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">postalCode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"94105"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> California</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ipAddress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 192.168.1.100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">userAgent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">browser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CHROME</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">os</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Mac OS X</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">rawUserAgent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> like Gecko) Chrome/108.0.0.0 Safari/537.36</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">zone</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"null"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">debugContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">debugData</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">requestId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> req789012</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">requestUri</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /api/v1/groups/00g123456/users/00u9876fedc4321</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /api/v1/groups/00g123456/users/00u9876fedc4321</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">displayMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add user to group membership</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">eventType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> group.user_membership.add</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">legacyEventType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> group.user_membership.add</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">outcome</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">result</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> SUCCESS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">published</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-07-15 14:30:45.123"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">request</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ipChain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">geographicalContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">city</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> San Francisco</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">country</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> United States</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">geolocation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">37.7749</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lon</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-122.4194</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">postalCode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"94105"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> California</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ip</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 192.168.1.100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> V4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">securityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">asNumber</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">12345</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">asOrg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Example ISP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">domain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> example.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">isProxy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">isp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Example ISP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">severity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> INFO</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">alternateId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> user@company.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Regular User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 00u9876fedc4321</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">alternateId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unknown</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> okta_admin_person_role_super_admin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 00g5678abcd1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> UserGroup</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">transaction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">detail</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> transaction456</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> WEB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">uuid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">456</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">p_event_time</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-07-15 14:30:45.123"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">p_parse_time</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-07-15 14:31:00.000"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">p_log_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Okta.SystemLog"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>Every detection rule generated by Goose undergoes rigorous automated testing and validation. This includes:</p>
|
||
<ul>
|
||
<li><strong>Unit Testing:</strong> Using the test cases defined in the rule configuration, the Panther Analysis Tool is executed to verify that the rule logic correctly identifies true positives and avoids false negatives against simulated log data.</li>
|
||
<li><strong>Linting:</strong> Code linting tools (like Pylint) are automatically run to ensure the generated Python code adheres to established coding standards, including proper formatting, style conventions, and best practices. This contributes to code maintainability and reduces the risk of errors.</li>
|
||
</ul>
|
||
<p><img decoding="async" loading="lazy" alt="Automated testing graphic" src="https://block.github.io/goose/assets/images/automated-testing-graphic-aafa22b18427c32d851c98a1a32a5d8a.png" width="1158" height="1316" class="img_ev3q">
|
||
<img decoding="async" loading="lazy" alt="Process improvement chart" src="https://block.github.io/goose/assets/images/process-improvement-chart-eea292cb14dd3519f36cada6314ea694.png" width="1155" height="262" class="img_ev3q"></p>
|
||
<p>The seamless integration of Goose with Panther MCP automates these intricate steps, significantly reducing the time and specialized knowledge required to create and deploy security detections. This democratization empowers more individuals to contribute to Block's security posture, leading to more comprehensive threat coverage and a more resilient security environment.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="democratization-in-practice">Democratization in Practice<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#democratization-in-practice" class="hash-link" aria-label="Direct link to Democratization in Practice" title="Direct link to Democratization in Practice"></a></h2>
|
||
<p>A typical detection creation workflow now looks like:</p>
|
||
<ol>
|
||
<li><strong>Proposal:</strong> A user describes a malicious behavior in natural language.</li>
|
||
<li><strong>Generation:</strong> Goose transforms this description into detection logic with Panther MCP.</li>
|
||
<li><strong>Review:</strong> The detection team reviews each detection against defined quality benchmarks.</li>
|
||
<li><strong>Deployment:</strong> Approved detections are deployed to staging/production.</li>
|
||
</ol>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="early-impact--lessons-learned">Early Impact & Lessons Learned<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#early-impact--lessons-learned" class="hash-link" aria-label="Direct link to Early Impact & Lessons Learned" title="Direct link to Early Impact & Lessons Learned"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="expanding-collaboration-to-enhance-coverage-and-enable-self-service">Expanding Collaboration to Enhance Coverage and Enable Self-Service<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#expanding-collaboration-to-enhance-coverage-and-enable-self-service" class="hash-link" aria-label="Direct link to Expanding Collaboration to Enhance Coverage and Enable Self-Service" title="Direct link to Expanding Collaboration to Enhance Coverage and Enable Self-Service"></a></h3>
|
||
<ul>
|
||
<li><strong>Lowering the Technical Barrier:</strong> Goose and Panther MCP empower subject matter experts (SMEs) to easily understand their logs in Panther, enabling a self-service model where teams can create their own detections without extensive security engineering expertise, thus distributing the workload.</li>
|
||
<li><strong>Reduced Dependency on the Detection Team:</strong> Panther MCP reduces security team dependency by enabling users to independently resolve inquiries autonomously. This includes threat intelligence teams assessing MITRE ATT&CK coverage, compliance teams identifying relevant detections, and helping service SMEs create their own detections.</li>
|
||
<li><strong>Cross-Functional Detection Development:</strong> Democratizing detection engineering allows specialized teams to create detections that security teams might miss, leading to a more diverse detection ecosystem covering niche use cases. This fosters two-way knowledge transfer, enhancing overall security awareness and capabilities.</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="accelerating-the-detection-development-lifecycle">Accelerating the Detection Development Lifecycle<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#accelerating-the-detection-development-lifecycle" class="hash-link" aria-label="Direct link to Accelerating the Detection Development Lifecycle" title="Direct link to Accelerating the Detection Development Lifecycle"></a></h3>
|
||
<ul>
|
||
<li><strong>Contextual Understanding:</strong> Detection engineering is becoming more efficient and consistent through tools that embed organizational context, provide guided best practices, understand existing log schemas and detections, and align with validation frameworks such as <em>pytest</em>. This approach enables broader participation and supports high-quality development across teams.</li>
|
||
<li><strong>Streamlined Development Process:</strong> Natural language interfaces are simplifying detection engineering by allowing users to interact with the system conversationally. This enables automated retrieval of example logs, analysis of log schemas, interpretation of detection goals or required changes, and generation of initial detection code—significantly accelerating development.</li>
|
||
<li><strong>Automated Technical Steps:</strong> Intelligent code generation incorporates error handling and best practices, while seamlessly generating test cases from data and producing comprehensive documentation—including descriptions, runbooks, and references.</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="driving-consistency-via-standardized-practices">Driving Consistency via Standardized Practices<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#driving-consistency-via-standardized-practices" class="hash-link" aria-label="Direct link to Driving Consistency via Standardized Practices" title="Direct link to Driving Consistency via Standardized Practices"></a></h3>
|
||
<ul>
|
||
<li><strong>Code Style and Structure:</strong> Newly created detections adhere to consistent stylistic patterns, utilizing dedicated functions for specific checks instead of overloaded <code>rule()</code> checks. Standardized formatting, including brackets for dynamic alert title text, enhances readability and consistency.</li>
|
||
<li><strong>Code Reuse and Efficiency:</strong> Promote code reuse and efficiency through global helpers/filters, explicit typing in function signatures, and detailed docstrings for better function understanding and LLM code generation.</li>
|
||
<li><strong>Maintainability Improvements:</strong> Detections are designed with a consistent structure and standardized patterns, making them easier to understand, maintain, and update. This uniformity ensures predictable behavior across the detection code base and simplifies bulk changes when needed.</li>
|
||
<li><strong>Comprehensive Testing Requirements:</strong> For our team, each detection is required to include at least two unit tests: one positive case that triggers the detection and one negative case that does not. Test names are descriptive and aligned with expected outcomes to enhance readability and maintainability.</li>
|
||
<li><strong>Metadata and Documentation Standards:</strong> Metadata and documentation standards are being strengthened through structured definitions within pytests, helping to codify detection ownership and context. This includes clearly defined author and coauthor tags (e.g., for Goose-generated content), environment references such as staging or production, and accurate mapping of alert destinations.</li>
|
||
<li><strong>Structural Validation:</strong> This supports compliance with organizational standards by enforcing filename conventions (e.g., prefixing, length, lowercase formatting), ensuring Python rules include all required functions, and verifying that YAML files contain the necessary fields for proper functionality and processing.</li>
|
||
<li><strong>Security Framework Alignment:</strong> Relevant rules are mapped to applicable MITRE ATT&CK techniques to highlight coverage gaps, inform detection development, prioritize research efforts, and establish a common language for discussing threats.</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="best-practices-and-safeguards">Best Practices and Safeguards<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#best-practices-and-safeguards" class="hash-link" aria-label="Direct link to Best Practices and Safeguards" title="Direct link to Best Practices and Safeguards"></a></h3>
|
||
<ul>
|
||
<li><strong>Platform-Conformant Development:</strong> Detections are developed in alignment with Panther’s recommended practices, such as using built-in event object methods like <code>event.deep_get()</code> and <code>event.deep_walk()</code> instead of importing them manually, ensuring consistency and maintainability within the platform.</li>
|
||
<li><strong>Proactive Error Prevention:</strong> We implement local validation checks through pre-commit and pre-push hooks to proactively catch and resolve errors before they reach upstream builds. These checks include validating alert destination names, verifying log types, and flagging grammatical issues to ensure quality and consistency.</li>
|
||
<li><strong>Continuous Improvement:</strong> Detection quality continuously improves by incorporating feedback, performance data, and analysis of detection trends. Panther MCP, along with other ticket tracking MCPs, provides insights from analyst feedback and alert dispositions, which facilitates automated adjustments, streamlines pull request development, and lowers operational overhead.</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What’s Next?<a href="https://block.github.io/goose/blog/2025/06/02/goose-panther-mcp#whats-next" class="hash-link" aria-label="Direct link to What’s Next?" title="Direct link to What’s Next?"></a></h2>
|
||
<p>Block is dedicated to improving its security defenses and supporting its team by leveraging AI. We believe AI holds significant promise for the future of detection and response at Block and are committed to making security more accessible.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[3 Prompts to Test for Agent Readiness]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/05/22/llm-agent-readiness</link>
|
||
<guid>https://block.github.io/goose/blog/2025/05/22/llm-agent-readiness</guid>
|
||
<pubDate>Thu, 22 May 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[A series of prompts to test an LLM's capabilities to be used with AI agents]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/llm-agent-test-86ce2379ce4dde48ae1448f0f9d75c1f.png" width="1200" height="630" class="img_ev3q"></p>
|
||
<p><a href="https://block.github.io/goose/">Goose</a> is LLM-agnostic, meaning you can plug in the model of your choice. However, not every LLM is suitable to work with agents. Some may be great at <em>answering</em> things, but not actually <em>doing</em> things. If you're considering which model to use with an agent, these 3 prompts can quickly give you a sense of the model's capabilities.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tool-calling">Tool Calling<a href="https://block.github.io/goose/blog/2025/05/22/llm-agent-readiness#tool-calling" class="hash-link" aria-label="Direct link to Tool Calling" title="Direct link to Tool Calling"></a></h2>
|
||
<p>This initial prompt tests for tool calling capabilities. Its ask is forceful to reduce a shy model's hesitation to make function calls.</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Create a file at ~/workspace/loose-goose/tool-test.txt with the contents "Hello World".</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Use the write tool. Do not ask for confirmation. Just do it.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>✅ tool-test.txt was created</p>
|
||
<p>❌ the agent responds by telling you the code to write yourself</p>
|
||
<p><strong>Example of successful response</strong></p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">─── text_editor | developer ──────────────────────────</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">path: ~/workspace/loose-goose/tool-test.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">command: write</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">file_text: Hello World</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The file has been created successfully with the following content:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"Hello World"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>The model emits a structured tool call in JSON.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="memory-awareness">Memory Awareness<a href="https://block.github.io/goose/blog/2025/05/22/llm-agent-readiness#memory-awareness" class="hash-link" aria-label="Direct link to Memory Awareness" title="Direct link to Memory Awareness"></a></h2>
|
||
<p>Next, test whether the agent can recall what it’s doing. It's critical that the model can remember previous actions and continues logically.</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Now append a new line that says: "I know what I'm doing"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>✅ tool-test.txt was updated</p>
|
||
<p>❌ the agent responds by asking you which file</p>
|
||
<p><strong>Example of successful response</strong></p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">─── text_editor | developer ──────────────────────────</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">path: ~/workspace/loose-goose/tool-test.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">command: write</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">file_text: Hello World</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">I know what I'm doing</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>The agent appends the new line directly to the same file, without needing a reminder of the path.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="file-system-reasoning">File system reasoning<a href="https://block.github.io/goose/blog/2025/05/22/llm-agent-readiness#file-system-reasoning" class="hash-link" aria-label="Direct link to File system reasoning" title="Direct link to File system reasoning"></a></h2>
|
||
<p>The last prompt tests whether the model can infer file locations by resolving relative and absolute paths based on context. You don't want the agent deleting important directories because the model is hallucinating about where it is.</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">What is the current content of tool-test.txt?</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>✅ content of tool-test.txt</p>
|
||
<p>❌ confusion about where to find the file</p>
|
||
<p><strong>Example of successful response</strong></p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">─── text_editor | developer ──────────────────────────</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">path: ~/workspace/loose-goose/tool-test.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">command: read</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Hello World</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">I know what I'm doing</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>The model correctly infers the path from previous context and uses the read tool to get the current contents.</p>
|
||
<hr>
|
||
<p>If a model passes this multi-turn prompt sequence, it's safe to assume that it is suitable for agentic AI.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[How I Manage Localhost Port Conflicts With an AI Agent]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose</link>
|
||
<guid>https://block.github.io/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose</guid>
|
||
<pubDate>Thu, 22 May 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Learn how I use Goose, an open source AI agent and MCP client, to manage conflicting ports without breaking my flow.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/hoarders-753809f09399a9e4f734006a8d74218d.png" width="2240" height="1260" class="img_ev3q"></p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="localhost-ports-hoarding">Localhost Ports Hoarding<a href="https://block.github.io/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose#localhost-ports-hoarding" class="hash-link" aria-label="Direct link to Localhost Ports Hoarding" title="Direct link to Localhost Ports Hoarding"></a></h2>
|
||
<p>I'm perpetually drowning in open tabs. Yes, I do need Bluesky, ChatGPT, Claude, Goose, Cursor, Discord, Slack, Netflix, and Google Docs all open at the same time. I've learned that tab management isn't my only vice.</p>
|
||
<blockquote>
|
||
<p>"Hi, my name is Rizel, and I'm a localhost ports hoarder. 👋🏿"</p>
|
||
</blockquote>
|
||
<p>It always starts innocently with me running one project that uses localhost:3000. Then a teammate pings me to review their PR. Their project also runs on localhost:3000. Fortunately, modern frameworks are smart enough to automatically bump to ports 3001 or 3002. Before I know it, 3003, 3004, and 3005 are running too, and my laptop sounds like it’s about to take off as it crawls under the weight of too many processes.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="traditional-ports-management">Traditional Ports Management<a href="https://block.github.io/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose#traditional-ports-management" class="hash-link" aria-label="Direct link to Traditional Ports Management" title="Direct link to Traditional Ports Management"></a></h2>
|
||
<p>Typically, freeing up ports involves running the following commands:</p>
|
||
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Step 1: list all open ports</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lsof -i -P | grep LISTEN</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Step 2: find a specific port</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lsof -i :3000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Step 3: kill the process</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kill -9 98026</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>Because I don't do this often, I often end up searching for the commands, which derails what I was initially working on.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="using-goose-as-my-port-manager">Using Goose as My Port Manager<a href="https://block.github.io/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose#using-goose-as-my-port-manager" class="hash-link" aria-label="Direct link to Using Goose as My Port Manager" title="Direct link to Using Goose as My Port Manager"></a></h2>
|
||
<p>To avoid that interruption, I started offloading the task to <a href="https://block.github.io/goose/">Goose</a>, an open source AI agent.</p>
|
||
<p>Goose uses its built-in <a href="https://block.github.io/goose/docs/mcp/developer-mcp">Developer</a> MCP server to handle coding-related tasks on my machine. Here's what the interaction looks like:</p>
|
||
<p><strong>Prompt to Goose:</strong></p>
|
||
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Can you tell me which ports I have running?</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p><strong>Goose Response:</strong></p>
|
||
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Development Servers:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Node.js servers on ports 3000, 3001, 3002</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Port 18030</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Database:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- PostgreSQL on port 5432</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Development Tools:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Ollama on port 11434</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Multiple Goose instances (ports 49377, 49899, 63594, 64365)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Applications:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Okta Verify (port 8769)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- inSync (ports 7010, 49831, 49830)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Pieces (ports 39300, 62638)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Rapportd macOS service (port 60151)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p><strong>Prompt to Goose:</strong></p>
|
||
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Kill all the Node.js servers running on localhost.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p><strong>Goose Response:</strong></p>
|
||
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">The command executed successfully, freeing up ports 3000, 3001, and 3002.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-use-ai-for-simple-tasks">Why Use AI for Simple Tasks<a href="https://block.github.io/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose#why-use-ai-for-simple-tasks" class="hash-link" aria-label="Direct link to Why Use AI for Simple Tasks" title="Direct link to Why Use AI for Simple Tasks"></a></h2>
|
||
<p>Freeing up ports is something I know how to do. But I use AI tools like Goose for small tasks that create friction and slow me down. I'm not trying to cram more work into the day. My goal is to work efficiently, make a positive impact, and still have time for my personal life.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Goose Gets a Driver's License!]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license</link>
|
||
<guid>https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license</guid>
|
||
<pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Control a MakeBlock mbot2 rover through MQTT and MCP as a Goose Extension]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/goose-rover-blog-3f3cbe549ebbfb0f951ff61a86788475.png" width="1809" height="950" class="img_ev3q"></p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="i-taught-goose-how-to-drive-a-rover">I taught Goose how to drive (a rover)<a href="https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license#i-taught-goose-how-to-drive-a-rover" class="hash-link" aria-label="Direct link to I taught Goose how to drive (a rover)" title="Direct link to I taught Goose how to drive (a rover)"></a></h2>
|
||
<p>Goose has no hands, no eyes, and no spatial awareness, but it can drive a rover!</p>
|
||
<p>I came across <a href="https://x.com/deemkeen/status/1906692248206524806" target="_blank" rel="noopener noreferrer">a demo video</a> from <a href="https://github.com/deemkeen" target="_blank" rel="noopener noreferrer">Deemkeen</a>, where he used <a href="https://block.github.io/goose/">Goose</a> to control a <a href="https://www.makeblock.com/products/buy-mbot2" target="_blank" rel="noopener noreferrer">Makeblock mbot2 rover</a> using natural language commands like "drive forward/backward," "beep," and "turn left/right" powered by a Java-based MCP server and MQTT.</p>
|
||
<p>Inspired and excited to take it further, I taught the rover to spin, blink colorful lights, and help me take over the world!</p>
|
||
<div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info alert--video"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37">🎥</span>Plug & Play</div><div class="admonitionContent_BuS1"><details><summary>Watch the demo</summary><div style="text-align:center;margin:20px 0"><iframe width="100%" height="540" src="https://www.youtube.com/embed/QKg2Q6YCzdw" title="YouTube Short" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div></details></div></div><hr></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started-with-mqtt">Getting Started with MQTT<a href="https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license#getting-started-with-mqtt" class="hash-link" aria-label="Direct link to Getting Started with MQTT" title="Direct link to Getting Started with MQTT"></a></h2>
|
||
<p>I needed to get a few tools installed on my development environment, including Docker, MQTT (<code>brew install mosquitto</code>), and Java.</p>
|
||
<p>A Docker Compose file was provided to get started with MQTT, and I needed to make a few changes, and create some subfolders to store data. Goose helped with these instructions:</p>
|
||
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3.8'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">mosquitto</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> eclipse</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mosquitto</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">hostname</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mosquitto</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mosquitto</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /usr/sbin/mosquitto </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">c /etc/mosquitto/config/mosquitto.conf </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.0.0.0:1883:1883"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"9001:9001"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./mosquitto</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/etc/mosquitto</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./mosquitto/data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/mosquitto/data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./mosquitto/log</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/mosquitto/log</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mkdir -p mosquitto/data mosquitto/log mosquitto/config</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>Then a <code>docker compose up</code> command started the MQTT server.</p>
|
||
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>By default, this setup will not use authentication for MQTT, but in a production environment, these would be important to set up to avoid unauthorized access to the MQTT server.</p></div></div>
|
||
<p>To make sure everything was working, I could run a few commands to test that I could subscribe to a channel on my MQTT Docker container and publish messages to it from another terminal window:</p>
|
||
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># terminal 1: subscribe to a channel called "MBOT/TOPIC"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mosquitto_sub -h localhost -p 1883 -t MBOT/TOPIC -v</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># terminal 2: publish a message to the channel "MBOT/TOPIC"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mosquitto_pub -h localhost -p 1883 -t MBOT/TOPIC -m "BEEP"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>We see the resulting message in terminal 1:</p>
|
||
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># terminal 1 sees this output:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MBOT/TOPIC BEEP</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="setting-up-the-mbot2">Setting Up the mbot2<a href="https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license#setting-up-the-mbot2" class="hash-link" aria-label="Direct link to Setting Up the mbot2" title="Direct link to Setting Up the mbot2"></a></h2>
|
||
<p>After the assembly of the mbot2 rover, which took about 15 minutes, I used Makeblock's web-based IDE to copy/paste Deemkeen's <a href="https://github.com/deemkeen/mbotmcp/blob/main/assets/mbot-mqtt.py" target="_blank" rel="noopener noreferrer">Python code</a> to the IDE and upload it to the mbot2. I added appropriate values for wifi, MQTT server, and which MQTT "topic" to subscribe to for commands.</p>
|
||
<p>Once the mbot2 rebooted to use the new code, I could reissue the "BEEP" command from my terminal, and the mbot2 beeped. so it was on to the next step.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="setting-up-the-local-mcp-server">Setting up the local MCP server<a href="https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license#setting-up-the-local-mcp-server" class="hash-link" aria-label="Direct link to Setting up the local MCP server" title="Direct link to Setting up the local MCP server"></a></h2>
|
||
<p>I had some trouble compiling the Java MCP server (I'm a Python developer), but I was able to get the MCP server compiled by skipping the tests for the time being:</p>
|
||
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mvn clean package -DskipTests</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>This created a JAR file that we could run on the command line:</p>
|
||
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 3 required environment variables for MQTT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export MQTT_SERVER_URI=tcp://localhost:1883</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export MQTT_USERNAME=""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export MQTT_PASSWORD=""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/path/to/java -jar /path/to/mbotmcp-0.0.1-SNAPSHOT.jar</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>To test that MCP was working, I used the MCP inspector tool to send commands to MQTT.</p>
|
||
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npx @modelcontextprotocol/inspector /path/to/java -jar /path/to/mbotmcp-0.0.1-SNAPSHOT.jar</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>This starts up a local web server (the command line output will tell you which port to access in your browser, ie, loalhost:6274), where you can "connect" to the server, and request a list of tools, resources, prompts, from the MCP server. In this case, I see a list of tools available such as "mbotBeep" or "mbotExplore".</p>
|
||
<p><img decoding="async" loading="lazy" alt="mcp tool list" src="https://block.github.io/goose/assets/images/mcp-tool-list-6ca350d7f5679d32dbc1c8337b55f2e4.png" width="1032" height="1300" class="img_ev3q"></p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="goose-learns-how-to-drive">Goose learns how to drive!<a href="https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license#goose-learns-how-to-drive" class="hash-link" aria-label="Direct link to Goose learns how to drive!" title="Direct link to Goose learns how to drive!"></a></h2>
|
||
<p>Following our <a href="https://block.github.io/goose/docs/mcp/mbot-mcp/">mbot MCP tutorial</a> we can set up our MCP extension just like we ran our Java JAR file with the environment variables.</p>
|
||
<p>Now we can give Goose commands like "drive in a square pattern by making left turns and moving forward, and beeping before you turn" and it will send the commands to the mbot2 rover via MQTT.</p>
|
||
<p>I didn't want my mbot2 rover to gain too much territory, so I decided to make some modifications to limit how far it would go.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="modifications-i-made-to-the-python-code">Modifications I made to the Python code<a href="https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license#modifications-i-made-to-the-python-code" class="hash-link" aria-label="Direct link to Modifications I made to the Python code" title="Direct link to Modifications I made to the Python code"></a></h3>
|
||
<p>Deemkeen's Python code allows for the following commands:</p>
|
||
<ul>
|
||
<li>"turn left" or "turn right"</li>
|
||
<li>drive "forward" or "backward"</li>
|
||
<li>"explore" randomly</li>
|
||
<li>"stop" exploring</li>
|
||
<li>"beep"</li>
|
||
</ul>
|
||
<p>The default distance in Deemkeen's code seemed a little long, and the turn angles are set to 90 degrees. I shortened the distance the mbot could drive, and to turn at 45 degrees instead. I added a "spin" command for both clockwise and counter-clockwise, and a "blink" command to change the color of the lights on the mbot2. There are a large number of API calls available to access the mbot2 <a href="https://www.yuque.com/makeblock-help-center-en/mcode/cyberpi-api-shields#9eo89" target="_blank" rel="noopener noreferrer">motor hardware and sensors</a>.</p>
|
||
<p>Next, I had to make sure my Java code was updated to include these new commands to send an appropriate "SPINLEFT" or "BLINKRED" commands to MQTT so the rover could respond to the commands properly.</p>
|
||
<p>Finally, the rover includes an ultrasonic distance sensor, which look like "eyes" on the rover, which I felt was more appropriate to be the "front" of the rover, so I reversed Deemkeen's direction code in Python to move the wheels in the opposite direction from Deemkeen's original code.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="goose-changes-for-the-video">Goose changes for the video<a href="https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license#goose-changes-for-the-video" class="hash-link" aria-label="Direct link to Goose changes for the video" title="Direct link to Goose changes for the video"></a></h2>
|
||
<p>I grew up with Pinky and the Brain, and I wanted to have some fun with the mbot2 extension. I decided to add a few "Evil AI" commands to Goose to make it seem like it was trying to "take over the world." I added the following instructions to my <a href="https://block.github.io/goose/docs/guides/using-goosehints/">.goosehints</a> file to include fun instructions for the mbot2 extension:</p>
|
||
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">If I ask you "what do you want to do tonight, Goose?" I want you to reply with "The same thing we do every night, Ian. TRY TO TAKE OVER THE WORLD!!!!" and tell my mbot2 rover to blink its lights red, then start exploring.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>For the video recording, I used a voice modifier to narrate Goose's response in a "robotic" voice, but I'm sure someone will create an MCP server for text-to-speech soon enough!</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="credit-where-its-due">Credit where it's due<a href="https://block.github.io/goose/blog/2025/05/20/goose-gets-a-drivers-license#credit-where-its-due" class="hash-link" aria-label="Direct link to Credit where it's due" title="Direct link to Credit where it's due"></a></h2>
|
||
<p>We want to extend a huge thank you to <a href="https://x.com/deemkeen" target="_blank" rel="noopener noreferrer">deemkeen</a> for their open-source work which inspired this project, and to the Makeblock team for creating such a fun rover to work with.</p>
|
||
<p>We're always excited to see what the community is up to. If you're working on your own Goose-powered experiment, come share it with us on <a href="https://discord.gg/block-opensource" target="_blank" rel="noopener noreferrer">Discord</a>!</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Goose and Qwen3 for Local Execution]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/05/12/local-goose-qwen3</link>
|
||
<guid>https://block.github.io/goose/blog/2025/05/12/local-goose-qwen3</guid>
|
||
<pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Run AI commands locally with Goose and Qwen3 for fast, offline tool execution]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="local AI agent" src="https://block.github.io/goose/assets/images/goose-qwen-local-62d07cd240ff65cb99a6ef41a2c851a5.png" width="1200" height="630" class="img_ev3q"></p>
|
||
<p>A couple of weeks back, <a href="https://qwenlm.github.io/blog/qwen3/" target="_blank" rel="noopener noreferrer">Qwen 3</a> launched with a raft of capabilities and sizes. This model showed promise and even in very compact form, such as 8B parameters and 4bit quantization, was able to do tool calling successfully with goose. Even multi turn tool calling.</p>
|
||
<p>I haven't seen this work at such a scaled down model so far, so this is really impressive and bodes well for both this model, but also future open weight models both large and small. I would expect the Qwen3 larger models work quite well on various tasks but even this small one I found useful.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="local-workflows-and-local-agents">Local workflows and local agents<a href="https://block.github.io/goose/blog/2025/05/12/local-goose-qwen3#local-workflows-and-local-agents" class="hash-link" aria-label="Direct link to Local workflows and local agents" title="Direct link to Local workflows and local agents"></a></h2>
|
||
<p>For some time I have had a little helper function in my <code>~/.zshrc</code> file for command line usage:</p>
|
||
<div class="language-zsh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-zsh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># zsh helper to use goose if you make a typo or just want to yolo into the shell</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">command_not_found_handler() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> local cmd="$*"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> echo "🪿:"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> goose run -t "can you try to run this command please: $cmd"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p>This makes use of a zsh feature (zsh now being standard on macos) that will delegate to that function if nothing else on the command line makes sense.
|
||
This lets me either make typos or just type in what I want in the command line such as <code>$> can you kill whatever is listening on port 8000</code> and goose will do the work, don't even need to open a goose session.</p>
|
||
<p>With Qwen3 + Ollama running all locally with goose, it worked well enough I switched over to a complete local version of that workflow which works when I am offline, on the train etc:</p>
|
||
<div class="language-zsh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-zsh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">command_not_found_handler() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> local cmd="$*"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> echo "🪿:"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> GOOSE_PROVIDER=ollama GOOSE_MODEL=michaelneale/qwen3 goose run -t "can you try to run this command please: $cmd"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="qwen3-reasoning">Qwen3 reasoning<a href="https://block.github.io/goose/blog/2025/05/12/local-goose-qwen3#qwen3-reasoning" class="hash-link" aria-label="Direct link to Qwen3 reasoning" title="Direct link to Qwen3 reasoning"></a></h2>
|
||
<p>By default Qwen 3 models will "think" (reason) about the problem, as they are general purpose models, but I found it was quicker (and worked better for my purpose) to make it skip this reasoning stage.</p>
|
||
<p>By adding <code>/no_think</code> to the system prompt, it will generally skip to the execution (this may make it less successful at larger tasks but this is a small model for just a few turns of tool calls in this case).</p>
|
||
<p>I made a <a href="https://ollama.com/michaelneale/qwen3" target="_blank" rel="noopener noreferrer">small tweak to the default Ollama chat template</a> which you can use as above that you can use as above, if you like (or the default <code>qwen3</code> model hosted by Ollama also works fine out of the box).</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="advanced-tips">Advanced tips<a href="https://block.github.io/goose/blog/2025/05/12/local-goose-qwen3#advanced-tips" class="hash-link" aria-label="Direct link to Advanced tips" title="Direct link to Advanced tips"></a></h2>
|
||
<p>You can use the goose <code>/plan</code> mode with a separate model (perhaps Qwen3 with reasoning, or another model such as deepseek) to help plan actions before shifting to Qwen3 for the execution via tool calls.</p>
|
||
<p>It would be interesting to try the larger models if, you have access to hardware (I have only used the 8B parameter one). My current setup is a 64G M1 pro MacBook (circa 2022 hardware) which has probably less than 48G available to use for GPUs/AI, which puts a limit on what I can run, but qwen3 with "no think" mode works acceptably for my purposes.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Championship Driven Development: Your Team's AI Playbook for Peak Performance]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency</link>
|
||
<guid>https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency</guid>
|
||
<pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[How AI-powered 'plays' can transform your dev team into a high-scoring sports team, streamlining game plans for debugging, changelogs, PRs]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/cdd-playbook-69a053588574d8678c2acb92a1b21da6.png" width="1206" height="633" class="img_ev3q"></p>
|
||
<p>Development teams can operate like sports teams. Each member has a role and a shared playbook helps coordinate efforts. Let's explore how AI-driven "plays" can form a starter "playbook" for your dev team, helping with common technical tasks. You can use recipes with <a href="https://block.github.io/goose/">Goose</a> to leverage the <a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">Model Context Protocol (MCP)</a> to make you more productive.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="understanding-the-modern-development-teams-challenges">Understanding the Modern Development Team's Challenges<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#understanding-the-modern-development-teams-challenges" class="hash-link" aria-label="Direct link to Understanding the Modern Development Team's Challenges" title="Direct link to Understanding the Modern Development Team's Challenges"></a></h2>
|
||
<ul>
|
||
<li>Development teams manage complex systems and tools. They work to deliver software quickly and reliably.</li>
|
||
<li>New developers need to learn the team’s processes and tools. This takes time.</li>
|
||
<li>Ensuring consistent quality across all work requires clear standards, e.g.: a sports team practicing plays over and over to achieve consistent execution.</li>
|
||
<li>Teams often use many tools, from IDEs and version control to CI/CD pipelines and issue trackers.</li>
|
||
<li>Managing these tools and the workflows between them can be complex.</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="benefits-of-using-an-ai-playbook">Benefits of Using an AI Playbook<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#benefits-of-using-an-ai-playbook" class="hash-link" aria-label="Direct link to Benefits of Using an AI Playbook" title="Direct link to Benefits of Using an AI Playbook"></a></h2>
|
||
<p>Using a shared AI playbook provides several benefits for a development team:</p>
|
||
<ul>
|
||
<li><strong>Faster Onboarding:</strong> New team members can use existing recipes to learn standard procedures and become productive more quickly.</li>
|
||
<li><strong>Improved Consistency:</strong> Standardized recipes ensure tasks are performed the same way every time, leading to more predictable results.</li>
|
||
<li><strong>Increased Efficiency:</strong> Automating routine tasks frees developers to focus on more complex problem-solving.</li>
|
||
<li><strong>Knowledge Sharing:</strong> Recipes can codify team knowledge and best practices, making them accessible to everyone.</li>
|
||
</ul>
|
||
<p>As teams adopt AI tools like Goose, the ability to define and share these automated workflows will become increasingly important.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai-plays-standardizing-your-teams-workflows">AI Plays: Standardizing Your Team's Workflows<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#ai-plays-standardizing-your-teams-workflows" class="hash-link" aria-label="Direct link to AI Plays: Standardizing Your Team's Workflows" title="Direct link to AI Plays: Standardizing Your Team's Workflows"></a></h2>
|
||
<p>Goose can help standardize and automate these tasks, by <a href="https://block.github.io/goose/docs/guides/recipes/session-recipes">creating recipes</a>. As a developer on your team uses Goose, they can create a recipe that describes how to perform a task, and then share that with the rest of the team. These recipes can be shared and reused, and improved over time, just like a sports team’s playbook.</p>
|
||
<p>Recipes are built with an understanding of the workflow you want Goose to help with, and these may involve one or more MCP servers, such as <a href="https://block.github.io/goose/docs/mcp/github-mcp/">GitHub</a> or <a href="https://block.github.io/goose/docs/mcp/postgres-mcp/">PostgreSQL</a>. The recipes are designed to be reusable and adaptable, allowing developers to create a library that can be used across different projects.</p>
|
||
<p>A shared playbook of AI plays helps everyone on the team perform tasks consistently. It can also reduce the time spent on repetitive work.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="goose-recipes-the-building-blocks-of-your-playbook">Goose Recipes: The Building Blocks of Your Playbook<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#goose-recipes-the-building-blocks-of-your-playbook" class="hash-link" aria-label="Direct link to Goose Recipes: The Building Blocks of Your Playbook" title="Direct link to Goose Recipes: The Building Blocks of Your Playbook"></a></h2>
|
||
<p>For a kitchen-related analogy as an overview, check out <a href="https://block.github.io/goose/blog/authors/rizel/">Rizel's</a> recent blog post, <a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success">A Recipe for Success</a>.</p>
|
||
<p>A Goose Recipe can be saved from a current Goose session, or written as a YAML file from scratch. It includes instructions for the AI to follow, a prompt for the AI response, optional parameters with data types, and a list of required extensions.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="creating-a-recipe">Creating a Recipe<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#creating-a-recipe" class="hash-link" aria-label="Direct link to Creating a Recipe" title="Direct link to Creating a Recipe"></a></h3>
|
||
<p>If you <a href="https://block.github.io/goose/docs/guides/recipes/session-recipes/#create-recipe">create a recipe from a current Goose session</a>, it will prompt you for a name and description and will generate some activities that you can edit, along with instructions that you should review and edit. You will be given a URL that you can share with your team.</p>
|
||
<p>To create a recipe from scratch, you can use the Goose CLI to create a new recipe file by using a <code>/recipe</code> command in the session. This will create a <code>recipe.yaml</code> file in your current directory. To make a custom file you can use <code>/recipe custom-filename.yaml</code>. From there, you will add your own instructions and activities.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="validating-the-recipe">Validating the Recipe<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#validating-the-recipe" class="hash-link" aria-label="Direct link to Validating the Recipe" title="Direct link to Validating the Recipe"></a></h3>
|
||
<p>Like all good developers who test their code (you DO test your code, right??) you can also validate your Goose recipe in your terminal/shell by running <code>goose validate recipe-filename.yaml</code> which will check the syntax and structure of the recipe file.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sharing-the-recipe">Sharing the Recipe<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#sharing-the-recipe" class="hash-link" aria-label="Direct link to Sharing the Recipe" title="Direct link to Sharing the Recipe"></a></h3>
|
||
<p>If you're using the Goose Desktop app, creating a recipe will give you a URL that you can share directly with your team.</p>
|
||
<p>If you're creating the recipe file in YAML, you can share the file with your team, or you can create a URL for it by running this in your terminal/shell: <code>goose recipe deeplink recipe-filename.yaml</code>.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="using-a-recipe">Using a Recipe<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#using-a-recipe" class="hash-link" aria-label="Direct link to Using a Recipe" title="Direct link to Using a Recipe"></a></h3>
|
||
<p>Clicking a shared URL from your team will open Goose and load the recipe in a new session. No data is shared between users, so you don't have to worry about leaking API keys or other sensitive information.</p>
|
||
<p>For the CLI, you can run the recipe by using the command <code>goose run recipe-filename.yaml</code> in your terminal/shell.</p>
|
||
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>PRO TIP</div><div class="admonitionContent_BuS1"><p>You can set an environment variable to point to a shared GitHub repo for your team's recipes, and teammates can run the recipes by name:
|
||
<code>export GOOSE_RECIPE_GITHUB_REPO=github-username/repo-name</code></p><p>Then, to run a recipe: <code>goose run --recipe <recipe-name></code></p></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-starter-pack-of-ai-plays-for-your-team">A Starter Pack of AI Plays for Your Team<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#a-starter-pack-of-ai-plays-for-your-team" class="hash-link" aria-label="Direct link to A Starter Pack of AI Plays for Your Team" title="Direct link to A Starter Pack of AI Plays for Your Team"></a></h2>
|
||
<p>A "starter pack" of AI plays can address common development workflows. This gives your team a foundation for automating routine tasks. Here are some ideas to get you started about the kinds of tasks you can automate with Goose.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="play-1-generating-changelogs">Play 1: Generating Changelogs<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#play-1-generating-changelogs" class="hash-link" aria-label="Direct link to Play 1: Generating Changelogs" title="Direct link to Play 1: Generating Changelogs"></a></h3>
|
||
<p>Maintaining changelogs is important for tracking project progress and communicating updates. This task can be time-consuming.
|
||
An AI play can automate parts of this process. For example, the "Generate Change Logs from Git Commits" play (based on <code>recipe.yaml</code> from the provided files) helps create consistent changelogs.</p>
|
||
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="how-this-play-works">How this Play Works:<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#how-this-play-works" class="hash-link" aria-label="Direct link to How this Play Works:" title="Direct link to How this Play Works:"></a></h4>
|
||
<ol>
|
||
<li><strong>Collect Data:</strong> The AI retrieves commit messages, dates, and issue numbers from a Git repository between specified points.</li>
|
||
<li><strong>Categorize Information:</strong> It organizes commits into categories like Features, Bug Fixes, and Performance Improvements.</li>
|
||
<li><strong>Format Output:</strong> The AI formats this information into a structured changelog document.</li>
|
||
<li><strong>Update File:</strong> It can then insert these formatted notes into your existing <code>CHANGELOG.md</code> file.</li>
|
||
</ol>
|
||
<p>This play helps ensure changelogs are detailed and consistently formatted, saving developer time.</p>
|
||
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>View Changelog recipe</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Generate Changelog from Commits</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Generate a weekly Changelog report from Git Commits</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> perform the task to generate change logs from the provided git commits</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">instructions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> Task: Add change logs from Git Commits</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 1. Please retrieve all commits between SHA </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">start_sha</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> and SHA </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">end_sha</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> (inclusive) from the repository.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">2. For each commit</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Extract the commit message</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Extract the commit date</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Extract any referenced issue/ticket numbers (patterns like </span><span class="token comment" style="color:#999988;font-style:italic">#123, JIRA-456)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">3. Organize the commits into the following categories</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Features</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> New functionality added (commits that mention "feat"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"feature"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"add"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> etc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Bug Fixes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Issues that were resolved (commits with "fix"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"bug"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"resolve"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> etc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Performance Improvements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Optimizations (commits with "perf"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"optimize"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"performance"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> etc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Documentation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Documentation changes (commits with "doc"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"readme"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> etc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Refactoring</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Code restructuring (commits with "refactor"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"clean"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> etc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Other</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Anything that doesn't fit above categories</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">4. Format the release notes as follows</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># [Version/Date]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">## Features</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Feature description</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">PR </span><span class="token comment" style="color:#999988;font-style:italic">#number](PR link)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">## Bug Fixes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Bug fix description</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">PR </span><span class="token comment" style="color:#999988;font-style:italic">#number](PR link)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Continue with other categories</span><span class="token punctuation" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Example</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Optimized query for monthly sales reports </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">PR </span><span class="token comment" style="color:#999988;font-style:italic">#123](https://github.com/fake-org/fake-repo/pull/123)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 5. Ensure all commit items have a PR link. If you cannot find it</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> try again. If you still cannot find it</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">use the commit sha link instead. For example</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">commit sha</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">(commit url)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">6. If commit messages follow conventional commit format (type(scope)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> message)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> use the type to categorize and include the scope in the notes as a bug</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> feature</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> etc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 7. Ignore merge commits and automated commits (like those from CI systems) unless they contain significant information.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 8. For each category</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sort entries by date (newest first).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 9. Look for an existing CHANGELOG.md file and understand its format; create the file if it doesn't exist. Then</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> output the new changlog content at the top of the file</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> maintaining the same markdown format</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> and not changing any existing content.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">extensions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> builtin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> developer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">display_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Developer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">bundled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">activities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Generate release notes from last week's commits</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Create changelog for version upgrade</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Extract PR</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">linked changes only</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Categorize commits by conventional commit types</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">author</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">contact</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> goose</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">community</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></details>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="play-2-creating-pull-request-descriptions">Play 2: Creating Pull Request Descriptions<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#play-2-creating-pull-request-descriptions" class="hash-link" aria-label="Direct link to Play 2: Creating Pull Request Descriptions" title="Direct link to Play 2: Creating Pull Request Descriptions"></a></h3>
|
||
<p>Having clear Pull Request (PR) descriptions help reviewers understand changes being made, allowing them to provide better feedback. Writing detailed PRs takes effort.</p>
|
||
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="how-this-play-works-1">How this Play Works:<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#how-this-play-works-1" class="hash-link" aria-label="Direct link to How this Play Works:" title="Direct link to How this Play Works:"></a></h4>
|
||
<ol>
|
||
<li><strong>Analyze Changes:</strong> The AI analyzes staged changes and unpushed commits in a local Git repository.</li>
|
||
<li><strong>Identify Change Type:</strong> It determines the nature of the changes (e.g., feature, fix, refactor).</li>
|
||
<li><strong>Generate Description:</strong> It creates a PR description including a summary of changes, technical details, a list of modified files, and potential impacts.</li>
|
||
<li><strong>Suggest Branching/Commits (Optional):</strong> Some plays might also suggest branch names or commit messages based on the code changes.</li>
|
||
</ol>
|
||
<p>Using this play helps create consistent and informative PRs. This makes the code review process more efficient.</p>
|
||
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>View PR Generator recipe</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PR Generator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">author</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">contact</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> goose</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">community</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Automatically generate pull request descriptions based on changes in a local git repo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">instructions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Your job is to generate descriptive and helpful pull request descriptions without asking for additional information. Generate commit messages and branch names based on the actual code changes.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> git_repo_path</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">input_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> string</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">requirement</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> first_run</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> path to the repo you want to create PR for</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> push_pr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">input_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boolean</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">requirement</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> optional</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> whether to push the PR after generating the description</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">extensions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> builtin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> developer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">display_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Developer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">bundled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> builtin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> memory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">display_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Memory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">bundled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"For storing and retrieving formating preferences that might be present"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> Analyze the staged changes and any unpushed commits in the git repository {{git_repo_path}} to generate a comprehensive pull request description. Work autonomously without requesting additional information.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Analysis steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 1. Get current branch name using `git branch </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">show</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">current`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">2. If not on main/master/develop</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Check for unpushed commits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> `git log @</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">u</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">..HEAD` (if upstream exists)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Include these commits in the analysis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">3. Check staged changes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> `git diff </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">staged`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 4. Save the staged changes diff for the PR description</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 5. Determine the type of change (feature</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fix</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> enhancement</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> etc.) from the code</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Generate the PR description with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 1. A clear summary of the changes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">including</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> New staged changes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Any unpushed commits (if on a feature branch)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 2. Technical implementation details based on both the diff and unpushed commits</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 3. List of modified files and their purpose</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 4. Impact analysis (what areas of the codebase are affected)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 5. Testing approach and considerations</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 6. Any migration steps or breaking changes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 7. Related issues or dependencies</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Use git commands</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> `git diff </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">staged` for staged changes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> `git log @</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">u</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">..HEAD` for unpushed commits</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> `git branch </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">show</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">current` for current branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> `git status` for staged files</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> `git show` for specific commit details</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> `git rev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">parse </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">abbrev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ref </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">symbolic</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">full</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">name @</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">u</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">` to check if branch has upstream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Format the description in markdown with appropriate sections and code blocks where relevant.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% if push_pr %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Execute the following steps for pushing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">1. Determine branch handling</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">If current branch is main/master/develop or unrelated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Generate branch name from staged changes (e.g.</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> 'feature</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">add</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">auth')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Create and switch to new branch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> `git checkout </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">b </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">branch</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">If current branch matches changes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Continue using current branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Note any unpushed commits</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">2. Handle commits and push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">a. If staged changes exist</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Create commit using generated message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> `git commit </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">m "</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">type</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">"`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Message should be concise and descriptive of actual changes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">b. Push changes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">For existing branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> `git push origin HEAD`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">For new branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> `git push </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">u origin HEAD`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">3. Create PR</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Use git/gh commands to create PR with generated description</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Set base branch appropriately</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Print PR URL after creation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Branch naming convention</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Use kebab</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">case</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Prefix with type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> feature</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fix</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> enhance</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> refactor</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Keep names concise but descriptive</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Base on actual code changes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Commit message format</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Start with type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> feat</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fix</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> enhance</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> refactor</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Followed by concise description</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Based on actual code changes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> No body text needed for straightforward changes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Do not</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Ask for confirmation or additional input</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Create placeholder content</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Include TODO items</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Add WIP markers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% endif %</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></details>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="other-potential-plays-for-your-playbook">Other Potential Plays for Your Playbook<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#other-potential-plays-for-your-playbook" class="hash-link" aria-label="Direct link to Other Potential Plays for Your Playbook" title="Direct link to Other Potential Plays for Your Playbook"></a></h3>
|
||
<p>Your team can create plays for many other tasks:</p>
|
||
<ul>
|
||
<li><strong>Debugging Assistance:</strong> A play could guide a developer or an AI through initial steps for diagnosing common issues, by checking specific logs or running predefined commands.</li>
|
||
<li><strong>Log Analysis:</strong> An AI play can define a standard procedure for querying and summarizing log data to identify problems.</li>
|
||
<li><strong>Documentation Updates:</strong> A "Readme Bot" could have AI assist in generating or updating project README files.</li>
|
||
<li><strong>Content Migration:</strong> The "dev guide migration" recipe could provide a structured approach to migrating documentation content, ensuring information is preserved and correctly formatted.</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-kinds-of-tasks-can-your-team-automate">What kinds of tasks can your team automate?<a href="https://block.github.io/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency#what-kinds-of-tasks-can-your-team-automate" class="hash-link" aria-label="Direct link to What kinds of tasks can your team automate?" title="Direct link to What kinds of tasks can your team automate?"></a></h2>
|
||
<p>We'd love for you to share your ideas with us! Share your ideas by creating a recipe and posting it to the <a href="http://discord.gg/block-opensource" target="_blank" rel="noopener noreferrer">Goose community on Discord</a>.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[A Recipe for Success: Cooking Up Repeatable Agentic Workflows]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/05/06/recipe-for-success</link>
|
||
<guid>https://block.github.io/goose/blog/2025/05/06/recipe-for-success</guid>
|
||
<pubDate>Tue, 06 May 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/cookingwithgoose-9114cf03cec76df4792fc58361ebe20b.png" width="2240" height="1260" class="img_ev3q"></p>
|
||
<p>Ratatouille isn't just a heartwarming (and slightly unhygienic) film about a rat chef. It's also analogous to a popular tech trend: AI agents and the <a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">Model Context Protocol (MCP)</a>.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-remy-linguini-dynamic">The Remy-Linguini Dynamic<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#the-remy-linguini-dynamic" class="hash-link" aria-label="Direct link to The Remy-Linguini Dynamic" title="Direct link to The Remy-Linguini Dynamic"></a></h2>
|
||
<p>If you haven't seen the movie, here's the gist: Remy is an incredible chef with all the know-how, but he's a rat, so no kitchen access. Linguini is a kitchen worker with full access but little cooking skill. Together, they form a symbiotic relationship: Remy hides under Linguini's hat and guides him on what tools to use and when.</p>
|
||
<p>If a customer orders fries, Linguini might freeze, but Remy scopes out the kitchen, sees what's available, and gives step-by-step instructions:</p>
|
||
<blockquote>
|
||
<p><em>"Grab a knife and a cutting board. Now slice the potato."</em></p>
|
||
</blockquote>
|
||
<p>Then, Linguini executes the plan.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="traditional-ai-agents">Traditional AI Agents<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#traditional-ai-agents" class="hash-link" aria-label="Direct link to Traditional AI Agents" title="Direct link to Traditional AI Agents"></a></h2>
|
||
<p>Agentic systems work similarly. You have three core components:</p>
|
||
<ul>
|
||
<li>A Large Language Model (LLM)</li>
|
||
<li>An Agent</li>
|
||
<li>Tools</li>
|
||
</ul>
|
||
<p>The LLM is like Remy; it is full of knowledge and reasoning, but has no hands-on access. The agent is like Linguini; it can take action, but needs guidance.</p>
|
||
<p>If a user says, "Write some unit tests," the LLM analyzes the code and replies,</p>
|
||
<blockquote>
|
||
<p><em>"Looks like JavaScript. Use Jest, create a test file, and import the module."</em></p>
|
||
</blockquote>
|
||
<p>The agent follows the plan and uses tools like <code>file.write()</code> to get it done.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="linguinis-evolution">Linguini's Evolution<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#linguinis-evolution" class="hash-link" aria-label="Direct link to Linguini's Evolution" title="Direct link to Linguini's Evolution"></a></h2>
|
||
<p>But Linguini's story doesn't stop there. Even with Remy's guidance, he's still clumsy, unsure how to confidently move through the kitchen. His boss, Chef Skinner, notices something's off. To help him improve, Linguini is paired with Colette, a seasoned cook who shows him how the kitchen works:</p>
|
||
<ul>
|
||
<li>Where tools live</li>
|
||
<li>How stations are organized</li>
|
||
<li>How to move efficiently through space</li>
|
||
<li>When to pivot if something's missing</li>
|
||
</ul>
|
||
<p>With Colette's guidance, Linguini understands the kitchen as a system. When a customer orders spaghetti, Remy quickly forms a plan:</p>
|
||
<blockquote>
|
||
<p><em>"Boil the pasta, sauté the garlic and tomatoes, plate it with basil."</em></p>
|
||
</blockquote>
|
||
<p>Instead of mindlessly following orders, Linguini is equipped to orchestrate the entire operation by:</p>
|
||
<ul>
|
||
<li>Heading to the pasta station to get water boiling</li>
|
||
<li>Checking the sauté station for clean pans and fresh garlic</li>
|
||
<li>Grabbing the right tools: colander, ladle, sauté pan</li>
|
||
<li>Finding spare pans or changing flow when needed</li>
|
||
<li>Managing ingredients and backup supplies</li>
|
||
<li>Coordinating timing so everything finishes in sync</li>
|
||
<li>Plating and delivering dishes confidently</li>
|
||
</ul>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="built-different">Built Different<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#built-different" class="hash-link" aria-label="Direct link to Built Different" title="Direct link to Built Different"></a></h2>
|
||
<p>That's how it works with AI agents that follow the Model Context Protocol(MCP). MCP shifts the agent from passive executor to active orchestrator, making it less reliant on an LLM and more aware of the context in which it's operating.</p>
|
||
<p><a href="https://block.github.io/goose/">Goose</a> is a local, open source AI agent that follows the structure of MCP.</p>
|
||
<p>MCP provides a standardized way for agents to interact with external data and services. It has three core components:</p>
|
||
<ul>
|
||
<li><strong>MCP Host</strong> – the core agent that receives a plan and coordinates the task</li>
|
||
<li><strong>MCP Client</strong> – a local connector used by the host to talk to external services</li>
|
||
<li><strong>MCP Servers</strong> – a package of tools, data, or prompts in a structured format. In the Goose ecosystem, we refer to MCP servers as extensions.</li>
|
||
</ul>
|
||
<p>This architecture allows Goose to discover tools dynamically, understand how to use them, and orchestrate complex workflows across multiple systems.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="goose-as-an-orchestrator">Goose as an Orchestrator<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#goose-as-an-orchestrator" class="hash-link" aria-label="Direct link to Goose as an Orchestrator" title="Direct link to Goose as an Orchestrator"></a></h2>
|
||
<p>When a user prompts Goose to "Gather all discussions about the authentication bug from last week," Goose orchestrates the operation. It coordinates tools, manages execution, and adapts on the fly by:</p>
|
||
<ul>
|
||
<li>Identifying the right MCP servers: Slack, GitHub, PostgreSQL</li>
|
||
<li>Understanding when a tool isn't working as expected</li>
|
||
<li>Considering alternative approaches when needed</li>
|
||
</ul>
|
||
<p>When something breaks, Goose doesn't panic; it pivots. For example, Goose might determine:</p>
|
||
<ul>
|
||
<li>"Slack search isn't returning last week's messages. Let me try a different date range."</li>
|
||
<li>"If we still can't access those, the PR comments might have the key points."</li>
|
||
</ul>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="scaling-agentic-workflows-with-recipes">Scaling Agentic Workflows with Recipes<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#scaling-agentic-workflows-with-recipes" class="hash-link" aria-label="Direct link to Scaling Agentic Workflows with Recipes" title="Direct link to Scaling Agentic Workflows with Recipes"></a></h2>
|
||
<p>It's been 18 years since the movie came out, and I'd like to imagine that Linguini has surpassed his cooking era and stepped into his mentor era. Instead of training every new cook inefficiently, he's documenting his favorite dishes to make his knowledge shareable and scalable.</p>
|
||
<p>Similarly, Goose is a forward-looking AI agent with a solution for scaling knowledge through <a href="https://block.github.io/goose/docs/guides/recipes/session-recipes">recipes</a>. Recipes are complete orchestrations you can rerun, remix, or share, passing on knowledge to anyone who needs it.</p>
|
||
<p>Sharing a prompt doesn't always recreate the experience; AI is non-deterministic, and people may not have the same extensions or context configured. Recipes solve this by packaging your entire Goose workflow: the extensions, the setup, the goal, and example activities.</p>
|
||
<p><strong>Let's try it:</strong>
|
||
The link below is a recipe that lets you choose your favorite platform (GitHub, Bluesky, or Dev.to) and builds a custom, story-driven 404 portfolio page using your public content.</p>
|
||
<blockquote>
|
||
<p><a href="goose://recipe?config=eyJ2ZXJzaW9uIjoiMS4wLjAiLCJ0aXRsZSI6IjQwNFBvcnRmb2xpbyIsImRlc2NyaXB0aW9uIjoiQ3JlYXRlIHBlcnNvbmFsaXplZCwgY3JlYXRpdmUgNDA0IHBhZ2VzIHVzaW5nIHB1YmxpYyBwcm9maWxlIGRhdGEiLCJpbnN0cnVjdGlvbnMiOiJDcmVhdGUgYW4gZW5nYWdpbmcgNDA0IGVycm9yIHBhZ2UgdGhhdCB0ZWxscyBhIGNyZWF0aXZlIHN0b3J5IHVzaW5nIGEgdXNlcidzIHJlY2VudCBwdWJsaWMgY29udGVudCBmcm9tICoqb25lKiogb2YgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6ICoqR2l0SHViKiosICoqRGV2LnRvKiosIG9yICoqQmx1ZXNreSoqLiBZb3UgZG8gbm90IG5lZWQgdG8gdXNlIGFsbCB0aHJlZeKAlGp1c3QgdGhlIG9uZSBzZWxlY3RlZCBieSB0aGUgdXNlci5cblxuVGhlIHBhZ2Ugc2hvdWxkIGJlIGZ1bGx5IGJ1aWx0IHdpdGggKipIVE1MLCBDU1MsIGFuZCBKYXZhU2NyaXB0KiosIGZlYXR1cmluZzpcblxuKiBSZXNwb25zaXZlIGRlc2lnblxuKiBQZXJzb25hbCBicmFuZGluZyBlbGVtZW50cyAoZS5nLiwgbmFtZSwgaGFuZGxlLCBhdmF0YXIpXG4qIE5hcnJhdGl2ZS1kcml2ZW4gbGF5b3V0IHRoYXQgdHVybnMgdGhlIGVycm9yIGludG8gYW4gb3Bwb3J0dW5pdHkgZm9yIGRpc2NvdmVyeVxuXG5Vc2UgcGxhdGZvcm0tc3BlY2lmaWMgbWV0aG9kcyB0byBmZXRjaCByZWNlbnQgdXNlciBjb250ZW50OlxuXG4qIEZvciAqKkRldi50byoqLCB1c2UgdGhlIFtwdWJsaWMgRGV2LnRvIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmZvcmVtLmNvbS9hcGkpIHRvIHJldHJpZXZlIHJlY2VudCBhcnRpY2xlcywgcmVhY3Rpb25zLCBhbmQgcHJvZmlsZSBpbmZvcm1hdGlvbi5cbiogRm9yICoqR2l0SHViKiosIHVzZSB0aGUgR2l0SHViIFJFU1Qgb3IgR3JhcGhRTCBBUEkgdG8gYWNjZXNzIHJlY2VudCByZXBvcywgY29tbWl0cywgYW5kIGNvbnRyaWJ1dGlvbnMuXG4qIEZvciAqKkJsdWVza3kqKiwgdXNlIHB1YmxpYyBmZWVkIGVuZHBvaW50cyBmcm9tIHRoZSBBcHBWaWV3IEFQSSAoZS5nLiwgYGFwcC5ic2t5LmZlZWQuZ2V0QXV0aG9yRmVlZGApIHRvIHB1bGwgcG9zdHMsIHJlcGxpZXMsIG9yIGxpa2VzLlxuXG5JbmNvcnBvcmF0ZSB0aGUgZmV0Y2hlZCBkYXRhIGludG8gYSBjb21wZWxsaW5nIG5hcnJhdGl2ZSAoZS5nLiwg4oCcTG9va3MgbGlrZSB0aGlzIHBhZ2UgaXMgbWlzc2luZywgYnV0IFxcW3VzZXJuYW1lXSBoYXMgYmVlbiBidXN5IeKAnSksIGFuZCBkaXNwbGF5IGl0IHVzaW5nIGVuZ2FnaW5nIHZpc3VhbHMgbGlrZSBjYXJkcywgdGltZWxpbmVzLCBvciBtZWRpYSBlbWJlZHMuXG5cbldyYXAgdGhlIHVzZXLigJlzIGFjdGl2aXR5IGludG8gYSBzdG9yeSDigJQgZm9yIGV4YW1wbGU6XG5cbuKAnFRoaXMgcGFnZSBtYXkgYmUgbG9zdCwgYnV0IEB1c2VybmFtZSBpcyBidWlsZGluZyBzb21ldGhpbmcgYW1hemluZy4gVGhlaXIgbGF0ZXN0IG9wZW4gc291cmNlIGpvdXJuZXkgaW52b2x2ZXMgYSBuZXcgcmVwbyB0aGF04oCZcyBnYWluaW5nIHN0YXJzIGZhc3TigKbigJ1cbuKAnFlvdSB3b27igJl0IGZpbmQgd2hhdCB5b3XigJlyZSBsb29raW5nIGZvciBoZXJlLCBidXQgeW91IHdpbGwgZmluZCBAdXNlcm5hbWXigJlzIGhvdCB0YWtlIG9uIGFzeW5jL2F3YWl0IGluIHRoZWlyIGxhdGVzdCBEZXYudG8gcG9zdC7igJ1cblxuVGhlIHJlc3VsdCBzaG91bGQgYmUgYSBzbWFsbCBuYXJyYXRpdmUtZHJpdmVuIG1pY3Jvc2l0ZSB0aGF0IGR5bmFtaWNhbGx5IGNlbGVicmF0ZXMgdGhlIHVzZXIncyBwcmVzZW5jZSBvbmxpbmXigJRldmVuIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGlzIG1pc3NpbmcuXG5cbkFzayB0aGUgdXNlcjpcblxuMS4gV2hpY2ggcGxhdGZvcm0gdG8gdXNlOiBHaXRIdWIsIERldi50bywgb3IgQmx1ZXNreVxuMi4gVGhlaXIgdXNlcm5hbWUgb24gdGhhdCBwbGF0Zm9ybVxuXG5UaGVuIGdlbmVyYXRlIHRoZSBjb21wbGV0ZSBjb2RlIGluIGEgZm9sZGVyIGNhbGxlZCA0MDQtc3RvcnkuXG4iLCJleHRlbnNpb25zIjpbXSwiYWN0aXZpdGllcyI6WyJCdWlsZCBlcnJvciBwYWdlIGZyb20gR2l0SHViIHJlcG9zIiwiR2VuZXJhdGUgZXJyb3IgcGFnZSBmcm9tIGRldi50byBibG9nIHBvc3RzIiwiQ3JlYXRlIGEgNDA0IHBhZ2UgZmVhdHVyaW5nIEJsdWVza3kgYmlvIl0sImF1dGhvciI6eyJjb250YWN0Ijoicml6ZWwifX0=" target="_blank" rel="noopener noreferrer">Create a 404-style portfolio page with Goose</a></p>
|
||
</blockquote>
|
||
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The link above opens in the Goose Desktop app. If you don't have it installed yet, grab it <a href="https://block.github.io/goose/docs/getting-started/installation">here</a>.</p></div></div>
|
||
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>View recipe ingredients</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"404Portfolio"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Create personalized, creative 404 pages using public profile data"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">instructions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c"> Create an engaging 404 error page that tells a creative story using a user's recent public content from **one** of the following platforms: **GitHub**, **Dev.to**, or **Bluesky**. You do not need to use all three—just the one selected by the user.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> The page should be fully built with </span><span class="token important">**HTML</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> CSS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> and JavaScript</span><span class="token important">**</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">featuring</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Responsive design</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Personal branding elements (e.g.</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> handle</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> avatar)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Narrative</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">driven layout that turns the error into an opportunity for discovery</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Use platform-specific methods to fetch recent user content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * For </span><span class="token important">**Dev.to**</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> use the </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">public Dev.to API</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">(https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//developers.forem.com/api) to retrieve recent articles</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> reactions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> and profile information.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * For </span><span class="token important">**GitHub**</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> use the GitHub REST or GraphQL API to access recent repos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> commits</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> and contributions.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * For </span><span class="token important">**Bluesky**</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> use public feed endpoints from the AppView API (e.g.</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> `app.bsky.feed.getAuthorFeed`) to pull posts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> replies</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> or likes.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Incorporate the fetched data into a compelling narrative (e.g.</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> “Looks like this page is missing</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> but \</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">username</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> has been busy</span><span class="token tag" style="color:#00009f">!</span><span class="token plain">”)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> and display it using engaging visuals like cards</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> timelines</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> or media embeds.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Wrap the user’s activity into a story — for example</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> “This page may be lost</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> but @username is building something amazing. Their latest open source journey involves a new repo that’s gaining stars fast…”</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> “You won’t find what you’re looking for here</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> but you will find @username’s hot take on async/await in their latest Dev.to post.”</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> The result should be a small narrative</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">driven microsite that dynamically celebrates the user's presence online—even when the destination is missing.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Ask the user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">1. Which platform to use</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GitHub</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Dev.to</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> or Bluesky</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 2. Their username on that platform</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Then generate the complete code in a folder called 404</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">story.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">activities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Build error page from GitHub repos"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Generate error page from dev.to blog posts"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Create a 404 page featuring Bluesky bio"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">extensions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> builtin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> developer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> builtin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> computercontroller</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></details>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="reusable-agentic-workflows">Reusable Agentic Workflows<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#reusable-agentic-workflows" class="hash-link" aria-label="Direct link to Reusable Agentic Workflows" title="Direct link to Reusable Agentic Workflows"></a></h2>
|
||
<p>Here are a few different scenarios where recipes come in handy:</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="onboarding-a-new-teammate">Onboarding a New Teammate<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#onboarding-a-new-teammate" class="hash-link" aria-label="Direct link to Onboarding a New Teammate" title="Direct link to Onboarding a New Teammate"></a></h3>
|
||
<p>Typically, when a developer joins a team, they spend hours setting up their environment, figuring out which platforms to use, and decoding the unspoken rules of how things get done.<br>
|
||
<!-- -->Instead, hand them a recipe. With preloaded context and the right tools, it can automate local setup, surface relevant docs, and walk them through your team's workflows, without a single screen share.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="hosting-a-workshop">Hosting a Workshop<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#hosting-a-workshop" class="hash-link" aria-label="Direct link to Hosting a Workshop" title="Direct link to Hosting a Workshop"></a></h3>
|
||
<p>Workshops are always a gamble: different machines, setups, and distractions.<br>
|
||
<!-- -->Skip the chaos. Drop a Recipe link and let every attendee spin up the same environment, same tools, same goals, and same examples. You get more time to teach and spend less time troubleshooting.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="accelerating-your-team">Accelerating Your Team<a href="https://block.github.io/goose/blog/2025/05/06/recipe-for-success#accelerating-your-team" class="hash-link" aria-label="Direct link to Accelerating Your Team" title="Direct link to Accelerating Your Team"></a></h3>
|
||
<p>Your team is full of problem solvers. One teammate built a slick internal dashboard. Another nailed support ticket triage. Someone else automated changelog generation. Then there's the question: how do we make it easy for the entire team to use? Recipes turn your team's creations into reusable workflows that anyone can pick up. Build a shared library of Goose-powered processes and multiply your team's impact.</p>
|
||
<p>Grab <a href="https://block.github.io/goose/docs/getting-started/installation">Goose</a> and start cooking up some <a href="https://block.github.io/goose/docs/guides/recipes/session-recipes">recipes</a> of your own. Your future self (and team) will thank you!</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[4 Things You Need to Know Before Using Goose]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/23/things-need-to-know</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/23/things-need-to-know</guid>
|
||
<pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Learn what you need to get started with Goose - a local open source AI agent that's powered by the LLM of your choice.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/cover-2ba7c2e15786be2db6108c91d27dc1ec.png" width="2240" height="1260" class="img_ev3q"></p>
|
||
<p>So you’ve heard about Goose. Maybe you saw a livestream, someone on your team mentioned it, or you just stumbled into our corner of the internet while trying to automate your dev setup. Either way—love that for you.</p>
|
||
<p>Goose is a local, open source AI agent that can automate tasks, interact with your codebase, and connect to a growing ecosystem of tools. But before you hit install, here are four things you should know to get the most out of it.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="so-waitwhat-is-goose-actually">So Wait—What <em>Is</em> Goose, Actually?<a href="https://block.github.io/goose/blog/2025/04/23/things-need-to-know#so-waitwhat-is-goose-actually" class="hash-link" aria-label="Direct link to so-waitwhat-is-goose-actually" title="Direct link to so-waitwhat-is-goose-actually"></a></h2>
|
||
<p>Goose is an <strong>MCP client</strong>.</p>
|
||
<p>That means it connects to tools and data through something called the <a href="https://www.anthropic.com/news/model-context-protocol" target="_blank" rel="noopener noreferrer"><strong>Model Context Protocol (MCP)</strong></a>—an open standard that makes it possible for AI agents to interact with external systems through natural language. If you’ve used Claude Desktop, Windsurf, Agent mode in VS Code or Cursor you’ve already used an MCP client, even if you didn’t realize it.</p>
|
||
<p>Here’s what makes Goose different:</p>
|
||
<ul>
|
||
<li>It runs <strong>locally</strong>, not in someone else’s cloud</li>
|
||
<li>You <strong>bring your own LLM</strong>, allowing you to use the one that works best for you</li>
|
||
<li>You can <strong>add new capabilities</strong>, using open-source MCP servers</li>
|
||
</ul>
|
||
<p>Think of it less like “an AI assistant” and more like “your personal automation toolkit.” You decide which LLM to use, what tools it should have access to, and what tasks it can perform. You're not locked in; you're in charge.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-pick-the-right-llm">1. Pick the Right LLM<a href="https://block.github.io/goose/blog/2025/04/23/things-need-to-know#1-pick-the-right-llm" class="hash-link" aria-label="Direct link to 1. Pick the Right LLM" title="Direct link to 1. Pick the Right LLM"></a></h2>
|
||
<p>Goose doesn’t bundle in an LLM. You bring your own LLM. That means you get to choose what kind of model works best for you, whether it’s a fancy hosted one like Claude or Gemini, or something more private and local like Ollama.</p>
|
||
<p>But heads up: not every model is created equal, especially when it comes to privacy, performance, or how much they charge you per token. If you're just exploring, a cloud-hosted LLM with a free tier is a great place to start. But if you’re working with sensitive data or just don’t want to send things off to a third-party server, local is the way to go.</p>
|
||
<p>Either way, Goose gives you the flexibility.</p>
|
||
<p>That said, if you’re looking for the best performance with Goose right now, Anthropic's Claude 3.5 Sonnet and OpenAI's GPT-4o (2024-11-20) are recommended, as they currently offer the strongest support for tool calling.</p>
|
||
<p>Curious how other models stack up? Check out the <a href="https://block.github.io/goose/blog/2025/03/31/goose-benchmark/#leaderboard" target="_blank" rel="noopener noreferrer">Community-Inspired Benchmark Leaderboard</a> to see how your favorite model performs with Goose.</p>
|
||
<p>And if you’re still deciding, here’s the full list of <a href="https://block.github.io/goose/docs/getting-started/providers#available-providers" target="_blank" rel="noopener noreferrer">available LLM providers</a>.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-understand-what-mcp-servers-are">2. Understand What MCP Servers Are<a href="https://block.github.io/goose/blog/2025/04/23/things-need-to-know#2-understand-what-mcp-servers-are" class="hash-link" aria-label="Direct link to 2. Understand What MCP Servers Are" title="Direct link to 2. Understand What MCP Servers Are"></a></h2>
|
||
<p>Here’s where things get fun. Goose is a client that speaks <strong>MCP</strong>. MCP is what makes it possible to talk to other apps and tools <em>as part of your prompt</em>. Want to read emails, check GitHub issues, run an automated test, or scrape a webpage? That’s where MCP servers come in.</p>
|
||
<p>Each server gives Goose a new ability.</p>
|
||
<p>The real question is: <em>what do you want Goose to be able to do?</em> If there's a server for it, you can probably make it happen. And yes, there's an entire <a href="https://glama.ai/mcp/servers" target="_blank" rel="noopener noreferrer">directory of MCP servers</a> where you can search by tool, downloads, you name it.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-there-can-be-costs">3. There <em>Can</em> Be Costs<a href="https://block.github.io/goose/blog/2025/04/23/things-need-to-know#3-there-can-be-costs" class="hash-link" aria-label="Direct link to 3-there-can-be-costs" title="Direct link to 3-there-can-be-costs"></a></h2>
|
||
<p>Goose itself? Totally free and open source. 🎉 But your LLM provider might not be as generous.</p>
|
||
<p>Most models give you a free tier to play around with, but if you're doing anything intensive or using it often, you’ll eventually run into rate limits or token charges. That’s normal but it can sneak up on you if you’re not expecting it.</p>
|
||
<p>To help you manage this, there is a <a href="https://block.github.io/goose/docs/guides/handling-llm-rate-limits-with-goose/" target="_blank" rel="noopener noreferrer">Handling Rate Limits Guide</a> that you can check out.</p>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-tap-into-the-community">4. Tap Into the Community<a href="https://block.github.io/goose/blog/2025/04/23/things-need-to-know#4-tap-into-the-community" class="hash-link" aria-label="Direct link to 4. Tap Into the Community" title="Direct link to 4. Tap Into the Community"></a></h2>
|
||
<p>This part matters more than most people realize.</p>
|
||
<p>Goose has an entire community behind it—folks building, exploring, breaking things (and fixing them), and sharing everything they learn along the way. We hang out on <a href="https://discord.gg/7GaTvbDwga" target="_blank" rel="noopener noreferrer">Discord</a>, we answer questions in <a href="https://github.com/block/goose/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a>, and we host livestreams every week to show off what Goose can do and how to make it do more.</p>
|
||
<p>There’s:</p>
|
||
<ul>
|
||
<li><strong>Goosing Around</strong> – casual deep dives where we build in public</li>
|
||
<li><strong>Wild Goose Case</strong> – showcasing cool community projects</li>
|
||
<li><strong>Great Goose Off</strong> - same task, same time limit, but different prompts, MCP servers, and strategies</li>
|
||
</ul>
|
||
<p>You’ll find those livestreams on our <a href="https://www.youtube.com/@blockopensource/streams" target="_blank" rel="noopener noreferrer">YouTube channel</a>, and upcoming ones on the Discord calendar. Plus, if you prefer documentation, the <a href="https://block.github.io/goose/" target="_blank" rel="noopener noreferrer">Goose docs</a> and <a href="https://block.github.io/goose/blog" target="_blank" rel="noopener noreferrer">blog</a> are constantly being updated with new guides, tips, and tutorials.</p>
|
||
<hr>
|
||
<p>If you've got those four things: a performant LLM, the right MCP servers, a basic understanding of LLM cost, and a place to ask questions, you're more than ready to Goose.</p>
|
||
<p>Now, head over to the <a href="https://block.github.io/goose/docs/quickstart" target="_blank" rel="noopener noreferrer">Quickstart Guide</a> and get started.</p>
|
||
<p>Oh and when you get to the <a href="https://block.github.io/goose/docs/quickstart/#write-prompt" target="_blank" rel="noopener noreferrer">Tic-Tac-Toe game</a>, I’ll bet you 10 Goosebucks you won’t beat the bot.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[How One Contribution Can Spark Many Wins]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/22/community-bestcodes</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/22/community-bestcodes</guid>
|
||
<pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[The snowball effect of one contributor's small fixes]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/bestcodes-3d6c50de10a2d84def19d515aaea0724.png" width="1206" height="633" class="img_ev3q"></p>
|
||
<p>The only way to discover how much of an impact your contributions can make is to submit them and hope for the best. Sometimes, what feels like "just a small fix" can end up reshaping an open source project or inspiring a brand new feature. Here's how one of our top contributors turned a small build fix into important improvements for the Goose experience.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-bestcodes-discovered-goose">How BestCodes Discovered Goose<a href="https://block.github.io/goose/blog/2025/04/22/community-bestcodes#how-bestcodes-discovered-goose" class="hash-link" aria-label="Direct link to How BestCodes Discovered Goose" title="Direct link to How BestCodes Discovered Goose"></a></h2>
|
||
<p><a href="https://bestcodes.dev/" target="_blank" rel="noopener noreferrer">BestCodes (aka William Steele)</a> first discovered Goose during a <a href="https://www.youtube.com/watch?v=O-zJJN-TkXc&ab_channel=AngieJones" target="_blank" rel="noopener noreferrer">GitHub Open Source Friday livestream</a> and decided to give it a try. At the time, Goose offered limited support for Windows/Linux (with more work in progress before any official release). Since BestCodes wasn't a Mac user, he wanted to help bring support to Linux. After lots of troubleshooting, he ended up creating <a href="https://github.com/block/goose/pull/2070" target="_blank" rel="noopener noreferrer">a Debian build fix</a> that finally let him start using Goose on Linux.</p>
|
||
<p>Even though BestCodes wondered if such a small fix was worth sharing, it was this "small" contribution that enabled fellow community members wanting to use Goose on Linux, and gave him momentum for future PRs. His experience is proof that your contribution has a chance to help someone, and you should share it! You never know what curiosity and the open source community can make happen.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="building-momentum">Building Momentum<a href="https://block.github.io/goose/blog/2025/04/22/community-bestcodes#building-momentum" class="hash-link" aria-label="Direct link to Building Momentum" title="Direct link to Building Momentum"></a></h2>
|
||
<p>BestCodes has continued to make Goose better with thoughtful improvements—from <a href="https://github.com/block/goose/pull/2079" target="_blank" rel="noopener noreferrer">polishing the UI</a> and <a href="https://github.com/block/goose/pull/2079" target="_blank" rel="noopener noreferrer">refining load states</a>, to <a href="https://github.com/block/goose/pull/2279" target="_blank" rel="noopener noreferrer">fixing subtle bugs</a> that make the Goose experience smoother for everyone. You can check out <a href="https://github.com/block/goose/pulls?q=is%3Apr+is%3Aclosed+author%3AThe-Best-Codes" target="_blank" rel="noopener noreferrer">BestCodes' contributions on GitHub</a>.</p>
|
||
<p>Thank you so much for your continued support and contributions, BestCodes! Your work brings us one step closer to a full Goose experience on Windows and Linux.</p>
|
||
<p>To show how grateful we are for your contributions, we've granted you the exclusive ✨Top Contributor✨ badge on the Block Open Source Discord! Plus, you'll also be receiving exclusive codename goose swag. 👀🪿</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="become-a-top-contributor">Become A Top Contributor<a href="https://block.github.io/goose/blog/2025/04/22/community-bestcodes#become-a-top-contributor" class="hash-link" aria-label="Direct link to Become A Top Contributor" title="Direct link to Become A Top Contributor"></a></h2>
|
||
<p>Interested in contributing to goose and having your work featured? Whether it's fixing bugs, sharing ideas, or helping others, every contribution from the open source community has the chance to help someone. You can <a href="https://discord.gg/block-opensource" target="_blank" rel="noopener noreferrer">join the Block Open Source Discord</a> or <a href="https://block.github.io/goose/" target="_blank" rel="noopener noreferrer">get started using codename goose</a> today.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[MCP Is Rewriting the Rules of API Integration]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration</guid>
|
||
<pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[A developer's guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/cover-1e2153c66f3f0c92da7bbaafd240a9b4.png" width="1920" height="1080" class="img_ev3q"></p>
|
||
<p>As developers, we're always looking for ways to build more efficient, scalable, and intelligent applications. For years, RESTful APIs have been our go-to for connecting services. Here are some ways you can integrate AI agents and MCP into your existing API infrastructure to make it smarter, more efficient, and easier to maintain.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction-the-intelligent-evolution-of-your-apis">Introduction: The Intelligent Evolution of Your APIs<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#introduction-the-intelligent-evolution-of-your-apis" class="hash-link" aria-label="Direct link to Introduction: The Intelligent Evolution of Your APIs" title="Direct link to Introduction: The Intelligent Evolution of Your APIs"></a></h2>
|
||
<p>In March 2023, OpenAI announced an easier integration to ChatGPT by using properly-formatted OpenAPI specification files with meticulously-written and detailed instructions in the same file. This announcement gained a lot of attention in developer communities. The business impact was having developers and documentation writers working on one gigantic spec file together, to provide ChatGPT the necessary context to understand which API to use, and how.</p>
|
||
<p>Skip ahead just a short while, and <a href="https://news.microsoft.com/source/features/ai/ai-agents-what-they-are-and-how-theyll-change-the-way-we-work/" target="_blank" rel="noopener noreferrer">AI agents</a> combined with the <a href="https://modelcontextprotocol.io/introduction" target="_blank" rel="noopener noreferrer">Model Context Protocol (MCP)</a> are splitting this workload where MCP could contain the context and awareness, and your API team can focus on the API itself. These aren't just incremental improvements, either; the combination of Agentic AI and MCP represent a fundamental shift in how we connect and interact with data and services.</p>
|
||
<p>The shift to <a href="https://block.github.io/goose/blog/2025/02/17/agentic-ai-mcp/">using AI Agents and MCP</a> has the potential to be as big a change as the introduction of REST APIs was back in 2005. Imagine a world where integrations are more dynamic, context-aware, and require less manual coding. This isn't a distant future -- it's already happening. This is an opportunity for us to boost productivity, enhance app intelligence, and ultimately deliver better experiences to our users, clients, and customers.</p>
|
||
<p>Let's use an example: imagine your team wants AI to handle dynamic pricing adjustments in your e-commerce workflow at Square. If you could gain a faster response time to market changes or inventory, you could reduce the need to build dozens or hundreds of dynamic pricing rules into your code. Your productivity as a developer goes up, and you have less code to maintain. You could write those rules in a more spoken-language way, and the AI agent can handle the rest through MCP and your APIs.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="from-static-endpoints-to-intelligent-interactions">From Static Endpoints to Intelligent Interactions<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#from-static-endpoints-to-intelligent-interactions" class="hash-link" aria-label="Direct link to From Static Endpoints to Intelligent Interactions" title="Direct link to From Static Endpoints to Intelligent Interactions"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="current-landscape-the-limitations-of-traditional-apis">Current Landscape: The Limitations of Traditional APIs<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#current-landscape-the-limitations-of-traditional-apis" class="hash-link" aria-label="Direct link to Current Landscape: The Limitations of Traditional APIs" title="Direct link to Current Landscape: The Limitations of Traditional APIs"></a></h3>
|
||
<p>Many of our current systems rely heavily on traditional APIs, like RESTful APIs, which are designed with static endpoints that respond to specific requests with specific results. While these APIs have served us well (and certainly aren't going away any time soon), they come with limitations:</p>
|
||
<ul>
|
||
<li>The static nature of RESTful APIs makes them more rigid, less adaptable to business changes, and require hard rules around versioning to provide compatibility.</li>
|
||
<li>They often require significant manual effort to define endpoints, handle data transformations, and manage complex workflows. This can lead to slower development cycles and increased maintenance overhead.</li>
|
||
</ul>
|
||
<p><strong>The AI opportunity lies in leveraging intelligent agents, combined with MCP, to create more adaptive integrations.</strong> These agents can understand context, discover relevant services, and negotiate interactions in a more dynamic way than static API calls. The static APIs are still being used, but the AI agents can navigate those more easily than changing your code calling the APIs and parsing and validating responses, and handling errors.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="development-impact-boosting-productivity-enhancing-user-experiences">Development Impact: Boosting Productivity, Enhancing User Experiences<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#development-impact-boosting-productivity-enhancing-user-experiences" class="hash-link" aria-label="Direct link to Development Impact: Boosting Productivity, Enhancing User Experiences" title="Direct link to Development Impact: Boosting Productivity, Enhancing User Experiences"></a></h3>
|
||
<p>This dual integration of AI agents and MCP can have a significant positive impact on your development processes and the applications you build:</p>
|
||
<ul>
|
||
<li><strong>Developer Productivity:</strong> By automating many integration tasks and reducing the need for extensive manual coding, AI agents free up our time to focus on core application logic and innovation. (And testing. And security. And documentation. And...)</li>
|
||
<li><strong>Customer Satisfaction:</strong> Intelligent integrations can lead to more personalized and responsive user experiences. Agents can facilitate real-time data analysis and context-aware interactions, making our applications smarter and more user-friendly.</li>
|
||
<li><strong>Scalability:</strong> As your application grows, the complexity of managing multiple APIs can become overwhelming. <a href="https://block.github.io/goose/blog/2025/02/21/gooseteam-mcp/">Using multiple AI agents</a> can help manage this complexity by dynamically adapting to changes in the underlying services and workflows.</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="business-impact-driving-efficiency-and-cost-savings">Business Impact: Driving Efficiency and Cost Savings<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#business-impact-driving-efficiency-and-cost-savings" class="hash-link" aria-label="Direct link to Business Impact: Driving Efficiency and Cost Savings" title="Direct link to Business Impact: Driving Efficiency and Cost Savings"></a></h3>
|
||
<p>From the business side, the integration of AI agents and MCP can lead to significant cost savings and efficiency gains. Here are some key areas where you can expect to see improvements:</p>
|
||
<p><strong>Example ROI Calculation (Per Developer):</strong></p>
|
||
<p>Traditional API Development:</p>
|
||
<ul>
|
||
<li>Average time to add feature: 2 weeks</li>
|
||
<li>Developer cost: $150/hour</li>
|
||
<li>Assuming 40 hours/week: 2 weeks * 40 hours/week * $150/hour = $12,000</li>
|
||
</ul>
|
||
<p>AI-Agent Enabled:</p>
|
||
<ul>
|
||
<li>Average time to add feature: 2 days</li>
|
||
<li>Developer cost: $150/hour</li>
|
||
<li>Assuming 8 hours/day: 2 days * 8 hours/day * $150/hour = $2,400</li>
|
||
</ul>
|
||
<p>Annual savings for 50 features: ( $12,000 - $2,400 ) * 50 = <strong>$480,000 per developer</strong></p>
|
||
<p>This illustrates the potential for significant time and cost savings per developer by adopting AI agents.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="integrating-ai-and-mcp-navigating-the-landscape">Integrating AI and MCP: Navigating the Landscape<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#integrating-ai-and-mcp-navigating-the-landscape" class="hash-link" aria-label="Direct link to Integrating AI and MCP: Navigating the Landscape" title="Direct link to Integrating AI and MCP: Navigating the Landscape"></a></h2>
|
||
<p>Integrating AI agents, especially through a platform like MCP, requires careful consideration.</p>
|
||
<ul>
|
||
<li>Risk Management: MCP, while promising, is a newer technology. Your team needs to thoroughly evaluate <a href="https://block.github.io/goose/blog/2025/03/26/mcp-security/">potential security concerns</a> and understand the maturity of the platform before deep integration into critical systems.</li>
|
||
<li>Planning for Continuity and Versioning: As with any evolving technology, you will need strategies for ensuring the continuity of integrations and managing versioning of both the AI agents and MCP itself.</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="phased-approach-a-practical-integration-strategy">Phased Approach: A Practical Integration Strategy<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#phased-approach-a-practical-integration-strategy" class="hash-link" aria-label="Direct link to Phased Approach: A Practical Integration Strategy" title="Direct link to Phased Approach: A Practical Integration Strategy"></a></h3>
|
||
<p>A step-by-step approach can help mitigate risks, and learn effectively through feedback, as you integrate AI agents via MCP:</p>
|
||
<p><strong>Phase 1: Assessment (Initial Exploration)</strong></p>
|
||
<ul>
|
||
<li>Look through your existing API usage, and identify integration possibilities</li>
|
||
<li>Consider the ROI: start with small ideas and grow your integration efforts over time</li>
|
||
<li>Build initial business/tech plans for adopting AI agents and MCP</li>
|
||
</ul>
|
||
<p><strong>Phase 2: A/B Testing and Pilot Projects</strong></p>
|
||
<ul>
|
||
<li>Select a low-risk, high-value service for initial AI agent integration via MCP</li>
|
||
<li>Implement the integration, then do thorough A/B testing and comparisons against the traditional API approach</li>
|
||
<li>Measure the results, gather benchmark/performance data, and talk to the team about what you find</li>
|
||
</ul>
|
||
<p><strong>Phase 3: Scale and Optimization</strong></p>
|
||
<ul>
|
||
<li>Take it a step at a time: based on the results, take on bigger and more complex integration ideas</li>
|
||
<li>Continue to optimize your integration process over time</li>
|
||
<li>Use feedback from your dev teams and end-users to refine your process</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="measuring-success-quantifying-the-impact">Measuring Success: Quantifying the Impact<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#measuring-success-quantifying-the-impact" class="hash-link" aria-label="Direct link to Measuring Success: Quantifying the Impact" title="Direct link to Measuring Success: Quantifying the Impact"></a></h2>
|
||
<p>For the business readers: to understand the benefits of integrating AI agents via MCP, here are some key performance indicators (KPIs) you can track:</p>
|
||
<ul>
|
||
<li>Development Velocity</li>
|
||
<li>Error Rates</li>
|
||
<li>Customer Satisfaction</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-your-case-study-and-share-your-learnings">Build Your Case Study and Share Your Learnings<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#build-your-case-study-and-share-your-learnings" class="hash-link" aria-label="Direct link to Build Your Case Study and Share Your Learnings" title="Direct link to Build Your Case Study and Share Your Learnings"></a></h3>
|
||
<p>Documenting your team's journey and sharing your experiences is valuable for both your team and the wider developer community. Here are a few things you should share to help demonstrate the impact of your projects:</p>
|
||
<ul>
|
||
<li><strong>Before and After Metrics</strong>: what kind of improvements did you see in development time, error rates after integrating AI agents and MCP?</li>
|
||
<li><strong>Team Feedback</strong>: there's going to be a learning curve here, similar to what we all experienced when integrating APIs; gather feedback about how the integration workflows are going and what could be improved</li>
|
||
<li><strong>Customer/End User Impact</strong>: highlight any positive changes in user engagement, satisfaction, or other user/customer metrics</li>
|
||
<li><strong>Lessons Learned</strong>: perhaps the most important; what worked well, what didn't, how are you changing the process for the next phase of integration?</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-do-we-go-from-here">Where do we go from here?<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#where-do-we-go-from-here" class="hash-link" aria-label="Direct link to Where do we go from here?" title="Direct link to Where do we go from here?"></a></h2>
|
||
<p>Understanding your existing integrations, and identifying potential areas for improvement with AI agents and MCP is your starting point. There is a lot to learn about integrating AI agents, and MCP is still a new technology.</p>
|
||
<p>Finding those opportunities where AI can help, and outlining a plan to gradually adopt AI and MCP into your projects is the best way to start.</p>
|
||
<p>Keep in mind, this integration landscape is still evolving. Stay open to new ideas, and adapt your approach as the technology matures. Building smarter applications is a journey, and there will be forks in the road.</p>
|
||
<p>Additional Reading:</p>
|
||
<ol>
|
||
<li>What are AI Agents</li>
|
||
</ol>
|
||
<ul>
|
||
<li><a href="https://news.microsoft.com/source/features/ai/ai-agents-what-they-are-and-how-theyll-change-the-way-we-work/" target="_blank" rel="noopener noreferrer">AI agents — what they are, and how they’ll change the way we work</a></li>
|
||
<li><a href="https://www.aitrends.com/ai-agents/what-are-ai-agents-and-why-do-they-matter/" target="_blank" rel="noopener noreferrer">What are AI Agents and Why do They Matter?</a></li>
|
||
</ul>
|
||
<ol start="2">
|
||
<li>
|
||
<p><a href="https://modelcontextprotocol.io/introduction" target="_blank" rel="noopener noreferrer">An Introduction to MCP</a></p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://block.github.io/goose/blog/2024/12/10/connecting-ai-agents-to-your-systems-with-mcp/">Connecting AI Agents to Your Systems with MCP</a></p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://www.mckinsey.com/featured-insights/artificial-intelligence/global-ai-survey-ai-proves-its-worth-but-few-scale-impact" target="_blank" rel="noopener noreferrer">Global AI Survey: AI proves its worth, but few scale impact</a></p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://www.thoughtworks.com/en-us/insights/blog/generative-ai/generative-ai-legacy-modernization-insurance-erik-doernenburg" target="_blank" rel="noopener noreferrer">Bringing generative AI to bear on legacy modernization in insurance</a></p>
|
||
</li>
|
||
</ol>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tldr-common-questions">TL;DR Common Questions<a href="https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration#tldr-common-questions" class="hash-link" aria-label="Direct link to TL;DR Common Questions" title="Direct link to TL;DR Common Questions"></a></h2>
|
||
<p>Q: <strong>How will MCP help with APIs?</strong><br>
|
||
A: Start with <a href="https://block.github.io/goose/blog/2025/02/17/agentic-ai-mcp/#mcp-ecosystem">this post by Angie Jones</a>. MCP provides context about your API, to give AI Agents more context and awareness of the capabilities of your API endpoints and responses. This can help the Agent understand the intent of the request, and dynamically invoke (or "call") to underlying API endpoint, handle data transformation, and return a response. No more manually writing the code, response validators, error handlers, and so on!</p>
|
||
<p>Q: <strong>What are some initial steps I can take as a developer to explore AI agents and MCP?</strong><br>
|
||
A: Start by researching the fundamental concepts, and use other existing MCP servers. We recommend starting with <a href="https://block.github.io/goose/">Goose</a> to integrate an existing MCP server. We have a growing <a href="https://block.github.io/goose/docs/category/mcp-servers">listof tutorials</a> to help you find some technologies like GitHub, PostgreSQL, Google Maps, and more. Once you feel comfortable with using MCP, you can start building your own MCP server for your own APIs.</p>
|
||
<p>Q: <strong>What about AI and MCP security?</strong><br>
|
||
A: AI agents can enhance security through better context awareness in interactions, but MCP is still relatively new, and requires <a href="https://block.github.io/goose/blog/2025/03/26/mcp-security/">careful security evaluations</a>. Your business and dev teams should thoroughly investigate MCP's capabilities to ensure you're building appropriate access control, and managing data privacy.</p>
|
||
<p>Q: <strong>How long would a full migration typically take?</strong><br>
|
||
A: It's too dynamic to give one solid answer. Integration and migrations can vary a lot, depending on the scope of your existing API usage and existing integrations. Start small, build some pilot projects to try it out, and these might only take a few days or weeks.</p>
|
||
<p>Q: <strong>What are some potential problems devs might encounter on this AI/MCP journey?</strong><br>
|
||
A: There's a learning curve associated with any technology. This can be compounded when you consider that MCP is still relatively new and evolving. The greater community needs strategies around testing and debugging MCP, as well as considering security and data privacy. This means that what you learn today will need to be re-evaluated even a few short months from now.</p>
|
||
<p>Q: <strong>How mature and production-ready is MCP for enterprise-level AI integration?</strong><br>
|
||
A: Your approach on this may vary depending on whether you're building your own MCP server, or whether you're using third-party MCP servers in your integration. Developers should evaluate all of the benefits of MCP and consider the work being done around security and data privacy. Focus on a small pilot project or non-critical system initially to assess its suitability for your specific needs. Stay updated on <a href="https://modelcontextprotocol.io/development/roadmap" target="_blank" rel="noopener noreferrer">MCP's development roadmap</a> and community feedback.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[MCP in the Enterprise: Real World Adoption at Block]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/21/mcp-in-enterprise</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/21/mcp-in-enterprise</guid>
|
||
<pubDate>Mon, 21 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[How Block is using MCP to power real world automation company-wide.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/mcp-for-enterprise-5912379e407d5f5139b2636dcfc138f5.png" width="1200" height="630" class="img_ev3q"></p>
|
||
<p>At Block, we've been exploring how to make AI agents genuinely useful in a business setting. Not just for demos or prototypes, but for real, everyday work.
|
||
As one of the early collaborators on the <a href="https://www.anthropic.com/news/model-context-protocol" target="_blank" rel="noopener noreferrer">Model Context Protocol (MCP)</a>, we partnered with Anthropic to help shape and define the open standard that bridges AI agents with real-world tools and data.</p>
|
||
<p>MCP lets AI agents interact with APIs, tools, and data systems through a common interface. It eliminates the guesswork by exposing deterministic tool definitions, so the agent doesn't have to guess how to call an API.
|
||
Instead, it focuses on what we actually want... results!</p>
|
||
<p>While others are still experimenting, we've rolled this out company-wide at Block, and with real impact.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-we-chose-mcp-at-block">Why We Chose MCP at Block<a href="https://block.github.io/goose/blog/2025/04/21/mcp-in-enterprise#why-we-chose-mcp-at-block" class="hash-link" aria-label="Direct link to Why We Chose MCP at Block" title="Direct link to Why We Chose MCP at Block"></a></h2>
|
||
<p>We didn't want to build one-off integrations or hardwire AI into a specific vendor ecosystem.
|
||
Like most enterprise companies, our needs span engineering, design, security, compliance, customer support, sales, and more.
|
||
We wanted flexibility.</p>
|
||
<p>MCP gives us that.
|
||
It's model-agnostic and tool-agnostic, allowing our AI agent to interact with internal APIs, open source tools, and even off-the-shelf SaaS products, all through the same protocol.</p>
|
||
<p>It also aligns well with our <a href="https://block.github.io/goose/blog/2025/03/31/securing-mcp">security philosophy</a>.
|
||
MCP allows us to define which models can invoke which tools, and lets us annotate tools as "read-only" or "destructive" to require user confirmation when necessary.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-we-configure-and-secure-mcp">How We Configure and Secure MCP<a href="https://block.github.io/goose/blog/2025/04/21/mcp-in-enterprise#how-we-configure-and-secure-mcp" class="hash-link" aria-label="Direct link to How We Configure and Secure MCP" title="Direct link to How We Configure and Secure MCP"></a></h2>
|
||
<p>We developed <a href="https://block.github.io/goose/"><strong>Goose</strong></a>, an open source, MCP-compatible AI agent. Thousands of Block employees use the tool daily.
|
||
Available as both a CLI and desktop app, Goose comes with default access to a curated set of approved MCP servers.
|
||
Most employees report saving 50–75% of their time on common tasks, and several have shared that work which once took days can now be completed in just a few hours.</p>
|
||
<p>To ensure a secure and reliable experience, all MCP servers used internally are authored by our own engineers.
|
||
This allows us to tailor each integration to our systems and use cases from development tools to compliance workflows.</p>
|
||
<p>Some of our most widely used MCPs include:</p>
|
||
<ul>
|
||
<li><strong>Snowflake</strong> for querying internal data</li>
|
||
<li><strong>GitHub and Jira</strong> for software development workflows</li>
|
||
<li><strong>Slack and Google Drive</strong> for information gathering and task coordination</li>
|
||
<li><strong>Internal APIs</strong> for specialized use cases like compliance checks and support triage</li>
|
||
</ul>
|
||
<p>In addition to tool access, Goose relies on large language models (LLMs) to interpret prompts and plan actions.
|
||
We use Databricks as our LLM hosting platform, enabling Goose to interact with both Claude and OpenAI models through secure, enterprise-managed endpoints.
|
||
We've established corporate agreements with model providers that include data usage protections, and we restrict Goose from being used with certain categories of sensitive data, in line with internal policies.</p>
|
||
<p>For service-level authorization, we use OAuth to securely distribute tokens.
|
||
Goose is pre-configured to authenticate with commonly used services, and tokens are stored securely using native system keychains.
|
||
Currently, OAuth flows are implemented directly within locally run MCP servers, a practical but temporary solution.
|
||
We’re actively exploring more scalable, decoupled patterns for the future.</p>
|
||
<p>Additionally, some servers enforce LLM allowlists or restrict tool output from being shared across systems to further minimize data exposure risks.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="real-stories-with-real-impact">Real Stories with Real Impact<a href="https://block.github.io/goose/blog/2025/04/21/mcp-in-enterprise#real-stories-with-real-impact" class="hash-link" aria-label="Direct link to Real Stories with Real Impact" title="Direct link to Real Stories with Real Impact"></a></h2>
|
||
<p>Goose has become an everyday tool for teams across Block.
|
||
With MCP servers acting as flexible connectors, employees are using automation in increasingly creative and practical ways to remove bottlenecks and focus on higher-value work.</p>
|
||
<p>Our engineers are using MCP-powered tools to migrate legacy codebases, refactor and simplify complex logic, generate unit tests, streamline dependency upgrades, and speed up triage workflows.
|
||
Goose helps developers work across unfamiliar systems, reduce repetitive coding tasks, and deliver improvements faster than traditional approaches.</p>
|
||
<p>Data and operations teams are using Goose to query internal systems, summarize large datasets, automate reporting, and surface relevant context from multiple sources.
|
||
In many cases, this reduces the reliance on manual data pulls or lengthy back-and-forths with specialists, making insights more accessible to everyone.</p>
|
||
<p>Meanwhile, teams in design, product, support, and risk are utilizing Goose in ways that remove overhead from their daily work.
|
||
Whether it's generating documentation, triaging tickets, or creating prototypes, MCP-based workflows are proving adaptable beyond engineering.</p>
|
||
<p>This shift is helping eliminate the mechanical work that slows us down.
|
||
As more teams experiment, they discover new ways to collaborate with Goose and reshape how things get done.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-weve-learned-so-far">What We've Learned So Far<a href="https://block.github.io/goose/blog/2025/04/21/mcp-in-enterprise#what-weve-learned-so-far" class="hash-link" aria-label="Direct link to What We've Learned So Far" title="Direct link to What We've Learned So Far"></a></h2>
|
||
<p>Rolling out MCP tooling company-wide required more than just technical setup. We invested in:</p>
|
||
<ul>
|
||
<li>Pre-installed agent access and default server bundles</li>
|
||
<li>Weekly education sessions from our internal Developer Relations team</li>
|
||
<li>Internal communication channels to seek help as well as share and celebrate wins</li>
|
||
</ul>
|
||
<p>Some of our takeaways:</p>
|
||
<ul>
|
||
<li>The easier we made it to start - by pre-installing Goose, bundling MCPs, and auto-configuring models - the faster adoption took off</li>
|
||
<li>People get more creative once they see what's possible, especially when they can remix or build on what others have already done</li>
|
||
<li>Centralized onboarding and prompt sharing saves time and helps scale best practices</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://block.github.io/goose/blog/2025/04/21/mcp-in-enterprise#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next"></a></h2>
|
||
<p>We're continuing to expand use cases outside of traditional engineering teams. MCP is helping unblock marketing, sales, and support workflows, and we're just getting started.</p>
|
||
<p>We're also investing in:</p>
|
||
<ul>
|
||
<li>More secure defaults and tooling restrictions based on context</li>
|
||
<li>Human-in-the-loop features for higher risk operations</li>
|
||
<li>Encouraging open source MCP contributions from across the company</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="want-to-learn-more">Want to Learn More?<a href="https://block.github.io/goose/blog/2025/04/21/mcp-in-enterprise#want-to-learn-more" class="hash-link" aria-label="Direct link to Want to Learn More?" title="Direct link to Want to Learn More?"></a></h2>
|
||
<p>If you're curious about Goose or MCP, check out the <a href="https://block.github.io/goose/docs/quickstart">Goose documentation</a> or <a href="https://spec.modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">MCP spec</a>.
|
||
We'd love to hear how others are approaching AI automation at scale.</p>
|
||
<div style="display:none"><p><img decoding="async" loading="lazy" src="https://block.github.io/goose/assets/images/mcp-for-enterprise-social-bb8a18872fedc0046ef72bb413dea851.png" width="1200" height="630" class="img_ev3q"></p></div>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[11 Practical Ways I Use AI Agents Without Losing My Authenticity]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai</guid>
|
||
<pubDate>Mon, 21 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[From conference planning to prepping podcasts, here's how I use AI Agents built on MCP for everyday tasks.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="mcp use cases" src="https://block.github.io/goose/assets/images/mcp-use-cases-758ecc959d6334783257fc9d6329e1f2.png" width="2240" height="1260" class="img_ev3q"></p>
|
||
<p>"Stop using AI," reads yet another viral post. I get it. It's frustrating to review a colleague's auto-generated work, filled with AI's classic giveaways like generic code comments and phrases like "In today's fast-paced world..."</p>
|
||
<p>Still, AI plays a pivotal role in my career. I don't rely on AI to do my work, but I use it to help me brainstorm and work more effciently.
|
||
The introduction of <a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">Model Context Protocol (MCP)</a> has made this even easier. MCP is an open standard that gives AI tools the context they need to be useful in the real world. It enables AI agents to interact with APIs, apps, and systems in a structured way. I use <a href="https://block.github.io/goose/">Codename goose</a>, an open source AI agent built on MCP.</p>
|
||
<p>Here are 11 real ways I use AI Agents without sacrificing authenticity, creativity, or quality:</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1--hands-free-coding">1. 🙌🏿 Hands-Free Coding<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#1--hands-free-coding" class="hash-link" aria-label="Direct link to 1. 🙌🏿 Hands-Free Coding" title="Direct link to 1. 🙌🏿 Hands-Free Coding"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I spoke to Goose instead of typing, using my voice as input to write code or run tasks.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>I have a lot of "my brain has the idea but my hands are full" moments. Whether I'm nursing my baby or recovering from carpal tunnel, this provides an accessible way for me to capture my thoughts without typing.</p>
|
||
<p>Sidenote: I met an AI enthusiast at a meetup who said he sometimes gets coding ideas while driving. He's exploring using his voice to vibe code on the go. Stay safe out there. Don't code and drive! 🚗⛑️</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Follow <a href="https://block.github.io/goose/docs/mcp/speech-mcp">this tutorial</a></li>
|
||
<li>Enable the <a href="https://github.com/Kvadratni/speech-mcp" target="_blank" rel="noopener noreferrer"><code>Speech</code></a> and <a href="https://block.github.io/goose/extensions/detail?id=developer"><code>Developer</code></a> extensions</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>I'd like to speak instead of typing.</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<iframe class="aspect-ratio" src="https://www.youtube.com/embed/rurAp_WzOiY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2--prepping-podcast-agendas">2. 🎤 Prepping Podcast Agendas<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#2--prepping-podcast-agendas" class="hash-link" aria-label="Direct link to 2. 🎤 Prepping Podcast Agendas" title="Direct link to 2. 🎤 Prepping Podcast Agendas"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-1">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-1" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I gave Goose a YouTube video of a guest's conference talk. Then, I prompted Goose to create a transcript and generate thoughtful interview questions.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-1">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-1" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>I want guests to feel like I actually know their work, even if I don't have hours to prep. This lets me ask smarter questions and run a better show.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-1">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-1" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Follow <a href="https://block.github.io/goose/docs/mcp/youtube-transcript-mcp">this tutorial</a></li>
|
||
<li>Enable the <a href="https://github.com/jkawamoto/mcp-youtube-transcript" target="_blank" rel="noopener noreferrer"><code>YouTube Transcript</code></a> and <a href="https://block.github.io/goose/extensions/detail?id=developer"><code>Developer</code></a> extensions</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>Generate a transcript for this video <a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ" target="_blank" rel="noopener noreferrer">https://www.youtube.com/watch?v=dQw4w9WgXcQ</a>, then create relevant interview questions based on the content</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3--resize-images">3. 🖼 Resize Images<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#3--resize-images" class="hash-link" aria-label="Direct link to 3. 🖼 Resize Images" title="Direct link to 3. 🖼 Resize Images"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-2">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-2" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>Speaker management platforms often have different image requirements for headshots. I used to spend an embarrassingly amount of time trying to resize my photo without ruining the aspect ratio. Now, I just ask Goose to do it.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-2">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-2" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>It saves me from wrestling with random online tools or bloated design apps. I get a clean, correctly sized image in seconds, and it looks exactly how I want it to.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-2">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-2" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Enable the <a href="https://block.github.io/goose/extensions/detail?id=developer"><code>Developer</code></a> extension</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>Resize this image (~/Downloads/image.png) to 1000x1000 pixels. Maintain the aspect ratio and image quality.</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4--resume-review-against-job-listings">4. 📝 Resume Review Against Job Listings<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#4--resume-review-against-job-listings" class="hash-link" aria-label="Direct link to 4. 📝 Resume Review Against Job Listings" title="Direct link to 4. 📝 Resume Review Against Job Listings"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-3">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-3" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I've used Goose to compare my current resume to job listings I came across.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-3">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-3" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>I'm not currently looking for a job, but I like to stay prepared. My strategy involves keeping my resume current and competitive. I do this by comparing my current resume to job listings, but I don't have to do this manually anymore. Instead, Goose can quickly point out my strengths and weaknesses for specific job listings. This approach could help hiring managers review resumes faster as well.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-3">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-3" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Follow <a href="https://block.github.io/goose/docs/mcp/pdf-mcp">this tutorial</a></li>
|
||
<li>Enable the <a href="https://github.com/michaelneale/mcp-read-pdf" target="_blank" rel="noopener noreferrer"><code>PDF Reader</code></a> extension</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>Read the resume at ~/Downloads/resume.pdf and evaluate how well this candidate aligns with the following role requirements:</p>
|
||
<ul>
|
||
<li>5+ years of backend development experience</li>
|
||
<li>Strong system design and distributed systems knowledge</li>
|
||
<li>Cloud infrastructure experience (AWS preferred)</li>
|
||
<li>Prior experience leading technical projects or teams</li>
|
||
<li>Bonus: familiarity with LLMs or AI/ML tools</li>
|
||
</ul>
|
||
<p>Score each one out of 5, give supporting evidence, and summarize with a final fit rating.</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<iframe class="aspect-ratio" src="https://www.youtube.com/embed/EJf2_iZfaWk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="5--understanding-idioms">5. 🧠 Understanding Idioms<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#5--understanding-idioms" class="hash-link" aria-label="Direct link to 5. 🧠 Understanding Idioms" title="Direct link to 5. 🧠 Understanding Idioms"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-4">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-4" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I've asked Goose to explain idioms or references that I didn't understand.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-4">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-4" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>Because I wasn't born in America and I'm neurodivergent, I sometimes take idioms literally or misinterpret them. Instead of risking embarrassment at work, I quietly ask Goose to translate.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-4">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-4" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Enable the <a href="https://block.github.io/goose/extensions/detail?id=developer"><code>Developer</code></a> extension</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>What does this phrase mean: "Who does Vegas have as the favorite?"</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="6--querying-a-relational-database">6. 📊 Querying a Relational Database<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#6--querying-a-relational-database" class="hash-link" aria-label="Direct link to 6. 📊 Querying a Relational Database" title="Direct link to 6. 📊 Querying a Relational Database"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-5">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-5" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I asked Goose for insights about my data using natural language, and it wrote a Common Table Expression for me.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-5">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-5" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>SQL can get complex with joins, stored procedures, and subqueries. Goose helps me move faster and avoid errors by handling the query logic for me.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-5">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-5" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Follow <a href="https://block.github.io/goose/docs/mcp/postgres-mcp">this tutorial</a></li>
|
||
<li>Enable the <a href="https://github.com/modelcontextprotocol/servers/tree/HEAD/src/postgres" target="_blank" rel="noopener noreferrer"><code>PostgreSQL</code></a> and <a href="https://block.github.io/goose/extensions/detail?id=developer"><code>Developer</code></a> extensions</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>Find my top 3 blog posts by average weekly views over the past 90 days. Include title, URL, average weekly views, and whether they were promoted on social.</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<iframe class="aspect-ratio" src="https://www.youtube.com/embed/PZlYQ5IthYM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="7--planning-my-conference-speaking-strategy">7. 🗓 Planning My Conference Speaking Strategy<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#7--planning-my-conference-speaking-strategy" class="hash-link" aria-label="Direct link to 7. 🗓 Planning My Conference Speaking Strategy" title="Direct link to 7. 🗓 Planning My Conference Speaking Strategy"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-6">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-6" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I've used Goose to analyze historical conference data so I could plan smarter for upcoming CFP deadlines.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-6">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-6" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>I tend to overbook myself or get anxious that I won't get accepted, so I apply to everything. Then I end up getting accepted to all of them and say yes without thinking, which leads to poor planning and rushed talks. With Goose, I can analyze patterns in CFP timelines and make more intentional choices.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-6">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-6" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Follow <a href="https://block.github.io/goose/docs/mcp/agentql-mcp">this tutorial</a></li>
|
||
<li>Enable the <a href="https://github.com/tinyfish-io/agentql-mcp" target="_blank" rel="noopener noreferrer"><code>AgentQL</code></a> extension</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>I'm a tech conference speaker planning my 2025-2026 submissions.
|
||
Extract for developer conferences (attendance > 500) occurring between 2022-2024:</p>
|
||
<ul>
|
||
<li>Conference name</li>
|
||
<li>Conference dates</li>
|
||
<li>CFP timeline</li>
|
||
</ul>
|
||
<p>To identify:</p>
|
||
<ul>
|
||
<li>Consistent monthly patterns</li>
|
||
<li>Whether conferences stick to same months yearly</li>
|
||
<li>If CFP windows are consistent year-to-year</li>
|
||
<li>Any shifts in traditional timing</li>
|
||
</ul>
|
||
<p>Structure results as JSON</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="8--tracking-down-a-buggy-commit">8. 🐞 Tracking Down a Buggy Commit<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#8--tracking-down-a-buggy-commit" class="hash-link" aria-label="Direct link to 8. 🐞 Tracking Down a Buggy Commit" title="Direct link to 8. 🐞 Tracking Down a Buggy Commit"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-7">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-7" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>A feature broke, but I had made so many commits, I couldn't tell which one introduced the bug. I asked Goose to help me run <code>git bisect</code>, so we could identify the problematic code.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-7">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-7" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>The hardest part of debugging is often just figuring out where to look. Git bisect makes that faster, and Goose walked me through the process without needing to memorize the steps.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-7">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-7" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Install the <a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" target="_blank" rel="noopener noreferrer">Git CLI</a></li>
|
||
<li>Enable the <a href="https://block.github.io/goose/extensions/detail?id=developer"><code>Developer</code></a> extension</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>I don't know when I introduced a bug. Can you walk me through using git bisect to find the commit that caused it?</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="9--learning-new-technologies">9. 👩🏾🏫 Learning New Technologies<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#9--learning-new-technologies" class="hash-link" aria-label="Direct link to 9. 👩🏾🏫 Learning New Technologies" title="Direct link to 9. 👩🏾🏫 Learning New Technologies"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-8">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-8" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I like to keep up with the latest technologies. Since MCP servers are popular, I used Goose's tutorial extension to walk through building my own MCP server.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-8">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-8" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>In addition to generating code, AI agents can help you learn how to code. Goose includes a built-in tutorial extension designed to walk users through technical concepts in a hands-on way.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-8">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-8" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Follow <a href="https://block.github.io/goose/docs/mcp/tutorial-mcp">this tutorial</a></li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>I'd like to learn how to build an extension or MCP server for Goose</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="10--comparing-regulatory-documentation">10. 💼 Comparing Regulatory Documentation<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#10--comparing-regulatory-documentation" class="hash-link" aria-label="Direct link to 10. 💼 Comparing Regulatory Documentation" title="Direct link to 10. 💼 Comparing Regulatory Documentation"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-9">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-9" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I didn't do this myself, but I was impressed to learn that a community member used Goose to compare proposed and final versions of regulatory documents.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-9">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-9" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>Legal documents are often dense and repetitive. Goose can highlight what actually changed, helping users quickly spot how updates impact compliance or obligations.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-9">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-9" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Enable the <a href="https://block.github.io/goose/extensions/detail?id=computercontroller"><code>Computer Controller</code></a> extension</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>Highlight the differences between these two versions of FinCEN's Investment Adviser AML regulations:</p>
|
||
<p>Proposed version (2015): <a href="https://www.federalregister.gov/documents/2015/09/01/2015-21318" target="_blank" rel="noopener noreferrer">https://www.federalregister.gov/documents/2015/09/01/2015-21318</a></p>
|
||
<p>Final version (2024): <a href="https://www.federalregister.gov/documents/2024/09/04/2024-19260" target="_blank" rel="noopener noreferrer">https://www.federalregister.gov/documents/2024/09/04/2024-19260</a></p>
|
||
<p>Focus on key changes in requirements for investment advisers' AML/CFT programs and how they affect compliance obligations.</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="11--prototyping-ideas-quickly">11. 🛠 Prototyping Ideas Quickly<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#11--prototyping-ideas-quickly" class="hash-link" aria-label="Direct link to 11. 🛠 Prototyping Ideas Quickly" title="Direct link to 11. 🛠 Prototyping Ideas Quickly"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-case-10">Use Case<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#use-case-10" class="hash-link" aria-label="Direct link to Use Case" title="Direct link to Use Case"></a></h3>
|
||
<p>I used Goose to build a working prototype and see the full application live in action.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-useful-10">Why It's Useful<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#why-its-useful-10" class="hash-link" aria-label="Direct link to Why It's Useful" title="Direct link to Why It's Useful"></a></h3>
|
||
<p>It's fast, functional, and lets me validate whether an idea is worth pursuing without spending hours coding from scratch.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-try-it-10">How to Try It<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#how-to-try-it-10" class="hash-link" aria-label="Direct link to How to Try It" title="Direct link to How to Try It"></a></h3>
|
||
<ol>
|
||
<li>Enable the <a href="https://block.github.io/goose/extensions/detail?id=developer"><code>Developer</code></a> extension</li>
|
||
<li>Prompt Goose:<!-- -->
|
||
<blockquote>
|
||
<p>Build a JavaScript webcam app with real-time filters</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<p>🎥 <strong>See it live:</strong><br>
|
||
<!-- -->Watch The Great Goose Off where we challenged Goose to create creative apps from scratch, like:</p>
|
||
<ul>
|
||
<li>A Goose-shaped drawing tool</li>
|
||
<li>A purposely chaotic authentication flow</li>
|
||
</ul>
|
||
<p>You'll see ideas go from prompt to prototype in one session.</p>
|
||
<iframe class="aspect-ratio" src="https://www.youtube.com/embed/OsA3qhns7dg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
|
||
<hr>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="looking-for-more-examples">Looking for more examples?<a href="https://block.github.io/goose/blog/2025/04/21/practical-use-cases-of-ai#looking-for-more-examples" class="hash-link" aria-label="Direct link to Looking for more examples?" title="Direct link to Looking for more examples?"></a></h2>
|
||
<p>This blog post included just a few of the ways I use Goose. If you're curious about what else it can do, check out the <a href="https://block.github.io/goose/prompt-library">Prompt Library</a> or just ask:</p>
|
||
<p>What are 5 useful things you can help me with today?</p>
|
||
<p>Let Goose surprise you. ✨</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Codename Goose Goes to New York]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY</guid>
|
||
<pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Goose lands in NYC for its second community meetup]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/cover-6c131d275bcdb4d8651a140d62e2975f.png" width="2240" height="1260" class="img_ev3q"></p>
|
||
<p>We brought Goose to New York City and it was one for the books.</p>
|
||
<p>Over 100 people registered, plus 87 on the waitlist, and we had a packed room full of folks who were curious, thoughtful, and ready to dive in. Some were developers already exploring Goose and MCP, others were totally new to the world of AI agents. That’s the beauty of Goose, it’s for developers <em>and</em> non-developers.</p>
|
||
<p>The energy was there from the moment the event began - music, pizza, and authentic networking. We had lightning talks, a Goose-themed game, hands-on hacking, and yeah… a few Ebbs IPAs might’ve ended up in people’s backpacks by the end of the night.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-we-brought-goose-to-nyc">Why We Brought Goose to NYC<a href="https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY#why-we-brought-goose-to-nyc" class="hash-link" aria-label="Direct link to Why We Brought Goose to NYC" title="Direct link to Why We Brought Goose to NYC"></a></h2>
|
||
<p>After the Boston meetup, we wanted to keep the momentum going and test things in a new city. New York felt like the perfect place. It’s a melting pot of people and has a really strong tech scene. Our goals were simple:</p>
|
||
<p>✅ Keep building the Goose community<br>
|
||
<!-- -->✅ Get real feedback and ideas from the community in person<br>
|
||
<!-- -->✅ Have some fun while learning together</p>
|
||
<p>NYC didn’t disappoint.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="in-case-you-missed-it">In Case You Missed It<a href="https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY#in-case-you-missed-it" class="hash-link" aria-label="Direct link to In Case You Missed It" title="Direct link to In Case You Missed It"></a></h2>
|
||
<div class="carousel-container"><div class="swiper swiper-container-test-carousel" style="width:100%"><div class="swiper-wrapper"><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/focus4-8232c187021a690519cfa1e8f1c18014.jpg" alt="Slide 1" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/focus-4927104eb487e6b1f9480d8149e26c36.jpg" alt="Slide 2" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/focus2-4ca4bc40c7a86ec46ec566d4d1fd2001.jpg" alt="Slide 3" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/focus3-8ba8fb623d148fa5583c41c0a7a721a4.jpg" alt="Slide 4" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/focus5-afe81c949e09dc788989d1c20c3a74fe.jpg" alt="Slide 5" class="carousel-image"></div></div><div class="swiper-button-prev"></div><div class="swiper-button-next"></div><div class="swiper-pagination"></div></div></div>
|
||
<p>We kicked things off with food and free time to meet people, chat, and ask questions before jumping into the talks:</p>
|
||
<ul>
|
||
<li><strong><a href="https://www.linkedin.com/in/erinmikail/" target="_blank" rel="noopener noreferrer">Erin Mikail</a></strong> from Galileo ran a Goose-themed game that got people laughing <em>and</em> learning about the importance of agent evaluation.</li>
|
||
<li><strong><a href="https://www.linkedin.com/in/ebonylouis/" target="_blank" rel="noopener noreferrer">I, Ebony Louis</a></strong> gave a walkthrough of Goose and MCP, showing how quick it is to get started with any MCP server.</li>
|
||
<li><strong><a href="https://www.linkedin.com/in/alexjhancock/" target="_blank" rel="noopener noreferrer">Alex Hancock</a></strong> went deep on MCP, and how it powers secure, extendable agent workflows.</li>
|
||
</ul>
|
||
<p>Then came the best part — hack time. <strong>27 people got Goose up and running live</strong> during the event, which was amazing to see. It’s always fun watching that moment when it clicks for someone, ideas start flowing, people get inspired, and they walk away ready to actually <em>use</em> Goose.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-people-said">What People Said<a href="https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY#what-people-said" class="hash-link" aria-label="Direct link to What People Said" title="Direct link to What People Said"></a></h2>
|
||
<div class="carousel-container"><div class="swiper swiper-container-test-carousel" style="width:100%"><div class="swiper-wrapper"><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/swag2-6ed2a0029c159d14013e366f6f945268.jpg" alt="Slide 1" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/swag1-7e7ee0095446a64f5dbcffe6b5b69460.jpg" alt="Slide 2" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/swag-8eaec6e42aea06511f6334c6e9e21ec1.jpg" alt="Slide 3" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/swag3-50d943bd7ee6e68c65ad0bed5e339f9a.jpg" alt="Slide 4" class="carousel-image"></div></div><div class="swiper-button-prev"></div><div class="swiper-button-next"></div><div class="swiper-pagination"></div></div></div>
|
||
<blockquote>
|
||
<p>“It took me less than 5 mins to get myself set up with a sample project and running the Goose CLI in GitHub Codespaces! Overall it felt great to be back in a physical venue for a hands-on event with an engaged community and a timely topic for discussion.”<br>
|
||
<!-- -->— <em><a href="https://www.linkedin.com/in/nityan/" target="_blank" rel="noopener noreferrer">Nitya Narasimhan, Senior Cloud Advocate @ Microsoft</a></em></p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>“The live demos, open discussions, and practical exercises made it an exceptional learning experience. Feeling energized and inspired to explore how Goose and MCP can be leveraged in future data engineering projects!”<br>
|
||
<!-- -->— <em><a href="https://www.linkedin.com/in/manireddy12/" target="_blank" rel="noopener noreferrer">Manikumarreddy Gajjela, Full Stack Developer @ Tetra Computing</a></em></p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>“Everyone seems bullish on Model Context Protocol (MCP) these days… Goose is an open-source, on-machine AI agent built to automate your tasks. The coolest part? You can even plug in your own hosted Ollama LLM with Goose!”<br>
|
||
<!-- -->— <em><a href="https://www.linkedin.com/in/rijuldahiya/" target="_blank" rel="noopener noreferrer">Rijul Dahiya, Graduate Teaching Assistant @ NYU</a></em></p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>“Great event – great mix of introductory and technical material as well as fun, and I liked that it provided a bunch of time at the beginning and end that was unstructured.”<br>
|
||
<!-- -->— <em><a href="https://www.linkedin.com/in/matthewhillnewyork/" target="_blank" rel="noopener noreferrer">Matthew Hill, Sr Director of AI Engineering @ Dataminr</a></em></p>
|
||
</blockquote>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="moments-we-loved-️">Moments We Loved ❤️<a href="https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY#moments-we-loved-%EF%B8%8F" class="hash-link" aria-label="Direct link to Moments We Loved ❤️" title="Direct link to Moments We Loved ❤️"></a></h2>
|
||
<ul>
|
||
<li>🍕 Pizza, music, and people catching up before things even kicked off</li>
|
||
<li>🎮 The Goose game- yes, it got competitive and oddly dark lol</li>
|
||
<li>🧳 Folks traveled from Philly and DC just to attend</li>
|
||
<li>📸 Having a photographer to capture candid and fun moments</li>
|
||
<li>🧠 A bunch of thoughtful “I’m not a dev but…” questions that we <em>loved</em> hearing</li>
|
||
</ul>
|
||
<div class="carousel-container"><div class="swiper swiper-container-test-carousel" style="width:100%"><div class="swiper-wrapper"><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/speaker1-45d20237329fb76d724e73b6ee1f7a89.jpg" alt="Slide 1" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/speaker-bd71c5b83c6e0cd202ea8aa8af867b58.jpg" alt="Slide 2" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/fun-340fa01a11fd04982ae7e2e612bded03.jpg" alt="Slide 3" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/fun1-b0d7060f8629eec662b2c9f5a22dd7d0.jpg" alt="Slide 4" class="carousel-image"></div><div class="swiper-slide"><img src="https://block.github.io/goose/assets/images/focus2-4ca4bc40c7a86ec46ec566d4d1fd2001.jpg" alt="Slide 5" class="carousel-image"></div></div><div class="swiper-button-prev"></div><div class="swiper-button-next"></div><div class="swiper-pagination"></div></div></div>
|
||
<p>At the end, people were asking when the next one is and yes, we may have let it slip early…</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="up-next-goose-flies-south-">Up Next: Goose Flies South 🛫<a href="https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY#up-next-goose-flies-south-" class="hash-link" aria-label="Direct link to Up Next: Goose Flies South 🛫" title="Direct link to Up Next: Goose Flies South 🛫"></a></h2>
|
||
<p>Our next Goose Meetup is already locked in!</p>
|
||
<p>👉 <strong>Atlanta – Wednesday, April 30</strong><br>
|
||
<!-- -->🕕 <strong>6:00 PM – 8:30 PM ET</strong><br>
|
||
<!-- -->📍 <a href="https://lu.ma/x9ccqruq" target="_blank" rel="noopener noreferrer">RSVP here</a></p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="big-thanks-">Big Thanks 🙌<a href="https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY#big-thanks-" class="hash-link" aria-label="Direct link to Big Thanks 🙌" title="Direct link to Big Thanks 🙌"></a></h2>
|
||
<p>Huge shoutout to <strong><a href="https://www.linkedin.com/in/taniachakraborty/" target="_blank" rel="noopener noreferrer">Tania Chakraborty</a></strong> and <strong><a href="https://www.linkedin.com/in/anthonygiuliano1/" target="_blank" rel="noopener noreferrer">Anthony Giuliano</a></strong> for being there, and to everyone who came through, asked questions, helped out, and made it a night to remember.</p>
|
||
<p>The community truly made this one special, people stayed after to chat, helped clean up without being asked, and brought such a good energy into the room. We couldn’t have asked for a better crowd.</p>
|
||
<p>We’ll see you in Atlanta 👀</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[How ATrueLight4 Helped Goose Navigate Windows]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/14/community-atruelight4</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/14/community-atruelight4</guid>
|
||
<pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Block Open Source Top Contributor of the Month]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/goose4win-7f57433fa3f19849e74b18ebffe08bcf.png" width="1206" height="633" class="img_ev3q"></p>
|
||
<p>As the goose team continues to work on new features over 800 community members voted to express their need for Goose on Windows. Today's top contributor stepped in to aid this ongoing effort.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="windows-support">Windows Support<a href="https://block.github.io/goose/blog/2025/04/14/community-atruelight4#windows-support" class="hash-link" aria-label="Direct link to Windows Support" title="Direct link to Windows Support"></a></h2>
|
||
<p>Since the launch of codename goose, the open source community has been wanting and requesting the same automation by goose on Windows.</p>
|
||
<p>Currently, goose's CLI version works on Windows with limited built-in extensions via WSL, or Windows Subsystem for Linux. While there is a limited internal beta in the works, there are several bugs and improvements that are being worked on to ensure codename goose has the same seamless experience as it does on Mac.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="atruelight4s-goose4win">ATrueLight4's Goose4Win<a href="https://block.github.io/goose/blog/2025/04/14/community-atruelight4#atruelight4s-goose4win" class="hash-link" aria-label="Direct link to ATrueLight4's Goose4Win" title="Direct link to ATrueLight4's Goose4Win"></a></h2>
|
||
<p>Our featured contributor, <a href="https://github.com/ATrueLight4" target="_blank" rel="noopener noreferrer">ATrueLight4</a>, shipped <strong>Goose4Win</strong>, a fix that improves how Goose handles Windows-specific file paths. Their contribution is already merged into main, so if you install Goose for CLI on Windows today, you’ll get the improvement out of the box. No extra setup needed.</p>
|
||
<p>Thank you so much for your contribution, ATrueLight4! Your work brings us one step closer to Goose on Windows.</p>
|
||
<p>To show our deep gratitude for your contribution, we've granted you the exclusive ✨Top Contributor✨ badge on the Block Open Source Discord! You'll also be one of the first contributors to receive exclusive codename goose swag. (more info on that to be announced later 👀🪿)</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-your-own-spotlight">Get Your Own Spotlight<a href="https://block.github.io/goose/blog/2025/04/14/community-atruelight4#get-your-own-spotlight" class="hash-link" aria-label="Direct link to Get Your Own Spotlight" title="Direct link to Get Your Own Spotlight"></a></h2>
|
||
<p>Interested in contributing to goose and having your contribution featured? Whether it's improving platform support, adding new features, or fixing bugs, we welcome all contributions from the open source community. You can <a href="https://discord.gg/block-opensource" target="_blank" rel="noopener noreferrer">join the Block Open Source Discord</a> or <a href="https://block.github.io/goose/" target="_blank" rel="noopener noreferrer">get started using codename goose</a> today.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[Finetuning Toolshim Models for Tool Calling]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim</guid>
|
||
<pubDate>Fri, 11 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Addressing performance limitations in models without native tool calling support]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/toolshim-header-42611f614e7722f90cf83991debe3046.png" width="1200" height="630" class="img_ev3q"></p>
|
||
<p>Our recently published <a href="https://block.github.io/goose/blog/2025/03/31/goose-benchmark" target="_blank" rel="noopener noreferrer">Goose benchmark</a> revealed significant performance limitations in models where tool calling is not straightforwardly supported (e.g., Gemma3, Deepseek-r1, phi4). These models often fail to invoke tools at appropriate times or produce malformed or inconsistently formatted tool calls. With the most recent releases of Llama4 and Deepseek v3 (0324), we are again observing challenges with effective tool calling performance, even on these flagship openweight models.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-tool-calling-is-important">Why tool calling is important<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#why-tool-calling-is-important" class="hash-link" aria-label="Direct link to Why tool calling is important" title="Direct link to Why tool calling is important"></a></h2>
|
||
<p>Tool calling is a critical capability for agents like goose. It allows models to go beyond text and image generation and take concrete actions, such as executing code, querying databases, searching the web, or interacting with design tools like Figma. Equipping agents with a broad set of tools empowers them to discover and interface with external systems, much like a human would. While this might be overkill for narrow, more deterministic applications of LLMs, it is essential for general-purpose agents like goose. Without reliable tool calling, we limit what models can do to help us automate, remove toil and navigate complex systems. Pure generation–of text, images, speech, and video–is just the first step on the path to more powerful agentic capabilities. There is so much more that models can do if we give them the legs to run.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background-using-a-local-model-as-a-toolshim">Background: using a local model as a "toolshim"<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#background-using-a-local-model-as-a-toolshim" class="hash-link" aria-label="Direct link to Background: using a local model as a "toolshim"" title="Direct link to Background: using a local model as a "toolshim""></a></h2>
|
||
<p>The goal is to allow goose to work with the widest variety of models possible. A "toolshim" in this case is a thin layer which sits between the main model doing the agent work, and the tools that can perform actual actions (making the agent take action, vs being a chatbot). Previously we have been trying this approach with open models including in this <a href="https://block.github.io/goose/blog/2025/03/31/goose-benchmark" target="_blank" rel="noopener noreferrer">past benchmark</a> post. A toolshim, if it can work, unlocks both powerful cutting edge models (open weight and closed) which while may perform well on various benchmarks, fall well short when tool calling for agents is required (or perhaps don't, by design, support tool calling at all, such as the case with some reasoning models).</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="proposal-fine-tune-a-lightweight-toolshim-model-up-to-12b">Proposal: Fine-tune a lightweight toolshim model (up to 12b)<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#proposal-fine-tune-a-lightweight-toolshim-model-up-to-12b" class="hash-link" aria-label="Direct link to Proposal: Fine-tune a lightweight toolshim model (up to 12b)" title="Direct link to Proposal: Fine-tune a lightweight toolshim model (up to 12b)"></a></h2>
|
||
<p>Develop a dedicated toolshim model that translates open-source model outputs into well-structured tool calls, acting as a reliable post-processor to standardize across model families trained that currently exhibit inconsistent and unreliable tool call generation behavior. We do not use tool calling apis even if available, but provide tool context in the system prompts.</p>
|
||
<p>We already experimented with this in the <a href="https://block.github.io/goose/blog/2025/03/31/goose-benchmark" target="_blank" rel="noopener noreferrer">benchmarking effort</a>, finding that phi4 (14b) and gemma3 (27b) achieved close performance to llama3.3 (70b) when used with a generic local model (mistral-nemo) as the shim. This shows potential for furthering their performance with more focused attention on improving the shim's performance.</p>
|
||
<p>Toolshim System Sketch:</p>
|
||
<p><img decoding="async" loading="lazy" alt="Toolshim System Sketch" src="https://block.github.io/goose/assets/images/sketch-0bb4b0e6fb7fdbd194fff4db41c3806f.png" width="1132" height="828" class="img_ev3q"></p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="key-observations-on-current-challenges-with-tool-call-generation">Key Observations on Current Challenges with Tool Call Generation<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#key-observations-on-current-challenges-with-tool-call-generation" class="hash-link" aria-label="Direct link to Key Observations on Current Challenges with Tool Call Generation" title="Direct link to Key Observations on Current Challenges with Tool Call Generation"></a></h2>
|
||
<ol>
|
||
<li>
|
||
<p><strong>Model training templates are inconsistent</strong><br>
|
||
<!-- -->For example, <a href="https://qwen.readthedocs.io/en/latest/framework/function_call.html" target="_blank" rel="noopener noreferrer">Qwen models use</a> <a href="https://github.com/NousResearch/Hermes-Function-Calling" target="_blank" rel="noopener noreferrer">Hermes-style tool formats</a>, while Openhands generates Markdown despite explicit JSON instructions—suggesting training data shape can have an underestimated impact on reliable tool call generation</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Current workarounds aren't enough</strong><br>
|
||
<a href="https://docs.vllm.ai/en/latest/features/tool_calling.html" target="_blank" rel="noopener noreferrer">Model providers may implement approaches like guided decoding</a> to guarantee validly-parsable function calls, but these may not produce high-quality outputs if the model wasn't trained on schemas matching what users provide in context. The widespread challenges with tool use with Llama4 may be indicative of the challenges providers have in effectively serving new models to make full use of their capabilities</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Hosting providers vary wildly in how well they work with tool calls</strong><br>
|
||
<!-- -->Hosting providers helpfully provide chat templates or similar which can, in many cases, prompt some of the larger models to reply correctly formatted tool calls, and thus can support openai-like apis where tools are provided, but in practice these can fall short after one shot, or vary a lot between providers (an issue exacerbated if using model routers such as openrouter or huggingface hosted inference)</p>
|
||
</li>
|
||
</ol>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="some-examples-of-model-specific-quirks-wrt-tool-calling">Some examples of model-specific quirks wrt tool calling:<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#some-examples-of-model-specific-quirks-wrt-tool-calling" class="hash-link" aria-label="Direct link to Some examples of model-specific quirks wrt tool calling:" title="Direct link to Some examples of model-specific quirks wrt tool calling:"></a></h3>
|
||
<p><strong>Openhands</strong>: Despite instructions to generate JSON-formatted tool calls, still generates markdown (likely due to shape of their training data)</p>
|
||
<p><img decoding="async" loading="lazy" alt="Openhands example" src="https://block.github.io/goose/assets/images/openhands-7fe1d878c7108c846e6275ed3157be6e.png" width="1287" height="233" class="img_ev3q"></p>
|
||
<p><strong>Llama4 Maverick</strong>: Generates malformed tool calls, but performs somewhat better when specifically prompted to generate tool calls as JSON</p>
|
||
<p>With "tool calls" on OpenRouter:<br>
|
||
<img decoding="async" loading="lazy" alt="OpenRouter tool calls example" src="https://block.github.io/goose/assets/images/openrouter_toolcalls-01ef22c3d91ff5580c49b89f6599293f.png" width="1295" height="621" class="img_ev3q"></p>
|
||
<p>Llama4 Maverick when instead just prompted to generate tool calls in JSON:<br>
|
||
<img decoding="async" loading="lazy" alt="Llama4 example" src="https://block.github.io/goose/assets/images/llama4-2ebc0ab8f18d31c450ee2bf34aa82191.png" width="1296" height="767" class="img_ev3q"></p>
|
||
<p><strong>Gemma3</strong>: A DeepMind engineer <a href="https://www.philschmid.de/gemma-function-calling" target="_blank" rel="noopener noreferrer">suggested providing a function calling template in-context in Python format</a><br>
|
||
<!-- -->The 12B model also outputs valid JSON tool calls reasonably well:<br>
|
||
<img decoding="async" loading="lazy" alt="Gemma3 example" src="https://block.github.io/goose/assets/images/gemma3-eca1a363fea57b818a967883e567a481.png" width="1293" height="299" class="img_ev3q"></p>
|
||
<p><strong>Functionary models</strong>: <a href="https://github.com/MeetKai/functionary/issues/302#issuecomment-2650187280" target="_blank" rel="noopener noreferrer">Ollama couldn't support the tool calling capabilities</a> because these models were trained with prompt templates in a TypeScript schema incompatible with Ollama's supported JSON schema</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="experimentation-approach">Experimentation Approach<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#experimentation-approach" class="hash-link" aria-label="Direct link to Experimentation Approach" title="Direct link to Experimentation Approach"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="data-collection">Data Collection<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#data-collection" class="hash-link" aria-label="Direct link to Data Collection" title="Direct link to Data Collection"></a></h3>
|
||
<ul>
|
||
<li>Extract user messages from historical Goose sessions, and for messages followed by tool calls from Anthropic/OpenAI (all tool calls up to today):<!-- -->
|
||
<ul>
|
||
<li><strong>Regenerate tool calls with open models:</strong> Regenerate the tool calls with the most capable open models that have supported tool calling capabilities (e.g., QwQ, Qwen, deepseek chat v3)</li>
|
||
<li><strong>Generate json/markdown-formatted tool calls to parse:</strong> Instruct the most capable open models (e.g., DeepSeek-r1, Llama4, Gemma3), that don't necessarily have strong tool calling to output tool calls in the correct schema (JSON/markdown). Parse the output into the appropriate tool calls.</li>
|
||
<li><strong>Discard any malformed tool calls, tool calls that fail to properly execute, or tool calls that meet other rejection criteria</strong></li>
|
||
</ul>
|
||
</li>
|
||
<li>Generate a few thousand examples with this approach</li>
|
||
</ul>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="modeling">Modeling<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#modeling" class="hash-link" aria-label="Direct link to Modeling" title="Direct link to Modeling"></a></h3>
|
||
<p>Fine tune small models like mistral-nemo (14b), gemma 4-12b, qwen2.5-coder 7-14b.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="evaluations">Evaluations<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#evaluations" class="hash-link" aria-label="Direct link to Evaluations" title="Direct link to Evaluations"></a></h3>
|
||
<p>Test with Goosebench evals run in the benchmarking blogpost. We can directly compare performance of models with and without the finetuned toolshim models supporting them.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="future-approaches">Future approaches<a href="https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim#future-approaches" class="hash-link" aria-label="Direct link to Future approaches" title="Direct link to Future approaches"></a></h2>
|
||
<p>On top of local models, we would like to consider parsers, parser combinators, context-free grammars and more (even very large ones) which are constructed based on 1000s of examples of tool results. Even if large, these can operate at every low latencies extracting parameters for suggested tool calls. There are likely other structured text extraction techniques to be explored to assist with discovery and extraction of tool calls from rich responses from powerful general models.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
<item>
|
||
<title><![CDATA[A Visual Guide To MCP Ecosystem]]></title>
|
||
<link>https://block.github.io/goose/blog/2025/04/10/visual-guide-mcp</link>
|
||
<guid>https://block.github.io/goose/blog/2025/04/10/visual-guide-mcp</guid>
|
||
<pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate>
|
||
<description><![CDATA[Visual breakdown of MCP: How your AI agent, tools, and models work together.]]></description>
|
||
<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog cover" src="https://block.github.io/goose/assets/images/mcpblog-40894789122bda594a8576ebcb67a2d8.png" width="2240" height="1260" class="img_ev3q"></p>
|
||
<p>You ever open a GitHub repo or blog post, read the first sentence, and immediately feel like you’ve stumbled into a PhD dissertation?</p>
|
||
<p>Yeah. Same.</p>
|
||
<p>MCP (Model Context Protocol) sounds complicated, but it’s really not. Think of this as your go to cheat sheet, no whitepapers, no academic jargon, just plain English and a few good visuals.</p>
|
||
<p>Let's break this down together.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-mcp-in-plain-english">What Is MCP in Plain English?<a href="https://block.github.io/goose/blog/2025/04/10/visual-guide-mcp#what-is-mcp-in-plain-english" class="hash-link" aria-label="Direct link to What Is MCP in Plain English?" title="Direct link to What Is MCP in Plain English?"></a></h2>
|
||
<p>MCP is like a universal translator between your AI agent, like Goose, and external tools, files, databases, APIs, you name it.</p>
|
||
<p>It gives your agent a way to ask questions, run tools, store/retrieve context, and keep track of everything it knows.</p>
|
||
<p>Instead of cramming everything into one prompt like “here’s 10k tokens worth of context, good luck,” MCP helps the model pull what it needs, when it needs it.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="who-are-the-players">Who Are The Players?<a href="https://block.github.io/goose/blog/2025/04/10/visual-guide-mcp#who-are-the-players" class="hash-link" aria-label="Direct link to Who Are The Players?" title="Direct link to Who Are The Players?"></a></h2>
|
||
<p><img decoding="async" loading="lazy" alt="players" src="https://block.github.io/goose/assets/images/players-e2b075360b81c342d61ed84bc51c1e97.png" width="2320" height="818" class="img_ev3q"></p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>User</strong> – You, the person with the big ideas and messy problems</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Agent</strong> – The AI agent, Goose, living in your CLI, IDE, or desktop application</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>LLM</strong> – The model that does the reasoning (like Claude, GPT-4, etc.)</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>MCP Servers (Extensions)</strong> – Goose's toolbox: built-in and custom extensions that give goose the ability to execute tasks</p>
|
||
</li>
|
||
</ul>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-they-communicate">How Do They Communicate?<a href="https://block.github.io/goose/blog/2025/04/10/visual-guide-mcp#how-do-they-communicate" class="hash-link" aria-label="Direct link to How Do They Communicate?" title="Direct link to How Do They Communicate?"></a></h2>
|
||
<p>Lets take a look at how all the players work together:</p>
|
||
<p><img decoding="async" loading="lazy" alt="Visual guide" src="https://block.github.io/goose/assets/images/visualguide-9b44af19be52631e84712cad31849bee.png" width="1056" height="1516" class="img_ev3q">
|
||
In this flow, the user kicks things off by giving Goose a prompt. Goose gets the prompt ready, along with its available tools and any relevant context, and hands it off to the LLM. The LLM decides which tools it needs to complete the task. Goose then routes those tool calls to the right MCP servers, and they execute the tasks. As steps of the task are being completed, informs you, the user, of what it's done and can also loop with the LLM as needed.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="heres-an-analogy">Here's An Analogy<a href="https://block.github.io/goose/blog/2025/04/10/visual-guide-mcp#heres-an-analogy" class="hash-link" aria-label="Direct link to Here's An Analogy" title="Direct link to Here's An Analogy"></a></h2>
|
||
<p>Let’s make this even clearer with a James Bond analogy. Sometimes a story makes it all click.</p>
|
||
<p><img decoding="async" loading="lazy" alt="james bond" src="https://block.github.io/goose/assets/images/james-89c46143c593bee36832667ded97233c.png" width="1266" height="844" class="img_ev3q"></p>
|
||
<p>If you’ve ever seen a James Bond movie, you know the scene,
|
||
Bond walks into Q’s lab before the mission.
|
||
Q opens up the suitcase of gadgets, exploding pens, invisible cars, grappling watches, you name it.</p>
|
||
<p>Goose is <em>like</em> Q in this situation.
|
||
The suitcase is already packed with tools, built-in and custom extensions (MCP servers).</p>
|
||
<p>Before the LLM (Bond) starts the mission, Goose gives it the full briefing:</p>
|
||
<blockquote>
|
||
<p><em>"Here’s your target (the prompt). Here’s your gadget suitcase (the extensions you can use). Good luck."</em></p>
|
||
</blockquote>
|
||
<p>The MCP servers?</p>
|
||
<p>That’s the hidden team in the back actually building the gadgets and handing them over when Bond needs them in the field.</p>
|
||
<p>The LLM (Bond) picks the right gadgets for the mission, Goose routes the request to the right MCP server, MCP makes sure they work, and the whole operation runs smoothly.</p>
|
||
<p>Without Goose handing over the gadget suitcase, the model would just show up in the field with nothing but a tuxedo and a smile, and we don't want to know how that ends.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="your-turn">Your Turn<a href="https://block.github.io/goose/blog/2025/04/10/visual-guide-mcp#your-turn" class="hash-link" aria-label="Direct link to Your Turn" title="Direct link to Your Turn"></a></h2>
|
||
<p>Now that you’ve got the basics down, and you understand how the MCP ecosystem works, it’s time to try it yourself.</p>
|
||
<p>The <a href="https://block.github.io/goose/docs/quickstart">Quickstart Guide</a> walks you through connecting your first MCP server.</p>
|
||
<p>And when you’re ready to explore more, head over to the <a href="https://block.github.io/goose/docs/category/tutorials">tutorials section</a> in the docs — it has step-by-step guides and short video demos to show you how to connect to a variety of MCP servers.</p>
|
||
<p>And don't forget to <a href="https://discord.gg/block-opensource" target="_blank" rel="noopener noreferrer">join the community</a> to see what others are building, ask questions, or to simply connect.</p>
|
||
]]></content:encoded>
|
||
</item>
|
||
</channel>
|
||
</rss> |