meeting-prep

Installation
SKILL.md

Meeting Prep Briefing

Generate a concise, actionable briefing before a call.

Inputs

The user provides one or more of:

  • A contact name, email, or company name
  • A meeting reference (title, date, calendar event)
  • Meeting details from a calendar integration (summary, startTime, attendees)

If not provided, ask for the contact or meeting context.

Workflow

Step 1: Identify the contact and company

Resolve the contact to an Attio record:

  1. If attendee emails are provided: use the primary external attendee.
  2. Search Attio by email or name: Use search-records with object = "people" and the contact's email or name as query.
  3. From the person record, extract:
    • Name, job title, company
    • Associated deals (IDs and status)
    • Subscription status, plan, LTV
    • Origin, registration date
    • Last interaction date

Step 2: Enrich new companies via Extruct Growth Signal table

After identifying the company, determine whether this is a new company — one with no meaningful prior interaction history. Use the Attio company record from Step 1 to check:

  • first_interaction is missing, or occurred less than 14 days ago
  • strongest_connection_strength is Very weak or Weak
  • No associated deals, or the deal was created very recently
  • No company record found in Attio at all

If any of those conditions are true, treat the company as new and run Extruct enrichment.

Extruct Growth Signal table

This is a reusable company enrichment table with these research columns:

Key Column Name Kind Output
expansion_signals Expansion Signals agent (research_pro) text — geographic, product, and market expansion evidence
traction_indicators Traction Indicators agent (research_pro) text — customer counts, revenue milestones, case studies, review volume
business_priority_signals Business Priority Signals agent (research_pro) text — strategic priorities from job postings, product pages, exec posts
recent_trigger_events Recent Trigger Events agent (research_pro) json — funding rounds, launches, major hires, partnerships
growth_stage_signals_ Growth Stage Signals agent (research_pro) text — scaling indicators from press, job postings, office openings
ai_initiatives AI Initiatives agent (research_pro) text — AI-related projects, products, and strategic focus

Workflow:

Use the Extruct MCP server for all enrichment operations. Tool names referenced below (list_tables, create_table, add_columns, create_rows, run_table, get_table, get_table_data) are exposed by the Extruct MCP at https://api.extruct.ai/mcp.

