Eye of the Storm
Archive
Series

Research, in arcs

AI Basics11 posts
A ground-up introduction to working with AI tools — from prompting fundamentals to integrating AI into your development workflow.
Building in Public2 posts
Behind-the-scenes posts on how this devblog gets built — workflow, tooling, and the decisions behind the decisions.
LLM Driven SDLC1 post
How large language models are reshaping every phase of the software development lifecycle — from requirements and planning through implementation, review, testing, and deployment. A practitioner's view of what actually changes when AI enters the loop.
AI Engineering Research2 posts
Deep-dive research notes on building AI-powered tools — from designing LLM-driven requirements generators to understanding architecture, inference, and production AI systems.
On GitHub

Projects in flight

codagatchiTypeScript
A tamagotchi-style desktop pet built with Tauri — a small always-on-top companion whose stats decay in real time and need tending.
groundworkTypeScript
SDLC discipline plugin for Claude Code — requirements, plans, and structured development workflows.
— Updated as projects evolveAll research & projects
ActivityAbout
GitHubXRSS
© 2026 stormbreaker9000 · charted with care
  1. home›
  2. archive›
  3. Building an MCP server for Godot: lessons from week one
Oct 28, 2025·mcpgodot

Building an MCP server for Godot: lessons from week one

Whole-project analysis, debug interpretation, and the parts I got wrong.

  • The naive approach fails fast
  • The fix: a scene-graph tool
  • What I got wrong
  • Coming next

I've been building an MCP server that gives Claude meaningful access to a Godot project — not just file reading, but actual semantic understanding of scenes, signals, and the runtime debug output. Week one is done. Here's what I learned.

The naive approach fails fast

My first version exposed three tools: read_scene, list_scripts, and get_debug_output. Claude could now see things, but it couldn't reason about them, because Godot scenes are graphs and I was handing them over as flat text.

A scene file looks like XML-flavored INI. Nodes reference each other by relative path. Signals connect across hierarchy. If you give Claude the raw file, it can read the words but not the relationships.

The fix: a scene-graph tool

I added a describe_scene tool that returns a structured representation:

{
  "root": "Player",
  "type": "CharacterBody2D",
  "children": [
    { "name": "Sprite", "type": "AnimatedSprite2D" },
    { "name": "Hitbox", "type": "Area2D" }
  ],
  "scripts": ["res://player.gd"],
  "signals_out": [
    { "from": "Hitbox", "signal": "body_entered", "to": "Player.on_hit" }
  ]
}

Now Claude can answer "where does Player's hit detection happen" without reading three files. It just asks the tool.

What I got wrong

I assumed debug output was a stream. It is — but Godot's print system interleaves stderr, stdout, and the engine's own messages, and timestamps aren't always present. My first parser silently dropped half the output because it didn't match my expected format.

The fix was embarrassingly mundane: capture everything, tag the source, hand the agent unfiltered output with a flag. Stop trying to be clever about what matters.

Coming next

Animation graph traversal, profiler output as structured data, and a tool for asking "what would change if I renamed this signal." The animation piece is genuinely hard — I'll write it up when it works.

Was this clear?

On this page

  • The naive approach fails fast
  • The fix: a scene-graph tool
  • What I got wrong
  • Coming next