Skip to main content
Glama
MurkyPuma

umami-mcp-server

by MurkyPuma

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.

CI License: MIT Python Ruff MCP PRs Welcome

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, and python-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

get_websites

Your websites and their ids (start here)

core

get_website_stats

Pageviews, visitors, visits, bounces, total time

core

get_website_metrics

Breakdown by url, referrer, browser, os, device, country, or event

core

get_pageview_series

Pageviews/sessions time series (hour/day/month)

core

get_active_visitors

Current real-time visitor count

core

get_session_ids

Unique session ids in a range, optionally filtered by event

core

get_tracking_data

Full activity timeline for one session

core

get_html

Raw HTML of a live page (HTTP GET, no JS)

core

get_docs

Semantic search across many user journeys

[rag]

get_screenshot

Rendered screenshot of a live page

[screenshot]

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.json

  • Windows: %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-server is not on Claude Desktop's PATH, 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

UMAMI_API_URL

yes

Your Umami base URL, for example https://cloud.umami.is

UMAMI_API_KEY

one of

API key, sent as x-umami-api-key (Umami Cloud / newer self-hosted)

UMAMI_USERNAME / UMAMI_PASSWORD

one of

Credentials exchanged for a bearer token

UMAMI_TEAM_ID

no

If set, get_websites lists that team's sites; otherwise yours

UMAMI_TIMEOUT

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 .    # lint

No 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 point

Contributing

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 tools
get_active_visitorsA

Get the number of visitors currently active on a website (real-time).

Args: website_id: The website id (from get_websites).

ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_questionYes
website_idYes
start_atYes
end_atYes
selected_eventNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes
start_atYes
end_atYes
unitYes
timezoneNoUTC

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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').

ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes
start_atYes
end_atYes
event_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes
start_atYes
end_atYes
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes
start_atYes
end_atYes
typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes
start_atYes
end_atYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 10 tool updatesv0.2.0
    • First observedget_active_visitors
    • First observedget_docs
    • First observedget_html
    • First observedget_pageview_series
    • First observedget_screenshot
    • First observedget_session_ids
    • First observedget_tracking_data
    • First observedget_website_metrics
    • First observedget_website_stats
    • First observedget_websites

TDQS

A4.2/5.0

Scored across 10 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Read-only MCP server for Umami analytics. It talks to the Umami REST API directly over HTTP, supporting self-hosted and cloud setups.
    8
    10
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for Umami Analytics that provides read-only tools to query website stats, events, sessions, reports, and more, enabling natural language analytics queries.
    30
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    A read-only MCP server for Umami analytics, enabling natural language queries of website stats, traffic trends, events, sessions, and analytics reports.
    13
    10
    1
    Elastic 2.0