Help us improve
Share bugs, ideas, or general feedback.
From claude-plugin
Preps customer meetings for a sales rep β fetches events from Google Calendar (today, a specific day, or the whole week) and generates a structured brief for each meeting using the reo-gateway MCP. Each brief combines per-meeting account intel (engagement, signals, hiring, prospects) with per-attendee intel matched by email and name. Supersedes the older call-prep-sheet and weekly-meeting-digest skills that were built on the legacy reo MCP. Trigger this skill whenever the user asks to "prep my calls", "prep today", "prep my week", "what's on my calendar", "get me ready for my meetings", "prep [company] call", "Monday briefing", "call prep", or any phrasing that implies "help me get ready for the customer meetings on my calendar". Also trigger when the user references a specific meeting they have coming up and wants background on it.
npx claudepluginhub reodotdev/claude-plugin --plugin reo-mcp-toolsHow this skill is triggered β by the user, by Claude, or both
Slash command
/claude-plugin:sales-call-prepThe summary Claude sees in its skill listing β used to decide when to auto-load this skill
SCOPE_DEFAULT: ask
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Create and present web-based slidedecks using Slidev with Markdown, Vue components, code highlighting, animations, interactive demos, LaTeX, and Mermaid for technical presentations, conference talks, code walkthroughs, and teaching materials.
Share bugs, ideas, or general feedback.
SCOPE_DEFAULT: ask
WEEK_START_DAY: Monday
SIGNAL_LOOKBACK_DAILY: 30 days
SIGNAL_LOOKBACK_WEEKLY: 7 days
MAX_CONTACTS: 5
PROSPECT_SEARCH_PAGE_SIZE: 100
INTERNAL_DOMAINS:
FREE_EMAIL_DOMAINS:
HIGH_INTENT_PAGES:
INCLUDE_SECTIONS: attendee_intel: true # Per-person lookup: reo activity + LinkedIn profile company_overview: true # Industry, headcount, tech stack from reo engagement_score: true # reo engagement score + intent level signals: true # Account-level activity signals highest_intent: true # Spotlight the single most commercially important signal hiring: true # Open hiring roles and what they imply news: true # Recent news from web search (if web_search available) suggested_question: true # Generate an opening question tailored to the signals watch_out_for: true # Flag red flags (cooling signals, key person absent, etc.)
DEEP_ENRICH: false
COLD_ACCOUNT_BEHAVIOUR: show_news_only
NEWS_PER_COMPANY: 2
WATCH_LIST_SIZE: 5
Turns a calendar view into a stack of sales-ready meeting briefs. For each external customer meeting it surfaces:
Scope is flexible: today, tomorrow, a specific day, or the whole week.
Parse the user's request for a time range.
SCOPE_DEFAULT.
ask β ask the user: "Should I prep today's calls, or the whole week?"If the request is on a weekend and scope = week, default to the upcoming week (MonβFri). Make that assumption visible in the output header so the user can correct you.
Fetch events from the primary calendar for the target date range.
Drop events that aren't customer-facing:
INTERNAL_DOMAINS β internal meeting.A customer-facing event usually has a title like call, demo, sync, intro, discovery, review, walkthrough, check-in, catch-up, QBR, kickoff, onboarding. Use this as a soft filter β if a meeting has external attendees but an unusual title, include it anyway; it's better to include one odd internal-looking event than to drop a real call.
For each qualifying event extract:
[(display_name, email, response_status), ...], external onlyINTERNAL_DOMAINS and FREE_EMAIL_DOMAINS)If a meeting has zero usable external domains (e.g. all attendees are on gmail), emit a brief that only lists the attendees with a "personal email β company unknown" note. Don't run account research on free-email domains.
If no qualifying events exist in the range: say so plainly ("No customer calls on your calendar for [range]") and stop. Don't fabricate a brief.
For each unique external company domain across all meetings, make ONE call:
reo_get_account_research(
domain = "<company domain>",
signal_lookback_days = <SIGNAL_LOOKBACK_DAILY or SIGNAL_LOOKBACK_WEEKLY based on scope>,
max_contacts = <MAX_CONTACTS>,
high_intent_pages = <HIGH_INTENT_PAGES>
)
This single call returns firmographic, engagement, top activities, developers (with email), prospects (with LinkedIn public_id), and hiring β everything the brief needs about the account.
Run these calls in parallel across companies when possible. Cache results in memory so a company that appears on two days of the week isn't queried twice.
If the call fails for a domain (bad domain, no reo account), fall back gracefully: show the meeting with attendee names only and a "account not found in reo" note. Don't crash the whole brief.
Apply COLD_ACCOUNT_BEHAVIOUR if engagement.total_events_in_window is zero.
For each external attendee in each meeting, run this cascade in order. Stop at the first hit:
developers[]The developers[] array from Step 3 contains up to MAX_CONTACTS deanonymized
developers for the account, each with an email field. Lowercase both sides and
compare. On match, you already have:
reo_link containing a developer UUID like ?devId=<uuid>If the attendee matches a developer, you have their product activity. No
follow-up call is needed for the brief. (Optional: if DEEP_ENRICH is true or
the user explicitly asks for deeper per-person activity, parse the UUID from
reo_link and call reo_get_developer_activities(developer_id) for the full
page-level breakdown.)
prospects[] (from account_research)The prospects[] array contains senior LinkedIn prospects for the account.
Their emails are null β match on full_name vs the attendee's display name.
Use a tolerant match: case-insensitive, ignore middle initials, ignore
suffixes (Jr., III), ignore honorifics. If name isn't available in the
calendar event, skip this step for that attendee.
On match, you have: title (designation), seniority, tech_function, location,
LinkedIn URL, LinkedIn public_id (the id field).
If 4a and 4b both missed, call reo_list_prospects(domain, page_size=<PROSPECT_SEARCH_PAGE_SIZE>)
and fuzzy-match by name against the returned list. This catches junior
attendees or non-technical buyers who aren't in the senior-only default from
Step 3.
Do this lookup ONCE per company (not per attendee) β fetch the page, then match all unmatched attendees against the result in memory.
If still no match after scanning the first page, stop. Going deeper isn't worth the latency for call prep.
No match anywhere. This is common and expected β many buyers (execs, procurement, marketing) aren't tracked by reo. Show the attendee's name + email with a "β No reo profile or product activity on record" line. Don't apologise for it; it's normal.
If DEEP_ENRICH is true AND we have a LinkedIn public_id for the attendee
(from steps 4b or 4c), call:
reo_get_enriched_profiles(
profiles = [{ company_domain: "<domain>", public_ids: ["<public_id>"] }]
)
Batch these into one call across all attendees at the same company where
possible β the profiles parameter takes a list.
If NEWS_PER_COMPANY > 0 and web_search is available: one search per company,
e.g. "<Company Name> news". Extract top N headlines from the last ~30 days.
For each, write a one-sentence sales implication ("They raised a Series B β
budget may be loosening; ask about new initiatives"). Skip if search returns
nothing β don't force it.
If web_search isn't available in this environment, silently skip the news section. Don't emit an error.
Format one card per meeting, ordered chronologically. If scope is a week, group cards under day headers (Monday, Tuesday, etc.).
---
### [HH:MM] β [Company Name] ([domain]) [(recurring) if applicable]
**Meeting:** [Event title] Β· [Duration] Β· [High-intent / Active / Cold badge]
#### π€ Attendees
**[Name]** β [Title, from reo or "role unknown"] Β· [City if available]
- Product activity: [summary β or "no activity on record"]
- Last active: [relative date, or "β"]
- Notable: [flag HIGH_INTENT_PAGE hits here, or omit the line]
*(Repeat per external attendee. If the attendee has only their name + email
with no reo data, show that honestly β it's useful information in itself.)*
#### π’ Account Overview
- Industry: [from firmographic] Β· Tech headcount: [N] Β· HQ: [city, country] Β· Founded: [year or "β"]
- Tech stack: [top 6-8 technology_names as a readable list, or "β"]
- ICP fit: [customer_fit_score] Β· Dev stage: [developer_stage]
#### π Engagement *(if engagement_score enabled and signals exist)*
- Score: [0-100] Β· Intent: [High/Medium/Low] Β· Events (last [window]): [N] Β· Unique actors: [N]
- Last active: [date]
#### π₯ Signals *(if signals enabled and activity exists)*
- [Page label]: [N] visits Β· [unique actors]
- [Activity type]: [N] Β· [relative date]
- Total: [N] events across [N] users in the last [window]
**β‘ Don't miss** *(if highest_intent enabled and a high_intent_hit exists)*
> [The most commercially significant thing β e.g. "2 engineers hit the pricing
> page in the last 5 days. Ask whether they're starting a formal evaluation."]
#### πΌ Hiring *(if hiring enabled)*
- [N] open roles Β· Top functions: [top 3 tech functions with counts]
- What this suggests: [1-sentence read, e.g. "Hiring hard on Security & Compliance
β likely scaling prod infra. Our compliance story matters here."]
#### π° News *(if news enabled and results found)*
- [Headline] β [Sales implication]
#### β Suggested opening question *(if suggested_question enabled)*
> "[One specific question tied to their signals, attendee activity, or news.
> Not a generic 'how's your week'.]"
#### β οΈ Watch out for *(if watch_out_for enabled and red flags exist)*
- [e.g. "[Name] on the pricing page last week is NOT on this call β ask who else is involved"]
- [e.g. "Signal activity dropped from 14 events last month to 2 this week β momentum cooling"]
#### π§ Read
2β3 sentences synthesising attendees + signals + news. Reference specific
people and actions from the data β never generic ("this account is promising").
Example: "Sarah has been deep in the SSO docs and copied 3 CLI commands β
she's the technical evaluator. James isn't on this call but hit pricing twice,
which suggests he's managing budget separately. Use this call to ask Sarah
who else is on the evaluation committee."
---
When the scope is a whole week:
# Week of [Mon date] β [Fri date]
[N] customer calls Β· [N] unique accounts Β· scope: [this week | next week | explicit range]
---
## MONDAY, [Date]
[card]
[card]
## TUESDAY, [Date]
No customer calls scheduled.
[... etc for each day]
---
## π Watch list *(if WATCH_LIST_SIZE > 0 and we have the data)*
Accounts with strong recent activity but no meeting on the calendar:
| Company | Signals ([window]) | Highest intent | Suggested action |
|---------|-------------------|----------------|------------------|
(If a bulk-account endpoint isn't available in this environment, omit the
watch list table and note "β watch list skipped; requires focus-list endpoint".)
---
## π§ Week summary
- **Top priority:** [Company] on [Day] at [Time] β [reason]
- **Pattern:** [2-3 sentences reading the whole-week shape β e.g. "3 of 5 calls
hit pricing this month; momentum is real but concentrated. The watch list
suggests two more accounts worth chasing before Friday."]
- **Before each call:** one concrete action per meeting, ordered by time.
@aws.amazon.com
but reo only tracks amazon.com): try both β use the subdomain first, fall
back to the registrable domain.COLD_ACCOUNT_BEHAVIOUR.Three things are worth calling out for anyone reading or editing this skill:
One account_research call per company is enough. The gateway endpoint is a composite β it fans out to firmographic, developers, prospects, hiring, activities in parallel and returns them unified. Don't try to "save calls" by skipping it; don't try to call the individual endpoints separately either. One call, everything.
The matching cascade exists because reo has two identity systems. Developers are tracked by email (they used your product with identity resolution). Prospects are tracked by LinkedIn public_id (they're enriched from LinkedIn, never logged in to anything). Calendar gives us email + name. We try email first (strongest), then name (weaker, but works for prospects), then broader name search. Don't shortcut this β email-only matching will miss every non-developer attendee, which is the majority on discovery calls.
The "unmatched attendee" case is the common case, not a failure. Most meetings have at least one attendee who isn't in reo. Showing that honestly ("no product activity recorded for Jane") is useful β it tells the rep this person hasn't touched the product, which is itself a signal.