Roblox-portfolio-mcp: a read-only MCP for your game's numbers

17 read-only tools over your live stats, Open Cloud analytics, and Discord feedback.

Current version: v0.1.1


I know this forum is pretty tired of new MCPs but wanted to share as I haven’t seen one touching this side and I use this everyday.

roblox-portfolio-mcp samples the public Roblox API and Open Cloud analytics into a local SQLite file, then exposes that history to Claude or any other MCP client.

It’s portfolio-side. No plugin, no place access, never writes anything..

What’s in it

  • Live CCU, visits, and vote counts
  • Historical trends from your own recorded history
  • DAU, revenue, retention, session length via Open Cloud
  • Dimension breakdowns (platform, country, etc.)
  • Universe metadata and monetization catalog
  • Data store reads on global/aggregate keys
  • Timestamped icon and thumbnail change logs
  • Nightly ranked digest of what your Discord is reporting (see below)
  • Group and game discovery, or pin individual universes
  • Stdlib only, except the MCP server itself
  • 520 tests, all offline
  • Free, MIT

The Discord digest

The part I use most. Your players are already reporting bugs and asking for things in your Discord, and most of it scrolls past.

text

feedback/run.py          one cycle, nightly, then exits

  pull      ->  new messages since each channel's cursor, forums and threads too
  classify  ->  Haiku, batched: type, topics, sentiment, quality
  digest    ->  Sonnet, per game per kind: top N issues ranked by mentions

  all of it into the same SQLite file the recorder writes

No warehouse and no separate service. Messages land as rows tagged with the universe their channel belongs to.

Each message comes back tagged:

Field Values
feedback_type BUG FEATURE FRICTION SOLUTION NOISE
topics normalized keywords
sentiment positive, negative, neutral, mixed
quality HIGH MEDIUM LOW

The classifier gets the source channel, so a report in #bugs is taken at face value while the same words in #game-discussion have to clear a higher bar before they count as anything but chatter.

The nightly digest ranks the trailing window’s BUG and FEATURE messages into the top N distinct issues per game, each with a mention count and a couple of representative message links. FRICTION and SOLUTION get classified but aren’t ranked yet.

discord_digest puts that in front of your agent next to the numbers, so “retention dipped on the 14th” and “nine people raised the shop button on the 14th” turn up in the same conversation instead of two different tabs. discord_messages gets you the raw messages if you’d rather read them yourself.

What it won't do
  • A message the classifier skips stays NULL rather than defaulting to NOISE, so the next night picks it up again
  • A failed batch leaves that batch unclassified instead of guessing
  • A quiet night writes a run row with zero issues, which is a different thing from a night that never ran
  • A failed digest leaves yesterday’s ranking alone rather than replacing it with nothing
  • Nothing in the pipeline writes back to Discord

Tier 3, so it needs a Discord bot token and an Anthropic key. Easy to set up and optimized so even if your Discord is seeing 10k+ messages a day your cost should be at most a couple bucks a month.


Try it without a key

Tier 0 needs no Open Cloud key, no server, no cron. Fresh clone, install and drop your universe id into recorder/config.json:

{
  "groups": [],
  "pinned_universes": [YOUR_UNIVERSE_ID],
  "db": "var/roblox-portfolio.db"
}

Then:

python -m pip install -r mcp_server/requirements.txt
python -m recorder.poll            # one cycle, by hand
python -m recorder.query portfolio # real player counts, on stdout

Six of the 17 tools work off that. The rest are opt-in:

Tier You add You get
0 nothing portfolio_now, live_now, list_games, game_history, game_thumbnails, group_info
1 an Open Cloud key universe_info, game_catalog, analytics_breakdown, data store reads
2 a scheduler line game_analytics, revenue_summary, thumbnail_changes
3 Discord bot token + Anthropic key discord_digest, discord_messages

The recorder runs one cycle and exits, so tier 2 is a cron line, not a daemon. A laptop firing it a few times a day builds real history.

There’s a CLAUDE.md in the repo written for the agent rather than for you, so if you’d rather not do the config by hand, point Claude Code at the clone and ask it to set you up.

Two public endpoints, if you’re doing your own thing

Roblox's charts endpoint and Rolimon's game list, helpful for competitive research

Not wired in as tools, since I only pin shapes I control. Both took a while to find.

Roblox’s charts endpoint. Unauthenticated, behind the Charts page. Five sorts (top-trending, up-and-coming, top-playing-now, top-revisited, fun-with-friends), 30 to 97 games each. Rows carry universeId, playerCount, up/down votes, genreL1 and isSponsored, so you can tell a paid placement from an earned one. sessionId is required but never validated. Any string works, omitting it 400s.

text

https://apis.roblox.com/explore-api/v1/get-sorts?sessionId=anything&device=computer&country=all
https://apis.roblox.com/explore-api/v1/get-sort-content?sessionId=anything&sortId=top-trending&device=computer&country=all

Rolimon’s game list. Keyless, ~6,900 games as [name, concurrent_players, thumbnail]. It’s keyed by root place id, not universe id, which is backwards from everything else here and will bite you. It’s also a curated opt-in list, so a game being absent tells you nothing (several of mine aren’t in it). CCU sampled within ~2% of the live API on a top game when I checked.

text

https://api.rolimons.com/games/v1/gamelist

Status

Working, in use on my own games, but the public repo is a week old and I’m the only one running it in this shape. Setup is where I’d expect it to break, since that path never had to work for anyone but me.

Worth knowing before you install: Open Cloud doesn’t expose funnel or economy events, and no impression or CTR data. So the thumbnail tools log when an icon changed and let you line that up against CCU and DAU afterward, which is a proxy, not a real A/B readout. If you want the discovery numbers you’re still opening the dashboard. Both are on Roblox’s side rather than mine, and I’ll wire them in the day they show up.

Issues and PRs welcome. If a tool gives you a confusing answer, that’s a bad error message and I want to hear about it.

:star: it on GitHub if you end up using it!

1 Like