mcpbeat Sign in

Meeting Brief Generator Agent Skill

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 prospect brief for".

7k tokens
context cost
the whole folder, loaded on every use
6
files
instructions only
0
copies elsewhere
how many repositories repackaged it
569
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/Varnan-Tech/opendirectory --skill meeting-brief-generator

The instruction itself

7 sections, as written by the author

Meeting Brief Generator

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.


Step 1: Setup Check

Confirm required env vars:

echo "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?"


Step 2: Gather Context

Collect the following. Ask only for what is missing.

Required:

  • Company name (or domain/URL if provided)
  • Meeting date

Optional (do not block if missing):

  • Contact name and title
  • Meeting type (discovery, demo, follow-up, QBR)
  • Any specific topics or goals the user wants to cover

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).


Step 3: Research with Tavily

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

curl -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)

curl -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

curl -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

curl -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

curl -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

curl -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

curl -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

curl -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
  }'

Step 4: Synthesize with Gemini

Read references/brief-format.md in full. Read references/output-template.md and use the template.

Write the Gemini request to a temp file:

cat > /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:

  • All Tavily search results (title, url, content snippet per result)
  • The brief template structure from output-template.md
  • The company name, contact name (if provided), meeting date, meeting type (if provided)

Step 5: Self-QA

Check before presenting:

  • [ ] No invented data. Every fact has a source URL from Tavily results.
  • [ ] Talking points use "Because [finding], mention [point] to [goal]" format
  • [ ] No em dashes in any line
  • [ ] No banned words
  • [ ] Brief is under 400 words
  • [ ] Decision Maker section says "Not specified" if no contact was provided
  • [ ] Sections with no data say "Limited public information found" rather than guessing
  • [ ] Open questions are specific to this company, not generic

Fix any violation before presenting.


Step 6: Output or Save to Notion

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:

cat > /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 skills for the same job

different authors, same section of the catalogue
Meeting Insights Analyzer
by frostant
×8

Analyzes meeting transcripts and recordings to uncover behavioral patterns, communication insights, and actionable feedback. Identifies when you avoid conflict, use filler words, dominate conversations, or miss opportunities to listen. Perfect for professionals seeking to improve their communication and leadership skills.

3k tokens
Slack Gif Creator
by JayZeeDesign
×7

Toolkit for creating animated GIFs optimized for Slack, with validators for size constraints and composable animation primitives. This skill applies when users request animated GIFs or emoji animations for Slack from descriptions like "make me a GIF for Slack of X doing Y".

53k tokens scripts
Developer Growth Analysis
by frostant
×6

Analyzes your recent Claude Code chat history to identify coding patterns, development gaps, and areas for improvement, curates relevant learning resources from HackerNews, and automatically sends a personalized growth report to your Slack DMs.

4k tokens
Slack Gif Creator
by anthropics
vendor ×5

Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like "make me a GIF of X doing Y for Slack.

11k tokens scripts
Skill Share
by frostant
×4

A skill that creates new Claude skills and automatically shares them on Slack using Rube for seamless team collaboration and skill discovery.

728 tokens
Electron
by vercel-labs
vendor ×2

Automate Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify, etc.) using agent-browser via Chrome DevTools Protocol. Use when the user needs to interact with an Electron app, automate a desktop app, connect to a running app, control a native app, or test an Electron application. Triggers include "automate Slack app", "control VS Code", "interact with Discord app", "test this Electron app", "connect to desktop app", or any task requiring automation of a native Electron application.

2k tokens
Notion Meeting Intelligence
by openai
vendor ×2

Prepare meeting materials with Notion context and Codex research; use when gathering context, drafting agendas/pre-reads, and tailoring materials to attendees.

18k tokens
Daily Meeting Update
by softaworks
×2

Interactive daily standup/meeting update generator. Use when user says 'daily', 'standup', 'scrum update', 'status update', 'what did I do yesterday', 'prepare for meeting', 'morning update', or 'team sync'. Pulls activity from GitHub, Jira, and Claude Code session history. Conducts 4-question interview (yesterday, today, blockers, discussion topics) and generates formatted Markdown update.

8k tokens scripts

How to use it

Copy the folder

Take varnan-tech/meeting-brief-generator from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.