Skip to content

AI assistants and MCP

Point an AI assistant at your own numbers and ask questions in plain language. The server speaks Model Context Protocol, the open standard that lets clients like Claude Code and Cursor call external tools, so "how did the pricing page do last week" becomes a real query against your site instead of a guess.

It reads the same aggregates the dashboard draws, and it can set a site up: add a website, create goals and funnels, change tracking settings. It cannot alter or delete the analytics themselves.

https://mcp.statable.com/mcp

How it works

Your client sends you to Statable in the browser, you sign in, and the connection is made. Nothing else is needed: no key to create, nothing secret to paste, no configuration beyond the server address above. If you would rather hold a token yourself, see Connect with a key.

Settings → MCP carries the same steps as below, for whichever client you pick, with the server address already filled in.

Settings MCP with Claude Code selected

You need an account first

MCP connects an account that already exists. If there is none yet, register over HTTPS and then connect: see Register without a browser.

Connect a client

  1. Run this in your terminal:

    claude mcp add statable --scope user --transport http https://mcp.statable.com/mcp
    
  2. Start Claude Code and open the server list with /mcp.

  3. Select Authenticate and sign in to your Statable account.

Using Claude in the browser or the desktop app?

Those connect through a custom connector rather than the command above, and who may add it depends on the plan.

  • Pro and Max. Open Customize → Connectors, add a custom connector, and paste the server URL.
  • Free. The same path, with a limit of one custom connector.
  • Team and Enterprise. An organization Owner adds it once under Organization settings → Connectors → Add → Custom → Web. Note that this is the Owner role specifically, not any administrator. Everyone else then finds it under Customize → Connectors and signs in with their own Statable account, so each person reaches only the sites they already have.

An Owner can also limit what a connector may do across the whole organization, such as allowing reads while blocking writes, and a member cannot override that. If the setup tools refuse on a Team or Enterprise account while reading works, check that policy before the key's permissions.

  1. Open Settings → Security and login in ChatGPT and turn on Developer mode.
  2. Go to chatgpt.com/plugins, select the plus button, name it Statable and paste the server URL, including the /mcp at the end.
  3. Add Statable from the tools menu in a new chat, then sign in to your Statable account.

Developer mode is not on every plan

Custom MCP connectors ride on ChatGPT's Developer mode, which is available on Pro, Plus, Business, Enterprise and Education, and on the web rather than the mobile apps. There is no route in on the free plan.

On Business and Enterprise the switch belongs to an administrator, under Workspace Settings → Permissions & Roles. If step 1 shows you no Developer mode toggle, that is the reason, and the fix is a request to whoever administers your workspace rather than anything on our side.

  1. Create ~/.cursor/mcp.json for every project, or .cursor/mcp.json for just this one.
  2. Add this entry, save the file and restart Cursor:

    {
      "mcpServers": {
        "statable": {
          "url": "https://mcp.statable.com/mcp"
        }
      }
    }
    
  3. Open Customize → MCPs and follow the prompt to sign in.

  1. Run this in your terminal:

    codex mcp add statable --url https://mcp.statable.com/mcp
    
  2. Sign in with codex mcp login statable.

  3. Check the connection with codex mcp list. Statable should be listed as connected.

Any client that supports a remote MCP server over Streamable HTTP works. Authentication is OAuth 2.1, which most clients discover on their own from the server URL.

Clients that read a JSON config expect this shape. The server name can be anything.

{
  "mcpServers": {
    "statable": {
      "type": "http",
      "url": "https://mcp.statable.com/mcp"
    }
  }
}

Then follow your client's login prompt and sign in to your Statable account.

What you grant

Signing in shows a consent screen listing what the client is asking for, and which sites it will reach.

MCP access request from Claude Code, with both permissions listed

Two permissions exist:

PermissionWhat it allows
View your analytics dataRead the numbers. Every connection has this
Create and configure your sitesAdd sites, goals and funnels, and change tracking settings and filters

A connection made today asks for both. Grant only the first if you want an assistant that can look but not touch: the nine setup tools are then hidden from it, so it never offers you an action that would fail.

The choice is fixed for the life of the connection. To widen a read-only connection, disconnect it and connect again, which runs the consent screen afresh.

Manage sites is a real permission

