nimbleway/agent-skills/meeting-prep
Claude Code and agent skill by nimbleway/agent-skills
- community
Checking that the SKILL.md file is still in the repository.
Researches meeting attendees and their companies before any meeting using real-time web data. Surfaces roles, recent activity, company context, and talking points — then maps cross-attendee relationships. Use this skill when the user asks to prepare for a meeting, research someone they're meeting, or wants context on attendees. Common triggers: "prepare me for my meeting", "who am I meeting with", "research this person", "meeting prep", "brief me on [person]", "I have a meeting with [person/company]", "get me ready for my call", "what should I know about [person]", "background on [person] before our meeting", "attendee research". Requires the Nimble CLI (nimble search, nimble extract) for live web data. Do NOT use for multi-company competitor monitoring (use competitor-intel) or single-company deep dives without attendees (use company-deep-dive).
Install
npx vskill@latest install nimbleway/agent-skills/meeting-prepSKILL.md
Meeting Prep
Research-powered meeting preparation with attendee intelligence and company context.
User request: $ARGUMENTS
Before running any commands, read references/nimble-playbook.md for Claude Code constraints (no shell state, no &/wait, sub-agent permissions, communication style).
Instructions
Step 0: Preflight
Follow the transport selection + standard preflight from references/nimble-playbook.md — pick CLI or MCP at session start, then run the standard preflight calls (date calc, today, profile, memory index) in parallel.
From the results:
- CLI missing or API key unset →
references/profile-and-onboarding.md, stop - Tag all
nimbleCLI calls:nimble --client-source nimble-agent-skills <subcommand>. MCP requests are attributed at the transport level — seereferences/nimble-playbook.md. - Profile exists → read
~/.nimble/memory/people/index.mdto identify existing
person profiles. Load relevant ~/.nimble/memory/people/ files for attendees before — skip redundant searches, surface prior meeting notes. Follow [[path/entity]] cross-references in person files: if an attendee's file links to [[competitors/widgetco]], load that competitor file for richer context (e.g., recent intel from competitor-intel runs). Also check ~/.nimble/memory/companies/ for cached company research. No same-day report check — meeting-prep is per-meeting, not per-day. Users may prep for multiple meetings in one day. Instead, check entity freshness: if a person/company profile was updated within the last 24 hours, offer to reuse it: "I have a recent profile for [Name] from earlier today. Use it, or refresh?"
- No profile → that's fine. Meeting prep doesn't require onboarding. Proceed to Step 1.
Step 1: Gather Meeting Context
Parse the meeting details from $ARGUMENTS or ask the user.
Calendar shortcut: If the user didn't specify attendees and a calendar connector is available — either a calendar MCP tool (look for list_events in the tool list) or the gws CLI (gws calendar +agenda --today) — offer to pull today's meetings so they can pick one. If neither is available, skip this silently.
If clear (e.g., "prep me for my meeting with Alex Kim at WidgetCo tomorrow"):
- Extract: attendee name(s), company, meeting date/time (if given)
- Confirm briefly: "Preparing briefing for your meeting with Alex Kim at WidgetCo..."
If partial (e.g., "prep me for my meeting tomorrow"):
- Ask one clarifying question in plain text:
> "Who are you meeting with? (names, titles, and company if you have them)"
If just a person (e.g., "research John Smith"):
- Proceed with the person. Try to infer their company from search results.
Extract these fields:
| Field | Required | Source | |
|---|---|---|---|
| Attendee name(s) | Yes | User input or calendar event | |
| Company | Preferred | User input or inferred from search | |
| Attendee title(s) | Optional | User input or discovered in Step 2 | |
| Meeting type | Required | User input, inferred, or asked (discovery, demo, check-in, interview, partnership, internal) | |
| Meeting date/time | Optional | User input | |
| Additional context | Optional | User notes ("they're evaluating our product", "board member intro") |
Meeting type detection — if the user doesn't specify, infer from context clues:
| Signal | Inferred type | |
|---|---|---|
| "prospect", "demo", "sales call" | Sales / discovery | |
| "interview", "candidate" | Interview | |
| "board", "investor" | Board / investor | |
| "partner", "integration" | Partnership | |
| "check-in", "sync", "1:1" with colleague | Internal | |
| No signal | Ask (see below) |
If no signal — don't guess "general external." The meeting type gates whether the Value Positioning section is generated, so it's worth one question. Use AskUserQuestion:
What's the goal of this meeting?- Sales / discovery — pitching, demo, exploring fit- Partnership — integration, co-selling, joint venture- Board / investor — board meeting, investor update, fundraising- Interview — evaluating a candidate- General / other — networking, catch-up, or not sure
Map the answer to the meeting type. If the user picks "General / other", treat as general external (no value positioning section).
The meeting type shapes the briefing focus — specifically, it determines whether the Value Positioning section (Step 4.5 + Step 6) is generated. Value positioning activates for: sales/discovery, partnership, board/investor. It is skipped for: interview, internal, general external.
Step 2: WSA Discovery
Discover available WSAs for each attendee's company domain:
Run one search per unique company simultaneously. Filter for SERP/PDP WSAs, prefer managed_by: "nimble", validate with nimble extract:templates get --extract-template-name {name}. Cache discovered names + params. Pass them to attendee agents in Step 3 for richer data. If no WSAs found, continue with nimble search alone.
Step 3: Per-Attendee Research (sub-agents)
Read references/attendee-agent-prompt.md for the full agent prompt template. Follow the sub-agent spawning rules from references/nimble-playbook.md (bypassPermissions, batch max 4, explicit Bash instruction, fallback on failure).
Check memory first. For each attendee, check ~/.nimble/memory/people/[name-slug].md. If a profile exists and is < 30 days old, load it as known context and pass it to the agent so it focuses on what's new. If > 30 days old, run a full refresh.
Spawn nimble-researcher agents (agents/nimble-researcher.md) with mode: "bypassPermissions". One agent per attendee. Pass discovered WSA names from Step 2 to each agent for enrichment.
Important: The Nimble API has a 10 req/sec rate limit per API key. With each agent running 4-5 searches, limit concurrent agents to 2 per batch. For 3+ attendees, batch in groups of 2.
Call estimation & Scaled Execution: Before launching agents, estimate total API calls: ~5 searches per attendee + ~4 company searches + 3-5 extractions = ~(5 × N) + 9 calls. For 3+ attendees (15+ calls), tell agents to use extract-batch for page extractions instead of individual calls. See the Scaled Execution pattern in references/nimble-playbook.md for tier selection.
Batch 1 (2 agents simultaneously):
- Attendee 1 research
- Attendee 2 research
Batch 2 (if needed):
- Attendee 3 research
- Attendee 4 research
Single attendee optimization: If only one person, run the searches directly from the main context instead of spawning an agent — saves overhead.
Fallback: If any agent fails or returns empty, run those searches directly from the main context. Don't leave gaps in the briefing.
Step 3.5: Gap Check
Before proceeding, verify every attendee has at least a title and company confirmed.
For any attendee with < 3 meaningful results or "Role Unknown":
- Run a
--focus socialfallback search directly (this searches social platform
people indices and is the most reliable way to find someone): nimble search --query "[Name] [Company]" --focus social --max-results 5 --search-depth lite
- If
--focus socialis unavailable, fall back to:
nimble search --query "[Name]" --include-domain '["linkedin.com"]' --max-results 5 --search-depth lite
- Try name variations: "[First] [Last]", "[Full Name] [Company] [Title if known]"
Do NOT present a briefing with "Role Unknown" — exhaust social search first. If still nothing after fallbacks, note it honestly: "Limited public presence — could not confirm role. Consider asking for their LinkedIn URL."
Also collect LinkedIn profile URLs for each attendee during this step if not already found. These are high-value for the final briefing output and Notion distribution.
Step 4: Company Research
Research the attendees' company for meeting-relevant context. This is a lighter version of company-deep-dive — focused on what's useful for the conversation, not a full 360°.
Company name quoting: If the company name contains common words that cause noisy results (e.g., "Acme Supply", "Nova Dynamics", "Global Industries"), wrap it in escaped quotes: "\"Acme Supply\" news". Use --include-domain '["[domain]"]' as an alternative anchor.
Make these Bash calls simultaneously:
nimble search --query "\"[Company]\" news" --focus news --start-date "[14-days-ago]" --max-results 8 --search-depth litenimble search --query "\"[Company]\" product launch OR announcement" --focus news --start-date "[14-days-ago]" --max-results 5 --search-depth litenimble search --query "about" --include-domain '["[domain]"]' --max-results 3 --search-depth litenimble search --query "\"[Company]\" funding OR raised OR investors" --max-results 5 --search-depth lite
If your user's company profile exists, also run:
nimble search --query "[Company] [UserCompany] OR [user-domain]" --max-results 5 --search-depth lite
This catches any existing relationship between the two companies — prior partnerships, mentions, shared investors, or competitive overlap.
If < 3 results from the news searches, retry without --start-date.
Date validation: When including company news in the briefing, verify that the event date (when something actually happened) is recent, not just the article date. See references/nimble-playbook.md → "Signal Date Validation" for details. If a snippet uses past-tense language like "last year" or "back in Q3", treat it as background context rather than recent news.
If the company was already researched (exists in ~/.nimble/memory/companies/), load the existing profile and only run the news search for fresh updates.
Step 4.5: Value Positioning Research
Skip this step if the meeting type is interview, internal, or general external.
This step cross-references what you learned about the attendee's company (Step 4) with the user's own business profile to find concrete positioning angles. It works best when business-profile.json exists with at least company.name and company.domain.
If no profile exists, skip searches that reference the user's company or competitors (searches 2, 4, 5) and rely on generic research (searches 1, 3) for positioning insights. Use any WSAs discovered in Step 2 for richer attendee company data. The Value Positioning section will be thinner but still useful — pain-to-solution mapping and tech stack discovery work without a profile.
Load the user's sales context from ~/.nimble/business-profile.json:
sales_context.key_differentiators— what makes the user's product uniquesales_context.integration_partners— tools the user's product connects withsales_context.case_studies— similar customers and outcomessales_context.common_objections— pre-built objection responsescompetitors— tracked competitors (check if the attendee's company uses any)
If sales_context doesn't exist in the profile, the skill still works — the value positioning section will rely on web research alone rather than profile-enriched data. Mention at the end: "Tip: Add sales context to your profile for richer positioning next time."
Make these Bash calls simultaneously (3-5 searches depending on available data):
nimble search --query "\"[AttendeeCompany]\" tech stack OR tools OR platform OR uses" --max-results 5 --search-depth lite
→ Discover what tools/platforms they use — match against integration_partners
nimble search --query "\"[AttendeeCompany]\" [UserCompany] OR [user-domain]" --max-results 5 --search-depth lite
→ Any existing relationship, mentions, or competitive overlap (skip if already run in Step 3)
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/meeting-prep/SKILL.md
Popularity
- Repository stars
- 50
- Repository forks
- 16
- 7-day trend score
- 20
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/nimbleway/agent-skills/meeting-prep)