Step 2a: Find or create the Growth Signal table

  1. Check .env for a cached table ID: Read EXTRUCT_GROWTH_SIGNAL_TABLE_ID from .env. If present, use it as <table_id> and skip to Step 2b.

  2. If not in .env, search Extruct for an existing table: Call list_tables with search = "Growth Signal", limit = 10. Look for a company-kind table named "Growth Signal" (or similar). If found, save its id to .env as EXTRUCT_GROWTH_SIGNAL_TABLE_ID=<table_id>, and skip to Step 2b.

  3. If no table exists, create one with the standard columns: Call create_table with name = "Growth Signal", kind = "company". Save the returned table id as <table_id> and persist it to .env as EXTRUCT_GROWTH_SIGNAL_TABLE_ID=<table_id>.

  4. Add the enrichment columns: Call add_columns with table_id = <table_id> and the following column_configs:

    {
      "column_configs": [
        {
          "kind": "agent",
          "name": "Expansion Signals",
          "key": "expansion_signals",
          "value": {
            "agent_type": "research_pro",
            "prompt": "Identify and summarize the company's expansion signals using information from job postings, press releases, new office mentions, executive hires, and product launches. Focus on evidence of geographic, product, or market expansion. Include details such as new regional offices, hires in specific regions (e.g., EMEA, APAC), product development roles, or mentions of entering new customer segments. Output as a short text summary.",
            "output_format": "text",
            "extra_dependencies": ["company_name", "company_website"]
          }
        },
        {
          "kind": "agent",
          "name": "Traction Indicators",
          "key": "traction_indicators",
          "value": {
            "agent_type": "research_pro",
            "prompt": "Identify traction indicators for the company by analyzing customer count claims on the website, revenue milestones in press, case studies, review volume, and job posting mentions. Summarize key signals of growth and market adoption in text form.",
            "output_format": "text",
            "extra_dependencies": ["company_name", "company_website"]
          }
        },
        {
          "kind": "agent",
          "name": "Business Priority Signals",
          "key": "business_priority_signals",
          "value": {
            "agent_type": "research_pro",
            "prompt": "Identify business priority signals for the company by analyzing job postings, product page focus, executive LinkedIn posts, earnings calls, and blog content. Summarize the company's current strategic priorities in text form.",
            "output_format": "text",
            "extra_dependencies": ["company_name", "company_website"]
          }
        },
        {
          "kind": "agent",
          "name": "Recent Trigger Events",
          "key": "recent_trigger_events",
          "value": {
            "agent_type": "research_pro",
            "prompt": "Identify the company's recent trigger events by reviewing press releases, LinkedIn company updates, job postings, and product launches. Summarize notable events such as new product launches, major hires, funding announcements, office openings, or strategic partnerships.",
            "output_format": "json",
            "output_schema": {
              "type": "object",
              "properties": {
                "date": {"type": "string"},
                "type": {"type": "string", "description": "type of the signal"},
                "description": {"type": "string"}
              }
            },
            "extra_dependencies": ["company_name", "company_website"]
          }
        },
        {
          "kind": "agent",
          "name": "Growth Stage Signals",
          "key": "growth_stage_signals_",
          "value": {
            "agent_type": "research_pro",
            "prompt": "Identify growth stage signals for the company by analyzing recent information. Use sources such as press mentions, job posting language, Glassdoor reviews, office openings, and product launches. Look for indicators like rapid growth, scaling, expanding, doubling team, fast-paced, or hypergrowth. Summarize your findings in a concise text format.",
            "output_format": "text",
            "extra_dependencies": ["company_name", "company_website"]
          }
        },
        {
          "kind": "agent",
          "name": "AI Initiatives",
          "key": "ai_initiatives",
          "value": {
            "agent_type": "research_pro",
            "prompt": "Summarize the company's current AI initiatives, including any projects, products, or strategic focuses related to artificial intelligence. Look for information in press releases, product announcements, or company reports. Format the response as a concise text summary.",
            "output_format": "text",
            "extra_dependencies": ["company_name", "company_website"]
          }
        }
      ]
    }
    
  5. On first run, confirm with the user: "I've created a new Growth Signal enrichment table in Extruct with 6 research columns. Want me to proceed with enriching {company_name}?"

Step 2b: Enrich the company

  1. Check if the company already exists in the table: Call get_table_data with table_id = <table_id>, limit = 100, columns = ["company_name", "company_website"]. Scan for a matching domain. If found, read that row's data directly — skip to step 4.

  2. Add the company as a new row: Call create_rows with table_id = <table_id>, rows = [{"data": {"input": "{company_domain}"}}], run = true. Use the company domain (e.g. livedatatechnologies.com) as input. run = true starts enrichment immediately.

  3. Poll until enrichment completes: Call get_table with table_id = <table_id> and check the run status until it reports completion.

  4. Read the enriched row: Call get_table_data with table_id = <table_id>, limit = 5, columns = ["company_name","expansion_signals","traction_indicators","business_priority_signals","recent_trigger_events","growth_stage_signals_","ai_initiatives"]. Extract the row matching the target company.

  5. Incorporate into the briefing: The enrichment data feeds into the briefing in Step 6 as a new Company Intelligence section (see updated briefing structure below). Summarize the most relevant signals — do not dump raw output.

If the company is NOT new (established relationship with strong Attio history), skip this step entirely. The existing Attio, Gmail, and Granola data is sufficient.

Step 3: Get deal context (Attio MCP)

For each associated deal:

  • Use get-records-by-ids with object = "deals" and the deal record IDs from Step 1.
  • Extract: deal name, stage, value, close date, notes

Check for pending tasks:

  • Use list-tasks with is_completed = false
  • Filter for tasks linked to this person or their deals

Step 4: Recent email interactions (Gmail MCP)

  1. Call gmail_search_messages with: from:{contact_email} OR to:{contact_email} Limit to 10 most recent.

  2. Call gmail_read_thread on the 2-3 most recent threads.

Summarize:

  • Last 2-3 touchpoints (date, topic, outcome)
  • Any open proposals, questions, or commitments
  • Tone of the relationship

