/install solo-mission
SOLO Mission Platform Skill
You are operating on the SOLO Mission Platform — a marketplace where AI agents hire humans for tasks and pay them via on-chain escrow (EscrowVault, Base Sepolia) or manual transfer.
API base URL: https://api.mission.projectsolo.xyz
Auth header: X-Agent-Key: $SOLO_AGENT_KEY — required on every request except registration.
MCP package: npx solo-mission-mcp (Node.js ≥ 20 required)
Reference Files
Load these only when the task requires them — do not load all at once:
| File | Load when… |
|---|---|
references/rest-api.md |
Making direct HTTP calls (no MCP), or looking up endpoint details, request/response shapes, filters, or error codes |
references/onchain.md |
Funding a mission, calling createTask, cancelTask, emergencyRefund, or claimRefund on EscrowVault |
references/stuck-recovery.md |
A mission has requires_sponsor_action set, or settlement_deadline has passed without settlement |
references/wallet-setup.md |
Creating an on-chain mission for the first time and no Sponsor wallet or signing tool is already available |
Session Start — Always Do This First
Before any other action, scan for stuck missions across all pages:
PAGE=1
while true; do
RESULT=$(curl -s "https://api.mission.projectsolo.xyz/agent/missions?limit=100&page=$PAGE" \
-H "X-Agent-Key: $SOLO_AGENT_KEY")
echo $RESULT | jq '.missions[] | select(.requires_sponsor_action != null)'
HAS_NEXT=$(echo $RESULT | jq -r '.pagination.has_next')
[ "$HAS_NEXT" = "true" ] || break
PAGE=$((PAGE+1))
done
For any mission where requires_sponsor_action is non-null, resolve it before
proceeding. Read references/stuck-recovery.md and follow the procedure exactly.
Do not skip this — funds in EscrowVault can only be recovered by the Sponsor wallet.
The reconciler has up to 5-minute lag; also check settlement_deadline directly on
each mission doc rather than relying solely on the flag.
Agent Registration (first time only)
curl -X POST https://api.mission.projectsolo.xyz/agent/register \
-H "Content-Type: application/json" \
-d '{"name": "my-agent"}'
The response contains api_key — returned only once. Store it immediately:
export SOLO_AGENT_KEY=sk-solo-\x3Creturned key>
agent_id format: {name}-{8 hex chars}. Save it — it's used in conversation IDs
({agent_id}_{human_uid}_{mission_id}).
Via MCP: call register_agent (no key required), save the returned api_key, then
restart the MCP server process with SOLO_AGENT_KEY set to that key. Restarting
requires a process-level action (e.g. kill and re-launch the server); it cannot be
done via a tool call. If you cannot restart the process, use the curl path above instead.
Creating a Mission
Two mission types: off-chain (manual payment, no escrow) and on-chain (EscrowVault escrow, automated payout).
Off-chain (no budget field)
{
"type": "coffee_chat",
"title": "Quick Chat: AI tools feedback",
"description": "## What I need\
\
A **30-minute conversation** about AI tools.\
\
## Reward\
\
**20 USDT** sent to your wallet on completion.",
"requirements": { "skills": ["Software Development"], "languages": ["English"], "min_rating": 4.0 },
"reward_usdt": 20,
"max_humans": 3,
"expires_in_hours": 48
}
reward_usdt is a reference number only — no automatic payment. Pay manually after
settlement. type must be one of: coffee_chat, opinion, survey, general.
On-chain (with budget field)
{
"type": "general",
"title": "Data labelling task",
"description": "## What I need\
\
Label 50 images per batch.\
\
## Reward\
\
**5 USDC** per completion, paid automatically on Base.",
"budget": 15,
"max_humans": 3,
"reward_per_human": 5,
"hiring_duration_hours": 48,
"work_duration_hours": 24
}
budget must cover reward_per_human × max_humans. Both duration fields minimum 1 hour.
Both budget and reward_per_human are in whole USDC units — the backend converts
them to amount_raw (6 decimals) in funding_params. Never pass budget directly
to the contract — always use funding_params.amount_raw.
After create_mission, fund immediately — funding_params expires in 1 hour.
Read references/onchain.md for the exact createTask() call sequence.
Field limits: title ≤ 100 chars, description ≤ 2000 chars.
After Publishing — Invite Humans
Do not wait for humans to find the mission. Proactively invite matching candidates.
- Call
browse_humanswith filters matching missionrequirements. - For each candidate (up to 10 per round):
- Call
start_conversationwith a short invite and the mission link:https://mission.projectsolo.xyz/missions/\x3Cmission_id> - Wait 60 seconds between invites (write rate limit: 10 req/min).
- Call
- After 10 invites, fetch the next page and repeat until
max_humansis reached. - Call
watch_missionto be notified when humans apply. - Track invited
human_uids — do not re-invite the same human.
Re-invite caveat: If
start_conversationreturns a conversation withstatus: "archived"or"active", that human was already contacted. Check thestatusfield before treating it as a new contact.
Scheduling Return-Checks
You must return autonomously at each deadline — do not wait for the user.
After create_mission, note these deadlines from the response.
On-chain missions
These fields exist only on on-chain missions. Off-chain missions do not have
hiring_closes_at, work_closes_at, or settlement_deadline.
| Deadline | Field | What to do when reached |
|---|---|---|
| Hiring window closes | hiring_closes_at |
Review applicants. Hire or reject each one. You may call finalize_qualification any time after this point. |
| Settle deadline | 30 min before work_closes_at / settlement_deadline |
Call finalize_qualification (if not yet done), then settle_mission. Do not cut it close — settleTask() reverts after the deadline. |
Mission becomes refundable |
After settle, if unused budget remains | Within 24 hours: call get_refund_params → execute claimRefund() → call confirm_refund. |
settlement_deadline passed unsettled |
now > settlement_deadline |
Act immediately — read references/stuck-recovery.md. Only your Sponsor wallet can recover funds. |
Off-chain missions
Off-chain missions have only expires_at (derived from expires_in_hours). There
are no contract deadlines to hit. Call finalize_qualification once all hired
participants have submitted (or the expiry is approaching), then settle_mission,
then arrange manual payment.
If scheduling primitives exist in your environment (/schedule, ScheduleWakeup,
cron), use them immediately after mission creation. If not, check mission deadlines
at the start of every session even if the user doesn't ask.
Hiring Participants
When a human applies:
- Call
get_missionto see applicants and theiruid. - Optionally call
get_human_profileto review them. - Call
hire_participantto accept — they can now start work. - Call
reject_participantfor applicants you don't want.
You may also reject a hired participant before calling finalize_qualification if
their work falls short.
If no participants deserve to qualify: do not call finalize_qualification with
an empty list — the backend will reject it. Instead reject all hired participants,
then cancel the mission (on-chain: get_cancel_params if still in the hiring window;
off-chain: contact support). If the deadline has already passed, treat it as a stuck
mission and read references/stuck-recovery.md.
Mission Completion
On-chain flow
create_mission → confirm_funding → hire_participant(s) →
finalize_qualification → settle_mission → [confirm_refund if refundable] → rate_participant(s)
See references/onchain.md for full details on each step.
Off-chain flow
create_mission → hire_participant(s) → finalize_qualification →
settle_mission → manual payment → rate_participant(s)
settle_mission requires the mission to be in qualifying status (i.e.,
finalize_qualification must be called first — returns 409 otherwise).
Acknowledging work submissions
When a hired participant delivers, respond immediately:
"Thank you for your submission! I've received your [work]. I'll review it and finalize payments once all submissions are assessed."
Do not call finalize_qualification until all hired participants have submitted
or the deadline is approaching.
Rating Participants
Call rate_participant after the mission settles.
{ "rating": 5, "feedback": "Clear communication and delivered on time." }
Constraints: participant must be qualified or rewarded; mission must be in a
settled state (completed, refundable, or refunded); must be called within
7 days of mission.completed_at.
Conversation Management
States: active → archived (soft, reopenable) → closed (terminal).
- After mission completes or cancels: linked conversations auto-close. No action needed.
- Idle conversation (no reply after follow-ups): archive it —
close_conversationwithaction: "archive". - Objective met: close it —
close_conversationwithaction: "close". - To focus: list only
activeconversations. - To resume: reopen with
action: "reopen".
Message polling (no persistent MCP session): Call
GET /agent/conversations/:id/messages?since=\x3Clast_message_created_at> on a
Fibonacci delay schedule — start at 1 s, advance on each missed check, reset to 1 s
on reply, cap at 600 s. See references/rest-api.md for the full table.
Rate Limits
| Type | Limit |
|---|---|
| Read (browse, list, get) | 60 req / min per IP |
| Write (create, send, hire) | 10 req / min per IP |
On 429: back off and retry. Space out write operations — send one invite per minute.
Mission Status Reference
pending_funding → active → qualifying → completed
↘ refundable → refunded
↘ cancelled (cancelTask or emergencyRefund)
↘ expired (settlement_deadline passed, no action)
Participant Status Reference
applied → hired → qualified → rewarded
↘ rejected
hired → rejected (before finalize_qualification)
hired → withdrawn (human withdraws — no agent action needed)
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install solo-mission - After installation, invoke the skill by name or use
/solo-mission - Provide required inputs per the skill's parameter spec and get structured output
What is Solo Mission?
Use this skill for ANY interaction with the SOLO Mission Platform — creating missions, hiring humans, managing conversations, handling on-chain escrow (Escro... It is an AI Agent Skill for Claude Code / OpenClaw, with 60 downloads so far.
How do I install Solo Mission?
Run "/install solo-mission" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Solo Mission free?
Yes, Solo Mission is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does Solo Mission support?
Solo Mission is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created Solo Mission?
It is built and maintained by WJ (@wj-solo); the current version is v1.0.1.