Connects Claude to unsampled, first-party Shopify analytics via 26 read-only tools running on Cloudflare Workers with D1 storage. You get session traces, multi-touch attribution (including Markov models), funnel analysis, revenue leak diagnostics, and UTM tracking that survives Shopify's cross-domain checkout. Useful when GA4 sampling isn't cutting it or you need to debug cart abandonment and attribution in chat instead of exporting CSVs. OAuth 2.1 auth, streamable HTTP transport, works in Claude Desktop and Cursor after you install their Custom Pixel on your store. Tools like pp_diagnose_leaks and pp_acquisition let you ship fixes from the same conversation where you found the problem.
Public tool metadata for what this MCP can expose to an agent.
projects.listList all Clamp projects this credential can access. Returns each project's id, name, and plan ('free', 'pro', or 'growth'). Use this when the user asks "which sites do you see" or when the agent needs a project_id to disambiguate before calling another tool — most other tools...List all Clamp projects this credential can access. Returns each project's id, name, and plan ('free', 'pro', or 'growth'). Use this when the user asks "which sites do you see" or when the agent needs a project_id to disambiguate before calling another tool — most other tools...
No parameter schema in public metadata yet.
traffic.overviewHigh-level snapshot of website traffic over a period: total pageviews, unique visitors, sessions, bounce rate (%), and average session duration (seconds). Always includes a comparison block with the same metrics for the previous period of equal length plus the absolute and per...12 paramsHigh-level snapshot of website traffic over a period: total pageviews, unique visitors, sessions, bounce rate (%), and average session duration (seconds). Always includes a comparison block with the same metrics for the previous period of equal length plus the absolute and per...
periodstringchannelstringcountrystringpathnamestringutm_termstringproject_idstringutm_mediumstringutm_sourcestringdevice_typestringutm_contentstringutm_campaignstringreferrer_hoststringevents.listGet custom event counts. Without a `name` filter, returns every event name in the period with its total count and unique-visitor count (excludes "pageview" and the SDK-internal "pageview_end"). With a `name` filter, returns the count for that single event, optionally filtered...19 paramsGet custom event counts. Without a `name` filter, returns every event name in the period with its total count and unique-visitor count (excludes "pageview" and the SDK-internal "pageview_end"). With a `name` filter, returns the count for that single event, optionally filtered...
namestringlimitnumbervaluestringperiodstringchannelstringcountrystringgroup_bystringpathnamestringpropertystringutm_termstringproject_idstringutm_mediumstringutm_sourcestringvalue_typestringstring · number · booleandevice_typestringutm_contentstringutm_campaignstringgroup_by_typestringstring · number · booleanreferrer_hoststringevents.observed_schemaReturn what's actually firing into ingest as a structured signature, for diffing against the project's authored `event-schema.yaml`. Different shape from the YAML — this is observation, not declaration. Response shape: ``` { period: "30d", events: [ { name: "checkout", count:...3 paramsReturn what's actually firing into ingest as a structured signature, for diffing against the project's authored `event-schema.yaml`. Different shape from the YAML — this is observation, not declaration. Response shape: ``` { period: "30d", events: [ { name: "checkout", count:...
periodstringproject_idstringinclude_pageviewsbooleanrevenue.sumSum revenue from Money-typed event properties. Returns per-currency totals, optionally grouped by a traffic dimension (referrer_host, channel, country, device_type, pathname, utm_source/medium/campaign). Different currencies are never mixed in a single sum — each row is one (g...17 paramsSum revenue from Money-typed event properties. Returns per-currency totals, optionally grouped by a traffic dimension (referrer_host, channel, country, device_type, pathname, utm_source/medium/campaign). Different currencies are never mixed in a single sum — each row is one (g...
eventstringlimitnumberperiodstringchannelstringcountrystringgroup_bystringreferrer_host · channel · country · device_type · pathname · utm_sourcepathnamestringpropertystringutm_termstringproject_idstringutm_mediumstringutm_sourcestringdevice_typestringutm_contentstringutm_campaignstringreferrer_hoststringattribution_modelstringlast_touch · first_touchusers.journeyChronological session history for a single visitor (anonymous_id). Each session collapses to one row showing the start and end timestamps, entry page, channel, referrer host, UTMs, country, device type, pageview count, and the distinct custom event names fired in that session....4 paramsChronological session history for a single visitor (anonymous_id). Each session collapses to one row showing the start and end timestamps, entry page, channel, referrer host, UTMs, country, device type, pageview count, and the distinct custom event names fired in that session....
limitintegerperiodstringproject_idstringanonymous_idstringerrors.listRecent error events with full context. One row per occurrence, returned newest-first. Each row carries the error itself (message, type, stack, fingerprint, handled flag) plus the standard event context (url, browser/OS/device, country, anonymous_id, session_id) — same shape in...10 paramsRecent error events with full context. One row per occurrence, returned newest-first. Each row carries the error itself (message, type, stack, fingerprint, handled flag) plus the standard event context (url, browser/OS/device, country, anonymous_id, session_id) — same shape in...
osstringlimitnumberperiodstringbrowserstringcountrystringhandledstringtrue · falsemessagestringproject_idstringdevice_typestringdesktop · mobile · tablet · botfingerprintstringerrors.groupsErrors deduplicated by server-computed fingerprint, with counts and first/last-seen timestamps. The triage view: which bugs are firing most often, affecting the most users, or showing up newly in the period. Each group is one fingerprint (a bug). `count` is total occurrences i...4 paramsErrors deduplicated by server-computed fingerprint, with counts and first/last-seen timestamps. The triage view: which bugs are firing most often, affecting the most users, or showing up newly in the period. Each group is one fingerprint (a bug). `count` is total occurrences i...
limitnumberperiodstringsort_bystringcount · users_affected · last_seen · first_seenproject_idstringerrors.timelineError count over time, bucketed hourly or daily. Optionally scoped to one fingerprint. Use this to spot regressions ("when did this bug start firing?") or post-deploy spikes ("did the deploy at 14:00 break something?"). Returns a series of { bucket, count } rows. The bucket fi...4 paramsError count over time, bucketed hourly or daily. Optionally scoped to one fingerprint. Use this to spot regressions ("when did this bug start firing?") or post-deploy spikes ("did the deploy at 14:00 break something?"). Returns a series of { bucket, count } rows. The bucket fi...
periodstringintervalstringhour · dayproject_idstringfingerprintstringerrors.contextBreadcrumbs leading to one error: the events from the same session, before the error timestamp, in chronological order. The "what was the user doing right before this broke" view that turns a stack trace into a story. Given an anonymous_id and the error's timestamp, finds the...4 paramsBreadcrumbs leading to one error: the events from the same session, before the error timestamp, in chronological order. The "what was the user doing right before this broke" view that turns a stack trace into a story. Given an anonymous_id and the error's timestamp, finds the...
limitintegerproject_idstringanonymous_idstringbefore_timestampstringtraffic.timeseriesEvent counts over time as date buckets. Returns [{ date, count }] sorted ascending. Granularity is automatic based on period length (hourly for ≤2 days, daily for ≤90 days, weekly for ≤365 days, monthly beyond) and can be overridden via `granularity`. Filterable to a specific...16 paramsEvent counts over time as date buckets. Returns [{ date, count }] sorted ascending. Granularity is automatic based on period length (hourly for ≤2 days, daily for ≤90 days, weekly for ≤365 days, monthly beyond) and can be overridden via `granularity`. Filterable to a specific...
eventstringvaluestringperiodstringchannelstringcountrystringpathnamestringpropertystringutm_termstringproject_idstringutm_mediumstringutm_sourcestringdevice_typestringgranularitystringhour · day · week · monthutm_contentstringutm_campaignstringreferrer_hoststringfunnels.createCreate and immediately evaluate a conversion funnel. A funnel measures how many unique visitors complete an ordered sequence of steps. Returns step-by-step counts, per-step conversion rates (vs the previous step), and overall conversion (last step / first step). The funnel is...3 paramsCreate and immediately evaluate a conversion funnel. A funnel measures how many unique visitors complete an ordered sequence of steps. Returns step-by-step counts, per-step conversion rates (vs the previous step), and overall conversion (last step / first step). The funnel is...
namestringstepsarrayproject_idstringfunnels.listRetrieve and re-evaluate a previously created funnel against current data for the specified period. Without a `name`, lists all funnels saved for the project. With a `name`, returns the same step-by-step counts and conversion rates as funnels.create, recomputed for the request...13 paramsRetrieve and re-evaluate a previously created funnel against current data for the specified period. Without a `name`, lists all funnels saved for the project. With a `name`, returns the same step-by-step counts and conversion rates as funnels.create, recomputed for the request...
namestringperiodstringchannelstringcountrystringpathnamestringutm_termstringproject_idstringutm_mediumstringutm_sourcestringdevice_typestringutm_contentstringutm_campaignstringreferrer_hoststringcohorts.createCreate and persist a named cohort — a group of visitors defined by an event in a period, optionally narrowed by a property filter. The cohort is stored by name; subsequent retention/compare queries reference it without re-specifying the definition. Membership is recomputed at...3 paramsCreate and persist a named cohort — a group of visitors defined by an event in a period, optionally narrowed by a property filter. The cohort is stored by name; subsequent retention/compare queries reference it without re-specifying the definition. Membership is recomputed at...
namestringdefinitionobjectproject_idstringcohorts.listList saved cohorts for the project. With `name`, returns one cohort with its current size; without, returns every cohort with their definitions. Use to discover cohort handles before calling retention or compare. Examples: - "what cohorts do I have" → no params - "show me the...2 paramsList saved cohorts for the project. With `name`, returns one cohort with its current size; without, returns every cohort with their definitions. Use to discover cohort handles before calling retention or compare. Examples: - "what cohorts do I have" → no params - "show me the...
namestringproject_idstringcohorts.retentionCompute the retention curve for a saved cohort. For each requested window (e.g. day 1, 7, 14, 30 after the cohort's anchor event), returns how many cohort members fired any non-pageview-end event in that day's window, and the rate vs the cohort size. Use this to answer "did th...3 paramsCompute the retention curve for a saved cohort. For each requested window (e.g. day 1, 7, 14, 30 after the cohort's anchor event), returns how many cohort members fired any non-pageview-end event in that day's window, and the rate vs the cohort size. Use this to answer "did th...
namestringperiodsstringproject_idstringcohorts.compareCompare two saved cohorts side-by-side on retention. Returns each cohort's size and retention curve over the same period set, so you can read "did this week's signups retain better than last week's?" or "is this experiment cohort behaving differently than control?" without com...4 paramsCompare two saved cohorts side-by-side on retention. Returns each cohort's size and retention curve over the same period set, so you can read "did this week's signups retain better than last week's?" or "is this experiment cohort behaving differently than control?" without com...
astringbstringperiodsstringproject_idstringcohorts.deleteDelete a saved cohort by name. Irreversible — the agent should confirm intent with the user before calling this. The underlying event data isn't touched; only the cohort definition row is removed. Examples: - "delete the test cohort" → name="test_cohort" Limitations: irreversi...2 paramsDelete a saved cohort by name. Irreversible — the agent should confirm intent with the user before calling this. The underlying event data isn't touched; only the cohort definition row is removed. Examples: - "delete the test cohort" → name="test_cohort" Limitations: irreversi...
namestringproject_idstringalerts.createCreate a metric alert that fires when a condition crosses its threshold. The alert monitors one metric (pageviews, visitors, sessions, bounce_rate, or avg_duration) over a rolling period and is re-evaluated every time an MCP session connects — alerts surface in-thread when the...6 paramsCreate a metric alert that fires when a condition crosses its threshold. The alert monitors one metric (pageviews, visitors, sessions, bounce_rate, or avg_duration) over a rolling period and is re-evaluated every time an MCP session connects — alerts surface in-thread when the...
metricstringpageviews · visitors · sessions · bounce_rate · avg_durationperiodstringpathnamestringconditionstringabove · below · drops_by · increases_bythresholdnumberproject_idstringalerts.listList all alerts configured for a project. Returns each alert's id (UUID), metric, condition, threshold, period, optional pathname scope, and created_at timestamp. Use before alerts.delete to find the id you want to remove, or to show the user every monitor currently active. Re...1 paramsList all alerts configured for a project. Returns each alert's id (UUID), metric, condition, threshold, period, optional pathname scope, and created_at timestamp. Use before alerts.delete to find the id you want to remove, or to show the user every monitor currently active. Re...
project_idstringalerts.deleteDelete an alert by its id. Find the id by calling alerts.list first. The deletion is irreversible — there is no soft-delete or undo, and the agent should confirm intent with the user before calling this on a non-trivial alert. Returns 404 if no alert with that id exists for th...2 paramsDelete an alert by its id. Find the id by calling alerts.list first. The deletion is irreversible — there is no soft-delete or undo, and the agent should confirm intent with the user before calling this on a non-trivial alert. Returns 404 if no alert with that id exists for th...
alert_idstringproject_idstringtraffic.breakdownAggregate visitors and pageviews grouped by a single dimension. The `dimension` parameter chooses what to group by — page paths, traffic sources, geography, devices, or marketing attribution. Results are sorted by visitors descending and capped by `limit` (default 10, max 50)....14 paramsAggregate visitors and pageviews grouped by a single dimension. The `dimension` parameter chooses what to group by — page paths, traffic sources, geography, devices, or marketing attribution. Results are sorted by visitors descending and capped by `limit` (default 10, max 50)....
limitnumberperiodstringchannelstringcountrystringpathnamestringutm_termstringdimensionstringpathname · entry_page · exit_page · referrer_host · channel · countryproject_idstringutm_mediumstringutm_sourcestringdevice_typestringutm_contentstringutm_campaignstringreferrer_hoststringtraffic.compareCompare one metric across two arbitrary periods side-by-side. Returns both period values plus absolute delta and percentage delta. Periods do not need to be the same length — the percentage delta normalizes by ratio so longer/shorter comparisons remain meaningful. Use when the...14 paramsCompare one metric across two arbitrary periods side-by-side. Returns both period values plus absolute delta and percentage delta. Periods do not need to be the same length — the percentage delta normalizes by ratio so longer/shorter comparisons remain meaningful. Use when the...
astringbstringmetricstringpageviews · visitors · sessions · bounce_rate · avg_durationchannelstringcountrystringpathnamestringutm_termstringproject_idstringutm_mediumstringutm_sourcestringdevice_typestringutm_contentstringutm_campaignstringreferrer_hoststringsessions.pathsAggregate (entry_page → exit_page) session pairs. Returns the top pairs with how many sessions followed each path, average pages per session, average duration in seconds, and a bounce flag. Use to answer "what do visitors do after landing on /pricing", "where do sessions end",...14 paramsAggregate (entry_page → exit_page) session pairs. Returns the top pairs with how many sessions followed each path, average pages per session, average duration in seconds, and a bounce flag. Use to answer "what do visitors do after landing on /pricing", "where do sessions end",...
limitnumberperiodstringchannelstringcountrystringpathnamestringutm_termstringmin_pagesintegerproject_idstringutm_mediumstringutm_sourcestringdevice_typestringutm_contentstringutm_campaignstringreferrer_hoststringpages.engagementPer-page metrics with a selectable detail level. The `view` parameter chooses what comes back: - view="summary" (default): pathname, pageviews, visitors. Cheap; use as the standard "top pages" call. - view="engagement": adds avg_engagement_seconds (active tab time from the SDK...14 paramsPer-page metrics with a selectable detail level. The `view` parameter chooses what comes back: - view="summary" (default): pathname, pageviews, visitors. Cheap; use as the standard "top pages" call. - view="engagement": adds avg_engagement_seconds (active tab time from the SDK...
viewstringsummary · engagement · sectionslimitnumberperiodstringchannelstringcountrystringpathnamestringutm_termstringproject_idstringutm_mediumstringutm_sourcestringdevice_typestringutm_contentstringutm_campaignstringreferrer_hoststringtraffic.liveSee who is on the site in the last N minutes. Returns the active visitor count plus top pages, top referrers, and top countries within that window. Defaults to 5 minutes; max 60. Use during incidents ("is anyone hitting the broken page right now"), launches ("is the new post g...2 paramsSee who is on the site in the last N minutes. Returns the active visitor count plus top pages, top referrers, and top countries within that window. Defaults to 5 minutes; max 60. Use during incidents ("is anyone hitting the broken page right now"), launches ("is the new post g...
project_idstringwindow_minutesintegerdocs.searchKeyword-search the Clamp documentation index for setup, SDK, MCP, concepts, and skills pages. Returns ranked entries with url, title, and a short description. Each match scores higher when query terms appear in the title than the description; results are capped by `limit` (def...2 paramsKeyword-search the Clamp documentation index for setup, SDK, MCP, concepts, and skills pages. Returns ranked entries with url, title, and a short description. Each match scores higher when query terms appear in the title than the description; results are capped by `limit` (def...
limitintegerquerystringProfitpather is a first-party, unsampled analytics layer for Shopify stores. This is its public Model Context Protocol server — 26 tools that give AI agents live, raw, every-event access to merchant traffic, attribution, funnels, and revenue-leak diagnostics.
com.profitpather/analytics (DNS-verified via profitpather.com)https://profitpather.com/mcp2025-11-25 · 2025-06-18 · 2025-03-26 · 2024-11-05)| Alternative | Limitation Profitpather solves |
|---|---|
| GA4 / Shopify Reports | Aggressively sampled, third-party-cookie dependent, drops UTMs across the Shopify cross-domain checkout — designed to feed Google Ads, not to answer "where did this cart actually start?" |
| Meta / TikTok / Google Ads dashboards | Self-reported clicks, regularly over-attribute, can't see on-domain behaviour |
| Triple Whale / Northbeam / Polar ($150–$1,500/mo) | Closed paid suites, not Claude-native, not MCP-accessible |
| Heap / Mixpanel / Amplitude | Generic product analytics — don't understand Shopify cart-goal logic, pre-cart paths, checkout linkage, store-domain attribution |
Profitpather is unsampled, first-party, Shopify-native, and agent-native by design — analyse in chat, ship fixes from chat.
Headline tools (the ones agents reach for first):
| Tool | Purpose |
|---|---|
pp_list_domains | List every Shopify domain this account can query. Call first. |
pp_brief | One-call first look — overview + acquisition + device + pixel-status in parallel, with a pre-formatted markdown presentation. |
pp_diagnose_leaks | Revenue-leak finder. Aggregates 8 analyses into a prioritised recommendations[] array. |
pp_overview | Top-level KPIs for one window: sessions, cart rate, checkout rate, top sources, top landing pages. |
pp_acquisition | Full attribution matrix — every (source, medium, campaign, utm, click-id) combo with revenue, AOV, conversion rates. |
pp_conversion | Funnel + pre-cart paths + checkout economics broken down by stage. |
pp_path_analysis | Page-to-page flows with cart-rate weighting; finds dead-end transitions. |
pp_markov | Markov-chain attribution model across multi-touch journeys. |
pp_in_app_browser_loss | Revenue at risk from in-app browsers (Instagram, TikTok, Facebook). |
pp_session_trace | Full per-session event timeline for a single visitor. |
pp_pixel_status | Pixel health & coverage check. |
pp_compare_periods | Period-over-period comparison with statistical significance. |
pp_ai_insights | LLM-summarised insights pre-computed nightly. |
pp_signals | All measured behavioural signals on a domain. |
Plus 12 more covering device splits, page-lift attribution, product analytics, search, timeseries, real-time today-view, change log, admin status, etc.
Full per-tool schemas at: profitpather.com/.well-known/agent-skills/index.json
{
"mcpServers": {
"profitpather": {
"url": "https://profitpather.com/mcp"
}
}
}
Restart the client. On first tool call, you'll be redirected through OAuth 2.1 to authorise the connection. Sign in with your Profitpather account, approve, and the client stores the token automatically.
Settings → Connectors → Add custom connector → paste https://profitpather.com/mcp → approve OAuth.
Sign up at profitpather.com, install the single Shopify Custom Pixel on your store, and Profitpather starts collecting events immediately. The MCP becomes useful within minutes of the pixel firing.
Profitpather runs entirely on Cloudflare Workers with D1 (SQLite at the edge) for per-merchant event storage. The MCP endpoint at /mcp is the same Worker that serves the dashboard at profitpather.com/dashboard — analytics queries hit D1 directly with no intermediate cache or sampling.
Shopify Custom Pixel (storefront)
│
▼
Cloudflare Worker ───────► D1 (per-merchant event store)
│ ▲
▼ │
/mcp (MCP server) ─── reads ──────┘
│
▼
AI agent (Claude / ChatGPT / Cursor / your app)
All 26 MCP tools are read-only against the merchant's own data — no cross-tenant access, no third-party data sharing.
Profitpather publishes the full agentic-discovery surface:
| Path | What it returns |
|---|---|
/.well-known/mcp/server-card.json | MCP server card v1 (SEP-1649) |
/.well-known/oauth-protected-resource | OAuth 2.1 discovery (RFC 9728) |
/.well-known/api-catalog | RFC 9727 API catalogue |
/.well-known/agent-skills/index.json | Per-tool agent skills with SHA-256 digests (Cloudflare RFC v0.2.0) |
/llms-full.txt | Full Markdown documentation for LLM ingestion |
/llms.txt | LLM index |
MIT — see LICENSE.
Built by Boolsai · Contact: founder@boolsai.ai
io.github.infoinlet-marketplace/mcp-observability
betterdb-inc/monitor
com.mcparmory/datadog
thotischner/observability-mcp
io.github.tantiope/datadog-mcp
io.github.us-all/datadog