Model Context Protocol (MCP) server for Apollo.io API integration
Gtm Suite 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
MCP server for the full Mamba Labs GTM Suite. Exposes all eleven account-intelligence actors as tools in one server via Apify: identity resolution, firmographics, social presence, hiring signals, tech stack, job board scanner, funding and press, change fe
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --env 'APIFY_TOKEN=${APIFY_TOKEN}' --transport stdio gtm-suite-mcp '--' npx -y @mambalabsdev/mcp-gtm-suite
# 2 — ask your agent for something these tools do
# scan_gtm_hiring_signals, detect_gtm_tech_stack, aggregate_gtm_signals and 18 more
It needs APIFY_TOKEN: this reads it from your environment, so export it first.
Gtm Suite costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Gtm Suite as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Node.js — the current LTS (24) is the safe choice; npx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. Claude Code reads APIFY_TOKEN (Apify API token from https://console.apify.com/account/integrations) from your environment each time it starts the server, so the value stays out of its config: export it in your shell profile (macOS, Linux), or run setx APIFY_TOKEN … and open a new terminal (Windows). The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user --env 'APIFY_TOKEN=${APIFY_TOKEN}' --transport stdio gtm-suite-mcp '--' npx -y @mambalabsdev/mcp-gtm-suiteReconnect, or start a new session, and the tools appear in the model’s tool list.
It reaches a system of yours, so it needs your own credential rather than the publisher’s: APIFY_TOKEN — Apify API token from https://console.apify.com/account/integrations. You set it in your own client’s config, on your machine — this marketplace never holds it.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
21 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.
Scan company career pages to detect GTM hiring activity. Returns sales, marketing, and revenue operations job postings across Greenhouse, Lever, and Ashby as a flat, Clay-ready JSON row. Use this for a go-to-market hiring verdict (is the company building its sales and marketing team, and how…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | Bare company domain, e.g. stripe.com |
| role_filter | array | no | Optional list of GTM role keywords to filter on. Defaults to the built-in list. |
| ats_slug | string | no | Optional ATS board slug override when it differs from the domain. |
| mode | string | no | Processing mode. "single" scores the domain. "velocity" compares this run against previous_gtm_role_count and previous_run_date. "batch" is an actor-level mode this single-call tool supplies no list f |
| include_role_details | boolean | no | When true, include the full per-role detail array (title, department, location, url). Default: false. |
| previous_gtm_role_count | integer | no | GTM role count from the previous run for this domain, used in velocity mode to compute the delta. |
| previous_run_date | string | no | ISO date of the previous run for this domain, used in velocity mode to report days between runs. |
Detect which GTM tools a company uses from its public website. Returns CRM, sequencer, and marketing automation signals with per-tool boolean flags as a flat, Clay-ready JSON row. Read-only; requires an APIFY_TOKEN and consumes Apify credits per call.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Bare company domain, e.g. stripe.com. Supply this, company_domain or url. |
| company_domain | string | no | Deprecated alias for domain, accepted by the actor for older callers. Prefer domain. |
| url | string | no | Deprecated alias for domain, accepted by the actor as a full company website URL. Prefer domain. |
| crawl_additional_pages | boolean | no | Crawl up to 2 extra pages for better coverage. Defaults to true when omitted. |
| skipCache | boolean | no | By default a clean detection is cached for 7 days and reused. Set true to force a fresh detection. |
| technologies | array | no | Report only these tools. Omit to report every detectable tool. Only tools with a client side fingerprint are selectable. Detection is unchanged, so filtering costs nothing extra. |
Aggregate a company's GTM signals into one composite score. Runs hiring and tech-stack detection by default, plus funding, events, or workplace when named in sources, in one call and returns a composite score, recommended action, and optional summary as a flat, Clay-ready JSON row. Read-only;…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| company_domain | string | yes | Bare company domain, e.g. stripe.com |
| include_summary | boolean | no | Include a plain-English gtm_signal_summary. |
| explain_mode | boolean | no | If true, the summary becomes a longer, more detailed explanation. |
| sources | array | no | Which signals to aggregate. Defaults to hiring and tech_stack. Each extra source adds one sub actor run to the bill and one dimension to the composite score, which is normalized over the sources selec |
Scan a company's job board for roles in chosen categories across Greenhouse, Lever, Ashby, Workday, and Rippling. Returns matched role counts and titles per category as a flat, Clay-ready JSON row. Use this when you choose the role categories or keywords (engineering, finance, a product name in a…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| company_domain | string | yes | Bare company domain, e.g. stripe.com |
| role_categories | array | yes | One or more of: GTM, Engineering, Finance, Operations, Executive, Custom. |
| custom_keywords | array | no | Keyword strings to match when Custom is included in role_categories. |
| enable_fallback | boolean | no | Fall back to a pre-indexed job database when the live ATS cascade finds nothing. |
| previous_roles_detected | string | no | Comma-separated matched role titles from a previous run, to compute deltas. |
| previous_run_date | string | no | ISO date of the previous run, e.g. 2026-03-15. |
Resolve a company domain or name to its LinkedIn company URL, with a 0-100 confidence_score, social links, and optional firmographics from search snippets, as a flat, Clay-ready JSON row. A URL is returned only when verified: the company homepage links it, or its name is identical to the name the…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| company_domain | string | no | Bare company domain, e.g. stripe.com. Required if company_name is not provided. |
| company_name | string | no | Company name. Required if company_domain is not provided. |
| includeFirmographics | string | no | When "true", also reads employee count, industry, HQ, follower count and description from search result snippets about the LinkedIn company page. No request is sent to LinkedIn. Fields no snippet stat |
| skipCache | string | no | When "false", the default, a successful resolution is cached for 7 days and reused. Set "true" to force a fresh resolution. Sent as a string for Clay compatibility. |
| minConfidenceScore | string | no | A LinkedIn page is returned only when its match score is at least this value, 0 to 100. Default "70". Raise it for fewer, surer answers; lower it for more answers and more wrong ones. Sent as a string |
Score a company against your ideal customer profile (ICP) using weighted signals. Returns a 0 to 100 icp_score, an A to D icp_tier, and a per-signal breakdown as a flat, Clay-ready JSON row. Define your ICP with a template, scoring_config, or plain-English icp_description (which requires…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| company_domain | string | yes | The primary domain of the company to score, e.g. clay.com |
| company_name | string | no | Optional display name of the company. |
| template | string | no | Name of a prebuilt scoring config. |
| scoring_config | object | no | JSON object of scoring weights. |
| icp_description | string | no | Plain-English ICP description. Requires llm_api_key. |
| llm_api_key | string | no | Your OpenAI or Anthropic key, used only with icp_description. |
| llm_provider | string | no | LLM provider for icp_description: openai or anthropic. |
| fetch_signals | boolean | no | If true, the actor runs the GTM Hiring Signal Scraper and the GTM Tech Stack Signal Scraper for this company before scoring and fills any hiring or tech stack signal not supplied. Both bill your Apify |
| include_explanation | boolean | no | If true, adds a score_explanation string to the output. |
| tier_thresholds | object | no | Optional. Minimum score for each tier as { "tier_a": number, "tier_b": number, "tier_c": number }. Scores at or above tier_a are A, tier_b are B, tier_c are C, else D. Defaults to 80 / 60 / 40. |
| funded_within_days | integer | no | Optional. How recent a funding round must be to count for the recently_funded signal, in days. Defaults to 540 (18 months). |
| min_score_to_output | integer | no | If set, rows scoring below this threshold are skipped from output (not pushed to dataset). Skipped rows are logged only. |
| previous_score | integer | no | Previous ICP score for this company. If provided, output includes score_change and score_trend fields. |
| gtm_hiring_signal | string | no | Whether the company is actively hiring for GTM/sales roles. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime. |
| gtm_role_count | string | no | Number of open GTM/sales roles. Scores via the gtm_role_count_strong signal when at or above min_gtm_roles (default 2). Accepts a numeric string (e.g. "8"). Sent as a string for Clay compatibility and |
| uses_hubspot | string | no | Whether the company uses HubSpot. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime. |
| uses_salesforce | string | no | Whether the company uses Salesforce. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime. |
| uses_clay | string | no | Whether the company uses Clay. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime. |
| crm_detected | string | no | Whether any CRM was detected. Accepts a boolean-like string ("true"/"false") or any non-empty CRM name (e.g. "Salesforce"). Sent as a string for Clay compatibility and coerced to boolean at runtime. A |
| seq_tool_detected | string | no | Whether a sales sequencing tool (Outreach, SalesLoft, Apollo, Lemlist) was detected. Accepts a boolean-like string ("true"/"false") or any non-empty tool name (e.g. "Outreach"). Sent as a string for C |
Resolve any combination of company name, domain, or LinkedIn URL into one canonical company identity: the name, primary domain, and LinkedIn company URL, each with a 0-100 confidence score plus an overall score and a match method. Cross-checks the inputs you give it, resolves the ones you do not,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| company_name | string | no | Company name, e.g. Stripe. Provide at least one of company_name, domain, or linkedin_url. |
| domain | string | no | Bare company domain, e.g. stripe.com. The strongest canonical key when provided. |
| linkedin_url | string | no | LinkedIn company URL (https://www.linkedin.com/company/stripe) or bare slug (stripe). |
| skipCache | boolean | no | Force a fresh resolution and ignore the 7 day result cache. |
| minLinkedinConfidence | string | no | A LinkedIn page the actor finds is returned only when its linkedin_confidence is at least this value, 0 to 100. Default "70". A LinkedIn URL you provide is always returned as given. Sent as a string f |
Enrich a company domain into structured firmographics: employee band, industry, HQ, founded year, revenue estimate, logo, and description, with source provenance. Parsed from the company's schema.org/Organization JSON-LD and HTML meta tags and returned as a flat, Clay-ready JSON row with a…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Bare company domain to enrich, e.g. stripe.com. Provide this or domains. |
| company_name | string | no | Optional company name, used as a fallback label when the page does not expose one. |
| domains | array | no | List of bare domains for batch processing. Takes precedence over domain. |
| batchSize | number | no | Domains enriched concurrently per wave in batch mode. Default 5, maximum 10. |
| skipCache | boolean | no | Force a fresh enrichment and ignore the 7 day result cache. |
Map a company's social media presence across LinkedIn, X, Instagram, Facebook, and YouTube. Returns profile URLs and follower counts in flat Clay-ready JSON. Profiles are discovered from the company's own homepage links, a web search fallback, and pattern guessing, then validated against the…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| company_domain | string | no | Bare company domain, e.g. stripe.com. Provide this or company_name. |
| company_name | string | no | Optional company name. Improves search accuracy and disambiguation. Provide this or company_domain. |
| platforms | array | no | Which platforms to map. Defaults to all five. |
| includeFollowerCounts | boolean | no | Fetch profile pages to extract follower counts (default true). Set false for URLs only, which is cheaper. |
| skipCache | boolean | no | Force a fresh lookup and ignore the 7 day result cache. |
Scan Google News and PR wires for funding rounds, executive moves, product launches, and acquisitions at any company domain. Returns deduplicated, dated events in flat Clay-ready JSON. Read-only; requires an APIFY_TOKEN and consumes Apify credits per call.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | Company domain to scan, without https or www, e.g. stripe.com. |
| company_name | string | no | Optional company name hint, used when the domain does not match the brand name, e.g. Deel for deel.com. |
| signal_types | array | no | Report only these event types. Omit for every type. Narrowing also narrows the search: a funding only run issues one news query instead of four. |
| lookback_days | integer | no | How far back to search, in days. Default 365. |
Monitor a company domain for changes across hiring, tech stack, funding, firmographics, and social since the last run. Returns only what changed as typed change events in flat, Clay-ready JSON. Pass sources to watch fewer than all five sources and min_severity to drop minor changes; each source…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | Company domain to monitor, without https or www, e.g. stripe.com. |
| company_name | string | no | Optional company name hint, used when the domain does not match the brand name, e.g. Deel for deel.com. |
| previous_snapshot | object | no | Snapshot object returned by a prior run. Supply it and it is the baseline instead of stored state, which is what makes a scheduled run cheap. |
| sub_actor_timeout_secs | integer | no | Per-child run timeout in seconds. Children run in parallel, so total wall time is about the slowest child. Default: 90. |
| sources | array | no | Which sources to monitor. Omit for all five. Each source left out is one fewer sub actor run per company, so a single source watch is billed for one source, not five. |
| min_severity | string | no | Report only changes at or above this severity. low reports every change and is the default. high keeps leadership moves, funding, acquisitions, and a CRM or sequencer appearing or disappearing. |
Given a company domain, determine how far that company has gone with AI. Returns an ai_maturity tier of none, declared (says AI but nothing observable is running), deployed (AI tooling is live on the site), or commercialized (the pricing page charges for AI via credits, tokens, an add-on, an…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Company domain to analyze, without https or www, e.g. intercom.com. |
| domains | array | no | Batch mode: several company domains analyzed in one call. Takes precedence over domain. |
| check_pricing | boolean | no | Fetch and score the pricing page. Default true. Setting this false is faster but caps the result at 'deployed', because 'commercialized' can only be proven on a pricing page. |
| skipCache | boolean | no | Force a fresh analysis and ignore the 7 day result cache. |
| request_timeout_ms | integer | no | Per-request timeout in milliseconds. 3000 to 20000. Default: 9000. |
| vendors | array | no | Report only these AI vendors. Omit to report every one. Detection is unchanged, so filtering costs nothing extra. The ai_maturity verdict, llms.txt, robots.txt, and pricing reads are site wide and nev |
Given a company domain, determine whether that company runs cold email outbound and on what stack. Returns a runs_outbound verdict of program (a deliberate cold outbound setup), light (one weak signal), none, or unknown, with the evidence behind it. The strongest signal is the lookalike sending…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Company domain to analyze, without https or www, e.g. smartlead.ai. |
| domains | array | no | Batch mode: several company domains analyzed in one call. Takes precedence over domain. |
| scan_sending_domains | boolean | no | Scan for lookalike sending domains. Default true. The strongest signal and the slowest step; turning it off caps the verdict at what platform and deliverability signals alone can prove. |
| sending_domain_depth | string | no | deep (default) checks .com, .co, .io, .net and .org. standard drops .net and .org. |
| check_deliverability | boolean | no | Add a blacklist check and a 0-100 health score by running the separate Domain Deliverability Checker actor, which bills its own per-domain rate on top of this one. Default false. SPF, DKIM and DMARC a |
| skipCache | boolean | no | Force a fresh analysis and ignore the 7 day result cache. |
| max_sending_domain_probes | integer | no | Cap on how many candidate sending domains are probed per company. Lower it to bound run time on companies with many lookalike domains. |
| request_timeout_ms | integer | no | Per-HTTP-request timeout in milliseconds. |
| dns_timeout_ms | integer | no | Per-DNS-lookup timeout in milliseconds. |
Given a company domain, measure how much long-form work that company publishes and whether the rate is rising or falling. Returns post counts for the last 30 days, 90 days and 12 months, a monthly average, and a cadence_trend of accelerating, steady, declining, dormant or unknown, with the percent…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Company domain to analyze, without https or www, e.g. zapier.com. |
| domains | array | no | Batch mode: several company domains analyzed in one call. Takes precedence over domain. |
| max_pages_to_date | integer | no | How many post pages to fetch per domain for dating. Default 400. Above this cap the counts are estimated from an even sample and counts_are_estimate is set true. |
| domain_time_budget_ms | integer | no | Hard wall-clock ceiling per domain, default 75000. When nearly spent the crawl stops and the row is returned with partial_result true rather than timing out. |
| skipCache | boolean | no | Force a fresh crawl and ignore the 3 day result cache. |
| page_concurrency | integer | no | How many pages are fetched concurrently within one domain. |
| max_sitemap_fetches | integer | no | Cap on how many sitemap files are fetched per domain. Lower it to bound run time on deeply nested sitemap indexes. |
| request_timeout_ms | integer | no | Per-HTTP-request timeout in milliseconds. |
Push enriched lead rows into an existing Instantly or Smartlead campaign. Maps common Clay column names onto each sequencer's own field names, optionally drops leads below a minimum ICP score, optionally deduplicates against the leads already in the destination campaign, and sends the rest in…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| sequencer | string | yes | Which sequencer to push to. Instantly uses API v2, Smartlead uses API v1. |
| api_key | string | no | Your Instantly v2 API key or your Smartlead API key. An Instantly v1 key will not work: v1 was deprecated on January 19, 2026. Required for any run that calls the sequencer. A dry run with deduplicate |
| campaign_id | string | yes | The target campaign in the sequencer. It must already exist. Instantly campaign IDs are UUIDs; Smartlead campaign IDs are numeric. |
| leads | array | no | Lead rows to push. Each row needs an email at minimum. Takes precedence over dataset_id when both are set. |
| dataset_id | string | no | An Apify dataset ID from an upstream run, for example the output of score_icp_fit. Used only when leads is empty. |
| min_icp_score | integer | no | Drop leads whose icp_score is below this number. Default 0, which pushes everything. Rows with no icp_score are always kept. |
| deduplicate | boolean | no | Read the campaign's existing leads first and drop any email already there. Default true. This is a read, so it needs an API key even on a dry run. |
| dry_run | boolean | no | Run every step, return the exact payload that would be sent, and make zero write calls. Creates no leads and charges nothing. Default false. |
| field_mapping | object | no | Override the default Clay column to sequencer field map. Keys are your column names, values are the sequencer field names. Set a value to an empty string to drop that column. A target the sequencer do |
| custom_variables | array | no | Extra column names to pass through as custom variables under their own name. Columns that are neither mapped nor listed here are dropped. |
Give it a domain and it returns whether an AI agent can read that site, and what the site's policy says, as one flat row of 42 fields across five families: the llms.txt family including llms-full.txt and ai.txt, robots.txt AI crawler policy including the newer Content Signal directives, structured…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | One company domain, for example vercel.com. Protocol and path are stripped. |
| check_endpoints | boolean | no | Probes sitemap, OpenAPI, well known files and feeds. Adds 7 concurrent requests. Default: true. |
| check_structured_data | boolean | no | Parses JSON-LD, microdata, Open Graph and canonical off the homepage. Costs no extra requests. Default: true. |
| skipCache | string | no | Leave as false to use the 7 day cache. Set to true to re-audit the domain from scratch. Default: "false". |
| checks | array | no | Run only these checks. Omit for all of them. Narrowing narrows the work, and the score is rescaled over the checks selected. |
One contact in, one classified row out. Give it a job title and it returns the department, the seniority level, a seniority_rank from 1 to 12 you can filter with a comparison, and classification_rule, the named rule that fired, so every decision is auditable. The classification is a deterministic…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_title | string | yes | The contact's job title, exactly as you hold it. Classified by deterministic rules with no API key needed. |
| full_name | string | no | Only needed for position verification. Classification works without it. This name is never sent to any language model. |
| company_domain | string | no | Only needed for position verification. The company's website domain, with or without https. |
| verify_position | boolean | no | Check whether the person is still listed on their employer's own website. Off by default. Adds roughly 3 seconds and 9 requests per contact, and needs both the name and the domain. Default: false. |
| use_llm_fallback | boolean | no | Off by default. When on, titles the rules cannot place are sent to your own model using the LLM_API_KEY secret environment variable you set on your copy of this Actor. Only the title is sent, never th |
| llm_provider | string | no | Which provider your LLM_API_KEY belongs to. Only read when the LLM fallback is on. Default: "openai". |
| llm_model | string | no | Model id passed straight through to the provider. Only read when the LLM fallback is on. Default: "gpt-4o-mini". |
| skipCache | string | no | Set to true to ignore cached results and classify from scratch. Default: "false". |
Give it a company domain. It returns the third party conferences and trade shows that company publicly says it attends, with a year for each where one can be resolved, as one flat row. The search runs against the company's own domain, which is what stops a brand collision returning another…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | A single company domain, for example 6sense.com. Protocol and path are stripped. |
| company_name | string | no | Improves matching when the brand differs from the domain stem, for example Gong for gong.io. Derived from the domain when left empty. |
| years | string | no | Comma separated, for example 2025,2026. Events dated outside this set are still returned and flagged. Sent as a string so it works from Clay. Default: "2025,2026". |
| include_own_events | boolean | no | Reports whether the company runs its own conference as a separate field. It is never mixed into the attendance list. Default: true. |
| max_queries | string | no | Between 1 and 5. Each query costs roughly 0.8 seconds plus a 1.3 second pause. 2 is the measured sweet spot: search engines refuse a third query from the same container almost every time, and the thir |
| skipCache | string | no | false uses the 21 day result cache. true forces a fresh look. Default: "false". |
Give it a company domain and it returns the registered legal entity behind it: legal name, company number, jurisdiction, status, entity type, LEI and VAT number, as one flat row with a full audit trail of what was rejected and why. Three registers are queried: UK Companies House, GLEIF and SEC…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | A single company domain, for example monzo.com. Protocol and path are stripped. |
| legal_name_hint | string | no | Skips the domain lookup and goes straight to the registers with this name. Use it when you already have the legal name and just want the register record. |
| jurisdiction_hint | string | no | ISO-2 country code, for example GB or US. Narrows which registers are queried and cuts latency. Leave empty to query every register. |
| match_strictness | string | no | exact accepts a register record only when the normalized legal names are equal, which is the default and the recommendation. fuzzy returns the best scoring candidate with a confidence below 100 and a |
| validate_vat | boolean | no | Runs any VAT number found on the company's own pages through the EU VIES service and returns the name VIES holds for it, as a cross-check against the register name. Default: true. |
| skipCache | string | no | false uses the cache: 90 days for a resolved company, 7 days for a null. true forces a fresh look. Default: "false". |
Pick a public award register and a time window and it returns the companies that won public work in it, one flat row per winning company rather than one per award, with award count, total value, largest award, awarding body, award date, a deep link to the source record, and a resolved company…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| register | string | yes | Which award register to read. US federal contracts and grants come from USASpending, NIH SBIR and STTR from NIH RePORTER, and the two UK registers from Contracts Finder and Find a Tender. Default: "us |
| window_days | string | no | How many days back from today to read awards for. 1 to 90. US federal data lags about two days, so do not use a one day window on the US registers. Sent as a string so it works from Clay. Default: "7" |
| min_award_value | string | no | Drops awards below this amount in the register's own currency. Set to 0 to keep everything. Sent as a string so it works from Clay. Default: "100000". |
| max_entities | string | no | Hard cap on billed rows. 1 to 1000. Winners are sorted by total award value, and the run log says how many were dropped. Sent as a string so it works from Clay. Default: "100". |
| exclude_government_recipients | boolean | no | Drops winners that are themselves government, universities, or public authorities. Leave this on for the grant registers or you get state departments of education instead of companies. Default: true. |
| resolve_domains | boolean | no | Looks up each winner's website. Turning it off makes the run roughly 20x faster and returns recipient_domain as null with domain_status not_attempted. Default: true. |
| domain_confidence_floor | string | no | How sure the actor has to be before it gives you a domain. Strict returns fewer domains and almost no wrong ones. Loose returns the most domains and about a third of them are wrong. Default: "standard |
Point it at LinkedIn person profiles or company pages and it returns the posts a search engine has indexed for each one, as flat rows: permalink, author, a text excerpt, and the publish date decoded from the post id. No request is sent to LinkedIn and no cookie or account is used. A result counts…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| profile_urls | array | no | LinkedIn person profile URLs, for example https://www.linkedin.com/in/williamhgates. Country subdomains such as uk.linkedin.com are fine. Supply this, company_urls, or both. |
| company_urls | array | no | LinkedIn company page URLs, for example https://www.linkedin.com/company/microsoft. Supply this, profile_urls, or both. |
| posted_since | string | no | ISO date or timestamp, for example 2026-08-01. Posts published before this are skipped BEFORE anything is charged. Leave empty to take everything the index holds. |
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- 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 Gtm Suite 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.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| verification-discount | repo | publisher verification (public source) — no provenance, but the source is public and inspectable | −1 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (21 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| scan_gtm_hiring_signals | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| detect_gtm_tech_stack | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| aggregate_gtm_signals | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| scan_job_board_keywords | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| resolve_linkedin_url | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| score_icp_fit | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| resolve_company_identity | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| enrich_company_firmographics | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| map_company_social_presence | untrusted-inputexternal-sink | untrusted-input: keyword "web_search", declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| get_funding_press_signals | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| get_company_changes | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| detect_ai_tooling | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| fingerprint_outbound_infrastructure | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| track_publication_cadence | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| push_leads_to_sequencer | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true, handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| audit_agent_accessibility | untrusted-inputexternal-sink | untrusted-input: keyword "fetch", declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| classify_contact | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| map_company_event_presence | untrusted-inputexternal-sink | untrusted-input: keyword "fetch", declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| resolve_legal_entity | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| monitor_public_awards | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
| capture_linkedin_posts_and_commenters | untrusted-inputexternal-sink | untrusted-input: declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(https://api.apify.com/v2/acts/${actorPath}/runs?timeout=${ACTOR_RUN_TIMEOUT_SECS}) at build/index.js:104 |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 1.12.0. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
- The version this listing was on when mcprush began following its releases. The registry was not asked when it shipped, so this row carries no date.
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 Gtm Suite 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.