dotplot-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| analyzeA | START HERE. Event data in, finished report out, one call. Use this whenever the user asks anything general — "analyze my product", "how are my users doing", "find my aha moment". The other tools are parts; this is the whole thing. Only reach for them when the user asks for one specific number ("just show me retention"). It picks a value event, draws the dot plot, finds the aha moment, builds the funnel and retention curve, and writes the HTML report — then tells you what it found so you can say it out loud. csv_path: a CSV with user_id, date, event (platform optional). No CSV yet? Call with no arguments and follow the instructions you get back — for a project with a database you will explore its schema and turn ordinary business tables (orders, sessions, posts) into events with load_from_db. Most early products have no events table; that is expected. value_event: the action that means "this user got real value".
Leave it out and the code picks the candidate most users repeat. Pass it
yourself when you have read the codebase and know better — you can tell
lang: the user's language. en/ko/ja are built in; for any other language call get_report_strings, translate, and use generate_report directly. |
| describe_eventsA | Shape of an event CSV: date range, user count, events by type. Mostly useful when you want to look before choosing a value event yourself. For a normal "analyze my product" request call analyze instead — it does this step and everything after it. |
| dot_plotC | Text dot plot: one row per user, one cell per day. ◎ first active day, ● value event, · nothing. mark_events puts a letter on other actions, e.g. {"create_playlist": "P"}. |
| classify_usersC | Sort users by behaviour: churned (used once, never returned), weekend_only, regular (almost daily), casual. lang sets the human-readable labels (en/ko/ja); the keys stay in English. |
| find_aha_momentsB | Scan every action for the one that turns users into regulars. Ranked by behaviour_change — how much a user's own activity rose after they first did it — because comparing groups (lift) rewards actions that frequent users happen to do. Tell the user this is correlation, not cause. |
| audit_trackingA | Check what the code logs, and — if there is data — whether it arrives. Use this when analyze says there is nothing to work with. A project that tracks nothing has no data to analyse, but it has code to read, so leave csv_path out and this still answers. How to use it:
|
| get_report_stringsA | Every sentence the report can contain, in English, for translation. For a language other than en/ko/ja:
|
| generate_reportA | Write the HTML dot plot report — readable in three seconds, made to share with a team or an investor. analyze calls this for you. Use it directly when you need to control the marks, the window, or a language that isn't built in. Marks on other actions:
Language: match the conversation. lang="en"|"ko"|"ja" are built in; for any other language translate get_report_strings() and pass it as custom_strings with lang="custom". Never translate the {brace} placeholders. |
| onboarding_funnelB | Onboarding funnel: signup -> first value -> came back -> still active. Answers where new users leak. A large median_days_to_value means friction between signing up and getting anything out of the product. |
| retention_curveB | Weekly retention: share of users with a value event in week N. Only users old enough to have reached week N count toward it, and weeks with fewer than five of them are dropped rather than reported as noise. Where the curve flattens is the retention that holds. |
| load_from_dbA | Pull events out of the project's database into a CSV. How to use it:
Supports postgresql:// (Supabase, RDS, Neon) and sqlite:///path for testing. |
| history_compareA | Compare today's numbers with the last analysis of the same data. Snapshots are saved to ./.dotplot/history.json every time a report is made. Only snapshots of the same dataset are compared, so the first run of a new project has nothing to compare against — say so rather than implying zero change. |
| find_similar_casesB | Find companies that hit the same problem and what they changed. A small library curated from public material — YC talks, First Round, founder interviews. When you pass a case on:
|
| publish_reportA | Host the report and return a shareable link. ASK THE USER FIRST. This puts their product's numbers on the public web. Only run it when they have said they want a link. The report goes to a random path in a Vercel project and is deployed with
|
| submit_benchmarkA | Submit five aggregate numbers to the anonymous benchmark. Opt-in. Set consent=True only after the user has explicitly agreed. When you ask, show them exactly what leaves the machine — user count, churn rate, weekend rate, regular rate, aha lift, and nothing else. No user IDs, no event log, no product name. industry: b2c|b2b|commerce|content|social|tool|game|other stage: pre_launch|under_100_users|under_1k_users|over_1k_users |
| compare_benchmarkB | Compare your numbers with percentiles from teams at the same industry and stage. Below ten teams the percentiles mean nothing — say so plainly instead of reporting them. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| analyze_product | Full analysis: dot plot, aha moment, funnel, retention, report. |
| add_tracking | Find the core actions that aren't logged, and write the logging for them. |
| whats_changed | Compare today's numbers with the previous report. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 16 tools
Each tool has a distinct, clearly-stated purpose, and the descriptions explicitly disambiguate the large overlap between the meta-tool analyze and its component tools (dot_plot, find_aha_moments, retention_curve, generate_report by naming analyze as 'START HERE' and the others as 'parts'. Boundaries are clear in text but the pipeline-vs-composite overlap still requires careful reading to avoid picking a component when the whole workflow is wanted.
Names are uniformly snake_case, which is the key consistency factor. There is mild variation between verb_noun forms (get_report_strings, generate_report, classify_users, find_aha_moments) and noun phrases (dot_plot, retention_curve, onboarding_funnel), but the convention is predictable enough to navigate.
16 tools is slightly on the heavy side but justified for a full product-analytics suite spanning ingest, analysis, benchmarking, publishing, and history. Nearly every tool earns its place, though some (compare_benchmark, submit_benchmark, find_similar_cases) are peripheral.
The surface covers the lifecycle well: data ingestion (load_from_db, describe_events), the full analysis workflow (analyze plus components), external context (compare_benchmark, find_similar_cases, history_compare), and output (generate_report, publish_report). No obvious dead ends, though there is no raw-data export or report deletion tool.