steam-claude-controller
Drives Source 1 games (Portal, HL2, ...) through a console bridge: launches a game into a specified map, executes console commands and reads their output, reports map/position/pitch/yaw via getpos, performs exact relative or absolute aiming turns, and pauses/unpauses the game while the model reasons.
Lists the installed Steam library by reading libraryfolders.vdf and appmanifest files, launches any installed game via steam.exe -applaunch (with optional args), detects Source engine games, flags anti-cheat presence, and attaches to the game's window for capture and input.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@steam-claude-controllerLaunch Portal into testchmb_a_00 and walk out of the vault."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
steam-claude-controller
An MCP server that lets Claude see and play Steam games on Windows: list and launch your Steam library, capture the game window, send timed keyboard/mouse input, and, for Source engine games like Portal, read exact game state and aim to the degree.
Tested end to end on Portal (AppID 400): launched into testchmb_a_00, read
position/angles, turned to exact headings, and walked out of the Relaxation Vault through
the portal.
Why not "the Steam Input API"?
Steam Input (ISteamInput) is the API a game uses to read controllers. Steam maps the
physical pad to the game's actions (Portal ships steam_input/action_manifest_portal.vdf).
No outside program can use it to press buttons in a game, and Steamworks only exists
inside the game process. So the generic layer works one level lower:
Layer | What it does | Works for |
| Reads | every Steam game |
| Window capture ( | any game that accepts keyboard/mouse |
| Console bridge, | Source 1 games (Portal, HL2, ...) |
Engine adapters give Claude senses beyond pixels. Adding a game engine means adding
one module like source_engine.py.
Related MCP server: steam-mcp
The Source console bridge
Portal 1 (Source 2013) has no remote console (-netconport doesn't exist there), so:
source_launchwritesportal/cfg/claude_bridge.cfgand launches with-condebug -windowed -noborder -w 1280 -h 720 +exec claude_bridge. The bridge binds INS toexec claude_cmd.To run a command, it writes
claude_cmd.cfg(command +echo <nonce>), taps INS, and readsportal/console.logup to the nonce.If the bind isn't active (e.g. a menu has focus), it opens the console with
`, types the exec line, and closes it again.
Aiming is exact because degrees = mouse_counts × sensitivity × m_yaw with raw input. In
testing, a requested +90° came back as 90.04°.
Tools
Tool | Purpose |
| Installed games, Source detection, anti-cheat flag |
| Launch any game (with args) and attach to its window |
| Attach by appid / title / Steam's running app |
| JPEG of the game's client area |
| Timed input sequence ( |
| Release anything held |
| Launch a Source game with the bridge, optionally into a map |
| Run console commands, get their output |
| Position, pitch/yaw, map |
| Relative turn by degrees, or absolute heading |
|
|
Setup
Requires Windows and Steam.
Claude Desktop (one-click bundle)
Download steam-controller-<version>.mcpb from the
latest release and
open it (or drag it into Settings → Extensions). The bundle uses the uv runtime, so
Claude Desktop provides Python and installs the dependencies itself.
Claude Code (from source)
Requires uv.
git clone https://github.com/GrafxFrosch/steam-conroller-mcp.git
cd steam-conroller-mcp
uv syncClaude Code sessions opened in the clone pick up the server from .mcp.json (approve it
when prompted). To use it from any folder, register it at user scope with the claude
CLI, replacing the path with your clone:
claude mcp add steam-controller --scope user -- uv run --directory "C:\path\to\steam-conroller-mcp" steam-claude-controllerThen ask, for example: "Launch Portal into testchmb_a_00 and get out of the vault."
Building the bundle
npx @anthropic-ai/mcpb@2.1.2 validate manifest.json
npx @anthropic-ai/mcpb@2.1.2 pack . dist/steam-controller-0.1.0.mcpb.mcpbignore keeps .venv, .git and screenshots out of the bundle.
CLI for debugging
uv run scc ... mirrors the tools without an MCP client:
uv run scc games
uv run scc --appid 400 source-launch --map testchmb_a_00
uv run scc --appid 400 state
uv run scc --appid 400 look 90 0
uv run scc --appid 400 act "[{\"key\":\"w\",\"hold\":1.0}]" --shot shots/after.jpgSafety and side effects
Focus guard: input is only sent while the game is the foreground window. If you click away mid-sequence, it releases all keys and stops, so nothing types into your apps. While Claude plays, the game holds keyboard focus.
Anti-cheat refusal: games with EasyAntiCheat/BattlEye/etc. folders are refused. VAC can't be detected from files, so don't point this at online multiplayer: synthetic input there can get the account banned.
Portal config: the bridge sets
con_enable 1,m_rawinput 1,m_customaccel 0,m_filter 0and binds INS. These persist inportal/cfg/config.cfg.console.loggrows while-condebugis on. Deleteclaude_bridge.cfg/claude_cmd.cfgto remove the bridge files.
Known limits / next steps
D3D9 sometimes hands
PrintWindowa black frame (e.g. during fades). Capture then falls back to a screen grab, which briefly focuses the game.Walking into a portal off-center pins you against the wall beside it. Center on it first (
source_status+source_look absolute).Possible additions: a virtual gamepad via ViGEm (so Steam Input sees a real controller), a BepInEx bridge for Unity games (KSP, Polytopia), and Windows Graphics Capture for occluded D3D11/12 windows.
License
GPL-3.0, see LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Eyes and hands on real Windows PCs — observe, click, type via Glasswarp API.
Teamfight Tactics data & AI coaching for Claude and ChatGPT — 19 tools, built-in Riot key.
- SimSenseOAuthai.simsense
Deploy sims to any screen. Control your displays with Claude.
Deploy sims to any screen. Control your displays with Claude.
Related MCP Servers
- AlicenseAqualityDmaintenanceConnects Claude to your Steam library via the Steam Web API. Query your games, playtime, recently played history, and store metadata using natural language. Zero-config install via npx steam-mcp.513 npm6MIT
- AlicenseAqualityBmaintenanceExposes Steam Web API tools as MCP resources for Claude Code, Claude Desktop, and Gemini CLI, enabling profile lookups, game searches, achievement tracking, and more.1113 npm1MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to fully control a Windows desktop with native screen capture, low-level input injection, game-grade input, and play-testing capabilities.MIT
- FlicenseNot gradedqualityCmaintenanceProvides access to your Steam game library data through Claude Desktop, enabling game search, filtering, details, recommendations, and statistics.7-