72bpm-leadgen-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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:
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:
Error Handling:
|
| 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:
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:
Error Handling:
|
| 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:
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:
Error Handling:
|
| 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:
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:
Error Handling:
|
| 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:
Returns: JSON with schema: { "company_name": string, "category": string, "variants": [ { "label": string, "subject": string, "body": string } ] } Examples:
Error Handling:
|
| 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:
Returns: the saved lead record including its generated "id", which you'll need for leadgen_update_lead. Examples:
|
| leadgen_list_leadsA | Lists saved leads from the pipeline, optionally filtered by category, tier, or status. Args:
Returns: JSON: { "leads": StoredLead[], "count": number } where StoredLead has fields: id, companyName, domain, category, region, score, tier, status, notes, contact, createdAt, updatedAt Examples:
|
| leadgen_update_leadA | Updates a saved lead's status and/or notes — e.g. after sending outreach or getting a reply. Args:
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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 8 tools
Each tool has a distinct phase in the lead-gen workflow: discover finds candidates, enrich profiles a company, score quantifies fit, find_contact locates people, generate_pitch writes emails, and save/list/update manage the pipeline. Even the similar enrich vs. score are clearly differentiated by multi-category vs. single-category output.
All tools follow the exact pattern leadgen_<verb>_<noun> with clear, consistent verbs (discover, enrich, score, find, generate, save, list, update). The prefix unifies the namespace and the verb_noun structure makes each tool's purpose predictable.
8 tools is well-scoped for a specialized lead-generation workflow. Each tool covers a necessary step without redundancy or bloat, and the count is within the ideal range for a focused MCP server.
The lifecycle is nearly complete: discovery, enrichment, scoring, contact finding, pitch generation, and pipeline CRUD (save/list/update). The only notable gap is the absence of a delete/archive tool for leads, though the status field can handle disqualification, so agents can work around this.