Skip to main content
Glama
frrazer

roblox-analytics-mcp

by frrazer

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

list_metrics

Browse the ~150 supported metrics with their exact names, categories, supported granularities, retention windows, and supported dimensions. Filter by category or keyword.

query_metrics

Query a metric time series for a universe: pick a granularity (OneMinuteOneMonth, or None for one total), a date range, optional breakdown dimensions and filters.

list_dimension_values

Discover which values a dimension actually has (countries, platforms, funnel names, custom event names, place IDs, …) for a metric and date range.

get_operation

Poll a slow query that came back with done: false.

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

  1. Go to the Creator Dashboard → Open Cloud → API Keys.

  2. Create a key and add the universe-analytics API system.

  3. Give it the universe.analytics:read scope 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 setup

This 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 status

4. Connect it to Claude Code

Either register it:

claude mcp add roblox-analytics -- roblox-analytics-mcp

or 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

roblox-analytics-mcp setup

Store or replace the key

roblox-analytics-mcp setup --clear

Delete the stored key

roblox-analytics-mcp status

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, not dailyactiveusers). 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.

  • startTime is inclusive and endTime is 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 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesThe 'path' value from a pending response, e.g. v1/universes/123/operations/metrics/abc.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 }] }] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax values to return per dimension.
filterNoRestrict results to rows matching every filter. The dimension must be supported by the metric. Use list_dimension_values to discover valid values.
metricYesMetric name, case-sensitive, e.g. DailyActiveUsers, DailyRevenue, ForwardD1Retention, ClientCrashRate15m. Call list_metrics to see all names, their supported granularities, and their supported dimensions.
endTimeYesRange end, exclusive, RFC 3339 UTC, e.g. 2026-02-01T00:00:00Z.
startTimeYesRange start, inclusive, RFC 3339 UTC, e.g. 2026-01-01T00:00:00Z.
dimensionsYesDimension names to look up, e.g. ['Country'] or ['FunnelName', 'FunnelStep'].
universeIdYesThe Roblox universe (experience) ID. Found on the Creator Dashboard overview page.
granularityNoOptional bucket size.
pollTimeoutSecondsNoHow 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

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoCase-insensitive keyword matched against metric name, label, category, and dimensions, e.g. 'revenue', 'crash', 'Country'.
categoryNoOnly return metrics in this category.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax number of breakdown series to return. Only applies with granularity None.
filterNoRestrict results to rows matching every filter. The dimension must be supported by the metric. Use list_dimension_values to discover valid values.
metricYesMetric name, case-sensitive, e.g. DailyActiveUsers, DailyRevenue, ForwardD1Retention, ClientCrashRate15m. Call list_metrics to see all names, their supported granularities, and their supported dimensions.
endTimeYesRange end, exclusive, RFC 3339 UTC, e.g. 2026-02-01T00:00:00Z.
breakdownNoDimensions to group by, e.g. ['Platform'] or ['Country', 'AgeGroupV2']. Each series in the response carries its 'breakdowns' values. Must be supported by the metric.
startTimeYesRange start, inclusive, RFC 3339 UTC, e.g. 2026-01-01T00:00:00Z.
universeIdYesThe Roblox universe (experience) ID. Found on the Creator Dashboard overview page.
granularityYesBucket 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.
pollTimeoutSecondsNoHow 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

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 4 tool updatesv0.1.0
    • First observedget_operation
    • First observedlist_dimension_values
    • First observedlist_metrics
    • First observedquery_metrics

TDQS

A4.4/5.0

Scored across 4 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers