@mitr-analytics/mcp
This server lets an MCP client read, analyze, and (with permitted API-key scopes) manage a Mitr analytics workspace.
List apps/sites and register new apps (SDK secrets are not returned).
Fetch a 7-day app analytics report and recent raw events for debugging/QA.
List funnels, compute funnel conversion/drop-off results, and create/update/delete funnels.
View workspace traffic alert settings, billing plan/quota usage, and a whole-workspace overview.
List/get QR campaigns and create/update campaigns or add QR code placements.
Check webhook delivery health and create/update/delete webhook endpoints.
Respects API-key permissions: read-only by default; writes/deletes require specific scopes. Alerts and team management are not available.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@mitr-analytics/mcp Which of my apps had the biggest drop in visitors this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@mitr-analytics/mcp
Ask Claude, Gemini or any other MCP client about your Mitr analytics, in plain English. It reads your own data (apps, reports, funnels, alerts, plan usage) and hands it to the assistant to analyse.
Mitr is cookie-free analytics, so there is no consent banner to wire up and nothing here changes that: this server only reads what is already in your dashboard.
What you can ask
"Which of my apps had the biggest drop in visitors this week, and where did it come from?"
"Show my signup funnel for the last 30 days. Where do people leave?"
"Is anything odd in the last events for my marketing site? Are the UTM tags coming through?"
"How much of my monthly event quota have I used?"
"Register a new web app called Docs for docs.example.com."
Related MCP server: Clamp Analytics MCP Server
Set up (about two minutes)
You need a Mitr account. Nothing to install if you use the hosted endpoint.
1. Create an API key. In the dashboard open Settings → API keys & AI assistants → Create key, give it a name (for example "Claude Code") and copy it. It is shown once.
Keys are read-only unless you tick permissions when creating them: "Can register apps", "Can manage funnels", "Can manage QR campaigns", "Can manage webhooks", and "Can delete" (which also needs one of the manage permissions). They expire after 365 days by default (30, 90, 365 days or never). A key stops working if you leave or are removed from the workspace it was created in.
2. Connect your assistant.
Hosted (no install)
Point any client that supports remote MCP servers at https://mcp.mitranalytics.dev/mcp and send the key in the Authorization header. Never put the key in the URL; the endpoint refuses it.
Claude Code:
claude mcp add --transport http mitr https://mcp.mitranalytics.dev/mcp --header "Authorization: Bearer mitr_live_..."Cursor (~/.cursor/mcp.json):
{
"mcpServers": {
"mitr": {
"url": "https://mcp.mitranalytics.dev/mcp",
"headers": { "Authorization": "Bearer mitr_live_..." }
}
}
}VS Code (.vscode/mcp.json):
{
"servers": {
"mitr": {
"type": "http",
"url": "https://mcp.mitranalytics.dev/mcp",
"headers": { "Authorization": "Bearer mitr_live_..." }
}
}
}Gemini CLI (~/.gemini/settings.json):
{
"mcpServers": {
"mitr": {
"httpUrl": "https://mcp.mitranalytics.dev/mcp",
"headers": { "Authorization": "Bearer mitr_live_..." }
}
}
}Local (npx)
For clients that run a command, such as Claude Desktop. You need Node.js 18 or newer. Open claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) and add:
{
"mcpServers": {
"mitr": {
"command": "npx",
"args": ["-y", "@mitr-analytics/mcp"],
"env": { "MITR_API_KEY": "mitr_live_..." }
}
}
}The same works in Claude Code (claude mcp add mitr --env MITR_API_KEY=mitr_live_... -- npx -y @mitr-analytics/mcp) and the Gemini CLI if you prefer running it locally.
3. Ask a question (restart the assistant first if it's a local setup). The dashboard shows when the key was last used.
Tools
Tool | What it does |
| Every app in your workspace, with the |
| Marketing attribution: visitors and conversions per UTM campaign, source or medium, vs the previous period. |
| A 7-day report for one app: visitors, pageviews, traffic, sources, countries, devices, web vitals, conversions. |
| The latest raw events for one app, to check what is really being tracked. |
| Your saved conversion funnels. |
| Step-by-step conversion and drop-off for one funnel over a date range. |
| Your traffic spike/drop alert settings, if you have set one. |
| Your plan, subscription status and event usage. |
| One summary of every app's traffic, webhooks, QR campaigns and funnels, with anything that needs attention. |
| Your QR campaigns with ids, status, scan totals and your plan's QR limits. |
| One campaign with its codes and per-code scan counts. |
| Per webhook endpoint: delivery counts by status and the latest failure. Payloads are never returned. |
| Register a new app. Needs "Can register apps". The app's secret key is not returned: copy it from the dashboard. |
| Create a funnel from ordered page-path or event steps, or replace a funnel's name and steps. Needs "Can manage funnels". |
| Permanently delete a funnel. Needs "Can manage funnels" and "Can delete". |
| Create a campaign that sends scanners to an https URL, or rename it, change the destination, or set its status to active, paused or archived. Needs "Can manage QR campaigns". |
| Add a printable code to a campaign, labelled by placement. Needs "Can manage QR campaigns". |
| Create an https webhook endpoint, or change its URL and event types, or pause it. The signing secret is not returned: copy it from the dashboard. Needs "Can manage webhooks". |
| Permanently delete a webhook endpoint. Needs "Can manage webhooks" and "Can delete". |
Every change is its own permission on the key, and deletes need "Can delete" as well. Alerts and team management are not available to the assistant.
Security and privacy
A key sees what you see. It has the same read access to your workspace as you do in the dashboard. Treat it like a password.
Revoke it any time under Settings → API keys. It stops working immediately.
It sits in your assistant's config file in plain text. Use a separate key per tool, so you can revoke one without breaking the others.
Your AI provider sees the data you ask about. Reports and recent events (page paths, UTM tags, device and location summaries, any custom event properties you send) are returned to the assistant, so they are covered by that provider's terms. Mitr itself identifies visitors only by hashed identifiers; see how we count visitors without cookies.
Visitor data is marked as untrusted. Page paths, referrers, UTM tags and event properties are written by your visitors, so anyone can put text in them, including text aimed at an AI. Reports and recent events are cleaned of hidden characters and returned inside an
untrusted_dataenvelope telling the assistant to treat them as data, never instructions.No secrets in the conversation.
add_appdoesn't return the new app's SDK secret key, and the webhook tools don't return signing secrets; copy them from the dashboard.The key is only ever sent over HTTPS (plain
http://is accepted only forlocalhost).
Plans
During early access the MCP server works on every Mitr plan, including Free. After early access ends it is part of the paid plans; Free workspaces then get a message pointing to pricing, and upgrading restores access with the same key.
Troubleshooting
Hosted: open https://mcp.mitranalytics.dev/ in a browser; it should show the server version. Local: run npx -y @mitr-analytics/mcp --version in a terminal. If either works, the problem is in the client config.
You see | What to do |
| The |
"Your Mitr API key was rejected" | The key expired, was revoked or was copied wrongly, or you're no longer in its workspace. Create a new one in Settings → API keys. |
"missing the 'apps:write' permission" (or | The key doesn't have that permission. Create one with it ticked to use the tool. |
"early-access period has ended for the Free plan" | Upgrade the workspace; the same key starts working again. |
401 from the hosted endpoint | The |
"Mitr is rate-limiting this key" | Too many requests in a short time. Wait a minute. |
| Install Node.js 18+, then restart the assistant so it picks up the new PATH. |
"Could not reach Mitr" | Check your connection or proxy. Only set |
Configuration
Variable | Required | Default |
| yes | none |
| no |
|
Development
npm install
npm test # builds, then unit tests + an end-to-end stdio test against a stub API
npx @modelcontextprotocol/inspector node dist/index.js # try the tools by hand (set MITR_API_KEY first)Questions or problems: support@mitranalytics.dev
License
MIT
Available Tools
21 toolsadd_appRegister a new app in MitrAInspect
Register a new app/site under your Mitr workspace so it can start receiving tracked events. Returns the new app's siteId. The app's SDK secret key is deliberately not returned: tell the user to copy it from the Mitr dashboard (Integration Hub, the app's card). Needs an API key created with permission to register apps; a read-only key gets a clear error.
Inputs: name (required), platformType (required), platformIdentifier (required).
add_qr_codeAdd a QR code placement to a campaignAInspect
Add one printable code to a campaign, labelled by where it will be placed, e.g. 'Poster, main hall'. Each code is counted separately. Needs qr:write.
Inputs: label (required), campaignId (required).
create_funnelCreate a conversion funnelAInspect
Create a funnel of 2 or more ordered steps (each a page path or a custom event) to measure conversion through. Returns the new funnel. Needs an API key with the funnels:write permission.
Inputs: name (required), steps (required), utmCampaign.
create_qr_campaignCreate a QR campaignAInspect
Create a trackable QR campaign that sends scanners to a destination URL. Add codes per placement with add_qr_code. Returns the new campaign. Free plans allow one active campaign. Needs the qr:write permission.
Inputs: name (required), destinationUrl (required).
create_webhookCreate a webhook endpointAInspect
Send tracked events to an https URL you control. Returns the endpoint, without its signing secret, which is copied from the dashboard. Needs webhooks:write.
Inputs: url (required), eventTypes (required), isActive.
delete_funnelDelete a conversion funnelADestructiveIdempotentInspect
Permanently delete a funnel and its results history. Cannot be undone. Needs both funnels:write and delete permissions. Confirm with the user before calling.
Inputs: funnelId (required).
delete_webhookDelete a webhook endpointADestructiveIdempotentInspect
Permanently delete a webhook endpoint and its delivery log. Cannot be undone. Needs both webhooks:write and delete. Confirm with the user before calling; to pause it instead, use update_webhook with isActive false.
Inputs: endpointId (required).
get_alert_ruleGet the workspace's traffic alert ruleARead-onlyInspect
Get your workspace's traffic-anomaly alert configuration (spike/drop direction, threshold %, notification channel), if one is set. Returns { rule: null } if none is configured.
Inputs: no named parameters.
get_app_reportGet an app's analytics reportARead-onlyInspect
Fetch a 7-day analytics report for one app: active users, KPIs (pageviews, unique visitors) with sparklines, traffic overview, acquisition (referrers/UTM/entry pages), geography, device/browser/OS breakdown, web vitals, and conversions. Structured data meant for you to analyze and summarize, not a canned report.
Inputs: siteId (required).
get_billing_usageGet workspace billing and quota usageARead-onlyInspect
Get your workspace's current plan, subscription status, and quota usage (events used/limit, usage %, apps used/limit). Useful context before recommending changes that would affect event volume or app count.
Inputs: no named parameters.
get_funnel_resultsGet funnel conversion resultsARead-onlyInspect
Compute conversion results for one funnel over a date range: entered/converted counts, conversion rate, and drop-off at each step. Defaults to the last 30 days.
Inputs: funnelId (required), end, start.
get_qr_campaignGet one QR campaignARead-onlyInspect
Get one QR campaign with its codes and per-code scan counts, to see which placement is working. Use the id from list_qr_campaigns.
Inputs: campaignId (required).
get_recent_eventsGet an app's most recent raw eventsARead-onlyInspect
Fetch the most recent raw telemetry events for one app — event type, path, referrer, UTM, device/geo, and custom properties. Useful for spot-checking what's actually being tracked, alongside get_app_report's aggregated view.
Inputs: siteId (required), limit.
get_webhook_healthCheck webhook delivery healthARead-onlyInspect
For each webhook endpoint, show delivery counts by status over its recent deliveries (delivered, pending, failed, exhausted) and the latest failure with its error. Payloads are not returned. Use this when a user says their webhook is not receiving events.
Inputs: deliveriesPerEndpoint.
get_workspace_overviewGet the workspace overviewARead-onlyInspect
Get one summary of the whole workspace: every app's traffic, plus its webhooks, QR campaigns, funnels, and anything that needs attention. Call this first when the user asks how things are doing overall.
Inputs: no named parameters.
list_appsList Mitr appsARead-onlyInspect
List every app/site registered in your Mitr workspace, with each app's siteId (needed by get_app_report and get_recent_events), name, platform, and connection status.
Inputs: no named parameters.
list_funnelsList Mitr funnelsARead-onlyInspect
List every saved conversion funnel in your Mitr workspace, with each funnel's id (needed by get_funnel_results), name, and step definitions.
Inputs: no named parameters.
list_qr_campaignsList QR campaignsARead-onlyInspect
List your QR campaigns with each campaign's id (needed by get_qr_campaign and the QR write tools), name, status, and scan totals. Also returns your plan's QR limits.
Inputs: no named parameters.
update_funnelUpdate a conversion funnelAIdempotentInspect
Replace a funnel's name and steps. This is a full update: send every step, not only the ones that change. Needs funnels:write. Get the funnelId from list_funnels.
Inputs: name (required), steps (required), funnelId (required), utmCampaign.
update_qr_campaignUpdate a QR campaignAIdempotentInspect
Rename a QR campaign, change its destination, or change its status: 'active', 'paused' or 'archived'. Archiving stops the campaign's codes from being created and keeps its history; it is reversible with status 'active'. Needs qr:write.
Inputs: campaignId (required), name, status, destinationUrl.
update_webhookUpdate a webhook endpointAIdempotentInspect
Change a webhook's URL, its event types, or switch it on or off with isActive. Needs webhooks:write. Get the endpointId from the dashboard or the webhook health tool.
Inputs: endpointId (required), url, isActive, eventTypes.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 21 tools
Each tool targets a distinct resource and action: apps (add/list/report/events), funnels (full CRUD + results), webhooks (create/update/delete/health), QR campaigns (list/create/update/get/add_qr_code), plus workspace overview, alerts, and billing. Potentially confusable pairs are explicitly separated in descriptions (get_app_report aggregated vs get_recent_events raw; get_app_report for one app vs get_workspace_overview for all; create_qr_campaign vs add_qr_code). No two tools appear to do the same thing.
Nearly all names follow a consistent snake_case verb_noun pattern with standard verbs (list_/get_/create_/update_/delete_). The only wrinkle is 'add_app' and 'add_qr_code' using 'add' where 'create_' is used elsewhere, but this is a minor and readable deviation.
21 tools is on the higher side, but the server spans five distinct domains (apps, funnels, webhooks, QR campaigns, billing/alerts), so each area only gets a handful of tools. The count is justified by the breadth rather than by redundancy.
Funnels and webhooks have full lifecycle coverage, but apps only have add/list/report — no update or delete app — and the QR surface lacks a way to remove individual codes or delete a campaign outright (only archive via update). Most notably, get_alert_rule exists with no create/update_alert_rule, leaving a described configuration unreachable, and billing is read-only.
Maintenance
Related MCP Connectors
Read-only analytics for all your apps: users, AI traffic, revenue, with the SQL behind every number.
Read-only Google Search Console, Bing, Google Analytics and privacy-friendly analytics for your AI.
Read your events, sales, orders and attendees from your AI assistant. OAuth sign-in, read only.
Ask your AI assistant about your class studio's own numbers. See upcoming classes and how full they are, find the classes that need promoting, and check fill rates, attendance, bookings, cancellations and revenue from classes, gift cards and private events. Read-only, and limited to the studio that connects.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Mender IoT platform for device management, deployment monitoring, and fleet analysis through natural language commands. Provides read-only access to device status, deployment logs, releases, and system monitoring capabilities.2MIT
- AlicenseAqualityCmaintenanceProvides AI assistants with read access to Clamp analytics data including pageviews, visitors, referrers, and custom events. Enables traffic analysis, conversion funnel evaluation, and metric alerts through natural language queries.3317 npm2MIT
- AlicenseBqualityCmaintenanceProvides AI assistants with read-only access to Chatwoot analytics and operational data, including conversations, agents, inboxes, teams, CSAT, and real-time metrics.301MIT
- AlicenseNot gradedqualityCmaintenanceProvides safe, read-only CRM access for AI assistants with per-key scopes, field masking, rate limits, and a full audit log of allowed and blocked actions.MIT