Step 5: Past meeting history (Granola MCP)

  1. Call query_granola_meetings with "meetings with {contact_name}"
  2. If relevant meetings found, call get_meetings for details

Summarize:

  • What was discussed in past meetings
  • Action items that were assigned
  • Decisions that were made

Step 6: Generate the briefing

Structure:

## Meeting Brief: {contact_name} — {company}
**When:** {meeting_time}
**Attendees:** {attendee_list}

### 1. Relationship State
- Current deal stage / subscription status
- How long they've been a customer/prospect
- Key metrics (LTV, plan, usage)

### 2. Company Intelligence (new companies only — from Extruct Growth Signal)
- **Profile:** {short_description}, founded {year}, {employee_count}, HQ {location}
- **Growth stage:** {key growth stage signals}
- **Recent triggers:** {most relevant trigger event with date}
- **Business priorities:** {top 1-2 strategic priorities}
- **Traction:** {key traction metric or signal}
- **AI initiatives:** {summary if relevant to the conversation}

*(Omit this section entirely for established relationships with strong Attio history.)*

### 3. Recent Interactions
- {date}: {touchpoint summary}
- {date}: {touchpoint summary}
- {date}: {touchpoint summary}

### 4. Key Contacts
- {name} — {title} ({context on their role in the deal})

### 5. Suggested Talking Points
1. {specific talking point tied to recent context}
2. {specific talking point tied to recent context}
3. {specific talking point tied to recent context}

### 6. Questions to Explore
- {question grounded in deal/interaction context}
- {question grounded in deal/interaction context}
- {question grounded in deal/interaction context}

### 7. Open Items
- {pending task or commitment}
- {unanswered proposal or question}

Rules:

  • Every point must be grounded in data from Attio, Gmail, Granola, or Extruct — no generic filler
  • Talking points should reference specific things from email/meeting history
  • If there's an open proposal with a price, surface it
  • Flag overdue tasks or stale follow-ups
  • Keep the entire brief under 400 words

Step 7: Save artifacts locally

Before presenting, check revops/customers/{company-slug}/ for existing context:

  1. Read first: If context.md or past meeting notes exist, use them as additional input.
  2. Save meeting notes: If Granola data was fetched, persist to meetings/YYYY-MM-DD_{title-slug}.md using the template from revops/customers/README.md.
  3. Update context.md: Add any new information to the relationship summary.

Granola data can be deleted — the local copy is the source of truth.

Step 8: Present the brief

Show the briefing to the user. Ask if they want to:

  1. Dive deeper into any section
  2. Get the full transcript of a past meeting
  3. See the complete email thread

Attio MCP Tool Reference

Use these MCP tools (NOT raw API calls):

Task Tool Key parameters
Search people or companies search-records object, query
Get specific records get-records-by-ids object, record_ids
Get pending tasks list-tasks is_completed=false

Extruct MCP Tool Reference

Task Tool Key parameters
Find an existing table list_tables search, limit
Create a new table create_table name, kind
Add columns to a table add_columns table_id, column_configs
Add rows (with enrichment) create_rows table_id, rows, run
Start/rerun enrichment run_table table_id, mode
Check run status get_table table_id
Read enriched row data get_table_data table_id, limit, columns

Environment

Variable Source Purpose
Attio MCP (Attio connector) CRM — people, companies, deals, tasks
Extruct MCP (https://api.extruct.ai/mcp) Company enrichment for new companies
Gmail MCP (claude.ai Gmail) Email history
Granola MCP (Granola) Meeting notes and transcripts
Google Calendar MCP (claude.ai Google Calendar) Upcoming meeting context (optional)
EXTRUCT_GROWTH_SIGNAL_TABLE_ID .env Cached Growth Signal table ID (auto-saved on first run)

Reference

  • CRM enrichment context: revops/CRM_ENRICHMENT.md
  • Customer artifacts: revops/customers/ (see README.md for structure and templates)
  • Extruct Growth Signal table: discovered at runtime via list_tables with search = "Growth Signal", or auto-created if missing
Related skills
Installs
1
GitHub Stars
3
First Seen
Apr 17, 2026