GrowthKit Revenue Intelligence
Sales intelligence for B2B SMEs — lead scoring, ICP fit, CRM enrichment & writeback.
Connect it
Settings → Connectors → Add custom connector
URL: https://mcp.growthkit.toolsSettings → Apps & Connectors → Advanced → Developer mode
Create connector with URL: https://mcp.growthkit.tools{
"mcpServers": {
"revenue-intelligence": {
"url": "https://mcp.growthkit.tools"
}
}
}claude mcp add --transport http revenue-intelligence https://mcp.growthkit.tools{
"servers": {
"revenue-intelligence": {
"type": "http",
"url": "https://mcp.growthkit.tools"
}
}
}74 tools, verified live
embedMemoryStore knowledge into long-term memory. Supports single items and batch embedding (max 50). IMPORTANT — Chapter System: Every memory MUST be classified into exactly one chapter via metadata.chapter. Available chapters: icp, strategy, campaigns, analytics, brand, competitors, learnings, general, pipeline, signals, playbook. Always analyze the content and pick the most specific chapter. Use general o
searchMemoryread-onlySearch long-term memory using semantic similarity. ALWAYS SEARCH BEFORE ANSWERING marketing/strategy questions. Use short, specific keywords as queries. Available chapters: icp, strategy, campaigns, analytics, brand, competitors, learnings, general, pipeline, signals, playbook. TAG FILTERING: Memories are auto-tagged. Use metadata_filter with tags key to filter (e.g. metadata_filter: { chapter: 'c
listMemoriesread-onlyList stored memories in stored order with pagination. Unlike searchMemory (semantic relevance ranking), use this to browse, enumerate, or audit a chapter — not to find the most relevant memory for a question. Filter by chapter via metadata_filter.chapter.
updateMemorycan modifyUpdate content or metadata of a stored memory. Use to enrich, fix, or reclassify. You MUST provide a change_reason explaining WHAT changed and WHY. The reason is stored in the version history audit log.
deleteMemoriescan modifyDelete memories by IDs. Always confirm with user first. You MUST provide a change_reason explaining WHY these memories should be deleted. The reason is stored in the version history audit log.
clearMemoriescan modifyDelete ALL memories. Irreversible. Always ask for explicit confirmation. You MUST provide a change_reason.
countMemoriesread-onlyReturn only counts, not content — use for overview/sizing (e.g. 'how many competitor memories exist?') before deciding whether to list or search. Optionally filter by chapter via metadata_filter.chapter. For a per-chapter breakdown in one call, prefer getChapterOverview.
getChapterOverviewread-onlyGet memory count per chapter. Use as FIRST STEP in new conversations or reviews.
uploadDocumentUpload a file to GrowthKit document storage. Optionally extracts text and embeds insights.
listDocumentsread-onlyList stored documents with optional filtering by category or chapter.
getDocumentread-onlyGet a specific document with fresh download URL and linked insights.
deleteDocumentcan modifyDelete a document and its associated insights. Irreversible — always confirm with the user first.
createReminderSchedule a reminder. Convert relative times to ISO 8601.
listRemindersread-onlyList reminders, ordered by remind_at ascending. By default returns only pending reminders; pass status=sent|cancelled|all to widen. Optionally scope to one task via task_id. Returns each reminder's id, title, remind_at, and status.
cancelRemindercan modifyCancel a pending reminder by ID.
getHistoryread-onlyGet the version history of a specific memory. Shows all previous versions with timestamps and who made changes.
restoreVersioncan modifyRestore a memory to a previous version. Works for both existing and deleted memories. Use version_id from getHistory or listDeleted results.
listDeletedread-onlyList recently deleted memories that can be restored. Shows content preview and deletion info.
listTeamread-onlyList all team members (token holders) for your account. Shows display names, roles, and identifies which token is yours.
sendNotificationSend a notification to a team member. First use listTeam to find the recipient. For 2-person teams, the recipient is auto-resolved.
checkNotificationsread-onlyCheck for unread notifications (direct messages and broadcasts).
crmSearchCompanyread-onlySearch CRM for a company by name. ALWAYS search before creating to avoid duplicates.
crmGetCompanyread-onlyGet full company details by ID. Returns name, domain, industry, employees, address, CRM link.
crmCreateCompanyCreate a new company. ALWAYS search first to avoid duplicates.
crmGetCompanyDealsread-onlyGet all deals linked to a company, by company ID. Use after crmSearchCompany or crmGetCompany to review that company's pipeline.
crmGetCompanyContactsread-onlyGet all contacts linked to a company, by company ID. Use to find who to reach at a known company.
crmSearchContactread-onlySearch CRM for a contact by name or keyword (fuzzy match); returns the top matches. Use to look up one known person. For structured segment queries across the contact base (e.g. 'all CEOs in pipeline companies'), use crmListPeople instead.
crmListCompaniesread-onlyList companies from CRM with structured filters. Use for segment queries like 'all pharma companies with 50-200 employees in DACH'. All filter fields optional. Returns companies with id, name, industry, employees, country, and pagination info. Unlike crmSearchCompany (which does fuzzy name search), this does precise structured filtering.
crmListPeopleread-onlyList people/contacts from CRM with structured filters. Use for segment queries like 'all CEOs in pipeline companies'. All filter fields optional. Unlike crmSearchContact (fuzzy lookup of one person by name), this does precise structured filtering across the contact base. Returns contacts with id, name, title, company, and pagination info.
crmGetContactread-onlyGet full contact details by ID.
crmCreateContactCreate a new contact. ALWAYS pass company_id when the company exists.
crmGetPipelinesread-onlyGet all pipelines with stages. ALWAYS call before creating deals to get valid stage_id.
crmCreateDealCreate a new deal. Requires title + stage_id. MUST call crmGetPipelines first.
crmUpdateDealcan modifyUpdate a deal. Use generic names: company_id, contact_id, expected_close.
crmGetDealread-onlyGet the full record for one deal by ID. Use after a search or list returns a deal id when you need its complete details.
crmAddNoteAdd a note to a CRM record — a deal, company, or contact. Provide content (HTML supported) and at least one target id (deal_id, company_id, or contact_id). Use to log call summaries, context, or decisions against the record.
crmCreateActivityCreate a follow-up activity on a CRM record. Provide a subject and set type (call | meeting | task | email | deadline; default task). Optionally link it to a deal, company, or contact and set a due_date (YYYY-MM-DD). Use to schedule next steps after an interaction.
crmCheckConnectionread-onlyCheck if CRM is connected and which provider is active.
enrichCompanyread-onlyGet company info by domain or name. Returns industry, employees, revenue, location, technologies. Prefer `domain` — it is unambiguous; a name matches whatever the provider thinks it means. `domain_unresolved` is not a provider failure — no provider was called and no credit was spent. The reply carries `candidates` (up to five domains with titles): offer them to the user, or pass `country` / `indus
enrichPersonread-onlyGet person profile from email or LinkedIn URL.
findContactsread-onlyFind contacts at a company. Filter by seniority or department.
findEmailread-onlyFind one person's email by name + domain.
verifyEmailread-onlyCheck if an email is deliverable. Use before outreach.
discoverSimilarread-onlyFind lookalike companies for a seed and re-rank them by fit. mode='account' (seed={domain}) finds companies similar to that domain via Hunter similar_to; mode='icp' (no seed) discovers companies matching your saved ICP; mode='won_deals' is not yet implemented. Each candidate comes back with similarity_to_seed (0–100 firmographic closeness to the seed), canonical_icp_score (0–100 vs your global ICP
scoreLeadsTrigger ICP lead scoring. Two independent modes — choose by WHERE the leads live, they do not overlap. (1) CAMPAIGN MODE — mode='campaign' plus campaign_id: scores the leads of one campaign (campaign_leads). Use this whenever the request is about a campaign, an imported/uploaded lead list, or leads that are not in a CRM. Needs no CRM connection and no Pro plan. Scores are written back onto the cam
getTopLeadsread-onlyRetrieve the highest-scoring leads from the CRM, ranked by ICP fit. Returns company details, contact (if any), 4-dimension score breakdown, and qualitative reasons like 'Industry X — strong match to ICP'. By default filters out leads with <50% data completeness to avoid false-positives from data-sparse ICP matches (e.g. leads where only the contact's seniority matched but industry/employees/countr
email_composecan modifyCompose an email via the user's connected email provider (currently Gmail; Microsoft 365 coming in Phase B). DEFAULT mode is 'draft' — creates a real draft in Gmail that the user can review before sending. Only use mode='send' when the user explicitly confirms sending with keywords like 'sende', 'schick raus', 'verschicken', 'send it', 'raus damit'. On 'draft' success, response includes draft_url
createCampaignCreate a new campaign briefing. Use after collecting the 7 required fields via the campaign-briefing-playbook (search 'campaign-briefing-playbook' in playbook chapter to load the methodology). Sets status='draft'. Returns the created campaign id. NEVER call this without first running the playbook conversation — every campaign needs a complete briefing.
listCampaignsread-onlyList campaigns for the current user, optionally filtered by status. Returns campaign metadata plus per-stage lead counts.
getCampaignread-onlyGet a single campaign with full briefing details and lead-stage counts.
updateCampaigncan modifyUpdate fields on an existing campaign. Pass only the fields to change. Use `scoring` to give THIS campaign its own lead-scoring profile — without it the campaign is scored against the user's global ICP, which is wrong whenever the campaign targets a different market. A campaign with its own profile also re-scores automatically when the profile changes.
addCampaignLeadsAdd one or more leads to a campaign. Standard fields (company_name, contact_email, etc.) go to typed columns. ANY OTHER FIELD you pass automatically gets stored in the metadata jsonb column — no schema migration needed for new fields. Examples of custom fields: booth_number, source_event, scanned_at, follow_up_priority, notes_from_call. Call getCampaignLeadFields first to discover what custom fiel
getCampaignLeadFieldsread-onlyDiscover which fields are actually used in a campaign's leads. Returns standard columns with non-null values PLUS all metadata (custom) keys with usage counts and sample values. ALWAYS call this BEFORE asking the user about lead structure or before adding new custom fields — it tells you what's already established for this list.
updateCampaignLeadcan modifyUpdate fields on an existing campaign lead. Pass lead_id (UUID from listCampaignLeads) and an updates object with only the fields to change. Use this to mark leads as rejected, manually correct enrichment data, or attach custom metadata. Setting lifecycle_stage='rejected' REQUIRES rejected_reason in the same call. The metadata field is shallow-merged into existing metadata jsonb — existing keys ar
listCampaignLeadsread-onlyList leads in a campaign, optionally filtered by lifecycle_stage or enrichment_status. Returns up to 100 per call. Compact rows by default — id, company name, domain, score, fit_gate, strong_signals, has_email, has_phone, lifecycle_stage — which is what you need to rank and to decide. The compact rows carry no contact. fields=full adds the contact (contact_name, contact_role, contact_email, contac
getCampaignLeadread-onlyOne campaign lead with everything stored about it: contact, company, score, lifecycle_stage, metadata and the complete enrichment_data. That is where you answer why a contact was chosen and who else was found: enrichment_data.persona holds the trail (persona_naehe, persona_treffer, gewaehlt, alternativen, getauscht), enrichment_data.kandidaten_liste the people the enrichment found, and metadata.vo
pipelineStatusread-onlyShow where a campaign's leads stand in the qualification chain. Returns the funnel (how many leads have a domain, firmographics, a score, a signal, an email, a phone), how many candidates each stage currently has, and the top 10 leads by priority. Read-only, spends no credits. Call this FIRST whenever the user asks what to do with a campaign — the pending counts tell you which stage to run next. T
pipelineRuncan modifyRun ONE stage of the qualification chain for the next N candidates. Stages in order: resolve → score → signals → reveal → rescore; rerank follows reveal and re-judges the contacts that are already there. ALWAYS call with dry_run=true first and show the user the candidate count and estimated_credits; only after explicit confirmation call again with dry_run=false and confirm_credits set to the numbe
listLeadSignalsread-onlyList the stored why-now signals for one lead or for a whole campaign: `id` (the signal_id that updateLeadSignal and deleteLeadSignal take), type (funding, hiring, job_change, leadership, acquisition, expansion, tech_change, regulatory, event, inbound, other), the one-sentence signal, its source URL, the observed date, a confidence, and `cite`. Read-only. When you use a signal in outreach, use `cit
updateLeadSignalcan modifyCorrect ONE stored why-now signal in place. signal_id is the `id` of a signal from listLeadSignals — call that with active_only=false to also see expired signals. updates carries only the fields to change: type, signal, source_url, source_label, observed_at, last_confirmed_at. Anything else is ignored and named in `ignored_fields`. The signal stays on its lead: lead_id is not writable, so a signal
deleteLeadSignalcan modifyPermanently delete ONE why-now signal, e.g. one recorded on the wrong company. Always confirm with the user first: name the company, the signal sentence and its source, and wait for an explicit yes. There is no undo and no version history. signal_id is the `id` of a signal from listLeadSignals (active_only=false also lists expired ones). Only this signal is removed — the lead's other signals stay
show_callable_leadsread-onlyRender an interactive call card of leads that have a phone number, each with a ☎ Anrufen button. The HUMAN user clicks a button to place a click-to-call from their own verified caller ID. This tool ONLY displays the card — it never places a call itself, and there is no model-callable call tool (UWG § 7: calls are human-initiated only). Optionally scope to one campaign_id; omit it to aggregate all
place_callcan modifyAPP-PRIVATE: initiates a click-to-call to one lead from the user's own verified caller ID. Not model-callable (hidden via _meta.ui.visibility:["app"]). Invoked only by the lead-call-card iframe when the human clicks ☎ Anrufen. The gk_ session token is taken server-side; the app passes campaign_lead_id only.
save_call_outcomecan modifyAPP-PRIVATE: saves the post-call disposition / note / next action for one call. Not model-callable (hidden via _meta.ui.visibility:["app"]). Invoked only by the lead-call-card iframe after a call. The gk_ session token is taken server-side; the app passes call_log_id (from place_call) plus optional disposition / notes / next_action.
setWorkingMemorycan modifyStore structured state for the current chat session. Use this to persist data that must survive history compression — wizard fields, suggestion lists, active entities. Three kinds: 'wizard' (multi-turn field collection), 'working_set' (ephemeral suggestion lists with TTL), 'pinned_entity' (durable context). Call this AFTER the user confirms a value, BEFORE moving to the next step. The state object
getWorkingMemoryread-onlyRetrieve the current state for a (kind, key) in the current session. Returns null if not set. Use this when you need to merge into existing state or verify what's stored. NOTE: Active working memory entries are ALSO automatically injected into the system prompt by Build Messages — you usually don't need to call this manually. Only call when you need a specific record's full state on-demand.
createTaskCreate a prioritized task. Provide the four ICE inputs (impact, confidence, effort_constraint, effort_nonconstraint); the DB computes ice_score. Show the inputs to the user for confirmation before calling.
listTasksread-onlyList tasks in the workspace, ranked by ICE (highest first). Optional filters.
getOpenTasksread-onlyReturn the workspace's open/in-progress tasks ranked by ICE (highest priority first) plus the total open count. Call this at the START of any planning, prioritization, or 'what should I work on next' discussion to ground the conversation in current open tasks before advising.
updateTaskcan modifyUpdate fields of a task. Partial update; status='done' sets done_at automatically. ice_score recomputes when impact/confidence/effort change.
setTaskWeightsSet the workspace effort weights (constraint vs non-constraint lane) and optional display labels. Re-stamps open tasks so their ICE re-ranks.
toggleStepCheck off or re-open a single step in a task's checklist. Provide the task `id` and the `step_id` of the step to toggle. Omit `done` to flip the step's current state; set done=true/false to force a specific state (idempotent). Use when the user completes or reopens a checklist item on a task that has steps.
getSeoReportread-onlyRead the weekly SEO report history for this workspace's domains: Google Search Console clicks and impressions, average position, AI-referral sessions and content-brief counts — one data point per ISO week, oldest first. Returns { domains: { <domain-slug>: { series: [...], latest_card } } }. IMPORTANT: avg_position is null for a week with no data — null is NOT zero and must never be charted or aver
getAeoReportread-onlyRead the weekly AEO report history — how this workspace's brand shows up in AI answer engines. Per ISO week (field: period) and domain: visibility, share_of_voice and own_cited (all ratios 0..1, multiply by 100 to display a percentage), avg_position (1 = best; null = never mentioned that week, NOT zero), plus prompts_scored and attempted_but_no_data. Each series point also carries per_engine: one
Alternatives in CRM & Sales
Compare →
Gumroad MCP by usefulapiB
Read products, sales, subscribers and offer codes; verify, enable and disable product licenses.
Folk MCP by usefulapiB
Read and write Folk CRM people, companies, groups and notes.
Copper MCP by usefulapiB
Read and write Copper CRM people, companies, opportunities and activities.
Bird MCP by usefulapiB
Read SMS, WhatsApp, email, contacts and audiences from your Bird workspace, plus safe CRM writes.
MAMarkifact - Ads & AnalyticsB
AI marketing agent for Google Ads, Meta, GA4, TikTok, LinkedIn, Shopify, HubSpot and more.
MUMuninB
Open-source all-in-one MCP-first customer platform: KB, Conversations, CRM, CMS, Outreach, Analytics