smolanalytics
menu
log inStart trial
collection is solved · reading is not

The analytics MCP server your AI can't fake.

Every tool in this category is a very good pen. None of them is a reader. This one reads your event log back and hands the conclusion to Cursor or Claude Code, and it does not ask you to replace your collector: keep PostHog, GA4, Mixpanel or Plausible where they are. 97 tools, 15 prompts, computed from the same deterministic reports the dashboard renders, on your own model, so the AI is free.

14 days, no card. $19/mo after, 2M events. keep the analytics you already have.
smolanalytics (smolanalytics.com) is the analyst for apps built with a coding agent, and an MCP server is how you reach it. The category claim first, because it decides whether this is for you: collection is solved, solved well and mostly free, and every tool in this category is a very good pen. None of them is a reader. This is the layer that reads your log back every day without being asked, and it does not ask you to replace your collector: keep PostHog, GA4, Mixpanel or Plausible where they are, and bring your history across in one call with the migrate_from tool (a keyed pull from PostHog or Mixpanel over a date range you name, dry-run first, key never stored; Amplitude and Umami arrive as an export file instead, and there is no continuous sync from any vendor). Underneath, it is a single-binary analytics engine that does web and product analytics (visitors, referrers, funnels, retention, paths, cohorts) from one snippet, and exposes all of it to your AI over the Model Context Protocol as 97 tools and 15 prompts. You point Cursor, Claude Code, VS Code, or Windsurf at it and ask your real numbers in plain English from the same window you write code in. The three tools worth knowing by name: investigate returns the whole desk in one call (the most expensive finding, the queue with a status on each, the quarter's movements), backtest replays your history through the same investigator with every finding dated by the day it would first have surfaced, and mark_finding_acted records that you acted on a finding so it upgrades to verified when the metric recovers, the loop closing from your editor. The load-bearing difference from a chatbot pointed at your data is that answers are computed, not generated: each tool returns a value from the same deterministic report the dashboard renders, so the model phrases the reply but never invents the figure. It is bring-your-own-model, and that now covers conversation intelligence too: your own model, already connected over MCP, reads a sample of your agent's conversations (sample_conversations), infers labels like intent, sentiment, or frustration, and writes them back (label_conversation) as append-only events; smolanalytics then counts conversations per label value (agent_labels). The labels are that model's inference, always reported with the model named and with labeled and unlabeled counts beside them; the counts over those labels are computed like every other number here. Because the model is yours, it is free and unmetered on every plan, where the usual approach runs an LLM server-side over every message and bills per message. Every project runs as its own isolated instance, your data exports in one file any time, and nothing phones home. 14-day trial at Pro limits, no card; then from $19/mo.
collection is solved. reading is not.

It runs beside what you already have

Writing events down is solved, solved well, and mostly free. PostHog's collector is excellent, GA4 is already on your page, Plausible is a good pen, and ours is a snippet like everyone else's, so we are inside that kernel too and not above it. Nobody has a collection problem. Every tool in this category is a very good pen. None of them is a reader.

So you remove nothing. Keep PostHog, GA4, Mixpanel, Amplitude, Umami or Plausible switched on, add one snippet, and your agent brings your history across in one call: migrate_from pulls straight from PostHog or Mixpanel with a key you paste, over a date range you name, dry-run first, and a re-run replaces rather than duplicates because the vendor's own event ids come across. The key is used for that one pull and never stored. Amplitude and Umami arrive as an export file rather than a keyed pull.

To be exact about the boundary, because it matters: there is no continuous sync from any vendor and we do not read your PostHog live. The true sentence is that you remove nothing, you add one snippet, and your agent pulls your PostHog or Mixpanel history across in one call. Everything that connects is listed on integrations.

what it is

An analytics backend your AI can call directly

smolanalytics is a single-binary analytics engine that does web and product analytics from one snippet: visitors, referrers, UTM, funnels, retention, paths, and cohorts. On top of that data it speaks the Model Context Protocol, the open standard for connecting AI assistants to external tools. That makes it an analytics MCP server: it publishes your metrics as 97 callable tools and 15 prompts, so the model in your editor can fetch a funnel or a retention curve the same way it calls any other MCP tool.

There are two ways to ask, reading the exact same reports: a plain-english ask bar inside the dashboard, and your own coding agent over MCP for code-aware questions in the window where you already work. What each surface is for is spelled out on how it works, and the term itself is defined on the MCP analytics server glossary page.

the killer differentiator

Why can't the AI just make up your numbers?

Your AI assistant admits it can hallucinate your numbers. This one can't. Three things make the answer trustworthy, and they are the whole reason to use it over a chatbot pointed at a spreadsheet:

  • 1Computed, not generated. Each tool returns a value from the same deterministic report the dashboard renders. The language model phrases the reply, but the figure itself is calculated from your events, never invented by the model.
  • 2Pinned to one computation. A test in the build asserts the answer an assistant gets over MCP equals the number the dashboard shows. If they ever drift apart, the build fails. Your editor and your dashboard can't disagree, by construction. Don't take our word for it, watch the surfaces agree on the proof page →
  • 3Bring your own model, so the AI is free. The AI already in your editor (your Cursor, Claude, or VS Code subscription) does the asking. The MCP server just answers with computed numbers, so there is no second AI bill from the analytics tool.

That is the difference between "the model guessed a plausible number" and "the model read the real number and read it out loud." A bare chatbot can do the first. Only an MCP server backed by computed reports can promise the second.

the three tools worth naming

The whole desk, from your editor

smolanalytics is an investigator, not a query surface, and the MCP surface carries that: you don't have to know which question to ask. Three tools do the heavy lifting:

  • 1investigate returns the whole desk in one call: the single most expensive finding, the queue with a status on each (needs you, watch, fix first, recovered, verified, acted, auto-reverted), the quarter's metric movements with multiple-comparison correction, and an honest below-detection-floor note when your product is too small to call.
  • 2backtest replays your history through the same investigator with the clock moved back: every finding dated by the day it would first have surfaced, so you can see what it would have told you last quarter before you trust it with this one.
  • 3mark_finding_acted closes the loop without leaving the editor: tell it you shipped a fix, and when the metric recovers the finding upgrades to verified, you acted on a date and the metric recovered within N days. Acted but still down says so, honestly.
in your editor
> using smolanalytics, investigate
  1 finding needs you: checkout conversion down 22% since Tue's deploy (correlation, not proof)
> I just shipped a fix for that
  marked acted. I'll report it verified if the metric recovers.

explain_change, fix_brief, and the rest of the report tools are still there when you want one number, and what the desk itself looks like is on how it works.

conversation intelligence

Your model reads the conversations. We count them.

Computed metrics tell you the re-ask rate. They can't tell you what people were asking about. That needs a model to read the words, and the usual answer is to run one server-side over every message and meter you per message. We don't run a model at all. Yours is already connected over MCP, so it does the reading:

  • 1sample_conversations hands your model a sample of whole conversations, your agent_turn events grouped by conversation_id, oldest turn first. Capped and deterministic: same data in, same sample out. Turns only carry text if your app sent a text property, so nothing is invented about what was said.
  • 2label_conversation writes its inference back, one label set per conversation (intent, sentiment, frustration, whatever you asked about). It appends a new agent_label event; nothing already recorded is ever mutated. Naming the model that labeled it is required.
  • 3agent_labels counts conversations per label value. This part is computed deterministically from your event log, so GET /v1/agent/labels, the MCP tool, and the dashboard cannot disagree.
in your editor, on your own model
> using smolanalytics, sample my agent's conversations and label them by intent
  read 20 conversations, wrote 20 agent_label events (labeled_by: your model)
> what are people asking my agent about?
  intent: billing 41 · bug report 22 · pricing 9 · 31 conversations still unlabeled

Keep the split straight, because we do: the label values are that model's inference, and every result names the model that wrote them alongside how many conversations are labeled and unlabeled, so a guess is never dressed up as a measurement. The counts over those labels are computed, same engine as every other number. And because the model is one you already pay for, this is free and unmetered on every plan.

how to connect

One connection operates your whole org

There is one connection, not one per project. Settings hands you an organization API token pointed at smolanalytics.com/api/mcp; paste that single copy block into your editor and you are wired. From there your agent provisions new analytics with create_project (no browser) and queries or manages any project by passing project="<name>" to any tool, which routes to that project's own instance for you. The secret read key stays server-side, so you never handle a key, and the token persists, set it up once:

one org connection (Claude Code shown)
claude mcp add --transport http smolanalytics https://smolanalytics.com/api/mcp \
  --header "Authorization: Bearer <your-org-token>"
# then: "using smolanalytics, create_project acme" or
#       "what's the signup to paid conversion for project acme?"

Scope the token to a single project with ?project=<id> or to reports only with ?read_only=true.

From there you ask your metrics in the same window you write code, and the 97 tools and 15 prompts are identical in every editor. Exact per-editor config is in the docs, and the Cursor / Claude walkthrough is on the Cursor page.

what you can ask

Ask it like you'd ask a data person

Your analytics questions arrive while you write code, not while you stare at a dashboard. So ask them where you already are:

The 97 tools cover funnels, retention, paths, cohorts, channels, agent tool-call and conversation health, the sample-and-label loop above, and the investigation itself: investigate for the whole desk in one call, and what to fix first; the 15 prompts are ready-made investigations you can trigger by name. See the full list on every feature.

try it

Ask a populated instance right now

The dashboard, ingestion, and the MCP server are all one engine: no Kafka, no ClickHouse, no Postgres, which is why every project gets its own isolated instance. The live demo is a populated instance you can ask right now, no account. When you want your own, the 14-day trial provisions one in about a minute, no card.

Common questions

Do I have to replace the analytics I already run?
No, and this is the point of the whole thing. Collection is solved: writing events down is solved, solved well and mostly free, and our snippet is one like everyone else's. Keep PostHog, GA4, Mixpanel, Amplitude, Umami or Plausible exactly where they are; this runs beside them and reads the log back. Your history comes across in one call your agent makes: migrate_from is a keyed pull from PostHog or Mixpanel over a date range you name, dry-run first, idempotent on their own event ids, and the key is used once and never stored. Amplitude and Umami come across as an export file rather than a keyed pull. There is no continuous sync from any vendor, and we do not read your PostHog live.
PostHog ships a reader too, and it is free. Why this one?
Theirs is real and it is good, and if you are all-in on PostHog you should use it. The distinction is not quality, it is ownership: it reads PostHog. A reader owned by a collector exists to keep you on the collector, so it will never make your Amplitude or your GA4 better, and it can never be the reason you do not have to move. If you are not already there, free is not a price you can pay, because the price is a migration. This is the reader that is not owned by a collector, which is why it can sit on a log you collected somewhere else.
What should I run first on the trial?
The editor path. Bring last quarter across with migrate_from, then call backtest and read what it would have told you, dated, with the detection lag printed beside each finding. Both are MCP tools running on the model you already pay for, so both work throughout the 14-day trial. The model-routed ask bar in the dashboard draws on a paid plan's AI allowance, so it is not the surface to judge the product on in week one.
What is an analytics MCP server?
It is an analytics backend that speaks the Model Context Protocol, the open standard for connecting AI assistants to external tools and data. Instead of copying numbers into a chat, your assistant queries the server directly, so you ask about your traffic, funnels, and retention in plain English from Cursor or Claude and get answers computed from your real data. smolanalytics is one: a single Go binary exposing 97 tools and 15 prompts.
How is this different from just pasting my data into a chatbot?
A chatbot pointed at a spreadsheet formats whatever it can guess. smolanalytics returns values computed from the same deterministic reports the dashboard renders, so the language model phrases the answer but never invents the figure.
Whose AI runs the queries, and what does it cost?
Your own. smolanalytics is bring-your-own-model: the AI already in your editor (your Cursor, Claude, or VS Code subscription) does the asking, and the MCP server just answers with computed numbers. There is no separate AI bill from the analytics tool. You pay for the analytics instance, and asking it questions is never metered.
How do I connect my editor to it?
It is one connection that operates your whole org. Settings gives you an organization API token pointed at smolanalytics.com/api/mcp; paste that one copy block into whatever AI you use (Claude Code, Cursor, Windsurf, VS Code / Copilot, Cline) and you are done. From that single connection you provision new analytics with create_project and query or manage any project by passing project="<name>" to any tool, which routes to that project's own instance for you. The secret read key stays server-side, so you never handle a key or wire a second server, and the token persists, set it up once. Scope it to one project with ?project=<id> or to reports only with ?read_only=true. You ask your metrics in the same window you write code, answered by your model over MCP with 97 tools and 15 prompts.
Am I locked in?
No. Your data exports in one file, any time: JSONL that round-trips, one curl. Every project runs as its own isolated instance, and nothing phones home. The trial is 14 days with no card; after that plans start at $19/mo, and the MCP surface is in every plan, never metered separately.
What can I actually ask it?
Anything the reports cover: "what's my signup to paid conversion, and how long does it take?", "did activation improve since we shipped onboarding?", "what's the retention curve for users from the blog?", "which channel brings the users that stick?". If what you built is an AI agent, also "which of my tools is slowest and errors most?", "what's my re-ask rate?", and "what are people actually asking my agent about?". Or skip the question and call investigate: the whole desk in one call, findings, causes, costs, and the quarter's movements. The 97 tools cover funnels, retention, paths, cohorts, channels, agent tool-call and conversation health, backtest to replay your history, and mark_finding_acted to close the loop on a finding; the 15 prompts are ready-made investigations you can trigger by name.
Can it tell me what people are actually asking my agent about?
Yes, and your own model does the reading. Call sample_conversations and it returns whole conversations (your agent_turn events grouped by conversation_id, oldest turn first, a capped deterministic sample). Your model reads them, infers a label per conversation, and calls label_conversation to write that inference back as a new append-only agent_label event; nothing already recorded is ever mutated. Then agent_labels counts conversations per label value, so you get "billing 41, bug report 22, pricing 9" for a label like intent. Be precise about the split: the label values are your model's inference, and every result names the model that wrote them plus how many conversations are labeled and unlabeled, so an inference is never read as a measurement. The counts over those labels are computed deterministically from your event log, so GET /v1/agent/labels, the agent_labels tool, and the dashboard cannot disagree. Because it runs on the model you already pay for, it is free and unmetered on every plan. We never run a model over your conversations.
keep reading
Start the 14-day trial
no credit card · then from $19/mo