MCP for AI clients
Point Claude, Cursor or any MCP client at Zowar and it can read your analytics as tools.
What this is
MCP (Model Context Protocol) is a standard way for an AI client to call an application’s features as tools. Connect one to Zowar and it can list your sites, read the funnel, walk a single visitor’s timeline, and pull your optional Google figures when enabled — answering questions in your own words instead of you assembling the numbers by hand.
It is not a looser second door. Every tool call is dispatched as an ordinary request through the same application, carrying your API key, so routing, authentication and tenant scoping run exactly as they do over HTTP. A tool can never see something the key could not fetch directly.
The endpoint
POST https://pulse.ninee.studio/api/mcpA stateless Streamable-HTTP JSON-RPC 2.0 endpoint. It is POST-only — a GET returns 405, since there is no server-to-client stream to open — and it does not accept batched arrays; send one message per request.
Connect a client
Create a key
Site settings → API keys. Leave Allow writes unticked unless you want the agent to be able to change lead statuses.
Add the server
In Claude Code, one command:
claude mcp add --transport http pulse https://pulse.ninee.studio/api/mcp \ --header "Authorization: Bearer pulse_sk_..."Or, in a client that takes JSON configuration:
{ "mcpServers": { "pulse": { "type": "http", "url": "https://pulse.ninee.studio/api/mcp", "headers": { "Authorization": "Bearer pulse_sk_..." } } } }Ask it something
“Which channel produced the most leads on ninee.studio last month?” or “Show me what the visitor who submitted the contact form yesterday actually did.” The client picks the tools; you never name them.
The tools
| Tool | What it answers |
|---|---|
pulse_list_sites | Which sites this key can read. Start here — everything else needs a site_id. |
pulse_overview | Headline numbers, daily traffic, top pages and channels |
pulse_funnel | Impressions through to leads, for one channel or several |
pulse_events | Every event type, including everything autocapture records |
pulse_geography | Visits by country and city |
pulse_visits | Individual visits — the tool for questions about people, not totals |
pulse_visit | One visit in full, action by action, with the gaps between |
pulse_journey_map | Where visits start, go next, and stop — and where the leavers went |
pulse_realtime | Who is on the site right now |
pulse_leads | Leads with their attribution |
pulse_search_console | Google Search impressions, clicks, queries |
pulse_ads_spend | Google Ads cost and clicks per campaign |
pulse_ads_keywords | Keywords bid on vs search terms typed, with cost per conversion |
pulse_google_analytics | GA4 figures, reported separately from Zowar's own |
pulse_update_lead | Change a lead's status or note — needs a write key |
Every tool but the last is marked read-only, so a client that distinguishes them will say which calls can change anything. A read-only key is refused by the underlying route, not by a check in the MCP layer that could be forgotten on the next tool.
When it does not connect
- -32001 from every call
- No key, a revoked key, or the header did not reach the server. initialize deliberately answers without one, so a working handshake proves nothing about auth.
- isError on one tool
- The call ran and the API refused it — the reason is in the tool's own output. This is not a broken connection.
- 405
- The client sent GET. Zowar is POST-only.
- -32600
- The client batched messages. Send one per request.