Skip to main content
Glama

Get owned games

get_owned_games
Read-only

Retrieve a player's owned games with playtime, sorted by most-played first. Check ownership of specific appids across the full library, even beyond the default 50-game cap.

Instructions

List the games a player owns with playtime (hours), ordered by playtime — most-played first by default, least-played first with sort='playtime_asc' (the games list is capped to 50 entries by default, so the far end of that ordering may not appear there; raise limit to widen the cap, or flip sort to keep the never-played end instead, which is what a 'what have I never got round to playing' question needs). To reliably check whether the player owns one or more SPECIFIC appids regardless of that cap — 'do I own game X' — pass check_appids; the owns field then checks the FULL, uncapped library, with each result's own playtime_hours (null if not owned). For the last two weeks of play instead of the all-time library, use get_recently_played. For checking a FRIEND's ownership instead of the player's own, use find_friends_who_own. Requires STEAM_API_KEY and a public profile + game-details visibility. Get the SteamID64 from resolve_vanity_url.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sortNoWhich end of the library the cap keeps: 'playtime_desc' (default) the most-played, 'playtime_asc' the least-played and never-played first.
limitNoHow many games to return (1-300, default 50). Raise it only when a wider slice of the library is genuinely needed — the ceiling is a response-size budget, so even a 4000-game account never comes back whole. To check specific appids past the cap, use check_appids rather than a bigger limit.
steamidNo17-digit SteamID64. Omit to use the STEAM_ID configured on the server. Convert a vanity/custom URL name with resolve_vanity_url first.
check_appidsNoSteam appids to check ownership of (1-50), regardless of the 50-entry cap on `games` (or of whichever end `sort` keeps). Prefer this over raising `limit`: it reads the FULL library, and its own cost is bounded by this list's length. Adds an `owns` field: [{appid, owned, playtime_hours}]. One upstream gap to know about: Steam omits free-to-play titles the player owns but has NEVER launched, so those report owned:false — as does an appid that doesn't exist, so this field can't tell 'no such game' from 'doesn't own it'. A private profile reports no `owns` at all (ownership unknown) rather than a false owned:false.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.14.0
    • changedInput schema / properties / check_appids / description
      Previous value: -"Steam appids to check ownership of (1-50), regardless of the top-50-by-playtime cap on `games`. Adds an `owns` field: [{appid, owned, playtime_hours}]. One upstream gap to know about: Steam omits free-to-play titles the player owns but has NEVER launched, so those report owned:false. A private profile reports no `owns` at all (ownership unknown) rather than a false owned:false."New value: +"Steam appids to check ownership of (1-50), regardless of the 50-entry cap on `games` (or of whichever end `sort` keeps). Prefer this over raising `limit`: it reads the FULL library, and its own cost is bounded by this list's length. Adds an `owns` field: [{appid, owned, playtime_hours}]. One upstream gap to know about: Steam omits free-to-play titles the player owns but has NEVER launched, so those report owned:false — as does an appid that doesn't exist, so this field can't tell 'no such game' from 'doesn't own it'. A private profile reports no `owns` at all (ownership unknown) rather than a false owned:false."
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "How many games to return (1-300, default 50). Raise it only when a wider slice of the library is genuinely needed — the ceiling is a response-size budget, so even a 4000-game account never comes back whole. To check specific appids past the cap, use check_appids rather than a bigger limit.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 300,
      +  "type": "integer"
      +}
    • addedInput schema / properties / sort
      Added value: +{
      +  "description": "Which end of the library the cap keeps: 'playtime_desc' (default) the most-played, 'playtime_asc' the least-played and never-played first.",
      +  "enum": [
      +    "playtime_desc",
      +    "playtime_asc"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "found": {
      -        "const": false,
      -        "type": "boolean"
      -      },
      -      "game_count": {
      -        "type": "null"
      -      },
      -      "games": {
      -        "items": {
      -          "not": {}
      -        },
      -        "type": "array"
      -      },
      -      "reason": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "found",
      -      "reason",
      -      "game_count",
      -      "games"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "found": {
      -        "const": true,
      -        "type": "boolean"
      -      },
      -      "game_count": {
      -        "type": "number"
      -      },
      -      "games": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "appid": {
      -              "type": "number"
      -            },
      -            "name": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "playtime_2weeks_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "playtime_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "playtime_hours",
      -            "playtime_2weeks_hours"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "owns": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "appid": {
      -              "type": "number"
      -            },
      -            "owned": {
      -              "type": "boolean"
      -            },
      -            "playtime_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "appid",
      -            "owned",
      -            "playtime_hours"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "returned": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "found",
      -      "game_count",
      -      "returned",
      -      "games"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "found": {
      +        "const": false,
      +        "type": "boolean"
      +      },
      +      "game_count": {
      +        "type": "null"
      +      },
      +      "games": {
      +        "items": {
      +          "not": {}
      +        },
      +        "type": "array"
      +      },
      +      "reason": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "found",
      +      "reason",
      +      "game_count",
      +      "games"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "found": {
      +        "const": true,
      +        "type": "boolean"
      +      },
      +      "game_count": {
      +        "type": "number"
      +      },
      +      "games": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "appid": {
      +              "type": "number"
      +            },
      +            "name": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "playtime_2weeks_hours": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "playtime_hours": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "playtime_hours",
      +            "playtime_2weeks_hours"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "owns": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "appid": {
      +              "type": "number"
      +            },
      +            "owned": {
      +              "type": "boolean"
      +            },
      +            "playtime_hours": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "appid",
      +            "owned",
      +            "playtime_hours"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "returned": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "found",
      +      "game_count",
      +      "returned",
      +      "games"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed2 schema fields changedv0.13.1
    • changedInput schema / properties / check_appids / description
      Previous value: -"Steam appids to reliably check ownership of (1-50), regardless of the top-50-by-playtime cap on `games`. Adds an `owns` field: [{appid, owned, playtime_hours}]."New value: +"Steam appids to check ownership of (1-50), regardless of the top-50-by-playtime cap on `games`. Adds an `owns` field: [{appid, owned, playtime_hours}]. One upstream gap to know about: Steam omits free-to-play titles the player owns but has NEVER launched, so those report owned:false. A private profile reports no `owns` at all (ownership unknown) rather than a false owned:false."
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "found": {
      -        "const": false,
      -        "type": "boolean"
      -      },
      -      "game_count": {
      -        "type": "null"
      -      },
      -      "games": {
      -        "items": {
      -          "not": {}
      -        },
      -        "type": "array"
      -      },
      -      "owns": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "appid": {
      -              "type": "number"
      -            },
      -            "owned": {
      -              "const": false,
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "appid",
      -            "owned"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "reason": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "found",
      -      "reason",
      -      "game_count",
      -      "games"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "found": {
      -        "const": true,
      -        "type": "boolean"
      -      },
      -      "game_count": {
      -        "type": "number"
      -      },
      -      "games": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "appid": {
      -              "type": "number"
      -            },
      -            "name": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "playtime_2weeks_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "playtime_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "playtime_hours",
      -            "playtime_2weeks_hours"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "owns": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "appid": {
      -              "type": "number"
      -            },
      -            "owned": {
      -              "type": "boolean"
      -            },
      -            "playtime_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "appid",
      -            "owned",
      -            "playtime_hours"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "returned": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "found",
      -      "game_count",
      -      "returned",
      -      "games"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "found": {
      +        "const": false,
      +        "type": "boolean"
      +      },
      +      "game_count": {
      +        "type": "null"
      +      },
      +      "games": {
      +        "items": {
      +          "not": {}
      +        },
      +        "type": "array"
      +      },
      +      "reason": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "found",
      +      "reason",
      +      "game_count",
      +      "games"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "found": {
      +        "const": true,
      +        "type": "boolean"
      +      },
      +      "game_count": {
      +        "type": "number"
      +      },
      +      "games": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "appid": {
      +              "type": "number"
      +            },
      +            "name": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "playtime_2weeks_hours": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "playtime_hours": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "playtime_hours",
      +            "playtime_2weeks_hours"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "owns": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "appid": {
      +              "type": "number"
      +            },
      +            "owned": {
      +              "type": "boolean"
      +            },
      +            "playtime_hours": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "appid",
      +            "owned",
      +            "playtime_hours"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "returned": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "found",
      +      "game_count",
      +      "returned",
      +      "games"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed3 schema fields changedv0.12.1
    • addedInput schema / additionalProperties
      Added value: +false
    • removedOutput schema / anyOf
      Removed value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "found": {
      -        "const": false,
      -        "type": "boolean"
      -      },
      -      "game_count": {
      -        "type": "null"
      -      },
      -      "games": {
      -        "items": {
      -          "not": {}
      -        },
      -        "type": "array"
      -      },
      -      "owns": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "appid": {
      -              "type": "number"
      -            },
      -            "owned": {
      -              "const": false,
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "appid",
      -            "owned"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "reason": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "found",
      -      "reason",
      -      "game_count",
      -      "games"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "found": {
      -        "const": true,
      -        "type": "boolean"
      -      },
      -      "game_count": {
      -        "type": "number"
      -      },
      -      "games": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "appid": {
      -              "type": "number"
      -            },
      -            "name": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "playtime_2weeks_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "playtime_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "playtime_hours",
      -            "playtime_2weeks_hours"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "owns": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "appid": {
      -              "type": "number"
      -            },
      -            "owned": {
      -              "type": "boolean"
      -            },
      -            "playtime_hours": {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "appid",
      -            "owned",
      -            "playtime_hours"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "returned": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "found",
      -      "game_count",
      -      "returned",
      -      "games"
      -    ],
      -    "type": "object"
      -  }
      -]
    • addedOutput schema / oneOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "found": {
      +        "const": false,
      +        "type": "boolean"
      +      },
      +      "game_count": {
      +        "type": "null"
      +      },
      +      "games": {
      +        "items": {
      +          "not": {}
      +        },
      +        "type": "array"
      +      },
      +      "owns": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "appid": {
      +              "type": "number"
      +            },
      +            "owned": {
      +              "const": false,
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "appid",
      +            "owned"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "reason": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "found",
      +      "reason",
      +      "game_count",
      +      "games"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "found": {
      +        "const": true,
      +        "type": "boolean"
      +      },
      +      "game_count": {
      +        "type": "number"
      +      },
      +      "games": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "appid": {
      +              "type": "number"
      +            },
      +            "name": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "playtime_2weeks_hours": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "playtime_hours": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "playtime_hours",
      +            "playtime_2weeks_hours"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "owns": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "appid": {
      +              "type": "number"
      +            },
      +            "owned": {
      +              "type": "boolean"
      +            },
      +            "playtime_hours": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "appid",
      +            "owned",
      +            "playtime_hours"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "returned": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "found",
      +      "game_count",
      +      "returned",
      +      "games"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Addedv0.10.5
  5. Removedv0.10.4
  6. Addedv0.10.4
  7. Removedv0.8.0
  8. Changed2 schema fields changedv0.3.0
    • changedInput schema / properties / steamid / description
      Previous value: -"17-digit SteamID64. Convert a vanity/custom URL name with resolve_vanity_url first."New value: +"17-digit SteamID64. Omit to use the STEAM_ID configured on the server. Convert a vanity/custom URL name with resolve_vanity_url first."
    • removedInput schema / required
      Removed value: -[
      -  "steamid"
      -]
  9. First observedv0.1.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations carry readOnlyHint=true and openWorldHint=true, but the description adds substantial behavior beyond that: the 50-entry cap is a 'response-size budget' that never returns a full 4000-game account, and the edge cases for check_appids are disclosed — free-to-play titles never launched report owned:false, nonexistent appids also report owned:false, and a private profile reports no 'owns' at all rather than a false negative. These are genuine, non-obvious behavioral disclosures that materially change how an agent should interpret results. No contradiction with the read-only annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence earns its place — it tackles real complexity (cap ordering, uncapped checks, edge cases, sibling routing). It is front-loaded with the core purpose and sorts precedence, then flows into cap behavior, check_appids, alternatives, and requirements in a logical order. It skirts length but never pads; it borders on dense rather than bloated.

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 tool with 0 required parameters, 4 optional params, an output schema (so return values need not be spelled out), and high edge-case complexity, the description is complete. It covers the cap and ordering behavior, the uncapped ownership check with its caveats, all three sibling differentiators, requirements, and the steamid source. An agent has everything needed to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions are themselves detailed (sort enum semantics, limit ceiling of 300 as a budget, steamid pattern). The description adds guidance over and above the schema: 'raise it only when a wider slice of the library is genuinely needed', 'Prefer this over raising limit' for check_appids, and the owns-field format. This exceeds the baseline 3 because the description clarifies when and why to use each parameter, not just what it means.

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 opens with a specific verb+resource: 'List the games a player owns with playtime (hours), ordered by playtime'. It immediately distinguishes itself from siblings by naming the alternatives — 'For the last two weeks of play... use get_recently_played' and 'For checking a FRIEND's ownership... use find_friends_who_own'. An agent can separate this from the 24 sibling tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit and conditional: when to use get_recently_played (last-two-weeks scenarios), when to use find_friends_who_own (friend ownership), and when to pick check_appids over a bigger limit ('To check specific appids past the cap, use check_appids rather than a bigger limit'). It also states prerequisites (STEAM_API_KEY, public profile, game-details visibility) and tells how to obtain the steamid. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.