Docs / Tool tracking
Tracking tool calls
The one script tag that shows which WebMCP tools agents actually use, and the honest limits of it.
Optional. It only tells you anything if your site offers WebMCP tools, and it is not needed for checks or alerts, which work from the moment you add a site.
Why a script, and only a script
A WebMCP tool call happens inside the agent's browser, against JavaScript already running on your page. Your server is never involved, so no log, CDN or analytics product can see one. A page script is the only thing that can.
The same constraint applies in reverse: everything else an agent does is invisible to a page
script. A request for /.well-known/ucp is a plain fetch of a JSON file, with no page and no
browser involved. An agent refused by a bot rule never loads a page at all. Neither is collected,
and neither appears as an empty chart.
Installing it
One line before the closing </body> tag, on any page that registers tools:
<script src="https://orbilo.co/js/webmcp-telemetry.js" data-site-key="YOUR_SITE_KEY" defer></script>
Your site key is on the site's tracking page in Orbilo.
The key is public
It appears in your page source, where anyone can read it. Its only capability is reporting tool calls for one site: it cannot read data and it reaches no other part of your account.
The sole risk is a third party submitting fabricated tool calls against your site. Rotate the key if that happens.
What it records
Three things per call:
- which tool was called
- whether it succeeded or threw
- how long it took
The error count is the most useful of the three. A tool that agents call frequently and that throws every time produces no server error, no failed request and no analytics entry, so it appears in no other system you run.
What it does not record
Arguments are never recorded, and this is not configurable. Arguments carry customer data — a search query, a delivery address, a cart — and collecting them would make Orbilo a processor of that data without a corresponding benefit.
No visitor data is recorded: no address, no user agent, no cookie, no fingerprint. Calls are grouped into visits by the hour. That is sufficient to prevent one agent calling a tool forty times from registering as forty arrivals, and too coarse to identify an individual.
How it finds your tools
It wraps both registration shapes in use: registerTool and provideContext. It matches on the
registration call and the context object independently, rather than on the literal string
navigator.modelContext, because minifiers routinely alias navigator and a correct implementation
frequently never contains that string.
Wrapping is transparent. A tool returning a promise still returns a promise, a synchronous tool stays synchronous, and errors still reach your own handler after being recorded. The snippet observes; it does not alter behaviour.
Tools registered after page load, or conditionally, are still captured, because the snippet watches the calls rather than taking a snapshot.
Delivery
Calls are batched and sent with sendBeacon, which the browser delivers in the background and
completes even if the visitor navigates away mid-request. It does not block anything and does not
delay page unload.