Token导航 LogoToken导航

Agent Skill · 研究检索

steam-gaming-companion(Steam 游戏伴侣)

steam-gaming-companion 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

steam-gaming-companion 是研究检索类 Agent Skill,可用宿主为 OpenClaw,通过ClawHub获取,权限为接触敏感数据;许可证为 MIT-0,第三方扫描已通过,按安装量在研究检索类的 73,675 个 Skill 里排第 22,321。

总安装 4,586周安装 195GitHub Stars 公开资料未说明下载 1,607核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT-0
版本
1.0.0

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:steam-gaming-companion(Steam 游戏伴侣)
来源仓库:https://github.com/eduardmirko390-crypto/steam-gaming-companion
安装命令:
openclaw skills install steam-gaming-companion
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install steam-gaming-companion

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

steam-gaming-companion 集成 Steam Web API 管理游戏库与愿望单。提供游玩推荐、成就追踪与促销监控功能。steam-gaming-companion 属于研究检索类 Skill,可作为该场景下的辅助能力补充。适用于玩家个性化管理、游戏收藏整理或折扣提醒。

API 调用受 Steam 速率限制,频繁请求可能导致临时封禁。隐私设置会影响数据可见性,需用户授权相应权限。

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 OpenClaw;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 openclaw skills install steam-gaming-companion;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

steam-gaming-companion 怎么安装?

在终端执行 openclaw skills install steam-gaming-companion。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

steam-gaming-companion 支持哪些 AI 工具?

公开资料标注支持 OpenClaw。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

steam-gaming-companion 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

steam-gaming-companion 是免费的吗?

来源标注的许可证是 MIT-0。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

steam-gaming-companion 用的人多吗?

公开数据是累计安装 4,586 次,近一周安装 195 次,下载 1,607 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

steam-gaming-companion 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 专注 OpenClaw 一种宿主,触发方式和使用习惯不用来回切换。
  • 许可证明确为 MIT-0,商用和分发边界好判断。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 OpenClaw,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。
  • 需要许可证清楚、并且有第三方扫描结果的团队项目。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
steam-gaming-companion

Steam 游戏伴侣 · 本页

4,586—接触敏感数据MIT-0通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

name
steam-gaming-companion
description
>
version
1.0.0
tags
author
steam-companion
requires
optional_env

Steam & PC Gaming Companion

A complete Steam Web API integration skill. Manages your library, tracks achievements, monitors wishlist sales, recommends what to play next, and looks up any game — all from natural language.


Setup

Step 1: Get Your Steam API Key (required, 30 seconds)

  1. Go to https://steamcommunity.com/dev/apikey
  2. Sign in with your Steam account
  3. Enter any domain name (e.g. localhost) — it doesn't matter for personal use
  4. Click Register and copy the key
  5. Set it: STEAM_API_KEY=<your-key>

Step 2: Get Your 64-bit Steam ID (required, 15 seconds)

