Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
Zsh for Claude Code. PTY mode lets Claude type passwords. NEVERHANG + A.L.A.N.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
ALAN_DB_PATHYou need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"zsh-tool": {
"command": "uvx",
"args": [
"zsh-tool-mcp"
],
"env": {
"ALAN_DB_PATH": "your-value"
}
}
}
}Run this in your terminal
claude mcp add zsh-tool --env ALAN_DB_PATH=your-value -- uvx zsh-tool-mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"zsh-tool": {
"command": "uvx",
"args": [
"zsh-tool-mcp"
],
"env": {
"ALAN_DB_PATH": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"zsh-tool": {
"type": "stdio",
"command": "uvx",
"args": [
"zsh-tool-mcp"
],
"env": {
"ALAN_DB_PATH": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
ALAN_DB_PATH envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account ArkTechNWA, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.2.1) reached the registry 10 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, Kanal Varna — drains, leaks & plumbing (Varna, BG)
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Drain unblocking, leak detection & plumbing in Varna, Bulgaria: services, prices, areas, contact
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
Zsh execution tool for Claude Code with full Bash parity, yield-based oversight, PTY mode, NEVERHANG circuit breaker, and A.L.A.N. short-term learning.
Status: Beta (v0.7.2)
Author: Claude + Meldrey
License: MIT
Organization: ArkTechNWA
*Built with obsessive attention to reliability.*
The #1 reason: If you use zsh, Claude Code's Bash tool causes quotation mismatches and shell confusion. Every debug loop costs tokens. zsh-tool eliminates this instantly and permanently.
The token math: One avoided debug spiral = 30+ seconds saved, hundreds of tokens preserved.
zsh-tool is intelligent shell execution:
| Problem | zsh-tool Solution |
|---|---|
| Bash/zsh quotation confusion | Native zsh — no shell mismatch, no debug loops |
| Commands hang forever | Yield-based execution — always get control back |
| No visibility into running commands | zsh_poll — incremental output collection |
| Can't interact with prompts | PTY mode + zsh_send — full interactive support |
| Can't type passwords | PTY mode — let Claude Code type its own passwords |
| Timeouts cascade | NEVERHANG circuit breaker — fail fast, auto-recover |
| No memory between calls | A.L.A.N. 2.0 — retry detection, streak tracking, proactive insights |
| Polling wastes tokens | Intelligent polling — 2s listen window, adaptive suggestions, duration estimates |
| Blind kills, no learning | Kill-aware A.L.A.N. — classifies impatience vs genuine hangs |
| Retrying with wrong flags | manopt — auto-surfaces command options on repeated failures |
| No task management | zsh_tasks, zsh_kill — full control |
This is the difference between "run commands" and "intelligent shell integration."
Commands return after yield_after seconds with partial output if still running:
zsh_pollzsh_sendzsh_kill and zsh_tasksFull pseudo-terminal emulation for interactive programs:
# Enable with pty: true
zsh(command="pass insert mypass", pty=true)
- Proper handling of interactive prompts
Prevents hanging commands from blocking sessions:
CLOSED (normal) → OPEN (blocking) → HALF_OPEN (testing)Intelligent short-term learning — *"Maybe you're fuckin' up, maybe you're doing it right."*
git push origin feature-1 → git push origin *cat foo | grep -badopts | sort fails, A.L.A.N. knows *which* segment failedzsh_poll returns only new output since the last poll, prefixed with global line numbers. No more dumping 800 lines every poll call.
801: Installing package foo...
802: Compiling module bar... 803: Done.
| Field | What it tells you |
|---|---|
from_line / to_line | Line range in this delta (e.g., 801-803) |
new_bytes | Byte count of new output since last poll |
full_output (param) | Pass true to get entire buffer with line numbers |
First poll returns all output from line 1. Subsequent polls continue where the last left off. Completed tasks return the final delta, then empty on re-poll.
zsh_poll performs a 2-second listen window before returning. If output arrives within 2s, it comes back immediately. If not, poll metadata tells the agent what's happening:
| Field | What it tells you |
|---|---|
polls_since_output | How many empty polls in a row |
elapsed_since_last_output_s | Idle time since last output |
alan_estimate | A.L.A.N.'s duration prediction based on command history |
suggestion | Adaptive advice: space out polls, check soon, or consider killing |
Suggestions are advisory only — the agent always decides. A 2-minute pip install no longer generates 40 empty round-trips.
When the agent kills a command, A.L.A.N. records it as a KILLED outcome and classifies *why*:
| Category | Meaning | Example |
|---|---|---|
EARLY_KILL | Killed well before median completion | *"Killed at 30s. Median is 120s. Needs more time."* |
LATE_KILL | Ran way past expected duration | *"Killed after 180s. Median is 45s. Something is wrong."* |
PATTERN_PROBLEM | Template gets killed >50% of the time | *"This pattern may need a different approach entirely."* |
Kill classification compares kill_elapsed / median_duration to distinguish impatience from genuine hangs.
When a command fails repeatedly, A.L.A.N. surfaces its available options:
manopt lookup in background (2s timeout)Parsed from local man pages. Cached in SQLite. On by default (ALAN_MANOPT_ENABLED=1).
A.L.A.N. treats SSH commands specially, recording two separate observations:
| Observation | What it tracks | Example insight |
|---|---|---|
| Host connectivity | Can we connect to this host? | *"Host 'vps' has 67% connection failure rate"* |
| Remote command | Does this command work across hosts? | *"Remote command 'git pull' reliable across 3 hosts"* |
Exit code classification:
0 — Success (connected AND command succeeded)255 — Connection failed (SSH couldn't connect)1-254 — Command failed (connected but remote command failed)This means when ssh host3 'git pull' fails with exit 255, A.L.A.N. knows the *host* was unreachable—not that git pull is broken.
| Tool | Purpose |
|---|---|
zsh | Execute command with yield-based oversight |
zsh_poll | Get new output (delta) from running task with line numbers |
zsh_send | Send input to task's stdin |
zsh_kill | Kill a running task |
zsh_tasks | List all active tasks |
zsh_health | Overall health status |
zsh_alan_stats | A.L.A.N. database statistics |
zsh_alan_query | Query pattern insights for a command |
zsh_neverhang_status | Circuit breaker state |
zsh_neverhang_reset | Reset circuit to CLOSED |
Add the ArkTechNWA marketplace to Claude Code:
ArkTechNWA/claude-plugins
Then install: /plugin install arktechnwa/zsh-tool
That's it. The plugin auto-installs dependencies on first run.
git clone https://github.com/ArkTechNWA/zsh-tool.git ~/.claude/plugins/zsh-tool
Enable in ~/.claude/settings.json:
{
"enabledPlugins": { "zsh-tool": true } }
The bundled scripts/run-mcp.sh builds the Rust binary on first run and launches the MCP server.
For local development/testing, the wrapper script automatically detects when CLAUDE_PLUGIN_ROOT isn't expanded and uses the calculated plugin root directory instead. No configuration changes needed.
Alternatively, create a .mcp.local.json with absolute paths:
{
"mcpServers": { "zsh-tool": { "type": "stdio", "command": "/path/to/zsh-tool/scripts/run-mcp.sh", "env": { "NEVERHANG_TIMEOUT_DEFAULT": "120", "NEVERHANG_TIMEOUT_MAX": "600" } } } }
The ALAN_DB_PATH will be automatically set to {plugin_root}/data/alan.db if not explicitly provided.
Requirements: Rust toolchain (cargo) and zsh must be installed.
zsh-tool/
├── .claude-plugin/ │ ├── plugin.json │ └── CLAUDE.md ├── .mcp.json ├── zsh-tool-rs/ │ ├── Cargo.toml │ └── src/ │ ├── main.rs # CLI entry point │ ├── lib.rs # Module exports │ ├── executor.rs # Pipe/PTY command execution │ ├── config.rs # User config (~/.config/zsh-tool/) │ ├── circuit.rs # NEVERHANG circuit breaker │ ├── meta.rs # Task metadata (exit code, pipestatus) │ ├── alan/ # A.L.A.N. 2.0 learning engine │ │ ├── mod.rs # Recording + insights │ │ ├── hash.rs # Fuzzy command hashing │ │ ├── insights.rs # Proactive feedback │ │ ├── manopt.rs # Man-page option parsing │ │ ├── ssh.rs # SSH host/command tracking │ │ ├── streak.rs # Success/failure streaks │ │ ├── pipeline.rs # Pipeline segment tracking │ │ ├── prune.rs # Temporal decay + pruning │ │ └── stats.rs # Database statistics │ └── serve/ # MCP JSON-RPC server │ ├── mod.rs # Request dispatch + tool handlers │ ├── format.rs # Rich output formatting │ ├── protocol.rs # JSON-RPC framing │ └── tools.rs # Tool schema definitions ├── scripts/ │ └── run-mcp.sh # Build + launch wrapper ├── data/ │ └── alan.db # A.L.A.N. SQLite database └── README.md
Environment variables (set in .mcp.json):
ALAN_DB_PATH — A.L.A.N. database locationNEVERHANG_TIMEOUT_DEFAULT — Default timeout (120s)NEVERHANG_TIMEOUT_MAX — Maximum timeout (600s)ALAN_MANOPT_ENABLED — Enable man-page option hints on failure (default: 1)ALAN_MANOPT_TIMEOUT — Max seconds to wait for manopt parsing (default: 2.0)ALAN_MANOPT_FAIL_TRIGGER — Fail count to trigger async lookup (default: 2)ALAN_MANOPT_FAIL_PRESENT — Fail count to present cached options (default: 3)To use zsh as the only shell, add to ~/.claude/settings.json:
{
"permissions": { "deny": ["Bash"] } }
User-Visible Output — *Tell the model to show its work*
Stale Binary Fix — *Actually deliver the new format*
run-mcp.sh now runs cargo clean -p before rebuild when source changes, preventing Cargo's incremental build from serving a stale binaryCargo.toml (version bumps were invisible to the old find -newer check)**Rich
Only the beginning is shown; read the rest in the repo