See what AI agents do on your website.
Which assistants send you visitors, which agents read your pages, which of your MCP and WebMCP tools they call, and whether they get to the goal.
One line of script. No cookies, no personal data, no ad or social trackers.
Cloud (free pilot) · Docs · Live demo · Self-host · API and MCP · Deutsch
Your analytics counts people. It does not see the visitor ChatGPT sent you, the page ClaudeBot fetched at 3 a.m., or the book_table tool an assistant called inside your customer's browser. Agent Tracking does. It is analytics for the third kind of visitor: the AI agent that reads, reasons and acts on your site, whether it arrives as a crawler, as a live fetch on behalf of a user, or as an assistant driving your MCP and WebMCP tools.
You install one line:
<script defer data-domain="example.com" src="https://agenttracking.co/agent.js"></script>and get four views: Overview, Agents, Tools, Pages. Plus the same numbers as JSON and as an MCP tool, so your own agents can read them.
| Layer | What is measured | Where it comes from |
|---|---|---|
| AI referrals | A person arrives from chatgpt.com, perplexity.ai, claude.ai, copilot.microsoft.com, gemini.google.com and a dozen more; which assistant, which landing page, how the share moves week over week | Referrer and utm_source, matched against a published, versioned list |
| AI fetches | GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot, Google-Extended, Applebot-Extended, Bytespider, CCBot and the rest: who reads what, how often, with a trend | The snippet for agents that run JavaScript; your server log for the ones that do not, each line verified against the vendor's published IP ranges, and grouped into fetch bursts (one agent, many pages, a few seconds: what a query fan-out looks like from your side) |
| Tool calls | Every MCP and WebMCP tool on your site: calls, duration, success rate, error classes, argument key names, the tools nobody ever calls, and the moment a tool call reaches a goal you marked | The snippet wraps navigator.modelContext and document.modelContext and watches declarative <form toolname> elements. Nothing to change in your code |
| Conversions | Whether agents complete the thing the site is for: a booking, an order, a signup | data-agent-goal on any element, or a tool call marked as a goal |
| Manifest | Your /.well-known/webmcp manifest, hashed once per visit, so you notice when it changes |
The snippet; Pro accounts get an email |
And, beside the numbers, the site's Agent Readiness Score from webmcp-tool.com: how well the site itself can be used by agents, next to how much it actually is.
The name is shared with other things. Agent Tracking is AI agent analytics for websites: it measures agents other people run when they visit your site. It is not
- LLM observability or tracing (AgentOps, LangSmith, Langfuse, OpenTelemetry for LLM apps): those trace the agents you build, from inside your code. Complementary, not the same.
- call-centre or support-agent workforce tracking, field-sales or GPS tracking, or parcel and air-waybill tracking: nothing here records people, locations, shifts or shipments.
- a bot blocker: it measures and never blocks. The only request it makes to your site is one fetch of the homepage to verify the snippet.
Agents already decide which sites get cited, read and used. Most sites have no idea what agents do on them. Four steps, repeated:
- Measure every agent and every action: referrals, verified fetches, bursts, tool calls, goals. Actual events, agent named.
- Understand how MCP and WebMCP agents behave: which pages a crawler takes and how fast, which tool an assistant tries first, where it fails, which argument keys it sends, whether it reaches the goal.
- Fix the site, the tools, the manifest: rename the tool agents keep missing, fix the error class behind half the failures, open the page every fan-out lands on.
- Verify with the readiness score and real usage side by side. When both go up, you are winning.
Every number is an MCP tool. Point the agent you already use at it and ask in words:
| From | How |
|---|---|
| Claude Desktop and Claude Code | Add the MCP server with your token and ask: "Which agents read our site this week, and which tool failed most?" |
| ChatGPT connectors and custom GPTs | The same endpoint as a connector; your GPT answers from your own agent data. |
| Cursor, Codex, Hermes, OpenClaw, any MCP client | One JSON block in the client config (below). The agent that writes your code can read how agents use the result. |
| Scripts and BI | GET /api/stats as JSON, CSV export, a Monday digest mail. |
Questions that work: "Which of our WebMCP tools has the worst success rate, and what is the top error?", "Did any fetch burst look like a Perplexity fan-out on the pricing page?", "How many agent conversions did we have in the last 30 days, compared to the 30 before?"
- Marketing and GEO teams: which assistants send visitors and which pages they cite, week over week. The number generative engine optimisation was missing.
- Developers publishing MCP and WebMCP tools: production analytics for your tools. Calls, success rate, duration, errors, the tools nobody uses.
- Agencies: unlimited sites on the Agency plan, a public stats page per client, a white-label badge, one API token for your reporting.
- European companies: no consent banner, no transfer, a DPA on adding the site, hosting in Germany or your own server.
Every tool on the market measures one of two things: people (Google Analytics, Plausible, Matomo) or crawlers (Cloudflare AI Audit, bot managers, log analyzers). Neither can see an agent that has already got past the door and is using your site: calling a tool, filling a form, finishing a booking on someone's behalf. That is the layer where the money and the risk are, and it is the layer nobody was measuring. Agent Tracking was built for it.
| Agent Tracking | Web analytics | CDN bot audit | Log analyzers | AI referral SaaS | |
|---|---|---|---|---|---|
| AI referrals attributed to the assistant | ✅ | partly | ❌ | ❌ | ✅ |
| Crawler fetches, verified against vendor IP ranges | ✅ | ❌ | ✅ | partly | ❌ |
| Fetch bursts (query fan-outs) | ✅ | ❌ | ❌ | ❌ | ❌ |
| MCP and WebMCP tool calls, success, errors, duration | ✅ | ❌ | ❌ | ❌ | ❌ |
| Agent conversions (goals reached by agents) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Manifest change alerts | ✅ | ❌ | ❌ | ❌ | ❌ |
| Readiness score beside the usage | ✅ | ❌ | ❌ | ❌ | ❌ |
| Works without a CDN or proxy in front of the site | ✅ | ✅ | ❌ | ✅ | ✅ |
| No cookies, no IP stored, no consent banner needed | ✅ | some | n/a | ❌ | rarely |
| Data stays in the EU | ✅ (server in Germany) | depends | ❌ | ✅ | ❌ |
| Numbers available as JSON and as an MCP tool | ✅ | API only | ❌ | ❌ | API only |
| Open source, self-hostable, one file to back up | ✅ | some | ❌ | ✅ | ❌ |
The comparison names categories, not vendors, because products change. Check any one of them against the rows above; the middle five rows are the ones you will not find elsewhere.
- GDPR by construction, not by banner. No cookies, nothing written to the device, no network address stored, no fingerprint. The session id is a hash of a random value that changes every day, so yesterday's rows cannot be linked to today's. Tool arguments are recorded as key names, never values. Raw events are deleted after 90 days. This is why the snippet runs without a consent dialog.
- Hosted in Germany, with a data processing agreement you conclude by adding a site. The DPA (German: AVV) names the sub-processors, includes the EU standard contractual clauses, and describes the processing exactly as the code does it. Your data protection officer can read the source.
- Documentation and dashboard in English and German, legal pages in both, English binding.
- Self-hostable in ten minutes when data must not leave your own infrastructure. One Node process, one SQLite file, AGPL-3.0. What the cloud does, your server does.
- Know who sends you business. "Perplexity referred 40 visitors this week, ChatGPT 12, and they land on the pricing page." That is a channel you can now optimise, and a number you can show to whoever asks whether AI matters for your site.
- Know who reads you and what they take. GPTBot fetching 400 pages a night is training. ChatGPT-User fetching 3 pages in 4 seconds is a person asking a question about you right now. The Agents view tells them apart; the bursts tell you which question.
- Know whether your tools work for agents. You published MCP or WebMCP tools. Are they called? Do they fail? Which error? How long do they take? Which ones has no agent ever touched? The Tools view is the only place this exists.
- Know whether agents finish. A tool call is not a sale. Mark the goal and see the conversion rate of agents, separately from people.
- Monitor machine behaviour on your site. Verified fetches, unverified impostors claiming to be a known bot, bursts, manifest changes: the operational picture of what non-humans do to your site, every day, in one place.
- Give the numbers to your own agents. A bearer token and one MCP tool, and Claude, ChatGPT or Cursor can answer "which agents read our site this week?" from your data.
Cloud, about a minute. Sign in with an email address at agenttracking.co, add your domain, paste the line above on every page, press verify. The first agent shows up in the dashboard when it arrives. Tools you register through navigator.modelContext are picked up automatically; declarative tools are forms with a toolname:
<form toolname="book_table" tooldescription="Book a table for a date and party size." action="/book" method="post">
<input name="date" type="date" required>
<input name="guests" type="number" min="1" required>
<button type="submit" data-agent-goal="table_booked">Book</button>
</form>Crawlers that do not run JavaScript (most of them) come from your server log: upload it on the settings page, or let a cron send it daily with the API token. Whole files are fine; lines already imported are skipped.
curl -sS -X POST https://agenttracking.co/api/logs/example.com \
-H "Authorization: Bearer wmt_your_token" \
-H "Content-Type: text/plain" --data-binary @/var/log/nginx/access.logFree during the pilot: 1 site, 10,000 agent events a month, 30 days of history, no card. Plain page views are never counted. Paid plans (more sites, a year of history, manifest alerts, white-label badge) open when the product has earned them; nothing about an account changes without 30 days' notice.
Requirements: Node 22.13 or later (for node:sqlite) or Docker, and a Brevo API key for sign-in mails. One process, one SQLite file, no other service.
git clone https://github.com/shufflethis/agent-tracking.git && cd agent-tracking
cp .env.example .env # SITE_ORIGIN, UNLOCK_SECRET, BREVO_API_KEY, LEGAL_*
docker compose up -d # app on 127.0.0.1:3000, data in ./data, cron service includedPut a TLS-terminating proxy (Caddy, nginx, Traefik) in front on the host you set as SITE_ORIGIN. Without Docker:
npm ci && cp .env.example .env.production && npm run build && npm start
# cron: npm run cron:nightly (daily), npm run cron:logs (every 15 min), npm run cron:digest (weekly)Everything is configured through the environment; see .env.example. The ones that matter:
| Variable | What it does |
|---|---|
SITE_ORIGIN |
Where this installation answers. The snippet posts here; mails link here. |
UNLOCK_SECRET |
Signs sessions and sign-in links. 32 random bytes. |
BREVO_API_KEY, MAIL_FROM_EMAIL |
Sign-in links and digests. The sender must be verified in Brevo. |
LEGAL_NAME, LEGAL_ADDRESS, LEGAL_EMAIL, ... |
The entity on the imprint, privacy notice, terms and DPA. These pages are templates. Set your own entity; once LEGAL_NAME is set, none of the cloud operator's details are used. |
CHECK_ORIGIN |
The readiness score beside the numbers, from webmcp-tool.com. Empty disables it. |
LOG_IMPORT_SOURCES |
path=domain pairs for server logs on the same machine. |
STRIPE_* |
Only if you sell plans. Absent means every account is Free. |
Plan limits live in lib/tracking/plans.ts. deploy/ holds the systemd unit, nginx vhost and crontab the cloud uses.
Every number in the dashboard is available as JSON, read-only, daily totals only, with one token per account from the settings page:
curl -s "https://agenttracking.co/api/stats/example.com?days=30" -H "Authorization: Bearer wmt_your_token"The answer carries totals, the previous period for trends, the day series, agents with share and trend and verification, tools with success rate and average duration, the busiest pages, and recent bursts. GET /api/stats lists the sites the token can read; GET /api/export/{domain} gives CSV.
The same data as an MCP tool, for the agents you already use:
{ "mcpServers": { "agent-tracking": { "url": "https://agenttracking.co/api/mcp", "headers": { "Authorization": "Bearer wmt_your_token" } } } }Then ask: "Which agents read example.com this week, and which tool failed most?" The client calls get_agent_stats. A client that cannot set headers passes the token as the tool's token argument.
browser on your site ──agent.js (4.5 KB)──▶ POST /api/event ──▶ classify (referrer, UA, list v2026-09-08)
server log ──upload or cron──▶ POST /api/logs ──▶ verify against vendor IP ranges, detect bursts
│
SQLite: raw events (90 days) + daily totals
│
dashboard · /api/stats · MCP get_agent_stats · weekly digest · CSV export
snippet/agent.src.js: the tracker. Batches events, sends them withsendBeacon, wraps the model context API, watches forms and goals. Built topublic/agent.js; a test keeps it under 5 KB.lib/tracking/: classification, storage (node:sqlite, aggregation at write time), the four views, the stats API, log import, crawler IP ranges, digest.app/api/: ingest, sign-in by magic link, sites, tokens, logs, stats, export, MCP, billing.scripts/: the nightly run (prune, refresh IP ranges, monthly re-score, manifest alerts), log import, weekly digest, encrypted backup.
Classification is server-side and versioned in one file. Missing an agent? Open a pull request against lib/tracking/ai-sources.json with a link to the vendor's documentation of the user agent or referrer. Contributions welcome; see CONTRIBUTING.md.
npm ci
npm run snippet # snippet/agent.src.js -> public/agent.js
npm test # node:test via tsx, includes the size check
npm run typecheck
npm run devAgent Tracking began as a feature of webmcp-tool.com, the Agent Readiness Score, and was split out in September 2026 so it can be open source and run anywhere. Sites that installed the snippet from the old host stay verified.
AGPL-3.0-only. Copyright (c) 2026 FINAL MASTER LLC and contributors. Running a modified version as a network service means offering its source to its users; the full text is in LICENSE. The hosted service at agenttracking.co is governed by its terms.