MCP server
Connect Claude, ChatGPT, Cursor, VS Code and other AI assistants to your Pulse Analytics, read-only.
The Pulse Analytics MCP server lets an AI assistant read your analytics and answer questions about them: "which pages did visitors from LinkedIn read last month?", "how did this week compare with last?". It speaks the Model Context Protocol, the standard most assistants use to reach outside tools.
https://pulse-api.ciphera.net/mcp- Read-only. Seven tools read totals, daily series, rankings and realtime counts. Nothing can change your sites, settings or data.
- You sign in and choose. The assistant never sees your password. You sign in to Pulse, pick a workspace and which sites the assistant may read, and approve.
- Nothing to install. The server runs on Pulse's infrastructure; you add its address to your assistant.
- You can take it back. Disconnect any assistant in Settings → Organization → MCP; it loses access on its next request.
Before you connect, read MCP privacy and security: what an assistant can receive, and where it goes.
How it works
- You add the server's address to your assistant.
- The assistant sends you to Pulse. You sign in, choose a workspace and the sites it may read, and click Allow.
- When you ask a question, the assistant calls Pulse's tools and answers from what they return. Every answer says which dates it covers, in the site's timezone.
The same steps are in the app: Settings → Organization → MCP shows them for each assistant, with this workspace's address ready to copy.
Before you connect
- You need the Owner or Admin role in the workspace: the same permission as creating an API key.
- Each person can connect up to 3 apps to a workspace, on every plan. Connected apps do not count against your API keys, and your keys do not count against them. Reconnecting an app you already connected replaces the earlier connection rather than using another of your three.
- The assistant you choose receives the numbers it asks for. If it runs outside the EU, so do those numbers. See where the data goes.
Connect a client
Choose your assistant. Every one connects to the same address, https://pulse-api.ciphera.net/mcp.
For claude.ai and Claude Desktop.
-
Open Customize → Connectors, click +, then Add custom connector.
-
Paste the server URL. Leave Advanced settings empty.
https://pulse-api.ciphera.net/mcp -
Click Add, then Connect. Pulse opens: sign in if asked, choose the workspace and sites, and click Allow.
Team and Enterprise
An owner adds the connector once under Organization settings → Connectors → Add → Custom → Web. Each member then clicks Connect under Customize → Connectors. Claude's Free plan allows one custom connector.
In your terminal.
-
Add the server:
claude mcp add --transport http pulse https://pulse-api.ciphera.net/mcp -
Sign in. Pulse opens in your browser; after you click Allow you are sent back to Claude Code, which finishes on its own.
claude mcp login pulse -
In a session,
/mcpshows the connection.
On chatgpt.com, on the web.
-
Open Settings → Security and login and turn on Developer mode.
-
Create an app for a remote MCP server with this URL and OAuth authentication:
https://pulse-api.ciphera.net/mcp -
Pulse opens: choose the workspace and sites, and click Allow.
Developer mode is not on every plan
It is available on Plus, Pro, Business, Enterprise and Edu, on the web. In a workspace, an owner allows it first under Workspace settings → Permissions & roles → Connected data.
For the Cursor editor and its terminal agent.
-
Add the server to
.cursor/mcp.jsonin a project, or to~/.cursor/mcp.jsonfor every project:{ "mcpServers": { "pulse": { "url": "https://pulse-api.ciphera.net/mcp", "auth": { "CLIENT_ID": "pulse-analytics-cursor" } } } } -
Sign in. From the terminal, approve the server once, then log in:
cursor-agent mcp enable pulse cursor-agent mcp login pulse -
Pulse opens: choose the workspace and sites, and click Allow.
pulse-analytics-cursor is Pulse's registered client for Cursor, so the consent screen shows Cursor as Verified. Older Cursor versions ignore the auth block and register themselves instead. That works too, and the consent screen shows it as Unverified.
For VS Code with GitHub Copilot.
-
Add the server to
.vscode/mcp.json:{ "servers": { "pulse": { "type": "http", "url": "https://pulse-api.ciphera.net/mcp" } } } -
Run MCP: List Servers from the Command Palette, choose
pulse, then Start Server. -
VS Code asks whether the server may authenticate and whether to open the website: allow both, then click Allow in Pulse.
Mistral's assistant.
-
Open Connectors, click + Add Connector and choose Custom MCP Connector.
-
Name it
pulseanalytics, with no spaces or symbols, and paste the URL:https://pulse-api.ciphera.net/mcp -
Click Connect. Le Chat detects the sign-in method on its own. Then click Allow in Pulse.
Adding a connector is an administrator feature
On an individual plan you are the administrator.
Your environment needs generative orchestration turned on.
-
In your agent, open Tools → Add a tool → New tool → Model Context Protocol.
-
Enter a name, a description and the server URL:
https://pulse-api.ciphera.net/mcp -
Choose OAuth 2.0 → Dynamic discovery, then Create and Next.
-
Create a new connection, click Allow in Pulse, then Add to agent.
Any MCP client that supports remote servers over HTTP with OAuth can connect. It discovers the sign-in from the server, registers itself, and sends you to Pulse to approve. Most clients take a configuration like this one:
{
"mcpServers": {
"pulse": {
"type": "http",
"url": "https://pulse-api.ciphera.net/mcp"
}
}
}A client without OAuth can use an API key. A client that only starts local programs cannot connect: see Clients that only run a local server.
The consent screen
When your assistant sends you to Pulse, the screen tells you who is asking before you decide:
- The app's name and a Verified or Unverified label. Verified means Pulse checked the app's identity: Claude, Claude Code, ChatGPT, Cursor and VS Code. Unverified means the app registered itself and chose its own name. Check that you started the connection and that the address it sends you back to is the one you expect.
- "It sends the approval to a program on this computer" appears for apps that run on your machine (Claude Code, Cursor, VS Code). Only allow it if you started the connection yourself.
- Workspace and sites. All sites includes sites you add later. Turn it off to choose sites one by one.
- Allow connects the app; Deny sends your answer back and nothing is connected.
A request stays open for ten minutes and works once. If the screen says it has expired, start again from your assistant.
Tools
| Tool | What it answers | Units |
|---|---|---|
list_sites | The sites this connection can read, with their ids and timezones. Assistants call it first. | 1 |
get_stats | Totals for a period: visitors, pageviews, bounce rate, visit duration, scroll depth. Optional filters. | as /stats |
get_daily_series | One row per day: visitors, pageviews and the per-visit averages. | ceil(days/7) × 2 |
get_breakdown | A ranking by one dimension: pages, entry or exit pages, referrers, channels, countries, regions, browsers, operating systems, devices, languages, utm_source, utm_medium, utm_campaign. | as /breakdown |
get_realtime | Visitors in the last five minutes and their top pages. | 1 |
get_install_snippet | The script tag that installs Pulse on a site. | free |
search_docs | Searches this documentation. | free |
Every tool only reads. Periods are 7d, 30d, month (this calendar month so far) and year (this calendar year so far), or explicit from and to dates. Every answer says which dates it covers, in the site's timezone.
get_stats keeps the five-visitor floor: a filtered total that matches fewer than five visitors comes back withheld, never as zero. get_daily_series withholds the per-visit averages on days with one to four visitors and keeps the counts. get_breakdown has no floor: rows with one visitor are returned with their real counts. See what an assistant can receive.
What to ask
Ask for the answer, not the tool. The assistant chooses the tools, and says which dates each answer covers.
- "How many visitors did my site get in the last 7 days, and how does that compare with the 7 days before?"
- "Which pages did visitors from LinkedIn read this month?"
- "What are my top 10 countries this year?"
- "Which campaigns brought the most visitors in the last 30 days?"
- "Show me visitors per day for the last 30 days. Which day was the busiest?"
- "How many people are on the site right now, and what are they reading?"
- "How do I add Pulse to a Next.js site?"
Costs and limits
Tool calls are priced in the same units as the Pulse API and spend the same monthly budget. Like a key, one connection can spend at most half of it, with its own burst ceiling. A tool call Pulse refuses before it reads any data (a malformed date, a site id that is not an id at all) costs nothing. A well-formed id for a site the connection cannot read costs the same as one it can, so the price never tells anyone which sites exist.
Managing connections
Settings → Organization → MCP lists the assistants connected to the workspace right now: who connected each one, which sites it reads, and when it was last used.
- Disconnect takes effect on the app's next request. To change which sites an app reads, disconnect it and connect again.
- A connection that goes 30 days unused expires; the assistant asks you to connect again.
- Removing a member disconnects the apps they connected. Deleting the workspace disconnects everything.
- Disconnected and expired connections leave the list. The audit log keeps the record: every connection and disconnection is logged as
mcp_connection_createdormcp_connection_revoked.
Using an API key instead
For scripts, CI and clients without OAuth, send a Pulse API key as a bearer token. The key's role and sites apply, exactly as on the API.
claude mcp add --transport http pulse https://pulse-api.ciphera.net/mcp \
--header "Authorization: Bearer pulse_sk_live_..."In Cursor, put the header in mcp.json under "headers": { "Authorization": "Bearer pulse_sk_live_..." }. In VS Code, use an input variable rather than writing the key into the file.
A key is a secret
A key in a config file is a key on disk. Keep it out of repositories, prefer an environment variable or your client's secret store, and prefer OAuth wherever the client supports it.
Clients that only run a local server
The Pulse Analytics MCP server is remote only. There is no package to install and nothing to run on your computer. A client that can only start local (stdio) servers cannot connect to it. Use a client that supports remote servers, or read the same numbers with the Pulse API or the Pulse CLI.
Common problems
| Symptom | Cause | What to do |
|---|---|---|
| "You can connect up to 3 apps to this workspace." | You already have three apps connected to this workspace. | Disconnect one you no longer use in Settings → Organization → MCP, then connect again. |
| "You can't connect apps to your workspaces." | Connecting needs the Owner or Admin role. | Ask an owner to connect the app, or to make you an admin. |
| "This connection request has expired." | A request lasts ten minutes and works once. | Start again from your assistant. |
| The assistant says it lost access, or reports 401 "unauthorized". | The connection was disconnected, expired after 30 days unused, or the person who connected it left the workspace. | Connect again. |
| The assistant sees fewer sites than the workspace has. | The connection was given a list of sites, not All sites. | Disconnect it and connect again with the sites you want. |
| A number comes back "withheld". | A filtered total matched fewer than five visitors. | See Withheld numbers. |
| The assistant says it hit a limit. | The workspace's monthly API budget is spent, this connection reached its half of it, or it sent more than 60 units in one second. | A burst clears after a second; the monthly budget resets on the 1st. See Costs and limits. |
| The consent screen says Unverified. | The app registered itself and chose its own name. | Allow it only if you started the connection yourself. |