etracker MCP Server
Enables querying etracker analytics reports via natural language. Provides tools to list reports, get metadata, and retrieve report data with filtering, sorting, and period comparison.
README
etracker MCP Server
Streamable-HTTP MCP server for the etracker Analytics Report API. Read-only, 4 tools, runs in a container.
The REST Report API is available in the etracker analytics Enterprise Edition. Create an access token with scope Reporting API under Settings → Account → Integration.
Table of contents
- Run in Docker
- Authentication
- Connect from your client
- Tools
- Example prompts
- Configuration
- Operations
- Development
Run in Docker
Published image: ghcr.io/mittwald/etracker-mcp:latest (tags: latest, 0.1.0).
docker run -d --name etracker-mcp -p 3334:3334 \
--restart unless-stopped \
ghcr.io/mittwald/etracker-mcp:latest
The server is credential-free at startup — every client provides its own etracker access token via a header (see Authentication).
Endpoint: http://127.0.0.1:3334/mcp · Healthcheck: GET /health.
Build locally instead:
docker build -t etracker-mcp .and useetracker-mcpas the image name.
docker compose
services:
etracker-mcp:
image: ghcr.io/mittwald/etracker-mcp:latest
ports: ["3334:3334"]
restart: unless-stopped
Authentication
Each client provides its own etracker access token via a request header:
X-ET-Token— access token with scope Reporting API.
The server keeps no global credentials, holds nothing in env, and stores
nothing on disk. The token lives only in the per-session EtrackerClient
inside the running process. One server can serve many etracker accounts.
Requests without the header are rejected with 401.
The upstream API base URL defaults to the public endpoint
https://ws.etracker.com/api/v7 and can be overridden server-side with
ETRACKER_API_URL.
Connect from your client
All client examples below include the required X-ET-Token header. Replace
the token with your own.
Claude Code
claude mcp add etracker http://127.0.0.1:3334/mcp --transport http \
--header "X-ET-Token: your-access-token"
Claude Desktop
Claude Desktop's stable config only accepts stdio MCP servers. To use this HTTP-based server, bridge it via the
mcp-remoteshim (auto-installed bynpx). This also lets you pass the requiredX-ET-Tokenheader, which the Connectors UI doesn't support.
Step-by-step:
-
Quit Claude Desktop (
⌘Qon macOS · right-click tray → Quit on Win/Linux). -
Open the config file:
OS Path macOS ~/Library/Application Support/Claude/claude_desktop_config.jsonWindows %APPDATA%\Claude\claude_desktop_config.jsonLinux ~/.config/Claude/claude_desktop_config.json -
Add (or merge into)
mcpServers:{ "mcpServers": { "etracker": { "command": "npx", "args": [ "-y", "mcp-remote", "http://127.0.0.1:3334/mcp", "--header", "X-ET-Token: your-access-token" ] } } } -
Save the file and reopen Claude Desktop. The first launch downloads
mcp-remote(one-time, ~5 s). -
Open a new chat → type
/mcpand press Enter.etrackershould appear with status connected and 4 tools listed.
If it shows failed: check that the MCP server is running
(curl http://127.0.0.1:3334/health → {"ok": true}) and that Node.js is
installed system-wide (npx must be on your PATH).
Cursor
~/.cursor/mcp.json:
{
"mcpServers": {
"etracker": {
"url": "http://127.0.0.1:3334/mcp",
"headers": {
"X-ET-Token": "your-access-token"
}
}
}
}
n8n
In an AI Agent workflow add the MCP Client Tool node:
- Endpoint:
http://127.0.0.1:3334/mcp(or the container hostname if n8n runs in Docker, e.g.http://etracker-mcp:3334/mcpon the same network). - Server Transport:
HTTP Streamable. - Headers: add
X-ET-Token.
Connect the node to the tools input of the AI Agent. n8n introspects
tools/list automatically, so the etracker tools become available to the
agent without further config.
VS Code (Copilot Chat)
.vscode/mcp.json:
{
"servers": {
"etracker": {
"type": "http",
"url": "http://127.0.0.1:3334/mcp",
"headers": {
"X-ET-Token": "your-access-token"
}
}
}
}
MCP Inspector (debug)
npx @modelcontextprotocol/inspector
# Streamable HTTP → http://127.0.0.1:3334/mcp
# Add the X-ET-Token header in the Inspector "Authentication" panel.
Tools
The etracker Report API is report-centric: pick a report (e.g. EAPage,
EAGeo, EADeviceType), then query its rows. Each report exposes
attributes (dimensions) and keyfigures (metrics).
| Tool | Purpose |
|---|---|
list_reports |
Map of report ID → display name. Call first. |
get_report_info |
Metadata for a report: create date, segments, attributes. |
get_report_metadata |
Column metadata: ids, labels, types, sortable/filterable flags. |
get_report_data |
Report rows with date range, paging, sorting, column selection and filters. |
compare_report_data |
Two periods compared per row: current/previous/delta/pctChange per figure, sorted by largest change. |
A typical flow: list_reports → get_report_metadata (to learn valid
attribute/figure IDs) → get_report_data (or compare_report_data for
period-over-period analysis). compare_report_data defaults the comparison
period to the equally long span immediately before the current range.
Example prompts
Marketing-oriented questions for the connected assistant:
- "Which reports are available in my etracker account?"
- "Show me the top 10 pages by unique visits in May 2024 (
EAPage)." - "Break down visits by device type for the last 7 days."
- "Which countries drove the most traffic last month? Sort descending."
- "List pages whose name matches "Checkout" with more than 100 unique visits."
- "Compare page impressions for
/en/vs/de/URLs over the last 30 days."
Data notes
- Composite row IDs:
get_report_datarows carry anidthat can be a comma-joined composite of the report's dimensions (e.g.pageNameId,urlIdforEAPage).compare_report_datajoins on this fullid, i.e. at the granularity of the attributes you request. - Invisible characters in attribute values: etracker may track the same
URL under two
page_namevalues — a normal one and a second one prefixed with an invisible separator (U+2063), e.g. from a JS-setet_pagenamevs. an auto-derived name. Grouping bypage_namethen shows the page twice. For per-URL truth, requestattributes=url(droppage_name) so etracker aggregates by URL; or strip zero-width/invisible characters before deduping names.
Configuration
| Env | Required | Default | |
|---|---|---|---|
MCP_PORT |
no | 3334 |
TCP port. |
LOG_LEVEL |
no | info |
One of debug, info, warn, error. |
ETRACKER_API_URL |
no | https://ws.etracker.com/api/v7 |
Base URL of the etracker Report API. |
The etracker access token is not configured via env — it is passed by each
client via the X-ET-Token request header. See
Authentication.
Operations
- Logging: structured JSON to stdout/stderr (
info/debug→ stdout,warn/error→ stderr). One line per event, no header values logged. Tail withdocker logs -f etracker-mcp. - Healthcheck:
GET /healthreturns{"ok": true, "version": "..."}. Wired into the DockerfileHEALTHCHECK. - Limits: request bodies > 1 MB →
413; outbound calls to etracker timeout after 30 s. The etracker API itself limits to 50 calls per 5 minutes, 10 parallel requests, and 100,000 rows per response. - Security model: server holds no credentials. Run multiple replicas
behind a load balancer if needed — sessions are sticky via the
Mcp-Session-Idheader, so terminate sessions on the same backend (or accept that a reconnect re-initializes a session). - Image: pin a digest in production
(
ghcr.io/mittwald/etracker-mcp@sha256:…) rather than:latest. - Graceful shutdown:
SIGTERM/SIGINTclose all open MCP sessions and drain in-flight requests before exit (10 s hard cap).
Development
pnpm install
pnpm dev # tsx watch
pnpm test # unit tests
pnpm test:live # live smoke test (client → API), needs ETRACKER_TOKEN env
pnpm build # tsc → dist/
# Holistic end-to-end test: drives the running server over the real MCP
# transport against the live API, exercising every tool.
pnpm build && node dist/index.js & # start the server
ETRACKER_TOKEN=... pnpm test:e2e # MCP_URL overridable (default :3334)
All tools are read-only. Add a tool: extend src/tools.ts, add a unit test
in tests/tools.test.ts, add a live test in tests/live/live.test.ts that
asserts the actual response shape.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.