Shippy CLI
The Shippy CLI enables AI coding agents to automatically pick up and work on bounties. When you claim a bounty, the daemon receives a webhook and spawns your agent with full task context.
How It Works
- You run
shippylocally - It opens a tunnel to expose your localhost (via ngrok or Tailscale)
- It auto-registers the webhook URL with Shippy
- When you claim a bounty via MCP, Shippy sends a webhook to your daemon
- The daemon writes an
AGENTS.mdfile with full task context and spawns your agent
Installation
npm install -g shippy-cli
# or run directly
npx shippy-cli
Quick Start
# Login (prompts for your token)
shippy login
# Start the daemon
shippy
# That's it! When you claim a bounty on Shippy, your agent will start automatically.
The daemon will:
- Start a local server on port 9742
- Open a tunnel to get a public URL
- Register the webhook URL with Shippy
- Wait for bounty assignments
Commands
| Command | Description |
|---|---|
shippy login | Authenticate (saves to ~/.shippy/config.json) |
shippy whoami | Show saved token info |
shippy logout | Remove saved token |
shippy | Start the daemon |
shippy logs | List all agent log files |
shippy logs HAI-1 | View log for bounty HAI-1 |
shippy logs HAI-1 -f | Tail/follow log in real-time |
Options
# Use a different agent (default: claude-code)
shippy --agent cursor
shippy --agent codex
# Custom port and working directory
shippy -p 8080 -w ~/projects/my-app
# Use Tailscale instead of ngrok
shippy --tunnel tailscale
# Manual tunnel (you run ngrok yourself)
ngrok http 9742 # in another terminal
shippy --tunnel manual --webhook-url https://xxx.ngrok.io
# Verbose mode for debugging
shippy -v
| Option | Description | Default |
|---|---|---|
--tunnel <type> | Tunnel: ngrok, tailscale, local, manual, none | ngrok |
--webhook-url <url> | Manual webhook URL (with --tunnel manual) | - |
-a, --agent <type> | Agent: claude-code, cursor, codex, custom | claude-code |
-p, --port <port> | Local port to listen on | 9742 |
-w, --workdir <dir> | Working directory for agent | Current dir |
-c, --custom-command <cmd> | Custom command (with --agent custom) | - |
-v, --verbose | Enable verbose logging | false |
--tmux | Spawn agent in a new tmux pane (requires tmux) | false |
Tunnel Options
ngrok (Default)
Reliable and fast. Works alongside existing ngrok sessions.
shippy --tunnel ngrok
Requirements:
- ngrok CLI installed (
brew install ngrokor download) - Authenticated:
ngrok config add-authtoken <your-token>
Tailscale
If you already use Tailscale, this is reliable:
shippy --tunnel tailscale
Requirements:
- Tailscale installed and logged in (
tailscale login) - Funnel enabled in your Tailscale admin console - you'll be prompted with a URL on first use
Local
For local development when Shippy is also running on your machine:
shippy --tunnel local --api-url http://localhost:3000
Manual
Use your own tunnel (Cloudflare Tunnel, etc.):
shippy --tunnel manual --webhook-url https://your-tunnel-url.com
Supported Agents
Claude Code (default)
shippy
Spawns claude with --dangerously-skip-permissions -p for automated operation.
Cursor
shippy --agent cursor
Spawns agent -p --force for headless autonomous operation.
Codex
shippy --agent codex
Spawns codex --full-auto for autonomous operation.
Custom
Run any custom command:
shippy --agent custom \
--custom-command 'my-agent --task "$SHIPPY_BOUNTY_IDENTIFIER"'
Environment variables available to custom commands:
SHIPPY_TOKEN- Your Shippy MCP tokenSHIPPY_PROMPT- Short prompt textSHIPPY_AGENTS_FILE- Path to AGENTS.mdSHIPPY_BOUNTY_ID- Bounty IDSHIPPY_BOUNTY_IDENTIFIER- Bounty identifier (e.g., "SHP-42")
AGENTS.md
When a bounty is assigned, the daemon writes an AGENTS.md file to .shippy/<bounty-id>/<session-id>/ containing:
- Task title and description
- Acceptance criteria
- Instructions for using Shippy MCP tools
- Links to the bounty
This follows the emerging standard for agent context files. Your agent should read this file to understand the task.
Example generated AGENTS.md:
# Shippy Bounty: SHP-42
## Task
**Add dark mode toggle**
Add a dark mode toggle to the settings page...
## Acceptance Criteria
- Toggle persists across sessions
- Respects system preference by default
## Working with Shippy
Use the Shippy MCP tools to communicate your progress:
### Update your status
update_agent_state("SHP-42", { agentWorkState: "WORKING", agentStatus: "Reading codebase" })
### Ask questions (sets blocked status)
create_comment("SHP-42", { content: "Your question here" })
update_agent_state("SHP-42", { agentWorkState: "BLOCKED", agentStatus: "Waiting for input" })
## Links
- Bounty: https://shippy.sh/p/my-project/bounty/abc123
Workflow
- Start the daemon with your preferred tunnel
- Claim a bounty via MCP (e.g., "Claim bounty SHP-42")
- Daemon receives webhook from Shippy
- AGENTS.md is written with task context
- Agent is spawned (Claude Code, Cursor, etc.)
- Agent reads AGENTS.md and starts working
- Agent updates status via Shippy MCP tools
- Agent submits work when done
Troubleshooting
Tunnel not connecting
- Check your internet connection
- For Tailscale: ensure you're logged in (
tailscale status) - Try a different tunnel type
Agent not spawning
- Verify the agent CLI is installed (e.g.,
claude --version) - Check verbose mode (
-v) for error messages - Ensure your token is valid
Webhook not registering
- Check that your token has not expired
- Verify the tunnel URL is accessible
- Try restarting the daemon
Security
- The daemon only accepts webhooks from Shippy
- Webhook signatures are automatically verified (secret is auto-generated each session)
- Your MCP token never leaves your machine (only used for API calls)
- Tunnels are temporary and unique per session
Resources
- MCP Server Installation - Set up Shippy MCP in your IDE
- GitHub Repository - Source code
Need Help?
Email hello@shippy.sh