Model Context Protocol (MCP) server for Apollo.io API integration
GrowthKit Revenue Intelligence is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Sales intelligence for B2B SMEs — lead scoring, ICP fit, CRM enrichment & writeback.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http growthkit-revenue-intelligence-mcp https://mcp.growthkit.tools
# 2 — ask your agent for something these tools do
# embedMemory, searchMemory, listMemories and 71 more
GrowthKit Revenue Intelligence costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http growthkit-revenue-intelligence-mcp https://mcp.growthkit.toolsReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
74 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Store 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| content | string | no | Text content to store (for single embed). |
| items | array | no | Batch embed: array of {content, metadata}. Max 50. Each MUST include metadata.chapter. |
| metadata | object | no | REQUIRED: Must include chapter key. |
Search 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Search keywords — short and specific. |
| metadata_filter | object | no | Filter by metadata. Use chapter to search within a specific chapter. |
| match_threshold | number | no | Min similarity (0-1). Default: 0.5. |
| limit | integer | no | Max results. Default: 10. |
List 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max results. Default: 50. |
| offset | integer | no | Pagination offset. Default: 0. |
| metadata_filter | object | no | Optional metadata filters. Use chapter to list within a specific chapter. |
Update 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| embedding_id | string | yes | ID of the memory to update. |
| new_content | string | no | Updated text content. |
| new_metadata | object | no | Optional metadata to replace, e.g. chapter or tags. |
| change_reason | string | yes | REQUIRED: Why this memory is being updated, e.g. 'Added Q2 metrics', 'Fixed company name', 'User requested update'. Stored in audit log. |
Delete 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| embedding_ids | array | yes | IDs of the memories to delete (from searchMemory/listMemories). |
| change_reason | string | yes | REQUIRED: Why these memories are being deleted, e.g. 'Outdated', 'Duplicate', 'User requested cleanup'. Stored in audit log. |
Delete ALL memories. Irreversible. Always ask for explicit confirmation. You MUST provide a change_reason.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| change_reason | string | yes | REQUIRED: Why all memories should be cleared. Stored in audit log. |
Return 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| metadata_filter | object | no | Optional metadata filters. Use chapter to count within a specific chapter. |
Get memory count per chapter. Use as FIRST STEP in new conversations or reviews.
No parameter schema on file.
Upload a file to GrowthKit document storage. Optionally extracts text and embeds insights.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| file_base64 | string | yes | Base64-encoded file content. |
| filename | string | yes | Filename with extension. |
| mime_type | string | yes | MIME type. |
| category | string | no | Optional storage category. |
| title | string | no | Optional document title. Defaults to the filename. |
| description | string | no | Optional short description of the document. |
| chapter | string | no | Optional memory chapter to associate extracted insights with. |
| extract_insights | boolean | no | If true, extract text and embed insights into memory. Default: false. |
List stored documents with optional filtering by category or chapter.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| category | string | no | Optional: filter by storage category. |
| chapter | string | no | Optional: filter by associated memory chapter. |
| limit | integer | no | Max results. Default: 50. |
| offset | integer | no | Pagination offset. Default: 0. |
Get a specific document with fresh download URL and linked insights.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| document_id | string | yes | ID of the document (from listDocuments). |
Delete a document and its associated insights. Irreversible — always confirm with the user first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| document_id | string | yes | ID of the document to delete (from listDocuments). |
Schedule a reminder. Convert relative times to ISO 8601.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | yes | Short reminder title. |
| description | string | no | Optional reminder details. |
| remind_at | string | yes | When to remind, ISO 8601 (convert relative times first). |
| repeat | string | no | Repeat interval: none | daily | weekly | monthly. Default: none. |
| channel | string | no | Delivery channel: email | slack | webhook. |
| channel_target | string | no | Optional channel target, e.g. email address or webhook URL. |
| task_id | string | no | Optional: link this reminder to a task (task UUID). Linked reminders are auto-cancelled when the task is marked done/dropped. |
List 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| status | string | no | Filter by status: pending | sent | cancelled | all. Default: pending. |
| limit | integer | no | Max results. Default: 50. |
| task_id | string | no | Optional: only reminders linked to this task. |
Cancel a pending reminder by ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| reminder_id | string | yes | ID of the pending reminder to cancel (from listReminders). |
Get the version history of a specific memory. Shows all previous versions with timestamps and who made changes.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| embedding_id | string | yes | ID of the memory to get history for. |
Restore a memory to a previous version. Works for both existing and deleted memories. Use version_id from getHistory or listDeleted results.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| version_id | string | yes | The version ID (restore_id) to restore to. Get this from getHistory or listDeleted. |
List recently deleted memories that can be restored. Shows content preview and deletion info.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max results. Default: 20. |
List all team members (token holders) for your account. Shows display names, roles, and identifies which token is yours.
No parameter schema on file.
Send a notification to a team member. First use listTeam to find the recipient. For 2-person teams, the recipient is auto-resolved.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message | string | yes | The notification message to send. |
| to_prefix | string | no | Recipient's token_prefix or display_name from listTeam. |
| context | object | no | Optional context, e.g. {chapter: 'icp'}. |
| broadcast | boolean | no | If true, sends to ALL team members. Default: false. |
Check for unread notifications (direct messages and broadcasts).
No parameter schema on file.
Search CRM for a company by name. ALWAYS search before creating to avoid duplicates.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| term | string | yes | Company name or keyword to search for. |
| limit | integer | no | Max results. Default: 10. |
Get full company details by ID. Returns name, domain, industry, employees, address, CRM link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Company ID from CRM. |
Create a new company. ALWAYS search first to avoid duplicates.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Company name. |
| address | string | no | Company address. |
Get all deals linked to a company, by company ID. Use after crmSearchCompany or crmGetCompany to review that company's pipeline.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Company ID. |
Get all contacts linked to a company, by company ID. Use to find who to reach at a known company.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Company ID. |
Search 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| term | string | yes | Contact name or keyword. |
| limit | integer | no | Max results. Default: 10. |
List 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| filter | object | no | Filter object. All fields optional. |
List 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| filter | object | no | Filter object. All fields optional. |
Get full contact details by ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Contact ID. |
Create a new contact. ALWAYS pass company_id when the company exists.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Full name. |
| string | no | Email address. | |
| phone | string | no | Phone number. |
| company_id | string | no | Company ID. REQUIRED when company exists. |
Get all pipelines with stages. ALWAYS call before creating deals to get valid stage_id.
No parameter schema on file.
Create a new deal. Requires title + stage_id. MUST call crmGetPipelines first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | yes | Deal title. |
| stage_id | string | yes | Stage ID from crmGetPipelines. |
| value | number | no | Deal value. |
| currency | string | no | Currency code. Default: EUR. |
| company_id | string | no | Company ID. |
| contact_id | string | no | Contact ID. |
Update a deal. Use generic names: company_id, contact_id, expected_close.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Deal ID. |
| stage_id | string | no | Optional new stage ID (from crmGetPipelines). |
| value | number | no | Optional new deal value. |
| title | string | no | Optional new deal title. |
| expected_close | string | no | Expected close date YYYY-MM-DD. |
Get the full record for one deal by ID. Use after a search or list returns a deal id when you need its complete details.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Deal ID. |
Add 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| content | string | yes | Note text — supports HTML. |
| deal_id | string | no | Optional deal ID to attach the note to. |
| company_id | string | no | Optional company ID to attach the note to. |
| contact_id | string | no | Optional contact ID to attach the note to. |
Create 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| subject | string | yes | Activity subject. |
| type | string | no | Activity type. Default: task. |
| deal_id | string | no | Optional deal ID to link the activity to. |
| company_id | string | no | Optional company ID to link the activity to. |
| contact_id | string | no | Optional contact ID to link the activity to. |
| due_date | string | no | Due date YYYY-MM-DD. |
| note | string | no | Optional note/body for the activity. |
Check if CRM is connected and which provider is active.
No parameter schema on file.
Get 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Company domain e.g. seeburger.de |
| name | string | no | Company name (if the domain is unknown), e.g. 'Seeburger AG'. |
| company_name | string | no | DEPRECATED — use name. Accepted as an alias for one more release so cached tool lists keep working; if both are given, name wins. |
| country | string | no | Optional hint for resolving the domain from the name: country name or ISO code, e.g. 'CH'. Only used when domain is absent. |
| industry | string | no | Optional hint for resolving the domain from the name, e.g. 'ERP software'. Only used when domain is absent. |
| campaign_lead_id | string | no | Optional. The id of a lead from listCampaignLeads (that is campaign_leads.id). Pass it whenever you enrich a lead that is already in a campaign: the result is then written back onto that lead. Conta |
Get person profile from email or LinkedIn URL.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| string | no | Person's email address. | |
| linkedin_url | string | no | Full LinkedIn profile URL. |
| linkedin_handle | string | no | LinkedIn handle/slug (without the full URL). |
| campaign_lead_id | string | no | Optional. The id of a lead from listCampaignLeads (that is campaign_leads.id). Pass it whenever you enrich a lead that is already in a campaign: the result is then written back onto that lead. Conta |
Find contacts at a company. Filter by seniority or department.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Company domain to find contacts at. |
| company | string | no | Company name (if domain unknown). |
| seniority | string | no | junior, senior, or executive. |
| department | string | no | sales, marketing, it, etc. |
| limit | integer | no | Max results. Default: 10. |
| campaign_lead_id | string | no | Optional. The id of a lead from listCampaignLeads (that is campaign_leads.id). Pass it whenever you enrich a lead that is already in a campaign: the result is then written back onto that lead. Conta |
Find one person's email by name + domain.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Company domain to search the email at. |
| company | string | no | Company name (if domain unknown). |
| first_name | string | no | Person's first name. |
| last_name | string | no | Person's last name. |
| full_name | string | no | Full name (alternative to first_name + last_name). |
| campaign_lead_id | string | no | Optional. The id of a lead from listCampaignLeads (that is campaign_leads.id). Pass it whenever you enrich a lead that is already in a campaign: the result is then written back onto that lead. Conta |
Check if an email is deliverable. Use before outreach.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| string | yes | Email address to verify for deliverability. |
Find 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| mode | string | no | account = similar to a seed domain (default); icp = match your saved ICP; won_deals = not yet implemented (returns not_implemented). |
| seed | object | no | Seed for mode='account', e.g. { domain: 'intertours.de' }. Leave empty for icp/won_deals. |
| filters | object | no | Optional Hunter Discover filter overrides, passed straight through. Use Hunter's exact sub-shapes — a wrong shape is silently dropped (or 400s). headquarters_location: { include:[{ country:'DE' }], ex |
| score | boolean | no | Re-rank with canonical ICP scoring (calculate-alignment). Default true. similarity_to_seed is always returned regardless of this flag. |
| limit | integer | no | Max candidates to return (hard-capped at 25). Default 25. |
| shortlist_size | integer | no | How many top pre-ranked candidates get fully enriched + scored (default 10). Pre-ranking uses the free discover fields (geo, size, emails_count). Lower = cheaper (fewer enrichment credits); the rest a |
Trigger 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| mode | string | yes | Which leads to score. 'campaign' scores the leads of one campaign and REQUIRES campaign_id — no CRM and no Pro plan needed. The other three target the connected CRM and require Pro: 'full' scores all |
| campaign_id | string | no | UUID of the campaign whose leads to score. REQUIRED when mode='campaign'; ignored in the CRM modes. Get it from listCampaigns. |
| company_ids | array | no | CRM company IDs to score. Required and only used when mode='company_ids'. Max 100 recommended per call. |
Retrieve 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Number of leads to return. Default 10, max 100. |
| min_score | integer | no | Minimum score 0-100 to include. Default 60. |
| filters | object | no | Optional result filters. |
Compose 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| mode | string | yes | Default: 'draft'. Use 'send' only on explicit user confirmation. |
| provider | string | no | Default: 'auto'. Backend resolves from user's active integration. |
| to | string | yes | Recipient email address. |
| subject | string | yes | Email subject line. |
| body_html | string | no | HTML email body with <p>, <br>, <strong>, <a href> tags as needed. For send mode, an open-tracking pixel is auto-injected. |
| body_text | string | no | Optional plain-text fallback. If only one of body_html/body_text is provided, the other is auto-generated. |
| from | string | no | Optional From address override. Must be an address the user has authorized. |
| thread_id | string | no | Optional Gmail thread ID for replies in-thread. |
| in_reply_to | string | no | Optional Message-ID of the message being replied to. |
| crm_deal_id | string | no | Optional CRM deal UUID if this email relates to a specific deal. |
Create 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Short campaign label, 3-200 chars. Include strategic axis (e.g. 'Q2-DACH-Maschinenbau-EU-AI-Act'). |
| description | string | no | Optional free-text summary of the campaign. |
| product_snapshot | object | no | Frozen product info at creation time. Schema: { name, description, value_props[], differentiators[], pricing_hint }. |
| icp_snapshot | object | yes | Frozen ICP at creation time. May be a NARROWED variant of the user's global ICP. |
| persona_snapshot | object | yes | Frozen target persona for this campaign. |
| offer | string | yes | The concrete CTA, NOT the product name. E.g. 'Free 30-day pilot', not 'Buy GrowthKit'. |
| pain_hypothesis | string | yes | ONE sentence stating the specific pain this campaign assumes the persona has. |
| messaging_angle | string | yes | The hook in the first email/message. The news/trend/insight that earns the read. |
| channels | array | yes | Outreach channels for this campaign: email | linkedin | event | paid | cold_call | referral | webinar. |
| start_date | string | yes | ISO date YYYY-MM-DD. |
| end_date | string | no | Optional ISO date YYYY-MM-DD. Null = open-ended. |
| success_metric | object | yes | { type: 'replies'|'demos'|'sqls'|'pipeline_eur', target: number } |
| briefing_source | string | no | Default 'wizard'. |
| source_document_id | string | no | Optional documents.id if briefing was parsed from upload. |
| notes | string | no | Optional internal notes about the campaign. |
List campaigns for the current user, optionally filtered by status. Returns campaign metadata plus per-stage lead counts.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| status | string | no | Optional: filter by status: draft | active | paused | completed | archived. |
| limit | integer | no | Default 25, max 100. |
Get a single campaign with full briefing details and lead-stage counts.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | string | yes | ID of the campaign (from listCampaigns). |
Update 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | string | yes | ID of the campaign to update (from listCampaigns). |
| scoring | object/null | no | Lead-scoring profile for THIS campaign, merged into icp_snapshot.scoring (the rest of icp_snapshot is left alone). Fill it only from what the user told you — never from general knowledge or another ca |
| name | string | no | Short campaign label, 3-200 chars. |
| offer | string | no | The concrete CTA, NOT the product name. E.g. 'Free 30-day pilot'. |
| pain_hypothesis | string | no | ONE sentence stating the specific pain this campaign assumes the persona has. |
| messaging_angle | string | no | The hook in the first email/message — the news/trend/insight that earns the read. |
| channels | array | no | Outreach channels for this campaign. |
| start_date | string | no | ISO date YYYY-MM-DD. |
| end_date | string | no | Optional ISO date YYYY-MM-DD. Null = open-ended. |
| success_metric | object | no | { type: 'replies'|'demos'|'sqls'|'pipeline_eur', target: number } |
| status | string | no | Campaign status: draft | active | paused | completed | archived. |
| fit_gate_min_score | integer/null | no | Fit-gate threshold on score_fit for THIS campaign, 0 to 100. Default is 60 when unset — only change it when the user asks. Lower it when a documented signal decides suitability rather than the score: |
| icp_snapshot | object | no | Frozen ICP for this campaign. May be a narrowed variant of the global ICP. |
| persona_snapshot | object | no | Frozen target persona for this campaign. |
| product_snapshot | object | no | Frozen product info. Schema: { name, description, value_props[], differentiators[], pricing_hint }. |
| notes | string | no | Optional internal notes about the campaign. |
Add 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | string | yes | ID of the campaign (from listCampaigns). |
| source | string | no | Default 'mcp'. |
| leads | array | yes | Array of lead objects. Standard fields go to columns; unknown keys go to metadata jsonb. Max 100 per call. |
Discover 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | string | yes | ID of the campaign (from listCampaigns). |
Update 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| lead_id | string | yes | UUID of the campaign_lead to update |
| updates | object | yes | Object with fields to change. metadata is shallow-merged. |
List 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | string | yes | ID of the campaign (from listCampaigns). |
| lifecycle_stage | string | no | Optional: filter by lifecycle stage. |
| enrichment_status | string | no | Optional: filter by enrichment status. |
| limit | integer | no | Default 50, max 100. |
| fields | string | no | compact for lists and ranking; full when you need contacts or the enrichment trail across the list. For a single lead prefer getCampaignLead. Default compact. |
One 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_lead_id | string | yes | The id of a row from listCampaignLeads (campaign_leads.id). |
Show 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | string | yes | ID of the campaign (from listCampaigns). |
Run 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | string | yes | ID of the campaign (from listCampaigns). |
| stage | string | yes | resolve = find domain and firmographics. score = ICP fit. signals = why-now scan. reveal = persona, email and optionally phone (SPENDS CREDITS). rescore = second pass once seniority is known. rerank = |
| limit | integer | no | How many candidates to process. Default 10, max 25. |
| min_score | integer | no | Fit threshold for signals and reveal. Default 60. |
| require_signal | boolean | no | reveal only: require an active why-now signal. Default true. Setting this to false widens who gets contacted — ask the user before you do it. |
| with_phone | boolean | no | reveal only: also reveal a mobile number. Default false. A phone costs 10 credits per lead on top of the 3 for the email. |
| lead_ids | array | no | Optional: run only on these leads instead of letting the stage choose. Use it when the user names specific companies, for a first careful run on one lead, or to pick up after an aborted run. These are |
| dry_run | boolean | no | true = report candidates and estimated_credits, change nothing. Always do this first. |
| lang | string | no | Language for the signal sentences written by the signals stage. Default de. Other stages ignore it. |
| confirm_credits | integer | no | Required for a paid stage when dry_run is false — reveal and resolve: the exact estimated_credits from the dry run. A mismatch is refused with 409 and a fresh number — the candidate set changed, so sh |
List 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| lead_id | string | no | UUID of the LEAD (leads.id), e.g. from pipelineStatus top_10. Either this, campaign_lead_id or campaign_id. Mixing the two lead UUIDs up is no longer a trap: whichever you pass is resolved to the righ |
| campaign_lead_id | string | no | UUID of the CAMPAIGN MEMBERSHIP (campaign_leads.id) — the id from listCampaignLeads or from the pipelineRun candidate list. Resolves to the same signals as lead_id. |
| lang | string | no | Language of the cite line. Default de. |
| campaign_id | string | no | All signals of a campaign (from listCampaigns). Either this or one of the lead UUIDs. |
| active_only | boolean | no | Only signals inside their TTL. Default true — an expired signal is not a reason to call. |
| limit | integer | no | Default 50, max 200. |
Correct 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| signal_id | string | yes | UUID of the signal — the id field of a signal in listLeadSignals. |
| updates | object | yes | Only the fields to change. At least one of them. |
Permanently 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| signal_id | string | yes | UUID of the signal — the id field of a signal in listLeadSignals. |
Render 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | string | no | Optional campaign UUID (from listCampaigns). Omit to aggregate callable leads across all campaigns. |
| limit | integer | no | Max leads to render. Default 50, max 100. |
APP-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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_lead_id | string | yes | ID of the campaign lead to call (campaign_lead_id from show_callable_leads' structuredContent). |
APP-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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| call_log_id | string | yes | call_log_id returned by place_call in its structuredContent. |
| disposition | string | no | Optional call disposition. |
| notes | string | no | Optional free-text note about the call. |
| next_action | object | no | Optional follow-up reminder (typically for a callback disposition). |
Store 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session_id | string | yes | The current chat session_id. REQUIRED. Comes from the conversation context. |
| kind | string | yes | wizard = multi-turn field collection. working_set = ephemeral suggestion lists with TTL. pinned_entity = durable context across turns. |
| key | string | yes | Logical identifier within a kind. Examples: 'campaign_briefing', 'lead_candidates', 'active_campaign'. Use snake_case. |
| state | object | yes | The full state object to store. Replaces any previous state for this (kind, key). Schema is free-form but conventions: wizard = { fields, required, collected, current_step }; working_set = { items, co |
| ttl_turns | integer | no | Optional TTL in user-turns. After this many turns, the record auto-expires. NULL/omit = permanent (typical for wizard and pinned_entity). Use 5 for working_set / suggestion lists. |
| status | string | no | Default 'active'. Set to 'completed' when a wizard finishes successfully (triggers completed_at timestamp). |
Retrieve 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session_id | string | yes | The current chat session_id. REQUIRED. |
| kind | string | yes | Which kind of state to retrieve: wizard | working_set | pinned_entity. |
| key | string | yes | Logical identifier within the kind (same key used in setWorkingMemory). |
Create 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | yes | Short task title. |
| detail | string | no | Optional longer description of the task. |
| owner | string | no | Assignee (free text) |
| bucket | string | no | Time horizon: now | next | later | follow-up. |
| impact | integer | no | ICE impact, 1-10 (higher = more impact). |
| confidence | number | no | ICE confidence, 0-1 (probability the impact materializes). |
| effort_constraint | integer | no | Effort on the bottleneck lane (see workspace label_constraint) |
| effort_nonconstraint | integer | no | Effort on the non-bottleneck lane |
| related_memory_id | string | no | Optional ID of a related memory to link. |
| steps | array | no | Optional checklist of sub-steps. |
List tasks in the workspace, ranked by ICE (highest first). Optional filters.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| status | string | no | Optional: filter by status: open | in_progress | done | dropped. |
| bucket | string | no | Optional: filter by bucket: now | next | later | follow-up. |
| owner | string | no | Optional: filter by assignee. |
| limit | integer | no | Max results. Default: 50. |
Return 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max tasks to return. Default: 20. |
Update fields of a task. Partial update; status='done' sets done_at automatically. ice_score recomputes when impact/confidence/effort change.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | ID of the task to update (from listTasks). |
| title | string | no | Optional new task title. |
| status | string | no | New status: open | in_progress | done | dropped. |
| bucket | string | no | Time horizon: now | next | later | follow-up. |
| impact | integer | no | ICE impact, 1-10 (higher = more impact). |
| confidence | number | no | ICE confidence, 0-1 (probability the impact materializes). |
| effort_constraint | integer | no | Effort on the bottleneck lane (see workspace label_constraint). |
| effort_nonconstraint | integer | no | Effort on the non-bottleneck lane. |
| owner | string | no | Assignee (free text). |
| detail | string | no | Optional longer description of the task. |
| steps | array | no | Replace the task's checklist. Omit to leave unchanged. |
Set the workspace effort weights (constraint vs non-constraint lane) and optional display labels. Re-stamps open tasks so their ICE re-ranks.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| w_constraint | number | yes | Weight for the constraint (bottleneck) effort lane in the ICE score. |
| w_nonconstraint | number | yes | Weight for the non-constraint effort lane in the ICE score. |
| label_constraint | string | no | Optional display label for the constraint lane (e.g. 'Engineering'). |
| label_nonconstraint | string | no | Optional display label for the non-constraint lane (e.g. 'Design'). |
Check 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Task UUID. |
| step_id | string | yes | ID of the step to toggle (from the task's steps). |
| done | boolean | no | Omit to flip the current state. |
Read 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Optional. Domain SLUG, not the bare hostname — dots become hyphens, e.g. 'growthkit-tools' or 'growthkit-consulting'. Omit to return all domains. An unknown slug yields an empty result, not an error. |
| weeks | integer | no | Optional. Number of most recent weeks. Default 12. |
Read 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Optional. Domain SLUG, not the bare hostname — dots become hyphens, e.g. 'growthkit-tools' or 'growthkit-consulting'. Omit to return all domains. An unknown slug yields an empty result, not an error. |
| weeks | integer | no | Optional. Number of most recent weeks. Default 12. |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install GrowthKit Revenue Intelligence or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither: the repository linked on this page is where this record was collected from, not a copy of what the address serves, so it is not graded in its place. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.12.2.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish GrowthKit Revenue Intelligence can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.