Design handoff · 6 min
Which coding agent handles design context best
Claude Code, Cursor, Codex, Replit and Lovable take design context through different mechanisms, in different files, with different lifetimes. A comparison of what each one can actually reach.
Updated
The design-tool side of the handoff gets most of the attention. The receiving side decides more than people expect: which servers an agent may connect to at all, where its configuration lives, whether that configuration travels with the repository, and how much of it survives into the next session.
These differences are not preferences. They determine whether a design route exists for you.
What each agent can reach
| Agent | MCP config lives in | Travels with repo | In Figma's catalog | Sketch MCP |
|---|---|---|---|---|
| Claude Code | claude mcp add, or its settings file | If committed | Yes | Yes |
| Cursor | .cursor/mcp.json at the repo root | Yes | Yes | Yes |
| Codex | [mcp_servers.*] in ~/.codex/config.toml | No — user level | Yes | Yes |
| Replit | .replit, token in Secrets | Yes | Yes | Not documented |
| Lovable | Settings → Integrations, URL and token | No | No | Not documented |
Two columns in that table do more work than the rest.
"Travels with repo" decides whether a design route is a team capability or a personal one. Cursor's .cursor/mcp.json and Replit's .replit are committed, so anyone who clones the repository gets the same servers with no instructions. Codex's configuration is user-level: it follows the person across every project and arrives with none of them. Neither is better, but the second one means a new teammate is not set up until somebody tells them, and nobody remembers to.
"In Figma's catalog" is the one that surprises people, because it is a hard gate rather than a difficulty. Figma's MCP server only accepts connections from clients in its catalog. Everything above is on that list except Lovable.
Where each one puts the configuration
The shape is the same everywhere — a URL and an auth header — and the file it goes in is what differs.
Claude Code
Registered with claude mcp add, using the HTTP transport, or written straight into the settings file. Verify with /mcp inside a session; a server that registered but cannot authenticate shows up there rather than failing silently mid-task.
Cursor
.cursor/mcp.json at the repository root. This is the only one of the five where the default advice — commit it — makes a design route a property of the project rather than of the person. New clone, same servers, no message in Slack.
Codex
An [mcp_servers.moodspec]-style block in ~/.codex/config.toml, typically launched through npx -y mcp-remote for servers speaking HTTP. User-level, so it follows you between projects and arrives in none of them.
Replit
An [agent.mcp.*] block in .replit, with the token in Replit Secrets rather than in the file. The file is committed; the secret store is not. Getting this backwards is the most common way a token ends up in a public repository.
Lovable
Settings → Integrations → MCP, pasting a URL and a bearer token into the interface. There is no file, which means there is nothing to commit, review or diff — and no way to tell from the repository whether it is configured at all.
Lovable, the outlier
Lovable is not in Figma's catalog, so the MCP route to it does not exist. Its Figma path runs through the Builder.io plugin instead: export the frame from Figma with the plugin, open the result in Lovable, continue in prompts from there.
This is a genuinely different kind of handoff and it behaves differently. It is a one-time conversion rather than a live connection — the agent is not fetching the current design at the moment it writes code, it is starting from a snapshot. Change the design afterwards and nothing propagates.
Auto Layout also stops being best practice and becomes load-bearing. The plugin infers structure from it, and a frame built with absolutely-positioned elements converts into absolutely-positioned output. The Figma guide covers file hygiene in more detail; on this route it is the difference between a usable result and a wall of coordinates.
Worth noting the other direction: Lovable and Replit are both connectors from Claude Design, so if the design originates there rather than in Figma, the shortest path into either is direct. The Claude Design guide covers it.
The always-on file, and why it differs
Every one of these agents also reads an instructions file at the start of a session, and the mechanics differ enough to matter for design rules specifically.
Claude Code reads CLAUDE.md and loads it in full, every session. Anthropic's guidance is to keep it under 200 lines, because longer files consume more context and reduce adherence. It does not read AGENTS.md, though a one-line @AGENTS.md import makes both tools read the same file.
Cursor reads .mdc files in .cursor/rules, with four activation modes — always, agent-decides, glob-matched, and manual. The glob-matched mode is the interesting one and the one that disappoints for design: scoping a rule to src/api/** works beautifully, but design applies to anything that renders, so the narrowest honest glob is "all UI". Cursor also reads AGENTS.md.
Codex and the rest read AGENTS.md, the open format supported by more than twenty agents, at the repository root with nested files resolved closest-first in a monorepo.
One case has no design-tool route at all, whichever agent you pick: Adobe XD stopped receiving feature work before MCP existed, so the choice of agent is irrelevant there and the question becomes which tool to migrate to.
The common property is the one that matters: all of it is context, not configuration. Every agent here reads these files and usually follows them. None of them enforces anything. If a rule must hold regardless of what the model decides, it needs a lint rule, a test or a hook — not a better-worded paragraph. Where design rules belong works through what survives in these files and what does not.
What none of them do
Line the five up and the differences are real but narrow: where a config file sits, whether it is committed, which servers are permitted.
What they have in common is larger. None of them carries your design decisions between sessions, and none of them carries them between repositories. The design-tool server supplies the geometry of one screen. The instructions file supplies whatever short list somebody remembered to paste. Everything else — which face owns which size, what the accent is allowed to touch, the spacing scale, who the copy is addressed to, the four things you would never ship — lives in a chat log from three weeks ago, or in somebody's head.
That is why the second repository is where teams notice this. The first one works because the person who made the decisions is sitting there. The second gets a paragraph copied from the first, which drifts, and now two projects disagree in ways nobody decided — the mechanism behind why every vibe-coded app looks the same.
The fix is not a better agent. It is one record, read at the moment of use rather than pasted per session, and reachable by whichever of these five a given person happens to be using. A few properties are worth insisting on in anything holding it, and which moodspec's endpoint enforces: it is read-only, so a leaked token exposes taste rather than write access; the token is scoped to one canvas rather than an account, so revoking it affects one repository; and an agent can only ever propose a change through propose_change, which a person approves. The docs are one block of config, and there are setup guides for Claude Code, Cursor and the rest.
The test
Open the same prompt in two of these agents — build a settings page for this product — with no design context beyond what each already has.
Put the two results side by side. If they look like the same product, something durable is reaching both. If they look like two competent products, then what you have been calling your design system is a description you happen to give well in one tool and not the other, and the agent was never the variable.
Further reading
- Figma MCP Catalog — the definitive list of clients permitted to connect
- AGENTS.md — the open instructions format and which agents read it
- How Claude remembers your project — CLAUDE.md loading, size and adherence
- Cursor rules — the four rule types and when each loads
Common questions
- Which coding agents can connect to Figma's MCP server?
- Only clients listed in the Figma MCP Catalog. Claude Code, Codex, Cursor, VS Code, Replit, Zed, Devin, GitHub Copilot CLI and Warp are among them. Lovable is not.
- How does Lovable get a Figma design then?
- Through the Builder.io plugin. You export the frame from Figma with the plugin and open the result in Lovable, then continue in prompts. Auto Layout matters more on this route than on any other, because the plugin infers structure from it.
- Where does each agent store its MCP configuration?
- Claude Code registers servers via claude mcp add or its settings file; Cursor reads .cursor/mcp.json at the repository root; Codex uses an [mcp_servers.*] block in ~/.codex/config.toml; Replit configures them in .replit; Lovable takes a URL and token in its Settings interface.
- Which configuration travels with the repository?
- Cursor's .cursor/mcp.json and Replit's .replit are committed, so everyone on the repository gets the same servers. Codex's config is user-level and follows the person instead. That difference decides whether a new teammate is set up automatically or has to be told.
- Does any of them enforce a design system?
- No. Every one of them treats design context as context rather than configuration — the agent reads it and usually follows it. Anything that must hold regardless needs a lint rule, a test or a hook, not a prompt.
Keep reading
Design handoff
Adobe XD to a coding agent: getting out of a frozen tool
XD has not been sold since 2023 and has had no new features since. This is not a handoff guide. It is about extracting what matters while the file still opens.
Design handoff
Canva to a coding agent: the export path, not the MCP server
Canva has an MCP server and it is not the one you want. The route that works runs through the Connect API's HTML export — and produces something an agent has to be told how to read.
Design handoff
Claude Design to Claude Code: the handoff bundle explained
The tightest design-to-code path shipping today, because both ends are the same model. That closeness solves the translation problem and leaves a different one untouched.