It can make a site's analytics readable by anyone with the link, and it can change which visitors are counted from now on. Grant it to a client you run yourself, not to one you are trying out.

Connected tools

Settings → MCP lists every client you have connected, what each one reaches, and when it was last used or, if it has not been, when it was connected. Disconnect ends a connection immediately: its tokens stop working on the next call, and the client has to sign in again to come back.

The Connected list in Settings MCP, with Disconnect on a Claude Code connection

Disconnecting is the right move for a machine you no longer use, a client you were only testing, or any connection you did not expect to see.

Available tools

Twenty-five tools. Sixteen read, nine change something, none delete.

Each connection sees only the tools its permissions cover. A read-only one sees the sixteen below and nothing more.

Each takes a site, either the numeric site ID or the domain, which you can omit when the connection is locked to a single site. get_subscription is the exception and takes no arguments at all.

Reading

ToolReturns
list_sitesSites you can read, with timezone and, optionally, headline metrics
query_statsThe full query surface: totals, time series or a top-N breakdown, with filters
top_pagesMost visited pages
top_sourcesWhere traffic came from
top_countriesVisitors by country
top_custom_eventsCustom events ranked by count
top_goalsGoals ranked by conversions, with conversion rate
list_goalsThe goals a site measures, as configured
list_prop_keysCustom property keys a site has recorded
list_funnelsSaved funnels, and the IDs funnel_report needs
funnel_reportOne funnel run out to per-step visitors, conversion rate and dropoff
current_visitorsVisitors active in the last five minutes
visitors_over_timeDaily visitors and pageviews
get_tracking_snippetThe script tag to install, and the URL it loads
get_site_filtersHostnames, blocked IPs, countries and public access, in one answer
get_subscriptionThe account's plan state, including a trial and when it ends

query_stats covers everything the other reports do and more. The rest are shortcuts for the questions people ask constantly.

Setting up

These need Create and configure your sites.

ToolDoes
create_siteAdds a website. A URL the account already has is refused, not returned
update_siteChanges URL, timezone or week start
create_goalAdds a goal: a custom event, a page, or a scroll depth
update_goalReplaces a goal's definition
create_funnelAdds a funnel of two or more steps
update_funnelReplaces a funnel's definition
get_tracking_settingsReports which tracking features the installed script includes
update_tracking_settingsSets them, then rebuilds and republishes the script
update_site_filtersSets hostnames, blocked IPs, countries and public access

get_tracking_settings only reads, but sits behind the same permission as changing them, because that is how the same setting is gated everywhere else.

update_site_filters cannot take public access away from a hobby site while the account has no paid subscription: the attempt comes back as hobby_always_public.

Dates and time buckets follow each site's own timezone, the one set under Site settings → General.

Three rules worth knowing

Update replaces. update_goal, update_funnel and update_tracking_settings take the whole definition. A field left out is cleared, not kept, so read the current state first and send it back with your edit applied. update_site is the exception: it leaves omitted fields alone.

Filters replace by section. update_site_filters leaves out what you leave out, but a section you do send replaces that setting whole. Sending a blocked country also clears the country allow list, because the two are one setting.

Filtering is not deletion. Blocking a country or an IP stops new traffic being counted. It does not remove what was already collected.

What to ask

The client picks the tool, so ask for the answer rather than the endpoint:

  • How many visitors did example.com get last week?
  • Top 10 countries for the last 30 days.
  • Which pages get the most traffic this month?
  • How is my signup funnel converting?
  • Add a goal for the Signup event on example.com.
  • Anyone on the site right now?

Limits

Aggregates only. Tools return counts and rates, the same numbers the dashboard draws. There is no tool that hands back raw visitor-level rows.

Configuration, not data. What the setup tools change is how a site is measured. No tool edits, backfills or removes a single collected event.

No deletion. Removing a site, a goal or a funnel stays a dashboard action.

Rate limits. Two hourly windows apply, one per connection and one across your whole account. Both scale with your plan. Over the limit, requests answer 429 with a Retry-After header, and your client reports the tool call as failed until the window resets.

Your connection's reach. A connection never sees more than you do. If your own access to a site ends, the connection stops reading it too.

Connect with a key

An API key still works, and is the better fit for a script or a server that cannot open a browser. Keys are created in the dashboard and shown once.

