Skip to main content
Glama
README.md
# cdeck-mcp

The Claude side of **[CDeck](https://github.com/SuperAngryMonkey/CDeck)**, an Apple TV dashboard that your own Claude keeps up to date.

No accounts. The 6-character code on your TV is the account.

## Setup (three steps)

1. Install **CDeck** on your Apple TV. It shows a code.
2. Add this MCP to Claude (Claude Desktop → Settings → Connectors → Add, or in `claude_desktop_config.json`):
   ```json
   { "mcpServers": { "cdeck": { "command": "uvx", "args": ["cdeck-mcp"] } } }
   ```
3. Tell Claude: **"Pair my Command Deck, code ABC123."**

Claude calls `cdeck_pair`, reads `cdeck_schema`, looks at whatever connectors *you* have (Gmail, Outlook, Planner, Fathom, Linear, …), builds a deck, pushes it, and sets up a recurring scheduled task to keep it fresh. The TV polls the feed on the interval the deck asks for.

## Tools

| tool | does |
|---|---|
| `cdeck_pair(code, name="tv")` | claim the code on the TV |
| `cdeck_schema()` | deck format + how to compose a good one |
| `cdeck_push(deck, name=None)` | replace what the TV shows |
| `cdeck_status(name=None)` | last update + items you checked off on the TV |
| `cdeck_list()` | paired TVs |
| `cdeck_unpair(name)` | forget a TV |

## Deck format (v1)

```json
{"v":1,"updated":"2026-10-29T20:00:00Z","title":"Command Deck","subtitle":"Jane · Acme",
 "refresh_seconds":1200,
 "sections":[
   {"type":"stats","items":[{"n":"3","label":"Open action items","sub":"1 overdue","kind":"hot"}]},
   {"type":"list","title":"YOUR ACTION ITEMS","width":0.6,
    "groups":[{"title":"Weekly sync · Oct 29","items":[{"id":"fathom:123","text":"Send the proposal"}]}]},
   {"type":"list","title":"INBOX — NEEDS REPLY",
    "items":[{"id":"mail:abc","tag":"HOT","kind":"hot","text":"Invoice question","meta":"Jane · 2h ago"}]},
   {"type":"calendar","title":"TODAY","items":[{"time":"2:00 PM","text":"Vendor call","meta":"Zoom"}]},
   {"type":"text","title":"NOTES","text":"Anything else worth a glance."}
 ]}
```

`stats` renders as a tile row; every other section becomes a column. Items with an `id` get a checkbox on the TV; checked ids come back in `cdeck_status()` so Claude can complete them at the source.

## Self-hosting

The service is a single Cloudflare Worker + KV namespace (`api/` in the [CDeck repo](https://github.com/SuperAngryMonkey/CDeck)). Deploy it, set `CDECK_SERVER`, and rebuild the TV app with your URL in `project.yml`.

## Privacy

The hosted service stores: a random device token, a random push token, and the last deck JSON your Claude pushed. Nothing else. `cdeck_unpair` deletes all of it.

MIT · 800 Pound Gorilla Inc.

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct action in the pairing/deck lifecycle: pair, list, unpair, push, status, and schema. The only potentially adjacent tools, cdeck_list and cdeck_status, are clearly separated as listing paired TVs versus inspecting deck update state and acks.

Naming Consistency5/5

All tool names use the same cdeck_ prefix and snake_case convention. The suffixes are concise and consistently readable, even when mixing verbs (pair, push, list) and noun-like tools (schema, status).

Tool Count5/5

Six tools is well-scoped for this server: pairing lifecycle, schema guidance, push, and status. No tool appears redundant or out of place.

Completeness4/5

The surface covers the core workflow: schema discovery, pairing, listing, unpairing, pushing a deck, and checking acks/status. A minor gap is the absence of a direct tool to read back the current deck, though status plus source-side ack handling may be sufficient for the intended workflow.

Maintenance

ActivityMaintained
ResponsivenessNo issues