# io.github.antonkarliner/truepane (npm · truepane-mcp)

Local MCP server generating complete App Store & Google Play screenshot sets.

- Trust score: 68/100 (medium)
- Change this week: +24
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `truepane-mcp`: 68/100 (this document), [markdown](https://verifymcp.io/servers/antonkarliner-truepane/truepane-mcp.md), [page](https://verifymcp.io/servers/antonkarliner-truepane/truepane-mcp)

## Channel facts

- Registry: `npm`
- Package: `truepane-mcp`
- Version: `0.1.10`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (106 of 110), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (106 of 110), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (AGPL-3.0-only).
  - Actively maintained (last published 3 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 68/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2783 tokens (~154/item across 18 items; 18 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 98/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 95% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add antonkarliner-truepane -- npx -y truepane-mcp
```

### Codex

```bash
codex mcp add antonkarliner-truepane -- npx -y truepane-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "antonkarliner-truepane": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "truepane-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add antonkarliner-truepane --command npx --arg -y --arg truepane-mcp
```

### Hermes

```yaml
mcp_servers:
  antonkarliner-truepane:
    command: "npx"
    args: ["-y", "truepane-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "antonkarliner-truepane": {
      "command": "npx",
      "args": [
        "-y",
        "truepane-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-02 (score 67, +48)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] License: unverified → pass
- [functional] Licence: AGPL-3.0-only

### 2026-08-01 (score 19, −7)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-31 (score 26, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-27 (score 44)

First indexed and scored.

## MCP tools (18)

### `list_options` (~59 tokens)

List capabilities and style options

Start here. Lists Truepane's complete agent workflow and every valid platform, output, font, background, and composition option, including bulk import, multi-target sets, linked devices, preflight, brand kits, custom outputs, and changed-only release exports.

### `create_project` (~243 tokens)

Create a screenshot project

Create a named in-memory project from slide texts and local screenshot files. Platforms: "ios" (App Store · 6.9″ iPhone, 1320x2868px), "ipad" (App Store · 13″ iPad, 2064x2752px), "android" (Play Store · Pixel portrait, 1080x2400px), "android-tablet" (Play Store · 10″ tablet, 1600x2560px). Screenshots are read from absolute local paths (PNG/JPEG/WebP), ideally raw device/simulator captures matching the device screen aspect; they are scaled to fill the device screen and center-cropped. Slides without a screenshot render a placeholder. After creating, style with set_style, then call render.

Input parameters:

- `id` (string): Project id (slug). Auto-generated if omitted.
- `platform` (string): Device frame. One of: ios, ipad, android, android-tablet. Default "ios".
- `slides` (array, required): Slides in order (1-8 typical)
- `targets` (array): Platform targets included in the project. The first is active.

### `set_slides` (~84 tokens)

Replace slide texts

Replace the project's slide list (full-array replace — send ALL slides in final order). Each slide keeps its existing screenshot by position unless a screenshot_path is given for it; use set_screenshots to change images only. Reorder/add/remove by sending the array you want.

Input parameters:

- `project_id` (string, required): Project id from create_project
- `slides` (array, required)

### `set_screenshots` (~173 tokens)

Attach screenshots to slides

Attach or replace screenshots on existing slides by 0-based index, from absolute local file paths (PNG/JPEG/WebP). Images are scaled to fill the device screen and center-cropped; aspect mismatches are reported as warnings, not errors. Pass language (a locale code, e.g. "ar") to set a screenshot for just that locale instead of the base slide — useful when your app UI is itself localized, so each language renders its own screenshot. A locale screenshot with no translated text still falls back to the base title/subhead; the locale is added to settings.languages so render language:"all" includes it. Omit language to set the base screenshot (used by every locale that has none of its own).

Input parameters:

- `project_id` (string, required): Project id
- `screenshots` (array, required)

### `import_screenshots` (~118 tokens)

Preview or apply a screenshot folder

Deterministically map a local screenshot directory to target/locale/slide slots. Defaults to a read-only dry run. Files named target/locale/NN-name.png map explicitly; otherwise known dimensions and filename tokens are used. Conflicts are reported and never overwritten.

Input parameters:

- `apply` (boolean): Must be true to apply non-conflicting mappings
- `directory` (string, required): Absolute directory containing PNG/JPEG/WebP screenshots
- `dry_run` (boolean): Preview only (default true)
- `project_id` (string, required): Project id

### `span_device_across_slides` (~75 tokens)

Span a device across two slides

Place one identical device across the boundary between an adjacent slide pair. The left slide exports the left half and the next slide exports the right half; their text and backgrounds remain independent.

Input parameters:

- `left_slide_index` (integer, required): 0-based index of the first slide
- `project_id` (string, required): Project id

### `set_style` (~503 tokens)

Set typography, colors, background

Patch project style. Without slide_index, patches global settings: fontFamily (see list_options), titleColor/subheadColor (CSS colors), titleScale/subtitleScale (multipliers, ~0.5-1.5), titleWeight/subtitleWeight (font weight 100..900; default 700/400), platform (ios | ipad | android | android-tablet), and background — a partial patch merged onto the current background. Background fields: fill (solid|linear|radial), shape (see list_options), color, gradientColor, accent, accentOpacity (0..1), ringLayout, ringCount (1..8), seed, density (1..8), dotsAligned, gradientAngle. Composition supports a preset plus normalized text/device placement, scale, and flat rotation (-20..20). With slide_index (0-based), background/titleColor/subheadColor/composition apply as per-slide overrides instead (other fields are global-only and rejected). With language (a locale code, e.g. "ar"), fontFamily sets that locale's font override — used only when rendering that language, while the base keeps the global font (pass only fontFamily). Re-render after changes to see the result.

Input parameters:

- `background` (object): Partial background patch
- `composition` (object): Composition preset and optional text/device placement. Device x/y are normalized canvas coordinates; rotation is -20..20 degrees.
- `fontFamily` (string): Font id from list_options (global only)
- `language` (string): If set (a locale code, e.g. "ar"), fontFamily becomes that language's font override
- `platform` (string): Switch device frame (global only)
- `project_id` (string, required): Project id
- `slide_index` (integer): If set, apply background/titleColor/subheadColor to this slide only
- `subheadColor` (string): Subhead color, e.g. rgba(26,22,18,0.62)
- `subtitleScale` (number): Subhead size multiplier (global only)
- `subtitleWeight` (integer): Subhead font weight 100..900, default 400 (global only)
- `titleColor` (string): Title color, e.g. #1a1612
- `titleScale` (number): Title size multiplier (global only)
- `titleWeight` (integer): Title font weight 100..900, default 700 (global only)

### `apply_brand_kit` (~99 tokens)

Apply a brand kit file

Apply typography, text colors, background, and default composition from a local .truepane-brand.json file. Targets, slides, screenshots, translations, and release data are preserved. Per-slide overrides are preserved by default.

Input parameters:

- `clear_slide_overrides` (boolean): Explicitly clear per-slide style/composition overrides
- `path` (string, required): Absolute path to a .truepane-brand.json file
- `project_id` (string, required): Project id

### `export_brand_kit` (~73 tokens)

Export a brand kit file

Write this project's current typography, colors, background, custom font, and default composition to a portable brand kit file.

Input parameters:

- `name` (string): Brand kit display name
- `path` (string, required): Absolute output path, conventionally ending .truepane-brand.json
- `project_id` (string, required): Project id

### `set_output` (~93 tokens)

Set output canvas

Choose a native store screenshot, the 1024x500 Google Play feature graphic, or bounded custom dimensions. The device frame remains procedural and is never stretched.

Input parameters:

- `frame` (string): Device frame/source target
- `height` (number): Custom height
- `output_id` (string, required): Built-in output id or custom
- `project_id` (string, required): Project id
- `width` (number): Custom width

### `validate_project` (~44 tokens)

Run release preflight

Return the same ordered release-preflight issues shown by the web editor. Validation is advisory; stable issue codes are suitable for automation.

Input parameters:

- `project_id` (string, required): Project id

### `compare_release` (~51 tokens)

Compare with release baseline

Compare deterministic slide/output/locale signatures with the explicit saved release baseline. Returns added, changed, unchanged, and removed assets without rendering PNGs or changing the baseline.

Input parameters:

- `project_id` (string, required): Project id

### `set_release_baseline` (~49 tokens)

Set release baseline

Explicitly replace the project's release baseline with deterministic signatures for the current assets. Previewing, importing, validating, and rendering never call this automatically.

Input parameters:

- `project_id` (string, required): Project id

### `render` (~422 tokens)

Render PNGs to disk

Render the project to PNG files at full store resolution (e.g. ios = 1320x2868) and return the absolute output paths plus a small inline preview image of the first slide (or the strip) so you can inspect the result. what: "slides" writes slide-01.png, slide-02.png, …; "strip" writes strip.png (all slides side by side — backgrounds flow continuously across it); "both" writes both. Pass scale (e.g. 0.25) for smaller draft output. language: omit for the base text; a language code (e.g. "es") renders that translation (blank/missing fields fall back to base text); "all" writes per-language subfolders of output_dir — source/ plus one per settings.languages code, same layout as the web app's all-languages ZIP (add languages with set_translations first). Each language renders in its own font override when set (see set_translations font / set_style language), else the global font. Fonts are fetched/registered automatically before rendering. Iterate: render → look at preview → set_style → render again.

Input parameters:

- `changed_only` (boolean): Write only added/changed assets compared with the explicit release baseline
- `language` (string): Omit = base text; a language code = that translation; "all" = per-language subfolders
- `output_dir` (string, required): Absolute directory for the PNGs (created if missing)
- `output_frame` (string): Device frame for feature/custom output
- `output_height` (number): Custom output height
- `output_id` (string): Temporary output override for this render
- `output_width` (number): Custom output width
- `project_id` (string, required): Project id
- `scale` (number): Downscale factor for draft output (default 1 = full store resolution)
- `target`: Platform target. Omit = active target; "all" = every settings.targets target.
- `what` (string): What to render. Default "slides".

### `export_project` (~86 tokens)

Save project JSON

Write the project as JSON to an absolute path. The file is the exact format the Truepane web app's Import Project accepts (screenshots embedded as data URLs), so a human can open and fine-tune it later.

Input parameters:

- `path` (string, required): Absolute output path, e.g. /tmp/my-app/truepane-project.json
- `project_id` (string, required): Project id

### `load_project` (~89 tokens)

Load project JSON

Load a Truepane project JSON file (from export_project or the web app's Export Project) into memory as a new project. Returns the project id and a summary. Screenshots embedded in the file are restored.

Input parameters:

- `id` (string): Project id to assign (auto-generated if omitted; replaces any existing project with this id)
- `path` (string, required): Absolute path to the project JSON file

### `suggest_palette_from_screenshot` (~157 tokens)

Extract a palette from a screenshot

Extract a color palette from a screenshot: the dominant vivid color as the shape/accent color plus a soft near-white tint of it as the background color (same algorithm as the web app's palette button). Point it at a project slide (project_id + slide_index) or any local image file (image_path). Purely local math — no AI, no network. Apply the result with set_style.

Input parameters:

- `image_path` (string): Absolute path to an image file (instead of project_id/slide_index)
- `project_id` (string): Project id (with slide_index)
- `slide_index` (integer): 0-based slide whose screenshot to sample
- `target` (string): Platform target; defaults to active

### `set_translations` (~365 tokens)

Store slide translations

Store per-language translations of the slide texts. You are a language model: translate the slide titles/subheads YOURSELF — preserve the marketing tone and keep lengths similar to the source (titles wrap to ~2 lines on the slide) — then call this with the results. Each entry: code (folder/storage key, e.g. "es", "pt-BR"), name (human label, e.g. "Spanish"), and slides aligned 1:1 with the project's slides (same count, same order). An empty title/subhead falls back to the base text at render time. Translations are stored on the slides (slide.translations) and the languages merged into settings.languages, exactly like the web app — so the project round-trips through export_project. Then render with language:"all" for per-language folders (or one code to inspect a single language). Each slide entry may also include screenshot_path to give that locale its own screenshot (for apps whose UI is itself localized — e.g. an Arabic build); omit it and the locale reuses the base screenshot. You can also set locale screenshots separately with set_screenshots (pass language). For non-Latin scripts set a per-language font (the entry's font, or set_style with language) so this locale renders in a covering font while the base keeps the global one — Inter covers Cyrillic/Greek, Noto Sans JP/KR/SC cover CJK, "Noto Sans Arabic" covers Arabic). Arabic is shaped and laid out right-to-left automatically. Server-side rendering has no per-glyph system-font fallback, so glyphs a font lacks come out as boxes; always inspect the render preview.

Input parameters:

- `project_id` (string, required): Project id
- `translations` (array, required)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/antonkarliner-truepane/truepane-mcp#diagnostics

## Score history

- 2026-08-03: 68
- 2026-08-02: 67
- 2026-08-01: 19
- 2026-07-31: 26
- 2026-07-30: 44
- 2026-07-28: 44
- 2026-07-27: 44

## Links

- npm package: https://www.npmjs.com/package/truepane-mcp
- Socket report: https://socket.dev/npm/package/truepane-mcp
- Repository: https://github.com/antonkarliner/truepane
- Website: https://truepane.dev/
- Changelog RSS feed: https://verifymcp.io/servers/antonkarliner-truepane/truepane-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/antonkarliner-truepane/truepane-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/antonkarliner-truepane/truepane-mcp
