Skip to main content
Glama
Dweeb1578

Marketing Analytics MCP Server

by Dweeb1578

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
MCP_AUTH_TOKENNoBearer token for remote authentication (optional for local stdio).

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 dealstage (deal pipeline stage) — NEVER use lifecyclestage, which is a contact/company field and does NOT represent deal won status.

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 signals. The LLM's only remaining job is classification judgment + narrative.

Returns one JSON object: target/prev weeks, in_period_deals[], stale_unclassified[], converting_urls[], plus complete and warnings so partial pulls are explicit instead of silently improvised.

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 warnings entry instead of aborting the pack.

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 warnings list if pipeline_usd does not reconcile with counted-inbound lead amounts (the week is still saved).

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 reddit_hits + reddit_classifications tables (no live Reddit fetch). Candidates are ranked by bucket priority (lead_signal > competitor_mention > icp_discussion) then recency, and split into posts vs in-thread comments. Each candidate includes the permalink, subreddit, title/body, author, age, and classification context (bucket, persona, pain_points, sentiment, mentioned competitors).

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

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