Install
$ agentstack add skill-nimbleway-agent-skills-meeting-prep ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
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 skill-meeting-prep. MCP path: not yet supported — seereferences/nimble-playbook.mdfor status. - 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:
nimble agent list --search "{company-domain}" --limit 20
Run one search per unique company simultaneously. Filter for SERP/PDP WSAs, prefer managed_by: "nimble", validate with nimble agent get --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, 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)
nimble search --query "\"[AttendeeCompany]\" challenges OR pain points OR struggling OR migrating" --max-results 5 --search-depth lite
→ Pain signals to map against user's value props
- (If
competitorslist exists)nimble search --query "\"[AttendeeCompany]\" [CompetitorName1] OR [CompetitorName2]" --max-results 5 --search-depth lite
→ Check if they use a competitor — critical for displacement positioning
- (If
case_studiesexist with matching industry)nimble search --query "[UserCompany] [attendee-industry] case study OR customer story" --max-results 5 --search-depth lite
→ Find published case studies in the attendee's industry to reference
From the results, extract:
- Tools/platforms they use (for integration hooks)
- Pain signals or challenges (for value mapping)
- Competitor usage (for displacement angles)
- Industry match to existing case studies (for social proof)
This data feeds directly into the Value Positioning section in Step 5.
Step 5: Deep Extraction
From Steps 3-4.5, identify the top 3-5 most informative URLs across all results. Prioritize:
- Attendee's own LinkedIn posts, articles, or talks
- Recent company announcements directly relevant to the meeting
- Interviews or profiles of the attendee
- The company's about/team page (if attendee title wasn't found)
- (If value positioning active) Pages revealing their tech stack or tool usage
- (If value positioning active) Articles about their challenges or migration plans
Make one Bash call per URL, all simultaneously:
nimble extract --url "https://..." --format markdown
For extraction failures, follow the fallback in references/nimble-playbook.md.
Single attendee + known company: Skip company extraction, focus on person URLs. Multiple attendees: Prioritize person-specific URLs over company-level ones.
Step 6: Synthesize Briefing
Structure the output as a meeting prep briefing. Adapt focus based on meeting type.
# Meeting Prep: [Company Name]
*[Meeting date/time if known] | Prepared [today's date]*
## Quick Take
[2-3 sentences: who you're meeting, why it matters, and the one thing to know
going in. This is the "read nothing else" paragraph.]
## Attendees
### [Name] — [Title]
**Background:** [Current role, time in position, career trajectory highlights]
**Recent Activity:** [What they've been posting, speaking about, or working on.
Direct quotes from posts/talks when available.]
**Conversation hooks:** [2-3 specific things to reference — shared connections,
their recent project, a post they wrote, a talk they gave]
**Notes from prior meetings:** [If exists in memory — what was discussed, their
preferences, open items. "No prior meetings on file" if none.]
[Repeat for each attendee]
## Relationship Map
[Cross-attendee connections — shared employers, mutual connections, overlapping
interests, organizational dynamics between attendees. Skip if single attendee.]
## Company Context
- **What they do:** [One line]
- **Size / Stage:** [Employees, funding stage, HQ]
- **Recent news:** [Top 2-3 items, dated with source]
- **Relevant to your meeting:** [How their company context connects to your
discussion — e.g., recent product launch you might discuss, funding that
signals growth, leadership change affecting priorities]
## Value Positioning
*[Only for sales/discovery, partnership, and board/investor meetings. Omit entirely
for interview, internal, and general external meetings.]*
### Value Mapping
[Match their specific needs/pain points to your capabilities. Every mapping must
be grounded in research from Step 4.5, not generic claims.
Format: "They [specific finding with source] → Your product [specific capability]"]
### Integration Hooks
[Tools/platforms they use that your product integrates with. Only include
integrations confirmed from research (their tech stack) AND your profile
(integration_partners). If no overlap found, say so honestly.]
### Recommended Positioning
[2-3 sentences on how to frame your pitch for THIS specific company and person.
Consider: their company stage, recent news, the attendee's role and priorities,
and any competitive displacement opportunity. This is the "elevator pitch
calibrated to this meeting" paragraph.]
### Reference Customers
[Simila
…
## Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [Nimbleway](https://github.com/Nimbleway)
- **Source:** [Nimbleway/agent-skills](https://github.com/Nimbleway/agent-skills)
- **License:** MIT
- **Homepage:** https://www.nimbleway.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.