◉ANTIGRAVITY LABJP
Articles/Integrations
⬡ Integrations/2026-10-10Intermediate

Figma MCP or Stitch MCP: Choosing by Whether the Screen Already Exists

When you turn a screen into code, which MCP should Antigravity talk to: Figma or Stitch? One question settles it: does the correct screen already exist? Here is the rule I use, a switching routine, and a small script for the days I can't decide.

MCP27Figma7Stitch4Antigravity CLI37design to code

The night before I started a new settings screen, I sat staring at my MCP list. Both the Figma server and the Stitch server were already registered. Both turn screens into code, and either one gives you plausible SwiftUI. Yet on the days I picked one, I barely had to redo anything; on the days I picked the other, I rewrote everything by evening.

The difference wasn't the quality of the tools. It was who already held the correct screen.

The short answer

Figma MCP reads a screen that already exists. Stitch MCP helps you produce a screen that doesn't exist yet.

If a designer (or past me) finished the screen in Figma, connect Figma MCP. The code's job is fidelity to fixed dimensions, colors, and component structure. If all you have is a vague picture in your head, Stitch MCP is the better start: it proposes screens from a prompt, and you pick one as the starting point for code.

As an indie developer, I hit both situations in the same week. Putting the rule into words cut down the late-night dithering considerably.

What each server hands back

Most of the confusion comes from the surface similarity: both return screen information. The character of that information differs.

AspectFigma MCPStitch MCP
PremiseA finished frame exists in FigmaNo screen yet; you start from text or a reference image
What comes backLayout, color, and typography data plus a screenshotGenerated screen proposals and the information to hand them to code
What code must doStay faithful to dimensions and tokensChoose among proposals
How it failsCode drifts a few pixels from the designEach run differs, so there is no baseline
Best forImplementing a settled design, reworking an existing appFirst drafts, exploring direction

The "how it fails" row mattered most to me. Drift against Figma can be counted as a diff, because a correct answer exists. Variation in Stitch can't be counted, because there is no correct answer yet. Whether you are enjoying the variation or trying to stop it decides the tool.

Three questions

I run through these in order.

First: does the correct screen exist in Figma? If so, use Figma MCP and stop there. Second: if not, do I want a proposal or an implementation right now? For a proposal, generate screens with Stitch and keep the one I like. If I want an implementation but have no screen, picking one proposal first is the shorter road. Third: will this screen keep changing? If yes, I place the chosen Stitch proposal into Figma as the new source of truth, and from then on Figma MCP carries the work alone.

For the days I'm too tired to think, here is that routine as a small script.

# choose_design_source.py
# Decide which MCP to enable before turning a screen into code.
# Usage: python3 choose_design_source.py --has-figma-frame yes --need proposal --keeps-changing yes
import argparse
 
 
def choose(has_frame: bool, need: str, keeps_changing: bool) -> tuple[str, str]:
    """Return (MCP to use, reason)."""
    if has_frame:
        return "figma", "The correct screen is in Figma. Read its dimensions and tokens."
    if need == "implementation":
        # Rushing to implement without a screen turns proposal variance into code variance
        return "stitch", "No screen yet. Narrow to one proposal in Stitch before implementing."
    if keeps_changing:
        return "stitch→figma", "Draft in Stitch, then move the chosen one into Figma as the source of truth."
    return "stitch", "Exploration phase. Accept variation and keep only the one you like."
 
 
def main() -> None:
    p = argparse.ArgumentParser()
    p.add_argument("--has-figma-frame", choices=["yes", "no"], required=True)
    p.add_argument("--need", choices=["proposal", "implementation"], required=True)
    p.add_argument("--keeps-changing", choices=["yes", "no"], default="no")
    a = p.parse_args()
    tool, why = choose(a.has_figma_frame == "yes", a.need, a.keeps_changing == "yes")
    print(f"MCP to use: {tool}\nReason: {why}")
 
 
if __name__ == "__main__":
    main()

The logic is simple. Still, being asked "are you trying to implement without a screen?" every time stopped me at least twice.

What happened when I kept both connected

There was a period when I thought, "If I can't decide, I'll connect both." It didn't go well.

Every connected MCP server adds its tool descriptions to the agent's context. With two screen-generating systems loaded, the agent switched between them based on how I phrased the request. I'd ask it to "turn this screen into code," and it would go looking for a Figma frame, or start generating a brand-new screen in Stitch that I never asked for. More tools didn't make it more accurate; it just let the agent make the choice for me.

Now I enable only the side I need and keep the other's definition disabled. The CLI's mcp subcommand switches them without opening a config file.

# Register once (replace URLs and tokens with your own)
agy mcp add figma --type http https://mcp.figma.com/mcp
agy mcp add stitch --type http --header "Authorization: Bearer ${STITCH_TOKEN}" YOUR_STITCH_MCP_URL
 
# A day when Figma holds the correct screen
agy mcp disable stitch
agy mcp enable figma
agy mcp list     # confirm by eye that exactly one is enabled
 
# A day when I'm exploring
agy mcp disable figma
agy mcp enable stitch

For Stitch, use the endpoint and auth method from the official setup instructions; I left YOUR_STITCH_MCP_URL blank on purpose. Figma's first connection (approval in the browser, for example) can also vary by environment, so I'd follow the official guide for that initial step.

Running agy mcp list after every switch is a dull habit that paid off. One morning a server I thought I had disabled was still on.

Moving the "correct answer" from Stitch to Figma

A note on the third question. Stitch is good at producing proposals, but maintaining a chosen proposal for months requires the correct screen to live somewhere outside the code, especially if someone else needs to review the design. I redraw the chosen Stitch screen as a Figma frame and make later changes there.

It looks like extra work. But Figma MCP then reads dimensions and tokens during implementation, and I recovered the cost by the second screen. Explore in Stitch, keep the answer in Figma, and let the code look only at the answer. That one sentence is my promise to myself.

The smallest test when you're still unsure

If the three questions don't settle it, try one existing screen before switching servers. Have Figma MCP read the frame of a screen you've already shipped and ask for a diff against the current code. If it produces a believable diff, you have a sign that it can be trusted as a reader of the correct answer.

For Stitch, send the same prompt twice and see how much the proposals vary. If the spread is tolerable, it suits exploration; if not, that screen is probably ready to have its answer fixed in Figma.

What to do next

Run agy mcp list and check that only one screen-related server is enabled. If two are, ask whether today's screen already has a correct answer, then agy mcp disable the side that doesn't match. I try never to skip that small step, even on rushed days.

Share

Thank You for Reading

Antigravity Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $15 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

⬡ Integrations2026-08-22
Adding MCP Servers Without Opening the Config File: The agy mcp Subcommand
Antigravity CLI 1.1.16, released on August 20, adds an mcp subcommand so you can register and toggle MCP servers without hand-editing JSON. Here is how to add stdio and HTTP servers, isolate a misbehaving one, and script your whole setup so it travels to a new machine.
⬡ Integrations2026-08-20
Find the one broken MCP entry before Antigravity starts, with 40 lines of Node
A single typo in your MCP settings can take every server down with it. Here is a small preflight script that catches the mistakes statically, the real output from a deliberately broken config, and the duplicate-key trap that JSON hides from you.
⬡ Integrations2026-08-04
Startup Dropped to 3ms, and the First Turn Saw Zero Tools
Non-blocking MCP loading cut startup from 2,907ms to 3ms. The wait did not disappear — it moved into the first turn. Here is where it went, measured, plus a readiness gate that waits only for what a turn actually needs.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links