Releases: hybridindie/godot-mcp
Release list
godot-editor-mcp 2026.09.02 — First Stable
First stable release 🎉
Beta is over: FastMCP is on 4.0.1 stable (#403/#404) and zero prerelease versions remain in the dependency graph. CONTRACT_VERSION is 1 — the surface has been additive-only since the first beta.
Consumer hardening (by @MuhamadBarzani) — #390–#400
Everything in this batch came out of live consumer sessions, where the contract suite's fake-addon assumptions broke against real editors, real games, and real MCP clients:
- #394 — Argument coercion middleware: some MCP clients (observed: OpenCode) serialize nested objects/arrays/bools as JSON strings at
tools/call; everyproperties/value/events/dry_run-taking tool failed 100% for them. A schema-aware middleware now repairs stringified arguments (conservatively — declaredstringparams are never touched) andqa.evaluate_assertionre-types stringified expectations. - #395 —
capture_editor_screenshotno longer hangs ~10s on macOS: the viewport grab is deferred one rendered frame (two-phaseready:false→ PNG poll pattern), with a structured timeout error naming the hidden/minimized-editor case. - #396 —
force_breaknow pauses non-cooperating games: the runtime probe self-services the pending break in its own_process, dodging theEngineDebugger.debug()deadlock that #131 documented. - #397 —
GODOT_MCP_DEFAULT_TOOLSETSenv var seeds the initial enabled toolsets (allor comma-separated) for clients that snapshot schemas at session start. - #399/#401 — import/scan race fixed at both levels: bounded e2e polling, plus opt-in
wait_for_scan/wait_mswith ascan_completeresult field distinguishing "copy landed" from "import artifacts ready".
FastMCP 4.0.1 stable (#403/#404)
The framework moved to GA (MCP SDK v2, 2026-07-28 sessionless protocol). Breaking-change audit clean — the guard pattern (#346), server-global toolset state (#364), and snake_case field access were already 2026-native; 689 tests passed unchanged except the pin-drift test. See the migration plan.
Also since b4
- #388 — MCP 2026-07-28 migration plan + AST guard against session-keying drift
- #402 — mypy strict conformance for the merge batch
Install
pip install godot-editor-mcp
No --pre flag needed anymore. See the README for editor setup, and skills/ for the installable AI skills.
godot-editor-mcp 2026.08.31b4 — Beta 4
Beta 4
Patch-level CalVer release. 4 commits since b3.
outputSchema + structuredContent on every tool (#385, PR #387)
Every JSON-result tool now declares a standard outputSchema (JSON Schema 2020-12) and emits structuredContent, with the text content kept as the faithful serialized fallback — the MCP 2025-11-25 spec best practice, auto-derived from each tool's Pydantic return annotation by FastMCP 4.0:
godot_undofixed: its@model_serializer(which drops mode-irrelevantNonefields) hid the fields from pydantic's serialization-mode schema generation, degenerating the auto-derived schema to{additionalProperties: true}— useless to clients. It now declares the field-derived schema explicitly; both emission shapes (real undo, dry-run preview) validate against it.godot_editor_capture_screenshotis the spec-correct exception:ImageContentis non-JSON, so it declares no schema and emits nostructuredContent.- Pinned in both directions by
tests/contract/test_output_schema.py: the emittedstructuredContentvalidates against the declared schema, the text fallback isjson.loads(text) == structuredContent, and a whole-surface guard rejects any degenerate schema across all 180 tools. - Unblocks godot-agents#494 (client prefers
structuredContentinMCPResult).
Eval harness moved to godot-agents (#383, PR #384)
The LLM eval harness (agents, task suites, variant A/B machinery) is a consumer concern — it now lives in godot-agents as the self-contained godot_agent_harness package (godot-agents#482). evals/ keeps only the instruction-staleness server self-analysis, guarded by test_evals_surface.py. Repo hygiene — the published wheel was never affected (the harness was never packaged).
MCP 2026-07-28 migration plan (#386, PR #388)
docs/mcp-2026-07-28-migration.md — the sessions-removal spec plan. Finding: the server was already sessionless-native (toolset gating is server-global since #364; the approval guard round-trips request_state). A new AST source-shape guard (test_sessionless_invariants.py) fails preflight on any drift back toward session_id keying.
Compatibility
CONTRACT_VERSION remains 1 — the bridge envelope and command surface are unchanged. outputSchema/structuredContent are additive; the text fallback is byte-identical for existing clients.
Install
pip install --pre godot-editor-mcp==2026.08.31b4
Or upgrade:
uv tool install --upgrade godot-editor-mcp
See the README for setup.
godot-editor-mcp 2026.08.31b3 — Beta 3
Beta 3
Patch-level CalVer release. 2 commits since b2.
MLflow decoupling (#378, #379)
The mlflow Python package is not installable alongside the pinned FastMCP 4.x, and eval-observability is a consumer concern. MLflow is now fully removed from godot-mcp:
mlflow+boto3dropped from dev deps — the locked environment shrinks 172 → 100 packagesevals/mlflow_tracker.py,evals/dataset_sync.py,evals/representativeness.pydeleted; MLflow logging stripped from all eval suites (active + archive)- The
mlflowMCP entry is disabled in.opencode/opencode.json; eval→MLflow logging (tracker, GenAI dataset sync,mlflowMCP server) is owned by godot-agents - The #197 representativeness banner survives as console output (
REPRESENTATIVENESS_BANNERprefixes everyrun_llm_suiterun) - godot-mcp evals stop at console output
Other
- #377 — Publish CI: the Godot addon zip is kept out of the PyPI upload; Asset Library icon URL fixed
Compatibility
CONTRACT_VERSION remains 1 — no tool-surface or bridge-envelope changes in this release.
Install
pip install --pre godot-editor-mcp==2026.08.31b3
Or upgrade:
uv tool install --upgrade godot-editor-mcp
See the README for setup.
godot-editor-mcp 2026.08.27b2 — Beta 2
Beta 2
The second beta. 19 commits since b1.
Safety & toolset hardening (graphify-driven)
- #364 — Replaced per-session toolset isolation with a server-global enabled set. Per-session isolation was dead code on the sessionless
2026-07-28protocol real clients use (freshsession_idper call), andMiddleware.on_initializeviolated the async-patterns rule.enable_toolset/disable_toolsetnow work on every transport; the default surface (core + inspection) is enforced from the first call. - #365 —
require_node_existsnow uses a lightweightcmd_node_existsprobe (returns{exists: true}) instead of the heavycmd_get_node_properties, halving the round-trip cost of every node-targeted mutation.[Both]addon + server change. - #366 —
list_tools_by_safety_classreturns a typedSafetyClassListingPydantic model instead of a rawdict(the typed-I/O rule). - #368 —
ApprovalMiddlewareusesErrorCode.APPROVAL_DENIED(enum) instead of the string literal, matching every other call site. - #369 — Toolset and approval middlewares now log lookup errors at ERROR. The approval gate fails open (the destructive
confirmgate in each tool body is the primary security net and runs regardless); the toolset gate fails open so core recovery tools stay reachable. - #367 — Contract test that every
destructive-tagged tool callsrequire_confirmation, acceptsdry_run, and acceptsconfirm(AST-based, no vacuous pass).
Other
- Addon icon (PNG) + Godot Asset Library publish CI
- Docs reorganization: consumer-first README, transport security as a first-class safety component, Docker client setup
- MCP status dock moved from left dock to bottom panel
- graphify MCP server wired into opencode config
Install
pip install --pre godot-editor-mcp==2026.08.27b2
Or upgrade:
uv tool install --upgrade godot-editor-mcp
See the README for setup.