MCP¶
Feather can run as a local Model Context Protocol server for AI clients. The MCP server exposes sanitized live session context, plugin state, and creative-tool workflows through the Feather desktop app.
MCP is for local development automation. It is disabled by default and should stay disabled unless a local MCP client is actively connected.
Setup¶
- Start the Feather desktop app.
- Open Settings → Security → MCP Access.
- Enable MCP access.
- Copy the generated client config or use the CLI directly:
feather mcp defaults to stdio, which is the best transport for local desktop AI clients.
For Codex or Claude Code, Feather can install the persistent MCP client entry:
Codex setup updates ~/.codex/config.toml. Claude setup defaults to user scope and updates ~/.claude.json; use --scope project to write .mcp.json in the current project, or --scope local to add a project-local entry under ~/.claude.json. Setup does not copy the MCP token into client config; the CLI reads the token from ~/.feather/mcp.json when the client starts the server. Restart the client after setup.
For clients that require Streamable HTTP:
HTTP listens on 127.0.0.1:4006/mcp by default and requires the same bearer token as the desktop bridge.
Tokens And Options¶
The desktop writes MCP settings to ~/.feather/mcp.json. The CLI resolves the bridge token in this order:
--tokenFEATHER_MCP_TOKEN~/.feather/mcp.json
Useful options:
| Option | Default | Description |
|---|---|---|
--transport <stdio\|http> |
stdio |
MCP transport. |
--host <host> |
127.0.0.1 |
HTTP host. Only localhost hosts are accepted. |
--port <port> |
4006 |
HTTP MCP port. |
--desktop-url <url> |
http://127.0.0.1:4005 |
Desktop MCP bridge URL. |
--token <token> |
Bridge and HTTP bearer token. |
Example local client config:
The Codex setup command writes the equivalent TOML server entry:
Claude setup writes the JSON server entry with type = "stdio" in the selected scope:
Resources¶
Feather MCP resources are JSON-only snapshots. Secret-like fields such as appId, apiKey, bearer tokens, passwords, and secret fields are redacted.
| Resource | Description |
|---|---|
feather://sessions |
Connected and recently seen session summaries. |
feather://sessions/{id}/config |
Sanitized runtime config snapshot. |
feather://sessions/{id}/logs |
Recent logs. |
feather://sessions/{id}/performance |
Recent performance metrics. |
feather://sessions/{id}/debugger |
Debugger status and paused frame state. |
feather://sessions/{id}/plugins |
Live plugin payload map. |
feather://sessions/{id}/plugins/{pluginId} |
Live payload for one plugin. |
feather://sessions/{id}/assets |
Asset catalog metadata. |
feather://sessions/{id}/observers |
Observability payloads. |
feather://sessions/{id}/session-replay |
Session Replay status, loaded recording, and replay list. |
feather://plugins/catalog |
Built-in plugin catalog metadata. |
feather://plugins/{pluginId} |
Built-in metadata for one plugin. |
feather://creative/shader-graph |
Desktop-local Shader Graph snapshot. |
feather://creative/particle-system-playground |
Particle Playground snapshot. |
feather://creative/texture-lab |
Desktop-local Texture Lab snapshot. |
Tools¶
Session and runtime tools:
feather_list_sessionsfeather_get_session_snapshotfeather_refreshfeather_runtimefeather_debugger_statefeather_debugger_enablefeather_debugger_set_breakpointsfeather_debugger_stepfeather_debugger_continuefeather_debugger_inspect_framefeather_debugger_line_contextfeather_debuggerfeather_console_evalfeather_consolefeather_time_travelfeather_session_replay_statefeather_session_replay_listfeather_session_replay_startfeather_session_replay_stopfeather_session_replay_loadfeather_session_replay_playfeather_session_replay_seekfeather_session_replay_stop_playbackfeather_session_replay_importfeather_session_replay_deletefeather_session_replayfeather_send_command
Plugin tools:
feather_list_pluginsfeather_get_pluginfeather_get_live_plugin_statefeather_refresh_pluginfeather_plugin_actionfeather_plugin_paramsfeather_plugin_set_enabled
Creative tools:
feather_create_shaderfeather_create_particle_systemfeather_create_texturefeather_shader_graph_snapshotfeather_shader_graph_compilefeather_shader_graph_previewfeather_shader_graph_clear_previewfeather_shader_graph_importfeather_shader_graph_exportfeather_particles_snapshotfeather_particles_new_compositefeather_particles_selectfeather_particles_set_paramsfeather_particles_actionfeather_particles_export_projectfeather_particles_export_codefeather_particles_export_zipfeather_texture_lab_generatorsfeather_texture_lab_snapshotfeather_texture_lab_set_recipefeather_texture_lab_save_recipefeather_texture_lab_delete_recipefeather_texture_lab_generatefeather_texture_lab_generate_atlas
Texture Lab and Particle Playground binary outputs are returned as JSON/base64 payload metadata. MCP does not write generated files automatically.
Creating Creative Assets¶
Use the high-level creation tools first:
feather_create_shadercreates a Shader Graph workspace shader from Feather graph JSON or standalone GLSL. PassvalidateInGame: trueto route it through the liveshader-graphplugin compiler, orpreviewInGame: trueto show it in a connected Love2D session.feather_create_particle_systemcreates a Particle Playground composite in a live session, then can apply emitter params, attach texture/shader payloads, emit a burst, and return project/code/ZIP exports.feather_create_texturecreates a Texture Lab PNG or atlas payload from a recipe, generator, and dimensions. It returns base64 metadata and can optionally save the recipe in the desktop workspace.
The lower-level Shader Graph, Particle Playground, Texture Lab, and generic plugin tools remain available when an MCP client needs precise step-by-step control.
Step Debugging¶
Use the debugger-specific tools when an MCP client needs to drive a paused Love2D session:
feather_debugger_statereturns debugger status, the paused frame, locals/upvalues, recent logs, and nearby source lines from the debuggersourceRoot.feather_debugger_enableenables the step debugger and can setpauseOnError.feather_debugger_set_breakpointsmerges or replaces breakpoints and returns rejected breakpoint details from the runtime.feather_debugger_stepsupportsover,into, andout, waits for the nextdebugger:pausedmessage, then returns updated state.feather_debugger_continueresumes execution and waits fordebugger:resumed.feather_debugger_inspect_framerequests locals/upvalues for a stack frame.feather_debugger_line_contextreads source context for the current pause, a stack frame, or an explicit file/line inside the game source root.
The generic feather_debugger tool is still available for raw debugger actions, but the dedicated tools are the recommended MCP path for agent-led debugging.
Session Replay¶
Use the Session Replay tools when an MCP client needs to record or reproduce a run:
feather_session_replay_statereturns current recording/playback status, loaded recording payload metadata, and the replay list.feather_session_replay_listrefreshes saved replay summaries.feather_session_replay_startstarts recording with optional Session Replay options such asidorinitialStates.feather_session_replay_stopstops recording and returns updated status/list state.feather_session_replay_loadloads a replay payload byidorpath, returning replay files as JSON/base64 metadata.feather_session_replay_playstarts playback for the selected or provided replay, with optionalseekTo.feather_session_replay_seekjumps by time, checkpoint id, or checkpoint label, optionally resuming playback.feather_session_replay_stop_playbackstops playback.feather_session_replay_importimports replay files supplied by the MCP client.feather_session_replay_deletedeletes a saved replay.
Replay payloads are returned through MCP as JSON/base64 metadata. MCP does not write replay archives or files directly.
Security¶
MCP access has two local servers:
- The desktop MCP bridge listens on
127.0.0.1:4005. feather mcp --transport httplistens on127.0.0.1:4006/mcp.
Both are localhost-only by default and token-protected. The desktop bridge rejects browser-origin requests except approved localhost origins.
Console eval remains separately gated by the existing Console plugin, evalEnabled, and matching apiKey. MCP does not bypass those gates.
feather_send_command is an advanced escape hatch. The bridge strips caller-supplied appId, apiKey, token, authorization, password, and secret fields before forwarding commands through the same desktop authorization path.
Troubleshooting¶
MCP token is required¶
Enable Settings → Security → MCP Access, pass --token, or set FEATHER_MCP_TOKEN.
Desktop bridge 403: MCP bridge is disabled¶
Enable MCP Access in the desktop app.
Connection refused¶
Start the Feather desktop app. Live-session tools require the desktop bridge.
No connected Feather sessions¶
Start a game with feather run path/to/game or pass a specific sessionId when multiple sessions are connected.
creative executor is not available¶
Open the Feather desktop app UI. Texture Lab and desktop-local creative workflows are executed by the React app behind the authenticated bridge.