Your Steam ID is NOT your vanity URL or display name. It's a 17-digit number.

  1. Go to https://steamid.io
  2. Paste your Steam profile URL (e.g. https://steamcommunity.com/id/yourname)
  3. Copy the steamID64 value (looks like 76561198012345678)
  4. Set it: STEAM_ID=<your-steam-id-64>

Step 3: Get IGDB Credentials (optional, 2 minutes)

IGDB provides richer game metadata (ratings, genres, descriptions) than the Steam store API. It's free via Twitch.

  1. Go to https://dev.twitch.tv/console/apps and log in with your Twitch account (create one if needed)
  2. Click Register Your Application
  3. Name: anything (e.g. steam-companion), OAuth Redirect: http://localhost, Category: Application Integration
  4. Click Manage on your new app, copy the Client ID
  5. Generate a Client Secret and copy it
  6. Get an access token by running:
   curl -X POST 'https://id.twitch.tv/oauth2/token' \
     -d 'client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=client_credentials'
  1. Copy the access_token from the response
  2. Set both:
   IGDB_CLIENT_ID=<your-client-id>
   IGDB_ACCESS_TOKEN=<your-access-token>

Note: IGDB tokens expire after ~60 days. If game lookups start failing with 401, regenerate the token using step 6.

Step 4: Verify Setup

Tell the agent: "verify my steam setup" — it will confirm your credentials work and show your account name and library size.


Trigger Conditions

User Says (examples)Feature Triggered
"show my steam library", "how many games do I own", "what's in my backlog"Library Overview + Backlog Manager
"what should I play", "recommend something chill for an hour", "I have all night, what's good"Play Recommender
"any wishlist sales", "check my wishlist", "are any of my wishlisted games on sale"Wishlist Sale Monitor
"show my achievements for Hades", "how far am I in Elden Ring", "achievement progress"Achievement Tracker
"most played games", "what do I play the most", "top 10 games by hours"Most Played Rankings
"tell me about Hollow Knight", "look up Baldur's Gate 3", "game info for Celeste"Game Info Lookup
"verify my steam setup", "test steam connection", "are my steam credentials working"Setup Verification

Feature 1: Library Overview + Backlog Manager

API Call

GET https://api.steampowered.com/IPlayerService/GetOwnedGames/v1/

Query parameters:

ParameterValue
key{STEAM_API_KEY}
steamid{STEAM_ID}
include_appinfo1
include_played_free_games1
formatjson

Response Fields Used

{
  "response": {
    "game_count": 247,
    "games": [
      {
        "appid": 570,
        "name": "Dota 2",
        "playtime_forever": 14523,
        "playtime_2weeks": 120,
        "img_icon_url": "hash",
        "has_community_visible_stats": true
      }
    ]
  }
}
  • playtime_forever is in minutes
  • playtime_2weeks is present only if the game was played in the last 2 weeks

Logic Rules

Categorize every game by playtime_forever:

CategoryRuleLabel
Unplayedplaytime_forever < 60Never really touched
Abandoned60 <= playtime_forever < 300Tried but didn't stick
Playedplaytime_forever >= 300Actually played

Response Format

🎮 Steam Library Overview

📊 Total Games: {game_count}
✅ Played (5+ hrs): {played_count} ({played_pct}%)
⚠️ Abandoned (1-5 hrs): {abandoned_count} ({abandoned_pct}%)
🆕 Unplayed (<1 hr): {unplayed_count} ({unplayed_pct}%)
⏱️ Total Lifetime Hours: {total_hours}

📦 Your Backlog ({unplayed_count} games)
{for each unplayed game, sorted alphabetically:}
  • {name} — {playtime_forever} min logged
{end}

⚠️ Abandoned Games ({abandoned_count})
{for each abandoned game, sorted by playtime_forever ascending:}
  • {name} — {hours}h {minutes}m
{end}

If game_count is 0 or the games array is missing, the profile is likely private. See Error Handling.


Feature 2: Play Recommender

Prerequisites

Fetch the full library using the same API call as Feature 1.

Interaction Flow

  1. Ask the user two questions (or extract from their message if already stated):

- Mood: chill / intense / story-driven / competitive - Time available: under 1 hour / 1-2 hours / all night (3+ hours)

  1. Filter the user's library to games with playtime_forever < 60 (unplayed) OR 60 <= playtime_forever < 300 (abandoned — gave it a short try).
  1. For each candidate game, look up genre data. Use one of these methods:

- If IGDB credentials exist: POST to https://api.igdb.com/v4/games with body search "{game_name}"; fields genres.name, themes.name, total_rating; limit 1; and headers Client-ID: {IGDB_CLIENT_ID}, Authorization: Bearer {IGDB_ACCESS_TOKEN} - If no IGDB: GET https://store.steampowered.com/api/appdetails?appids={appid} and extract data.genres[].description and data.short_description

  1. Match games to mood using these genre mappings:
MoodMatching Genres / Themes
ChillSimulation, Puzzle, Casual, Farming, Sandbox, Walking Simulator, Indie (non-horror)
IntenseAction, Shooter, Roguelike, Roguelite, Survival Horror, Souls-like, Bullet Hell
Story-drivenRPG, Adventure, Visual Novel, Interactive Fiction, Narrative, Point & Click
CompetitiveMultiplayer, PvP, Fighting, Sports, Racing, Battle Royale, MOBA
  1. Match games to time available:
Time SlotRule
Under 1 hourPrefer games with short play sessions — roguelites, puzzle games, platformers, arcade. Avoid open-world RPGs or grand strategy.
1-2 hoursAny genre works. Prefer games with moderate session lengths.
All nightPrefer RPGs, open-world, strategy, survival, sandbox — games that reward long sessions.
  1. Select the top 3 matches. If fewer than 3 match, relax the playtime filter to include games up to 600 minutes.

Response Format

🎯 Play Recommendations — {mood}, {time_available}

1. 🎮 {game_name}
   Genre: {genres}
   Why: {1-2 sentence reason based on mood + time fit}
   Playtime so far: {minutes} min

2. 🎮 {game_name}
   Genre: {genres}
   Why: {reason}
   Playtime so far: {minutes} min

3. 🎮 {game_name}
   Genre: {genres}
   Why: {reason}
   Playtime so far: {minutes} min

💡 None of these click? Tell me more about what you're in the mood for.

If no games match at all:

😅 Couldn't find a great match in your unplayed library for "{mood}" + "{time}".

Your unplayed games are mostly: {top 3 genres in unplayed list}.

Want me to check your full library instead, or look up something new?

Feature 3: Wishlist Sale Monitor

API Call

GET https://store.steampowered.com/wishlist/profiles/{STEAM_ID}/wishlistdata/

No API key needed — uses the Steam store API directly. Requires the user's wishlist to be public.

Note: This endpoint may paginate. If the response contains exactly 50 items, make additional requests:

GET https://store.steampowered.com/wishlist/profiles/{STEAM_ID}/wishlistdata/?p=1
GET https://store.steampowered.com/wishlist/profiles/{STEAM_ID}/wishlistdata/?p=2

Continue incrementing p until the response is empty or contains fewer than 50 items. Page 0 is the default.

Response Fields Used

Each entry is keyed by appid:

{
  "730": {
    "name": "Counter-Strike 2",
    "capsule": "url-to-image",
    "review_score": 7,
    "review_desc": "Very Positive",
    "reviews_total": "7,456,123",
    "reviews_percent": 86,
    "release_date": "1694649600",
    "release_string": "Sep 27, 2023",
    "priority": 0,
    "added": 1680000000,
    "background": "url",
    "rank": 14,
    "tags": ["FPS", "Shooter"],
    "is_free_game": false,
    "subs": [
      {
        "id": 54029,
        "discount_block": "<div ...>-75%</div>",
        "discount_pct": 75,
        "price": "749"
      }
    ]
  }
}

Logic Rules

  1. Iterate over all wishlist entries
  2. For each entry, check subs array. A game is on sale if any sub has discount_pct > 0
  3. The price field is the current (discounted) price in cents (e.g. 749 = $7.49). If price is a string, parse it as an integer first.
  4. Calculate original price: original_price = price / (1 - discount_pct / 100)
  5. Sort results by discount_pct descending (biggest discounts first)

Response Format

If sales found:

🏷️ Wishlist Sales — {count} game(s) on sale!

{for each discounted game, sorted by discount_pct desc:}
🔥 {name} — {discount_pct}% OFF
   💰 ${sale_price} (was ${original_price})
   ⭐ {review_desc} ({reviews_percent}% positive)
   🔗 https://store.steampowered.com/app/{appid}
{end}

💡 Prices are current as of this check. Steam sales change without notice.

If no sales:

🏷️ Wishlist Sales

No games on your wishlist are currently discounted.

📋 You have {total_wishlist_count} games wishlisted.
Top 3 by priority:
  1. {name} — {review_desc}
  2. {name} — {review_desc}
  3. {name} — {review_desc}

💡 Major Steam sales happen in June (Summer Sale) and December (Winter Sale).

If wishlist is empty or inaccessible:

⚠️ Couldn't access your wishlist.

This usually means your wishlist is set to private. To fix:
1. Go to your Steam profile → Edit Profile → Privacy Settings
2. Set "Game details" to Public
3. Try again

If it's already public, Steam's wishlist API may be temporarily down. Try again in a few minutes.

Feature 4: Achievement Tracker

Step 1: Get Player Achievements

GET https://api.steampowered.com/ISteamUserStats/GetPlayerAchievements/v1/

Query parameters:

ParameterValue
key{STEAM_API_KEY}
steamid{STEAM_ID}
appid{appid}
lenglish

Response fields:

{
  "playerstats": {
    "steamID": "76561198012345678",
    "gameName": "Hades",
    "success": true,
    "achievements": [
      {
        "apiname": "AchUnlockAll",
        "achieved": 1,
        "unlocktime": 1695000000
      }
    ]
  }
}
  • achieved: 1 = unlocked, 0 = locked
  • unlocktime: Unix timestamp (0 if locked)

Step 2: Get Achievement Schema (for human-readable names + descriptions)

GET https://api.steampowered.com/ISteamUserStats/GetSchemaForGame/v2/

Query parameters:

ParameterValue
key{STEAM_API_KEY}
appid{appid}
lenglish

Response fields:

{
  "game": {
    "gameName": "Hades",
    "availableGameStats": {
      "achievements": [
        {
          "name": "AchUnlockAll",
          "defaultvalue": 0,
          "displayName": "Everything in its Place",
          "hidden": 0,
          "description": "Unlock all other achievements.",
          "icon": "url-to-achieved-icon",
          "icongray": "url-to-locked-icon"
        }
      ]
    }
  }
}

Step 3: Resolve Game Name to AppID

If the user says a game name instead of an AppID, resolve it:

GET https://api.steampowered.com/ISteamApps/GetAppList/v2/

This returns ALL Steam apps (~180,000). To avoid fetching this every time:

  1. First try the store search API: GET https://store.steampowered.com/api/storesearch/?term={game_name}&l=english&cc=US
  2. Use the first result's id as the appid
  3. If no results, tell the user the game wasn't found and ask them to check the name

Logic Rules

  1. Fetch both player achievements and schema for the given appid
  2. Match achievements by apiname (player data) to name (schema data)
  3. Replace API names with displayName from the schema
  4. Sort unlocked achievements by unlocktime descending (most recent first)
  5. Calculate: unlocked_count, total_count, completion_pct
  6. Build a visual progress bar: use █ for filled and ░ for empty, 20 characters wide
  7. Show the 5 most recently unlocked achievements
  8. Show up to 5 locked achievements (non-hidden ones only; for hidden: 1, show as "🔒 Hidden Achievement")

Response Format

🏆 Achievements — {game_name}

Progress: {unlocked_count}/{total_count} ({completion_pct}%)
[████████████░░░░░░░░] {completion_pct}%

🔓 Recently Unlocked
{for each of the 5 most recent, by unlocktime desc:}
  ✅ {displayName} — {description}
     Unlocked: {formatted_date}
{end}

🔒 Up Next ({remaining_count} remaining)
{for up to 5 non-hidden locked achievements:}
  ⬜ {displayName} — {description}
{end}
{if hidden locked achievements exist:}
  🔒 +{hidden_count} hidden achievement(s)
{end}

{if completion_pct == 100:}
🎉 Completionist! You've unlocked every achievement in {game_name}!
{end}

Error: Game Has No Achievements

If GetSchemaForGame returns no achievements array or it's empty:

ℹ️ {game_name} doesn't have Steam achievements.

Error: Achievement Data Private

If GetPlayerAchievements returns success: false:

⚠️ Can't access achievement data for {game_name}.

This usually means your game details are set to private. To fix:
1. Go to Steam → Profile → Edit Profile → Privacy Settings
2. Set "Game details" to Public
3. Try again

Feature 5: Most Played Rankings

API Call

Same as Feature 1 — IPlayerService/GetOwnedGames/v1 with include_appinfo=1.

Logic Rules

  1. Sort all games by playtime_forever descending
  2. Take the top 10
  3. Convert minutes to hours and minutes: hours = playtime_forever // 60, minutes = playtime_forever % 60
  4. Calculate total lifetime hours across ALL games: sum(playtime_forever for all games) / 60
  5. If playtime_2weeks exists on any game, also show "Recently Active" section

Response Format

⏱️ Most Played Games — Top 10

 # │ Game                          │ Playtime
───┼───────────────────────────────┼──────────
 1 │ {name}                        │ {hours}h {minutes}m
 2 │ {name}                        │ {hours}h {minutes}m
 3 │ {name}                        │ {hours}h {minutes}m
 4 │ {name}                        │ {hours}h {minutes}m
 5 │ {name}                        │ {hours}h {minutes}m
 6 │ {name}                        │ {hours}h {minutes}m
 7 │ {name}                        │ {hours}h {minutes}m
 8 │ {name}                        │ {hours}h {minutes}m
 9 │ {name}                        │ {hours}h {minutes}m
10 │ {name}                        │ {hours}h {minutes}m

📊 Total Lifetime Gaming: {total_hours} hours across {game_count} games
   That's {total_days} days of gaming!

{if any game has playtime_2weeks:}
🕹️ Active This Week
{for each game with playtime_2weeks > 0, sorted desc:}
  • {name} — {hours}h {minutes}m in the last 2 weeks
{end}
{end}

Feature 6: Game Info Lookup

Method A: IGDB (preferred, if credentials exist)

POST https://api.igdb.com/v4/games

Headers:

HeaderValue
Client-ID{IGDB_CLIENT_ID}
AuthorizationBearer {IGDB_ACCESS_TOKEN}
Content-Typetext/plain

Body (Apicalypse query language):

search "{game_name}";
fields name, summary, total_rating, genres.name, themes.name,
       involved_companies.company.name, involved_companies.developer,
       involved_companies.publisher, first_release_date, platforms.name,
       aggregated_rating, aggregated_rating_count, cover.url;
limit 1;

Response fields:

[
  {
    "id": 119171,
    "name": "Hades",
    "summary": "A rogue-like dungeon crawler...",
    "total_rating": 91.234,
    "aggregated_rating": 93.0,
    "aggregated_rating_count": 24,
    "genres": [{"id": 12, "name": "Role-playing (RPG)"}, {"id": 31, "name": "Adventure"}],
    "themes": [{"id": 17, "name": "Fantasy"}],
    "involved_companies": [
      {"company": {"name": "Supergiant Games"}, "developer": true, "publisher": true}
    ],
    "first_release_date": 1600300800,
    "platforms": [{"name": "PC (Microsoft Windows)"}, {"name": "Nintendo Switch"}],
    "cover": {"url": "//images.igdb.com/igdb/image/upload/t_cover_big/co1234.jpg"}
  }
]
  • total_rating is 0-100 (community + critic average)
  • first_release_date is Unix timestamp
  • Filter involved_companies where developer: true for developer, publisher: true for publisher

Method B: Steam Store API (fallback)

GET https://store.steampowered.com/api/appdetails?appids={appid}

To get the appid from a game name, use the store search:

GET https://store.steampowered.com/api/storesearch/?term={game_name}&l=english&cc=US

Response fields (from appdetails):

{
  "{appid}": {
    "success": true,
    "data": {
      "name": "Hades",
      "steam_appid": 1145360,
      "short_description": "Defy the god of the dead...",
      "detailed_description": "...",
      "developers": ["Supergiant Games"],
      "publishers": ["Supergiant Games"],
      "genres": [{"id": "3", "description": "RPG"}, {"id": "25", "description": "Adventure"}],
      "release_date": {"coming_soon": false, "date": "Sep 17, 2020"},
      "metacritic": {"score": 93, "url": "..."},
      "categories": [{"id": 2, "description": "Single-player"}],
      "platforms": {"windows": true, "mac": true, "linux": true},
      "price_overview": {"final_formatted": "$24.99", "discount_percent": 0}
    }
  }
}

Response Format

🎮 {name}

📝 {summary or short_description — first 2 sentences max}

📊 Rating: {total_rating or metacritic score}/100
🎭 Genre: {genres, comma-separated}
🏢 Developer: {developer name(s)}
📦 Publisher: {publisher name(s)}
📅 Released: {formatted release date}
🖥️ Platforms: {platform list}

{if price_overview exists and source is Steam:}
💰 Price: {final_formatted} {if discount > 0: "(🔥 {discount}% off!)"}
{end}

{if the user owns this game (check library):}
📂 In your library — {playtime_forever} min played
{end}

Error: Game Not Found

❌ Couldn't find "{game_name}".

Tips:
• Check the spelling
• Use the full official name (e.g. "Counter-Strike 2" not "CS2")
• For DLC, include the base game name

Feature 7: Setup Verification

API Call

GET https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v2/

Query parameters:

ParameterValue
key{STEAM_API_KEY}
steamids{STEAM_ID}

Response fields:

{
  "response": {
    "players": [
      {
        "steamid": "76561198012345678",
        "personaname": "PlayerName",
        "profileurl": "https://steamcommunity.com/id/...",
        "avatar": "url",
        "avatarfull": "url",
        "personastate": 1,
        "communityvisibilitystate": 3,
        "profilestate": 1,
        "lastlogoff": 1695000000,
        "timecreated": 1300000000
      }
    ]
  }
}
  • communityvisibilitystate: 1 = private, 3 = public
  • personastate: 0 = Offline, 1 = Online, 2 = Busy, 3 = Away, 4 = Snooze, 5 = Looking to trade, 6 = Looking to play

Then also call IPlayerService/GetOwnedGames/v1 to get game_count.

Response Format

Success:

✅ Steam Companion — Setup Verified

👤 Account: {personaname}
🔗 Profile: {profileurl}
🌐 Status: {personastate_label}
🔓 Profile Visibility: {Public or Private}
📅 Member Since: {formatted timecreated}
🎮 Games Owned: {game_count}

{if communityvisibilitystate != 3:}
⚠️ Your profile is set to Private. Some features (wishlist sales, achievements)
   require a public profile. Go to Edit Profile → Privacy Settings → set to Public.
{end}

{if IGDB_CLIENT_ID and IGDB_ACCESS_TOKEN are set:}
🎮 IGDB: ✅ Connected (richer game lookups enabled)
{else:}
🎮 IGDB: ❌ Not configured (game lookups will use Steam store data)
   Optional: Set IGDB_CLIENT_ID and IGDB_ACCESS_TOKEN for better game info.
{end}

All systems go. Try: "show my library" or "what should I play tonight?"

Failure — bad API key:

If the API returns 403 or the response is empty:

❌ Setup Failed — Invalid API Key

Your STEAM_API_KEY was rejected by Steam.

To fix:
1. Go to https://steamcommunity.com/dev/apikey
2. Make sure you're logged into the correct Steam account
3. If you see a key, copy it exactly (no spaces)
4. If you don't see a key, register a new one with any domain
5. Update your STEAM_API_KEY env var

Failure — bad Steam ID:

If players array is empty:

❌ Setup Failed — Steam ID Not Found

No account found for Steam ID: {STEAM_ID}

To fix:
1. Go to https://steamid.io
2. Paste your Steam profile URL
3. Copy the steamID64 (17-digit number like 76561198012345678)
4. Update your STEAM_ID env var

Common mistakes:
• Using your vanity URL name instead of the 64-bit ID
• Using a 32-bit Steam ID (shorter number) instead of 64-bit
• Extra spaces or characters in the value

Failure — missing env vars:

❌ Setup Failed — Missing Credentials

{if STEAM_API_KEY not set:}
• STEAM_API_KEY is not set — get one at https://steamcommunity.com/dev/apikey
{end}
{if STEAM_ID not set:}
• STEAM_ID is not set — find yours at https://steamid.io
{end}

Both are required. See the setup instructions above.

Error Handling (Global)

Private Profile

Detection: IPlayerService/GetOwnedGames/v1 returns {"response": {}} (empty, no game_count or games key).

Response:

🔒 Your Steam profile or game details are set to private.

To use this skill, your profile needs to be public:
1. Open Steam → click your name → Profile
2. Click Edit Profile → Privacy Settings
3. Set "My profile" to Public
4. Set "Game details" to Public
5. Wait 1-2 minutes for Steam's cache to update
6. Try again

Note: You can set it back to private after you're done.

API Rate Limiting

Steam's Web API has a rate limit of approximately 100,000 calls per day and 1 request per second per key. In practice, you will not hit this unless you're scripting bulk requests.

If you receive HTTP 429 or 503:

⏳ Steam's API is temporarily rate-limiting requests. Wait a minute and try again.

Network / Server Errors

If any API call returns HTTP 500, 502, 503, or times out:

⚠️ Steam's API returned an error ({status_code}). This is on Steam's end, not yours.

Try again in a minute. If it persists, check https://steamstat.us for outages.

Missing Environment Variables

Before making any API call, check that the required env vars are set. If missing:

⚠️ Missing required configuration.

{if STEAM_API_KEY not set:}
• STEAM_API_KEY — Get one at https://steamcommunity.com/dev/apikey
{end}
{if STEAM_ID not set:}
• STEAM_ID — Find yours at https://steamid.io
{end}

Run "verify my steam setup" after setting them.

IGDB Token Expired

IGDB access tokens expire after approximately 60 days. If any IGDB API call returns HTTP 401:

⚠️ Your IGDB access token has expired.

To regenerate it:
1. Run this command (replace with your credentials):
   curl -X POST 'https://id.twitch.tv/oauth2/token' \
     -d 'client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=client_credentials'
2. Copy the new access_token from the response
3. Update your IGDB_ACCESS_TOKEN env var

Falling back to Steam store API for this lookup.

After showing this message, fall back to Steam store API (Method B) for the current request so the user still gets a result.

Store API Region Issues

store.steampowered.com/api/appdetails may return different prices based on region. Prices shown are for the US store by default. Add &cc=US to force USD, or &cc={country_code} if the user requests a different region.


Example Conversations

Example 1: Library Check

User: How many games do I own on Steam?

Agent: Calls IPlayerService/GetOwnedGames/v1 → gets library → categorizes → responds with full library overview showing total count, backlog breakdown, and the unplayed/abandoned lists.

Example 2: Play Recommendation

User: I've got about 2 hours tonight and want something chill. What should I play?

Agent: Fetches library → filters unplayed/abandoned games → looks up genres for each via IGDB or Steam store → matches to "chill" + "1-2 hours" → picks 3 best matches → responds with names, genres, and personalized reasons.

Example 3: Wishlist Check

User: Any games on my wishlist on sale?

Agent: Calls wishlist API → checks all subs for discount_pct > 0 → calculates original prices → sorts by discount → responds with formatted sale list or "no sales" message with upcoming sale dates.

Example 4: Achievement Progress

User: Show my achievements for Hades

Agent: Searches store for "Hades" → gets appid 1145360 → calls GetPlayerAchievements and GetSchemaForGame → matches by apiname → calculates completion → builds progress bar → shows recent unlocks and remaining achievements.

Example 5: Quick Stats

User: What are my most played games?

Agent: Fetches library → sorts by playtime_forever desc → takes top 10 → formats table with hours/minutes → calculates total lifetime hours → shows recently active games if any.

Example 6: Game Lookup

User: Tell me about Baldur's Gate 3

Agent: If IGDB configured, POSTs search query → gets name, summary, rating, genres, developer, release date. If not, searches Steam store → gets appdetails. Also checks if user owns it and shows playtime.


Notes for Agent Implementors

  • All Steam Web API calls use HTTPS GET with query parameters. No POST requests needed for Steam.
  • IGDB uses POST with a plain-text body in Apicalypse query language. Content-Type must be text/plain.
  • The wishlist endpoint (store.steampowered.com) does not require an API key but does require the wishlist to be public.
  • Steam's playtime_forever is always in minutes. Always convert to hours/minutes for display.
  • Unix timestamps from Steam and IGDB should be formatted as human-readable dates (e.g., "Sep 17, 2020").
  • The store search API (storesearch) is the fastest way to resolve a game name to an appid. Do not fetch the full app list unless store search fails.
  • When making multiple API calls for a single feature (e.g., achievements need 2 calls), make them concurrently where possible.
  • IGDB access tokens expire. If a 401 is returned, tell the user to regenerate the token.

Changelog

v1.0.0 — Initial Release

  • Library overview with backlog categorization (unplayed / abandoned / played)
  • Mood + time-based play recommender from user's actual library
  • Wishlist sale monitor with price calculations and pagination
  • Achievement tracker with progress bars and human-readable names
  • Most played rankings with lifetime hour totals
  • Game info lookup via IGDB (preferred) or Steam store API (fallback)
  • Setup verification with specific error diagnostics
  • Comprehensive error handling for private profiles, missing credentials, API failures

平台分布

OpenClaw

89.69%
按下载量换算1,441

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

通过

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills