Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Shuttle

by grarchtversion 4.0.0i★ –iRuns on your computer
Registry nameio.github.grarcht/shuttle

Install

Overview

Description from the maker (original English)

Android framework and solution that prevents TransactionTooLargeException crashes by design.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Design, images & audio

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • The registry lists no key to fill in.

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.0

Open in Cursor

Or copy the settings yourself

Paste 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.

Open in VS Code

Or copy the settings yourself

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.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

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

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account grarcht, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Design, images & audioi

  • More stars than 0% of the other 2177 servers in this category
  • Published to the registry more recently than 20% of the other 2177 servers in this category
  • Basic checks equal to or better than 100% of the other 2177 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Shuttle safe?

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.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

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).

Is it still maintained?

The GitHub repo last changed –, and the latest version (4.0.0) reached the registry 3 months ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Docker on your computer.

What can I use instead?

In the same category: Figma Context MCP, Claude Real Video, Figma MCP Server

Alternatives

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.

Runs on your computer★ 16,165MITUpdated 5 months ago
Install

Claude Real Video

by HUANGCHIHHUNGLeo

Let any LLM watch a video locally — and search everything it has ever watched.

Runs on your computer★ 2,284MITUpdated 2 months ago
Install

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.

Runs in the cloud★ 2,152Updated 13 months ago
Install

README from the maker

Open the README

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.


Get To It Quick

  • API Documentation
  • Why Shuttle?
  • How It Works
  • Requirements
  • Quick Start
  • Usage
  • Transport with Intents
  • Transport with the Navigation Component
  • Pick Up Cargo at the Destination
  • Cargo States (LCE Pattern)
  • Using @ShuttleCargo
  • Cleaning Up
  • Architecture
  • Context Diagram
  • Module Overview
  • Module Dependency Diagram
  • Demo Apps
  • Heads Up: Know the Tradeoffs
  • AI
  • Model Context Protocol (MCP)
  • Contributing
  • License

🚨 Why Shuttle?

🗞️ 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:

  1. storing the Serializable and passing an identifier for the Serializable
  2. using a small-sized Bundle for binder transactions
  3. avoiding app crashes from TransactionTooLargeExceptions
  4. enabling retrieval of the stored Serializable at the destination

Shuttle also excels by:

  1. providing a solution with maven artifacts
  2. providing Solution Building Blocks (SBBs) for building on
  3. saving time by avoiding DB and table setup, especially when creating many tables for the content of different types of objects

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 ShuttleWith Shuttle
Large Serializable passed in Intent/BundleObject stored in a warehouse; only a small identifier is passed
Silent in dev, catastrophic in productionBinder transaction stays within safe size limits, everywhere
Time and money spent on crash investigation, fixes, QA, and hotfixesCrash class is structurally impossible
Requires constant code review governanceShip with confidence
Engineers manually manage object lifecyclesAutomatic or on-demand cargo cleanup built in

⚙️ How It Works

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:

  • creating a smaller cargo bundle object to use in successfully delivering the data to the destination
  • shuttling the corresponding large cargo to a warehouse and storing it for pickup
  • linking the smaller cargo with the larger cargo by an identifier
  • providing a single source of truth (Shuttle interface) to use for transporting cargo
  • providing convenience functions to remove cargo (automatically or on-demand)

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 │ └─────────────────────────────────────────────────────────────┘


Requirements

RequirementMinimum
Android min SDK26
Kotlin2.2.10
AGP (Android Gradle Plugin)8.0+
KSPRequired only when using @ShuttleCargo
Java21

🚀 Quick Start

1. Add Dependencies

`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" }

2. Initialize Shuttle

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.

3. Ship Your First Cargo
// 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

Ask PopNx