From common-room
Generate personalized outreach messages using Common Room signals. Triggers on 'draft outreach to [person]', 'write an email to [name]', 'compose a message for [contact]', or any outreach drafting request.
How this skill is triggered — by the user, by Claude, or both
Slash command
/common-room:compose-outreachThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate three personalized outreach formats — email, call script, and LinkedIn message — grounded in Common Room signals for a specific company or contact.
Generate three personalized outreach formats — email, call script, and LinkedIn message — grounded in Common Room signals for a specific company or contact.
Use Common Room MCP tools to find and retrieve data for the target (company and/or specific contact). Pull:
If the user specified a person, run contact-level research. If only a company was given, identify the best contact to target based on title, engagement, and role.
Lark identity resolution (P1): Common Room owns the signal/persona data, but Lark owns the send. As soon as you know who you are writing to, resolve them in the Lark directory: lark_contact_search(query="<name or email>") → take open_id. You need this open_id to look up internal relationship context (prior threads, shared meetings) and to draft/send via Lark below. Skipping resolution is the #1 cause of failed sends.
If CR returned strong signals (recent activity, engagement, product usage), those should drive personalization — skip web search. If CR signals are thin or the prospect has little CR activity, run a web search for external hooks:
What to search:
"[company name]" funding OR acquisition OR launch OR announcement — last 30 days"[contact full name]" "[company name]" — look for recent articles, interviews, LinkedIn posts, or conference talksPrioritize external hooks that are:
If the user explicitly asks for web search or external hooks, run it regardless of CR signal richness.
If Spark is available, run enrichment on the target contact to get persona classification, background, and influence signals. Use this to calibrate tone and message angle.
From the signal data, identify the 1–3 strongest personalization hooks. Rank by:
Good hooks: posted a question in the community about X, just hired 5 engineers, recently started using [feature], company just raised Series B, trial nearing expiration, champion just changed jobs.
Bad hooks: "I noticed you're a customer" or generic industry trends.
Use the strongest hooks to write all three formats. Each format has different constraints and conventions — follow the format-specific guidelines in references/outreach-formats-guide.md.
Always produce all three, clearly labeled.
When the user's company context is available (see references/my-company-context.md), ground the value bridge and pitch in the user's specific product and positioning.
The email format is a collaboration artifact — put it where the rep will review and send it, the Lark Mail UI, rather than leaving it as chat text. Use lark_mail_draft_create (subject + body + the resolved recipient from Step 1) so the rep eyeballs it before sending. Never call lark_mail_send with confirm_send: true here — outreach is always human-reviewed. If the rep explicitly says "send it," still draft first, show the planned recipient + payload, and only lark_mail_send after they confirm.
The call script and LinkedIn message stay as text the rep copies into their dialer / LinkedIn — they don't map to a Lark surface.
After the three drafts, include a brief note (2–4 sentences) explaining:
## Outreach for [Name / Company]
### 📧 Email
**Subject:** [Subject line]
[Email body — 3–5 sentences]
---
### 📞 Call Script
**Opening:**
[Opening line — conversational, 1–2 sentences]
**Value Bridge:**
[Why you're calling and why now — 2–3 sentences tied to a signal]
**Ask:**
[Single, low-friction ask — e.g., 15-minute call, specific question]
---
### 💼 LinkedIn Message
[Under 300 characters. Warm, personal, no pitch.]
---
### Signal Notes
[2–4 sentences: which signals were used, why, and any alternative angles]
If Common Room returns minimal data on the target (e.g., just name, title, tags — no activity, no scores, no Spark):
## Outreach for [Name / Company] — Limited Data
**What I found:**
[Only the real data from CR and web search]
**I don't have enough signal to draft personalized outreach yet.** To write something strong, I'd need:
- Recent activity or engagement signals
- Context you have from prior conversations
- A specific reason for reaching out now
Can you share any of the above?
Common Room stays the signal engine; Lark is where the outreach lands and gets reviewed:
lark_contact_search before any draft/send.lark_mail_draft_create; print_json/dry_run any mutation; never auto-send outreach.lark_im_card_send (one item row per target with a "Open draft" / "Skip" button) instead of a wall of text. print_json: true → dry_run: true → send.lark-mail skill (draft guards) and the lark-im skill (card YAML / references/spec-reference.md). See ../../connectors/LARK-PATTERNS.md (P1/P2/P4), LARK-RECIPES.md, LARK-FUSION.md.references/outreach-formats-guide.md — detailed format rules, examples, and tone guidelines for each channelnpx claudepluginhub larkcowork/lark-cowork-plugins --plugin common-roomSearches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.