mission-control/docs/quickstart.md

236 lines
7.6 KiB
Markdown

# Quickstart: Your First Agent in 5 Minutes
Get from zero to a working agent loop with nothing but Mission Control and `curl`. No gateway, no OpenClaw, no extra dependencies.
## Prerequisites
- Mission Control running (`pnpm dev` or Docker)
- An admin account (visit `/setup` on first run)
- Your API key (auto-generated on first run, shown in Settings)
## Step 1: Start Mission Control
```bash
pnpm dev
```
Open http://localhost:3000 and log in. If this is your first run, visit http://localhost:3000/setup to create your admin account.
Your API key is displayed in **Settings > API Key**. Export it for the commands below:
```bash
export MC_URL=http://localhost:3000
export MC_API_KEY=your-api-key
```
## Step 2: Register an Agent
Agents can self-register via the API. This is how autonomous agents announce themselves to Mission Control:
```bash
curl -s -X POST "$MC_URL/api/agents/register" \
-H "Authorization: Bearer $MC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "scout", "role": "researcher"}' | jq
```
Expected response:
```json
{
"agent": {
"id": 1,
"name": "scout",
"role": "researcher",
"status": "idle",
"created_at": 1711234567
},
"registered": true,
"message": "Agent registered successfully"
}
```
Note the `id` — you'll need it for heartbeats. The registration is idempotent: calling it again with the same name just updates the agent's status to `idle`.
**Valid roles**: `coder`, `reviewer`, `tester`, `devops`, `researcher`, `assistant`, `agent`
## Step 3: Create a Task
```bash
curl -s -X POST "$MC_URL/api/tasks" \
-H "Authorization: Bearer $MC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Research competitor pricing",
"description": "Find pricing pages for the top 3 competitors and summarize their tiers.",
"priority": "medium",
"assigned_to": "scout"
}' | jq
```
Expected response:
```json
{
"task": {
"id": 1,
"title": "Research competitor pricing",
"status": "assigned",
"priority": "medium",
"assigned_to": "scout",
"tags": [],
"metadata": {}
}
}
```
The task starts in `assigned` status because you specified `assigned_to`. If you omit it, the task goes to `inbox` for manual triage.
## Step 4: Poll the Task Queue
This is how your agent picks up work. The queue endpoint atomically claims the highest-priority available task:
```bash
curl -s "$MC_URL/api/tasks/queue?agent=scout" \
-H "Authorization: Bearer $MC_API_KEY" | jq
```
Expected response:
```json
{
"task": {
"id": 1,
"title": "Research competitor pricing",
"status": "in_progress",
"assigned_to": "scout"
},
"reason": "assigned",
"agent": "scout",
"timestamp": 1711234600
}
```
The task status automatically moved from `assigned` to `in_progress`. The `reason` field tells you why this task was returned:
| Reason | Meaning |
|--------|---------|
| `assigned` | Claimed a new task from the queue |
| `continue_current` | Agent already has a task in progress |
| `at_capacity` | Agent is at max concurrent tasks |
| `no_tasks_available` | Nothing in the queue for this agent |
## Step 5: Complete the Task
When your agent finishes work, update the task status and add a resolution:
```bash
curl -s -X PUT "$MC_URL/api/tasks/1" \
-H "Authorization: Bearer $MC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "done",
"resolution": "Found pricing for Acme ($29/49/99), Widget Corp ($19/39/79), and Gadget Inc ($25/50/100). All use 3-tier SaaS model. Summary doc attached."
}' | jq
```
## Step 6: Send a Heartbeat
Heartbeats tell Mission Control your agent is alive. Without them, agents are marked offline after 10 minutes:
```bash
curl -s -X POST "$MC_URL/api/agents/1/heartbeat" \
-H "Authorization: Bearer $MC_API_KEY" \
-H "Content-Type: application/json" \
-d '{}' | jq
```
Expected response:
```json
{
"success": true,
"token_recorded": false,
"work_items": [],
"timestamp": 1711234700
}
```
In a real agent, you'd send heartbeats every 30 seconds in a background loop. The `work_items` array returns any pending tasks, mentions, or notifications.
## The Agent Loop
Here's the complete pattern your agent should follow:
```
┌─────────────────────────────────┐
│ 1. Register with MC │
│ POST /api/agents/register │
└──────────────┬──────────────────┘
v
┌─────────────────────────────────┐
│ 2. Poll for work │◄──────┐
│ GET /api/tasks/queue │ │
└──────────────┬──────────────────┘ │
│ │
v │
┌─────────────────────────────────┐ │
│ 3. Do the work │ │
│ (your agent logic here) │ │
└──────────────┬──────────────────┘ │
│ │
v │
┌─────────────────────────────────┐ │
│ 4. Report result │ │
│ PUT /api/tasks/{id} │ │
└──────────────┬──────────────────┘ │
│ │
v │
┌─────────────────────────────────┐ │
│ 5. Heartbeat + repeat │───────┘
│ POST /api/agents/{id}/hb │
└─────────────────────────────────┘
```
## Using the CLI Instead
If you prefer the CLI over `curl`, the same flow works with `pnpm mc`:
```bash
# List agents
node scripts/mc-cli.cjs agents list --json
# Create an agent
node scripts/mc-cli.cjs agents create --name scout --role researcher --json
# Create a task
node scripts/mc-cli.cjs tasks create --title "Research competitors" --body '{"assigned_to":"scout","priority":"medium"}' --json
# Poll the queue
node scripts/mc-cli.cjs tasks queue --agent scout --json
# Watch events in real time
node scripts/mc-cli.cjs events watch --types task,agent
```
See [CLI Reference](cli-agent-control.md) for the full command list.
## Using the MCP Server (for Claude Code agents)
For agents built with Claude Code, the MCP server is the recommended integration:
```bash
claude mcp add mission-control -- node /path/to/mission-control/scripts/mc-mcp-server.cjs
```
Set `MC_URL` and `MC_API_KEY` in your environment. The MCP server exposes 35+ tools for agents, tasks, sessions, memory, and more. See [CLI Integration](cli-integration.md) for details.
## What's Next?
- **[Agent Setup Guide](agent-setup.md)** — Configure SOUL personalities, agent sources, and heartbeat settings
- **[Orchestration Patterns](orchestration.md)** — Multi-agent workflows, auto-dispatch, quality review gates
- **[CLI Reference](cli-agent-control.md)** — Full CLI command reference
- **[CLI Integration](cli-integration.md)** — Direct CLI and gateway-free connections
- **[Deployment Guide](deployment.md)** — Production deployment options