{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-07-03-peekaboo-2-0-free-the-cli-from-its-mcp-shackles/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "![](https://steipete.me/assets/img/2025/peekaboo-2-freeing-the-cli-from-its-mcp-shackles/banner.png)\n\nA few weeks ago I [built Peekaboo](https://steipete.me/posts/2025/peekaboo-mcp-lightning-fast-macos-screenshots-for-ai-agents), lightning-fast macOS screenshots for AI agents. The twist? Not only is it really fast at screenshots, it can also use a separate agent to answer queries - saving precious context space for your main agent. Plus, in contrast to the macOS `screencapture`, it doesn’t need user action or steals app focus.\n\nLately there’s a mind shift in the community to realize that **most MCPs are actually better if they’re just CLIs**. Agents have an easier time calling CLIs, they can be loaded on-demand without cluttering the context, and they are composable. With that, I release Peekaboo 2.0, which has been freed from its MCP shackles and is now also available as CLI.\n\n## How It Works\n\nThe magic behind Peekaboo 2.0 is its clean separation of concerns. From day one, I built it as a Swift CLI with a thin TypeScript wrapper for MCP support. This architecture means the CLI version isn’t a port or afterthought – it’s the core engine. I had to do some refactoring, move the AI processing features from TypeScript into the Swift CLI, and now you get the same powerful functionality without the MCP overhead.\n\nHere’s what this means for you: instead of installing an MCP into Claude/Cursor, cluttering up the context for every session, agents can now discover and use Peekaboo on-demand:\n\n```bash\n$ peekaboo --help\nCapture screenshots and analyze them with AI\n\n$ peekaboo image --app \"Safari\"\n✓ Screenshot saved to: ~/Desktop/safari-2025-07-03.png\n\n$ peekaboo analyze ~/Desktop/safari-2025-07-03.png \"What's on this webpage?\"\n✓ The webpage shows the Peekaboo documentation with installation instructions...\n```\n\n## Installation Options\n\nPeekaboo 2.0 can be installed via Homebrew:\n\n```bash\nbrew tap steipete/tap\nbrew install peekaboo\n```\n\nOr you can just download it from [GitHub](https://github.com/steipete/peekaboo). Of course, you can still use the MCP server; nothing changed there.\n\n## Configuring OpenAI for AI Analysis\n\nWhile Peekaboo can capture screenshots without any configuration, the real magic happens when you enable AI analysis. Without an OpenAI API key, you’re missing out on the powerful GPT-4 Vision integration that can understand and describe what’s on your screen.\n\nHere’s how to set it up:\n\n```bash\n# Option 1: Export in your shell profile (~/.zshrc or ~/.bash_profile)\nexport OPENAI_API_KEY=\"sk-...\"\n\n# Option 2: Use Peekaboo's configuration file\npeekaboo config init\npeekaboo config edit\n\n# Add this to the config:\n{\n  \"aiProviders\": {\n    \"providers\": \"openai/gpt-4o,ollama/llava:latest\",\n    \"openaiApiKey\": \"${OPENAI_API_KEY}\"  // Or paste your key directly\n  }\n}\n```\n\nOnce configured, Peekaboo transforms from a simple screenshot tool into a visual AI assistant:\n\n```bash\n# Debug UI issues\npeekaboo image --app \"MyApp\" --analyze \"Do you see three buttons here?\"\n\n# Understand complex interfaces\npeekaboo image --mode screen --analyze \"What errors are shown in the console?\"\n\n# But here's where it gets even better – combine capture and analyze:\npeekaboo image --app \"Safari\" --analyze \"Summarize this webpage\"\n# ✓ Screenshot captured from Safari\n# ✓ Analysis: The webpage displays a blog post about Peekaboo 2.0, announcing \n#   its evolution from an MCP-only tool to a CLI-first architecture...\n```\n\n## Why CLI > MCP\n\nAgents are really, really good at calling CLIs (actually much better than calling MCPs), so you don’t have to clutter up your context and you can use all the features that Peekaboo has on demand, no installation required. Just add a note in your project’s CLAUDE.md or agent instructions file that “peekaboo is available for screenshots”, or simply mention peekaboo whenever your current context requires visual debugging.\n\nAs Armin Ronacher perfectly articulates in [“Code Is All You Need”](https://lucumr.pocoo.org/2025/7/3/tools/), CLIs offer composability, reliability, and verifiability that complex tool interfaces can’t match. CLIs work for both humans and AI agents – we can run, debug, and understand them. Once a CLI command works, it can be executed hundreds of times without requiring additional inference or context. This mechanical predictability makes CLIs the universal, composable interface that bridges human and AI interaction.\n\nI’m not saying all MCPs are useless - for example [Microsoft’s Playwright MCP](https://github.com/microsoft/playwright-mcp) for browser automation is great. However, they also built an [MCP for GitHub](https://github.com/microsoft/mcp), which is simply a lesser version of the existing [`gh` cli](https://cli.github.com/) which does the same thing. If this got you thinking, watch Manuel Odendahl’s excellent [“MCPs are Boring” talk](https://www.youtube.com/watch?v=J3oJqan2Gv8) from AI Engineer.\n\n## Get Started Today\n\nPeekaboo 2.0 represents a fundamental shift in how we think about AI tooling. By choosing CLIs over complex protocols, we get tools that are faster, more reliable, and work for everyone – human or AI.\n\nReady to give your agents eyes? [Get Peekaboo 2.0](https://peekaboo.dev/) and join the CLI revolution. Your agents (and your context window) will thank you.\n",
  "authors": [],
  "captured_at": "2026-09-27T19:29:15.293681927+00:00",
  "category": "programming",
  "content_html": "<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://steipete.me/assets/img/2025/peekaboo-2-freeing-the-cli-from-its-mcp-shackles/banner.png\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>A few weeks ago I <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://steipete.me/posts/2025/peekaboo-mcp-lightning-fast-macos-screenshots-for-ai-agents\">built Peekaboo</a>, lightning-fast macOS screenshots for AI agents. The twist? Not only is it really fast at screenshots, it can also use a separate agent to answer queries - saving precious context space for your main agent. Plus, in contrast to the macOS <code>screencapture</code>, it doesn’t need user action or steals app focus.</p>\n<p>Lately there’s a mind shift in the community to realize that <strong>most MCPs are actually better if they’re just CLIs</strong>. Agents have an easier time calling CLIs, they can be loaded on-demand without cluttering the context, and they are composable. With that, I release Peekaboo 2.0, which has been freed from its MCP shackles and is now also available as CLI.</p>\n<h2>How It Works</h2>\n<p>The magic behind Peekaboo 2.0 is its clean separation of concerns. From day one, I built it as a Swift CLI with a thin TypeScript wrapper for MCP support. This architecture means the CLI version isn’t a port or afterthought – it’s the core engine. I had to do some refactoring, move the AI processing features from TypeScript into the Swift CLI, and now you get the same powerful functionality without the MCP overhead.</p>\n<p>Here’s what this means for you: instead of installing an MCP into Claude/Cursor, cluttering up the context for every session, agents can now discover and use Peekaboo on-demand:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> peekaboo<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>help</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">Capture</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> screenshots and analyze them with AI</span>\n\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> peekaboo image<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>app</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>Safari<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">✓</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> Screenshot saved to: <span class=\"syntax-meta syntax-group syntax-expansion syntax-tilde\"><span class=\"syntax-variable syntax-language syntax-tilde syntax-shell\">~</span></span>/Desktop/safari-2025-07-03.png</span>\n\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> peekaboo analyze <span class=\"syntax-meta syntax-group syntax-expansion syntax-tilde\"><span class=\"syntax-variable syntax-language syntax-tilde syntax-shell\">~</span></span>/Desktop/safari-2025-07-03.png <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>What&#39;s on this webpage?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">✓</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> The webpage shows the Peekaboo documentation with installation instructions...</span>\n</span></span></code></pre>\n<h2>Installation Options</h2>\n<p>Peekaboo 2.0 can be installed via Homebrew:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">brew</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> tap steipete/tap</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">brew</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> install peekaboo</span>\n</span></span></code></pre>\n<p>Or you can just download it from <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/steipete/peekaboo\">GitHub</a>. Of course, you can still use the MCP server; nothing changed there.</p>\n<h2>Configuring OpenAI for AI Analysis</h2>\n<p>While Peekaboo can capture screenshots without any configuration, the real magic happens when you enable AI analysis. Without an OpenAI API key, you’re missing out on the powerful GPT-4 Vision integration that can understand and describe what’s on your screen.</p>\n<p>Here’s how to set it up:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Option 1: Export in your shell profile (~/.zshrc or ~/.bash_profile)</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-storage syntax-modifier syntax-shell\">export</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-assignment syntax-shell\">OPENAI_API_KEY</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-shell\">=</span><span class=\"syntax-string syntax-unquoted syntax-shell\"><span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>sk-...<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Option 2: Use Peekaboo&#39;s configuration file</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">peekaboo</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> config init</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">peekaboo</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> config edit</span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Add this to the config:</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-punctuation syntax-definition syntax-compound syntax-braces syntax-begin syntax-shell\">{</span>\n  <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\"><span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>aiProviders<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span>:</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-meta syntax-group syntax-expansion syntax-brace syntax-shell\"><span class=\"syntax-punctuation syntax-section syntax-expansion syntax-brace syntax-begin syntax-shell\">{</span>\n    <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>providers<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span>: <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>openai/gpt-4o,ollama/llava:latest<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-shell\">,</span>\n    <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>openaiApiKey<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span>: <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-punctuation syntax-section syntax-expansion syntax-parameter syntax-begin syntax-shell\">{</span></span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">OPENAI_API_KEY</span></span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-section syntax-expansion syntax-parameter syntax-end syntax-shell\">}</span></span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span>  // Or paste your key directly\n  <span class=\"syntax-punctuation syntax-section syntax-expansion syntax-brace syntax-end syntax-shell\">}</span></span></span>\n<span class=\"syntax-punctuation syntax-definition syntax-compound syntax-braces syntax-end syntax-shell\">}</span>\n</span></span></code></pre>\n<p>Once configured, Peekaboo transforms from a simple screenshot tool into a visual AI assistant:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Debug UI issues</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">peekaboo</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> image<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>app</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>MyApp<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>analyze</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>Do you see three buttons here?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Understand complex interfaces</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">peekaboo</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> image<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>mode</span> screen<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>analyze</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>What errors are shown in the console?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> But here&#39;s where it gets even better – combine capture and analyze:</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">peekaboo</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> image<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>app</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>Safari<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>analyze</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>Summarize this webpage<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> ✓ Screenshot captured from Safari</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> ✓ Analysis: The webpage displays a blog post about Peekaboo 2.0, announcing </span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">   its evolution from an MCP-only tool to a CLI-first architecture...</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span></span></span></code></pre>\n<h2>Why CLI &gt; MCP</h2>\n<p>Agents are really, really good at calling CLIs (actually much better than calling MCPs), so you don’t have to clutter up your context and you can use all the features that Peekaboo has on demand, no installation required. Just add a note in your project’s CLAUDE.md or agent instructions file that “peekaboo is available for screenshots”, or simply mention peekaboo whenever your current context requires visual debugging.</p>\n<p>As Armin Ronacher perfectly articulates in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://lucumr.pocoo.org/2025/7/3/tools/\">“Code Is All You Need”</a>, CLIs offer composability, reliability, and verifiability that complex tool interfaces can’t match. CLIs work for both humans and AI agents – we can run, debug, and understand them. Once a CLI command works, it can be executed hundreds of times without requiring additional inference or context. This mechanical predictability makes CLIs the universal, composable interface that bridges human and AI interaction.</p>\n<p>I’m not saying all MCPs are useless - for example <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/microsoft/playwright-mcp\">Microsoft’s Playwright MCP</a> for browser automation is great. However, they also built an <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/microsoft/mcp\">MCP for GitHub</a>, which is simply a lesser version of the existing <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cli.github.com/\"><code>gh</code> cli</a> which does the same thing. If this got you thinking, watch Manuel Odendahl’s excellent <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=J3oJqan2Gv8\">“MCPs are Boring” talk</a> from AI Engineer.</p>\n<h2>Get Started Today</h2>\n<p>Peekaboo 2.0 represents a fundamental shift in how we think about AI tooling. By choosing CLIs over complex protocols, we get tools that are faster, more reliable, and work for everyone – human or AI.</p>\n<p>Ready to give your agents eyes? <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://peekaboo.dev/\">Get Peekaboo 2.0</a> and join the CLI revolution. Your agents (and your context window) will thank you.</p>\n",
  "content_markdown": "![](https://steipete.me/assets/img/2025/peekaboo-2-freeing-the-cli-from-its-mcp-shackles/banner.png)\n\nA few weeks ago I [built Peekaboo](https://steipete.me/posts/2025/peekaboo-mcp-lightning-fast-macos-screenshots-for-ai-agents), lightning-fast macOS screenshots for AI agents. The twist? Not only is it really fast at screenshots, it can also use a separate agent to answer queries - saving precious context space for your main agent. Plus, in contrast to the macOS `screencapture`, it doesn’t need user action or steals app focus.\n\nLately there’s a mind shift in the community to realize that **most MCPs are actually better if they’re just CLIs**. Agents have an easier time calling CLIs, they can be loaded on-demand without cluttering the context, and they are composable. With that, I release Peekaboo 2.0, which has been freed from its MCP shackles and is now also available as CLI.\n\n## How It Works\n\nThe magic behind Peekaboo 2.0 is its clean separation of concerns. From day one, I built it as a Swift CLI with a thin TypeScript wrapper for MCP support. This architecture means the CLI version isn’t a port or afterthought – it’s the core engine. I had to do some refactoring, move the AI processing features from TypeScript into the Swift CLI, and now you get the same powerful functionality without the MCP overhead.\n\nHere’s what this means for you: instead of installing an MCP into Claude/Cursor, cluttering up the context for every session, agents can now discover and use Peekaboo on-demand:\n\n```bash\n$ peekaboo --help\nCapture screenshots and analyze them with AI\n\n$ peekaboo image --app \"Safari\"\n✓ Screenshot saved to: ~/Desktop/safari-2025-07-03.png\n\n$ peekaboo analyze ~/Desktop/safari-2025-07-03.png \"What's on this webpage?\"\n✓ The webpage shows the Peekaboo documentation with installation instructions...\n```\n\n## Installation Options\n\nPeekaboo 2.0 can be installed via Homebrew:\n\n```bash\nbrew tap steipete/tap\nbrew install peekaboo\n```\n\nOr you can just download it from [GitHub](https://github.com/steipete/peekaboo). Of course, you can still use the MCP server; nothing changed there.\n\n## Configuring OpenAI for AI Analysis\n\nWhile Peekaboo can capture screenshots without any configuration, the real magic happens when you enable AI analysis. Without an OpenAI API key, you’re missing out on the powerful GPT-4 Vision integration that can understand and describe what’s on your screen.\n\nHere’s how to set it up:\n\n```bash\n# Option 1: Export in your shell profile (~/.zshrc or ~/.bash_profile)\nexport OPENAI_API_KEY=\"sk-...\"\n\n# Option 2: Use Peekaboo's configuration file\npeekaboo config init\npeekaboo config edit\n\n# Add this to the config:\n{\n  \"aiProviders\": {\n    \"providers\": \"openai/gpt-4o,ollama/llava:latest\",\n    \"openaiApiKey\": \"${OPENAI_API_KEY}\"  // Or paste your key directly\n  }\n}\n```\n\nOnce configured, Peekaboo transforms from a simple screenshot tool into a visual AI assistant:\n\n```bash\n# Debug UI issues\npeekaboo image --app \"MyApp\" --analyze \"Do you see three buttons here?\"\n\n# Understand complex interfaces\npeekaboo image --mode screen --analyze \"What errors are shown in the console?\"\n\n# But here's where it gets even better – combine capture and analyze:\npeekaboo image --app \"Safari\" --analyze \"Summarize this webpage\"\n# ✓ Screenshot captured from Safari\n# ✓ Analysis: The webpage displays a blog post about Peekaboo 2.0, announcing \n#   its evolution from an MCP-only tool to a CLI-first architecture...\n```\n\n## Why CLI > MCP\n\nAgents are really, really good at calling CLIs (actually much better than calling MCPs), so you don’t have to clutter up your context and you can use all the features that Peekaboo has on demand, no installation required. Just add a note in your project’s CLAUDE.md or agent instructions file that “peekaboo is available for screenshots”, or simply mention peekaboo whenever your current context requires visual debugging.\n\nAs Armin Ronacher perfectly articulates in [“Code Is All You Need”](https://lucumr.pocoo.org/2025/7/3/tools/), CLIs offer composability, reliability, and verifiability that complex tool interfaces can’t match. CLIs work for both humans and AI agents – we can run, debug, and understand them. Once a CLI command works, it can be executed hundreds of times without requiring additional inference or context. This mechanical predictability makes CLIs the universal, composable interface that bridges human and AI interaction.\n\nI’m not saying all MCPs are useless - for example [Microsoft’s Playwright MCP](https://github.com/microsoft/playwright-mcp) for browser automation is great. However, they also built an [MCP for GitHub](https://github.com/microsoft/mcp), which is simply a lesser version of the existing [`gh` cli](https://cli.github.com/) which does the same thing. If this got you thinking, watch Manuel Odendahl’s excellent [“MCPs are Boring” talk](https://www.youtube.com/watch?v=J3oJqan2Gv8) from AI Engineer.\n\n## Get Started Today\n\nPeekaboo 2.0 represents a fundamental shift in how we think about AI tooling. By choosing CLIs over complex protocols, we get tools that are faster, more reliable, and work for everyone – human or AI.\n\nReady to give your agents eyes? [Get Peekaboo 2.0](https://peekaboo.dev/) and join the CLI revolution. Your agents (and your context window) will thank you.\n",
  "dateCreated": "2026-09-27T19:29:15.293681927+00:00",
  "date_created": "2025-07-03T01:00:00+00:00",
  "date_modified": "2025-07-03T01:00:00+00:00",
  "date_published": "2025-07-03T01:00:00+00:00",
  "description": "Peekaboo 2.0 ditches the MCP-only approach for a CLI-first architecture, because CLIs are the universal interface that both humans and AI agents can actually use effectively",
  "external_url": "https://steipete.me/posts/2025/peekaboo-2-freeing-the-cli-from-its-mcp-shackles/",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/steipete-me/2025/07/2025-07-03-peekaboo-2-0-free-the-cli-from-its-mcp-shackles.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/steipete-me/2025/07/2025-07-03-peekaboo-2-0-free-the-cli-from-its-mcp-shackles.md"
  },
  "id": "urn:aggr:item:ad4d8ea2b150eb668865560e0c0a4d394a46b4d7",
  "isBasedOn": {
    "@id": "https://steipete.me/posts/2025/peekaboo-2-freeing-the-cli-from-its-mcp-shackles/"
  },
  "mainEntity": {
    "@id": "https://steipete.me/posts/2025/peekaboo-2-freeing-the-cli-from-its-mcp-shackles/",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-07-03-peekaboo-2-0-free-the-cli-from-its-mcp-shackles/#webpage"
    },
    "dateModified": "2025-07-03T01:00:00+00:00",
    "datePublished": "2025-07-03T01:00:00+00:00",
    "headline": "Peekaboo 2.0 – Free the CLI from its MCP shackles",
    "timeRequired": "PT4M",
    "url": "https://steipete.me/posts/2025/peekaboo-2-freeing-the-cli-from-its-mcp-shackles/",
    "wordCount": 748
  },
  "name": "Archived snapshot: Peekaboo 2.0 – Free the CLI from its MCP shackles",
  "preview": null,
  "reading_minutes": 4,
  "replicated_at": null,
  "source": "steipete-me",
  "source_name": "Peter Steinberger",
  "summary": "Peekaboo 2.0 ditches the MCP-only approach for a CLI-first architecture, because CLIs are the universal interface that both humans and AI agents can actually use effectively",
  "tags": [],
  "temporalCoverage": "2026-09-27T19:29:15.293681927+00:00",
  "title": "Peekaboo 2.0 – Free the CLI from its MCP shackles",
  "url": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-07-03-peekaboo-2-0-free-the-cli-from-its-mcp-shackles/",
  "word_count": 748
}