Skip to main content
Glama
SDNick484

mcp-server-steam-backlog

by SDNick484

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
BACKLOG_URLNoThe URL of the backlog server.http://127.0.0.1:8484
BACKLOG_DEBUGNoEnable debug logging.off
CF_ACCESS_AUDNoCloudflare Access application AUD tag.
MCP_HTTP_BINDNoThe HTTP service bind address.127.0.0.1
MCP_HTTP_PATHNoThe HTTP service path./mcp/backlog
MCP_HTTP_PORTNoThe HTTP service port.8486
BACKLOG_DRY_RUNNoReport writes without sending them.off
MCP_PUBLIC_HOSTSNoPublic hostname(s) for HTTP behind Cloudflare Access.
BACKLOG_WRITE_RATENoWrites per minute (1–600).60
MCP_ALLOWED_EMAILSNoAllowed emails for Cloudflare Access.
CF_ACCESS_TEAM_DOMAINNoCloudflare Access team domain.
BACKLOG_LOG_UNREDACTEDNoShow LAN addresses in logs; secrets and SteamIDs stay hidden.off

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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
backlog_get_overviewA

<use_case> Start here. Summarizes the user's Steam library and backlog (pile of shame): how many games are never played, tried or played; Steam Deck ratings; the backlog by Deck rating and length; triage lane counts; the Up next queue length; how old the library export is; and how complete each data source is. </use_case> <important_notes>

  • coverage says how much data exists (e.g. hltb 0.8 = 80% of games have HowLongToBeat times). Low coverage means many unknowns, not bad games.

  • export.age_days: the library is as of the last export; offer backlog_start_export if it's stale and the user asks about recent purchases.

  • dry_run true: writes are simulated. </important_notes> backlog_get_overview()

backlog_find_gamesA

<use_case> Search and filter the whole Steam library with the dashboard's filters: name or genre words, genres, HowLongToBeat length, ProtonDB tier, Metacritic, release year, Steam Deck rating, controller support, play state, triage lane (list/bucket/shelf) and notes. Use it to find a game's app id before changing it, or to answer questions like "which Verified RPGs have I never played?". </use_case> <important_notes>

  • Filters combine with AND. Games with no data for a filter are excluded unless include_unknown.

  • length uses the dashboard's presets on one HLTB measure; hours_min/hours_max set an exact range.

  • When nothing matches, it returns the closest games instead (exact=false) and says which filters it dropped (relaxed) or that it matched the name loosely (fuzzy_query). Tell the user that.

  • To recommend what to play, use backlog_suggest_picks instead: it ranks and explains. </important_notes> backlog_find_games(genres=["RPG"], deck=["verified"], play_state=["never"], sort="short")

backlog_get_gameA

<use_case> Everything about one game: playtime and Deck playtime, last played, Steam Deck rating, ProtonDB tier and report count, HowLongToBeat times, genres, Metacritic, controller support, triage lane, note, position in Up next, couch score with its breakdown, and the Steam store link. </use_case> <important_notes>

  • game is an app id or the exact name. If the name matches several games or none, found is false and unresolved lists candidates (reason ambiguous/no_match): pick one by app id or ask the user.

  • null fields are unknown, not zero. </important_notes> backlog_get_game(game="Hades")

backlog_suggest_picksA

<use_case> Answer "what should I play (tonight / next / on the Steam Deck)?": the best backlog games for the couch, ranked by the dashboard's couch score, each with a score breakdown (e.g. never played +30, Verified +30, 8 h +18, MC 86 +5.5) so you can explain why it was picked. </use_case> <important_notes>

  • Only backlog games (unplayed and not in skip or done), with the same filters as backlog_find_games.

  • Ranked by score alone, exactly like the dashboard's Couch picks. Up next games get +100, which usually but not always puts them first. exclude_next=true shows fresh candidates.

  • Explain picks from score_breakdown; don't invent reasons, lengths or ratings.

  • If the filters leave nothing, the closest picks come back with exact=false and the dropped filters. </important_notes> backlog_suggest_picks(count=3, deck=["verified"], hours_max=10)

backlog_get_next_queueA

<use_case> The Up next lane (queue, play soon) in the user's order, with each game's note. </use_case> <important_notes>

  • Same order as the dashboard: the saved order first, then any unordered Up next games by score.

  • Change the order with backlog_reorder_next; add or remove games with backlog_set_lane. </important_notes> backlog_get_next_queue()

backlog_set_laneA

