Repository navigation
Releases
Hammer-MCP v0.6.0
The MCP server without the tray app (hammer-mcp-cli, stdio / HTTP) and a container image for MCP catalogs.
Added
hammer-mcp-cli: the MCP server without the tray app - stdio (default) or HTTP, Hammer picked with--auto/--pid,--mode; shipped in the release zip. ADockerfileruns it in a container (it starts and lists its tools without a Hammer - what MCP catalogs such as Glama check).
Changed
- Public repository: status beta,
SECURITY.md(private vulnerability reports),CONTRIBUTING.md(how to report an unknown Hammer build), issue templates, demo GIF / video and screenshots in the README, articles on the Valve Developer Community (EN, RU).
Full Changelog: v0.5.0...v0.6.0
Hammer-MCP v0.5.0
Brush entities, outputs written as keyvalues, Source 2 prefab variables; Strata and stock TF2 Hammer verified live.
Added
- Brush entities (
trigger_*,func_*) are addressed by the centre of their brushes: Hammer++ and stock Hammer write it as theirorigin; for .vmf files without it the centre is computed from the brush planes (centerinlist_entities/get_entity). Verified live on Hammer++ and stock TF2 Hammer:set_keyvalue, outputs, anddelete_entity, which removes the entity together with its brushes. - Outputs written as keyvalues:
validate_maplists them (outputsAsKeyValues) and checks their targets and inputs;get_entity/find_ioshow them as outputs. - vmap prefab variables: keyvalues bound to prefab variables get the placed prefab's values - defaults, choice groups (e.g.
TowerLocation = middle_tier_3sets the tower's name and unit) and overrides; a named prefab is an I/O target of the outer map. Dota towers now get their real names.fixupEntityNamesis not applied (the renaming rule is not confirmed by the data). - App: right-click menu on the Meta info grid - Copy (cell), Copy row, Copy all.
hammer_statuslists all window titles of the process when no open map is found.
Changed
- Strata (Portal: Revolution x64) verified live: build, game config, FGD,
validate_map,check_assets, Run Map sequences.$postcompiler_exeand$bspare expanded;|all_source_engine_paths|points to the game root when the game exe lives inbin\win64. - Strata ships
"Autosave Dir" = "\\autosave\\", which Hammer rejects (not an absolute path, autosaves disabled);fromAutosavenow says so instead of looking in a guessed folder. - A bare map file name in the Hammer title (seen on Strata) is looked up in the MapDir of the Hammer's game configs.
- Source 2 maps are cached by path + write time + size: a big
.vmapwith prefabs is not re-read on every call.
Full Changelog: v0.4.0...v0.5.0
Hammer-MCP v0.4.0
Source 2: unsaved Hammer state through the developer console, prefabs expanded; Strata game config and autosaves.
Added
- Strata (Portal: Revolution): game config from
hammer/cfg/gameconfig.txt(paths with..\..as shipped are normalised), autosave folder fromhammer/cfg/HammerConfig.vdf(KV3) forfromAutosave;revolution.fgdreads cleanly (563 classes). - Source 2 developer console (
source2_console): allowlisted commands over VConsole2 (TCP 127.0.0.1:29000, the channelvconsole2.exeuses) -hammer_map_files,hammer_force_autosave,hammer_prefab_tree,find,help,status, …; nothing is injected. Verified live on CS2 (no-vconsoleneeded). - vmap prefabs and instances are expanded:
CMapPrefab(another.vmap, resolved in the map's mod / addon folder, then the stock mod) andCMapInstancewith their transforms, nested up to 6 levels; their entities get ids from 1000000 andprefab/prefab_nodekeyvalues. Dota'sdota.vmap: 69 entities of its own, 1734 with 67 prefabs. - Unsaved Source 2 state: read tools with
fromAutosave=truerunhammer_force_autosavein the developer console and read the newest autosave fromcontent\_toolsautosave\hammer\<map folder>(prefabs still resolved in the real content folder). The open map comes fromhammer_map_fileswhen the window title has none. Verified: the console works without-vconsolein Workshop Tools. - Developer console output is clean: PRNT messages have a 28-byte header (channel, flags, colour, time) before the text, verified on CS2.
Full Changelog: v0.3.0...v0.4.0
Hammer-MCP v0.3.0
Source 2 maps and game data (read-only), verified live on CS2 Workshop Tools; stock Hammer verified live on TF2; safety rules around game processes.
Added
- Source 2 maps:
.vmap(DMX, read with KeyValues2 / Datamodel.NET) - entities in world space with keyvalues and outputs, hidden nodes, summary.map_summary,list_entities,get_entity,find_io,validate_mapwork on Source 2 maps; the world is an I/O target (prefab relays). Prefabs and instances are not expanded yet. - Source 2 FGD: class metadata blocks (
{ entity_tool_name = ... }, shown byfgd_class), per-member[ ]/{ }metadata,@OverrideClass, escaped quotes, includes fromgame/core/; model / VData / helpinfo definitions are skipped. CS2csgo.fgd: 469 classes, Dota 2dota.fgd: 427, no warnings. - Source 2 game data without a GameConfig.txt: one config per mod with
game/<mod>/<mod>.fgd, picked by the open map'scontent/<mod>folder (csgo_addons→csgo). - Source 2 Workshop Tools processes (
cs2,dota2,hlvr, … withtools/hammer.dll) are listed for Attach. The map name Hammer shows in its title is looked up incontent/<mod>/mapsandcontent/<mod>_addons/<addon>/maps. hammer_status: window title, process command line (insecureflag) and, for unknown builds, the editor DLL's sha256 for the registry.- Inject policy for the future Advanced mode (
InjectPolicy): only standalone Hammer executables of a known build with an adapter; never game processes (VAC / anti-cheat), never Source 2, never unknown builds. - README: Safety and VAC section (EN / RU).
- Registry: the CS2
hammer.dllof 2026-11-13.
Changed
- A map outside every MapDir uses the game config of the Hammer's own install (the only config whose game folder is inside it and has a gameinfo.txt, e.g.
tffor the TF2 Hammer) instead of asking forconfigName. - Source 2 UI and agent texts: own attach status ("read-only from map and game files"), mode help, menu tools refuse politely, agent instructions.
- Tool descriptions after the live test of stock Hammer (TF2):
set_keyvalueis not in Hammer's undo history;rotate_entityonly turns entities with a model - set theangleskeyvalue for the others. - FGD types are printed without spaces (
resource:vjs); Source 2 editor keys (local.origin,useLocalOffset, …) are not reported as unknown keyvalues.
Verified live
- CS2 Workshop Tools: attach to
cs2.exe, a 69 MB.vmap(format 40) from an addon read and validated. Workshop Tools behave like an insecure client (VAC servers refused). - Stock Hammer TF2 x86: create / keyvalue / delete / save over the shell channel, outputs as keyvalues,
validate_map,check_assets(gameinfo + VPK),compile_sequencesfrom the binaryCmdSeq.wc.
Full Changelog: v0.2.0...v0.3.0
Hammer-MCP v0.2.0
Reading maps, game data and the compile pipeline; first live edits of logic; a much larger build registry.
Added
- Map knowledge:
get_entity,find_io(logic graph: who fires what at whom),validate_map(unknown classes, keyvalues and outputs not in the FGD, outputs to missing targets, inputs the target does not have, values with double quotes inside). - Game data:
game_configs(Hammer / Hammer++ game configurations),fgd_class,fgd_search. Tolerant FGD parser: Hammer++@version/@ExtendClass, Garry's Mod*studiotypes, fgdlib-like class redefinition and parse-time inheritance. - Formats: VMF / VMX / VMM /
vmf_autosavewith outputs (,or ESC separators) and hidden entities; RMF / MAP / JMF via Sledge.Formats; VMT materials and Hammer game configs via ValveKeyValue. - Assets:
check_assets- materials, models, sprites, decals, skybox of the saved map checked againstgameinfo.txtsearch paths (|gameinfo_path|,|all_source_engine_paths|,|appid_N|via Steam libraries), folders and VPK directories. - Compile:
compile_sequences(Run Map sequences fromCmdSeq.wc, Hammer++ and Strata files, variables expanded),compile_log(stages, leaks, missing materials, model errors, limits),leak_trace(.linleak path),run_compile(edit modes only; skips launching the game and the log viewer),bsp_entities(entity lump of the compiled.bsp, outputs included). - Autosaves: read tools take
fromAutosaveto use the newest autosave when it is newer than the saved map (Hammer++AutosaveDir, stock HammerAutosave Dirfrom the registry). - Build registry: 179 known editor builds - every Hammer++ release 8846-8873 (all branches), stock Source 1 Hammer of Valve games and SDKs (x86 and x64), mods (Portal Stories: Mel, Aperture Tag, Portal Reloaded, Black Mesa, ...), Slammin' Hammer, Strata (Portal: Revolution), Source 2 (
tools/hammer.dllof CS2 and Dota 2) and GoldSrc (Worldcraft 1.1-3.3, Hammer 3.4 / 3.5, Neon / Neo / CSM Hammer 3.5). Source 2 and GoldSrc builds are recognised (GoldSrc by the editor exe itself); live editing still needs the shell channel.
Changed
- The main window title shows the app version; About and the title take it from the exe's version resource (About showed 0.1.0-alpha in local builds).
run_compile/compile_sequencesquote expanded arguments that contain spaces, like Hammer does (-game "...\Bestiarium Project\bst"), andrun_compileignores a compile log left over from an earlier run.validate_mapresolves output targets by targetname, then by classname (as the engine does), and accepts classes that exist only at runtime (player, ...).- Outputs are formatted with the invariant culture (
delay 0.5, not0,5). - A missing
custom/*search path is no longer reported as a problem.
Notes
- Outputs set with
set_keyvalue(OnTrigger=target,Input,param,delay,times) are stored by Hammer as plain keyvalues: they are not shown on the Outputs tab, but vbsp writes them into the.bspas real outputs and they fire in game (verified withbsp_entities). - Hammer cuts a value with double quotes inside (e.g.
echo "text") on load, and a later save keeps the damage;validate_mapnow warns about such lines.
Full Changelog: v0.1.0-alpha...v0.2.0
Hammer-MCP v0.1.0-alpha
Full Changelog: https://github.com/EpicMorg/Hammer-MCP/commits/v0.1.0-alpha