Skip to main content
Glama
Yadukrishnan117

72bpm-leadgen-mcp-server

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
leadgen_discover_companiesA

Searches the public web for companies showing technical ICP signals for one of 72BPM's four practice areas, and returns a de-duplicated, signal-ranked candidate list.

This tool does NOT scrape LinkedIn or any social platform directly. It queries a real search engine (Brave Search) the same way a human researcher would, and reads back only the public snippet text already indexed. Use leadgen_enrich_company next to go deeper on any promising candidate.

Args:

  • category ('saas' | 'e_mobility' | 'iot' | 'ai_agents'): which practice area to prospect for

  • region (string, optional): geographic focus, e.g. "India", "UAE"

  • extra_keywords (string[], optional): up to 5 extra terms to narrow the search

  • max_results (number): 1-20, default 8

Returns: JSON with schema: { "category": string, "category_label": string, "queries_used": string[], "candidates": [ { "name": string, // best-guess company/page name from search result title "domain": string | null, // extracted domain, use with leadgen_enrich_company "matched_signals": string[],// ICP phrases found in the search snippet itself "sources": [{ "title": string, "url": string, "snippet": string }] } ], "count": number }

Examples:

  • Use when: "Find e-mobility companies in India working on payment sync" -> category="e_mobility", region="India", extra_keywords=["payment sync"]

  • Use when: "Who's building multi-agent systems in the UAE" -> category="ai_agents", region="UAE"

  • Don't use when: you already have a company name and just want its tech profile (use leadgen_enrich_company instead)

Error Handling:

  • Returns an error message if BRAVE_API_KEY is not configured, with a link to get one

  • Returns "No candidates found" with the queries tried if the search turned up nothing usable

leadgen_enrich_companyA

Builds a technical profile for a specific company by crawling its own public website (homepage, /careers, /about, /blog, /engineering) and cross-referencing an indexed LinkedIn snippet plus public job postings — all via legitimate, ToS-compliant sources (no LinkedIn scraping).

Returns which ICP signal phrases were found, for ALL FOUR practice areas at once, so you can see if a company is a multi-category fit (e.g. an IoT hardware company also hiring for LLM-based ops automation).

Args:

  • company_name (string): required

  • domain (string, optional): website domain; enrichment is much richer with it, but LinkedIn/job-posting signal still works without it

Returns: JSON with schema: { "company_name": string, "domain": string | null, "crawled_pages": string[], // URLs successfully crawled "crawl_errors": string[], // pages skipped/failed, with reason "linkedin_snippet": { "title": string, "url": string, "snippet": string } | null, "job_posting_hits": [{ "title": string, "url": string, "snippet": string }], "signals_by_category": { "": { "matched": [{ "phrase": string, "weight": number, "found_in": string[] }], "missing": string[] } } }

Examples:

  • Use when: "What's ElectreeFi's tech stack look like?" -> company_name="ElectreeFi", domain="electreefi.com"

  • Use when: you have a candidate from leadgen_discover_companies and want the full picture before scoring

  • Don't use when: you just want a single category's numeric fit score (use leadgen_score_lead — it's cheaper and more direct)

Error Handling:

  • If domain is unreachable, crawl_errors will explain why but the tool still returns LinkedIn/job-posting signal

  • Returns an error if BRAVE_API_KEY is missing and no domain was provided (nothing to enrich from)

leadgen_score_leadA

Computes a weighted 0-100 ICP fit score for one company against one 72BPM practice area, with a tier (hot/warm/cold) and a confidence level based on how many independent public sources corroborated the signal.

Internally this reuses the same public-source gathering as leadgen_enrich_company (and shares its short-lived cache, so calling enrich then score on the same company won't double the network calls).

Args:

  • company_name (string): required

  • domain (string, optional): website domain — scoring is more reliable with it

  • category ('saas' | 'e_mobility' | 'iot' | 'ai_agents'): required, which practice area to score against

Returns: JSON with schema: { "company_name": string, "category": string, "category_label": string, "score": number, // 0-100 "tier": "hot" | "warm" | "cold", "confidence": "low" | "medium" | "high", // based on # of independent sources with matches "matched_signals": [{ "phrase": string, "weight": number, "found_in": string[] }], "missing_high_value_signals": string[], // top signals NOT found — good discovery-call questions "rationale": string }

Tier thresholds: score >= 55 = hot, >= 30 = warm, else cold. Confidence: 3+ independent sources = high, 2 = medium, 0-1 = low. Treat "low confidence + hot tier" as promising but unverified — worth a human look before outreach.

Examples:

  • Use when: "Is Acme Corp a good IoT lead?" -> company_name="Acme Corp", domain="acme.com", category="iot"

  • Don't use when: you want the full multi-category breakdown (use leadgen_enrich_company instead)

Error Handling:

  • Returns an error if BRAVE_API_KEY is missing and domain gathers nothing

  • Returns score=0, tier="cold", confidence="low" (not an error) if the company has no public signal at all — that's a valid, informative result

leadgen_find_contactA

Searches public, search-engine-indexed snippets (not a LinkedIn scrape) for a likely engineering decision-maker at a company — CTO, VP Engineering, Head of Engineering, etc.

IMPORTANT: results are UNVERIFIED candidates parsed from search snippet text. They are a starting point for manual confirmation (open the profile URL yourself, or verify via a mutual connection / company site team page), not a guaranteed accurate contact. Never send outreach based solely on this tool's output without a human sanity-check.

Args:

  • company_name (string): required

  • role_hint (string, optional): a specific title to prioritize, e.g. "Head of Engineering". Defaults to trying CTO, VP Engineering, Head of Engineering, Engineering Lead, Director of Engineering.

Returns: JSON with schema: { "company_name": string, "candidates": [ { "name_guess": string | null, "title_guess": string | null, "profile_url": string | null, "snippet": string, "verified": false // always false — see IMPORTANT note above } ], "count": number }

Examples:

  • Use when: "Who leads engineering at ElectreeFi?" -> company_name="ElectreeFi"

  • Use when: "Find their Head of Data" -> company_name="Acme Corp", role_hint="Head of Data"

  • Don't use when: you need a verified email address (this tool does not find or guess emails)

Error Handling:

  • Returns "No candidates found" if search turns up nothing matching common engineering-leadership titles

  • Returns an error if BRAVE_API_KEY is not configured

leadgen_generate_pitchA

Drafts two personalized outreach email variants for a qualified lead, following 72BPM's value-lead framework: lead with a specific technical friction point (not a sales pitch), show parallel domain authority for the relevant practice area, and close with a low-friction peer-to-peer call to action.

This tool does NOT send anything — it only drafts text for you to review and send yourself.

Args:

  • company_name (string): required

  • category ('saas' | 'e_mobility' | 'iot' | 'ai_agents'): required, determines which authority/experience line is used

  • friction_point (string): required — the specific technical gap to lead with. Pull this from leadgen_enrich_company's matched_signals or crawled content; generic friction points make for generic (worse) pitches

  • contact_name (string, optional): personalizes the greeting

  • contact_title (string, optional): for your own reference / future use

  • sender_name (string, default "[Your name]"): signs the email

Returns: JSON with schema: { "company_name": string, "category": string, "variants": [ { "label": string, "subject": string, "body": string } ] }

Examples:

  • Use when: you've scored a lead as "hot" and identified its top missing/matched signal, and want ready-to-edit email drafts

  • Don't use when: you haven't identified a real, specific friction point yet — generic pitches convert poorly; go back to leadgen_enrich_company first

Error Handling:

  • Returns a validation error if friction_point is missing or too short — this tool refuses to draft a pitch with nothing specific to say

leadgen_save_leadA

Persists a qualified lead to the local pipeline store (a JSON file under ./data by default; see README for swapping in a real database for hosted/multi-user deployments).

Args:

  • company_name (string): required

  • domain, region (string, optional)

  • category ('saas' | 'e_mobility' | 'iot' | 'ai_agents'): required

  • score (number 0-100, optional): from leadgen_score_lead

  • tier ('hot' | 'warm' | 'cold', optional): from leadgen_score_lead

  • notes (string, optional)

  • contact_name, contact_title, contact_profile_url (string, optional): from leadgen_find_contact

Returns: the saved lead record including its generated "id", which you'll need for leadgen_update_lead.

Examples:

  • Use when: you've scored a company as hot/warm and want to track it for follow-up

  • Don't use when: you're just browsing candidates (save only once you're tracking it for real)

leadgen_list_leadsA

Lists saved leads from the pipeline, optionally filtered by category, tier, or status.

Args:

  • category, tier, status (all optional): filter the results

Returns: JSON: { "leads": StoredLead[], "count": number } where StoredLead has fields: id, companyName, domain, category, region, score, tier, status, notes, contact, createdAt, updatedAt

Examples:

  • Use when: "Show me all hot e-mobility leads" -> category="e_mobility", tier="hot"

  • Use when: "What's still uncontacted?" -> status="new"

leadgen_update_leadA

Updates a saved lead's status and/or notes — e.g. after sending outreach or getting a reply.

Args:

  • lead_id (string, uuid): required, from leadgen_save_lead or leadgen_list_leads

  • status ('new'|'researching'|'contacted'|'replied'|'qualified'|'disqualified', optional)

  • notes (string, optional)

At least one of status or notes must be provided.

Returns: the updated lead record, or an error if lead_id doesn't exist.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Yadukrishnan117/72bpm-leadgen-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server