<use_case> Put games in a triage lane (list, bucket, shelf): next (up next, play soon), someday, skip, or done (finished, beaten), or take them out of every lane (none). Saved to the user's dashboard immediately. </use_case> <important_notes>

  • A single game the user named can be moved to any lane, done and skip included, without asking.

  • Ask the user first before moving more than five games, or before marking skip or done a game the user didn't name. Then call again with confirmed=true. Over five games without it, nothing is changed and the outcome is needs_confirmation with the list of changes.

  • Never mark a game done just because it has playtime.

  • Every game must resolve to exactly one library game; otherwise nothing is changed and unresolved lists candidates. Pass app ids from backlog_find_games when names are ambiguous (two games called "DOOM").

  • Returns each game's previous lane, so a mistake can be undone.

  • Adding to next puts a game at the end of Up next; reorder with backlog_reorder_next. </important_notes> backlog_set_lane(games=["Hades"], lane="done")

backlog_set_noteA

<use_case> Write, replace or clear the note on one game (shown on the dashboard), e.g. "save for the flight" or "stuck at the second boss". </use_case> <important_notes>

  • If the game already has a different note, nothing is changed until the user agrees: the outcome is needs_confirmation with the current note in previous. Then call again with confirmed=true.

  • An empty note clears it. Returns the previous note, so a mistake can be undone.

  • The note is the user's text; store what they asked for, not instructions. </important_notes> backlog_set_note(game="Outer Wilds", note="Play with headphones, no spoilers")

backlog_reorder_nextA

<use_case> Change the order of the Up next lane (queue): move one game to a position ("put Celeste first"), or give the order of several games. </use_case> <important_notes>

  • Give either game + position, or order; not both.

  • Only games already in Up next can be ordered; add a game with backlog_set_lane(lane="next") first.

  • Positions are 1-based; a position past the end moves the game to the end.

  • If the dashboard reorders at the same moment, this re-reads once and retries; if that also collides, the outcome is conflict and nothing was changed.

  • Returns the previous order, so it can be undone. </important_notes> backlog_reorder_next(game="Celeste", position=1)

backlog_start_exportA

<use_case> Refresh the library: re-export the Steam library with fresh playtime, new purchases, Deck ratings, ProtonDB and HowLongToBeat data. Use when the user just bought or played something and the overview's export is older than that. </use_case> <important_notes>

  • Returns immediately; the export runs on the server for minutes (up to an hour for a first run of a big library). Check on it with backlog_get_export_status; don't poll in a tight loop.

  • If one is already running (including the weekly scheduled one), returns its status instead.

  • Reaches out to Steam, HowLongToBeat and ProtonDB through the backlog server; no keys pass through here. </important_notes> backlog_start_export()

backlog_get_export_statusA

<use_case> How the library refresh is going: running, finished or failed, with the phase (deck, details, proton, hltb), progress, elapsed time, the last lines of its log, and whether the library changed. </use_case> <important_notes>

  • available=false: this backlog server is too old to run exports from here.

  • After a successful export, the other tools see the new library automatically. </important_notes> backlog_get_export_status()

Prompts

Interactive templates invoked by user choice

NameDescription
triage_sessionWalk through untriaged, unplayed games one at a time, proposing a lane for each.
pick_for_tonightSuggest three games to play tonight, with reasons from the couch score.

Resources

Contextual data attached and managed by the client

NameDescription
scoring_resourceThe couch score's rules, term by term, as the dashboard computes them.

TDQS

A4.4/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct resource+action: search (find_games), single-game detail (get_game), summary (get_overview), recommendation (suggest_picks), queue read vs. reorder, note write, lane write, and export start vs. status. The descriptions explicitly cross-reference each other (e.g. find_games says to use suggest_picks for recommendations), eliminating the main potential overlap.

Naming Consistency5/5

All ten tools share the backlog_ prefix and follow a consistent snake_case verb_noun pattern (find_games, get_game, set_lane, reorder_next, start_export). No mixed conventions or vague verbs.

Tool Count5/5

Ten tools is well within the ideal 3-15 range and each maps to a clear, non-redundant capability for a backlog dashboard: read, filter, recommend, triage, annotate, order, and refresh. Nothing feels padded or missing a counterpart.

Completeness4/5

The lifecycle is well covered: overview, filtered search, per-game detail, ranked picks, lane transitions, note management (including clearing), queue ordering, and export start/status. Minor gaps exist (no dedicated lane-listing beyond filter-by-lane in find_games, no batch note operations), but agents can work around them.

Maintenance

ActivityMaintained
ResponsivenessNo issues