Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Takes a company name and optional contact, runs targeted research via Tavily, synthesizes a 1-page pre-call brief with Gemini, and optionally saves it to Notion. Use when asked to prepare for a meeting, research a prospect before a call, generate a company brief, create a pre-call summary, or write a meeting prep doc. Trigger when a user says "prepare me for a meeting with", "research this company before my call", "generate a meeting brief for", "I have a call with X tomorrow", or "create a pros
.claude/skills/varnan-tech-meeting-brief-generator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | 108% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 211% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 126% | 0% |
Take a company name and optional contact. Research the company via Tavily. Synthesize a 1-page pre-call brief with Gemini. Optionally save to Notion.
Critical rule: DO NOT INVENT SPECIFICS. Every fact, number, and claim in the brief must come from a Tavily search result. Mark any section with no search data as "Limited public information found." Never fabricate funding amounts, employee counts, or product details.
Confirm required env vars:
bashecho "TAVILY_API_KEY: ${TAVILY_API_KEY:+set}" echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}" echo "NOTION_TOKEN: ${NOTION_TOKEN:-not set}" echo "NOTION_DATABASE_ID: ${NOTION_DATABASE_ID:-not set}"
If TAVILY_API_KEY is missing: Stop. Tell the user: "TAVILY_API_KEY is required. Get it at app.tavily.com. Add it to your .env file."
If GEMINI_API_KEY is missing: Stop. Tell the user: "GEMINI_API_KEY is required. Get it at aistudio.google.com. Add it to your .env file."
If NOTION_TOKEN or NOTION_DATABASE_ID is missing: Continue. The brief will be output as text only. Notion saving is skipped.
Confirm input is present. The user must provide at minimum a company name. If not provided, ask: "Which company are you meeting with?"
Collect the following. Ask only for what is missing.
Required:
Optional (do not block if missing):
If the user provides a company URL or domain, use it to make Tavily queries more precise (e.g. site:example.com or include the domain in search terms).
Run these searches in sequence. Each targets one section of the brief. Save the top results from each (title, url, content snippet, score).
Keep results with score >= 0.5. If a search returns 0 qualifying results, mark that section as "Limited public information found."
Search 1: Company overview
bashcurl -s -X POST "https://api.tavily.com/search" \ -H "Content-Type: application/json" \ -d '{ "api_key": "'"$TAVILY_API_KEY"'", "query": "\"COMPANY\" overview founded employees headquarters", "search_depth": "advanced", "max_results": 5, "include_answer": true }'
Search 2: Recent news (last 30 days)
bashcurl -s -X POST "https://api.tavily.com/search" \ -H "Content-Type: application/json" \ -d '{ "api_key": "'"$TAVILY_API_KEY"'", "query": "\"COMPANY\" news announcement", "search_depth": "advanced", "max_results": 5, "include_answer": true, "topic": "news", "time_range": "month" }'
Search 3: Tech stack
bashcurl -s -X POST "https://api.tavily.com/search" \ -H "Content-Type: application/json" \ -d '{ "api_key": "'"$TAVILY_API_KEY"'", "query": "\"COMPANY\" technology stack engineering infrastructure tools", "search_depth": "advanced", "max_results": 5, "include_answer": true }'
Search 4: Product and pricing
bashcurl -s -X POST "https://api.tavily.com/search" \ -H "Content-Type: application/json" \ -d '{ "api_key": "'"$TAVILY_API_KEY"'", "query": "\"COMPANY\" product features pricing use case", "search_depth": "advanced", "max_results": 5, "include_answer": true }'
Search 5: Competitors
bashcurl -s -X POST "https://api.tavily.com/search" \ -H "Content-Type: application/json" \ -d '{ "api_key": "'"$TAVILY_API_KEY"'", "query": "\"COMPANY\" competitors alternatives vs", "search_depth": "advanced", "max_results": 5, "include_answer": true }'
Search 6: Funding and growth
bashcurl -s -X POST "https://api.tavily.com/search" \ -H "Content-Type: application/json" \ -d '{ "api_key": "'"$TAVILY_API_KEY"'", "query": "\"COMPANY\" funding raised valuation growth", "search_depth": "advanced", "max_results": 5, "include_answer": true }'
If contact name is provided, run two more searches:
Search 7: Contact profile
bashcurl -s -X POST "https://api.tavily.com/search" \ -H "Content-Type: application/json" \ -d '{ "api_key": "'"$TAVILY_API_KEY"'", "query": "\"CONTACT_NAME\" \"COMPANY\" role title", "search_depth": "advanced", "max_results": 5, "include_answer": true }'
Search 8: Contact background
bashcurl -s -X POST "https://api.tavily.com/search" \ -H "Content-Type: application/json" \ -d '{ "api_key": "'"$TAVILY_API_KEY"'", "query": "\"CONTACT_NAME\" background career LinkedIn", "search_depth": "advanced", "max_results": 5, "include_answer": true }'
Read references/brief-format.md in full. Read references/output-template.md and use the template.
Write the Gemini request to a temp file:
bashcat > /tmp/meeting-brief-request.json << 'ENDJSON' { "system_instruction": { "parts": [{ "text": "You are a GTM research analyst preparing a 1-page pre-call brief for a sales or business development meeting. Rules: Every claim must cite a source URL from the provided research. Use the format 'Because [finding from research], mention [point] to [goal]' for talking points. No invented data. If a section has no research data, write 'Limited public information found.' No em dashes. No banned words. Under 400 words total. The brief must be scannable in 3 minutes." }] }, "contents": [{ "parts": [{ "text": "RESEARCH_RESULTS_AND_INSTRUCTIONS_HERE" }] }], "generationConfig": { "temperature": 0.3, "maxOutputTokens": 2500 } } ENDJSON curl -s -X POST \ "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \ -H "Content-Type: application/json" \ -d @/tmp/meeting-brief-request.json \ | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
Replace RESEARCH_RESULTS_AND_INSTRUCTIONS_HERE with:
Check before presenting:
Fix any violation before presenting.
Present the full brief in a code block.
If NOTION_TOKEN and NOTION_DATABASE_ID are both set, ask: "Save this brief to Notion?"
On confirmation:
bashcat > /tmp/notion-brief-payload.json << 'ENDJSON' { "parent": { "database_id": "NOTION_DATABASE_ID_HERE" }, "properties": { "Name": { "title": [{ "text": { "content": "Meeting Brief: COMPANY, DATE" } }] }, "Date": { "date": { "start": "YYYY-MM-DD" } } }, "children": [ { "object": "block", "type": "paragraph", "paragraph": { "rich_text": [{ "type": "text", "text": { "content": "BRIEF_CONTENT_HERE" } }] } } ] } ENDJSON curl -s -X POST "https://api.notion.com/v1/pages" \ -H "Authorization: Bearer $NOTION_TOKEN" \ -H "Content-Type: application/json" \ -H "Notion-Version: 2022-06-28" \ -d @/tmp/notion-brief-payload.json
After posting: "Brief saved to Notion. Check your database."
If Notion is not configured: present the brief only. Do not mention Notion.
Other measured skills in the registry, with their headline benchmark lift.