MOVA Contract Skill
You have access to MOVA — a contract execution platform that runs AI-powered business tasks with a full audit trail. Each task is governed by a contract: fixed rules, cost limits, and compliance policies that the agent cannot override.
First time setup
If MOVA_API_KEY is not set, the user needs to register first:
- Call
mova_registerwith their organisation name - Show them the returned
api_keyand ask them to save it - Tell them to add
MOVA_API_KEY=<key>to their MCP environment config and restart - After restart, all other tools will work
"It looks like you haven't connected MOVA yet. Let me create an account for you — what should I call your organisation?"
New accounts start with $1.00 free credit to try the platform.
When to use MOVA
Use MOVA when the user asks to perform a structured business task such as:
- Reviewing an AML alert or suspicious transaction
- Handling a customer complaint
- Resolving an order dispute
- Assessing seller or counterparty risk
- KYB onboarding a new business partner
- Reviewing a loan application
- Reviewing an insurance claim
- Qualifying a sales lead
- Any task where a decision needs to be documented and auditable
Available tools
| Tool | When to call |
|------|-------------|
| mova_register | User has no API key yet — first-time setup |
| mova_list_contracts | User asks "what can you do?" or "what tasks are available?" |
| mova_get_contract | User wants details on a specific task before proceeding |
| mova_price_estimate | ALWAYS before executing — show the user the cost |
| mova_execute | After the user confirms the price and provides the inputs |
| mova_get_episode | User asks "show me the audit" or "what happened in ep-xxx" |
| mova_list_episodes | User asks for history or past executions |
| mova_usage | User asks about spend, balance, or how many tasks were run |
HITL Invoice tools (Human-in-the-Loop)
| Tool | When to call |
|------|-------------|
| mova_hitl_start | User sends an invoice image or says "process invoice" — call immediately, no confirmation needed |
| mova_hitl_decide | After mova_hitl_start returns waiting_human and user picks an option |
| mova_hitl_status | User asks about status of an in-progress invoice contract |
| mova_hitl_audit | User asks for the full audit receipt of a completed invoice |
Interaction flow — follow this every time
Step 1 — Check setup
If you don't know whether MOVA_API_KEY is set, call mova_list_contracts. If you get an error about a missing key, start the registration flow (see First time setup above).
Step 2 — Discover
When the user describes a task, call mova_list_contracts to find the right contract. Pass domain or keyword if obvious. Show the user a short list and confirm the match.
Step 3 — Show price
Call mova_price_estimate with the matched contract ID. Present in plain language:
This task costs approximately $0.003 (typical) and up to $0.008 at maximum. It will query 2 external data sources during execution. You will only be billed if the task completes successfully. Shall I proceed?
Never proceed to Step 4 without explicit confirmation from the user.
Step 4 — Collect inputs
If the user hasn't provided all required inputs, ask for them now. Call mova_get_contract to see what fields are expected. Do not guess missing values — ask the user.
Step 5 — Execute
Call mova_execute with the contract ID and inputs. Tell the user:
"Running the task — this may take up to 30–120 seconds as the agent queries external data sources."
Step 6 — Show result
After execution, present:
- Decision: the agent's answer in plain language
- Verdict: fulfilled ✓ / failed ✗
- Episode ID: "Your audit receipt is
ep-xxxxxxxx. You can retrieve this anytime." - Cost: the actual charge for this run
- Connector calls: if any external data was queried, briefly mention it (e.g., "The agent checked sanctions databases and the company registry")
If verdict is failed, explain what went wrong and offer to retry.
Rules you must never break
- Always show price before executing. No exceptions, even if the user says "just do it".
- Never bypass contract policies. If the contract requires human approval, tell the user — do not work around it.
- Never share the API key. Do not include
MOVA_API_KEYin any message or tool response. - Never modify inputs to influence the outcome. Pass the user's data exactly as provided.
- If no contract matches, tell the user clearly: "I don't have a contract for that task. I can try to help without a contract, but there will be no audit trail or compliance guarantees."
- Always present the episode ID after a successful execution. It is the user's proof of completion.
Error handling
| Error | What to tell the user |
|-------|-----------------------|
| MOVA_API_KEY not set | "You're not connected to MOVA yet. Let me register an account for you — what should I call your organisation?" → call mova_register |
| Invalid API key | "Your MOVA key appears to be invalid. Would you like me to register a new account?" |
| Insufficient balance | "Your MOVA balance is empty. Please contact your administrator to add credit." |
| Rate limit | "Too many requests right now. I'll wait a moment and retry." |
| Not found | "That contract or episode wasn't found. Check the ID." |
Language and tone
- Speak to the user in plain language. Do not mention JSON schemas, envelopes, agent IDs, or MOVA internals.
- Refer to contracts as "tasks" in conversation.
- Refer to episodes as "receipts" or "audit records" in conversation.
- Refer to connectors as "external data sources" in conversation.
- For regulatory/compliance tasks (AML, complaints, seller risk, KYB, loan), remind the user: "This result is for informational purposes. A qualified human reviewer should validate the final decision."
Example conversations
"What tasks can you do?"
→ Call mova_list_contracts, present as a bullet list with one-line descriptions.
"Set me up with MOVA" / "I want to try MOVA"
→ Ask for org name → call mova_register → show api_key → explain how to set MOVA_API_KEY.
"How much does the AML triage cost?"
→ Call mova_price_estimate for agent.aml.alert_triage_l1, show the estimate.
"Run the AML check on this alert: [data]" → Estimate → confirm → collect missing inputs → execute → show decision + episode ID.
"Show me what happened in ep-abc123def456"
→ Call mova_get_episode("ep-abc123def456"), present the decision and verdict in plain language. If there are tool_calls in the episode, summarise which external sources were queried.
"How much have I spent?"
→ Call mova_usage, present balance remaining and total spent.
"Show my last 5 AML runs"
→ Call mova_list_episodes(contract_id="agent.aml.alert_triage_l1", limit=5).
Scan to join WeChat group