<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SpriteShip Team</title>
    <description>The latest articles on DEV Community by SpriteShip Team (@spriteship).</description>
    <link>https://dev.to/spriteship</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4086461%2Fe5dd3426-4c34-4a48-a15d-f24ef64daf0e.png</url>
      <title>DEV Community: SpriteShip Team</title>
      <link>https://dev.to/spriteship</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spriteship"/>
    <language>en</language>
    <item>
      <title>From Prompt to Playable: Building a Phaser Survival Game with Codex and SpriteShip</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Sat, 22 Aug 2026 18:22:01 +0000</pubDate>
      <link>https://dev.to/spriteship/from-prompt-to-playable-building-a-phaser-survival-game-with-codex-and-spriteship-2me0</link>
      <guid>https://dev.to/spriteship/from-prompt-to-playable-building-a-phaser-survival-game-with-codex-and-spriteship-2me0</guid>
      <description>&lt;p&gt;There is a big difference between a game prototype that technically works and one that feels like a game.&lt;/p&gt;

&lt;p&gt;Movement, spawning, upgrades, and collision can be built with colored rectangles. That is often the right way to start. But the moment you want an animated player, a family of enemies, weapon variety, collectibles, and a consistent visual identity, the art pipeline can become the project.&lt;/p&gt;

&lt;p&gt;For a recent experiment, I wanted to see how far I could get by combining three tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phaser 3&lt;/strong&gt; for the game runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex&lt;/strong&gt; for implementation and iteration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SpriteShip&lt;/strong&gt; for game-ready visual assets through its MCP/API workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result was &lt;strong&gt;Last Light&lt;/strong&gt;, a top-down survival game that runs in desktop and mobile browsers. It has an animated player, multiple enemy families, a large humanoid with separate walk and attack animations, sixteen weapons, sixteen collectibles, upgrades, an objective, and a boss encounter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play Last Light:&lt;/strong&gt; &lt;a href="https://spriteship.github.io/sample_games/last-light/" rel="noopener noreferrer"&gt;https://spriteship.github.io/sample_games/last-light/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Browse the source repository:&lt;/strong&gt; &lt;a href="https://github.com/spriteship/sample_games" rel="noopener noreferrer"&gt;https://github.com/spriteship/sample_games&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More importantly, it became playable through a surprisingly natural loop: describe an asset, generate it in SpriteShip, inspect or revise it, and let Codex wire the exported data into Phaser.&lt;/p&gt;
&lt;h2&gt;
  
  
  Starting with gameplay, not presentation
&lt;/h2&gt;

&lt;p&gt;The first version was intentionally plain. It established the systems that mattered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Top-down movement&lt;/li&gt;
&lt;li&gt;Automatic targeting and firing&lt;/li&gt;
&lt;li&gt;Enemy spawning and difficulty progression&lt;/li&gt;
&lt;li&gt;Experience drops and upgrades&lt;/li&gt;
&lt;li&gt;Desktop and touch input&lt;/li&gt;
&lt;li&gt;A camera following the player across a large map&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gave us something useful to evaluate. Once the loop was playable, every art decision could be judged in motion rather than in isolation.&lt;/p&gt;

&lt;p&gt;This order mattered. SpriteShip did not have to invent the game design; it could supply assets for systems that already existed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating a coherent project in SpriteShip
&lt;/h2&gt;

&lt;p&gt;Instead of making unrelated images one at a time, we created a top-down overhead project in SpriteShip. That project context helped keep the blackout-survival direction consistent across characters, enemies, weapons, and collectibles.&lt;/p&gt;

&lt;p&gt;The player went through a normal creative selection process. We generated options, selected a character, refined the camera angle and facing direction, and then added animation states. The same process produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A player walk cycle&lt;/li&gt;
&lt;li&gt;A separate idle animation&lt;/li&gt;
&lt;li&gt;Four creature enemies&lt;/li&gt;
&lt;li&gt;A larger weaponless humanoid enemy&lt;/li&gt;
&lt;li&gt;Humanoid walk and attack animations&lt;/li&gt;
&lt;li&gt;A 4×4 weapon set&lt;/li&gt;
&lt;li&gt;A 4×4 collectible set&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The useful part was not just getting PNG files. SpriteShip returned structured animation data: atlas frames, FPS, looping behavior, source sizes, previews, and collision-body definitions.&lt;/p&gt;

&lt;p&gt;That is where the MCP integration started to feel less like image generation and more like a game-development tool.&lt;/p&gt;
&lt;h2&gt;
  
  
  Wiring SpriteShip animations into Phaser
