Tool naming
The body uses auth_status such logical names. OpenClaw calls goofish__<逻辑名>;
Claude Code / Cursor calls mcp__goofish__<逻辑名>. In the frontmatter, allowed-tools
keep the Claude permission pre-approval format; OpenClaw does not read this field.
Triggering style
Typical user input:
- "see my unread messages"
- "someone is asking about XXX, how should I reply"
- "for that bargaining one, how much should I reply with"
- "send a payment reminder to those who ordered but haven't paid"
- "help me batch process messages"
Core principles (repeatedly emphasized)
Never send messages automatically。
Even if the user says "just reply casually", "do whatever you think", you must:
- draft one
- show it to the user
- and only call after an explicit "send / yeah, send / ok"
message_send
Why this must be done:
- Sending the wrong thing on Xianyu is costly (off-platform contact words get the account banned, emotional remarks start fights, misquoting prices)
- Once the buyer feels "the seller is not the person themselves" (too much AI flavor), trust drops to zero
- Unlike the
message_watchlong-connection event stream, a single conversation isan outbound action, irreversible
Standard process
Step 1 · Login state self-check
auth_status → valid=false 直接停,提示用户 auth login
Step 2 · Pull unread conversations
message_list_chats(limit=20)
Return the conversation list, each item containing cid / the other party's nickname / last message preview / unread count.
Filtering strategy:
- Prioritize those with unread count > 0
- Sort by most recently active in reverse order
- Do not process too many at once (suggest ≤ 5 conversations per round); if the messages are too long, the user cannot get through them
Step 3 · Pull context conversation by conversation
对每个选中的 cid:
message_history(cid=..., limit=20)
20 messages are basically enough to classify intent. For very long conversations (50+ messages), pull 30.
At the same time(if the message mentions a specific product ID):
item_get(item_id=...) # 拿商品的最新状态,价格/标题/是否在售
Step 4 · Intent classification
See references/intent-classification.mdfor details. Roughly split into 5 categories:
| Intent | Typical | Handling strategy |
|---|---|---|
| Price inquiry / basic information | "how much", "still available", "where do you ship from" | Reply directly, refer to the seller's product description |
| Bargaining | "cheaper", "is XXX okay" | Reply according to bargain-ladder.md tiers |
| Payment reminder | "already paid", "will it arrive tomorrow" | Reply with the shipping time |
| After-sales | "it's broken", "it's wrong", "want a refund" | Reply cautiously, keep evidence; if serious, suggest human intervention |
| Off-platform contact / risk | "add WeChat", "pay by transfer" | block + replace with compliant wording |
Step 5 · Draft a reply
Follow different sub-processes according to intent (each has a corresponding reference).
After draftingMust pass risk-guard scan:
- Call
goofish-risk-guard'sexternal-contact-keywords.mdto scan the draft - Hit → swap words, rewrite, or flag with a red warning
Step 6 · User confirmation
Display format:
【会话】买家昵称 "xxxxx"(未读 N 条)
【最新来信】
> "原文..."
【意图判定】议价(想砍到 XX 元,距你底线 XX 元)
【草稿回复】
"..."
【风控扫描】通过 ✅
发送这条吗?(y/改/跳过)
User replies "send / mm / yes / ok / 1" only then call message_send。
User replies "change" → ask them to specify what to change, and redraft. User replies "skip" → skip to the next conversation.
Step 7 · Send
message_send(cid=..., text="...")
After success:
- Confirm "sent" to the user
- Wait a bit before handling the next one(don't send multiple cids in a row—it triggers rate control)
Maintain the seller persona
The Agent should imitatethe user's own tone, and not use the formal language common to AI:
- ❌ "Hello, thank you very much for your interest"
- ✅ "Here~"
- ❌ "After careful consideration, we are willing to offer you a discount"
- ✅ "Can knock off 20, 1200 okay?"
For specific tuning, see references/tone-guide.md。
Special scenarios
Scenario: Bulk payment reminders
The user says "remind everyone who hasn't paid"
list_chatsFind conversations with the "ordered but unpaid" tag- Draft a gentle payment reminder for each person
- Confirm one by one(do not bulk send—giving send permission is like turning off the last safeguard)
Scenario: Buyer leaves a bad review
Do notuse AI to write an aggressive reply to the review.
- Draft a restrained response (objective + explanation)
- Clearly tell the user "getting emotional will make the loss bigger"
- For serious bad reviews, recommend going through official appeals; do not recommend a public back-and-forth
Scenario: Suspected scammer / malicious refund-only request
- Alert the user: "This looks like a typical XX-type operation, be careful"
- Let the user decide whether to escalate to human customer service intervention
- The Agent does not proactively promise "we'll help you pursue accountability"—keep boundaries clear
Scenario: Buyer asks about off-platform contact
- Must replace with risk-guard's compliant wording
- At the same time, remind the seller: "The other party is asking about off-platform contact; reply compliantly, don't give in"
Related skills
goofish-risk-guard— scans for off-platform-contact words before every outgoing messagegoofish-publish-item— messages coming back for listed products go through this skillgoofish-shop-diagnosis— when you find that a large number of messages are "are you still there", it may already be rate-limited (messages come in but the buyer cannot see them)