umami-mcp-server
The umami-mcp-server enables natural language interaction with Umami web analytics, allowing you to query, analyze, and visualize website statistics and visitor behavior without manual dashboard navigation.
Core Analytics
List websites: Retrieve all websites in your account with their IDs, names, and domains.
Overview stats: Get pageviews, unique visitors, visits, bounces, and total time for any date range.
Dimension breakdowns: Break down traffic by URL, referrer, browser, OS, device, country, or custom events.
Time series data: Get pageviews and sessions over time, bucketed by hour, day, or month.
Real-time visitors: Check how many visitors are currently active on a site.
Session & Journey Analysis
Find sessions: List unique session IDs within a date range, optionally filtered by event name.
Trace user journeys: Get the full activity timeline for a specific session.
Semantic journey search (optional
[rag]extra): Search across many sessions using natural language to surface relevant behavioral moments.
Page Inspection
Fetch raw HTML: Retrieve the raw HTML of any live web page (no JavaScript).
Screenshot pages (optional
[screenshot]extra): Capture a rendered screenshot of a live web page using Playwright.
Workflow Features
Create Dashboard prompt: A built-in prompt that guides the model through building a comprehensive analytics dashboard for a website and date range.
Works with both Umami Cloud and self-hosted Umami via API key or username/password authentication.
Provides tools for accessing Umami web analytics data, including website stats, pageviews, metrics, active visitors, and user journey tracking.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@umami-mcp-serverWhat were my top pages last week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Umami Analytics MCP Server
Talk to your Umami web analytics in plain English. Let Claude pull your stats, spot trends, trace user journeys, and build dashboards, no SQL, no clicking through charts.
This is a Model Context Protocol server that connects Umami to any MCP client (Claude Desktop, Cursor, and others). Ask a question, and the model picks the right analytics calls, reads the data, and answers, then you can keep going: drill in, compare ranges, or have it assemble a full dashboard.
It is a modernized, dependency-light rewrite of
jakeyShakey/umami_mcp_server:
FastMCP, an async HTTP client, a tiny core install, optional heavy features, and a test
suite. See CHANGELOG.md for the full diff in spirit.
See it in action
You: Which pages drove the most traffic last week, and where did those visitors come from?
Claude: (get_websites → get_website_metrics type=url → get_website_metrics type=referrer)
Your top pages last week were /pricing, /blog/getting-started, and /. Most of
that traffic came from Google, then a Hacker News thread, then direct visits.
Want me to break the /pricing visitors down by country or device?
You: Yeah, and show me what a typical /pricing visitor did before they left.
Claude: (get_website_metrics type=country → get_session_ids → get_tracking_data)
...The model drives the tools. You just ask.
Related MCP server: BigQuery MCP Server
Why you might want this
Plain-language analytics. No dashboards to navigate or queries to write.
Lightweight by default. The core install is just
mcp,httpx, andpython-dotenv. No torch, no headless browser unless you opt in.Async and non-blocking. The Umami client is built on
httpx.AsyncClient.Works with self-hosted or Umami Cloud. API-key or username/password auth.
Honest about quality. Pure-function test suite plus CI (ruff + pytest) on Python 3.10 to 3.13.
Tools
Tool | What it returns | Requires |
| Your websites and their ids (start here) | core |
| Pageviews, visitors, visits, bounces, total time | core |
| Breakdown by url, referrer, browser, os, device, country, or event | core |
| Pageviews/sessions time series (hour/day/month) | core |
| Current real-time visitor count | core |
| Unique session ids in a range, optionally filtered by event | core |
| Full activity timeline for one session | core |
| Raw HTML of a live page (HTTP GET, no JS) | core |
| Semantic search across many user journeys |
|
| Rendered screenshot of a live page |
|
There is also a Create Dashboard prompt that walks the model through building a full
dashboard for a website and date range. Date arguments accept YYYY-MM-DD or
YYYY-MM-DD HH:MM:SS and are interpreted as UTC.
Quick start
Requires Python 3.10+.
1. Install
pip install "git+https://github.com/MurkyPuma/umami-mcp-server.git"2. Add it to Claude Desktop
Edit your config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"umami": {
"command": "umami-mcp-server",
"env": {
"UMAMI_API_URL": "https://cloud.umami.is",
"UMAMI_API_KEY": "your-api-key"
}
}
}
}3. Restart Claude Desktop and ask it something like "List my websites and last week's visitors." The tools appear under the tools (hammer) icon.
If
umami-mcp-serveris not on Claude Desktop'sPATH, use the absolute path to the console script (for example/path/to/.venv/bin/umami-mcp-server), or set"command"to your Python interpreter with"args": ["-m", "umami_mcp"].
Optional features (extras)
The heavy, situational tools are opt-in so the default install stays small.
# Semantic journey search (get_docs). Pulls torch-sized wheels.
pip install "umami-mcp-server[rag] @ git+https://github.com/MurkyPuma/umami-mcp-server.git"
# Rendered screenshots (get_screenshot). Then install the browser once.
pip install "umami-mcp-server[screenshot] @ git+https://github.com/MurkyPuma/umami-mcp-server.git"
playwright install chromium
# Everything
pip install "umami-mcp-server[all] @ git+https://github.com/MurkyPuma/umami-mcp-server.git"Without an extra, its tool still appears but returns a one-line install hint instead of failing, so nothing breaks.
Configuration
Set these as environment variables (in the MCP client config) or in a local .env
(see .env.example).
Variable | Required | Description |
| yes | Your Umami base URL, for example |
| one of | API key, sent as |
| one of | Credentials exchanged for a bearer token |
| no | If set, |
| no | Per-request timeout in seconds (default 30) |
Provide either UMAMI_API_KEY, or both UMAMI_USERNAME and UMAMI_PASSWORD.
Development
git clone https://github.com/MurkyPuma/umami-mcp-server.git
cd umami-mcp-server
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest # run the tests
ruff check . # lintNo live Umami is needed to test: the async client is exercised with
httpx.MockTransport, and the RAG tests cover the pure chunking/ranking helpers (the
embedding model is not loaded in CI).
src/umami_mcp/
config.py # env -> Settings (pure, no side effects)
dates.py # date string -> UTC unix millis (pure)
client.py # async httpx Umami client (auth, retry, endpoints)
web.py # get_html via httpx; optional Playwright screenshot
rag.py # optional semantic search (sentence-transformers + numpy)
server.py # FastMCP tools + Create Dashboard prompt
__main__.py # entry pointContributing
Issues and PRs are welcome. The codebase is small and the tests are fast; a good first contribution is adding a tool for an Umami endpoint that is not covered yet.
If this saves you a trip to the Umami dashboard, a ⭐ helps other people find it.
Credits
Original concept and first implementation by jakeyShakey. Licensed under MIT.
Available Tools
10 toolsget_active_visitorsA
Get the number of visitors currently active on a website (real-time).
Args: website_id: The website id (from get_websites).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description bears full burden. It discloses the real-time nature and that it returns a count, but does not mention error behavior, authentication requirements, or any side effects. Acceptable for a simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences plus a lightweight Args format. The main purpose is front-loaded, and every word is informative with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple nature of the tool (single parameter, read operation) and the presence of an output schema, the description is largely sufficient. It explains the parameter source and the real-time aspect, though it could mention what the output looks like (though not required due to output schema).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates by explaining that website_id comes from get_websites, adding practical context beyond the bare schema. This is helpful for an agent to understand how to obtain the parameter value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Get', the resource 'number of visitors currently active on a website', and specifies 'real-time' which distinguishes it from other tools that may provide historical data. The name also aligns perfectly with the described action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage through the real-time context, but does not explicitly state when to use this tool over siblings or provide any exclusions. It does reference get_websites for obtaining the website_id, which is helpful but not a full guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docsA
Semantic search over many user journeys to surface the most relevant moments.
Pulls every session for the range (optionally filtered to selected_event),
then returns only the journey chunks most relevant to user_question -- letting
you analyze behavior across many users without overflowing the context window.
Requires the optional 'rag' extra; without it, this returns install instructions.
Args: user_question: What you want to learn (used for the similarity search). website_id: The website id (from get_websites). start_at: Range start (UTC). end_at: Range end (UTC). selected_event: Optional event name to filter sessions by.
| Name | Required | Description | Default |
|---|---|---|---|
| user_question | Yes | ||
| website_id | Yes | ||
| start_at | Yes | ||
| end_at | Yes | ||
| selected_event | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explains the workflow: pulling sessions, filtering, returning relevant chunks, and requiring optional 'rag' extra. It does not disclose auth needs, rate limits, or side effects, but it provides reasonable behavior details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-line summary, then a detailed explanation, followed by the 'rag' extra note, and finally an args list. It is front-loaded and every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, semantic search) and the presence of an output schema, the description covers the key aspects: purpose, workflow, parameter meanings, and special requirements. It does not detail the output format but that is handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It provides brief but helpful descriptions for each parameter (e.g., 'user_question: What you want to learn (used for the similarity search)', 'website_id: The website id (from get_websites)'). This adds value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs 'Semantic search over many user journeys to surface the most relevant moments', using specific verbs and resources. It distinguishes from sibling tools like get_tracking_data or get_session_ids by focusing on relevance-based search rather than raw data retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use: for analyzing behavior across many users without overflowing context. It mentions the optional 'rag' extra requirement. However, it does not explicitly state when not to use or compare to alternatives, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_htmlA
Fetch the raw HTML of a live web page (HTTP GET, no JavaScript execution).
Useful for giving the model the structure/markup of a page you're analyzing.
Args: url: Full URL including scheme, e.g. 'https://example.com/pricing'.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses the HTTP GET method and no JS execution, but lacks details on error handling, timeouts, authentication, or response format. This leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief with the core action first, then usage context and parameter details. It is efficient but the usage sentence could be more precise; still, it wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and an output schema, the description covers the basic invocation. However, it omits potential aspects like response format (likely HTML string), error handling for unreachable pages, and any rate limiting, which could affect safe use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'url' has no schema description, but the description provides clear guidance: 'Full URL including scheme' with an example. This meaningfully adds to the schema, compensating for the 0% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches raw HTML from a live web page via HTTP GET with no JS execution, which distinguishes it from sibling tools like get_screenshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions it is useful for analyzing page structure/markup, which gives some usage context. However, it does not explicitly state when not to use it or compare to alternatives like get_screenshot for visual rendering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageview_seriesA
Get a pageviews-and-sessions time series, bucketed by hour, day, or month.
Use 'hour' for short ranges (1-7 days), 'day' for medium ranges, 'month' for long ranges.
Args: website_id: The website id (from get_websites). start_at: Range start (UTC). end_at: Range end (UTC). unit: Bucket size: hour, day, or month. timezone: IANA timezone for bucketing, e.g. 'UTC' or 'Europe/London'.
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes | ||
| start_at | Yes | ||
| end_at | Yes | ||
| unit | Yes | ||
| timezone | No | UTC |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It describes the tool as a read operation ('Get'), but does not disclose additional behavioral traits such as authentication needs, rate limits, or response format. However, the output schema exists to document the return structure, which partially compensates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: the first sentence states the purpose, followed by usage guidelines, then parameter descriptions. It contains no unnecessary words and is well-structured for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema, the description covers the essential aspects: purpose, usage guidelines, parameter semantics, and unit recommendations. It could include error handling or rate limit information, but overall it is sufficient for a straightforward retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description provides clear semantics for all 5 parameters, including source for website_id, format for start_at/end_at (UTC), and valid values for unit and timezone. This adds significant meaning beyond the schema's type-only definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'pageviews-and-sessions time series', and specifies bucketing by hour, day, or month. This distinguishes it from sibling tools that return different metrics, such as get_active_visitors or get_website_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use each unit: 'Use 'hour' for short ranges, 'day' for medium ranges, 'month' for long ranges.' It does not explicitly mention alternatives or when not to use this tool, but the context is sufficient for correct tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_screenshotA
Capture a rendered screenshot of a live web page.
Requires the optional 'screenshot' extra (Playwright); without it, this returns install instructions instead of an image.
Args: url: Full URL including scheme, e.g. 'https://example.com'.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes full responsibility. It discloses the dependency on the screenshot extra and the fallback to install instructions, which is valuable behavioral context. However, it does not mention output format, size limits, or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three parts: purpose, prerequisite, and parameter details. It could be slightly more streamlined, but it is well-structured and front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (1 required param, no output schema, no nested objects), the description adequately covers purpose, prerequisite, and parameter format. It also hints at the return type (image vs. instructions), but lacks details on supported image formats or performance considerations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'url' is described with format guidance ('Full URL including scheme') and an example. Since schema description coverage is 0%, the description fully compensates, adding meaning beyond the schema's basic string type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Capture a rendered screenshot of a live web page', which is a specific verb-object pair. It distinguishes from sibling tools like get_html or get_active_visitors, as screenshot capture is unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions the prerequisite (Playwright extra) and fallback behavior, but does not explicitly state when to use this tool vs alternatives. No when-not scenarios or sibling comparisons are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_session_idsA
Get the unique session ids active in a range, optionally filtered to an event.
Use this to find sessions to inspect with get_tracking_data, not to count unique
visitors (use get_website_stats for counts). Pass event_name to keep only
sessions that fired that event, or omit it for all sessions.
Args: website_id: The website id (from get_websites). start_at: Range start (UTC). end_at: Range end (UTC). event_name: Optional event name to filter by (e.g. 'checkout_completed').
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes | ||
| start_at | Yes | ||
| end_at | Yes | ||
| event_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adequately states the tool returns session ids and describes parameters, but does not disclose any behavioral traits (e.g., side effects, permissions, rate limits). The description is correct but could be enhanced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a clear first paragraph and bullet-style parameter explanations. Every sentence adds value, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (context shows has output schema: true), the description need not detail return values. It covers purpose, usage guidance, parameters, and differentiation from siblings, making it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0% description coverage, so the description must compensate. It explains all four parameters: 'website_id' (from 'get_websites'), 'start_at' and 'end_at' (UTC), and optional 'event_name' with example. This adds significant value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets unique session ids in a range, optionally filtered by event. It distinguishes from siblings like 'get_tracking_data' (inspection) and 'get_website_stats' (counting). The verb 'Get' and resource 'session ids' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly guides when to use the tool: for finding sessions to inspect with 'get_tracking_data', not for counting visitors (use 'get_website_stats'). It also explains the optional 'event_name' filter and when to omit it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tracking_dataA
Get the full activity timeline (user journey) for one session.
Args: website_id: The website id (from get_websites). start_at: Range start (UTC). end_at: Range end (UTC). session_id: The session to inspect (from get_session_ids).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes | ||
| start_at | Yes | ||
| end_at | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It describes the tool as getting a 'full activity timeline' but does not disclose behavioral traits like read-only nature, rate limits, or what 'full' entails. The return value is not described, though an output schema exists. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear purpose sentence followed by parameter documentation. It is efficient but slightly verbose due to including parameter descriptions in the docstring format. No wasted sentences, but could be more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and the presence of an output schema, the description covers the essential aspects: purpose, parameter meanings with cross-references to other tools. It does not describe the return format, but the output schema fills that gap. Complete enough for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant meaning to each parameter beyond the schema's raw titles. For example, it explains 'website_id' as coming from get_websites and 'session_id' from get_session_ids. Since the input schema has 0% description coverage, the description compensates well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Get the full activity timeline (user journey) for one session.' The verb 'Get' and specific resource 'activity timeline' make the purpose clear. However, it does not explicitly differentiate from sibling tools like get_session_ids or get_pageview_series, which might also involve session data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implicit usage context by listing parameters with source hints (e.g., 'The website id (from get_websites)'), suggesting a workflow. But it does not explicitly state when to use this tool versus alternatives, nor does it mention prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_website_metricsA
Get a breakdown of visitors by a dimension over a date range.
type selects the dimension: url (pages), referrer (traffic sources), browser,
os, device, country, or event (tally of tracked events).
Args: website_id: The website id (from get_websites). start_at: Range start (UTC). end_at: Range end (UTC). type: One of url, referrer, browser, os, device, country, event.
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes | ||
| start_at | Yes | ||
| end_at | Yes | ||
| type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behavioral traits. It explains the type parameter variants and date range, but does not discuss data freshness, pagination, rate limits, or whether the data is live or cached.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: it states the purpose in the first sentence, then lists parameters in a structured format. Every sentence is informative with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, no annotations, and an output schema, the description adequately covers the purpose and parameter details. However, it lacks usage guidelines and behavioral notes, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description explains all four parameters: website_id is from get_websites, start_at/end_at are UTC ranges, and type has an enumerated list with context. This adds meaning beyond the schema titles and enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets a breakdown of visitors by dimension over a date range, and lists the possible dimension types (url, referrer, browser, etc.). This specific verb+resource combination distinguishes it from sibling tools like get_website_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lacks explicit guidance on when to use this tool versus alternatives such as get_website_stats or get_active_visitors. It does not mention when not to use it or any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_websitesA
List the websites in your Umami account, with their ids, names, and domains.
Takes no arguments. Use the returned id for the other tools. If a team id is
configured the team's websites are returned; otherwise your personal websites.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden. It discloses it lists data without arguments and conditionally returns team or personal websites. It does not detail return format or side effects, but 'list' implies read-only. Adequate for a non-destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences. Front-loaded with purpose. Every sentence adds value: what it does, how to use returned ID, and conditional behavior. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Low complexity with zero parameters and an output schema present. Description covers purpose, usage, and conditional behavior fully. Agent can confidently determine when and how to use this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so baseline is 4. Description adds value by stating 'Takes no arguments,' confirming the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List the websites in your Umami account, with their ids, names, and domains.' The verb 'list' and resource 'websites' are specific. It distinguishes from sibling tools like get_active_visitors and get_website_metrics by focusing on listing basic website info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explains it takes no arguments and instructs to use returned id for other tools. It clarifies team vs personal website retrieval based on configuration. No explicit when-not-to-use, but the context is sufficient for a simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_website_statsA
Get overview metrics for a website over a date range.
Returns pageviews, unique visitors, visits, bounces, and total time. If you get no data, double-check the date range before assuming there is none.
Args: website_id: The website id (from get_websites). start_at: Range start, 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' (UTC). end_at: Range end, same formats (a bare date includes the whole day).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes | ||
| start_at | Yes | ||
| end_at | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions the date range formats and a common pitfall (no data), but does not disclose whether the operation is read-only, any authentication requirements, rate limits, or side effects. The description is adequate but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences plus an args block), front-loads the purpose, and structures parameter docs clearly. No superfluous content, though the hint sentence could be more precise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given three parameters and no annotations, the description covers the function, parameter semantics, and a usage tip. It does not detail the output structure (but an output schema exists), and could mention pagination or error handling. Still largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description provides detailed docstrings for all three parameters: website_id comes from get_websites, start_at/end_at have clear format specifications including timezone and whole-day handling. This adds significant meaning beyond the bare JSON schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get overview metrics for a website over a date range' and lists the specific metrics (pageviews, unique visitors, visits, bounces, total time). This is a specific verb+resource combination that differentiates from sibling tools like get_active_visitors or get_website_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a useful hint about checking the date range when no data is returned, but it does not provide explicit guidance on when to use this tool versus alternatives like get_website_metrics or get_pageview_series. Usage context is implied but not clearly defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.2.0- First observed
get_active_visitors - First observed
get_docs - First observed
get_html - First observed
get_pageview_series - First observed
get_screenshot - First observed
get_session_ids - First observed
get_tracking_data - First observed
get_website_metrics - First observed
get_website_stats - First observed
get_websites
TDQS
Scored across 10 tools
All tools have clearly distinct purposes: real-time active visitors, semantic journey search, raw HTML, pageview time series, screenshots, session IDs, session details, metric breakdowns, website listing, and aggregated stats. No overlapping functionality.
Every tool uses the consistent 'get_' prefix followed by a descriptive noun phrase in snake_case (e.g., get_active_visitors, get_pageview_series). Even the slightly vague 'get_docs' follows the pattern.
10 tools is well-scoped for an analytics MCP server. It covers core analytics (stats, series, breakdowns, sessions) plus useful extras (HTML, screenshot, RAG search) without being overwhelming.
The set provides comprehensive read-only coverage of Umami analytics: listing websites, retrieving stats, time series, dimensional breakdowns, session data, and active visitors. Missing write operations and some advanced analytics (e.g., retention, funnel) are minor gaps for a query-focused server.
Maintenance
Related MCP Connectors
Clamp Analytics MCP server: traffic, revenue, funnels, cohorts, errors, and search, for AI agents.
Analytics for MCP servers. Query your tool calls, first-call success, retries and schema cost.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
- AgentCatOAuthcom.agentcat
Analytics and debugging for your MCP server — explore usage and sessions, then root-cause errors.
Related MCP Servers
- AlicenseAqualityDmaintenanceRead-only MCP server for Umami analytics. It talks to the Umami REST API directly over HTTP, supporting self-hosted and cloud setups.810MIT
- AlicenseAqualityDmaintenanceAn MCP server for BigQuery that lets Claude answer questions about your search and analytics data, providing real analysis with verdicts and recommendations, not just raw query results.3243Apache 2.0
- AlicenseNot gradedqualityBmaintenanceMCP server for Umami Analytics that provides read-only tools to query website stats, events, sessions, reports, and more, enabling natural language analytics queries.303MIT
- AlicenseAqualityBmaintenanceA read-only MCP server for Umami analytics, enabling natural language queries of website stats, traffic trends, events, sessions, and analytics reports.13101Elastic 2.0