Gauge
Sends email through Resend and inspects the account: sends messages (returning a preview unless confirmed), lists sent emails with cursor paging, and lists sending domains with their verification status.
Reads web analytics from a self-hosted Umami instance or Umami Cloud: lists tracked websites, retrieves pageviews, visitors, visits, bounces and bounce rate for a date range, returns pageview/session time series, and produces ranked breakdowns by path (top pages), referrer, country, browser, OS, device and more.
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., "@Gaugeshow me my top pages from the last 7 days"
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.
Gauge
Made by Seaynic Labs. Need tools like this built around your own systems? We do that.
Gauge lets an AI assistant read your website's Umami analytics and send email through Resend, and comes with skills that teach it to do that work well: weekly reports, copy, SEO and email.
It is a bundle: tools, skills and instructions in one install. The tools are one server made of modules. You switch on the modules you use. New modules arrive switched off, so an update never changes what your assistant can do until you choose to.
Security card | |
Network | Only the services you configure: your Umami address (or api.umami.is) and api.resend.com. Nothing else, no telemetry. |
Files | Reads its config file ( |
Secrets | API keys and passwords come from your environment or config file. They are never tool arguments and never returned to the model. |
Read-only tools | 7: |
Needs your approval |
|
Startup cost | about 4,700 tokens (8 tools, 9 skill prompts) |
Changes | Tool descriptions are locked by hash ( |
Module | What it does | Status |
| Web analytics from Umami, self-hosted or Umami Cloud: sites, totals, time series, top pages, referrers, countries, browsers | 0.1 |
| Email through Resend: send (preview first), list sent mail, list sending domains | 0.1 |
Gauge works with any MCP client: Claude Desktop, Claude Code, Cursor, VS Code, Sonique, Hermes, OpenClaw and others. It runs on your computer and stores nothing; your data stays in Umami and Resend.
Skills
Skills are short guides your assistant reads before doing a job. Gauge ships 9, in two forms from one source: a skills/ folder for apps that read Agent Skills (Claude Code and others), and MCP prompts for every other MCP app.
Skill | What it covers | By |
| Setup, first checks, fixing errors | Seaynic Labs |
| A one-minute weekly traffic report from Umami | Seaynic Labs |
| Tracking plans, SEO audits, page copy, email sequences | Corey Haines, MIT |
| Sending with Resend, deliverability, HTML email | Resend, MIT |
Third-party skills keep their licenses; see CREDITS.md.
Related MCP server: Gizmo Analytics
Install
Gauge needs Python 3.11 or newer. With uv you don't install anything ahead of time:
uvx gauge-mcp --version
uvx gauge-mcp --doctor # checks your settings and connections, prints fixesPin the exact version if you want updates only when you choose them: uvx gauge-mcp==0.2.1.
Or with pip:
pip install gauge-mcpAs a Claude Code plugin (tools and skills in one step):
/plugin marketplace add seayniclabs/plugins
/plugin install gauge@seayniclabsPlugin users put settings in ~/.config/gauge/config.toml (below).
Settings
Set these as environment variables in your MCP client's config, or put them in a config file (see below). You only need the settings for the modules you use. Gauge starts without any of them and tells you what's missing when you call a tool.
Variable | Module | What it is |
| umami | Your Umami address, e.g. |
| umami | A self-hosted Umami login. A view-only user is enough. |
| umami | Umami Cloud API key (instead of a login). |
| resend | Resend API key |
| resend | Sender address on a domain you verified in Resend |
| resend | Optional sender display name |
| resend | Optional. Comma-separated addresses or |
| resend |
|
| any |
|
Config file (optional). Gauge also reads ~/.config/gauge/config.toml, or the file named by GAUGE_CONFIG. Environment variables win over the file.
[umami]
url = "https://analytics.example.com"
username = "viewer"
password = "change-me"
[resend]
enabled = falseAdd it to your MCP client
Most clients use the same JSON shape. Put it where your client keeps MCP servers:
{
"mcpServers": {
"gauge": {
"command": "uvx",
"args": ["gauge-mcp"],
"env": {
"GAUGE_UMAMI_URL": "https://analytics.example.com",
"GAUGE_UMAMI_USERNAME": "viewer",
"GAUGE_UMAMI_PASSWORD": "change-me",
"GAUGE_RESEND_API_KEY": "re_your_key",
"GAUGE_RESEND_FROM": "hello@example.com"
}
}
}
}Client | Where the config goes |
Claude Desktop |
|
Claude Code |
|
Cursor |
|
VS Code |
|
Sonique, Hermes, OpenClaw, others | Any client that launches a stdio MCP server: command |
Over HTTP. For clients that connect to a URL instead of launching a process:
gauge-mcp --transport http --port 8765It serves streamable HTTP at http://127.0.0.1:8765/mcp. It listens only on your own machine by default. Put authentication in front of it before exposing it anywhere else.
Try these
Paste one into your assistant once Gauge is set up:
"How did my site do last week compared with the week before?"
"Which pages got the most visits this month, and where did those visitors come from?"
"Write my weekly site report and draft it as an email to me. Don't send it yet."
"Audit the SEO of my top three pages and suggest new titles and descriptions."
"Which of my Resend sending domains aren't verified yet, and what do I need to fix?"
Tools
Tool | What it returns |
| Which modules are on, which settings are missing, and what each tool does. Call this first. |
| Tracked websites, paged |
| Pageviews, visitors, visits, bounces and bounce rate for a date range |
| Pageviews and sessions over time |
| A ranked breakdown: |
| Sends an email after you approve it. Without |
| Sent emails, paged with a cursor |
| Sending domains and whether each is verified |
Every tool returns structured data with a published schema, so an assistant can write code against the results instead of reading text. Date ranges take days (default 7) or ISO 8601 start and end. Errors always look like gauge.<module>.<code>: <message> Fix: <hint>.
Safety
Gauge only calls the services you configure. It sends nothing anywhere else and keeps no data.
resend_sendsends real email, so you approve each one, not the assistant. When the assistant asks to send, Gauge asks you directly through your MCP client (MCP elicitation) and shows the sender, recipients and subject. The assistant can't answer that question for you.Some MCP clients can't ask you questions yet. In those, Gauge refuses to send unless you've pre-approved the recipients with
GAUGE_RESEND_ALLOWED_RECIPIENTS, or turned approval off withGAUGE_RESEND_REQUIRE_CONFIRM=false.Give Gauge the least access it needs: a view-only Umami user, and a Resend key limited to sending if you don't need the other email tools.
Develop
uv venv && uv pip install -e '.[dev]'
.venv/bin/pytestSecurity
Report a vulnerability privately through GitHub (Security tab, "Report a vulnerability"). See SECURITY.md. Every send you approve, decline or that gets refused is logged locally in ~/.local/state/gauge/approvals.jsonl (recipients and subject, never the message body). Set GAUGE_APPROVAL_LOG to move it.
License
MIT. Published by Seaynic Labs. Third-party skills are credited in CREDITS.md and keep their own licenses.
Built by Seaynic Labs. We build tools like this around a business's own systems: local-first, with a person approving every change. See custom integrations.
Available Tools
8 toolsgauge_modulesARead-only
Which modules are on, what settings are missing, and what each tool does. Pass a module name for its full settings list.
| Name | Required | Description | Default |
|---|---|---|---|
| module | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| skills | Yes | |
| modules | Yes | |
| version | Yes | |
| homepage | No | |
| publisher | No | |
| config_file | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds concrete behavioral context beyond the readOnlyHint and openWorldHint annotations: it says the tool reports enabled modules, missing settings, tool descriptions, and module-specific settings. It does not mention authentication, rate limits, or error behavior, but the read-only annotation makes that less critical.
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 two compact sentences with no wasted words, and it front-loads the main capability before explaining the optional module-specific behavior.
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, read-only inspection tool with one optional parameter and an output schema, the description covers the essential purpose and parameter behavior. It could be slightly stronger by clarifying the default/no-argument result, but no major information is missing.
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 schema has 0% description coverage for the single optional 'module' parameter. The description compensates partially by explaining that passing a module name returns its full settings list, but it does not specify valid module names, expected format, or the exact behavior when omitted.
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 that the tool reports which modules are enabled, missing settings, and per-tool descriptions, and that a module name returns its full settings list. It identifies the resource and scope well, though it does not compare itself with any sibling tools.
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 second sentence gives an explicit usage instruction: pass a module name to get its full settings list. However, the description does not state when to use this tool instead of alternatives or clarify the no-argument case beyond implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resend_domainsARead-only
List sending domains and whether each is verified.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| domains | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that: no mention of pagination/completeness (are all domains returned?), auth requirements, or rate limits for what is an external API call.
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?
A single front-loaded sentence with zero filler; the key attribute (verification status) is stated up front rather than buried.
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?
With no parameters, an output schema, and annotations covering read safety, the description is nearly complete. The one missing piece is whether the listing is paginated or exhaustive, which matters for an open-world API.
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 tool takes zero parameters, and the description correctly implies a no-argument listing call. Nothing about parameter semantics needs to be, or is, explained.
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?
States a specific verb+resource (list sending domains) plus the informative payload (verified status), which cleanly separates it from siblings like resend_send and resend_emails. It stops short of explicitly naming an alternative, but the resource is 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?
No explicit when-to-use or when-not-to-use guidance. The purpose implies the common use case (checking which domains are verified, e.g. before sending), but the agent must infer that routing rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resend_emailsARead-only
List sent emails, newest first. Page with after=<next_after from the previous page>.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| emails | Yes | |
| has_more | Yes | |
| next_after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description still adds real behavioral value by disclosing result ordering ('newest first') and the cursor-paging mechanism. It says nothing about when the listing ends, whether there is a max limit, or what happens with an invalid cursor.
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?
Two short sentences, zero filler, with the core purpose and the paging instruction both front-loaded. Every clause carries information the agent needs.
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?
An output schema exists, so return values need not be described, and the pagination story is partially told. Still missing are termination behavior at the end of the list and any guidance on the limit parameter, which matter for a cursor-paged listing tool with 0% schema coverage.
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 both parameters are undocumented in the schema and the description must compensate. It explains 'after' well by tying it to the next_after value from the previous page, but 'limit' is never mentioned, leaving half the parameter surface unaddressed.
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?
States a specific verb and resource ('List sent emails') and clarifies ordering ('newest first'), which importantly disambiguates the tool from its name, which reads like a re-send action. It never explicitly contrasts with the sibling resend_send, so the agent must infer the split between listing and sending.
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 implies usage (read a list of sent emails, page through it) and gives concrete paging mechanics, but offers no when-to-use/when-not guidance and no routing hint relative to resend_send or resend_domains. Adequate but inference-dependent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resend_sendA
Send an email from the configured sender. Without confirm=true it only returns a preview. With confirm=true the person is asked to approve it (unless the recipients are pre-approved in settings); the assistant cannot approve on their behalf.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| html | No | ||
| text | No | ||
| confirm | No | ||
| subject | Yes | ||
| reply_to | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| note | No | |
| sent | Yes | |
| draft | Yes | |
| approved_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic profile (not read-only, open-world, non-idempotent, non-destructive); the description adds the non-obvious two-phase preview/approval workflow and the human-in-the-loop gate that an agent absolutely must know about. The pre-approved-recipient bypass is a real behavioral detail not derivable from annotations or schema.
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?
Two tight sentences with the default (preview) mode stated first and the escalated (confirm) mode second. Every clause conveys actionable information; nothing is padded.
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 consequential outbound-send tool, the critical questions — does it actually send, and who approves — are answered, and an output schema covers return values. Remaining gaps are the untended body parameters (html vs text) and what the preview contains, which are secondary but not trivial.
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% across six parameters, so the description must carry the burden. It explains only `confirm` meaningfully; `to`, `subject`, `html`, `text`, and `reply_to` get no guidance, and it never says whether html/text are alternatives, whether both are allowed, or what happens if neither is supplied.
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?
States a specific verb and resource ('Send an email from the configured sender') so an agent can immediately distinguish this from read-only siblings like resend_emails and resend_domains. It does not explicitly name the sibling it is not, but the write/send semantics make the boundary clear.
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?
Explicitly describes both operating modes: without confirm=true it returns a preview only; with confirm=true a human approval step is triggered. It also names the exception (pre-approved recipients) and an important constraint (the assistant cannot approve on the user's behalf), which is exactly the routing knowledge an agent needs before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
umami_metricsCRead-only
Ranked breakdown, highest count first. type: path (top pages), referrer, entry, exit, title, country, region, city, browser, os, device, language, screen, event, utmSource, hostname.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| days | No | ||
| type | No | path | |
| limit | No | ||
| start | No | ||
| offset | No | ||
| search | No | ||
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | Yes | |
| rows | Yes | |
| type | Yes | |
| limit | Yes | |
| start | Yes | |
| offset | Yes | |
| website_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The one genuine behavioral addition is the ordering guarantee ('highest count first'), which is useful. Nothing is said about the time window (how `days` interacts with `start`/`end`), how `search` filters, or pagination behavior.
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?
Two compact sentences with zero filler; the ordering behavior is front-loaded before the long enumeration. The type list is dense but each token is load-bearing as an allowed value.
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?
An output schema exists, so return shape need not be explained. However, for an 8-parameter analytics query the description never states the date-range semantics (default 7 days vs explicit start/end precedence) or what `search` does, leaving real gaps for correct invocation.
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% across 8 parameters, so the description carries the full burden. It does the single most valuable thing: enumerates the allowed `type` values, which the schema leaves as a bare string with a 'path' default. The remaining parameters (days, limit, offset, search, start, end, website_id) are undocumented but largely self-describing by name.
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 conveys that results are a ranked breakdown of some metric dimension, and the enumerated `type` values (top pages, referrer, country, browser, ...) strongly imply website analytics. But there is no verb and no mention of the resource being a website's metrics, and nothing distinguishes it from siblings like umami_stats or umami_pageviews.
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?
There is no explicit when-to-use guidance and no named alternative. An agent must infer from the type list that this is the tool for per-dimension breakdowns rather than aggregate stats, and must guess how umami_stats differs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
umami_pageviewsCRead-only
Pageviews and sessions over time. unit: minute, hour, day, month or year.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| days | No | ||
| unit | No | day | |
| start | No | ||
| timezone | No | UTC | |
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | Yes | |
| unit | Yes | |
| start | Yes | |
| points | Yes | |
| website_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing about default time window behavior, how 'days' interacts with 'start'/'end', timezone handling, or aggregation granularity—context that matters for a time-series query.
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?
Two short sentences with the core purpose front-loaded and zero filler. It is efficient, though the brevity comes at the cost of substance covered under other dimensions.
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?
An output schema exists so return values need not be described, but with 6 parameters at 0% schema coverage and only 'unit' documented, an agent cannot confidently supply time ranges, timezone, or the required website_id from the description alone. Significant gaps remain.
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% and there are 6 parameters, so the description carries the full burden. It documents only the 'unit' values, leaving website_id (required), days, start, end, and timezone entirely unexplained, and it never clarifies the precedence between 'days' and start/end.
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?
States a specific resource (pageviews and sessions) and the temporal dimension ('over time'), so an agent knows this is a time-series retrieval tool. It does not distinguish itself from siblings like umami_stats or umami_metrics, so it falls short of a 5.
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?
There is no when-to-use guidance, no exclusions, and no mention of alternatives such as umami_stats or umami_metrics. The second sentence about units is parameter detail, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
umami_statsCRead-only
Totals for one website. Range: last days days, or ISO 8601 start/end.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| days | No | ||
| start | No | ||
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | Yes | |
| start | Yes | |
| visits | Yes | |
| bounces | Yes | |
| visitors | Yes | |
| pageviews | Yes | |
| website_id | Yes | |
| bounce_rate | Yes | |
| total_time_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the description adds only the date-range window, which is mostly schema-level information. It says nothing about auth requirements, rate limits, or whether totals are scoped to a single site vs all sites beyond the vague "one website", so little behavior is disclosed beyond structured fields.
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?
Two short sentences, front-loaded with the resource and followed by the range rule; nothing wasted. Brevity is appropriate, though it is terse to the point of under-specification rather than sloppiness.
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 read-only tool with an output schema, return-value detail is not required, so the main gap is which aggregate is returned and how it relates to the sibling metric tools. Enough to invoke (website_id required, range modes given) but not enough to pick it with confidence among the umami family.
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%, and the description does clarify that `days` and `start`/`end` are alternative range modes (ISO 8601 for explicit dates) — valuable for two of the four parameters. It leaves `website_id` and the interaction rules (does `days` override `start`/`end`?) unstated, so it only partially compensates for the coverage gap.
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?
"Totals for one website" restates the tool name (stats = totals) without naming which aggregate is returned (visitors, pageviews, bounce rate?) or how it differs from the sibling umami_metrics. A verb-like framing exists but the resource is left ambiguous, so an agent cannot confidently pick this over umami_metrics or umami_pageviews.
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 only guidance is about date-range modes (days vs start/end), which is invocation mechanics rather than when-to-use. Nothing tells the agent in which situation this tool should be chosen over umami_metrics, umami_pageviews, or umami_websites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
umami_websitesBRead-only
List websites tracked in Umami. Paged: page starts at 1, page_size up to 100.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| total | No | |
| websites | Yes | |
| page_size | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, giving the safety profile. The description adds useful behavioral detail that page is 1-based and page_size caps at 100, which the schema does not state. It doesn't mention total counts or truncation behavior, but the annotations carry the main burden.
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?
Two short sentences that are front-loaded with the purpose and immediately follow with the two parameter constraints. Nothing is wasted.
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 two-parameter read tool with an output schema already describing return values, the description covers purpose and the non-obvious paging constraints. The only gap is routing guidance among the many Umami siblings, which is a minor omission given the unambiguous resource.
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 compensate, and it partially does: it clarifies 1-based paging and the page_size ceiling of 100. However, it doesn't explain defaults (page 1, page_size 20) or what happens when page exceeds the result set, leaving some semantics unstated.
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?
States a specific verb and resource: 'List websites tracked in Umami.' It's clear what the tool returns, but it doesn't distinguish itself from siblings like umami_stats or umami_pageviews beyond the nouns in their names.
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 offers no when-to-use guidance or alternatives. It doesn't say to call this first to obtain a website ID for other Umami tools, which is the natural usage pattern implied by the sibling set.
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.
8 tool updates
v0.2.1- First observed
gauge_modules - First observed
resend_domains - First observed
resend_emails - First observed
resend_send - First observed
umami_metrics - First observed
umami_pageviews - First observed
umami_stats - First observed
umami_websites
TDQS
Scored across 8 tools
The Umami tools are mostly differentiated by resource and shape: websites lists sites, stats gives totals, pageviews gives time series, and metrics gives ranked breakdowns. Stats and pageviews both concern analytics and could be slightly confused, but descriptions clarify the distinction; Resend and module tools are clearly separate.
All tool names consistently follow a module_resource pattern in snake_case: umami_*, resend_*, and gauge_modules. The convention is predictable and readable throughout.
Eight tools is well-scoped for a server combining Umami analytics reads with Resend email operations. Each tool covers a distinct capability without obvious redundancy.
The surface covers core analytics reading (sites, totals, time series, breakdowns) and email sending/listing/domain listing. Minor gaps exist, such as retrieving a single sent email's details or managing/verifying domains, but agents can work around these.
Maintenance
Related MCP Connectors
Privacy-first, cookie-free web analytics. Read stats and manage sites from your AI.
Marketing data and actions for AI agents: GA4, Search Console, ads, social, SEO and WordPress.
Google Analytics, Search Console, Ads, CRM, Cloudflare and more for your sites, from your own AI.
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Umami Analytics for both Cloud and self-hosted instances. It provides tools to retrieve website statistics, visitor metrics, pageview trends, and real-time active user counts.51MIT
- AlicenseAqualityDmaintenancePrivacy friendly, cookieless web analytics built MCP-first. "Add analytics to my Next.js app" → an AI agent runs the setup_analytics_for_site tool, picks the right install snippet, edits your layout file, and verifies the script is loading. OAuth onboarding, no API keys to paste.2885 npm1MIT
- AlicenseNot gradedqualityDmaintenanceExposes Umami analytics (Cloud or self-hosted) as read-only tools for querying website stats, pageviews, metrics, and active visitors.3,160 npmMIT
- AlicenseAqualityBmaintenanceEnables natural-language analytics against Umami, including traffic stats, time series, sessions, custom events, and filtered breakdowns, plus self-hosted admin CRUD for websites, users, and teams, and client onboarding.488 npmMIT