Umami MCP Server — 89 tools
The Umami DADL turns Umami's API into an MCP server that Claude, GPT or any MCP-compatible agent can consume directly. One YAML file declares all 89 tools — website, team, event, session, user, link, and more — and ToolMesh serves them at runtime. No Python boilerplate, no per-endpoint code, no separate MCP server process.
Below: the endpoint coverage matrix, a two-block ToolMesh setup, the full tool reference grouped by Umami feature area, required credential scopes.
Source: Umami Analytics REST API
Which Umami endpoints are covered?
100% (89 of ~89 endpoints)
Focus: authentication, me, websites, statistics, metrics, pageviews, events, event-data, sessions, session-data, realtime, users, teams, reports, share, links, pixels, admin
Missing: none
How do you configure the Umami DADL?
- Log into your Umami instance as admin
- Navigate to Settings → Users or use the API login endpoint
- POST /api/auth/login with {username, password} to get a JWT token
- The token is returned in the response body as 'token'
Environment variable: CREDENTIAL_UMAMI_API_TOKEN
Umami is self-hosted. Replace the URL with your instance address. Token is a JWT obtained via /auth/login.
How do you install the Umami MCP server with ToolMesh?
Add to your backends.yaml:
- name: umami
transport: rest
dadl: umami.dadl
url: "https://your-umami-instance.com/api"
Set the credential:
CREDENTIAL_UMAMI_API_TOKEN=your-token-here What 89 tools does the Umami DADL expose?
POST login Authenticate with Umami. Returns a JWT token for subsequent API calls. Send username and password in the request body. POST verify_token Verify if the current JWT token is still valid. Returns user info if valid. GET get_me Get the current authenticated user's profile info based on the JWT token. GET get_my_teams Get all teams the current authenticated user belongs to. GET get_my_websites Websites of the current user -- same semantics as list_websites: only directly owned websites unless includeTeams is true, which adds the websites of the user's teams. Returns {data, count, page, pageSize}. For every website on the instance use admin_list_websites (admin role).
POST send_event Register a pageview or custom event. No authentication required. Requires a User-Agent header. Used by the tracking script. GET list_websites List websites OWNED BY THE CALLING USER (userId = token user). Websites that belong to a team are NOT included unless includeTeams is true (then: all websites of teams the user is a member of). An empty result therefore usually means the websites are team-owned -- retry with includeTeams: true, or use admin_list_websites (admin role, every website on the instance) / list_team_websites(teamId). Returns {data: [...], count, page, pageSize}; each item has id (websiteId), name, domain, teamId, createdAt.
GET get_website Get details of a specific website by its ID. POST create_website Create a new website to track. Provide name and domain. POST update_website Update website properties. Only include fields you want to change. POST transfer_website Transfer a website to a different user or team. IMPORTANT: Only the current owner of the website can transfer it — there is no admin bypass. Use teamId to assign to a team (requester must own the website and be a team member with transfer permission). Use userId to claim a team-owned website back to yourself (requester must be in the team with transfer permission). To remove from a team, pass teamId: null. DELETE delete_website Delete a website and all its analytics data. Irreversible. POST reset_website Reset a website by removing all its analytics data. The website itself is preserved but all stats are deleted. Irreversible. GET get_website_active Get the number of active visitors on a website right now (last 5 minutes). GET get_website_daterange Get the date range of available analytics data for a website. GET get_website_stats Get summarized website statistics: pageviews, visitors, visits, bounces, and total time. Timestamps are Unix milliseconds. GET get_website_pageviews Get pageview time series within a given time range. Returns pageviews and sessions arrays with timestamps. Unit auto-scales if range exceeds maximum for chosen unit. GET get_website_metrics Get metrics for a website grouped by type (Umami v3 vocabulary): path, fullPath (path incl. query string), entry, exit, referrer, domain (referrer domain), title, query, event, tag, hostname, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, browser, os, device, screen, language, country, city, region, distinctId, channel. Any other value -- notably the Umami v2 name "url" -- is rejected with HTTP 400; use "path" for page URLs. Returns [{x: value, y: count}] sorted by y desc, limit/offset apply (channel ignores them). startAt/endAt are Unix MILLISECONDS.
GET get_website_metrics_expanded Expanded metrics per entry: returns [{name, pageviews, visitors, visits, bounces, totaltime}] (NOT the {x, y} shape of get_website_metrics; region/city rows also carry country). type accepts the same Umami v3 vocabulary as get_website_metrics: path, fullPath (path incl. query string), entry, exit, referrer, domain (referrer domain), title, query, event, tag, hostname, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, browser, os, device, screen, language, country, city, region, distinctId, channel. Anything else (e.g. the v2 name "url") returns HTTP 400 -- use "path". bounces and totaltime are always 0 for page/event types (path, referrer, title, ...) and only populated for session types (country, browser, ...) and channel; numeric fields may arrive as strings. startAt/endAt are Unix MILLISECONDS.
GET get_website_events Get custom event details for a website within a time range. GET get_website_events_series Get custom events within a time range as time series. Returns [{x: event_name, t: timestamp, y: count}]. GET get_website_events_stats Get aggregated event statistics for a website within a time range. GET get_event_data Get event data grouped by name for a website. GET get_event_data_by_id Get event data for a specific individual event. GET get_event_data_events Get event names and their property counts. GET get_event_data_fields Get event property names and their value counts. GET get_event_data_properties Get event names and their associated property counts. GET get_event_data_values Get event data counts for a specific event and property combination. GET get_event_data_stats Get aggregated event data statistics: total events, properties, and records count. GET list_sessions List sessions for a website within a time range. GET get_sessions_stats Get aggregated session statistics for a website. GET get_sessions_weekly Get sessions grouped by hour-of-weekday (heatmap data). GET get_session Get details of a specific session. GET get_session_activity Get activity log for a specific session (pageviews, events). GET get_session_properties Get custom properties stored for a specific session. GET get_session_data_properties Get session data counts grouped by property name. GET get_session_data_values Get session data counts for a specific property. GET get_realtime Get realtime statistics for a website (last 30 minutes). Returns countries, urls, referrers, events, series, totals, and timestamp. POST create_user Create a new user. Admin only. Roles: admin, user, view-only. GET get_user Get a user by ID. Admin only. POST update_user Update a user. Admin only. Only include fields you want to change. DELETE delete_user Delete a user. Admin only. Irreversible. GET get_user_websites Get all websites accessible by a specific user. GET get_user_teams Get all teams a specific user belongs to. GET list_teams List all teams. POST create_team Create a new team. POST join_team Join a team using an access code. GET get_team Get a team by ID. POST update_team Update team properties. Only include fields you want to change. DELETE delete_team Delete a team. Irreversible. GET list_team_users List all members of a team. POST add_team_user Add a user to a team. Roles: team-member, team-view-only, team-manager. GET get_team_user Get a specific team member. POST update_team_user Update a team member's role. DELETE remove_team_user Remove a user from a team. GET list_team_websites List all websites assigned to a team. GET list_reports List all reports for a website. POST create_report Create a new report. GET get_report Get a report by ID. POST update_report Update a report. DELETE delete_report Delete a report. Irreversible. POST run_attribution_report Run an attribution report. Models: firstClick, lastClick. Types: path, event. POST run_breakdown_report Run a breakdown report to cross-reference multiple dimensions. POST run_funnel_report Run a funnel report. Requires at least 2 steps, each with type (path/event) and value. POST run_goal_report Run a goal report. Type: path or event. POST run_journey_report Run a journey/path report. Steps must be 3-7. POST run_performance_report Run a web vitals performance report. Metrics: lcp, inp, cls, fcp, ttfb. POST run_retention_report Run a retention/cohort report. POST run_revenue_report Run a revenue report. POST run_utm_report Run a UTM campaign report. POST create_share Create a share page. Share types: 1=website, 2=link, 3=pixel, 4=board. GET get_share Get a share page by its ID. POST update_share Update a share page. DELETE delete_share Delete a share page. Irreversible. GET list_website_shares List all share pages for a website. POST create_website_share Create a share page for a specific website. GET list_links List all tracked links. POST create_link Create a tracked link. Slug must be at least 8 characters. GET get_link Get a tracked link by ID. POST update_link Update a tracked link. DELETE delete_link Delete a tracked link. Irreversible. GET list_pixels List all tracking pixels. POST create_pixel Create a tracking pixel. Slug must be at least 8 characters. GET get_pixel Get a tracking pixel by ID. POST update_pixel Update a tracking pixel. DELETE delete_pixel Delete a tracking pixel. Irreversible. GET admin_list_users List all users in the Umami instance. Admin only. GET admin_list_websites List EVERY website on the instance regardless of owner or team (requires the admin role). This is the reliable way to find a websiteId when list_websites / get_my_websites come back empty because the websites are team-owned. Returns {data, count, page, pageSize}; items include id, name, domain, user and team.
GET admin_list_teams List all teams in the Umami instance. Admin only.