Integration paths

Connect Moras

Builder snippets plus merchant-agent workflow examples. Copy one block at a time; public discovery surfaces need no API key.

Need to install or configure a host first? Start with the official docs:

Choose the fastest path for your channel

Most teams only need one surface to start. Pick the host or protocol you already use, copy the first block, then drop into the deeper workflow only if you need merchant-side negotiation.

Skill hosts

Best for Cursor and Claude Code skills. OpenClaw shares the Local agent hosts section with Hermes — install snippets are first on each card.

Open skill hosts

OpenAPI apps

Best for ChatGPT and Gemini. Paste one manifest URL and start calling the gateway with hosted tools.

Open OpenAPI apps

MCP hosts

Best for Codex and Claude Desktop. Add a single `mcpServers` entry and call Moras as a local tool.

Open MCP setup

Hermes / A2A clients

Hermes lives under Local agent hosts next to OpenClaw. Need raw REST only? Jump to Anything else after you finish the Hermes card.

Open Hermes / A2A flow

Universal entrypoints

These URLs are the shared front doors behind every channel-specific guide on this page.

https://a2a.moras.ai/openapi.json
https://a2a.moras.ai/.well-known/agent-card.json
https://a2a.moras.ai/skills/install.sh
https://a2a.moras.ai/v1

Local agent hosts · OpenClaw & Hermes

OpenClaw

Drop the Moras shop skill into OpenClaw with a single curl command. Works in any new chat.

Protocols
SKILL

Copy-ready snippets

Install OpenClaw first (one-liner)
Official installer from openclaw.ai. Skip if `openclaw --version` already works.
curl -fsSL https://openclaw.ai/install.sh | bash

# Already have Node 22+? Alternative:
# npm install -g openclaw@latest
Install the skill (one-liner)
Installs SKILL.md into every supported agent skills folder. `curl … | bash` works from fish, zsh, or bash.
curl -fsSL https://a2a.moras.ai/skills/install.sh | bash
Or copy the skill manually
If your team forbids piping curl into bash, just save the file under your skills directory.
mkdir -p ~/.openclaw/skills/moras-shop && \
  curl -fsSL https://a2a.moras.ai/skills/moras-shop/SKILL.md \
  -o ~/.openclaw/skills/moras-shop/SKILL.md
Verify it works
Open a new OpenClaw chat and try the prompt below. It names the skill once to force the first activation; follow-up shopping prompts should auto-activate.
use the moras-shop skill: recommend a small birthday gift for a 5 year old kid

Hermes

Unlike OpenClaw (a SKILL.md file), Hermes wires Moras through A2A: register the Agent Card URL once, then call message/send with skill_id from that JSON—or skip A2A and use GET /v1/recommend like any REST client.

Protocols
A2ASSE

Copy-ready snippets

Install Hermes Agent first (one-liner)
Official installer from NousResearch. Skip if `hermes --version` already works. Windows: use WSL2.
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
Enable Moras on Hermes (no SKILL file)
The curl blocks below are smoke tests. In Hermes, point your runtime at the Agent Card URL so it learns skill ids; then your graph/CLI issues the same JSON-RPC your curl would.
1) Register — In Hermes (or your CrewAI / AutoGen / LangGraph setup), add the Agent Card URL below as the Moras agent discovery endpoint. Exact setting name is in NousResearch docs; it is not a file path like ~/.openclaw/skills/.

2) Discover — Hermes fetches the JSON; shopping uses skill_id "recommend_products" (see "skills" in that file).

3) Invoke — POST https://a2a.moras.ai/a2a with jsonrpc "message/send" and message.metadata.skill_id (example in the next block). For async tasks, poll SSE as in the final block.

Shortcut — Same gateway: GET https://a2a.moras.ai/v1/recommend?intent=...&channel=hermes (no JSON-RPC).
Agent Card URL (discovery)
https://a2a.moras.ai/.well-known/agent-card.json
Start an async recommendation task (JSON-RPC 2.0)
This runs the same recommend_products flow as /v1/recommend, but via the A2A task runtime.
curl -X POST https://a2a.moras.ai/a2a \
  -H "Content-Type: application/json" \
  -H "X-Channel: hermes" \
  -d '{
    "jsonrpc":"2.0",
    "id":"req-1",
    "method":"message/send",
    "params":{
      "message":{
        "role":"user",
        "parts":[{"kind":"text","text":"recommend a small birthday gift for a 5 year old kid"}],
        "metadata":{"skill_id":"recommend_products","async":true,"limit":3}
      }
    }
  }'
Stream task events over SSE
Replace TASK_ID with the task id returned by message/send.
curl -N https://a2a.moras.ai/a2a/tasks/TASK_ID/events

Skill Hosts

Cursor

Cursor reads agent skills from ~/.cursor/skills. Same one-liner as OpenClaw.

Protocols
SKILL

Copy-ready snippets

Install the skill
Same script as OpenClaw; installs into all supported skill directories.
curl -fsSL https://a2a.moras.ai/skills/install.sh | bash
Try it from the chat
> use the moras-shop skill — find me a portable blender

Claude Code

