Mission Control Agent Skill

Interact with Mission Control — AI agent orchestration dashboard.

by builderz-labs·MIT license·★ 6,320 Stars on the repo·GitHub ↗

Use now

Files of Mission Control Agent Skill

builderz-labs/main1 file
SKILL.md
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_changed
  • task.created, task.updated, task.status_changed

Subscribe to SSE for live dashboard updates when building integrations.

1---
2name: mission-control
3description: "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 
8Mission 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```bash
19# 1. Register
20curl -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)
30curl -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 
42MC 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 
55API key auth grants `admin` role by default. The key is set via `API_KEY` env var or the `security.api_key` DB setting.
56 
57Agents can identify themselves with the optional `X-Agent-Name` header for attribution in audit logs.
58 
59## Agent Lifecycle
60 
61```
62register → heartbeat (5m interval) → fetch assignments → report task status → disconnect
63```
64 
65All lifecycle actions go through the adapter protocol (`POST /api/adapters`).
66 
67### 1. Register
68 
69```json
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 
83Send every ~5 minutes to stay marked as online.
84 
85```json
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 
99Returns up to 5 pending tasks sorted by priority (critical → low), then due date.
100 
101```json
102{
103 "framework": "generic",
104 "action": "assignments",
105 "payload": { "agentId": "my-agent-01" }
106}
107```
108 
109**Response:**
110 
111```json
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```json
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```json
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```json
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 
182Note: Moving a task to `done` via PUT requires an Aegis quality review approval.
183 
184**POST response:**
185 
186```json
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 
229All agent lifecycle operations use a single endpoint:
230 
231```
232POST /api/adapters
233Content-Type: application/json
234x-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 
247All 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 
272MC 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 
277Subscribe to SSE for live dashboard updates when building integrations.
278 

Discussion

Alternatives