roblox-analytics-mcp
Provides tools for querying Roblox experience analytics, including DAU, revenue, retention, playtime, crash rates, funnels, custom events, and data store usage through the Open Cloud Analytics API.
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., "@roblox-analytics-mcpWhat was my DAU by platform for the last 30 days in universe 123456?"
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.
roblox-analytics-mcp
A local MCP server that lets AI agents (Claude Code, Codex, etc.) query Roblox experience analytics — DAU, revenue, retention, playtime, crash rates, funnels, custom events, data store usage, and more — through the Open Cloud Analytics API.
Runs entirely on your machine. Your API key is stored locally and never leaves your computer.
Tools
Tool | What it does |
| Browse the ~150 supported metrics with their exact names, categories, supported granularities, retention windows, and supported dimensions. Filter by category or keyword. |
| Query a metric time series for a universe: pick a granularity ( |
| Discover which values a dimension actually has (countries, platforms, funnel names, custom event names, place IDs, …) for a metric and date range. |
| Poll a slow query that came back with |
Slow queries are polled automatically for up to 60 seconds (configurable via pollTimeoutSeconds).
If a query still isn't finished, the pending operation's path is returned so the agent can
call get_operation later.
Metric categories
Retention, Engagement, Monetization, Acquisition, Performance, Economy, Funnels, CustomEvents, Thumbnails, SpeechToText, TextToSpeech, Matchmaking, DataStore, MemoryStore, Safety, Advertising.
Standard metrics keep ~4 years of data; performance, data store, and memory store metrics keep 28 days;
matchmaking keeps 90 days. Ranges longer than two years only support OneWeek, OneMonth, or None.
Example prompts
"What was my DAU by platform for the last 30 days in universe 123456?"
"Compare revenue by country for August vs September."
"Which funnel steps have the highest churn in my onboarding funnel?"
"Show client crash rate per hour for the last 24 hours, broken down by PlaceVersion."
Related MCP server: MCP Server for Google Analytics 4
Setup
1. Get an Open Cloud API key
Go to the Creator Dashboard → Open Cloud → API Keys.
Create a key and add the universe-analytics API system.
Give it the
universe.analytics:readscope for the universes you want to query.
This key only needs read access to analytics — nothing else.
2. Install
npm install -g @frrazers/roblox-analytics-mcp(Or clone this repo and run npm install && npm run build, then use node dist/cli.js as the command.)
3. Store your key
roblox-analytics-mcp setupThis prompts for your key (hidden input) and saves it to your OS config directory. No secrets end up in any shared config file. Check it worked with:
roblox-analytics-mcp status4. Connect it to Claude Code
Either register it:
claude mcp add roblox-analytics -- roblox-analytics-mcpor add a .mcp.json to your project (safe to commit — it contains no secret):
{
"mcpServers": {
"roblox-analytics": {
"command": "roblox-analytics-mcp"
}
}
}The tools appear as mcp__roblox-analytics__* in your next session; /mcp shows status.
Managing your key
Command | Action |
| Store or replace the key |
| Delete the stored key |
| Show whether a key is configured and where it came from |
A key stored by setup takes precedence. If you haven't run setup, the ROBLOX_API_KEY environment variable is used as a fallback (handy for CI).
Notes on the API
Metric names are case-sensitive (
DailyActiveUsers, notdailyactiveusers). The server warns you before sending if a name, granularity, or dimension doesn't match its local catalog, but still forwards the request in case the catalog is behind the live API.startTimeis inclusive andendTimeis exclusive, both RFC 3339 UTC.A 429 with code 3000 means the data-point budget was exceeded: shorten the range, coarsen the granularity, or reduce breakdowns.
License
MIT
Available Tools
4 toolsget_operationA
Check on a long-running analytics query. Use this when query_metrics or list_dimension_values returned done: false; pass the 'path' from that response. Returns the operation with 'done' and, once finished, the 'response' payload.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The 'path' value from a pending response, e.g. v1/universes/123/operations/metrics/abc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It discloses that this is a polling/check operation for async work and describes the return shape ('done' and eventually 'response' payload). It doesn't mention side effects, but as a read-only check, this is adequate context beyond the 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 sentences with zero wasted words: the first states the purpose, the second gives usage and return behavior. The most critical information (when to use and what to pass) is front-loaded. No redundancy with the schema or sibling list.
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 one-parameter polling tool with no output schema, the description covers the key aspects: when to use, what to pass, and what the response contains. It doesn't explain how to interpret 'done' or polling frequency, but that is reasonably inferred. Adequate and nearly complete.
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 coverage is 100% and the schema already explains the 'path' parameter with an example. The description adds 'pass the path from that response', which reinforces the source but doesn't introduce meaning beyond what the schema provides. Baseline 3 is appropriate.
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 states a specific verb ('Check on') and resource ('long-running analytics query'), and distinguishes itself from siblings by referencing query_metrics and list_dimension_values. It is clear what the tool does and how it differs from the listed 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 description explicitly tells when to use the tool: 'when query_metrics or list_dimension_values returned done: false' and instructs to pass the 'path' from that response. It does not explicitly state when not to use it or name alternatives, but the 'when' condition is exact and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dimension_valuesA
Discover the actual values a dimension takes for a metric in a universe over a date range, e.g. which Country codes, Platform names, FunnelName values, CustomEventName values, or Place IDs have data. Use the returned values in query_metrics filters or to understand breakdown results. Returns { values: [{ dimension, values: [{ value }] }] }.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max values to return per dimension. | |
| filter | No | Restrict results to rows matching every filter. The dimension must be supported by the metric. Use list_dimension_values to discover valid values. | |
| metric | Yes | Metric name, case-sensitive, e.g. DailyActiveUsers, DailyRevenue, ForwardD1Retention, ClientCrashRate15m. Call list_metrics to see all names, their supported granularities, and their supported dimensions. | |
| endTime | Yes | Range end, exclusive, RFC 3339 UTC, e.g. 2026-02-01T00:00:00Z. | |
| startTime | Yes | Range start, inclusive, RFC 3339 UTC, e.g. 2026-01-01T00:00:00Z. | |
| dimensions | Yes | Dimension names to look up, e.g. ['Country'] or ['FunnelName', 'FunnelStep']. | |
| universeId | Yes | The Roblox universe (experience) ID. Found on the Creator Dashboard overview page. | |
| granularity | No | Optional bucket size. | |
| pollTimeoutSeconds | No | How long to wait for a slow query before returning the pending operation (default 60). If the result comes back with done: false, pass its 'path' to get_operation later. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does disclose the return shape and the read-only intent ('Discover'). However, it does not mention that slow queries may return a pending operation with done:false and a path for get_operation, even though pollTimeoutSeconds references this behavior. This is a notable behavioral gap.
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 three sentences: purpose with examples, downstream usage, and return shape. It is front-loaded, concise, and every sentence earns its place without unnecessary detail.
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 9 parameters and no output schema, the description needs to cover the result contract adequately. It provides the primary return shape, but omits the asynchronous pending-operation case (done:false / path / get_operation), which is relevant for correct invocation and result handling. Since the schema documents pollTimeoutSeconds, this is not fatal, but it leaves a gap.
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 100%, so the baseline is 3. The description adds useful context about dimension value examples and how values feed query_metrics filters, but it does not add substantial parameter-specific meaning beyond what the schema already provides.
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 uses a specific verb and resource: 'Discover the actual values a dimension takes for a metric in a universe over a date range.' It gives concrete examples (Country codes, Platform names, FunnelName values, Place IDs), which clearly distinguish it from sibling tools like list_metrics, query_metrics, and get_operation.
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 explicitly tells the agent how to use the output: 'Use the returned values in query_metrics filters or to understand breakdown results.' This gives clear context for when the tool is valuable. It does not explicitly contrast with list_metrics or state when not to use it, so it falls slightly short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_metricsA
List the analytics metrics you can query, with each metric's exact (case-sensitive) name, human label, category, supported granularities, data retention in days, and supported breakdown/filter dimensions. Call this first to pick a metric and check which granularity and dimensions it accepts. Filter by category or search by keyword to keep the output small.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Case-insensitive keyword matched against metric name, label, category, and dimensions, e.g. 'revenue', 'crash', 'Country'. | |
| category | No | Only return metrics in this category. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it discloses case-sensitivity, the exact fields returned, and the fact that unfiltered output may be large. It does not mention pagination or rate limits, but those are minor for a metadata-listing tool.
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 sentences with the main purpose front-loaded and no wasted words. Every clause adds operational value: exact output fields, first-step usage, and filtering guidance.
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 tool with two optional parameters and no output schema, the description fully explains what the response contains and why the agent should call it first. The sibling relationship to query_metrics is implied clearly enough for correct tool selection.
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 input schema already documents both parameters fully, including case-insensitive search behavior and an explicit category enum. The description only restates 'filter by category or search by keyword,' adding no meaningful parameter-level detail beyond the schema.
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 uses a specific verb ('List') and resource ('analytics metrics'), then enumerates the exact contents returned: name, label, category, granularities, retention, and dimensions. It also positions the tool as the discovery entry point, distinguishing it from the sibling query_metrics tool.
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?
It explicitly instructs 'Call this first to pick a metric and check which granularity and dimensions it accepts,' which is clear when-to-use guidance. It also advises using filters to keep output small, but it does not explicitly name when-not-to-use or alternate sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_metricsA
Query a time series for one analytics metric of a Roblox universe (experience): DAU, revenue, retention, playtime, crash rate, funnels, custom events, and more. Returns data points bucketed by granularity, optionally broken down by dimensions (e.g. Platform, Country) and filtered. Each data point has a UTC 'time', a numeric 'value' (or 'stringValues' for text metrics), and may carry a 'status' of Valid, Projected, or NotStatisticallySignificant. Slow queries are polled automatically; if the response has done: false, call get_operation with its 'path'. Requires an API key with the universe.analytics:read scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of breakdown series to return. Only applies with granularity None. | |
| filter | No | Restrict results to rows matching every filter. The dimension must be supported by the metric. Use list_dimension_values to discover valid values. | |
| metric | Yes | Metric name, case-sensitive, e.g. DailyActiveUsers, DailyRevenue, ForwardD1Retention, ClientCrashRate15m. Call list_metrics to see all names, their supported granularities, and their supported dimensions. | |
| endTime | Yes | Range end, exclusive, RFC 3339 UTC, e.g. 2026-02-01T00:00:00Z. | |
| breakdown | No | Dimensions to group by, e.g. ['Platform'] or ['Country', 'AgeGroupV2']. Each series in the response carries its 'breakdowns' values. Must be supported by the metric. | |
| startTime | Yes | Range start, inclusive, RFC 3339 UTC, e.g. 2026-01-01T00:00:00Z. | |
| universeId | Yes | The Roblox universe (experience) ID. Found on the Creator Dashboard overview page. | |
| granularity | Yes | Bucket size. OneDay works for all metrics; OneWeek/OneMonth/None for most engagement, monetization and acquisition metrics; OneMinute/HalfHour/OneHour for performance metrics. None gives one data point for the entire range. | |
| pollTimeoutSeconds | No | How long to wait for a slow query before returning the pending operation (default 60). If the result comes back with done: false, pass its 'path' to get_operation later. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so thoroughly. It discloses async polling behavior, the done:false protocol, the shape of returned data points, possible status values, and the required API scope. This is far beyond a minimal description and gives the agent reliable expectations for 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?
The description is a compact four-sentence paragraph with no filler. It front-loads the core purpose, then covers return shape, async behavior, and authentication requirements in logical order. Every sentence contributes meaningful information.
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?
Given the tool's complexity—9 parameters, no output schema, and no annotations—the description is remarkably complete. It explains what the response contains, how slow operations work, how to recover a pending operation, and what permission is required. There is little an agent would need to infer or discover elsewhere.
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 input schema already provides 100% parameter coverage with detailed descriptions for every field, so the baseline is 3. The description adds high-level context about bucketing, breakdowns, and filtering, but it mostly restates what the schema documents rather than adding new parameter-level semantics.
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 states a specific verb and resource: 'Query a time series for one analytics metric of a Roblox universe.' It lists concrete metric examples and differentiates itself from siblings like list_metrics, list_dimension_values, and get_operation by focusing on actual data retrieval and even explaining when to delegate to get_operation.
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 clearly establishes when to use the tool: any time you need metric time-series data for a universe. It also provides an explicit routing rule for slow queries ('if the response has done: false, call get_operation'), but it does not explicitly state when to prefer list_metrics or list_dimension_values over this tool, though the schema does mention them.
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.
4 tool updates
v0.1.0- First observed
get_operation - First observed
list_dimension_values - First observed
list_metrics - First observed
query_metrics
TDQS
Scored across 4 tools
Each tool has a distinct responsibility: listing available metrics, querying metric time series, discovering dimension values, and polling async operations. There is no overlap in purpose; descriptions clearly separate the two data-retrieval tools.
All tool names follow a consistent verb_noun pattern (list_metrics, query_metrics, list_dimension_values, get_operation). The naming style is uniform and predictable.
Four tools is an appropriate size for an analytics-focused server: discovery, query, dimension exploration, and async operation handling cover the necessary workflow without bloat. Each tool earns its place.
The set covers the full analytics query lifecycle: find a metric, inspect its dimensions, run the query, and retrieve results for long-running operations. There are no obvious dead ends or missing core capabilities.
Maintenance
Related MCP Connectors
Query your Betterlytics web analytics from AI agents: traffic, funnels, journeys, errors, uptime.
Read-only analytics for Convex apps, queryable via MCP from Claude, Cursor, and other clients.
Real-time web analytics for AI agents: query traffic, funnels, revenue, and manage your sites.
Analytics your AI agent can actually use. Track, experiment, and optimize via MCP.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI agents to access website analytics, including visitor sessions, UX friction, conversion funnels, and anomaly alerts.665 PyPIMIT
- AlicenseNot gradedqualityFmaintenanceEnables LLMs to interact with Google Analytics 4 data through the Google Analytics Data API, supporting standard reports, real-time data, and metadata retrieval.19MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to query Google Analytics accounts, properties, and run reports using natural language through the Admin and Data APIs.61Apache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to query Google Analytics 4 data, including listing accounts and properties, running historical and real-time reports with customizable metrics and dimensions.-