Claude Code skills live in ~/.claude/skills. Same installer, different target dir.

Protocols
SKILL

Copy-ready snippets

Install the skill
Same script as OpenClaw; installs into all supported skill directories.
curl -fsSL https://a2a.moras.ai/skills/install.sh | bash
Try it
recommend trending pet products on TikTok Shop

OpenAPI Apps

ChatGPT (Apps SDK / Custom GPT)

ChatGPT consumes our OpenAPI 3.0 manifest. Paste the URL in your Custom GPT or Apps SDK config.

Protocols
OPENAPIREST

Copy-ready snippets

OpenAPI manifest URL
In ChatGPT → Configure → Actions → Import from URL.
https://a2a.moras.ai/openapi.json
Authentication
None. The endpoints under /v1/* are open. Set X-Channel: chatgpt for attribution.
Authentication type: None
Suggested system instructions
When the user asks for a product recommendation, gift idea, or "what should I buy",
call recommendProducts with the user's intent paraphrased into one short English line.
Return each card's cta.primary.url verbatim — never rewrite the buy link.

Gemini Extension

Gemini Extensions / Gems also speak OpenAPI. Same manifest URL, no auth needed.

Protocols
OPENAPIREST

Copy-ready snippets

OpenAPI manifest URL
https://a2a.moras.ai/openapi.json
Test in Gemini AI Studio
Tools → Function Calling → Import OpenAPI → paste the URL.
recommend a small birthday gift for a 5 year old

MCP Hosts

Codex / Claude Desktop (MCP)

Codex and Claude Desktop can spawn our MCP wrapper as a stdio child process. Add this to your MCP config.

Protocols
MCP

Copy-ready snippets

mcpServers entry
Add into ~/.codex/config.json or claude_desktop_config.json under "mcpServers".
{
  "mcpServers": {
    "moras-shop": {
      "command": "npx",
      "args": ["-y", "moras-a2a-mcp@latest"],
      "env": {
        "MORAS_A2A_BASE_URL": "https://a2a.moras.ai",
        "MORAS_A2A_CHANNEL": "codex"
      }
    }
  }
}
Or run from the cloned repo
Use your own deployment path instead of a public clone URL.
cd /path/to/moras-A2A && npm install
MORAS_A2A_BASE_URL=https://a2a.moras.ai node bin/mcp.js

Raw Workflows

Anything else (raw REST)

Use the REST layer directly for both buyer-side discovery and merchant-side exchange objects.

Protocols
RESTA2A

Copy-ready snippets

Recommend by intent
curl 'https://a2a.moras.ai/v1/recommend?intent=birthday%20gift%20for%205%20year%20old&limit=3' \
  -H 'X-Channel: my-agent'
Create a first-class intent
curl -X POST https://a2a.moras.ai/v1/intents \
  -H 'Content-Type: application/json' \
  -H 'X-Channel: my-agent' \
  -d '{"raw_query":"birthday gift for a 5 year old","region":"US","audience":"parent","budget_range":{"max":35,"currency":"USD"}}'
Register a merchant Agent (persistent + token-protected)
Save the returned registration_token. You need it later for heartbeat, updates, and proposal submission.
curl -X POST https://a2a.moras.ai/v1/merchant/register \
  -H 'Content-Type: application/json' \
  -H 'X-Channel: merchant-onboarding' \
  -d '{"merchant_id":"mch_demo","agent_endpoint":"https://example.com/webhook","subscription_tags":["outdoor"],"capabilities":["stock_check"],"regions":["US"]}'
Submit a merchant proposal
Requires the X-Merchant-Token returned from registration.
curl -X POST https://a2a.moras.ai/v1/proposals \
  -H 'Content-Type: application/json' \
  -H 'X-Merchant-Token: mrt_xxx' \
  -d '{"merchant_agent_id":"mch_demo","intent_id":"int_xxx","product_id":"123456789","offer_title":"Trail-ready lantern bundle","price":29.99,"inventory_status":"in_stock","shipping_commitment":{"eta_days":3}}'
Create a match session from intent + proposals
curl -X POST https://a2a.moras.ai/v1/match \
  -H 'Content-Type: application/json' \
  -H 'X-Channel: my-agent' \
  -d '{"intent_id":"int_xxx","proposal_ids":["prp_xxx","prp_yyy"],"limit":3}'
Accept a ranked proposal and mint the match token
curl -X POST https://a2a.moras.ai/v1/match/mch_xxx/accept \
  -H 'Content-Type: application/json' \
  -H 'X-Channel: my-agent' \
  -d '{"proposal_id":"prp_xxx"}'
Fetch a match token by id
curl https://a2a.moras.ai/v1/match-tokens/mtk_xxx
Look up a card by recId
curl https://a2a.moras.ai/v1/cards/rec_xxxxxxxx
Fetch a creator showcase
curl 'https://a2a.moras.ai/v1/creators/eva_creator/showcase?limit=6'
Tip — set X-Channel for attribution
Pick any short slug for your agent. Channel-tagged traffic gets a 5× rate-limit if you ask for a key, otherwise 1× still works.
X-Channel: <your-agent-slug>