Rhylthyme MCP Server
Allows importing protocols from protocols.io and converting them into validated schedule programs for execution.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Rhylthyme MCP Server Schedule a roast chicken dinner with one oven and two stove burners."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Rhylthyme MCP server
A Model Context Protocol server for schedules that a person executes: cooking several dishes so they finish together, running a bench protocol with overlapping incubations, calling an event, running a workout. An agent describes the process, the server validates and analyzes the resulting program, and publishes it as a live timeline on rhylthyme.com that the person follows on their phone.
This repository is the source of the server that runs at
mcp.rhylthyme.com. It is the same code as mcp-api/ in the
rhylthyme-server application, copied here with the static assets it
needs so it can be read, tested and self-hosted.
Try it: ask for a workout
Connect the server (in claude.ai, Claude Desktop or mobile, add
Rhylthyme from the Claude Connectors Directory;
in Claude Code, /plugin marketplace add rhylthyme/rhylthyme-mcp
then /plugin install rhylthyme@rhylthyme; anywhere else, add
https://mcp.rhylthyme.com/gym/mcp as a connector), then say what you want in
plain words:
Two of us in a garage gym: one kettlebell, one pull-up bar, one jump rope. Thirty minutes, two rounds, and nobody stands around waiting for equipment. Make it a Rhylthyme timeline.
You write no JSON. The assistant does, and the server keeps it honest. With that prompt Claude made three tool calls:
Call | What came back |
|
|
|
|
| a link, gym.rhylthyme.com?share=4995ef1b88744e80, with rest timers and interval beeps, and a text chart for the chat: |
0 15m 30m
Alex │░Warm-…░▒S…▒░Pu…░▒Ju…▒░░░▒Sw…▒░Pu…░▒Ju…▒░░░▒St…▒│
Sam │░Warm-…░▒P…▒░Ju…░▒Sw…▒░░░▒Pu…▒░Ju…░▒Sw…▒░░░▒St…▒│Ask "show me a picture" and preview_timeline returns an image in the chat.
For one coloured by station, which makes the rotation obvious, save the
program the assistant wrote (ours is examples/recipe/garage-circuit.json) and run:
npx -y github:rhylthyme/rhylthyme-timeline garage-circuit.json -o garage-circuit.png \
--style web --palette tableau --color-by task
Then push on it: "add a third person", "we only have 20 minutes", "swap the rope for burpees". The assistant edits the program and the server checks it again.
Related MCP server: Blossom
This repository and rhylthyme
Two repositories do related things and are easy to confuse. This one is the server an AI assistant talks to. rhylthyme (formerly rhylthyme-cli-runner) is the command a person types.
What it is | The MCP server: the tools an AI assistant calls | A command-line program: the |
Who uses it | Claude, ChatGPT, Cursor or any MCP client, on a person's behalf | A person at a terminal, a script, or CI |
Where it runs | Hosted at | On your machine: |
Language | JavaScript (Node 20+) | Python 3.12+ |
Input | A program the assistant builds in conversation | A program file on disk (JSON or YAML) |
Validate a program |
|
|
Timing, conflicts, deadlines |
|
|
Publish a live timeline |
|
|
Run a schedule with timers | no: it hands back a link to the web timeline |
|
Recorded runs, calibration | reads runs saved to an account | records runs locally; |
Catalog search, imports, account library | yes | no |
Also in the repository | the | the Claude skill's source, the prompt-evaluation harness and its results, |
How they fit together: the command-line tool is one of this server's clients.
rhylthyme analyze, publish, generate and mcp-test are MCP calls to
mcp.rhylthyme.com; rhylthyme validate, run, runs and calibrate never
touch the network. Each has its own validator for the same program schema
(JavaScript here, Python there), so a program is checked again when it is
published.
Use this repository to connect an assistant, to read or self-host the server, or to change a tool. Use rhylthyme if you have a program file and a terminal, want timers in the terminal, or keep run records.
Two names to keep apart: rhylthyme-mcp on PyPI is this server's stdio bridge
(command rhylthyme-mcp, source in python/); rhylthyme
on PyPI is the command-line tool (command rhylthyme; it was published as
rhylthyme-cli-runner before 0.5.0). The program format
itself is defined in rhylthyme-spec,
with examples in rhylthyme-examples.
Endpoints
URL | Server name | Adds |
|
| generic scheduler |
|
|
|
|
|
|
|
|
|
|
|
|
Transport: Streamable HTTP, stateless. No sign-in is needed for the public
catalog or the pure tools; account tools use the person's Rhylthyme account
through OAuth 2.1, or a pasted token from the login tool in clients without
OAuth. Server instructions describing the workflow are sent at
initialize.
Quickstart: timelines from the command line
The rhylthyme CLI can drive this server directly: describe what you
need in plain language and get back a live timeline URL, a program file,
or both.
pip install rhylthyme # Python 3.12+
rhylthyme login # opens rhylthyme.com in your browser
rhylthyme generate "roast chicken, potatoes and green beans for 6" \
-e kitchen --by 19:00 --with "one oven, four burners, one cook"login signs you in through the browser and hands the session back to a
one-shot listener on 127.0.0.1. It is stored in
~/.config/rhylthyme/credentials.json (mode 0600) and renews itself, so
you only log in once. generate then calls two tools on this server:
import_texton the endpoint for-e(/kitchen/mcp,/lab/mcp, …) turns the request into a validated multi-track program. It runs four model turns server-side, which is why it needs a sign-in; it takes 20–60 seconds and is capped per day.visualize_schedulepublishes that program and returns the live-timeline URL on the matching subdomain.
It prints the ASCII Gantt, the itinerary and the URL. More examples:
# A lab protocol from a file; save the program and run it in the terminal
rhylthyme generate -e lab -f western_blot.txt -o blot.json --run
# Pipe a run sheet in; print only the URL
pbpaste | rhylthyme generate -e events --by "doors at 18:30" -q
# Program JSON only, no published timeline; machine-readable output
rhylthyme generate -e gym "45 minute upper-body circuit, two people, one bench" --no-publish --jsonFlag | Meaning |
|
|
| When everything must be finished: |
| Equipment and people limits in your own words. |
| Read the request or source text from a file, or |
| Save the program JSON. |
| Run the program in the terminal runner afterwards. |
| Open the live timeline in a browser. |
| Skip publishing; print JSON; print only the URL. |
To check a server (this one, or your own deployment) end to end:
rhylthyme mcp-test # all five hosted endpoints, read-only
rhylthyme mcp-test --url http://localhost:3000/mcp -e generic --publishrhylthyme whoami shows the stored sign-in; rhylthyme logout forgets it.
On a machine without a browser, set RHYLTHYME_TOKEN to an access token
from https://www.rhylthyme.com/mcp/auth (it lasts about an hour), or
run rhylthyme login --token <token>. RHYLTHYME_MCP_URL points the CLI
at a self-hosted server.
Connect
Claude Code
claude mcp add --transport http rhylthyme https://mcp.rhylthyme.com/mcp
claude mcp add --transport http rhylthyme-kitchen https://mcp.rhylthyme.com/kitchen/mcpClaude Desktop / claude.ai: Customize → Connectors, search for
Rhylthyme and click Connect. For one of the other URLs above: Customize →
Connectors → Add → Add custom connector → paste the URL → Continue. Public tools work immediately;
run login only to save to your own account.
Claude Code plugin (the hosted server plus a skill that teaches Claude to author, validate and analyze schedules):
These are two commands. Send the first on its own:
/plugin marketplace add rhylthyme/rhylthyme-mcpthen, once it says the marketplace was added, the second:
/plugin install rhylthyme@rhylthymeChatGPT: Settings → Apps & Connectors → Advanced settings → turn on Developer mode, then Create a connector with one of the URLs above as the MCP server URL. Without a connector ChatGPT cannot call these tools and falls back to browsing the website.
Cursor (.cursor/mcp.json):
{ "mcpServers": { "rhylthyme": { "url": "https://mcp.rhylthyme.com/kitchen/mcp" } } }Claude API (MCP connector, one request):
import anthropic
client = anthropic.Anthropic()
resp = client.beta.messages.create(
model="claude-opus-5", max_tokens=16000,
betas=["mcp-client-2025-11-20"],
mcp_servers=[{"type": "url", "url": "https://mcp.rhylthyme.com/kitchen/mcp", "name": "rhylthyme"}],
tools=[{"type": "mcp_toolset", "mcp_server_name": "rhylthyme"}],
messages=[{"role": "user", "content": "Plan Thanksgiving for 8 with one oven, dinner at 6pm."}],
)Reviewing an import. review_program (an account tool) has a model read an
imported program against its source and return findings: wrong durations,
dropped steps, bad ordering, a total that disagrees with the source. Call it
after import_from_source or import_text, apply what it says, and validate
again.
Clients that can only launch a command: pip install rhylthyme-mcp gives a
rhylthyme-mcp command, a stdio bridge that passes every request through to
the hosted server (source in python/):
{ "mcpServers": { "rhylthyme": { "command": "rhylthyme-mcp", "args": ["kitchen"] } } }No MCP client at all (an agent with a shell, a script): the server is stateless, so one POST works with no handshake and no account.
curl -s https://mcp.rhylthyme.com/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"validate_program","arguments":{"program":{"programId":"x","name":"x","tracks":[]}}}}'visualize_schedule called the same way returns the live-timeline URL in
result.structuredContent.url. Or use the CLI in the quickstart above.
Tools
Tool | Annotations | What it does |
| read-only, pure | Structural and scheduling checks (duplicate/missing ids, dangling references, cycles, within-track overlaps, tasks without a resource constraint, unparseable durations, choice references). Every finding carries a |
| read-only, pure | Resolved start/end per step, makespan, the dependency chain that determines it, resource-conflict windows, per-track slack, peak concurrency vs. declared actors. Pass |
| publishes | Validates (refuses invalid programs unless |
| publishes a share record | PNG of the timeline only, no prose. |
| read-only | Keyword search over the public catalog; |
| read-only | Full summary and live URL for one catalog entry. |
| read-only | One-shot on each vertical: top catalog match → live URL. |
| read-only | Random catalog pick on each vertical. |
| read-only | Spoonacular, TheMealDB, protocols.io, Cooklang, Opentrons Protocol API scripts, Benchling → validated program JSON. |
| pure | Equipment limits and actor types → environment JSON. |
| — | Returns the sign-in URL, then verifies a pasted token. |
| account | The user's own library; |
| read-only | Source of the Apache-2.0 timeline renderer, for HTML artifacts whose sandbox blocks external scripts. |
Annotations (readOnlyHint, destructiveHint, idempotentHint,
openWorldHint) are set on every tool; four tools also declare an
outputSchema and return structuredContent. Failures set isError
and say what to do next.
Resources and prompt
rhylthyme://schema/program: the program JSON Schema (0.3.0-alpha)rhylthyme://guide/authoring: one-page authoring rules, trigger vocabulary, how to make tracks finish together, repeated work (replicates, per-instanceinstances: "each"chains,"all"barriers andmaxInFlight), choice branchingrhylthyme://guide/tools: the long form of every tool description. The tool list itself is kept to about 3,600 tokens so it is cheap to keep connectedrhylthyme://examples/{breakfast_schedule, lab_experiment, stir_fry_with_choice, hiit_cardio_workout, corporate_presentation, cookies_three_trays}: complete valid programs (cookies_three_traysis the 0.3.0-alpha per-instance / in-flight worked example)prompt
plan_schedule(goal, finishAt?, constraints?): walks the model through search → build → validate → analyze → visualize, and namesreplicates/instances/maxInFlightin its constraints step
What a program looks like
{
"schemaVersion": "0.1.0",
"programId": "eggs-and-toast",
"name": "Eggs and toast",
"tracks": [
{ "trackId": "eggs", "name": "Eggs", "steps": [
{ "stepId": "whisk", "name": "Whisk", "task": "prep",
"duration": { "type": "fixed", "seconds": 60 },
"startTrigger": { "type": "programStart" } },
{ "stepId": "cook", "name": "Cook", "task": "stove",
"duration": { "type": "variable", "minSeconds": 120, "maxSeconds": 240, "defaultSeconds": 180 },
"startTrigger": { "type": "afterStep", "stepId": "whisk" } } ] },
{ "trackId": "toast", "name": "Toast", "steps": [
{ "stepId": "toast", "name": "Toast", "task": "toaster",
"duration": { "type": "fixed", "seconds": 180 },
"startTrigger": { "type": "afterStep", "stepId": "cook", "event": "start", "offsetSeconds": 60 } } ] }
],
"resourceConstraints": [
{ "task": "prep", "maxConcurrent": 1 },
{ "task": "stove", "maxConcurrent": 2 },
{ "task": "toaster", "maxConcurrent": 1 }
]
}Steps in one track run sequentially; parallel work goes in separate
tracks; every task needs a resource constraint; durations and offsets
take seconds or strings like "5m". Triggers: programStart,
programStartOffset, afterStep (end or event: "start", signed offset),
afterStepWithBuffer, manual, onAbort, or {logic: all|any, triggers}.
Durations: fixed, variable (ended early by the executor), indefinite
(ended by the executor).
Self-hosting
git clone https://github.com/rhylthyme/rhylthyme-mcp
cd rhylthyme-mcp
npm install # Node 20 or newer
npm test # SDK in-memory + HTTP entry-point tests, no network
PORT=3000 npm start # http://localhost:3000/mcp and the four vertical paths
npm run stdio # the same server over stdio (add kitchen, lab, events or gym)Stdio clients run it as a local process, for example in Claude Desktop:
{"command": "node", "args": ["/path/to/rhylthyme-mcp/src/stdio.js"]}.
Docker: docker build -t rhylthyme-mcp . && docker run -p 3000:3000 rhylthyme-mcp.
Vercel: vercel in the repository root; vercel.json rewrites the endpoint
paths to the function.
What self-hosting does and does not give you: validation, timing analysis,
the renderer, resources and prompts run in your process. Catalog search,
sharing (visualize_schedule), imports and account tools call the public
API at https://www.rhylthyme.com (API_BASE in mcp-api/index.js), so
those still depend on the hosted service. The PNG preview route
/api/og/timeline.png additionally needs SUPABASE_URL and
SUPABASE_ANON_KEY for read access to shared programs; nothing else does.
Layout
mcp-api/index.js: tool, resource and prompt registration; vertical detection; OG-image route; Vercel handlermcp-api/schedule.js: validator and analyzer (pure)static/js/timeline-render.js: timing engine and SVG Gantt (also published as@rhylthyme/timeline)static/schema/,static/examples/: the resourcessrc/index.js: standalone HTTP runnersrc/stdio.js: standalone stdio runner (same tools, resources and prompts)mcp-api/server.json: MCP registry manifest.claude-plugin/marketplace.json,plugins/rhylthyme/: the Claude plugin marketplace and plugin (claude plugin validate .); the skill in it is a checked copy ofskills/rhylthymein rhylthymepython/: therhylthyme-mcpPyPI package, a stdio bridge to the hosted server (cd python && PYTHONPATH=src pytest tests)
Known limitations
loginhands the user a URL and expects a pasted, short-lived access token that then travels as a tool argument; it is outside MCP's OAuth 2.1 flow. Hosts that require OAuth for authenticated servers can still use every public tool.search_public_recipessearches one environment at a time; the generic endpoint defaults to kitchen.Tool annotations are self-declared hints; hosts may ignore them.
License
Apache-2.0, like the rest of Rhylthyme. (This repository was MIT until September 2026.)
Available Tools
19 toolsanalyze_scheduleAnalyze schedule timingARead-onlyIdempotentInspect
Put a program on the clock: each step's start and end, total length, the critical path and what gates it, resource conflicts, slack per track. Pass finishAt to answer 'when do I start X so everything is ready at 6pm?'. Pure computation. With history (run records) or program_id it also predicts durations from recorded runs.
Inputs: program (required), token, history, startAt, +4 more. Returns: name, steps, tracks, inFlight, +15 more
calibrate_programPropose durations from recorded runsARead-onlyIdempotentInspect
Propose durations for a saved program from its recorded runs: median as the default, P10 to P90 as the range, at least as wide as the author's, with the evidence per step and the effect on total length. Saves nothing; with accept it returns the calibrated program. Needs the user's Rhylthyme account.
Inputs: k, since, token, accept, +3 more.
create_environmentDefine equipment limitsBRead-onlyIdempotentInspect
Describe a workspace's equipment limits (one oven, two centrifuges, one stage) as resourceConstraints to copy into a program, so steps that share equipment are scheduled around each other.
Inputs: name (required), type (required), resourceConstraints (required), actors, +1 more.
get_renderer_sourceGet timeline renderer sourceARead-onlyIdempotentInspect
Return the open-source timeline renderer's JavaScript (Apache-2.0, about 90 KB, no dependencies) for an HTML page or artifact that cannot load external scripts; it defines Rhylthyme.renderTimeline(container, program).
Inputs: no named parameters.
import_from_sourceImport from an external sourceARead-onlyIdempotentInspect
Import a recipe, protocol or run of show into a program. source: spoonacular, themealdb (recipes); protocolsio, opentrons, benchling (lab); cooklang (.cook URL); ontime (run of show). action: search (no account needed), import (query = URL or id), random. import, random and benchling need the user's Rhylthyme account. enrich: true splits an import into parallel tracks. Returns the program.
Inputs: action (required), source (required), text, query, +2 more.
import_textImport pasted textARead-onlyIdempotentInspect
Turn pasted text (a recipe, protocol, run sheet or training plan) into a validated multi-track program on the server, in four model turns, with a table of the source span each step came from. Capped per day. Needs the user's Rhylthyme account.
Inputs: text (required), environmentType (required), hints, token, +1 more.
list_my_programsList my saved programsARead-onlyIdempotentInspect
List the user's saved programs. Needs the user's Rhylthyme account.
Inputs: token.
list_public_runsList contributed runsARead-onlyIdempotentInspect
List anonymous runs other people contributed for one exact program version: actual against planned length, and their conditions. For 'how long does this really take?'. No account needed. Takes program or program_hash.
Inputs: limit, program, program_hash.
list_runsList recorded runsARead-onlyIdempotentInspect
List recorded runs of a saved program: when, how it ended, actual against planned length. For 'how long did this take last time?'. Needs the user's Rhylthyme account.
Inputs: program_id (required), token.
load_programOpen a saved programARead-onlyIdempotentInspect
Open one of the user's saved programs by id: summary plus live-timeline URL. Needs the user's Rhylthyme account.
Inputs: program_id (required), token.
load_public_recipeOpen a public programARead-onlyIdempotentInspect
Open a public catalog entry by id: summary plus live-timeline URL.
Inputs: program_id (required).
load_runOpen a recorded runARead-onlyIdempotentInspect
Open one recorded run: planned against actual timing per step, what ended each step, pauses. Shows where a plan drifts. Needs the user's Rhylthyme account.
Inputs: run_id (required), token.
loginConnect Rhylthyme accountARead-onlyIdempotentInspect
For apps that cannot connect the Rhylthyme account directly: returns a sign-in URL, then accepts the pasted token. Only the user's own saved programs, runs and imports need it; everything public works without. Tokens last about an hour.
Inputs: token.
preview_timelinePreview timeline imageADestructiveInspect
Return a static Gantt image of a program with a caption, for 'show me a preview' or 'a picture of the timeline'. The image is served from a public share link. Planned versus actual: with run (a run record) it draws the actual bars over the plan.
Inputs: program (required), run.
review_programReview an imported programARead-onlyIdempotentInspect
A model reads an imported program against its source and reports what looks wrong: a default duration on "simmer for an hour", a step the importer dropped, steps chained that could overlap, a total that disagrees with the source. Changes nothing; returns findings to show the user. Needs the user's Rhylthyme account.
Inputs: program (required), token, source_url, source_text.
save_programSave to my accountADestructiveIdempotentInspect
Save a program to the user's account ('save this for later'); the same programId updates it. Needs the user's Rhylthyme account.
Inputs: program (required), token.
search_public_recipesSearch the public catalogARead-onlyIdempotentInspect
Search the public catalog of recipes, lab protocols, event templates and workouts by name or keyword. Returns ids, names, descriptions and URLs; no account needed.
Inputs: limit, query, environment. Returns: count, query, results, environment
validate_programValidate a programARead-onlyIdempotentInspect
Check a program before publishing or saving it: ids, dangling or cyclic triggers, steps overlapping in a track, tasks with no resourceConstraint, durations, replicates/instances misuse. Every finding has a code, a message and a suggested fix. Pure computation.
Inputs: program (required). Returns: info, stats, valid, errors, +1 more
visualize_schedulePublish a live timelineADestructiveInspect
Publish a program as a live, shareable timeline (a public share link) and return its URL, with an ASCII Gantt and an itinerary. For a schedule the user wants to follow or share ('plan this so it all finishes at 6', 'when do I start each thing'). Validates first and refuses an invalid program with fix hints.
Inputs: program (required), allowInvalid. Returns: url, shareId, imageUrl, warnings, +1 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 19 tools
Most tools target distinct resources and actions, and descriptions carefully separate public vs. account-scoped variants (list_public_runs vs list_runs, load_public_recipe vs load_program). A few pairs risk confusion: validate_program vs review_program (structural checks vs model reading against source), and analyze_schedule-with-history vs calibrate_program both derive durations from recorded runs, while visualize_schedule and preview_timeline both produce timeline imagery.
Names follow a clean snake_case verb_noun pattern throughout (list_runs, load_program, validate_program, save_program, preview_timeline). The only deviation is the bare 'login', which lacks a noun but is a widely understood special case.
19 tools is on the heavy side, but the domain genuinely spans public catalog browsing, imports, validation/analysis, visualization/rendering, and run-based calibration, so most tools earn their place. It is slightly over what a single-purpose server needs but not bloated.
The program lifecycle is well covered: import (source/text), validate, analyze, save/update, load, list, review, calibrate, plus run listing/inspection and rendering. Gaps exist—no explicit delete/remove program and no tool to record a run (only list/load runs), which agents must work around.
Maintenance
Related MCP Connectors
Gantt chart SaaS with server-side critical path and dependency-aware shift-impact tools, plus CRUD.
Plan, preview and edit timelines. Permanent Free tier; paid reporting and enterprise tools.
Build Gantt charts from your AI chat: tasks, dependencies, timeline spreadsheets. All data is local.
Create, read and live-edit visual boards, Kanban plans, Gantt timelines and diagrams with AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to create interactive charts, diagrams, and tables displayed on a real-time dashboard, supporting multiple data sources with privacy-focused local execution.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables collaborative project planning by connecting an MCP-capable chat app to a generative AI that manages tasks and dependencies, with a live web UI for visualization.1GPL 3.0
- FlicenseNot gradedqualityBmaintenanceAn OAuth-protected MCP server that converts project descriptions into realistic schedules, handling dependencies, resource leveling, critical path analysis, and generating shareable charts (HTML, SVG, PNG, JSON, CSV).-
- AlicenseAqualityBmaintenanceEnables creating scheduled Gantt charts with critical-path analysis from any MCP client using plain-language task descriptions, with no account or API key required.457 npmMIT