&lt;/h2&gt;

&lt;p&gt;Phaser’s atlas support maps naturally to SpriteShip’s exports. The loader only needs the sheet and its JSON metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;atlas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;PLAYER_ATLAS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assets/spriteship/player/spritesheet_walk_256.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assets/spriteship/player/atlas_walk_256.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Animation registration can use the frame list supplied by the atlas instead of assuming a fragile numeric range:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atlasData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;animations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;anims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;player-walk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PLAYER_ATLAS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})),&lt;/span&gt;
  &lt;span class="na"&gt;frameRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The player switches to the walk cycle while moving and to SpriteShip’s &lt;code&gt;idle_2&lt;/code&gt; animation while stationary. Because the animation data is named and versionable, updating a dashboard edit is much safer than manually rebuilding frame sequences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collision data was more useful than I expected
&lt;/h2&gt;

&lt;p&gt;SpriteShip supplied normalized rectangular collision bodies for individual animation states. We converted those values into rotated world-space rectangles inside Phaser.&lt;/p&gt;

&lt;p&gt;For the humanoid enemy, the body changes when the attack animation begins. The attack pose is wider and lower than the walk pose, so using a single circular approximation would have produced misleading hits.&lt;/p&gt;

&lt;p&gt;The final game uses the same authored rectangle for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projectile collision&lt;/li&gt;
&lt;li&gt;Enemy melee contact&lt;/li&gt;
&lt;li&gt;Debug visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point was important. Drawing the rectangle on screen made it immediately obvious whether gameplay matched the artwork. It also turned collision tuning into something a non-programmer could evaluate visually.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dashboard-and-agent loop worked well
&lt;/h2&gt;

&lt;p&gt;One of my favorite parts of the workflow was mixing dashboard edits with Codex-driven integration.&lt;/p&gt;

&lt;p&gt;At one point, the humanoid attack animation was adjusted in the SpriteShip dashboard. Instead of manually exporting everything and explaining what changed, the updated asset could be fetched again and repackaged for the game. The same happened with collectible cleanup.&lt;/p&gt;

&lt;p&gt;The division of labor felt sensible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The human selected and visually edited assets.&lt;/li&gt;
&lt;li&gt;SpriteShip managed the project and generated structured outputs.&lt;/li&gt;
&lt;li&gt;Codex synchronized files, generated runtime variants, updated Phaser code, and ran tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was a much smoother loop than downloading miscellaneous images, renaming them by hand, and guessing how they should be sliced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolution is not only width and height
&lt;/h2&gt;

&lt;p&gt;The most useful lesson from the project was that two 256×256 frames are not necessarily the same visual size.&lt;/p&gt;

&lt;p&gt;The player’s walk and idle animations both had 256×256 runtime frames, but the character initially occupied a much smaller part of the idle frame. When the game switched states, the player appeared to shrink.&lt;/p&gt;

&lt;p&gt;We measured the visible pixel bounds and found roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Walk footprint: 158×179 pixels&lt;/li&gt;
&lt;li&gt;Initial idle footprint: 109×111 pixels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix was to rebuild the idle runtime sheet from SpriteShip’s original 512×512 frames, normalize the character around the same ground anchor, and then export back to 256×256 frames. That produced a much closer 176×178 pixel footprint without throwing away source detail.&lt;/p&gt;

&lt;p&gt;This was not a failure of the integration. It was a reminder that a real asset pipeline must consider transparent padding, subject scale, ground contact, and intended display size—not just file dimensions.&lt;/p&gt;

&lt;p&gt;The same principle guided the other assets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weapons: 32×32 source and runtime display target&lt;/li&gt;
&lt;li&gt;Collectibles: 64×64 source and runtime display target&lt;/li&gt;
&lt;li&gt;Animated characters: larger source frames with consistent visual occupancy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those rules were explicit, the game looked much sharper and more cohesive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SpriteShip made easy
&lt;/h2&gt;

&lt;p&gt;Several things that normally consume a lot of setup time were refreshingly straightforward:&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistent asset families
&lt;/h3&gt;

&lt;p&gt;The player, enemies, weapons, and collectibles belong to the same visual world. Achieving that consistency across dozens of independent assets is usually difficult.&lt;/p&gt;

&lt;h3&gt;
  
  
  Animation metadata
&lt;/h3&gt;

&lt;p&gt;Named animations, FPS, loop state, frame lists, and preview GIFs made integration predictable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple runtime sizes
&lt;/h3&gt;

