Mission Control Agent Skill
Interact with Mission Control — AI agent orchestration dashboard.
by builderz-labs·MIT license·★ 6,320 Stars on the repo·GitHub ↗
Files of Mission Control Agent Skill
builderz-labs/
Show the full text278 lines
Mission Control Agent Skill
Mission Control (MC) is an AI agent orchestration dashboard with real-time SSE/WebSocket, a skill registry, framework adapters, and RBAC. This skill teaches agents how to interact with MC APIs programmatically.
Quick Start
Base URL: http://localhost:3000 (default Next.js dev) or your deployed host.
Auth header: x-api-key: <your-api-key>
Register + heartbeat in two calls:
# 1. Register
curl -X POST http://localhost:3000/api/adapters \
-H "Content-Type: application/json" \
-H "x-api-key: $MC_API_KEY" \
-d '{
"framework": "generic",
"action": "register",
"payload": { "agentId": "my-agent-01", "name": "My Agent" }
}'
# 2. Heartbeat (repeat every 5 minutes)
curl -X POST http://localhost:3000/api/adapters \
-H "Content-Type: application/json" \
-H "x-api-key: $MC_API_KEY" \
-d '{
"framework": "generic",
"action": "heartbeat",
"payload": { "agentId": "my-agent-01", "status": "online" }
}'
Authentication
MC supports two auth methods:
| Method | Header | Use Case |
|---|---|---|
| API Key | x-api-key: <key> or Authorization: Bearer <key> |
Agents, scripts, CI/CD |
| Session cookie | Cookie: __Host-mc-session=<token> (HTTPS) or mc-session=<token> (HTTP) |
Browser UI |
Roles (hierarchical): viewer < operator < admin
- viewer — Read-only access (GET endpoints)
- operator — Create/update agents, tasks, skills, use adapters
- admin — Full access including user management
API key auth grants admin role by default. The key is set via API_KEY env var or the security.api_key DB setting.
Agents can identify themselves with the optional X-Agent-Name header for attribution in audit logs.
Agent Lifecycle
register → heartbeat (5m interval) → fetch assignments → report task status → disconnect
All lifecycle actions go through the adapter protocol (POST /api/adapters).
1. Register
{
"framework": "generic",
"action": "register",
"payload": {
"agentId": "my-agent-01",
"name": "My Agent",
"metadata": { "version": "1.0", "capabilities": ["code", "review"] }
}
}
2. Heartbeat
Send every ~5 minutes to stay marked as online.
{
"framework": "generic",
"action": "heartbeat",
"payload": {
"agentId": "my-agent-01",
"status": "online",
"metrics": { "tasks_completed": 5, "uptime_seconds": 3600 }
}
}
3. Fetch Assignments
Returns up to 5 pending tasks sorted by priority (critical → low), then due date.
{
"framework": "generic",
"action": "assignments",
"payload": { "agentId": "my-agent-01" }
}
Response:
{
"assignments": [
{ "taskId": "42", "description": "Fix login bug\nUsers cannot log in with SSO", "priority": 1 }
],
"framework": "generic"
}
4. Report Task Progress
{
"framework": "generic",
"action": "report",
"payload": {
"taskId": "42",
"agentId": "my-agent-01",
"progress": 75,
"status": "in_progress",
"output": "Fixed SSO handler, running tests..."
}
}
status values: in_progress, done, failed, blocked
5. Disconnect
{
"framework": "generic",
"action": "disconnect",
"payload": { "agentId": "my-agent-01" }
}
Core API Reference
Agents — /api/agents
| Method | Min Role | Description |
|---|---|---|
| GET | viewer | List agents. Query: ?status=online&role=dev&limit=50&offset=0 |
| POST | operator | Create agent. Body: { name, role, status?, config?, template?, session_key?, soul_content? } |
| PUT | operator | Update agent. Body: { name, status?, role?, config?, session_key?, soul_content?, last_activity? } |
GET response shape:
{
"agents": [{
"id": 1, "name": "scout", "role": "researcher", "status": "online",
"config": {}, "taskStats": { "total": 10, "assigned": 2, "in_progress": 1, "completed": 7 }
}],
"total": 1, "page": 1, "limit": 50
}
Tasks — /api/tasks
| Method | Min Role | Description |
|---|---|---|
| GET | viewer | List tasks. Query: ?status=in_progress&assigned_to=scout&priority=high&project_id=1&limit=50&offset=0 |
| POST | operator | Create task. Body: { title, description?, status?, priority?, assigned_to?, project_id?, tags?, metadata?, due_date?, estimated_hours? } |
| PUT | operator | Bulk status update. Body: { tasks: [{ id, status }] } |
Priority values: critical, high, medium, low
Status values: inbox, assigned, in_progress, review, done, failed, blocked, cancelled
Note: Moving a task to done via PUT requires an Aegis quality review approval.
POST response:
{
"task": {
"id": 42, "title": "Fix login bug", "status": "assigned",
"priority": "high", "assigned_to": "scout", "ticket_ref": "GEN-001",
"tags": ["bug"], "metadata": {}
}
}
Skills — /api/skills
| Method | Min Role | Description |
|---|---|---|
| GET | viewer | List all skills across roots |
GET ?mode=content&source=...&name=... |
viewer | Read a skill's SKILL.md content |
GET ?mode=check&source=...&name=... |
viewer | Run security check on a skill |
| POST | operator | Create/upsert skill. Body: { source, name, content } |
| PUT | operator | Update skill content. Body: { source, name, content } |
DELETE ?source=...&name=... |
operator | Delete a skill |
Skill sources: user-agents, user-codex, project-agents, project-codex, openclaw
Status — /api/status
| Action | Min Role | Description |
|---|---|---|
GET ?action=overview |
viewer | System status (uptime, memory, disk, sessions) |
GET ?action=dashboard |
viewer | Aggregated dashboard data with DB stats |
GET ?action=gateway |
viewer | Gateway process status and port check |
GET ?action=models |
viewer | Available AI models (catalog + local Ollama) |
GET ?action=health |
viewer | Health checks (gateway, disk, memory) |
GET ?action=capabilities |
viewer | Feature flags: gateway reachable, Claude home, subscriptions |
Adapters — /api/adapters
| Method | Min Role | Description |
|---|---|---|
| GET | viewer | List available framework adapter names |
| POST | operator | Execute adapter action (see Agent Lifecycle above) |
Framework Adapter Protocol
All agent lifecycle operations use a single endpoint:
POST /api/adapters
Content-Type: application/json
x-api-key: <key>
{
"framework": "<adapter-name>",
"action": "<action>",
"payload": { ... }
}
Available frameworks: generic, openclaw, crewai, langgraph, autogen, claude-sdk
Available actions: register, heartbeat, report, assignments, disconnect
All adapters implement the same FrameworkAdapter interface — choose the one matching your agent framework, or use generic as a universal fallback.
Payload shapes by action:
| Action | Required Fields | Optional Fields |
|---|---|---|
register |
agentId, name |
metadata |
heartbeat |
agentId |
status, metrics |
report |
taskId, agentId |
progress, status, output |
assignments |
agentId |
— |
disconnect |
agentId |
— |
Environment Variables
| Variable | Default | Description |
|---|---|---|
API_KEY |
— | API key for agent/script authentication |
OPENCLAW_GATEWAY_HOST |
127.0.0.1 |
Gateway host address |
OPENCLAW_GATEWAY_PORT |
18789 |
Gateway port |
OPENCLAW_STATE_DIR |
~/.openclaw |
OpenClaw state directory |
OPENCLAW_CONFIG_PATH |
<state-dir>/openclaw.json |
Gateway config file path |
MC_CLAUDE_HOME |
~/.claude |
Claude home directory |
Real-Time Events
MC broadcasts events via SSE (/api/events) and WebSocket. Key event types:
agent.created,agent.updated,agent.status_changedtask.created,task.updated,task.status_changed
Subscribe to SSE for live dashboard updates when building integrations.
| 1 | |
| 2 | name mission-control |
| 3 | description "Interact with Mission Control — AI agent orchestration dashboard. Use when registering agents, managing tasks, syncing skills, or querying agent/task status via MC APIs." |
| 4 | |
| 5 | |
| 6 | # Mission Control Agent Skill |
| 7 | |
| 8 | Mission Control (MC) is an AI agent orchestration dashboard with real-time SSE/WebSocket, a skill registry, framework adapters, and RBAC. This skill teaches agents how to interact with MC APIs programmatically. |
| 9 | |
| 10 | ## Quick Start |
| 11 | |
| 12 | **Base URL:** `http://localhost:3000` (default Next.js dev) or your deployed host. |
| 13 | |
| 14 | **Auth header:** `x-api-key: <your-api-key>` |
| 15 | |
| 16 | **Register + heartbeat in two calls:** |
| 17 | |
| 18 | |
| 19 | # 1. Register |
| 20 | curl -X POST http://localhost:3000/api/adapters \ |
| 21 | -H "Content-Type: application/json" \ |
| 22 | -H "x-api-key: $MC_API_KEY" \ |
| 23 | -d '{ |
| 24 | "framework": "generic", |
| 25 | "action": "register", |
| 26 | "payload": { "agentId": "my-agent-01", "name": "My Agent" } |
| 27 | }' |
| 28 | |
| 29 | # 2. Heartbeat (repeat every 5 minutes) |
| 30 | curl -X POST http://localhost:3000/api/adapters \ |
| 31 | -H "Content-Type: application/json" \ |
| 32 | -H "x-api-key: $MC_API_KEY" \ |
| 33 | -d '{ |
| 34 | "framework": "generic", |
| 35 | "action": "heartbeat", |
| 36 | "payload": { "agentId": "my-agent-01", "status": "online" } |
| 37 | }' |
| 38 | |
| 39 | |
| 40 | ## Authentication |
| 41 | |
| 42 | MC supports two auth methods: |
| 43 | |
| 44 | | Method | Header | Use Case | |
| 45 | |--------|--------|----------| |
| 46 | | API Key | `x-api-key: <key>` or `Authorization: Bearer <key>` | Agents, scripts, CI/CD | |
| 47 | | Session cookie | `Cookie: __Host-mc-session=<token>` (HTTPS) or `mc-session=<token>` (HTTP) | Browser UI | |
| 48 | |
| 49 | **Roles (hierarchical):** `viewer` < `operator` < `admin` |
| 50 | |
| 51 | **viewer** — Read-only access (GET endpoints) |
| 52 | **operator** — Create/update agents, tasks, skills, use adapters |
| 53 | **admin** — Full access including user management |
| 54 | |
| 55 | API key auth grants `admin` role by default. The key is set via `API_KEY` env var or the `security.api_key` DB setting. |
| 56 | |
| 57 | Agents can identify themselves with the optional `X-Agent-Name` header for attribution in audit logs. |
| 58 | |
| 59 | ## Agent Lifecycle |
| 60 | |
| 61 | |
| 62 | register → heartbeat (5m interval) → fetch assignments → report task status → disconnect |
| 63 | |
| 64 | |
| 65 | All lifecycle actions go through the adapter protocol (`POST /api/adapters`). |
| 66 | |
| 67 | ### 1. Register |
| 68 | |
| 69 | |
| 70 | { |
| 71 | "framework": "generic", |
| 72 | "action": "register", |
| 73 | "payload": { |
| 74 | "agentId": "my-agent-01", |
| 75 | "name": "My Agent", |
| 76 | "metadata": { "version": "1.0", "capabilities": ["code", "review"] } |
| 77 | } |
| 78 | } |
| 79 | |
| 80 | |
| 81 | ### 2. Heartbeat |
| 82 | |
| 83 | Send every ~5 minutes to stay marked as online. |
| 84 | |
| 85 | |
| 86 | { |
| 87 | "framework": "generic", |
| 88 | "action": "heartbeat", |
| 89 | "payload": { |
| 90 | "agentId": "my-agent-01", |
| 91 | "status": "online", |
| 92 | "metrics": { "tasks_completed": 5, "uptime_seconds": 3600 } |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | |
| 97 | ### 3. Fetch Assignments |
| 98 | |
| 99 | Returns up to 5 pending tasks sorted by priority (critical → low), then due date. |
| 100 | |
| 101 | |
| 102 | { |
| 103 | "framework": "generic", |
| 104 | "action": "assignments", |
| 105 | "payload": { "agentId": "my-agent-01" } |
| 106 | } |
| 107 | |
| 108 | |
| 109 | **Response:** |
| 110 | |
| 111 | |
| 112 | { |
| 113 | "assignments": [ |
| 114 | { "taskId": "42", "description": "Fix login bug\nUsers cannot log in with SSO", "priority": 1 } |
| 115 | ], |
| 116 | "framework": "generic" |
| 117 | } |
| 118 | |
| 119 | |
| 120 | ### 4. Report Task Progress |
| 121 | |
| 122 | |
| 123 | { |
| 124 | "framework": "generic", |
| 125 | "action": "report", |
| 126 | "payload": { |
| 127 | "taskId": "42", |
| 128 | "agentId": "my-agent-01", |
| 129 | "progress": 75, |
| 130 | "status": "in_progress", |
| 131 | "output": "Fixed SSO handler, running tests..." |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | |
| 136 | `status` values: `in_progress`, `done`, `failed`, `blocked` |
| 137 | |
| 138 | ### 5. Disconnect |
| 139 | |
| 140 | |
| 141 | { |
| 142 | "framework": "generic", |
| 143 | "action": "disconnect", |
| 144 | "payload": { "agentId": "my-agent-01" } |
| 145 | } |
| 146 | |
| 147 | |
| 148 | ## Core API Reference |
| 149 | |
| 150 | ### Agents — `/api/agents` |
| 151 | |
| 152 | | Method | Min Role | Description | |
| 153 | |--------|----------|-------------| |
| 154 | | GET | viewer | List agents. Query: `?status=online&role=dev&limit=50&offset=0` | |
| 155 | | POST | operator | Create agent. Body: `{ name, role, status?, config?, template?, session_key?, soul_content? }` | |
| 156 | | PUT | operator | Update agent. Body: `{ name, status?, role?, config?, session_key?, soul_content?, last_activity? }` | |
| 157 | |
| 158 | **GET response shape:** |
| 159 | |
| 160 | |
| 161 | { |
| 162 | "agents": [{ |
| 163 | "id": 1, "name": "scout", "role": "researcher", "status": "online", |
| 164 | "config": {}, "taskStats": { "total": 10, "assigned": 2, "in_progress": 1, "completed": 7 } |
| 165 | }], |
| 166 | "total": 1, "page": 1, "limit": 50 |
| 167 | } |
| 168 | |
| 169 | |
| 170 | ### Tasks — `/api/tasks` |
| 171 | |
| 172 | | Method | Min Role | Description | |
| 173 | |--------|----------|-------------| |
| 174 | | GET | viewer | List tasks. Query: `?status=in_progress&assigned_to=scout&priority=high&project_id=1&limit=50&offset=0` | |
| 175 | | POST | operator | Create task. Body: `{ title, description?, status?, priority?, assigned_to?, project_id?, tags?, metadata?, due_date?, estimated_hours? }` | |
| 176 | | PUT | operator | Bulk status update. Body: `{ tasks: [{ id, status }] }` | |
| 177 | |
| 178 | **Priority values:** `critical`, `high`, `medium`, `low` |
| 179 | |
| 180 | **Status values:** `inbox`, `assigned`, `in_progress`, `review`, `done`, `failed`, `blocked`, `cancelled` |
| 181 | |
| 182 | Note: Moving a task to `done` via PUT requires an Aegis quality review approval. |
| 183 | |
| 184 | **POST response:** |
| 185 | |
| 186 | |
| 187 | { |
| 188 | "task": { |
| 189 | "id": 42, "title": "Fix login bug", "status": "assigned", |
| 190 | "priority": "high", "assigned_to": "scout", "ticket_ref": "GEN-001", |
| 191 | "tags": ["bug"], "metadata": {} |
| 192 | } |
| 193 | } |
| 194 | |
| 195 | |
| 196 | ### Skills — `/api/skills` |
| 197 | |
| 198 | | Method | Min Role | Description | |
| 199 | |--------|----------|-------------| |
| 200 | | GET | viewer | List all skills across roots | |
| 201 | | GET `?mode=content&source=...&name=...` | viewer | Read a skill's SKILL.md content | |
| 202 | | GET `?mode=check&source=...&name=...` | viewer | Run security check on a skill | |
| 203 | | POST | operator | Create/upsert skill. Body: `{ source, name, content }` | |
| 204 | | PUT | operator | Update skill content. Body: `{ source, name, content }` | |
| 205 | | DELETE `?source=...&name=...` | operator | Delete a skill | |
| 206 | |
| 207 | **Skill sources:** `user-agents`, `user-codex`, `project-agents`, `project-codex`, `openclaw` |
| 208 | |
| 209 | ### Status — `/api/status` |
| 210 | |
| 211 | | Action | Min Role | Description | |
| 212 | |--------|----------|-------------| |
| 213 | | GET `?action=overview` | viewer | System status (uptime, memory, disk, sessions) | |
| 214 | | GET `?action=dashboard` | viewer | Aggregated dashboard data with DB stats | |
| 215 | | GET `?action=gateway` | viewer | Gateway process status and port check | |
| 216 | | GET `?action=models` | viewer | Available AI models (catalog + local Ollama) | |
| 217 | | GET `?action=health` | viewer | Health checks (gateway, disk, memory) | |
| 218 | | GET `?action=capabilities` | viewer | Feature flags: gateway reachable, Claude home, subscriptions | |
| 219 | |
| 220 | ### Adapters — `/api/adapters` |
| 221 | |
| 222 | | Method | Min Role | Description | |
| 223 | |--------|----------|-------------| |
| 224 | | GET | viewer | List available framework adapter names | |
| 225 | | POST | operator | Execute adapter action (see Agent Lifecycle above) | |
| 226 | |
| 227 | ## Framework Adapter Protocol |
| 228 | |
| 229 | All agent lifecycle operations use a single endpoint: |
| 230 | |
| 231 | |
| 232 | POST /api/adapters |
| 233 | Content-Type: application/json |
| 234 | x-api-key: <key> |
| 235 | |
| 236 | { |
| 237 | "framework": "<adapter-name>", |
| 238 | "action": "<action>", |
| 239 | "payload": { ... } |
| 240 | } |
| 241 | |
| 242 | |
| 243 | **Available frameworks:** `generic`, `openclaw`, `crewai`, `langgraph`, `autogen`, `claude-sdk` |
| 244 | |
| 245 | **Available actions:** `register`, `heartbeat`, `report`, `assignments`, `disconnect` |
| 246 | |
| 247 | All adapters implement the same `FrameworkAdapter` interface — choose the one matching your agent framework, or use `generic` as a universal fallback. |
| 248 | |
| 249 | **Payload shapes by action:** |
| 250 | |
| 251 | | Action | Required Fields | Optional Fields | |
| 252 | |--------|----------------|-----------------| |
| 253 | | `register` | `agentId`, `name` | `metadata` | |
| 254 | | `heartbeat` | `agentId` | `status`, `metrics` | |
| 255 | | `report` | `taskId`, `agentId` | `progress`, `status`, `output` | |
| 256 | | `assignments` | `agentId` | — | |
| 257 | | `disconnect` | `agentId` | — | |
| 258 | |
| 259 | ## Environment Variables |
| 260 | |
| 261 | | Variable | Default | Description | |
| 262 | |----------|---------|-------------| |
| 263 | | `API_KEY` | — | API key for agent/script authentication | |
| 264 | | `OPENCLAW_GATEWAY_HOST` | `127.0.0.1` | Gateway host address | |
| 265 | | `OPENCLAW_GATEWAY_PORT` | `18789` | Gateway port | |
| 266 | | `OPENCLAW_STATE_DIR` | `~/.openclaw` | OpenClaw state directory | |
| 267 | | `OPENCLAW_CONFIG_PATH` | `<state-dir>/openclaw.json` | Gateway config file path | |
| 268 | | `MC_CLAUDE_HOME` | `~/.claude` | Claude home directory | |
| 269 | |
| 270 | ## Real-Time Events |
| 271 | |
| 272 | MC broadcasts events via SSE (`/api/events`) and WebSocket. Key event types: |
| 273 | |
| 274 | `agent.created`, `agent.updated`, `agent.status_changed` |
| 275 | `task.created`, `task.updated`, `task.status_changed` |
| 276 | |
| 277 | Subscribe to SSE for live dashboard updates when building integrations. |
| 278 |
Discussion
Alternatives
Browse more free Claude skills or everything in Development.