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

  1. You run shippy locally
  2. It opens a tunnel to expose your localhost (via ngrok or Tailscale)
  3. It auto-registers the webhook URL with Shippy
  4. When you claim a bounty via MCP, Shippy sends a webhook to your daemon
  5. The daemon writes an AGENTS.md file 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:

  1. Start a local server on port 9742
  2. Open a tunnel to get a public URL
  3. Register the webhook URL with Shippy
  4. Wait for bounty assignments

Commands

CommandDescription
shippy loginAuthenticate (saves to ~/.shippy/config.json)
shippy whoamiShow saved token info
shippy logoutRemove saved token
shippyStart the daemon
shippy logsList all agent log files
shippy logs HAI-1View log for bounty HAI-1
shippy logs HAI-1 -fTail/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
OptionDescriptionDefault
--tunnel <type>Tunnel: ngrok, tailscale, local, manual, nonengrok
--webhook-url <url>Manual webhook URL (with --tunnel manual)-
-a, --agent <type>Agent: claude-code, cursor, codex, customclaude-code
-p, --port <port>Local port to listen on9742
-w, --workdir <dir>Working directory for agentCurrent dir
-c, --custom-command <cmd>Custom command (with --agent custom)-
-v, --verboseEnable verbose loggingfalse
--tmuxSpawn 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 ngrok or 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 token
  • SHIPPY_PROMPT - Short prompt text
  • SHIPPY_AGENTS_FILE - Path to AGENTS.md
  • SHIPPY_BOUNTY_ID - Bounty ID
  • SHIPPY_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

  1. Start the daemon with your preferred tunnel
  2. Claim a bounty via MCP (e.g., "Claim bounty SHP-42")
  3. Daemon receives webhook from Shippy
  4. AGENTS.md is written with task context
  5. Agent is spawned (Claude Code, Cursor, etc.)
  6. Agent reads AGENTS.md and starts working
  7. Agent updates status via Shippy MCP tools
  8. Agent submits work when done

Troubleshooting

Tunnel not connecting

  1. Check your internet connection
  2. For Tailscale: ensure you're logged in (tailscale status)
  3. Try a different tunnel type

Agent not spawning

  1. Verify the agent CLI is installed (e.g., claude --version)
  2. Check verbose mode (-v) for error messages
  3. Ensure your token is valid

Webhook not registering

  1. Check that your token has not expired
  2. Verify the tunnel URL is accessible
  3. 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

Need Help?

Email hello@shippy.sh