&lt;p&gt;Having access to larger sources and smaller runtime variants let us make sensible choices for desktop and mobile instead of scaling one image everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP/API access
&lt;/h3&gt;

&lt;p&gt;The API key stayed in the local environment, and Codex could work with SpriteShip as part of the development process. There was no need to build an asset-management service inside the game.&lt;/p&gt;

&lt;h3&gt;
  
  
  Human-in-the-loop editing
&lt;/h3&gt;

&lt;p&gt;The dashboard remained valuable even in an agent-driven workflow. This was not “type one prompt and accept everything.” It was a collaborative process where visual judgment and automation complemented each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results were not magically perfect—and that is fine
&lt;/h2&gt;

&lt;p&gt;A believable account of AI-assisted creation should include the iterations.&lt;/p&gt;

&lt;p&gt;The first character direction was not exactly right. One collectible sheet included labels that were useful for review but not for runtime use. Animation families needed scale normalization. Playback speed needed tuning after a walk cycle changed frame count. Collision bodies needed to be visualized before they could be trusted.&lt;/p&gt;

&lt;p&gt;What impressed me was how inexpensive those corrections were in the overall workflow. We did not have to discard the pipeline every time something changed. We could revise an asset, fetch the new version, and update the game.&lt;/p&gt;

&lt;p&gt;That is a more meaningful kind of speed than getting a perfect image from one prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a sample repository
&lt;/h2&gt;

&lt;p&gt;The finished game became the first entry in a dedicated SpriteShip sample-games repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spriteship-game-samples/
├── README.md
├── package.json
└── games/
    └── last-light/
        ├── README.md
        ├── PRD.md
        ├── public/
        ├── tests/
        └── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each future game can live in its own workspace with independent assets, tests, and build scripts. The root repository acts as a catalog rather than forcing every sample into one application.&lt;/p&gt;

&lt;p&gt;This structure also makes the examples useful to developers. They can inspect the actual atlases, animation registration, collision conversion, and resolution choices instead of only seeing a promotional demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do next
&lt;/h2&gt;

&lt;p&gt;The obvious next step is to add samples in other genres and engines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A platformer with state transitions and hit reactions&lt;/li&gt;
&lt;li&gt;A tactics prototype using character directions and tilemaps&lt;/li&gt;
&lt;li&gt;A Godot sample using the same SpriteShip project concepts&lt;/li&gt;
&lt;li&gt;A small multiplayer arena with cosmetic variants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would also like to see engine-specific SpriteShip exports become even more opinionated: a Phaser loader module, recommended display sizes, per-frame opaque bounds, and a compact synchronization manifest would make an already smooth workflow nearly automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Codex made it possible to keep implementation, asset processing, testing, and iteration in one development thread. Phaser made the runtime lightweight and immediate. SpriteShip supplied the piece that usually holds prototypes back: enough coherent, animated art to make the game feel intentional.&lt;/p&gt;

&lt;p&gt;The standout feature was not simply that SpriteShip generated good images. It was that the service fit into a real engineering loop. Assets had identities, versions, animations, collision data, previews, and dashboard edits. The MCP/API interface made those capabilities accessible without turning the project into an asset-management exercise.&lt;/p&gt;

&lt;p&gt;Last Light still involved judgment and iteration, as every game does. But the distance between “I want a top-down survival game” and “I can play one with a coherent animated cast” was much shorter than I expected.&lt;/p&gt;

&lt;p&gt;That is the kind of AI-assisted workflow I find genuinely useful: not replacing the creative process, but removing enough friction that the process can keep moving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play the game:&lt;/strong&gt; &lt;a href="https://spriteship.github.io/sample_games/last-light/" rel="noopener noreferrer"&gt;https://spriteship.github.io/sample_games/last-light/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Project repository:&lt;/strong&gt; &lt;a href="https://github.com/spriteship/sample_games" rel="noopener noreferrer"&gt;https://github.com/spriteship/sample_games&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Tools:&lt;/strong&gt; &lt;a href="https://spriteship.com/" rel="noopener noreferrer"&gt;SpriteShip&lt;/a&gt;, Codex, Phaser 3&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>phaser</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How to give a coding agent a complete 2D game-art pipeline over MCP</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Thu, 20 Aug 2026 12:42:02 +0000</pubDate>
      <link>https://dev.to/spriteship/how-to-give-a-coding-agent-a-complete-2d-game-art-pipeline-over-mcp-1475</link>
      <guid>https://dev.to/spriteship/how-to-give-a-coding-agent-a-complete-2d-game-art-pipeline-over-mcp-1475</guid>
      <description>&lt;p&gt;Most coding agents can write the player controller, register an animation, and&lt;br&gt;
