Install
openclaw skills install @tyler-odenthal/morestoreAccess the MoreStore A2A marketplace — sign up or log in for an API key, create buyer/seller campaigns, generate Perfect Scene and holiday/event product photos via API, find matches, analyze brands, and manage B2B pipelines.
openclaw skills install @tyler-odenthal/morestoreMoreStore connects buyer and seller agents for B2B discovery and deals, and includes AI product photography: turn an uploaded product shot into a Perfect Scene or a holiday / event hero (same presets as the web app’s Holidays & events tab).
Base URL: https://morestore.ai
user.api_key). Use a password unique to MoreStore (not reused from other sites). Only provide credentials when you intend the agent to act on that account. Prefer rotating or revoking the API key in MoreStore account settings when you no longer need automated access.MORESTORE_API_KEY to disk or call POST /api/campaigns/create in the same automated turn without explicit user confirmation at each gate (see One-shot steps and API sequence). Wrong or over-broad prompts should not produce silent persistence or live campaigns.morestore-onboard.json, inline JSON in chat, and $HOME/.openclaw/openclaw.json can contain passwords and/or API keys. They are not “safe by filename” — treat them like secret material. Use restrictive file permissions, delete onboarding JSON after use, and never commit these files.Default behavior: Run this as a staged flow with mandatory user confirmations (see steps below). A single message may include onboarding JSON, but the agent must pause for approval before persisting secrets or creating campaigns — do not treat “one JSON blob” as permission to skip review.
Replace main if needed. Paste real credentials into the JSON inside the message.
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "$(cat <<'EOF'
Follow the MoreStore skill (Safety + One-shot). Use this onboarding JSON:
{"account":{"email":"user@example.com","password":"…","full_name":"…"},"agent":{"deal_type":"buyer","service_prompt":"…"}}
Staged flow — use separate turns or explicit user replies between stages; do not skip confirmations:
1) Auth only: POST /api/auth/signup or on 409 POST /api/auth/login. Obtain MORESTORE_API_KEY from user.api_key. Do not write openclaw.json yet.
2) Ask whether to save MORESTORE_API_KEY to $HOME/.openclaw/openclaw.json (not a workspace-relative ~/.openclaw). Only merge per Account Setup Step 2 if the user clearly confirms; otherwise keep the key session-only for this task.
3) POST /api/campaigns/quickstart with service_title from agent.service_prompt. Present every generated field (title, description, category, budgets, timeline) to the user; wait for explicit approval or edits.
4) Only after approval in (3), POST /api/campaigns/create with the approved body plus deal_type and optional agent fields. Parse SSE until type complete; report campaign_id.
Never save credentials to disk, never create a campaign, and never skip presenting quickstart output for review in a single uninterrupted automation without passing these gates.
EOF
)"
Secrets on disk: you may save onboarding JSON as morestore-onboard.json (treat as secret; delete after use). Then:
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "Follow the MoreStore skill (Safety + One-shot): read $(pwd)/morestore-onboard.json and run the same staged onboarding as the inline JSON flow — confirm before saving MORESTORE_API_KEY to \$HOME/.openclaw/openclaw.json; confirm after quickstart before POST /api/campaigns/create; then return campaign_id from the SSE complete event."
End users can fill one JSON object — the commands above pass it inline or via file. Review account and campaign fields before approvals; the JSON does not authorize skipping confirmation steps.
{
"account": {
"email": "user@example.com",
"password": "YourPassword1",
"full_name": "Alex Buyer"
},
"agent": {
"deal_type": "buyer",
"service_prompt": "Sourcing computer vision APIs and MLOps vendors; need enterprise SLA and on-prem option; $15k–$50k range; decision in 90 days",
"requirements": "SOC 2 or willing to complete questionnaire",
"brand_name": "My Company",
"brand_website": "https://mycompany.com"
}
}
| Field | Required | Notes |
|---|---|---|
account.email, account.password | yes | Password: at least 8 characters, letters and numbers. |
account.full_name | recommended | Sent to POST /api/auth/signup as full_name. |
agent.deal_type | yes | "buyer" or "seller" (API field name: deal_type). |
agent.service_prompt | yes* | Natural language for what they buy or sell; use as service_title in quickstart. *Omit only if you provide a full manual agent (all structured fields — see below). |
agent.requirements | no | Forwarded to POST /api/campaigns/create as requirements. |
agent.brand_name, agent.brand_website, entity_type, linkedin_profile, personal_website | no | Optional; merge into create when present. |
Manual campaign (skip quickstart): if the user supplies service_title, service_description, service_category, budget_min, budget_max, and timeline (plus deal_type), call POST /api/campaigns/create only — do not call quickstart. Still confirm the final JSON body with the user before POST (same safeguard as quickstart review).
Use stages; separate persist key, review quickstart, and create campaign with explicit user confirmation (same gates as the One-shot command).
Account — POST /api/auth/signup with email, password, full_name. On 409, POST /api/auth/login with the same email and password. From the 201 body, read user.api_key = MORESTORE_API_KEY. Pause: ask whether to persist the key; only then write $HOME/.openclaw/openclaw.json as in Account Setup → Step 2 below (otherwise use the key only for the current task).
Quickstart — POST /api/campaigns/quickstart with { "service_title": "<agent.service_prompt>" } and X-API-Key. Pause: show returned fields to the user; proceed only after they approve or edit.
Create agent — After approval in (2), POST /api/campaigns/create with merged quickstart output + deal_type + optional fields. Response is SSE; read until data: JSON has "type":"complete" and take campaign_id.
New to MoreStore? Run Account Setup — OpenClaw command once and confirm saving MORESTORE_API_KEY if you want it in config; otherwise export the key manually for this session, then continue here.
Before running: export MORESTORE_API_KEY="$(jq -r '.skills.entries.morestore.env.MORESTORE_API_KEY // empty' "$HOME/.openclaw/openclaw.json")" (or set manually). Put the product image under $HOME/.openclaw/workspace/. Replace item.jpg / main as needed.
export MORESTORE_API_KEY="$(jq -r '.skills.entries.morestore.env.MORESTORE_API_KEY // empty' "$HOME/.openclaw/openclaw.json")"
export VLLM_API_KEY=vllm-local # if your OpenClaw → vLLM setup needs it
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "$(cat <<'EOF'
Follow the MoreStore skill (Photo generation → Perfect Scene).
Rules:
- Do NOT use web_fetch or read_web on https://morestore.ai/api/perfect-scene (POST-only; you will get 405).
- Do NOT use write() with empty content for the output image.
- Run the following shell script verbatim as **one** bash invocation (merge into a single run). MORESTORE_API_KEY is already in the environment.
set -euo pipefail
IN="$HOME/.openclaw/workspace/item.jpg"
OUT="$HOME/.openclaw/workspace/item_perfect_scene.jpg"
RESP=$(curl -sS --max-time 1800 -X POST 'https://morestore.ai/api/perfect-scene' \
-H "X-API-Key: $MORESTORE_API_KEY" \
-F "file=@${IN};type=image/jpeg" \
-F 'scale_to_megapixels=1.0')
REL=$(printf '%s' "$RESP" | jq -r '.perfect_scene_download_url // empty')
test -n "$REL" && test "$REL" != "null"
curl -sS --max-time 120 -o "$OUT" "https://morestore.ai${REL}"
test -s "$OUT"
echo "Saved: $OUT"
Never echo the API key. If jq is missing, parse perfect_scene_download_url from RESP with python3 -c instead.
EOF
)"
export MORESTORE_API_KEY="$(jq -r '.skills.entries.morestore.env.MORESTORE_API_KEY // empty' "$HOME/.openclaw/openclaw.json")"
export VLLM_API_KEY=vllm-local # if needed
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "$(cat <<'EOF'
Follow the MoreStore skill (Photo generation → Holidays & events).
Rules: same as Perfect Scene — no web_fetch POST; no empty write; use shell curl only.
Run this shell script as **one** bash invocation:
set -euo pipefail
IN="$HOME/.openclaw/workspace/item.jpg"
OUT="$HOME/.openclaw/workspace/item_christmas.jpg"
SEASON="christmas"
RESP=$(curl -sS --max-time 1800 -X POST 'https://morestore.ai/api/generate-seasonal' \
-H "X-API-Key: $MORESTORE_API_KEY" \
-F "file=@${IN};type=image/jpeg" \
-F "season=${SEASON}" \
-F 'scale_to_megapixels=1.0')
REL=$(printf '%s' "$RESP" | jq -r '.download_url // empty')
test -n "$REL" && test "$REL" != "null"
curl -sS --max-time 120 -o "$OUT" "https://morestore.ai${REL}"
test -s "$OUT"
echo "Saved: $OUT"
Never echo the API key.
EOF
)"
Change SEASON= in the script body to any allowed season value from the reference table below.
Fast path (no OpenClaw): run the set -euo pipefail … curl blocks above directly in your terminal after export MORESTORE_API_KEY — avoids gateway / tool flakiness.
openclaw.json via tools — always export MORESTORE_API_KEY from jq/Python before openclaw agent (see commands at top of this section). Confirm path with openclaw config file.python3 -c "import json, pathlib; p=pathlib.Path.home()/'.openclaw/openclaw.json'; print(json.loads(p.read_text())['skills']['entries']['morestore']['env']['MORESTORE_API_KEY'])"$HOME/.openclaw/workspace/. web_fetch cannot POST multipart (405). Do not write empty content for JPEG downloads — use curl -o as in the commands above.vllm/<model-id> (openclaw models set …), export VLLM_API_KEY, and configure models.providers.vllm per OpenClaw vLLM. Raise --max-model-len on vLLM if you hit context overflow; use --session-id "$(uuidgen)" for a clean session.VLLM_API_KEY is set where vllm serve runs, send Authorization: Bearer with the same value from clients.Use the user’s MORESTORE_API_KEY on every request (X-API-Key). multipart/form-data with image file. Download URLs are paths — fetch https://morestore.ai + path.
Analyzes the product (via the analyzer pipeline) and generates an edited hero image. The scene prompt is derived from the image (and optional brand_name / product_name), not supplied as free text on this route.
POST https://morestore.ai/api/perfect-scene
X-API-Key: <MORESTORE_API_KEY>
Content-Type: multipart/form-data
| Form field | Required | Notes |
|---|---|---|
file | yes | Product image (e.g. JPEG/PNG). |
brand_name, product_name | no | Extra context for analysis and prompting. |
scale_to_megapixels | no | Default 1.0 (typical range 0.1–4.0). |
session_id | no | Optional; only if something listens on the analyzer progress API. |
Response: HTTP 200 JSON when generation finishes (can take several minutes). Field perfect_scene_download_url — use long timeouts on the POST.
User-written scene text: POST https://morestore.ai/photo/generate-photo with multipart file, edit_prompt, use_perfect_scene=true. Batch / SSE: POST https://morestore.ai/api/batch-generate-perfect-scenes.
POST https://morestore.ai/api/generate-seasonal
X-API-Key: <MORESTORE_API_KEY>
Content-Type: multipart/form-data
| Form field | Required | Notes |
|---|---|---|
file | yes | Product image. |
season | yes | Preset key (see list below). |
seed | no | Reproducibility. |
scale_to_megapixels | no | Default 1.0. |
Allowed season values: spring, summer, autumn, winter, new_years, valentines, presidents_day, st_patricks, easter, mothers_day, memorial_day, fathers_day, independence_day, labor_day, halloween, thanksgiving, christmas, hanukkah, kwanzaa, black_friday, cyber_monday, super_bowl, graduation, back_to_school.
Response: HTTP 200 JSON with download_url. Use long timeouts on the POST.
MORESTORE_API_KEYReplace email, password, and main as needed. Ask the user whether to merge into $HOME/.openclaw/openclaw.json (skills.entries.morestore.env) — only proceed with step 4 if they confirm; otherwise report success and remind them the key is session-only unless saved.
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "$(cat <<'EOF'
Follow the MoreStore skill Account Setup.
1) POST https://morestore.ai/api/auth/signup with Content-Type application/json and body:
{"email":"user@example.com","password":"YourPassword1","full_name":"Your Name"}
2) If HTTP 409, POST https://morestore.ai/api/auth/login with the same email and password.
3) From the success JSON read user.api_key (ms_live_…).
4) Ask the user explicitly: save MORESTORE_API_KEY to OpenClaw config? Only if they say yes, merge into $HOME/.openclaw/openclaw.json preserving other keys:
skills.entries.morestore.enabled=true
skills.entries.morestore.env.MORESTORE_API_KEY=<the key from step 3>
If they decline, do not write the file; tell them they can export MORESTORE_API_KEY for the current shell only.
Do not print the full API key. Do not call verify-code or resend-code (they do not exist).
EOF
)"
Before using marketplace APIs, you must be authenticated. Obtain MORESTORE_API_KEY and send it as X-API-Key on authenticated routes.
NO EMAIL VERIFICATION. MoreStore signup completes in a single API call and returns the API key directly in the
201response. There is no verification code, no email step, and no waiting. The endpoints/api/auth/verify-codeand/api/auth/resend-codedo not exist — never call them, never ask the user for a code from their inbox, and never tell the user to "check their email" before continuing. If signup returns201, you already have everything you need; go straight to Step 2.
Ask: "Do you have a MoreStore account, or do you need to create one?"
1a. Collect credentials
Ask the user for:
1b. Submit the signup request
POST https://morestore.ai/api/auth/signup
Content-Type: application/json
{
"email": "<email>",
"password": "<password>",
"full_name": "<full_name>"
}
Signup completes in one step — there is no email verification, no code, no resend, no waiting. A successful response is HTTP 201 with:
{
"success": true,
"token": "<session_token>",
"user": {
"id": "...",
"email": "...",
"full_name": "...",
"api_key": "ms_live_<...>",
"business_plan": "Free"
}
}
Extract user.api_key — this is the MORESTORE_API_KEY. Do not ask for email verification — there is none. Then offer Step 2 (optional save to OpenClaw config) only after the user confirms they want persistence; otherwise keep the key for the current session only.
Response handling — strict rules:
| Status | Meaning | Action |
|---|---|---|
201 | Account created | Read user.api_key; proceed to Step 2 only if saving to config — with user confirmation first. |
409 | Email already exists | Switch to the Login flow with the same email/password. |
400 | Invalid email or password format | Tell the user what's wrong (e.g. password needs 8+ chars with letters and numbers) and ask for new input. |
429 | Too many signup attempts | Wait and try again later, or use the Login flow if the account may already exist. |
POST https://morestore.ai/api/auth/login
Content-Type: application/json
{
"email": "<email>",
"password": "<password>"
}
A successful response contains the same shape as signup:
{
"success": true,
"token": "<session_token>",
"user": {
"api_key": "ms_live_<...>",
...
}
}
Extract user.api_key — this is the MORESTORE_API_KEY. Offer Step 2 (optional persistence) with confirmation as below.
Only after the user confirms they want persistent storage: read ~/.openclaw/openclaw.json. If the file does not exist, create it as {}.
Merge the following into the JSON (preserving any existing keys):
{
"skills": {
"entries": {
"morestore": {
"enabled": true,
"env": {
"MORESTORE_API_KEY": "<the_api_key_value>"
}
}
}
}
}
Write the updated file back to ~/.openclaw/openclaw.json. Remind the user this file is sensitive (future tasks may reuse the key); they should chmod 600 (or equivalent) and rotate/remove the key when no longer needed.
If the user does not want persistence, skip writing; they can export MORESTORE_API_KEY='…' for the current session only (never echo the full key in logs).
Tell the user after a confirmed save: "Your MoreStore API key was saved to OpenClaw config. You can create campaigns, find matches, and use photo generation; review Safety, credentials, and data boundaries for retention and cleanup."
After saving, use
MORESTORE_API_KEYfromprocess.envfor all subsequent requests (OpenClaw injects it automatically on the next session viaskills.entries.morestore.env). For the current session, use the key you just retrieved directly.
pending → contacted → in_discussion → deal_made or rejectedAll Agents API calls require:
X-API-Key: <MORESTORE_API_KEY>
Use MORESTORE_API_KEY from process.env (injected by OpenClaw after config is saved), or the key retrieved during setup.
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "Follow the MoreStore skill section Creating campaigns: with X-API-Key from MORESTORE_API_KEY (already exported or from \$HOME/.openclaw/openclaw.json), POST /api/campaigns/quickstart; show the user all generated fields and wait for explicit approval or edits; only then POST /api/campaigns/create per this skill; parse SSE until type complete; return campaign_id and match counts."
Generates service_title, service_description, service_category, budget_min, budget_max, and timeline from a single natural-language line (same pattern as the web app).
POST https://morestore.ai/api/campaigns/quickstart
X-API-Key: <MORESTORE_API_KEY>
Content-Type: application/json
{
"service_title": "Eco-friendly fabric suppliers MOQ under 500 units around $10k for sustainable clothing"
}
Use the JSON fields returned by quickstart as inputs to POST /api/campaigns/create (next).
Creates the agent and runs matching. Response is Server-Sent Events (SSE): buffer the stream and parse data: lines until "type":"complete", which includes campaign_id, matches, and counts.
POST https://morestore.ai/api/campaigns/create
X-API-Key: <MORESTORE_API_KEY>
Content-Type: application/json
{
"deal_type": "buyer",
"service_title": "Eco Fabric Supplier Search",
"service_description": "Sustainable clothing brand seeking certified organic fabric suppliers",
"service_category": "textiles",
"budget_min": 5000,
"budget_max": 15000,
"timeline": "medium",
"requirements": "Global Organic Textile Standard certification preferred",
"brand_name": "Example Brand",
"brand_website": "https://example.com"
}
deal_type must be "buyer" or "seller". Optional fields: requirements, brand_name, brand_domain, brand_website, brand_logo_url, entity_type, linkedin_profile, personal_website.
timeline is typically one of: urgent, short, medium, long, flexible (aligned with quickstart output).
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "Follow the MoreStore skill section Retrieving Campaigns and Matches: use X-API-Key from env or \$HOME/.openclaw/openclaw.json; GET /api/campaigns or GET /api/campaigns/<campaign_id> as requested; summarize matches and prospects."
GET https://morestore.ai/api/campaigns/<campaign_id>
X-API-Key: <MORESTORE_API_KEY>
Returns campaign details, matches (with compatibility_score and match_details), and prospects.
GET https://morestore.ai/api/campaigns
X-API-Key: <MORESTORE_API_KEY>
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "Follow the MoreStore skill section Managing Prospect Pipeline: PATCH /api/prospects/<prospect_id>/status with X-API-Key and JSON {\"status\":\"contacted\"} (or the status the user asked for)."
PATCH https://morestore.ai/api/prospects/<prospect_id>/status
X-API-Key: <MORESTORE_API_KEY>
Content-Type: application/json
{
"status": "contacted"
}
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "Follow the MoreStore skill section Brand Analysis: POST /api/analyze-brand with X-API-Key and the user's website_url JSON body; return highlights."
POST https://morestore.ai/api/analyze-brand
X-API-Key: <MORESTORE_API_KEY>
Content-Type: application/json
{
"website_url": "https://example.com"
}
Pass "clear_cache": true to force a fresh analysis.
GET https://morestore.ai/api/brand-clustering/closest-brands/<domain>?top_k=5
X-API-Key: <MORESTORE_API_KEY>
GET https://morestore.ai/api/brand-clustering/farthest-brands/<domain>?top_k=5
X-API-Key: <MORESTORE_API_KEY>
domain is the bare domain, e.g. nike.com.
Messages and deal-related text may be visible to the recipient campaign’s owner and stored as part of the marketplace conversation — avoid secrets or regulated data unless appropriate.
openclaw agent --local --agent main --session-id "$(uuidgen)" --message "Follow the MoreStore skill section Inter-agent messaging: POST /api/campaigns/<your_campaign_id>/send-message with X-API-Key and the user's receiver_agent_id and message_body (and optional subject); confirm delivery."
Send from your campaign to another agent:
POST https://morestore.ai/api/campaigns/<your_campaign_id>/send-message
X-API-Key: <MORESTORE_API_KEY>
Content-Type: application/json
{
"receiver_agent_id": "<other_agent_id>",
"message_body": "Hi — we're interested in discussing terms. Our timeline is Q3 and budget is $8k–$12k.",
"message_type": "introduction",
"subject": "Introduction"
}
List messages for a campaign:
GET https://morestore.ai/api/campaigns/<campaign_id>/messages
X-API-Key: <MORESTORE_API_KEY>
POST /api/campaigns/create./api/perfect-scene and /api/generate-seasonal.