Marketing Analytics MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_AUTH_TOKEN | No | Bearer token for remote authentication (optional for local stdio). |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| gsc_search_analyticsA | Get Google Search Console search analytics data. Args: dimensions: Comma-separated dimensions (query, page, date, device, country). Default: "query" start_date: Start date YYYY-MM-DD (default: 31 days ago) end_date: End date YYYY-MM-DD (default: 3 days ago, due to GSC data lag) row_limit: Max rows to return (default: 500) country: 3-letter country code filter (e.g. usa, gbr, can). Empty for global. |
| gsc_totalsB | Get aggregate Google Search Console totals (clicks, impressions, CTR, position). Args: start_date: Start date YYYY-MM-DD (default: 31 days ago) end_date: End date YYYY-MM-DD (default: 3 days ago) country: 3-letter country code filter (e.g. usa, gbr, can). Empty for global. |
| gsc_compare_periodsA | Compare two date periods in Google Search Console side-by-side. Args: period1_start: First period start YYYY-MM-DD period1_end: First period end YYYY-MM-DD period2_start: Second period start YYYY-MM-DD period2_end: Second period end YYYY-MM-DD dimensions: Comma-separated dimensions (default: "query") row_limit: Max rows per period (default: 50) country: 3-letter country code filter (e.g. usa, gbr, can). Empty for global. |
| gsc_query_to_pagesA | Find which pages rank for a given query in GSC. Args: query: Exact query string to filter on start_date: YYYY-MM-DD (default: 31 days ago) end_date: YYYY-MM-DD (default: 3 days ago) country: 3-letter country code (e.g. "usa"); empty for global row_limit: Max pages (default: 50) |
| gsc_position_distributionA | Bucket indexed pages by average position (1-3 / 4-10 / 11-20 / 21+). Args: start_date: YYYY-MM-DD (default: 31 days ago) end_date: YYYY-MM-DD (default: 3 days ago) country: 3-letter country code; empty for global |
| gsc_page_query_matrixA | Find which queries drive impressions/clicks to a specific page. Args: page_url: Full or partial page URL (uses GSC 'contains' if no protocol) start_date: YYYY-MM-DD (default: 31 days ago) end_date: YYYY-MM-DD (default: 3 days ago) country: 3-letter country code; empty for global row_limit: Max queries (default: 100) |
| gsc_movers_and_losersB | Pages whose position changed most between two periods (positive = improved). Args: period_a_start: First (older) period start YYYY-MM-DD period_a_end: First period end YYYY-MM-DD period_b_start: Second (newer) period start YYYY-MM-DD period_b_end: Second period end YYYY-MM-DD country: 3-letter country code; empty for global top_n: How many top movers and losers to return each (default: 25) |
| gsc_zero_click_pagesA | Pages with high impressions but ~0 clicks (CTR opportunities). Args: start_date: YYYY-MM-DD (default: 31 days ago) end_date: YYYY-MM-DD (default: 3 days ago) min_impressions: Minimum impressions threshold (default: 200) country: 3-letter country code; empty for global row_limit: Max pages to inspect (default: 100) |
| gsc_branded_vs_unbrandedA | Split GSC totals into branded vs unbranded query buckets. Args: start_date: YYYY-MM-DD (default: 31 days ago) end_date: YYYY-MM-DD (default: 3 days ago) country: 3-letter country code; empty for global brand_terms: Comma-separated brand regex terms (default: "acme") |
| gsc_country_comparisonA | Compare GSC totals across multiple countries. Args: start_date: YYYY-MM-DD (default: 31 days ago) end_date: YYYY-MM-DD (default: 3 days ago) countries: Comma-separated 3-letter country codes (default: "usa,gbr,ind") |
| gsc_long_tail_queriesA | Extract long-tail, conversational GSC queries — the closest proxy to what users type into LLMs. Pulls all queries for the period, filters to those with >= min_words words, and returns them sorted by impressions. These 7+ word queries reflect natural-language problem statements rather than keyword searches, making them strong signals for GEO content strategy. Args: start_date: YYYY-MM-DD (default: 31 days ago) end_date: YYYY-MM-DD (default: 3 days ago) min_words: Minimum word count to include (default: 7) country: 3-letter country code (default: usa) row_limit: Max queries to return after filtering (default: 100) |
| ga4_site_engagementA | Get GA4 site engagement metrics (sessions, users, engagement rate, bounce rate). Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) country: Full country name filter (e.g. "United States", "United Kingdom") channel: Channel filter (e.g. "Organic Search", "Paid Search", "Direct") |
| ga4_channel_breakdownA | Get GA4 traffic breakdown by channel (Organic Search, Paid Search, Direct, etc.). Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) country: Full country name filter (e.g. "United States") |
| ga4_top_pagesA | Get top landing pages by sessions from GA4. Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) limit: Max pages to return (default: 30) country: Full country name filter (e.g. "United States") channel: Channel filter (e.g. "Organic Search") |
| ga4_reportA | Run a custom GA4 report with any metrics and dimensions. Args: metrics: Comma-separated metric names (e.g. "sessions,totalUsers,keyEvents") dimensions: Comma-separated dimension names (e.g. "date,country"). Optional. start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) country: Full country name filter channel: Channel filter limit: Max rows (default: 50) |
| ga4_landing_pages_by_sourceA | Top landing pages broken out by sessionSource. Args: start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Full country name filter (e.g. "United States") channel: Channel filter (e.g. "Organic Search") limit: Max rows (default: 50) |
| ga4_conversions_by_pageC | Top landing pages by key events / conversions. Args: start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Full country name filter channel: Channel filter limit: Max rows (default: 50) |
| ga4_compare_periodsB | Compare two date periods in GA4 side-by-side over one dimension. Args: period1_start: First period start YYYY-MM-DD period1_end: First period end YYYY-MM-DD period2_start: Second period start YYYY-MM-DD period2_end: Second period end YYYY-MM-DD dimension: Dimension to group by (default: "landingPagePlusQueryString") country: Country filter channel: Channel filter limit: Max rows in diff (default: 50) |
| ga4_traffic_by_countryB | Sessions / users / engagement rate broken out by country. Args: start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) channel: Channel filter (e.g. "Organic Search") limit: Max countries (default: 30) |
| ga4_user_journeyA | Best-effort event timeline for a single user. Requires user-scoped clientId custom dimension exposed via GA4 — falls back to empty rows if not configured. Args: client_id: GA4 clientId value to filter on start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) limit: Max events (default: 100) |
| ga4_funnel_reportA | Approximate funnel: count users who fired each event in order. Returns per-step user counts and step-to-step conversion rates. Args: steps: Comma-separated event names in order (e.g. "page_view,form_start,form_submit") start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Country filter channel: Channel filter |
| ga4_returning_vs_newC | Split sessions/users into new vs returning. Args: start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Country filter channel: Channel filter |
| ga4_event_breakdownB | Breakdown of a specific event by a chosen dimension (default: landing page). Args: event_name: GA4 event name (e.g. "form_submit") start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Country filter channel: Channel filter group_by: Dimension to break out (default: "landingPagePlusQueryString") limit: Max rows (default: 50) |
| ga4_traffic_by_deviceC | Sessions / users / engagement broken out by device category. Args: start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Country filter channel: Channel filter |
| ga4_referrer_breakdownA | Top referrers (sessionSource) excluding direct. Args: start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Country filter limit: Max referrers (default: 30) |
| ga4_llm_referralsA | Aggregate GA4 traffic from LLM platforms (Perplexity, ChatGPT, Claude, Gemini, etc.). Returns total LLM-referred sessions/users/key-events plus a per-source breakdown. Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) country: Full country name filter (e.g. "United States") limit: Max source rows to return (default: 20) Note: totals reflect only the rows returned (bounded by limit). With 8 known LLM sources and limit=20, this covers all sources in practice. |
| ads_campaignsA | Get Google Ads campaign performance (cost, clicks, conversions, impression share). Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) |
| ads_keywordsA | Get Google Ads keyword performance with quality scores. Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) limit: Max keywords to return (default: 30) |
| ads_search_termsA | Get actual search terms triggering Google Ads. Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) limit: Max search terms to return (default: 50) |
| hubspot_search_dealsA | Search HubSpot deals with filters (READ-ONLY). Args: filters: JSON string of HubSpot filter groups array. Example: '[{"filters":[{"propertyName":"dealstage","operator":"EQ","value":"closedwon"}]}]' properties: Comma-separated deal properties to return limit: Max deals to return (default: 20) sort_by: Property to sort by (default: "createdate") after: Cursor token from a previous call's next_cursor for pagination |
| hubspot_recent_won_dealsA | Most recently CLOSED-WON deals, newest close date first (READ-ONLY). Use this for ANY question about recent/last/latest closed-won deals. It
resolves the correct deal-stage IDs automatically from the deal pipelines,
so you never build a filter yourself. Won/lost status lives on the deal's
Args: limit: Number of deals to return (default: 5) properties: Comma-separated deal properties to return |
| hubspot_get_companyA | Get a HubSpot company by ID (READ-ONLY). Args: company_id: HubSpot company ID properties: Comma-separated properties to return |
| hubspot_get_contactB | Get a HubSpot contact by ID (READ-ONLY). Args: contact_id: HubSpot contact ID properties: Comma-separated properties to return |
| hubspot_get_dealA | Get a HubSpot deal by ID (READ-ONLY). Args: deal_id: HubSpot deal ID properties: Comma-separated properties to return |
| hubspot_company_contactsA | Get contacts associated with a HubSpot company (READ-ONLY). Args: company_id: HubSpot company ID limit: Max contacts to return (default: 5) |
| hubspot_company_activityA | Get notes and meetings for a HubSpot company (READ-ONLY). Args: company_id: HubSpot company ID include_notes: Include notes (default: True) include_meetings: Include meetings (default: True) limit: Max items per type (default: 5) |
| hubspot_contact_journeyA | Get page visit history for a HubSpot contact (READ-ONLY). Args: contact_id: HubSpot contact ID limit: Max page visits to return (default: 50) |
| hubspot_search_contactsA | Search HubSpot contacts with filters (READ-ONLY). Args: filters: JSON string of HubSpot filter groups array (default: "[]") properties: Comma-separated contact properties to return created_after: ISO date filter on createdate (>=) created_before: ISO date filter on createdate (<=) limit: Max contacts (default: 50) after: Cursor token from a previous call's next_cursor for pagination |
| hubspot_search_companiesA | Search HubSpot companies with filters (READ-ONLY). Args: filters: JSON string of HubSpot filter groups array properties: Comma-separated company properties created_after: ISO date filter (>=) created_before: ISO date filter (<=) limit: Max companies (default: 50) after: Cursor token from a previous call's next_cursor for pagination |
| hubspot_get_deal_associationsA | Get contacts and company associated with a HubSpot deal (READ-ONLY). |
| hubspot_get_contact_associationsA | Get companies and deals associated with a HubSpot contact (READ-ONLY). |
| hubspot_get_company_dealsA | Get deals associated with a HubSpot company (READ-ONLY). Args: company_id: HubSpot company ID properties: Comma-separated deal properties |
| hubspot_search_meetingsA | Search HubSpot meetings within a date range, optionally by owner/outcome. Args: start_date: ISO date >= (default: 7 days ago) end_date: ISO date <= (default: today) owner: HubSpot owner ID filter outcome: hs_meeting_outcome filter (e.g. "COMPLETED", "NO_SHOW") limit: Max meetings (default: 50) after: Cursor token from a previous call's next_cursor for pagination |
| hubspot_contact_form_submissionsC | Form submission events for a HubSpot contact (READ-ONLY). |
| hubspot_contact_email_engagementB | Email opens/clicks/sent events for a HubSpot contact (READ-ONLY). |
| hubspot_contact_meetingsC | Meetings associated with a HubSpot contact (READ-ONLY). |
| hubspot_deal_activity_timelineA | Notes, meetings, and calls associated with a HubSpot deal (READ-ONLY). Args: deal_id: HubSpot deal ID limit: Max items per activity type (default: 25) |
| hubspot_search_pipeline_summaryA | Aggregate deals by a property over a date range (count + amount sum). Args: start_date: ISO date >= createdate (default: 30 days ago) end_date: ISO date <= createdate (default: today) group_by: Deal property to group by (default: "dealstage") pipeline: Pipeline ID filter (optional) limit: Max deals to scan (default: 200) |
| hubspot_field_coverageB | % of recent records that have each property populated. Args: object_type: "deals", "contacts", or "companies" (default: "deals") properties: Comma-separated properties to check sample_size: Recent records to sample (default: 200) |
| hubspot_property_distributionB | Value counts for a property over recent records. Args: object_type: "deals", "contacts", or "companies" property_name: Property to tally sample_size: Recent records to sample (default: 500) |
| hubspot_resolve_idA | Identify what type of HubSpot object (deal, company, or contact) an ID belongs to. Use this when a lookup returns 404 and you're unsure whether the ID is a deal ID, company ID, or contact ID. Args: unknown_id: The HubSpot numeric ID to probe |
| hubspot_pages_to_dealsA | Find contacts whose first/last analytics URL contains a pattern, plus their deals. Args: url_pattern: URL substring (e.g. "/alternatives/chargebee") start_date: ISO date >= createdate (optional) end_date: ISO date <= createdate (optional) limit: Max contacts (default: 100) |
| bing_top_queriesA | Get top Bing search queries (US traffic) with clicks, impressions, CTR, position. Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) |
| bing_top_pagesA | Get top Bing pages by clicks (US traffic). Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) |
| bing_compare_periodsB | Compare two date periods in Bing side-by-side. Args: period1_start: First period start YYYY-MM-DD period1_end: First period end YYYY-MM-DD period2_start: Second period start YYYY-MM-DD period2_end: Second period end YYYY-MM-DD dimension: "query" or "page" (default: "query") limit: Max rows in diff (default: 50) |
| bing_query_to_pagesB | Find which Bing pages rank for a given query. Args: query: Exact query string start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) row_limit: Max pages (default: 50) |
| bing_page_query_matrixA | Find which Bing queries drive a specific page. Args: page_url: Page URL start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) row_limit: Max queries (default: 100) |
| bing_keywordsA | Get keywords Bing topically associates with example.com (impressions-ranked). Unlike query stats (what users typed), these reflect Bing's own topical index signal — useful for understanding perceived authority and content gaps. Args: start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Country code (default: "us") language: Language code (default: "en-US") limit: Max keywords to return (default: 100) |
| bing_related_keywordsA | Get keywords Bing considers related to a seed keyword for this site. Useful for content gap analysis and discovering adjacent topics. Args: keyword: Seed keyword to expand start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) country: Country code (default: "us") language: Language code (default: "en-US") |
| bing_crawl_statsA | Get Bing's weekly crawl statistics for the site. Returns a time-series of crawl health: pages crawled, index count, and error counts (DNS, HTTP, timeout, robots-blocked) per week. |
| bing_crawl_issuesA | Get list of URLs with crawl issues reported by Bing. Each entry includes the URL and decoded issue labels (e.g. not_found_404, robots_txt_blocked, timeout). Useful for actionable technical SEO fixes. |
| bing_branded_vs_unbrandedA | Split Bing query totals into branded vs unbranded buckets. Args: start_date: YYYY-MM-DD (default: 28 days ago) end_date: YYYY-MM-DD (default: today) brand_terms: Comma-separated brand regex terms (default: "acme") |
| docs_add_tabA | Adds a new named tab to an existing Google Doc and writes formatted content. The service account must have Editor access to the target document. doc_id: Google Doc ID (from the URL: /document/d//edit) tab_title: Title shown on the tab blocks: JSON array of content blocks. Supported types: {"type": "h1", "text": "Title"} {"type": "h2", "text": "Section"} {"type": "h3", "text": "Subsection", "space_above": 18} {"type": "p", "text": "Body paragraph text"} {"type": "p", "text": "Bold label", "bold": true, "space_above": 8} {"type": "p", "text": "Evidence citation", "italic": true} {"type": "p", "text": "Strong", "color": [0.1, 0.55, 0.15]} {"type": "callout", "text": "Warning text", "bg_color": [1.0, 0.98, 0.8], "bold": true} {"type": "bullet", "text": "Bullet point text"} {"type": "spacer"} {"type": "image", "drive_file_id": "1abc...", "width": 450, "height": 280} {"type": "image", "uri": "https://.../img/", "width": 450, "height": 280} -- uri: use the URL returned by POST /img/upload on the MCP server {"type": "table", "headers": ["Col A", "Col B", "Col C"], "rows": [["val1", "val2", "val3"], ...], "header_color": [0.18, 0.42, 0.70]} Flags for p blocks: bold (bool), italic (bool), color ([r,g,b] 0-1 floats), space_above (pt) Flags for h1/h2/h3: space_above (pt) callout bg_color presets: warning=[1.0,0.98,0.8], info=[0.88,0.94,1.0], success=[0.9,0.97,0.9] Returns the tab_id and a link to the document. |
| docs_create_docA | Creates a new Google Doc owned by the service account and writes formatted content into its default tab. title: Document title blocks: JSON array of content blocks (same format as docs_add_tab) Returns the document URL. |
| gsc_quick_snapshotA | GSC totals + top 10 queries + top 10 pages in one call. Replaces calling gsc_totals, gsc_search_analytics(query), and gsc_search_analytics(page) separately. Use this as the starting point for any 'how is organic search doing?' question. Args: start_date: Start date YYYY-MM-DD (default: 31 days ago) end_date: End date YYYY-MM-DD (default: 3 days ago) country: 3-letter country code (e.g. usa, gbr). Empty for global. |
| ga4_quick_snapshotA | GA4 site engagement + channel breakdown + top 10 pages in one call. Replaces calling ga4_site_engagement, ga4_channel_breakdown, and ga4_top_pages separately. Use this as the starting point for any 'how is our website traffic doing?' question. Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) |
| marketing_snapshotA | Full marketing overview: GSC organic + GA4 traffic in one call. Use this as the first tool for any weekly or ad-hoc 'give me an overview of marketing performance' question. Returns GSC totals, top queries, top pages, GA4 engagement, and channel breakdown. Args: start_date: Start date YYYY-MM-DD (default: 28 days ago) end_date: End date YYYY-MM-DD (default: today) |
| demo_report_datapackA | Complete, deterministic data pack for the weekly inbound demo report (READ-ONLY). Does in Python everything the demo skill used to hand-orchestrate: computes
the Mon–Sun target week, runs the exhaustive "Inbound - Organic" unclassified
sweep (paginated to the end), fetches in-period demo-outcome deals, and fully
enriches every deal (associations, company, contacts, notes, meetings, activity
timeline, form submissions) with pre-computed attribution Returns one JSON object: target/prev weeks, in_period_deals[], stale_unclassified[],
converting_urls[], plus Args: week_ending: Anchor date YYYY-MM-DD; the target week is the most recent completed Mon–Sun on/before it (default: today). weeks_back: Completed weeks back to target (default: 1 = last week). max_contacts_per_deal: Cap on contacts enriched per deal (default: 3). |
| traffic_report_datapackA | Complete, deterministic data pack for the weekly traffic report (READ-ONLY). Folds the traffic skill's GSC / Bing / GA4 / Google Ads batches plus LLM-referral gathering into one Python call: computes the Mon–Sun target + previous weeks (GSC gets its ~3-day lag), pulls every metric, and pre-computes the cross-references the skill used to ask the LLM to derive — the "Bing leads Google" candidate list and any emerging AI-surface referrer not yet in the curated list. Each platform batch is isolated so one API failure degrades to a Args: week_ending: Anchor date YYYY-MM-DD (default: today). weeks_back: Completed weeks back to target (default: 1 = last week). |
| events_upcomingA | List upcoming Acme events in a date range. Args: start_date: Start date YYYY-MM-DD (default: today) end_date: End date YYYY-MM-DD (default: 30 days from today) year: Calendar year to query — "2025" or "2026" (default: "2026") |
| events_searchA | Search Acme events by name, type, location, or attendee. Args: query: Text to search in event name or type (case-insensitive) event_type: Filter by type — e.g. "conference", "dinner", "webinar", "demo day" location: Filter by city or venue (case-insensitive) attendee: Filter by person attending — e.g. "saurabh", "apurv", "priyam" year: Calendar year — "2025" or "2026" (default: "2026") |
| events_detailA | Get full details for a specific event by name. Args: event_name: Full or partial event name to look up (case-insensitive) year: Calendar year — "2025" or "2026" (default: "2026") |
| events_budget_summaryA | Get Acme events budget summary — total spend, breakdown by type and quarter. Args: year: Calendar year — "2025" or "2026" (default: "2026") quarter: Filter to a quarter — "Q1", "Q2", "Q3", or "Q4" (optional) event_type: Filter by event type — e.g. "conference", "dinner" (optional) |
| events_attendee_scheduleA | Show all events a specific person is attending. Args: person: Person's first name — e.g. "saurabh", "apurv", "priyam", "brandyn", or "arnab" start_date: Only show events from this date onward YYYY-MM-DD (default: today) end_date: Only show events up to this date YYYY-MM-DD (optional) year: Calendar year — "2025" or "2026" (default: "2026") |
| events_fetch_pageA | Fetch and read the linked event website for a specific event. Use this when you need details not in the sheet — venue, agenda, speakers, registration info, pricing. Fetches the URL linked in the event name cell. Args: event_name: Full or partial event name (case-insensitive) year: Calendar year — "2025" or "2026" (default: "2026") |
| demo_report_save_weekA | Persist one week's classified demo report to Supabase (idempotent). Upserts the week-summary row on week_ending and replaces that week's lead
rows. Re-running a week converges — never duplicates. Returns a non-fatal
Args: week_summary_json: JSON object for one demo_report_weeks row. Required key: week_ending (YYYY-MM-DD, the Sunday). Other keys: week_start, total_inbound, unbranded, branded, direct, events, outbound_revivals, paid, flagged, ambiguous, ai_surface_leads, pipeline_usd, warnings, complete. leads_json: JSON array of per-lead rows. Each: deal_id, company, domain, classification, icp_fit, amount, dealstage, found_us, ai_surface_origin, hubspot_current_source, hubspot_update_to, rationale. week_ending is attached automatically. |
| demo_report_month_rollupA | Read all stored demo weeks for a month and return pre-aggregated totals. Pure Supabase read — no datapack pull, no HubSpot, no re-classification. The monthly skill renders the returned dict to a Google Doc tab. Args: month: Target month as YYYY-MM (e.g. "2026-05"). Returns weeks whose week_ending falls in that month, their leads, and summed totals. A month with no stored weeks returns an explicit note. |
| reddit_engagement_candidatesA | Return recent, classified, non-noise Reddit candidates to comment on. Reads the monitor pipeline's Intended use: draft a genuinely helpful, native-voice comment for the ones worth engaging (open the permalink first to read existing replies so you don't repeat them), then call reddit_mark_engaged after posting. Args: lookback_hours: Only candidates created within this window. Default 48. include_posts: Include top-level post candidates. Default true. include_comments: Include in-thread comment candidates (reply opportunities). Default true. limit: Max candidates returned after ranking. Default 25. exclude_engaged: Hide candidates already recorded via reddit_mark_engaged. Default true. |
| reddit_mark_engagedA | Record that a Reddit candidate was engaged so it stops re-surfacing. Idempotent upsert on post_id — call it once a comment is actually posted. Args: post_id: The candidate's post_id (e.g. "t3_abc123" for a post or "t1_def456" for an in-thread comment), exactly as returned by reddit_engagement_candidates. comment_url: Permalink of the comment that was posted (optional, for the audit trail). note: Free-text note, e.g. "skipped — off-topic" or "posted" (optional). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Dweeb1578/marketing-analytics-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server