Call ISteamUGC::CreateItem with the consumer AppID and workshop file type k_EWorkshopFileTypeCommunity; handle the CreateItemResult_t call result to obtain the published file ID
Call ISteamUGC::StartItemUpdate with the published file ID to obtain an UGCUpdateHandle_t, then set metadata: SetItemTitle, SetItemDescription, SetItemContent (local folder path), SetItemPreview (preview image path), and SetItemVisibility
Call ISteamUGC::SubmitItemUpdate with the handle and a change note; register a SubmitItemUpdateResult_t call result handler and check m_eResult for success
Track upload progress between the SubmitItemUpdate call and the result via ISteamUGC::GetItemUpdateProgress
For subsequent updates, skip CreateItem and call StartItemUpdate directly with the existing published file ID
Known gotchas
CreateItem must only be called once per item; calling it again creates a duplicate listing rather than updating the existing one — always store the published file ID durably after first creation
SubmitItemUpdate is asynchronous; the call returns immediately but the actual upload happens in the background — do not assume completion until the SubmitItemUpdateResult_t callback fires
Workshop item content folders must not contain symlinks or files exceeding Steam's per-item size limits; check current limits in the Steamworks documentation as they are subject to change
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp