<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Solo Stack Kits]]></title><description><![CDATA[Solo Stack Kits]]></description><link>https://solostackkits.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 04 Nov 2026 00:37:11 GMT</lastBuildDate><atom:link href="https://solostackkits.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[This Week in Claude Code: Oct 20-26, 2026 (6 releases, Agent Skills goes to the Linux Foundation, 16 posts)]]></title><description><![CDATA[Six Claude Code releases shipped this week (2.1.305 to 2.1.310), most of them tightening the sandbox and permission checks and making MCP servers less…]]></description><link>https://solostackkits.hashnode.dev/this-week-in-claude-code-oct-20-26-2026</link><guid isPermaLink="true">https://solostackkits.hashnode.dev/this-week-in-claude-code-oct-20-26-2026</guid><category><![CDATA[claude]]></category><category><![CDATA[AI]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[programming]]></category><dc:creator><![CDATA[Solo Stack Kits]]></dc:creator><pubDate>Tue, 27 Oct 2026 16:36:24 GMT</pubDate><content:encoded><![CDATA[<p>Six Claude Code releases shipped this week (2.1.305 to 2.1.310), most of them tightening the sandbox and permission checks and making MCP servers less flaky. Anthropic also handed the Agent Skills standard, the <code>SKILL.md</code> format, to the Agentic AI Foundation under the Linux Foundation. Below are the changes that matter if you use Claude Code for your own or client work, then the community posts worth your time. Every item links to its source. This covers Oct 20 through Sunday afternoon, Oct 25.</p>
<h2>Releases: the changes worth knowing</h2>
<p>Full notes are on the <a href="https://code.claude.com/docs/en/changelog">official changelog</a> and the <a href="https://github.com/anthropics/claude-code/releases">GitHub releases page</a>. These are the ones that change day-to-day use.</p>
<p><strong><a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.305">2.1.305</a></strong> (Oct 20):</p>
<ul>
<li><strong><code>sandbox.allowNestedUserNamespaces</code></strong> lets sandboxed commands on Linux create user namespaces, for things like Chromium or rootless podman. The release notes are clear that this also lets those commands get around the sandbox's file protections, so only turn it on where you need it.</li>
<li><strong>Tool search regression fixed.</strong> 2.1.304 made every request fail on Vertex, Bedrock and gateways that reject tool search. Claude Code now retries without it.</li>
<li><strong><code>/effort</code> and <code>/autocompact</code> now apply</strong> when your model name differs from a <code>modelOverrides</code> value only by letter case or a <code>[1m]</code> tag.</li>
<li><strong><code>/usage</code> warnings are now one-line fixes</strong> that name their source, and pressing <code>f</code> applies them.</li>
<li><strong>Full disk errors are readable.</strong> A Bash command on a full disk now says the disk is full and that nothing ran, instead of a raw <code>ENOSPC</code> path.</li>
</ul>
<p><strong><a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.306">2.1.306</a></strong> (Oct 20, late evening ET) fixed a real API error being replaced by "prompt is too long" in sessions with many MCP tools.</p>
<p><strong><a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.307">2.1.307</a></strong> (Oct 21):</p>
<ul>
<li><strong>MCP is steadier.</strong> Servers no longer get stuck as timed out when your laptop sleeps while they connect, HTTP MCP tool calls are no longer sent twice when a connection drops mid-call (only read-only or idempotent tools are retried), and a locked macOS keychain now explains itself instead of showing "needs authentication" in <code>claude -p</code>.</li>
<li><strong>Fewer "Autocompact is thrashing" errors</strong> in turns that read many PDF pages, images or other large results.</li>
<li><strong><code>/permissions</code> &gt; Recently denied</strong> now shows the shell command that was denied, and approving a row names the command.</li>
<li><strong>New <code>claude_code.safety_event</code> OpenTelemetry event</strong> for each tool call a permission rule, auto mode, hook or the sandbox stopped or prompted.</li>
</ul>
<p><strong><a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.309">2.1.309</a></strong> (Oct 22), the security-heavy one:</p>
<ul>
<li><strong>Sandboxed Bash no longer runs your shell startup files outside the sandbox</strong> before each command (macOS and Linux).</li>
<li><strong>Several permission holes closed</strong>: an <code>Edit(path)</code> deny rule now also blocks a Bash redirect to that path in commands with a subshell, wrapped <code>cd ... &amp;&amp; git</code> commands prompt like a plain <code>cd</code>, and sandboxed commands can no longer edit the file passed with <code>--mcp-config</code>.</li>
<li><strong>Large nested <code>CLAUDE.md</code> files</strong> no longer cause repeated compaction; one over the size limit now loads only its start.</li>
<li><strong><code>/rewind</code></strong> now shows code changes made through <code>/code-review</code> turns.</li>
</ul>
<p><strong><a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.310">2.1.310</a></strong> (Oct 23):</p>
<ul>
<li><strong>The Monitor tool and plugin monitors</strong> now work on Bedrock, Vertex and Foundry, and when telemetry or nonessential traffic is off.</li>
<li><strong>Gateway fix.</strong> Requests behind gateways that reject the <code>effort-2025-11-24</code> beta value or mid-conversation system messages now retry without them.</li>
<li><strong>Windows hook fix.</strong> <code>PreToolUse</code> and <code>PermissionRequest</code> hooks no longer let a tool call through when Git Bash is missing and the hook command is only a quoted path. If you rely on a hook to block things on Windows, update.</li>
<li><strong><code>cleanupPeriodDays</code> set very high</strong> no longer lets background cleanup delete recent files like pasted images.</li>
</ul>
<p>(2.1.308 was listed only as bug fixes and reliability improvements.)</p>
<h2>Agent Skills now has a neutral home</h2>
<p>On Oct 22 Anthropic <a href="https://www.anthropic.com/news/donating-agent-skills-to-the-agentic-ai-foundation">donated Agent Skills to the Agentic AI Foundation</a>, the Linux Foundation project that already hosts MCP. The name, logo, GitHub organization and the <a href="https://agentskills.io">agentskills.io</a> domain move over, and engineers from Anthropic, Google, OpenAI and others will maintain the spec. Anthropic says more than 70 agent platforms have integrated skills and about 1 million have been published. The proposed roadmap covers versioned releases, a formal proposal process and security guidance for people who write and install skills.</p>
<p>What it means for you: a <code>SKILL.md</code> you write for Claude Code is a format with a long life, not a Claude-only trick. If you want to check one before you share it, our free <a href="https://solostackkits.netlify.app/tools/skill-md-validator.html">SKILL.md validator</a> and <a href="https://solostackkits.netlify.app/tools/skill-description-tester.html">description tester</a> run in the browser.</p>
<h2>Community: running many sessions at once</h2>
<ul>
<li><strong><a href="https://news.ycombinator.com/item?id=50160198">Show HN: Lights-on software factory boilerplate for Claude Code</a></strong>. Open-source boilerplate based on the setup behind Votito; the author says its orchestrator cut token cost by around 80% versus a bare-bones setup.</li>
<li><strong><a href="https://dev.to/aipass/aipass-is-feature-complete-here-is-what-that-means-and-the-phone-app-on-top-56f9">AIPass is feature-complete</a></strong> by @aipass. The open-source framework that turns Claude Code sessions into a team of persistent agents is now fixes-only, with a phone app for watching them.</li>
<li><strong><a href="https://dev.to/esteban-eg-kim/i-built-a-tmux-sidebar-that-tells-me-which-claude-code-session-needs-me-50j6">hivemux: a tmux sidebar that tells me which Claude Code session needs me</a></strong> by @esteban-eg-kim. Shows each session as running, waiting or done and jumps to the one that has waited longest.</li>
<li><strong><a href="https://dev.to/fxdgif/i-kept-missing-claude-codes-permission-prompts-so-i-built-a-desktop-around-it-8fc">I kept missing Claude Code's permission prompts, so I built a desktop around it</a></strong> by @fxdgif. VibeDesk, a Windows desktop that turns permission prompts into one-click cards.</li>
<li><strong><a href="https://dev.to/kubeden/multirun-a-multi-agent-run-framework-38a7">Multirun: A Multi-Agent Run Framework</a></strong> by @kubeden. Runs one task through ten isolated agents, each in its own worktree, then diffs where they agree and split.</li>
</ul>
<h2>Community: cost, limits and tokens</h2>
<ul>
<li><strong><a href="https://dev.to/pikori/how-claude-code-and-codex-tell-you-your-limits-and-why-counting-tokens-doesnt-work-2k89">How Claude Code and Codex tell you your limits</a></strong> by @pikori. Why counting tokens from local logs drifts from what <code>/usage</code> reports.</li>
<li><strong><a href="https://dev.to/bargan/what-did-that-claude-code-session-actually-cost-spend-quota-and-history-in-one-place-2b6l">What did that Claude Code session actually cost?</a></strong> by @bargan. ccdeck shows quota, per-session cost and monthly spend in one page.</li>
<li><strong><a href="https://dev.to/jaehyun_cho_0dff271e0d2e5/sending-text-as-images-cut-my-claude-tokens-by-up-to-81-it-also-started-inventing-numbers-57ol">Sending text as images cut my Claude tokens by up to 81%. It also started inventing numbers.</a></strong> by @jaehyun_cho_0dff271e0d2e5. An honest test of the trade-off.</li>
<li><strong><a href="https://dev.to/jaypokale/caveman-vs-ponytail-vs-chisle-why-id-pick-chisle-for-claude-code-46lf">caveman vs ponytail vs Chisle</a></strong> by @jaypokale. Compares answer length across three brevity rulesets on the same prompts (written by Chisle's author).</li>
<li><strong><a href="https://dev.to/ninon/i-made-coco-a-little-friend-for-claude-code-0-extra-tokens-by-default-1me7">I made Coco, a little friend for Claude Code</a></strong> by @ninon. A status-bar character that reacts locally and shows your 5-hour and weekly limits.</li>
</ul>
<h2>Community: skills, memory and MCP</h2>
<ul>
<li><strong><a href="https://news.ycombinator.com/item?id=50195133">Show HN: Skillstore</a></strong>. A library of engineering skills behind an MCP server that Claude Code can search and load as it works.</li>
<li><strong><a href="https://news.ycombinator.com/item?id=50182883">Open-source, cross-harness memory for AI agents</a></strong>. Beacon captures session telemetry from 20+ harnesses and turns it into reusable skills.</li>
<li><strong><a href="https://dev.to/kitwisestudio/i-built-a-claude-skill-that-flags-scope-creep-before-you-reply-to-a-client-26pg">I built a Claude skill that flags scope creep before you reply to a client</a></strong> by @kitwisestudio. Splits a client message into asks, checks each against scope and drafts a priced change order. Useful if you freelance.</li>
<li><strong><a href="https://dev.to/huynhtanan/build-a-hotel-rate-parity-watcher-with-claude-desktop-and-sqlite-287c">Build a hotel rate-parity watcher with Claude Desktop and SQLite</a></strong> by @huynhtanan. A Google Hotels MCP server plus a small logger (the author notes it calls paid Apify actors).</li>
</ul>
<h2>Community: building with it</h2>
<ul>
<li><strong><a href="https://dev.to/mohammed_sebaa_2610/running-claude-code-with-ollama-and-local-models-4c49">Running Claude Code with Ollama and Local Models</a></strong> by @mohammed_sebaa_2610. Install, IntelliJ setup and a local model through Ollama, tested on a small Java project.</li>
<li><strong><a href="https://dev.to/hiper2d/ai-videos-with-claude-code-for-beginners-11-prompts-062-kn6">AI videos with Claude Code for beginners: 11 prompts, $0.62</a></strong> by @hiper2d. From an empty folder to a narrated 101-second video with skills and FFmpeg, all prompts shared.</li>
</ul>
<h2>My takeaway this week</h2>
<p>Update to 2.1.309 or later if you lean on the sandbox or deny rules; the fixes this week closed real gaps, and on Windows 2.1.310 fixes hooks that could fail open. And if you've been putting off writing your own skills, the move to the Linux Foundation is a good reason to start: the same <code>SKILL.md</code> now works across many agents.</p>
<hr />
<p>Release facts on this page come from Anthropic's <a href="https://code.claude.com/docs/en/changelog">Claude Code changelog</a>, the <a href="https://github.com/anthropics/claude-code/releases">GitHub releases</a> and <a href="https://www.anthropic.com/news/donating-agent-skills-to-the-agentic-ai-foundation">Anthropic's announcement</a>. Community summaries are mine; all credit to the authors. This page isn't affiliated with Anthropic.</p>
<p>The full, searchable list of Claude Code write-ups (292 posts, sorted by category, refreshed daily) is at <a href="https://solostackkits.netlify.app/?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ssk_hashnode_weekly">solostackkits.netlify.app</a>, and the free browser tools are <a href="https://solostackkits.netlify.app/tools/">here</a>.</p>
<p>If you want ready-made skills to start from, grab our <a href="https://solostackkits.gumroad.com/l/free-consultant-skills?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ssk_hashnode_weekly">free 3-skill sample</a> (client follow-ups, meeting notes to tasks, invoice chasing), or the full <a href="https://solostackkits.gumroad.com/l/solo-consultant-kit?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ssk_hashnode_weekly">Solo Consultant Kit</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Claude Code MCP Server Not Connecting? 12 Causes and Fixes]]></title><description><![CDATA[Why a Claude Code MCP server fails to connect, never shows in /mcp, or has zero tools: wrong .mcp.json location, missing --, url with no type and more]]></description><link>https://solostackkits.hashnode.dev/claude-code-mcp-server-not-connecting-12-causes-and-fixes</link><guid isPermaLink="true">https://solostackkits.hashnode.dev/claude-code-mcp-server-not-connecting-12-causes-and-fixes</guid><category><![CDATA[claude]]></category><category><![CDATA[General Programming]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Solo Stack Kits]]></dc:creator><pubDate>Sun, 25 Oct 2026 16:42:32 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p><strong>Shortcut:</strong> our free <a href="https://solostackkits.netlify.app/tools/mcp-json-builder.html">.mcp.json builder</a> writes a valid MCP config for stdio, HTTP, SSE or WebSocket servers, always sets <code>type</code> on remote entries, and prints the matching <code>claude mcp add</code> command with the <code>--</code> in the right place, so several of the problems below can't happen. It runs in your browser.</p>
</blockquote>
<p>An MCP server gives Claude Code tools from outside your project: a database, Notion, GitHub, Stripe and so on. When one "doesn't work", it's one of three things: Claude Code never read the server's config, it read it but couldn't start or reach the server, or the server connected and isn't giving Claude any tools. Work through the checks below in order.</p>
<h2>First: what does Claude Code say about the server?</h2>
<p>From your shell, run <code>claude mcp list</code>. Each server gets a status such as <code>✔ Connected</code>, <code>! Needs authentication</code> or <code>✘ Failed to connect</code>. Then run <code>claude mcp get &lt;name&gt;</code> for the one that's broken: on a failure it shows an <code>Issue:</code> line with the HTTP status or error code and any error text the server sent back (Claude Code v2.1.219 or later). Inside a session, <code>/mcp</code> shows the same statuses and the same <code>Issue:</code> detail.</p>
<p>If the server isn't in the list at all, start at cause 1. If it says <code>Pending approval</code>, <code>Rejected</code> or <code>Disabled</code>, go to cause 3. If it says <code>Failed to connect</code>, start at cause 6. If it's connected but Claude can't use it, go to cause 12.</p>
<h2>Not loaded: 5 reasons the server never shows up</h2>
<ol>
<li><strong><code>.mcp.json</code> is in the wrong place or uses the wrong key.</strong> A project's MCP config goes at the repository root as <code>.mcp.json</code>, not inside <code>.claude/</code>. The servers sit under a top-level <code>mcpServers</code> key. A file copied from VS Code's <code>mcp.json</code>, which uses a <code>servers</code> key, never loads.</li>
<li><strong>You put <code>mcpServers</code> in <code>settings.json</code>.</strong> Claude Code's <code>settings.json</code> doesn't read an <code>mcpServers</code> key, so servers there never appear. Put project servers in <code>.mcp.json</code>, or add personal ones with <code>claude mcp add --scope user</code>, which stores them in <code>~/.claude.json</code>.</li>
<li><strong>The project server is waiting for approval, rejected or turned off.</strong> Claude Code asks once before it uses servers from a project's <code>.mcp.json</code>. If you dismissed that prompt, the server stays at <code>⏸ Pending approval</code> until you approve it from <code>/mcp</code>. In a folder you haven't trusted yet, approvals committed to the repo's <code>.claude/settings.json</code> are ignored, so run <code>claude</code> there and accept the trust dialog. A server listed in <code>disabledMcpjsonServers</code> in any settings file shows <code>✘ Rejected</code>, and one you toggled off in <code>/mcp</code> shows <code>⊘ Disabled for this project</code> until you turn it back on there. To reset your approval choices, run <code>claude mcp reset-project-choices</code>.</li>
<li><strong>You added it in a different project, or another scope wins.</strong> <code>claude mcp add</code> uses local scope by default, which loads the server only in the project folder you ran it from. Add <code>--scope user</code> to get it everywhere, or <code>--scope project</code> to share it in <code>.mcp.json</code>. If the same name exists in more than one scope, Claude Code uses the whole entry from the highest one (local, then project, then user, then plugins, then claude.ai connectors) and doesn't merge fields, so a stale local entry can hide the one you just edited. <code>claude mcp list</code> warns about the conflict; remove the extra with <code>claude mcp remove &lt;name&gt; --scope &lt;scope&gt;</code>.</li>
<li><strong>The name is reserved.</strong> Claude Code skips a server named after one of its built-ins, such as <code>workspace</code>, <code>claude-in-chrome</code> or <code>computer-use</code>, and shows a warning asking you to rename it. Server names should use only letters, numbers, hyphens and underscores.</li>
</ol>
<h2>Failed to connect (local stdio servers): 4 reasons</h2>
<ol start="6">
<li><strong>The <code>--</code> separator is missing or <code>--env</code> is in the wrong spot.</strong> For a local server, everything after <code>--</code> is the command that starts it: <code>claude mcp add example --env API_KEY=your-key -- npx -y @example/mcp-server</code>. Without <code>--</code>, Claude Code tries to read the server's own flags, such as <code>-y</code> or <code>--port</code>, as its own. And if the server name comes straight after <code>--env</code>, the CLI reads the name as another <code>KEY=value</code> pair and rejects it, so put another option such as <code>--transport stdio</code> between them.</li>
<li><strong>The command uses a relative path.</strong> Relative paths in <code>command</code> or <code>args</code> resolve against the folder you launched Claude Code from, not the folder that holds <code>.mcp.json</code>, so the server starts from one directory and fails from another. Use absolute paths for local scripts. Programs on your <code>PATH</code>, like <code>npx</code> or <code>uvx</code>, work as written.</li>
<li><strong>An environment variable is missing or has hidden whitespace.</strong> Set the variables a server needs in its own <code>env</code> block in the config instead of relying on your shell. A <code>${VAR}</code> reference to a variable that isn't set and has no <code>${VAR:-default}</code> fallback stays as the literal text <code>${VAR}</code>, and <code>claude mcp list</code> warns about it. Claude Code also warns when a pasted value carries a hidden leading or trailing space or newline, but it uses the value as written, so delete the whitespace yourself.</li>
<li><strong>The server takes too long to start.</strong> A slow first <code>npx</code> download or a heavy server can miss the startup window. Raise it with the <code>MCP_TIMEOUT</code> environment variable, in milliseconds: <code>MCP_TIMEOUT=10000 claude</code> allows ten seconds.</li>
</ol>
<h2>Failed to connect (remote servers): 2 reasons</h2>
<ol start="10">
<li><strong>The entry has a <code>url</code> but no <code>type</code>.</strong> Claude Code reads an entry with no <code>type</code> as a local stdio server, so a <code>url</code>-only entry copied from another app's config fails. Add <code>"type": "http"</code> (or <code>"sse"</code> if the service says so). For a <code>wss://</code> address use <code>"type": "ws"</code> through <code>.mcp.json</code> or <code>claude mcp add-json</code>, because <code>claude mcp add --transport</code> doesn't accept <code>ws</code>.</li>
<li><strong>The credential is missing, expired or reads as empty.</strong> <code>! Needs authentication</code> means you haven't signed in or the sign-in expired: run <code>/mcp</code>, pick the server and sign in, or run <code>claude mcp login &lt;name&gt;</code> from your shell. Sign-ins are stored per endpoint, so a second definition of the same server with a different URL needs its own sign-in. If you put a header like <code>Bearer ${ANTHROPIC_API_KEY}</code> in a remote server's config, the server receives an empty token and usually answers <code>401</code>: Claude Code deliberately reads its own and your cloud provider's credentials (and others such as <code>NPM_TOKEN</code> and <code>HTTPS_PROXY</code>) as empty in remote <code>url</code> and <code>headers</code>. Copy the key into a variable with a name of your own, such as <code>MY_SERVICE_KEY</code>, and reference that.</li>
</ol>
<h2>Connected, but Claude can't use it</h2>
<ol start="12">
<li><strong>It shows zero tools, or it dropped mid-session.</strong> A server that's connected with zero tools started but isn't returning a tool list. Select <strong>Reconnect</strong> in <code>/mcp</code>. If the count stays at zero, run <code>claude --debug=mcp</code> and read the server's error output in the debug log at <code>~/.claude/debug/&lt;session-id&gt;.txt</code>. Claude Code reconnects a remote server that drops (up to five tries) but doesn't restart a local stdio server on its own, so reconnect that one from <code>/mcp</code>. To retry every failed server at once, run <code>/mcp reconnect all</code> (v2.1.284 or later in the terminal).</li>
</ol>
<h2>Still stuck?</h2>
<p>Run <code>/doctor</code> inside Claude Code (or <code>claude doctor</code> from your shell if it won't start) for a checkup of your installation and settings that flags invalid settings files. Then start a session with <code>claude --debug=mcp</code>, reproduce the failure, and read what the server printed in <code>~/.claude/debug/&lt;session-id&gt;.txt</code>. The server's own error message usually names the missing package, key or port.</p>
<p>If the server connects but a tool call hangs, or the session freezes while a server starts, <a href="https://solostackkits.netlify.app/blog/claude-code-stuck-or-not-responding.html">Claude Code stuck or not responding</a> covers the MCP timeouts (<code>MCP_TIMEOUT</code>, <code>MCP_TOOL_TIMEOUT</code> and the per-server <code>timeout</code>).</p>
<p>If what's missing is the editor link (diffs in VS Code or JetBrains, shared selection, IDE diagnostics), that runs through a built-in <code>ide</code> server that's hidden from <code>/mcp</code>. Our <a href="https://solostackkits.netlify.app/blog/claude-code-ide-not-connecting.html">IDE not connecting</a> guide covers it.</p>
<h2>A minimal config that loads</h2>
<pre><code class="language-json">{
  "mcpServers": {
    "notion": {
      "type": "http",
      "url": "https://mcp.notion.com/mcp"
    },
    "airtable": {
      "command": "npx",
      "args": ["-y", "airtable-mcp-server"],
      "env": { "AIRTABLE_API_KEY": "${AIRTABLE_API_KEY}" }
    }
  }
}
</code></pre>
<p>Save it as <code>.mcp.json</code> in your project root, set <code>AIRTABLE_API_KEY</code> in your shell, start <code>claude</code> in that folder and approve both servers. Then run <code>/mcp</code> to sign in to Notion. The same two servers from the command line:</p>
<pre><code class="language-bash">claude mcp add --transport http notion https://mcp.notion.com/mcp
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable -- npx -y airtable-mcp-server
</code></pre>
<hr />
<p>Facts on this page come from Anthropic's <a href="https://code.claude.com/docs/en/mcp">MCP documentation</a>, <a href="https://code.claude.com/docs/en/debug-your-config">debug your configuration guide</a> and <a href="https://code.claude.com/docs/en/errors">error reference</a>. This guide isn't affiliated with Anthropic.</p>
<p>Once your tools are connected, skills turn them into repeat jobs you don't have to re-explain. Start with our <a href="https://solostackkits.gumroad.com/l/free-consultant-skills?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ssk_hashnode_mcp">free 3-skill sample</a> (client follow-ups, meeting notes to tasks, invoice chasing), or get the full <a href="https://solostackkits.gumroad.com/l/solo-consultant-kit?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ssk_hashnode_mcp">Solo Consultant Kit</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Claude Code Hooks Not Working? 12 Causes and Fixes]]></title><description><![CDATA[A checklist for when /hooks shows nothing, the hook never fires, or Claude ignores it.]]></description><link>https://solostackkits.hashnode.dev/claude-code-hooks-not-working-12-causes-and-fixes</link><guid isPermaLink="true">https://solostackkits.hashnode.dev/claude-code-hooks-not-working-12-causes-and-fixes</guid><category><![CDATA[Productivity]]></category><category><![CDATA[claude]]></category><category><![CDATA[AI]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[programming]]></category><dc:creator><![CDATA[Solo Stack Kits]]></dc:creator><pubDate>Sat, 24 Oct 2026 19:37:36 GMT</pubDate><content:encoded><![CDATA[<p>A Claude Code hook is a command that runs at a set moment, such as right before Claude uses a tool (<code>PreToolUse</code>) or when it finishes a reply (<code>Stop</code>). When a hook "doesn't work", it's one of three things: Claude Code never loaded it, it loaded but never matched, or it ran and Claude Code didn't act on what it returned. Work through the checks below in order.</p>
<h2>First: does Claude Code see the hook?</h2>
<p>Type <code>/hooks</code> at the Claude Code prompt. It lists every configured hook grouped by event. If your hook isn't there, start at cause 1. If it's there but never seems to run, go to cause 5. If it runs but doesn't block or its output is ignored, go to cause 9.</p>
<h2>Not loaded: 4 reasons /hooks shows nothing</h2>
<ol>
<li><strong>The settings file has a JSON error.</strong> Trailing commas and comments aren't allowed in Claude Code settings files, and one stray comma means none of the hooks in that file load. Paste the file into any JSON validator before anything else.</li>
<li><strong>The file is in the wrong place.</strong> Project hooks go in <code>.claude/settings.json</code> (or <code>.claude/settings.local.json</code> for just you) inside the project. Hooks for every project go in <code>~/.claude/settings.json</code>. A <code>settings.json</code> at the project root, outside <code>.claude/</code>, isn't read. Cloud sessions also don't read your local <code>~/.claude/settings.json</code>.</li>
<li><strong>The nesting is one level off.</strong> Hooks have three levels: the event name, then a list of matcher groups, then each group's own <code>hooks</code> list of handlers. The handler needs <code>"type": "command"</code> and a <code>command</code>. A handler placed straight under the event, with no matcher group around it, is the most common copy-paste mistake. The working shape is at the end of this page.</li>
<li><strong>Hooks are turned off or restricted.</strong> <code>"disableAllHooks": true</code> in any settings file turns hooks off, and the value left after settings precedence is the one that counts, so a project file can override yours. If <code>/hooks</code> says <code>Only hooks from managed settings run here</code>, your organization set <code>allowManagedHooksOnly</code>, and hooks in your user, project and local files don't run. File edits are normally picked up on their own; if a new hook still hasn't appeared after a few seconds, restart the session.</li>
</ol>
<h2>Loaded but never fires: 4 reasons</h2>
<ol start="5">
<li><strong>The matcher doesn't match the tool name exactly.</strong> Matchers are case-sensitive: <code>bash</code> never matches the <code>Bash</code> tool. A matcher made only of letters, digits, <code>_</code>, <code>-</code>, spaces, <code>,</code> and <code>|</code> is compared as an exact name (or a list of names like <code>Edit|Write</code>). Anything else is treated as an unanchored regular expression, so <code>Edit.*</code> also matches <code>NotebookEdit</code>; use <code>^Edit$</code> when you mean only Edit.</li>
<li><strong>The MCP matcher is missing <code>.*</code>.</strong> MCP tools are named <code>mcp__&lt;server&gt;__&lt;tool&gt;</code>. A matcher like <code>mcp__memory</code> contains only exact-match characters, so it's compared as an exact string and matches no tool. Use <code>mcp__memory__.*</code>. For a server bundled in a plugin, the name includes the plugin, as in <code>mcp__plugin_my-plugin_db__.*</code>.</li>
<li><strong>It's the wrong event, or the event has no matcher.</strong> <code>PreToolUse</code> fires before a tool runs and <code>PostToolUse</code> after, so a <code>PostToolUse</code> hook can't undo anything. <code>Stop</code>, <code>UserPromptSubmit</code> and a few other events don't support matchers at all and fire every time. And the optional <code>if</code> field only works on tool events; adding it to any other event stops the hook from running.</li>
<li><strong>The script can't start.</strong> On macOS and Linux the script must be executable: <code>chmod +x .claude/hooks/my-hook.sh</code>. If you see <code>command not found</code>, use an absolute path or <code>${CLAUDE_PROJECT_DIR}</code>, and quote it in shell form (<code>"\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/my-hook.sh"</code>) or add <code>"args": []</code> so Claude Code runs it directly without a shell. If the message is <code>jq: command not found</code>, install <code>jq</code> or parse the JSON with Python or Node instead.</li>
</ol>
<h2>Runs but doesn't block, or its output is ignored: 4 reasons</h2>
<ol start="9">
<li><strong>It exits 1 instead of 2.</strong> Only exit code 2 blocks. Exit 1, the usual Unix failure code, is a non-blocking error: Claude Code shows a <code>hook error</code> notice and lets the action go ahead. For a guardrail, write the reason to stderr and <code>exit 2</code>.</li>
<li><strong>The JSON has a field at the wrong level.</strong> For <code>PreToolUse</code>, <code>permissionDecision</code> and <code>permissionDecisionReason</code> belong inside <code>hookSpecificOutput</code>, next to <code>"hookEventName": "PreToolUse"</code>. At the top level they still parse, and Claude Code silently ignores them. Other events use different shapes: <code>PostToolUse</code> and <code>Stop</code> use a top-level <code>"decision": "block"</code>.</li>
<li><strong>Something prints before your JSON.</strong> Claude Code only reads stdout as JSON when it starts with <code>{</code>. If your shell profile runs an unconditional <code>echo</code> (this happens with Git Bash or when <code>BASH_ENV</code> points at <code>~/.bashrc</code>), that text lands first and your decision is read as plain text, with no error shown. Wrap profile echoes in <code>if [[ $- == *i* ]]; then ... fi</code> so they only run in interactive shells. Also build JSON with <code>jq</code> or a real encoder; hand-built strings break on quotes and backslashes.</li>
<li><strong>A hook can't loosen a deny rule.</strong> Hooks can tighten permissions but not loosen them: a hook that returns <code>"allow"</code> doesn't override a <code>deny</code> rule in your settings. In plan mode, an <code>"allow"</code> on a file edit still gets the normal plan-mode prompt. The reverse does work: a <code>PreToolUse</code> deny blocks the tool in every permission mode, including <code>bypassPermissions</code>.</li>
</ol>
<p>Bonus, for <code>Stop</code> hooks: if Claude keeps going instead of stopping, your hook is blocking every time. Read <code>stop_hook_active</code> from the input and <code>exit 0</code> when it's <code>true</code>. Claude Code overrides a <code>Stop</code> hook after it blocks eight times in a row.</p>
<h2>How to see what a hook actually did</h2>
<ul>
<li><strong>Test the script by hand.</strong> Pipe sample input in and check the exit code: <code>echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh; echo $?</code></li>
<li><strong>Read the transcript.</strong> Press <code>Ctrl+O</code>. A block shows its message; a non-blocking error shows a <code>hook error</code> notice with the first line of stderr; success usually shows nothing.</li>
<li><strong>Read the debug log.</strong> Start with <code>claude --debug-file /tmp/claude.log</code> and run <code>tail -f /tmp/claude.log</code> in another terminal, or run <code>/debug</code> mid-session. Search it for <code>Hook output does not start with {</code> (cause 11) or <code>Hook JSON output had unrecognized keys</code> (cause 10).</li>
</ul>
<h2>A minimal hook that works</h2>
<p>This blocks <code>rm -rf</code> before Bash runs it. Save it in <code>.claude/settings.json</code>:</p>
<pre><code class="language-json">{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-rm.sh"
          }
        ]
      }
    ]
  }
}
</code></pre>
<p>And the script, at <code>.claude/hooks/block-rm.sh</code> (run <code>chmod +x</code> on it):</p>
<pre><code class="language-bash">#!/bin/bash
COMMAND=$(jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q 'rm -rf'; then
  echo "Blocked: rm -rf is not allowed. Delete specific files instead." &gt;&amp;2
  exit 2
fi
exit 0
</code></pre>
<p>Run <code>/hooks</code> to confirm it's listed under <code>PreToolUse</code>, then ask Claude to delete a folder to see the block.</p>
<p>If you'd rather not write the scripts yourself, our free, MIT-licensed <a href="https://www.npmjs.com/package/claude-safety-hooks">claude-safety-hooks</a> package installs three tested <code>PreToolUse</code> hooks (dangerous shell commands, <code>.env</code> and key files, lockfile edits) with <code>npx claude-safety-hooks</code>. It backs up your existing <code>settings.json</code> first, doesn't add duplicate entries if you run it twice, and <code>--uninstall</code> removes only what it added.</p>
<p>If you'd rather generate the config than hand-write it, the free <a href="https://solostackkits.netlify.app/tools/hooks-settings-generator.html?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ssk_hashnode_hooks">hooks &amp; settings.json generator</a> writes a valid <code>hooks</code> block with exact-case matchers and blocking exit codes, in your browser.</p>
<p><em>Drafted with AI assistance and checked line by line against Anthropic's docs.</em></p>
<hr />
<p>Facts on this page come from Anthropic's <a href="https://code.claude.com/docs/en/hooks-guide">hooks guide</a> and <a href="https://code.claude.com/docs/en/hooks">hooks reference</a>. This guide isn't affiliated with Anthropic.</p>
<p>Once your guardrails are in place, skills turn your repeat client work into one-line requests. Start with our <a href="https://solostackkits.gumroad.com/l/free-consultant-skills?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ssk_hashnode_hooks">free 3-skill sample</a> (client follow-ups, meeting notes to tasks, invoice chasing), or get the full <a href="https://solostackkits.gumroad.com/l/solo-consultant-kit?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ssk_hashnode_hooks">Solo Consultant Kit</a>.</p>
]]></content:encoded></item></channel></rss>