- Add AGENT_MAIL_QUICKSTART.md: 5-minute setup guide - Add examples/python-agent/AGENT_MAIL_EXAMPLE.md: working code examples - Add examples/python-agent/agent_with_mail.py: runnable multi-agent demo - Update README.md: add Agent Mail to features and docs index - Update AGENTS.md: enhance with quickstart/example references - Update examples README: add Agent Mail example to index Amp-Thread-ID: https://ampcode.com/threads/T-5d5e711d-7b5f-42ca-b75a-5b6cd843ad98 Co-authored-by: Amp <amp@ampcode.com>
479 lines
11 KiB
Markdown
479 lines
11 KiB
Markdown
# Agent Mail Quick Start Guide
|
|
|
|
Get started with Agent Mail for multi-agent bd coordination in 5 minutes.
|
|
|
|
## What is Agent Mail?
|
|
|
|
Agent Mail is an **optional** coordination layer for bd that reduces latency from 2-5 seconds (git sync) to <100ms (HTTP API) and prevents work collisions through file reservations.
|
|
|
|
**When to use it:**
|
|
- ✅ Multiple AI agents working concurrently
|
|
- ✅ Frequent status updates (high collision risk)
|
|
- ✅ Real-time coordination needed
|
|
|
|
**When to skip it:**
|
|
- ❌ Single agent workflows
|
|
- ❌ Infrequent updates (low collision risk)
|
|
- ❌ Simplicity preferred over latency
|
|
|
|
## 5-Minute Setup
|
|
|
|
### Step 1: Install Agent Mail Server (30 seconds)
|
|
|
|
```bash
|
|
git clone https://github.com/Dicklesworthstone/mcp_agent_mail.git ~/mcp_agent_mail
|
|
cd ~/mcp_agent_mail
|
|
python3 -m venv .venv
|
|
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
pip install -e .
|
|
```
|
|
|
|
### Step 2: Start the Server (5 seconds)
|
|
|
|
```bash
|
|
python -m mcp_agent_mail.cli serve-http
|
|
# ✅ Server running on http://127.0.0.1:8765
|
|
```
|
|
|
|
Leave this terminal open. Open a new terminal for Step 3.
|
|
|
|
### Step 3: Configure Your Agent (10 seconds)
|
|
|
|
```bash
|
|
# Set environment variables
|
|
export BEADS_AGENT_MAIL_URL=http://127.0.0.1:8765
|
|
export BEADS_AGENT_NAME=my-agent
|
|
export BEADS_PROJECT_ID=my-project
|
|
```
|
|
|
|
### Step 4: Use bd Normally (30 seconds)
|
|
|
|
```bash
|
|
# Find ready work
|
|
bd ready
|
|
|
|
# Claim an issue
|
|
bd update bd-42 --status in_progress
|
|
# ✅ Reserved bd-42 for my-agent in <100ms
|
|
|
|
# Complete work
|
|
bd close bd-42 "Done"
|
|
# ✅ Reservation released automatically
|
|
```
|
|
|
|
**That's it!** bd now uses Agent Mail for coordination.
|
|
|
|
### Step 5: Test Multi-Agent (1 minute)
|
|
|
|
Open a second terminal:
|
|
|
|
```bash
|
|
# Terminal 2 - Different agent
|
|
export BEADS_AGENT_MAIL_URL=http://127.0.0.1:8765
|
|
export BEADS_AGENT_NAME=other-agent
|
|
export BEADS_PROJECT_ID=my-project
|
|
|
|
# Try claiming same issue
|
|
bd update bd-42 --status in_progress
|
|
# ❌ Error: bd-42 already reserved by my-agent
|
|
```
|
|
|
|
**Success!** Agent Mail prevented collision.
|
|
|
|
## Common Use Cases
|
|
|
|
### Use Case 1: Claude Desktop + Command Line Agent
|
|
|
|
**Terminal 1 - Agent Mail Server:**
|
|
```bash
|
|
cd ~/mcp_agent_mail
|
|
source .venv/bin/activate
|
|
python -m mcp_agent_mail.cli serve-http
|
|
```
|
|
|
|
**Terminal 2 - Command Line:**
|
|
```bash
|
|
export BEADS_AGENT_MAIL_URL=http://127.0.0.1:8765
|
|
export BEADS_AGENT_NAME=cli-user
|
|
export BEADS_PROJECT_ID=my-project
|
|
|
|
bd ready
|
|
bd update bd-100 --status in_progress
|
|
```
|
|
|
|
**Claude Desktop:**
|
|
```
|
|
# In Claude's MCP settings, add env vars:
|
|
{
|
|
"beads": {
|
|
"command": "beads-mcp",
|
|
"env": {
|
|
"BEADS_AGENT_MAIL_URL": "http://127.0.0.1:8765",
|
|
"BEADS_AGENT_NAME": "claude",
|
|
"BEADS_PROJECT_ID": "my-project"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Now Claude and your command line won't step on each other!
|
|
|
|
### Use Case 2: Multiple Python Agents
|
|
|
|
**Terminal 1 - Server:**
|
|
```bash
|
|
cd ~/mcp_agent_mail
|
|
source .venv/bin/activate
|
|
python -m mcp_agent_mail.cli serve-http
|
|
```
|
|
|
|
**Terminal 2 - Agent A:**
|
|
```bash
|
|
cd ~/myproject/examples/python-agent
|
|
./agent_with_mail.py \
|
|
--agent-name alice \
|
|
--project-id myproject \
|
|
--agent-mail-url http://127.0.0.1:8765
|
|
```
|
|
|
|
**Terminal 3 - Agent B:**
|
|
```bash
|
|
cd ~/myproject/examples/python-agent
|
|
./agent_with_mail.py \
|
|
--agent-name bob \
|
|
--project-id myproject \
|
|
--agent-mail-url http://127.0.0.1:8765
|
|
```
|
|
|
|
Watch them coordinate in real-time!
|
|
|
|
### Use Case 3: Team Workflow
|
|
|
|
**Shared Server (runs on dev machine):**
|
|
```bash
|
|
# Machine 192.168.1.100
|
|
python -m mcp_agent_mail.cli serve-http --host 0.0.0.0
|
|
```
|
|
|
|
**Team Member 1:**
|
|
```bash
|
|
export BEADS_AGENT_MAIL_URL=http://192.168.1.100:8765
|
|
export BEADS_AGENT_NAME=alice
|
|
export BEADS_PROJECT_ID=team-project
|
|
|
|
bd ready
|
|
```
|
|
|
|
**Team Member 2:**
|
|
```bash
|
|
export BEADS_AGENT_MAIL_URL=http://192.168.1.100:8765
|
|
export BEADS_AGENT_NAME=bob
|
|
export BEADS_PROJECT_ID=team-project
|
|
|
|
bd ready
|
|
```
|
|
|
|
Entire team shares one coordination server!
|
|
|
|
### Use Case 4: CI/CD Pipeline
|
|
|
|
**GitHub Actions Example:**
|
|
|
|
```yaml
|
|
name: AI Agent Workflow
|
|
on: [push]
|
|
|
|
jobs:
|
|
agent-work:
|
|
runs-on: ubuntu-latest
|
|
|
|
services:
|
|
agent-mail:
|
|
image: ghcr.io/dicklesworthstone/mcp_agent_mail:latest
|
|
ports:
|
|
- 8765:8765
|
|
|
|
strategy:
|
|
matrix:
|
|
agent: [agent-1, agent-2, agent-3]
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Run agent
|
|
env:
|
|
BEADS_AGENT_MAIL_URL: http://localhost:8765
|
|
BEADS_AGENT_NAME: ${{ matrix.agent }}
|
|
BEADS_PROJECT_ID: ${{ github.repository }}
|
|
run: |
|
|
bd ready | head -1 | xargs -I {} bd update {} --status in_progress
|
|
# ... do work ...
|
|
bd close {} "Completed by CI"
|
|
```
|
|
|
|
Three agents run in parallel without collisions!
|
|
|
|
## Verification Checklist
|
|
|
|
After setup, verify everything works:
|
|
|
|
**✅ Server is running:**
|
|
```bash
|
|
curl http://127.0.0.1:8765/health
|
|
# Expected: {"status": "healthy"}
|
|
```
|
|
|
|
**✅ Environment variables are set:**
|
|
```bash
|
|
echo $BEADS_AGENT_MAIL_URL
|
|
# Expected: http://127.0.0.1:8765
|
|
|
|
echo $BEADS_AGENT_NAME
|
|
# Expected: my-agent
|
|
|
|
echo $BEADS_PROJECT_ID
|
|
# Expected: my-project
|
|
```
|
|
|
|
**✅ bd sees Agent Mail:**
|
|
```bash
|
|
bd info --json | grep agent_mail
|
|
# Expected: JSON with agent_mail config
|
|
```
|
|
|
|
**✅ Reservations work:**
|
|
```bash
|
|
# Terminal 1
|
|
bd update bd-test --status in_progress
|
|
# Expected: Success
|
|
|
|
# Terminal 2 (different agent)
|
|
export BEADS_AGENT_NAME=other-agent
|
|
bd update bd-test --status in_progress
|
|
# Expected: Error - reservation conflict
|
|
```
|
|
|
|
**✅ Graceful degradation works:**
|
|
```bash
|
|
# Stop server (Ctrl+C in server terminal)
|
|
|
|
# Try bd command
|
|
bd ready
|
|
# Expected: Warning about Agent Mail unavailable, but command succeeds
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Problem: "Agent Mail unavailable" warnings
|
|
|
|
**Symptoms:**
|
|
```
|
|
WARN Agent Mail unavailable, falling back to git-only mode
|
|
```
|
|
|
|
**Quick Fix:**
|
|
1. Check server is running: `curl http://127.0.0.1:8765/health`
|
|
2. Verify URL is correct: `echo $BEADS_AGENT_MAIL_URL`
|
|
3. Restart server if needed
|
|
|
|
### Problem: Agents don't see each other's reservations
|
|
|
|
**Cause:** Different `BEADS_PROJECT_ID` values
|
|
|
|
**Quick Fix:**
|
|
```bash
|
|
# All agents MUST use same project ID!
|
|
export BEADS_PROJECT_ID=same-project-name
|
|
```
|
|
|
|
### Problem: Reservation stuck after agent crashes
|
|
|
|
**Quick Fix:**
|
|
```bash
|
|
# Option 1: Release via API
|
|
curl -X DELETE http://127.0.0.1:8765/api/reservations/bd-stuck
|
|
|
|
# Option 2: Restart server (clears all reservations)
|
|
pkill -f mcp_agent_mail
|
|
python -m mcp_agent_mail.cli serve-http
|
|
```
|
|
|
|
### Problem: Port 8765 already in use
|
|
|
|
**Quick Fix:**
|
|
```bash
|
|
# Find what's using port
|
|
lsof -i :8765 # macOS/Linux
|
|
netstat -ano | findstr :8765 # Windows
|
|
|
|
# Kill old server
|
|
pkill -f mcp_agent_mail
|
|
|
|
# Or use different port
|
|
python -m mcp_agent_mail.cli serve-http --port 8766
|
|
export BEADS_AGENT_MAIL_URL=http://127.0.0.1:8766
|
|
```
|
|
|
|
## Monitoring
|
|
|
|
### Web UI
|
|
|
|
View all reservations in real-time:
|
|
```bash
|
|
open http://127.0.0.1:8765/mail
|
|
```
|
|
|
|
### API
|
|
|
|
Check reservations programmatically:
|
|
```bash
|
|
# List all reservations
|
|
curl http://127.0.0.1:8765/api/reservations | jq
|
|
|
|
# Check specific reservation
|
|
curl http://127.0.0.1:8765/api/reservations/bd-42 | jq
|
|
|
|
# Release reservation manually
|
|
curl -X DELETE http://127.0.0.1:8765/api/reservations/bd-42
|
|
```
|
|
|
|
### Logs
|
|
|
|
Agent Mail logs to stdout. Redirect to file if needed:
|
|
```bash
|
|
python -m mcp_agent_mail.cli serve-http > agent-mail.log 2>&1 &
|
|
tail -f agent-mail.log
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
### 1. Use Descriptive Agent Names
|
|
|
|
**Bad:**
|
|
```bash
|
|
export BEADS_AGENT_NAME=agent1
|
|
export BEADS_AGENT_NAME=agent2
|
|
```
|
|
|
|
**Good:**
|
|
```bash
|
|
export BEADS_AGENT_NAME=claude-frontend
|
|
export BEADS_AGENT_NAME=gpt4-backend
|
|
export BEADS_AGENT_NAME=alice-laptop
|
|
```
|
|
|
|
Makes debugging much easier!
|
|
|
|
### 2. Set Environment Variables Globally
|
|
|
|
**Option 1: Shell Profile**
|
|
```bash
|
|
# Add to ~/.bashrc or ~/.zshrc
|
|
export BEADS_AGENT_MAIL_URL=http://127.0.0.1:8765
|
|
export BEADS_AGENT_NAME=$(whoami)-$(hostname)
|
|
export BEADS_PROJECT_ID=$(basename $(pwd))
|
|
```
|
|
|
|
**Option 2: Project Config**
|
|
```bash
|
|
# .env file in project root
|
|
BEADS_AGENT_MAIL_URL=http://127.0.0.1:8765
|
|
BEADS_AGENT_NAME=my-agent
|
|
BEADS_PROJECT_ID=my-project
|
|
|
|
# Load in scripts
|
|
source .env
|
|
```
|
|
|
|
### 3. Use Same Project ID Across Team
|
|
|
|
Create a shared config:
|
|
```bash
|
|
# team-config.sh
|
|
export BEADS_PROJECT_ID=our-team-project
|
|
export BEADS_AGENT_MAIL_URL=http://agent-mail.internal:8765
|
|
|
|
# Each team member sources it
|
|
source team-config.sh
|
|
export BEADS_AGENT_NAME=alice # Only this differs per person
|
|
```
|
|
|
|
### 4. Monitor Reservations in Long-Running Agents
|
|
|
|
```python
|
|
# Check reservation health periodically
|
|
import requests
|
|
|
|
def check_reservations():
|
|
resp = requests.get(f"{agent_mail_url}/api/reservations")
|
|
my_reservations = [r for r in resp.json() if r["agent_id"] == agent_name]
|
|
|
|
for res in my_reservations:
|
|
# Release if work completed
|
|
if is_done(res["resource_id"]):
|
|
requests.delete(f"{agent_mail_url}/api/reservations/{res['resource_id']}")
|
|
```
|
|
|
|
### 5. Handle Graceful Degradation
|
|
|
|
Always assume Agent Mail might be unavailable:
|
|
```python
|
|
try:
|
|
bd_update(issue_id, status="in_progress")
|
|
except ReservationConflict:
|
|
# Expected - try different issue
|
|
pass
|
|
except Exception:
|
|
# Agent Mail down - falls back to git
|
|
# Continue normally
|
|
pass
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
1. **Read the full guide**: [AGENT_MAIL.md](AGENT_MAIL.md)
|
|
2. **Try the Python example**: [examples/python-agent/AGENT_MAIL_EXAMPLE.md](../examples/python-agent/AGENT_MAIL_EXAMPLE.md)
|
|
3. **Review the ADR**: [adr/002-agent-mail-integration.md](adr/002-agent-mail-integration.md)
|
|
4. **Check out benchmarks**: [../latency_results.md](../latency_results.md)
|
|
|
|
## Getting Help
|
|
|
|
**Documentation:**
|
|
- [AGENT_MAIL.md](AGENT_MAIL.md) - Complete integration guide
|
|
- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - General bd troubleshooting
|
|
- [FAQ.md](FAQ.md) - Frequently asked questions
|
|
|
|
**Issues:**
|
|
- [bd issues](https://github.com/steveyegge/beads/issues) - Integration bugs
|
|
- [Agent Mail issues](https://github.com/Dicklesworthstone/mcp_agent_mail/issues) - Server bugs
|
|
|
|
**Community:**
|
|
- [Discussions](https://github.com/steveyegge/beads/discussions) - Ask questions
|
|
- [Examples](../examples/) - Learn from working code
|
|
|
|
## TL;DR - Copy-Paste Setup
|
|
|
|
```bash
|
|
# 1. Install Agent Mail
|
|
git clone https://github.com/Dicklesworthstone/mcp_agent_mail.git ~/mcp_agent_mail
|
|
cd ~/mcp_agent_mail
|
|
python3 -m venv .venv
|
|
source .venv/bin/activate
|
|
pip install -e .
|
|
|
|
# 2. Start server (leave running)
|
|
python -m mcp_agent_mail.cli serve-http &
|
|
|
|
# 3. Configure agent (in new terminal)
|
|
export BEADS_AGENT_MAIL_URL=http://127.0.0.1:8765
|
|
export BEADS_AGENT_NAME=my-agent
|
|
export BEADS_PROJECT_ID=my-project
|
|
|
|
# 4. Use bd normally - coordination happens automatically!
|
|
bd ready
|
|
bd update bd-42 --status in_progress
|
|
bd close bd-42 "Done"
|
|
```
|
|
|
|
**Done!** You're now using Agent Mail for sub-100ms coordination.
|