Pug
Server Details
Query events, funnels, retention and profiles in Pug product analytics, and build dashboards.
- Status
- Healthy
- Uptime
- 57.1% over the last 24 hours
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- pug-sh/pug
- GitHub Stars
- 109
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 17 tools
Activity and insights expose parallel filter-schema and property-value tools, and get_activity_heatmap overlaps with get_profile_stats; explore_events vs get_activity_feed also require careful reading. Descriptions clarify scope, but an agent could still misselect among these paired helpers.
All tools use a consistent snake_case verb_noun pattern (get_*, list_*, query_*, upsert_*, explore_*), with clear resource prefixes. There is no inconsistent casing or vague verb usage.
17 tools is slightly above the ideal 15 but each maps to a real analytics workflow: projects, events, profiles, insights, and dashboards. The count is not excessive for the domain's breadth.
Core analytics querying and the dashboard create/read/update lifecycle are covered, but dashboard deletion is absent and get_deletion_request has no matching create/request tool. These are minor gaps an agent can work around or escalate.
Publisher details
- Operator
- Tshoka Private Limited
- Operator website
- https://pug.sh
- Vendor relationship
- First-party
- Documentation
- https://docs.pug.sh/mcp
- Trust center
- Not available
- Restrictions
- Not available
Available Tools
17 toolsexplore_eventsExplore eventsBRead-onlyInspect
GetEventExplorer returns a paginated, filterable list of events across all users in a project. Does not resolve aliases. Traffic tagged as a bot at ingest is excluded unless include_bots is true.
Inputs: events, page_size, page_token, project_id, +5 more. Returns: events, next_page_token
get_activity_feedGet activity feedBRead-onlyInspect
GetActivityFeed returns a paginated, filterable list of events for a user profile. Resolves profile aliases so merged anonymous events are included. Traffic tagged as a bot at ingest is excluded unless include_bots is true.
Inputs: events, page_size, page_token, project_id, +5 more. Returns: events, next_page_token
get_activity_filter_schemaGet activity filter schemaBRead-onlyInspect
GetFilterSchema returns event names, property keys, and profile property keys for filter UIs. The filter-schema concept is service-agnostic; both shared.activity and shared.insights expose the same shape via common.v1.
Inputs: event_kind, project_id, allowed_types. Returns: events, auto_property_keys, custom_property_keys, profile_property_keys
get_activity_heatmapGet activity heatmapARead-onlyInspect
GetActivityHeatmap returns per-day event counts for a user profile over a time window. Defaults to the last 60 days when no time_range is provided. Traffic tagged as a bot at ingest is excluded unless include_bots is true.
Inputs: project_id, time_range, distinct_id, include_bots. Returns: days
get_activity_property_valuesGet activity property valuesCRead-onlyInspect
GetPropertyValues returns distinct values for a given property key.
Inputs: source, event_kind, project_id, property_key. Returns: values
get_dashboardGet dashboardARead-onlyInspect
Get returns one dashboard: its time window, its tiles and its update_time. Each tile has its id, its name, its spec (insight tiles) or markdown, its chart and its position on the 12-column grid. Pass update_time to upsert_dashboard when you edit the dashboard.
Inputs: id, project_id. Returns: dashboard
get_deletion_requestGet deletion requestBRead-onlyInspect
GetDeletionRequest returns the status of an erasure request so a controller can prove fulfilment within the statutory window (the DSAR audit trail).
Inputs: project_id, request_id. Returns: error, status, profile_id, request_id, +4 more
get_insights_filter_schemaGet insights filter schemaARead-onlyInspect
GetFilterSchema lists the event kinds and the property keys/types available to filter and break down by. Call it before query_insights so that filters and breakdowns reference keys that actually exist in this project.
The filter-schema concept is service-agnostic; both shared.insights and shared.activity expose the same shape via common.v1.
Inputs: event_kind, project_id, allowed_types. Returns: events, auto_property_keys, custom_property_keys, profile_property_keys
get_insights_property_valuesGet insights property valuesARead-onlyInspect
GetPropertyValues lists the observed values of an event or user property (e.g. the countries seen for "$country") so filters and breakdowns can be populated with real values before running query_insights.
Inputs: source, event_kind, project_id, property_key. Returns: values
get_profileGet profileARead-onlyInspect
Get returns a single user profile by its pug profile id, including identity properties and an activity summary. A claimed anonymous id is redirected to its canonical profile. Traffic tagged as a bot at ingest is excluded from the activity summary unless include_bots is true.
Inputs: id, project_id, include_bots. Returns: profile
get_profile_by_external_idGet profile by external IDARead-onlyInspect
GetByExternalId returns a single user profile looked up by the external_id your application assigned to its end user, rather than by pug's internal profile id. Traffic tagged as a bot at ingest is excluded from the activity summary unless include_bots is true.
Inputs: project_id, external_id, include_bots. Returns: profile
get_profile_sessionsGet profile sessionsARead-onlyInspect
GetProfileSessions returns a paginated list of one user profile's sessions, newest first unless sort says otherwise. Requires that user's distinct_id (the pug profile id a profile lookup gives you). Sessions are aggregated server-side — one row per session with its start, end, event count and device context — so a profile with more events than any one page can hold still lists every session, with exact durations and counts. Resolves profile aliases so merged anonymous events are included. To page, send the previous response's next_page_token back as page_token; an empty next_page_token means there are no more pages. A token is only valid for the sort it was issued under — to change sort, start again with no page_token. sort defaults to PROFILE_SESSION_SORT_STARTED_AT and every sort is descending, so DURATION lists the longest sessions first and EVENT_COUNT the busiest. Traffic tagged as a bot at ingest is excluded unless include_bots is true, and the judgement is per session: a session with any tagged event is omitted whole rather than returned with only its untagged events.
Inputs: sort, page_size, page_token, project_id, +3 more. Returns: sessions, next_page_token
get_profile_statsGet profile statsARead-onlyInspect
GetProfileStats returns aggregate statistics, device/browser/location context from the latest event, per-day heatmap data (last 60 days), and profile properties for a profile. Resolves aliases so merged anonymous events are included. Traffic tagged as a bot at ingest is excluded unless include_bots is true, so a profile whose events are all bot-tagged omits stats entirely and returns no heatmap days — not a NotFound, and profile properties are still returned.
Inputs: project_id, distinct_id, include_bots. Returns: stats, heatmap, properties
list_dashboardsList dashboardsARead-onlyInspect
List returns the project's dashboards: each one's name, description, tile count, whether sharing is on, and when it last changed. Call get_dashboard for one dashboard's tiles.
Inputs: project_id. Returns: dashboards
list_projectsList projectsARead-onlyInspect
List returns the projects you can read, each with the org it belongs to. Every other tool reads one project and takes its id as project_id, so call this first. When a question doesn't say which project and more than one could fit, ask. A connection made by signing in reads the projects of the orgs its person belonged to when they connected; an API key reads its own project only.
Inputs: no named parameters. Returns: projects
query_insightsQuery insightsARead-onlyInspect
Query runs a product-analytics insight over the project's events and returns the computed result. A single call covers every insight type — trends, segmentation, funnel, retention, user flow (Sankey), top-K and map (a metric per country, returned as top_k rows keyed by ISO alpha-2) — chosen by the InsightQuerySpec (its insight_type, events, breakdowns and filters, among others). Map, user flow, top-K and session each carry their own sub-message (spec.map / spec.user_flow / spec.top_k / spec.session) and take no events or breakdowns; a map's country dimension is implicit, so spec.map may be empty. The request also carries the time range and granularity, and it is the right tool for any project-wide or over-time question; per-granularity range caps apply. Traffic tagged as a bot at ingest is excluded unless spec.include_bots is true. Discover valid event kinds and property keys with the get_insights_filter_schema tool first.
Inputs: spec, timezone, project_id, time_range, +1 more. Returns: result
upsert_dashboardCreate or update dashboardADestructiveInspect
Upsert creates a dashboard or edits one. It returns the dashboard's link, if the server has one, which you give to the person, and the ids of the tiles you sent, in order. To create, leave id empty and give a name and tiles. To edit, pass the dashboard's id and its update_time, from get_dashboard or your last upsert_dashboard. If someone changed the dashboard since, the call fails; read it again. A tile without an id is added and needs exactly one of spec and markdown. Tile names must differ on a dashboard, ignoring case. To change a tile, send its id and only the fields that change; spec and position are replaced whole. A tile stays insight or markdown; to switch, add a new tile and remove the old one. Tiles you leave out stay as they are. To remove a tile, list its id in remove, and only when the person asked for it. Every insight tile shows the dashboard's default_time_range and default_granularity (the last 30 days by day when unset), so work out each one with query_insights over that window first. Dashboards can't show segmentation insights or session metrics. chart applies to trends and top K only. Positions use a 12-column grid: x is 0 to 10, w is 2 to 12, and x + w is at most 12. y and h count rows of about 18px; h is at least 15 for an insight tile and 9 for a KPI or markdown tile. A tile you place can't overlap another; leave position out to put a new tile below the others. Markdown can't contain images. A dashboard with sharing on can't be edited.
Inputs: id, tiles, remove, project_id, +5 more. Returns: id, url, tile_ids, update_time
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
Ask your web and product analytics: traffic, funnels, goals, revenue and sessions.
Product analytics, user and company insights, surveys and NPS, reports, dashboards, and more.
Product analytics, feature flags, experiments, session replay and messaging for your products.
Privacy-first web analytics. Query pageviews, referrers, trends, and AI insights.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables asking product analytics questions in English and receiving answers as real SQL along with the resulting numbers, through read-only MCP tools for funnels, retention, trends, paths, and event counts.657 npmMIT
- AlicenseAqualityDmaintenanceConnect to your Mixpanel data. Query events, retention, and funnel data from Mixpanel analytics.1919MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for Mixpanel product analytics that enables natural language querying of events, funnels, retention, cohorts, and user profiles, plus JQL support.33 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to explore a synthetic product-event dataset and answer questions about signups, trends, funnels, and property breakdowns using a small set of composable, self-describing tools that return precomputed totals and actionable error hints.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.