Tool naming
The body uses auth_status logical names like this. OpenClaw calls goofish__<逻辑名>;
Claude Code / Cursor call mcp__goofish__<逻辑名>. In frontmatter, allowed-tools
keep the Claude permission pre-approval format; OpenClaw does not read this field.
Trigger posture
Typical user input:
- "Help me post these earphones to Xianyu, 300, 9 out of 10 condition"
- "I took a few photos, write me a title and description"
- "List this figurine, price negotiable, bottom line 200"
When you can extract from the user message (the item itself + at least one image or a text description of the item) then start this flow. When information is insufficient,ask the userinstead of guessing.
Standard flow (7 steps)
Step 1 · Login state self-check (mandatory)
调 auth_status
valid=true → 继续
valid=false → 不继续;告诉用户: "登录态失效了,请执行 goofish auth login(扫码走 --qr)",停。
Step 2 · Information gathering
Extract from the conversation and the materials provided by the user:
| Field | Required | Source |
|---|---|---|
| Core item (what it is) | ✅ | User description / image recognition |
| Brand + model | ✅ | User description |
| Condition (X out of 10) | ✅ | User description; if not mentioned,ask |
| Price | ✅ | User description; if not mentioned,ask |
| Images (URL or local path) | ✅ | Provided by user |
| Flaw description | Recommended | Ask the user "is there any flaw worth mentioning" |
| Purchase channel | Recommended | Helps make the description more convincing |
| Whether negotiable / bottom line | Optional | Prepares for the later reply-buyer |
| Shipping location | ⚪️ | If left blank, call location_default as fallback |
If a required field is missing, stop and ask; do not fill in default values。
Step 3 · Category recognition
调 category_recommend(title=候选标题, images=[首图])
→ 拿到 catId / catName
Result validation:
- If catName clearly does not match the user description (for example, the user says phone case but "phone" is returned), tell the user and have them confirm
- If confidence is low (multiple candidates are returned), show the top 3 for the user to choose
Step 4 · Title generation
Follow "brand + core word + attribute + scenario + emotion" 5-segment format to generate 3 candidates. See references/title-formula.md。
Thencall goofish-risk-guard to scan:
- Absolute terms, outbound-link terms, or infringement terms hit → regenerate
- Suspected "price-drop relabeling" hit (title contains promotional words + historical price changes) → regenerate
Show the scanned candidates to the user to choose / edit.
Step 5 · Description generation
For the structure, refer to references/title-formula.md 's "description skeleton" section. Key points:
- If there are flaws, say so openly(protects the seller against refund-only requests)
- Be clear aboutwhy you're selling("upgraded to a new model", "rarely used" are more credible than "idle")
- Be clear aboutshipping location + courier + whether shipping is included
- State your bargaining policy clearly ("small discounts welcome / no haggling over XX")
Step 6 · Image processing
for image in images:
调 media_upload(image)
收集返回的 {url, width, height}
检查:
总图数 ≤ 9 ?
首图是 1:1 ?(如果不是,提示用户换首图)
张数 ≥ 3 ?(少于 3 张警告但不拦)
Step 7 · Final user confirmation + publish
Show to the user(mandatory):
【标题】...(最终版)
【类目】catName (catId=XXXX)
【描述】
(全文)
【价格】XXX 元
【图片】9 张,首图 1:1 ✅
【发货地】XX 市 / 默认
【风控扫描】通过 ✅
是否确认发布?
Wait for the user to explicitly reply "post / go ahead / confirm / OK / yes / mm". A vague "let me see" / a single "mm" does not count as confirmation.
After confirmation:
调 item_publish(
title=...,
desc=...,
price=...,
image_urls=[...],
cat_id=...,
addr=...(没有就省略,让服务端用 location_default)
)
Anti-patterns (don't do)
❌ Skip category_recommend, guess catId yourself ❌ Publish first, edit later(suggesting the user "post it first and tweak it slowly later" → frequent edits after publishing will lose traffic pool weight) ❌ Skip the risk-control scan(a title with absolute terms published directly → 100% downranking) ❌ Publish without confirmation(write operations are irreversible; spend 5 extra seconds waiting for user confirmation) ❌ Publish ten items in a batch without stopping(token bucket 1 item/minute; consecutive posts will trigger rate limiting)
Batch publishing scenario
The user says "I have 10 items all to be posted":
- First have them confirm "are these 10 completely different items, or 10 of the same model?"
- Same model: merge into 1 item with a multi-SKU description, not 10 separate posts
- Different models: go through the full flow for each item,confirm each one individually, don't "confirm all 10 at once" (the user can't keep track)
- Tell the user "due to rate limits, this will take about 12-15 minutes"
After publishing
- Return
item_idto display to the user - Mention the traffic pool window: "The item has been published. The first 24 hours are the initial recommendation window; during this period do not change the title/price tag"
- Record the item_id (in case the user later wants a diagnosis or to delist)
Related skills
goofish-risk-guard— pre-publish scan (title/description/images)goofish-reply-buyer— reply to buyer messages after publishinggoofish-shop-diagnosis— if traffic is poor after publishing