API keys

  1. Open Settings → API keys.
  2. Select Create API key.

    Create API key

  3. Fill in the dialog:

    FieldWhat it does
    NameA label, up to 100 characters. Name it after the machine or client that will hold it.
    Site accessAll sites, or one specific site. A single-site key can never read anything else.
    PermissionsRead analytics is always on. Add Manage sites for the setup tools.
    Expires inNever, 30d, 60d, 90d or 1y.
  4. Copy the token from the Your API key dialog. It starts with stbl_ and is stored only as a hash, so this is the one time it is shown.

Point the client at the same server URL and send the token as a header:

claude mcp add --transport http statable https://mcp.statable.com/mcp \
  --header "Authorization: Bearer stbl_YOUR_KEY"

Clients that read a JSON config take it as "headers": { "Authorization": "Bearer ${STATABLE_API_KEY}" }. Read the token from an environment variable, as here, whenever the config file is shared or committed.

The token is a secret

Anyone holding it can read every site the key covers, and change what the key's permissions allow. Keep it on your own machine or in a server-side secret store, never in a repository or in browser JavaScript. Revoke a leaked key immediately, then create a replacement.

Full detail on keys, permissions, rotation and expiry lives in Authentication.

Clients that only run a local server

Some hosts cannot open a browser and cannot send a header either. They only know how to launch a command and talk to it over stdin. For those there is @statable/mcp, a small bridge published on npm: it runs locally, forwards every call to the same mcp.statable.com/mcp with your key, and keeps nothing on disk.

Reach for it when the host only accepts a local command, or when the client is a script, a CI job or a sandbox. Claude Desktop can also use it if a custom connector is not an option on your plan.

Create a key first, exactly as above, then point the host at the package. Claude Desktop, in claude_desktop_config.json:

{
  "mcpServers": {
    "statable": {
      "command": "npx",
      "args": ["-y", "@statable/mcp"],
      "env": { "STATABLE_API_KEY": "stbl_YOUR_KEY" }
    }
  }
}

Cursor reads the same shape from ~/.cursor/mcp.json. Claude Code takes it as one line:

claude mcp add statable --scope user -e STATABLE_API_KEY=stbl_YOUR_KEY -- npx -y @statable/mcp

Two settings, each available as an environment variable or a flag:

SettingEnvironmentFlagDefault
API keySTATABLE_API_KEY--api-keynone
EndpointSTATABLE_MCP_URL--urlhttps://mcp.statable.com/mcp

Without a key the bridge still starts and still lists its tools, so a host may show it as connected while nothing works. The first call says so and explains how to add one.

The package is MIT licensed.

Where to find it

The server is listed where MCP clients and their users look for one, so you can confirm it exists without taking this page's word for it.

WhereEntry
Official MCP Registrycom.statable/analytics
Smitherysmithery.ai/servers/statable/analytics
Glamaglama.ai/mcp/connectors/com.statable.mcp
npm@statable/mcp
Sourcekey-arg/statable-mcp

All of them describe the same server. The registry entry and the two catalogues point at the hosted endpoint; npm carries the stdio bridge above.

Common problems

SymptomCause
Client reports 401 or "unauthorized"The connection was disconnected, or the sign-in never finished. Reconnect from the client. On a key, confirm the header reads Bearer stbl_… and check the key under Settings → API keys
A setup tool answers 403The connection or key is read-only. Disconnect and connect again to grant Create and configure your sites, or create a key with Manage sites
Tools connect but list one siteAccess is locked to that site. Reconnect for all sites, or create an all-sites key
A site is not found by nameSites are stored as the owner typed them, often as a full URL. Call list_sites and pass the numeric site_id
Empty results on a new siteNothing has been collected yet. Check Verify installation

Reference

  • Protocol version 2025-06-18, with 2025-03-26 and 2024-11-05 also accepted.
  • Server identifies itself as statable, version 1.0.0.
  • Authentication is OAuth 2.1 with PKCE, authorization code plus refresh token. API keys are accepted on the same endpoint.
  • A token issued by signing in works on this server only. It is not a general-purpose API credential.
  • Transport is stateless. Every call is one HTTP POST answered with one JSON response, so nothing is kept between calls.

Ready to take control of your web analytics? Try Statable free for 30 days. No credit card required, full feature access, built for GDPR. Start your free trial or view a live demo.