invisit serves a remote Model Context Protocol endpoint, so an assistant can read your analytics, investigate them, and, if you allow it, change content and settings for you.
https://app.invisit.dev/mcpIt speaks MCP 2026-07-28 (stateless, one POST per message) and still answers clients on the 2025 protocol.
Connect
Add the address as a remote MCP server in your client. There is no key to paste. The client opens invisit in your browser, you sign in as usual, and a consent screen names the app and what it asks for. Allow, and it is connected. The dashboard shows the same steps, with the address filled in, under Account → Connected apps.
Claude Code
claude mcp add --transport http invisit https://app.invisit.dev/mcpThen run /mcp in Claude Code and pick invisit to sign in.
Codex
codex mcp add invisit --url https://app.invisit.dev/mcpCodex sees that invisit signs in with OAuth and opens the browser right away. codex mcp login invisit signs in again later.
Cursor
Add invisit to Cursor. Cursor asks before it installs; then open its MCP settings and sign in to invisit. To add it by hand, put this in ~/.cursor/mcp.json:
{
"mcpServers": {
"invisit": { "url": "https://app.invisit.dev/mcp" }
}
}Other clients
Add https://app.invisit.dev/mcp as a remote MCP server over HTTP (streamable HTTP). A client that cannot sign in with OAuth uses a personal token instead.
What you grant
What the app may do is what you grant on the consent screen:
- Read (
mcp:read): your sites’ analytics, revenue, visitor feedback and site configuration. - Write (
mcp:write): timeline notes, funnels, short links and link domains, event rules, feedback status and the public dashboard. On by default; you can switch it off. - Manage (
mcp:manage): creating sites and changing their settings, domains and tracker features, alert triggers and channels, and revoking API keys. Off unless you switch it on.
Every call is limited twice: by your workspace role and by what you granted. A viewer connected with manage still only reads; an owner connected read-only cannot write.
Some things have no tool at all, whatever you grant, and stay in the dashboard: deleting a site, workspace or account; changing members, roles, invitations or ownership; billing; and anything that shows or takes a secret, such as creating API keys, adding alert channels, setting a share password or connecting a payment provider. A secret never passes through the conversation with your assistant.
Connected apps are listed under Account → Connected apps. Disconnecting revokes the app at once.
Clients without OAuth
Headless agents, CI jobs and scripts that can only send a fixed header use a personal token, from Account → Connected apps → Personal tokens. Pick read, write and manage as on the consent screen, and when it expires. The secret is shown once.
URL: https://app.invisit.dev/mcp
Header: Authorization: Bearer invisit_mcp_…A personal token acts as you exactly as an OAuth connection does. Prefer OAuth when the client supports it: nothing long-lived is stored in the client.
Tools
The tool list follows the grant: a read-only connection never sees tools it could not use. Reports take site_id (from list_sites; a site name, slug or domain also resolves) and a window: period (today, yesterday, 7d, 30d by default, 90d, 6mo, 12mo, month, last_month, year) or from and to dates, in your account’s timezone unless a timezone is given. Tools that change something take the site_id itself.
Each tool does one thing and says so in its annotations, so your client knows which ones only read (and can run without asking), which ones only add, and which ones replace or remove something (and should ask you first). Tools whose effect reaches past invisit, such as a public short link, a public dashboard or a test message to Slack, are marked as such too.
Read
| Tool | What it does |
|---|---|
list_sites |
The sites you can see, with ids, domains, workspace, your role and whether data arrives. |
get_site |
One site’s configuration and health. The first stop when data looks missing. |
get_overview |
Visits, pageviews, events, bounce rate and visit duration against the previous window. |
get_timeseries |
Visits and pageviews, or one custom event, per hour, day or week, with timeline notes. |
get_breakdown |
Top values of one dimension: pages, sources, UTM fields, geography, devices, custom events, crawlers, links and more. |
run_funnel |
Conversion through pages or custom events, or a saved funnel, optionally split by source, country or device. |
get_web_vitals |
LCP, INP, CLS, FCP and TTFB by device, or the worst pages, countries or browsers for one metric. |
get_realtime |
Who is on the site now and the latest events. |
list_visits |
Individual visits over any period, newest first, or one visit step by step at any age. |
get_revenue |
Gross, refunds, fees and net revenue against the previous window, per day, or the latest transactions. |
list_feedback |
What visitors wrote in the feedback widget. |
list_links |
The site’s short links with their clicks in the last 30 days. |
get_link_clicks |
Clicks per link, or one link’s clicks by referrer, country, device and more. |
list_link_domains |
Custom short link domains and the DNS records they still need. |
list_event_rules |
Event rules and their versions. |
get_heatmap |
Pages ranked by clicks, or one page’s most clicked elements and how far visitors scrolled. |
list_workspaces |
Your workspaces and your role in each. |
list_workspace_members |
A workspace’s members and roles, and its open invitations. |
Write
| Tool | What it does |
|---|---|
create_annotation, update_annotation, delete_annotation |
Timeline notes. |
create_funnel, update_funnel, archive_funnel |
Saved funnels. |
create_link, update_link, archive_link |
Short links. |
add_link_domain, verify_link_domain, remove_link_domain |
Custom short link domains. |
create_event_rule, update_event_rule |
Custom events from clicks, form submits or page views, saved as draft versions. |
publish_event_rule, archive_event_rule |
Make a version the one the tracker runs (an earlier one is republished), or stop it. |
set_feedback_status, delete_feedback |
Resolve, reopen or delete feedback. |
update_public_dashboard |
Turn the public dashboard on or off and choose what it shows. |
Manage
| Tool | What it does |
|---|---|
create_site, update_site |
Add a site, or change its name, domains, currency and tracker settings. |
update_alerts |
Turn alert triggers on or off, or mute alerts until a time. |
test_alert_channel, delete_alert_channel |
Send a test message through an alert channel, or remove one. |
list_api_keys, revoke_api_key |
See a site’s API keys (never their secrets) and revoke one. |
Filters narrow every visit report: referrer_domain, utm_source, utm_medium, utm_campaign, utm_content, utm_term, country, city, device_type, browser, os, hostname, entry_page_path and page_path. “Visitors from Hacker News on mobile” is { referrer_domain: "news.ycombinator.com", device_type: "mobile" }.
Results are compact text tables. The tool list costs about 6k tokens read-only, 10.5k with write and 12k with every grant, once per session; a typical call is 60 to 300.
Charts
In assistants that show MCP Apps, such as Claude on the web and desktop, ChatGPT and VS Code, reports come with the dashboard’s own view beside the answer: headline numbers with their change, traffic over time with your timeline notes, funnels, ranked sources and pages, heatmaps with scroll reach, web vitals per device and revenue. Open takes you to the same screen in the dashboard. Other clients get the same answer as text. The view is drawn from the report itself, loads nothing from elsewhere, and costs your assistant no extra tokens.
Limits
An assistant is held to the same limits as an API key: 50 requests a minute (RateLimit-* headers, 429 with Retry-After), a 400-day window per read, and a daily query-time budget per person.
Troubleshooting
- The client says the server needs authentication but never opens a browser. It cannot reach
/.well-known/oauth-protected-resource; check that nothing between the client and invisit blocks it. - “This app was connected with only read access; this needs …”. Disconnect the app under Account and connect it again, allowing what it names.
403on every call. The account was banned or deleted, or the app was disconnected.