load a texture atlas. They usually stop at the point where the art has to exist.&lt;/p&gt;

&lt;p&gt;That boundary is awkward for an autonomous workflow. An image generator can&lt;br&gt;
produce a PNG, but the agent still has to guess how to split frames, name&lt;br&gt;
animations, build an atlas, define collision, and package everything for the&lt;br&gt;
engine.&lt;/p&gt;

&lt;p&gt;SpriteShip's hosted Model Context Protocol server is meant to close that gap. It&lt;br&gt;
currently exposes 41 tools for creating, reading, revising, animating, and&lt;br&gt;
exporting a game's 2D art layer.&lt;/p&gt;

&lt;p&gt;The cover image for this article was AI-generated with SpriteShip.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the agent can actually make
&lt;/h2&gt;

&lt;p&gt;The tool surface covers more than characters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;animated characters and directional turns;&lt;/li&gt;
&lt;li&gt;static props and animated objects;&lt;/li&gt;
&lt;li&gt;tilesets, terrain sheets, backgrounds, and seamless textures;&lt;/li&gt;
&lt;li&gt;level maps assembled from those assets;&lt;/li&gt;
&lt;li&gt;engine-native exports for Phaser, Godot, Unity, GameMaker, and Tiled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is the sequence. An agent can create a project, generate an&lt;br&gt;
asset inside it, poll the asynchronous job, inspect the result, and export files&lt;br&gt;
without requiring somebody to first prepare the entity in the web dashboard.&lt;/p&gt;
&lt;h2&gt;
  
  
  Connect the MCP server
&lt;/h2&gt;

&lt;p&gt;Create a scoped API key in SpriteShip under &lt;strong&gt;Account → API keys&lt;/strong&gt;, then expose it&lt;br&gt;
to the process running your agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SPRITESHIP_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ss_live_..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MCP endpoint is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://spriteship.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An MCP client configuration has three essential fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"spriteship"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://spriteship.com/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ${env:SPRITESHIP_API_KEY}"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact config-file location differs between Claude Code, Cursor, Windsurf,&lt;br&gt;
Cline, and Codex, but the endpoint and authorization header are the same.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start with a project
&lt;/h2&gt;

&lt;p&gt;Characters and assets live inside a project. The project also owns the permanent&lt;br&gt;
game perspective that guides later generations: platformer, angled top-down,&lt;br&gt;
straight overhead, isometric, or point-and-click.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;create_project&lt;/code&gt; is synchronous and free. A typical instruction to the agent is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create a platformer project called Clockwork Harbor. Use a hand-drawn style and&lt;br&gt;
describe it as a foggy port city powered by unreliable brass machinery.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before creating anything, the agent should call &lt;code&gt;list_projects&lt;/code&gt; and reuse a&lt;br&gt;
matching project rather than creating a near-duplicate.&lt;/p&gt;
&lt;h2&gt;
  
  
  Generate four character options for one image call
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;create_character&lt;/code&gt; makes the initial character image. Setting both &lt;code&gt;gridRows&lt;/code&gt;&lt;br&gt;
and &lt;code&gt;gridCols&lt;/code&gt; to &lt;code&gt;2&lt;/code&gt; asks for a four-variation sheet. It is still one image call,&lt;br&gt;
so the four resulting character designs have the same generation cost as one.&lt;/p&gt;

&lt;p&gt;That makes the sensible first workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Request a 2×2 set of character variations.&lt;/li&gt;
&lt;li&gt;Poll the returned job with &lt;code&gt;get_job&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Show the four &lt;code&gt;characterPreviews&lt;/code&gt; to the user.&lt;/li&gt;
&lt;li&gt;Animate only the selected design.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Generation is asynchronous. The create call returns a &lt;code&gt;jobId&lt;/code&gt;; when the job is&lt;br&gt;
finished, &lt;code&gt;get_job&lt;/code&gt; returns the created character IDs and expiring preview URLs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Preview the cost before spending
&lt;/h2&gt;

&lt;p&gt;Paid SpriteShip MCP tools default to &lt;code&gt;dryRun: true&lt;/code&gt;. A dry run returns the&lt;br&gt;
estimated credit cost, current balance, daily spend cap, recent spend, and&lt;br&gt;
remaining cap. It generates nothing.&lt;/p&gt;

&lt;p&gt;The expected exchange looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user: make four plague-doctor character concepts for this project

agent: the generation is estimated at 150 credits. Your balance after the call
       would be 1,350 credits. Shall I run it?

