CTDS EZCapsule
The arithmetic behind EZCapsule, offered to AI assistants as 7 tools over the Model Context Protocol.
The EZCapsule capsule wardrobe domain (Candidate #28): templates, the gap engine, outfit counts, the starter list, the palette and cost per wear. Items and slots use the fixed ids from list_palette (categories, 17 colors, warm/cold seasons, casual/smart/formal); money is in integer cents. Results are general capsule guidance and arithmetic on what the user entered, not personal styling, fit or sizing advice; say so when giving gaps or counts. No stored wardrobe, capsule, photo or shopping list is reachable: the server is offline, so the user describes their items in the call.
Connect
The server is at https://ezcapsule.chimneytopdigital.com/api/mcp. It is free, asks for no sign-in and keeps nothing between calls. Rate limits apply per address.
| Client | How |
|---|---|
| Claude Code | One command in a terminal: |
| Claude (web and desktop apps) | Settings → Connectors → Add custom connector, with the URL https://ezcapsule.chimneytopdigital.com/api/mcp. No sign-in is asked for. |
| Codex CLI | One command in a terminal: |
| Any other MCP client | Use the Streamable HTTP transport with the URL https://ezcapsule.chimneytopdigital.com/api/mcp: one JSON-RPC message per POST, JSON answers, no session and no authentication. |
To see the raw protocol, list the tools and call one from a terminal:
curl -s https://ezcapsule.chimneytopdigital.com/api/mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
curl -s https://ezcapsule.chimneytopdigital.com/api/mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_templates","arguments":{}}}'Tools
Every tool is read-only and idempotent, so a client may run it without asking you first. Arguments are checked before a tool runs; a wrong one comes back as a message naming the field.
list_templatesList capsule templatesThe seven built-in capsule templates with id, version, name, audience, description, slot and position counts. Give template_id to get one template with its full slot list (category, color family, preferred color, seasons, formality, count, description).
template_id(minimal-30 | work-week | carry-on-travel-10 | warm-season | cold-season | mid-life-mothers | western-gen-z-adult): Template id; omit for the summary of all
list_palettePalette, categories, seasons and formality levelsThe fixed vocabulary items and slots use: the 17 palette colors with their family, display name and swatch hex; the color families with their member colors; the categories, season tags and formality levels with their labels. Use it to map a user's words ("dark blue trousers") onto the ids the other tools take.
starter_listStarter checklist of common piecesThe "I own..." starter checklist: 26 common pieces with a key, label, category and the item each becomes (category, color, seasons, formality, name). Give keys to get just the items for the ticked lines, ready to pass to assign_capsule; an unknown key is a tool error.
keys(array): Checklist keys ticked, for example ["white-tee", "dark-jeans"]
capsule_from_templateNew capsule from a templateA new capsule record as the app creates it from a template (CW-05): the template's slots copied, no not-needed marks, the given name cleaned and checked (1 to 60 characters). The id and timestamps are the caller's; nothing is stored.
template_id(minimal-30 | work-week | carry-on-travel-10 | warm-season | cold-season | mid-life-mothers | western-gen-z-adult, required): Template to copyname(string): Capsule name; defaults to the template namecapsule_id(string, default "capsule-1"): Id for the new recordnow(string): ISO 8601 timestamp for createdAt/updatedAt; defaults to the current time
assign_capsuleFill a capsule with owned items: gaps, substitutes, outfit countRuns the gap engine (CW-06) over the user's items and a template (or a custom slot list): which positions are filled exactly or by a color-family substitute, which are gaps, which are open but marked not needed, which items are surplus, a per-slot summary, and the outfit count (tops × bottoms + dresses) × shoes with the layering options (CW-07). Optimal, deterministic matching: the result never depends on item order.
items(array, required): The items the user ownstemplate_id(minimal-30 | work-week | carry-on-travel-10 | warm-season | cold-season | mid-life-mothers | western-gen-z-adult): Template whose slots to fill (or give slots)slots(array): Custom slot list instead of a template; checked with the app's slot rulesnot_needed_slot_ids(array, default []): Slot ids the user marked not needed (CW-11)include_positions(boolean, default false): Also return every filled and open position (long); the per-slot summary is always returned
count_outfitsOutfit count from filled positions per categoryThe outfit arithmetic alone (CW-07): outfits = (tops × bottoms + dresses) × shoes, with the shoe gap flagged when no shoes are filled and outerwear plus layers as layering options. Give gap_category to also get how many outfits one more item of that category would add.
filled(object, required): Filled positions per category; missing categories count as 0gap_category(tops | bottoms | dresses | outerwear | shoes | accessories | layers): Category of the gap to value
cost_per_wearCost per wearCost per wear in cents for an item (CW-13): the price paid over the wear count, an unworn item counting as one wear so the figure is the full price until first worn. Without a price the result says none is recorded. Also returns the app's display text and the dollar format.
price_paid_cents(integer): Price paid in whole cents; omit when no price is recordedwear_count(integer, default 0): Times worn
Resources
ctds://ezcapsule/notice: EZCapsule guidance notice. The app's own statement of what its guidance is; repeat it with gaps and outfit counts.
Limits
- The tools compute from the values the assistant passes in. They cannot read or change anything in your EZCapsule account; for that, use the app.
- Results carry the same notices the app shows. They are estimates and working aids, not professional advice; ask your assistant to show the notice with the figure.
- Rate limits apply per address. A request over the limit gets a plain error the assistant can read.
- The tool list may grow. This page is generated from the running server, so it shows the tools as they are today.
If something fails
- "Couldn't reach the MCP server", or a 404
- Check the address character by character: the server answers only at
https://ezcapsule.chimneytopdigital.com/api/mcp, over HTTPS. Nothing else on this host speaks MCP. - 405 Method Not Allowed
- The client sent a GET. The server speaks the Streamable HTTP transport without an event stream: one JSON-RPC message per POST, a JSON answer, no session. A notification gets an empty 202.
- 429 Too Many Requests
- Your address passed the fair-use limit. The
Retry-Afterheader says how many seconds to wait; the limit resets on its own. - 413 Payload Too Large
- One request may carry 256 KiB. Send fewer rows per call, or summarize before you send.
- A tool answers with an error naming a field
- The argument did not match the tool's schema above: money is integer cents (or plain dollars where the tool says so), dates are
YYYY-MM-DD, and lists are JSON arrays. Fix the named field and call again; nothing was stored. - Still stuck
- Write to support@chimneytopdigital.com with the tool name, the arguments you sent (with nothing personal in them), the time in UTC and the exact message. We keep no record of calls, so what you send us is all we can look at.
How we built the servers, and the rules every one follows: our guide. Questions: hello@chimneytopdigital.com.