Figma Context MCP
Give your coding agent access to your Figma data. Implement designs in any framework in one-shot.
Description from the maker (original English)
Android framework and solution that prevents TransactionTooLargeException crashes by design.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"shuttle": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/grarcht/shuttle-mcp:4.0.0"
]
}
}
}Run this in your terminal
claude mcp add shuttle -- docker run -i --rm ghcr.io/grarcht/shuttle-mcp:4.0.0Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"shuttle": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/grarcht/shuttle-mcp:4.0.0"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"shuttle": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/grarcht/shuttle-mcp:4.0.0"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 6, 2026
The registry name was verified with the GitHub account grarcht, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (4.0.0) reached the registry 3 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Docker on your computer.
In the same category: Figma Context MCP, Claude Real Video, Figma MCP Server
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Give your coding agent access to your Figma data. Implement designs in any framework in one-shot.
Let any LLM watch a video locally — and search everything it has ever watched.
Figma’s official server gives AI your design data so it can turn designs into code or describe them accurately. Connects to Figma’s cloud.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
Prevent TransactionTooLargeException crashes. For good. A modern Android framework for safely transporting large Serializable objects between components, without the crashes.
🗞️ Featured in [Android Weekly #594](https://androidweekly.net/issues/issue-594) and [Android Weekly #455](https://androidweekly.net/issues/issue-455), validated by the Android community twice.
You've seen this before. Maybe last week:
android.os.TransactionTooLargeException: data parcel size X bytes
It didn't show up in dev. It didn't show up in QA. It showed up at 2am, in production, for real users. Your Play Store rating took the hit before anyone on the team even knew.
So you triaged it. Filed the ticket. Wrote the fix. Reviewed the PR. Ran QA again. Cut the hotfix. And then you added it to the code review checklist, hoping the next engineer would catch it before it happened again.
They won't. Not reliably. You can't review your way out of a structural problem.
Shuttle provides a modern, guarded way to pass large Serializable objects with Intent objects or save them in Bundle objects to avoid app crashes. The crash class is structurally prevented, not governed against.
Why keep spending more time and money on governance through code reviews? Why not embrace the problem by providing a solution for it?
Shuttle reduces the high level of governance needed to catch `TransactionTooLargeException` inducing code by:
Serializable and passing an identifier for the SerializableBundle for binder transactionsTransactionTooLargeExceptionsSerializable at the destinationShuttle also excels by:
When envisioning, designing, and creating the architecture, quality attributes and best practices were kept in mind. These attributes include usability, readability, recognizability, reusability, maintainability, and more.
| Without Shuttle | With Shuttle |
|---|---|
Large Serializable passed in Intent/Bundle | Object stored in a warehouse; only a small identifier is passed |
| Silent in dev, catastrophic in production | Binder transaction stays within safe size limits, everywhere |
| Time and money spent on crash investigation, fixes, QA, and hotfixes | Crash class is structurally impossible |
| Requires constant code review governance | Ship with confidence |
| Engineers manually manage object lifecycles | Automatic or on-demand cargo cleanup built in |
The Shuttle framework takes its name from cargo transportation in the freight industry. Moving and storage companies experience scenarios where large moving trucks cannot transport cargo the entire way to the destination (warehouses, houses, et cetera). These scenarios might occur from road restrictions, trucks being overweight from large cargo, and more. As a result, companies use small Shuttle vans to transport smaller cargo groups on multiple trips to deliver the entire shipment.
After the delivery is complete, employees remove the cargo remnants from the shuttle vans and trucks. This clean-up task is one of the last steps for the job.
The Shuttle framework takes its roots in these scenarios:
Shuttle applies this same logic to Android's binder transaction limit:
┌─────────────────────────────────────────────────────────────┐
│ Source Component │ │ 1. Large Serializable -> stored in Warehouse (Room/DB) │ │ 2. Small cargo ID -> passed in Intent/Bundle │ └──────────────────────────────┬──────────────────────────────┘ │ (tiny binder transaction) ┌──────────────────────────────▼──────────────────────────────┐ │ Destination Component │ │ 3. Cargo ID received -> retrieved from Warehouse │ │ 4. Large Serializable -> delivered via Kotlin Channel │ │ 5. Cleanup -> cargo removed from Warehouse automatically │ └─────────────────────────────────────────────────────────────┘
| Requirement | Minimum |
|---|---|
| Android min SDK | 26 |
| Kotlin | 2.2.10 |
| AGP (Android Gradle Plugin) | 8.0+ |
| KSP | Required only when using @ShuttleCargo |
| Java | 21 |
`settings.gradle.kts` — apply the Shuttle Gradle plugin so the @ShuttleCargo annotation processor is wired into your build:
@ShuttleCargo annotates the cargo class you want to transport between screens. At build time, the annotation processor generates the serialization code Shuttle needs to store and retrieve cargo, without any manual Serializable boilerplate.
pluginManagement {
plugins { id("com.grarcht.shuttle.cargo") version "4.0.0" } }
The Shuttle Cargo Gradle plugin configures KSP and registers the Shuttle compiler plugin automatically. Without it, @ShuttleCargo-annotated classes will not generate the required serialization glue code.
`build.gradle.kts`:
plugins {
id("com.grarcht.shuttle.cargo") }
dependencies { implementation(platform("com.grarcht.shuttle:shuttle-bom:4.0.0")) implementation("com.grarcht.shuttle:framework") implementation("com.grarcht.shuttle:framework-integrations-persistence") implementation("com.grarcht.shuttle:framework-integrations-extensions-room") implementation("com.grarcht.shuttle:framework-addons-navigation-component") // Optional
// Annotation-based API — use @ShuttleCargo to own the serialization contract implementation("com.grarcht.shuttle:framework-annotations") ksp("com.grarcht.shuttle:framework-annotations-processor") }
Version Catalog (`libs.versions.toml`):
[versions]
shuttle = "4.0.0"
[plugins] shuttle-cargo = { id = "com.grarcht.shuttle.cargo", version.ref = "shuttle" }
[libraries] shuttle-bom = { group = "com.grarcht.shuttle", name = "shuttle-bom", version.ref = "shuttle" } shuttle-framework = { group = "com.grarcht.shuttle", name = "framework" } shuttle-persistence = { group = "com.grarcht.shuttle", name = "framework-integrations-persistence" } shuttle-room = { group = "com.grarcht.shuttle", name = "framework-integrations-extensions-room" } shuttle-navigation = { group = "com.grarcht.shuttle", name = "framework-addons-navigation-component" } shuttle-annotations = { group = "com.grarcht.shuttle", name = "framework-annotations" } shuttle-annotations-processor = { group = "com.grarcht.shuttle", name = "framework-annotations-processor" }
Wire CargoShuttle once as a singleton. With Hilt:
@Provides @Singleton
fun provideShuttle(facade: ShuttleFacade, warehouse: ShuttleWarehouse): Shuttle = CargoShuttle(facade, warehouse)
@Provides @Singleton fun provideShuttleFacade( @ApplicationContext context: Context, warehouse: ShuttleWarehouse ): ShuttleFacade = ShuttleCargoFacade(context as Application, warehouse)
@Provides @Singleton fun provideShuttleWarehouse( dao: ShuttleDataAccessObject, factory: ShuttleDataModelFactory, @ApplicationContext context: Context, gateway: ShuttleFileSystemGateway ): ShuttleWarehouse = ShuttleRepository(dao, factory, context.filesDir.absolutePath, gateway)
The ShuttleDataAccessObject comes from ShuttleRoomDataDb.getInstance(ShuttleRoomDbConfig(context)).shuttleDataAccessObject. Inject Shuttle wherever you need to transport data.
// Source: transport a large Serializable via Intent
shuttle.intentCargoWith(context, DestinationActivity::class.java) .transport(cargoId, myLargeSerializable) .cleanShuttleOnReturnTo(SourceFragment::class.java, DestinationActivity::class.java, cargoId) .deliver(context)
// Destination: pick up the cargo
lifecycleScope.launch { getShuttleChannel() .consumeAsFlow() .collectLatest { result -> when (result) { is ShuttlePickupCargoResult.Success<*> -> render(result.data as MyModel) is ShuttlePickupCargoResult.Error<*
Only the beginning is shown; read the rest in the repo