v0.1 · MCP-first

Analytics
your agent
can query.

Abner is a privacy-first analytics primitive for the LLM era. Drop a 2 KB script, connect Claude or Cursor over MCP, and ask your data anything.

$ claude mcp add --transport http abner https://mcp.abner.app/mcp
2 KB tracker Cookieless · GDPR OAuth 2.1 + DCR 4 tools, growing
claude · session abner · mcp
top pages on abner.app last week?
→ calling list_sites …
→ calling query_metrics(site_id, [pathname], 7d) …
┌────────────────────────┬────┬─────┐
pathname v pv
├────────────────────────┼────┼─────┤
/dashboard/ 56 550
/ 44 49
/live-feed/ 22 43
/docs/mcp/ 14 18
└────────────────────────┴────┴─────┘
Your /dashboard is the obvious driver — 550 pageviews from 56 visitors. Worth digging into where they came from?

A real conversation. No mockup.

// three steps

From zero to "hey claude, how did we do this week?" in five minutes.

01 install

Drop a tracker.

A 2 KB cookieless script. No consent banner. Works behind your own subdomain via Cloudflare.

<script defer
  data-site="abc123"
  src="https://www.abner.app/abner.js">
</script>
02 authorize

Connect your agent.

OAuth 2.1 with PKCE and dynamic client registration. Works with Claude Code, Claude Desktop, Cursor, and anything that speaks MCP.

# one command, browser opens for consent
claude mcp add \
  --transport http \
  abner https://mcp.abner.app/mcp
03 ask

Query in plain English.

No SQL. No dashboard. The agent picks the right tool, joins what it needs, narrates the answer.

"Compare visitor trends across all my sites for the last two weeks and tell me which one's slipping."

// the surface

Four tools.
One scope.
Read-only.

Designed to be picked up by an LLM in one take. No knobs the model has to guess. Each tool returns structured JSON the agent can pivot, filter, or chart.

full reference
list_sites no args

Every site the user can read, across every workspace.

query_metrics swiss army

Visitors, pageviews, sessions — grouped by any dimension, filtered by anything, over any preset window.

query_realtime live

Active visitors in the last five minutes plus a stream of recent events.

query_vitals p75

LCP, FID, CLS, FCP, TTFB, INP — at the 75th percentile, exactly the way Web Vitals reports them.

// for builders

An engine, not a dashboard.

Abner doesn't try to be the last-mile UI. We collect the events and expose them through one well-designed API. You — or your favorite agent — build whatever the moment calls for.

// example

Scriptable end to end.

Every metric is one curl away. Pipe your analytics into cron jobs, CI checks, or a Claude session — no dashboard clicking required.

curl -H "Authorization: Bearer $KEY" \
  api/v1/stats?period=7d | jq .visitors

// example

Hosting platforms.

Resell native analytics to your customers. Workspaces, OAuth, multi-tenant — all already there.

your.app/sites/:id/analytics
powered by abner

// example

Standalone agents.

A Slack bot that answers "how was last week?" every Monday. A weekly digest emailer. A dashboard your CEO actually opens.

cron + claude + abner
= weekly_brief()
// or just call it from code
# python — using mcp client
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession

async with streamablehttp_client("https://mcp.abner.app/mcp") as (read, write, _):
    async with ClientSession(read, write) as session:
        await session.initialize()
        result = await session.call_tool(
            "query_metrics",
            {"site_id": site_id, "metrics": ["visitors"], "period": "7d"},
        )
        print(result.structuredContent)

// privacy

Built to be
boring to lawyers.

no cookies

No tracking cookies, no fingerprinting, no consent banner. The script doesn't set anything in storage.

no PII

Visitor identity is a daily-rotating salted hash. No raw IPs are stored. No emails, no names.

data lives in the EU and US

GDPR compliant by construction. CCPA compliant. SCCs available on request.

// next step

Spend an afternoon
building with us.

A free tier so you can try it. Real billing when you're ready. No surprises in between.