pebble-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PEBBLE_API_TOKEN | No | Optional API token for authenticated operations (Tier 4). Required for token-gated, network-mutating operations. If not set, Tier 4 tools are not available. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| capabilitiesA | Report which pebble-mcp capability tiers are available in this environment. tier1_appstore is always true (pure HTTPS). tier2_design requires Pillow.
tier3_devloop requires the |
| store_appA | Full metadata for one appstore app or watchface by its id. Returns hearts, author, description, the list of compatible hardware
platforms (with a |
| store_collectionA | List a named store collection, paginated, as compact summaries.
|
| store_categoryA | List apps in a store category (e.g. |
| store_developerA | List every app published by one developer, paginated, as compact
id/title/type/author/hearts summaries with a |
| store_searchA | Search the store by keyword — CLIENT-SIDE, with real limits. The live appstore API has NO search endpoint, so this does not do a
true full-text search. Instead it fetches a bounded candidate pool
from the relevant store listings (the Consequences to keep in mind:
|
| store_compareA | Bulk-fetch several apps by id and return a side-by-side comparison table for competitive research.
|
| store_download_pbwA | Download an app's latest-release Creates |
| image_quantizeA | Quantize an image to the Pebble 64-color palette; return stats + preview. Args:
source: a filesystem path, a base64 string, or a Returns a stats object (colors used, per-pixel distance) plus the quantized preview image (2× nearest-neighbor upscale when small). |
| image_prepA | Resize/letterbox an image to a named target, quantize, and preview it. Args:
source: filesystem path, base64, or Returns a stats object (target size, colors used, distance) plus the prepared preview image (2× nearest-neighbor upscale when small). |
| color_nearestA | Nearest of the 64 Pebble GColors to an arbitrary color. Args:
color: a hex string ( Returns the matched GColor name, hex, C constant, packed ARGB8 byte, sunlight-corrected display hex, and sRGB distance to the input. |
| palette_swatchA | Render a labeled grid of color swatches to a PNG for eyeballing. Args:
colors: hex strings and/or |
| font_planA | Recommend Pebble system fonts for a UI role or a literal string. Pass a role like Pass literal text instead (e.g.
Zero-argument sharp edge: this never touches the network or a toolchain -- it's pure lookup, always available regardless of capability tier. |
| pdc_convertA | Convert an SVG icon/vector to a Pebble Draw Command (.pdc) file. Validates PDC's known constraints before attempting conversion, so a bad SVG comes back as a structured violation list -- never a broken or silently-wrong .pdc. Supported SVG elements: g, layer, path (straight-line commands M/L/H/V/Z only -- flatten curves first), rect, polyline, polygon, line, circle. Not supported: gradients, masks, clip paths, filters, embedded text/images, and any transform other than translate(x, y). On success, returns the .pdc file as base64 ( Next move on failure: fix the listed elements/attributes in the SVG (flatten curves to polylines, remove gradients/masks, replace text with outlined paths) and call again -- this tool never guesses at a lossy conversion. |
| flow_runA | Run a gallery-style flow spec against the emery emulator and return every screenshot. Parses Returns a JSON metadata block — flow name, out_dir, per-shot
{app, name, path, duration_s}, plus Refuses any flow requesting more than 40 shots (runaway guard). SAFETY — live-write hazard. flow_run drives REAL apps that can fire REAL
network POSTs. A flow against an app with server-mutating screens must
NEVER confirm a live-send action (e.g. |
| flow_validateA | Parse a flow spec WITHOUT running it — a cheap pre-check. Returns a step summary (step_count, shot_count, steps_by_type, and whether it exceeds the 40-shot flow_run cap) on success, or a clear parse error naming the offending 1-based line. Needs no emulator, so it is the right tool to validate a flow before spending an emulator run. |
| emu_screenshotA | Capture one screenshot of the running emery emulator as an image. Optional |
| emu_inputA | Send one input to the running emulator.
|
| emu_logsA | Capture emulator logs, bounded — never a firehose. Streams |
| pebble_buildA | Build a Pebble app project and return structured results. Runs |
| pebble_installA | Install an app into the emulator, starting it if needed. target is either a project directory (built first if needed) or a
path to a prebuilt .pbw file; relative paths resolve against the
workspace root. The emulator is killed and wiped first — the
reliable-launch lesson — so expect a few seconds of startup.
Requires the |
| emu_startA | Boot the Pebble emulator for the given platform (default emery). Idempotent-ish: if one is already running this reconnects/restarts.
Requires the |
| emu_stopA | Shut down the running emulator; wipe=True also clears its storage. Wiping is the fix for most emulator flakiness (apps not launching,
stale state). Requires the |
| project_newA | Scaffold a new, immediately buildable Pebble project. Writes the files directly (pure Python -- no
Returns |
| project_infoA | Summarize an existing Pebble project from its Returns |
| project_add_resourceA | Add a resource to a project and register it in Copies |
| project_set_metaA | Edit a project's
|
| design_reviewA | Critique a Pebble screenshot against the design system. Analyzes one screenshot and returns an actionable, compact critique:
palette adherence (what fraction of pixels are exact GColors, and the
most-common off-palette colors with their nearest GColor), per-region
contrast/legibility judged against the sunlight-corrected display values
(the reflective LCD reads duller than sRGB), role guidance vs the
This is a heuristic, not a human designer: it reasons about color statistics, never glyphs — it flags pairs that look illegible and colors that are off-palette or role-inappropriate; confirm the hero-value hierarchy by eye. Returns a JSON critique block plus the analyzed image. |
| project_smoke_testA | Build, install, and screenshot a project — the one-call "does it run?". Builds A failed build returns built=false with the compiler errors and skips
install — so this is also the fastest "did my change compile" check.
Requires the |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| platforms | Per-platform Pebble display specs (emery, basalt, chalk, diorite). |
| colors | The 64-color Pebble palette table plus our house role guidance. |
| fonts | System font keys/sizes/usage guidance distilled from DESIGN.md. |
| wire_conventions | The reusable delimited wire-string pattern for a Pebble companion protocol. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dbonomo/pebble-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server