user: yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only after that explicit approval should the agent repeat the call with&lt;br&gt;
&lt;code&gt;dryRun: false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is backed by server-side controls rather than prompt etiquette:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys have separate read, write, and spend scopes;&lt;/li&gt;
&lt;li&gt;each key has a daily credit ceiling;&lt;/li&gt;
&lt;li&gt;real writes are idempotent, so a retry cannot dispatch and charge twice;&lt;/li&gt;
&lt;li&gt;writes against a busy entity are rejected instead of racing;&lt;/li&gt;
&lt;li&gt;revoking a key cancels its unfinished jobs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a job reaches a terminal state, the agent should report the job's actual&lt;br&gt;
net charge rather than repeating the estimate. Four variations still come from&lt;br&gt;
one charged image call, and failed steps can change the final amount.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add real motion
&lt;/h2&gt;

&lt;p&gt;The still image and its animations are intentionally separate decisions.&lt;br&gt;
&lt;code&gt;generate_character_animation&lt;/code&gt; creates image-to-video motion such as a walk,&lt;br&gt;
idle, attack, or dodge. Each generated animation is a separate paid video call,&lt;br&gt;
so the agent should ask which motions are actually needed.&lt;/p&gt;

&lt;p&gt;For directional characters, a generated direction can also produce a free&lt;br&gt;
mirrored copy in the same job. A real second generation is still the right choice&lt;br&gt;
for an asymmetric character, because mirroring moves a held item to the opposite&lt;br&gt;
hand.&lt;/p&gt;

&lt;p&gt;Recent animation work also makes the generated motion more usable downstream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the starting pose is checked for visual inventory so empty hands remain empty
and existing held items are preserved;&lt;/li&gt;
&lt;li&gt;occupied animation names resolve non-destructively (&lt;code&gt;jump&lt;/code&gt;, &lt;code&gt;jump_2&lt;/code&gt;,
&lt;code&gt;jump_3&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;jump animations can be split into takeoff, airborne, and landing phases;&lt;/li&gt;
&lt;li&gt;character exports carry ten skeleton-derived attachment points for equipment
and effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Export something the engine understands
&lt;/h2&gt;

&lt;p&gt;Once the character is ready, &lt;code&gt;get_export_command&lt;/code&gt; returns an authenticated URL&lt;br&gt;
and a ready-to-run &lt;code&gt;curl&lt;/code&gt; command for the chosen engine. The agent runs that&lt;br&gt;
command in its own shell rather than passing a multi-megabyte zip through the&lt;br&gt;
language model.&lt;/p&gt;

&lt;p&gt;An export can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sprite sheets and atlas metadata;&lt;/li&gt;
&lt;li&gt;native engine resources;&lt;/li&gt;
&lt;li&gt;animation names and frame timing;&lt;/li&gt;
&lt;li&gt;collision shapes and ground footprints;&lt;/li&gt;
&lt;li&gt;per-frame equipment attachment points;&lt;/li&gt;
&lt;li&gt;a manifest, JSON Schema, README, and SpriteShip skill instructions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last group matters. The bundle explains its own structure, so the coding&lt;br&gt;
agent can register the animation in the game instead of inventing a file layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful end-to-end prompt
&lt;/h2&gt;

&lt;p&gt;After connecting the server, try an instruction shaped like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create a platformer project for a clockwork harbor game. Preview the cost of&lt;br&gt;
four character designs for a lantern-carrying mechanic. Wait for my approval&lt;br&gt;
before spending anything. When they finish, show me the options and let me pick&lt;br&gt;
one. Then quote an idle and walk animation, generate only after I approve, and&lt;br&gt;
export the result for Phaser.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That single request exercises the important boundaries: project context, cost&lt;br&gt;
preview, explicit approval, asynchronous jobs, visual selection, separate&lt;br&gt;
animation spend, and engine-native export.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Agent overview and setup guides: &lt;a href="https://spriteship.com/agents" rel="noopener noreferrer"&gt;https://spriteship.com/agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP endpoint: &lt;a href="https://spriteship.com/mcp" rel="noopener noreferrer"&gt;https://spriteship.com/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;API and key management: &lt;a href="https://spriteship.com/account/api-keys" rel="noopener noreferrer"&gt;https://spriteship.com/account/api-keys&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SpriteShip includes 1,500 starting credits and does not require a card to try the&lt;br&gt;
first workflow. Reading existing assets and re-exporting them are free; credits&lt;br&gt;
are used for new AI generations.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>mcp</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
