Real-time multi-track schedules for cooking, lab protocols, events and workouts. Validate and share.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
Program JSON; shape under validate_program.
Access token from the login tool. Omit when the account is connected.
Recorded runs of this program (from load_run); adds predicted durations.
ISO 8601 start datetime. Ignored with finishAt.
ISO 8601 datetime everything must END at, e.g. '2026-11-26T18:00:00-05:00'. Start times are worked backwards from it.
Saved program UUID: loads the user's own recorded runs as the history.
planned (default): analyse the program as authored. predicted: as the history says it will run.
Optional: environmentId, userTags (variance factors), userId, programVersion, minIdentical, minModel, corrThreshold, verdicts. See rhylthyme://guide/tools.
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.
| Argument | Type | Description |
|---|---|---|
| token | string | Access token from the login tool. Omit when the account is connected. |
| history | array | Recorded runs of this program (from load_run); adds predicted durations. |
| program* | object | Program JSON; shape under validate_program. |
| startAt | string | ISO 8601 start datetime. Ignored with finishAt. |
| finishAt | string | ISO 8601 datetime everything must END at, e.g. '2026-11-26T18:00:00-05:00'. Start times are worked backwards from it. |
| program_id | string | Saved program UUID: loads the user's own recorded runs as the history. |
| useDurations | string | planned (default): analyse the program as authored. predicted: as the history says it will run. |
| predictionContext | object | Optional: environmentId, userTags (variance factors), userId, programVersion, minIdentical, minModel, corrThreshold, verdicts. See rhylthyme://guide/tools. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program"
],
"properties": {
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"history": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
},
"description": "Recorded runs of this program (from load_run); adds predicted durations."
},
"program": {
"type": "object",
"properties": {},
"description": "Program JSON; shape under validate_program.",
"additionalProperties": {}
},
"startAt": {
"type": "string",
"description": "ISO 8601 start datetime. Ignored with finishAt."
},
"finishAt": {
"type": "string",
"description": "ISO 8601 datetime everything must END at, e.g. '2026-11-26T18:00:00-05:00'. Start times are worked backwards from it."
},
"program_id": {
"type": "string",
"description": "Saved program UUID: loads the user's own recorded runs as the history."
},
"useDurations": {
"enum": [
"planned",
"predicted"
],
"type": "string",
"default": "planned",
"description": "planned (default): analyse the program as authored. predicted: as the history says it will run."
},
"predictionContext": {
"type": "object",
"properties": {},
"description": "Optional: environmentId, userTags (variance factors), userId, programVersion, minIdentical, minModel, corrThreshold, verdicts. See rhylthyme://guide/tools.",
"additionalProperties": {}
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| k | integer | Measurements a step needs for a proposal (default 5). |
| since | string | Only runs started on or after this date (YYYY-MM-DD or ISO). |
| token | string | Access token from the login tool. Omit when the account is connected. |
| accept | any | Step ids to accept, or "all": also returns the calibrated program. Nothing is saved either way. |
| history | array | Run records to use instead of the stored ones. |
| program | object | Program JSON to calibrate; omit to use program_id's saved JSON. |
| program_id | string | Saved program UUID whose recorded runs are the evidence. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"k": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Measurements a step needs for a proposal (default 5)."
},
"since": {
"type": "string",
"description": "Only runs started on or after this date (YYYY-MM-DD or ISO)."
},
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"accept": {
"anyOf": [
{
"type": "string",
"const": "all"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Step ids to accept, or \"all\": also returns the calibrated program. Nothing is saved either way."
},
"history": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
},
"description": "Run records to use instead of the stored ones."
},
"program": {
"type": "object",
"properties": {},
"description": "Program JSON to calibrate; omit to use program_id's saved JSON.",
"additionalProperties": {}
},
"program_id": {
"type": "string",
"description": "Saved program UUID whose recorded runs are the evidence."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| type* | string | |
| actors | integer | How many people can work at once (default 1). |
| description | string | |
| resourceConstraints* | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"type",
"resourceConstraints"
],
"properties": {
"name": {
"type": "string"
},
"type": {
"enum": [
"kitchen",
"laboratory",
"bakery",
"airport",
"restaurant",
"manufacturing",
"hospital",
"workshop",
"event",
"gym",
"general"
],
"type": "string"
},
"actors": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "How many people can work at once (default 1)."
},
"description": {
"type": "string"
},
"resourceConstraints": {
"type": "array",
"items": {
"type": "object",
"required": [
"task",
"maxConcurrent"
],
"properties": {
"task": {
"type": "string"
},
"description": {
"type": "string"
},
"maxConcurrent": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"additionalProperties": {}
},
"minItems": 1
}
}
}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).
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Import a recipe or protocol from a URL or service into a program. source: spoonacular, themealdb (recipes); protocolsio, opentrons, benchling (lab); cooklang (.cook URL). 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.
| Argument | Type | Description |
|---|---|---|
| text | string | Pasted source (an Opentrons .py) instead of a URL. |
| query | string | Keywords (search), or the URL or id (import). |
| token | string | Access token from the login tool. Omit when the account is connected. |
| action* | string | |
| enrich | boolean | With action='import': split the import into parallel tracks with cross-track triggers. One model call, capped per day. |
| source* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"source",
"action"
],
"properties": {
"text": {
"type": "string",
"description": "Pasted source (an Opentrons .py) instead of a URL."
},
"query": {
"type": "string",
"description": "Keywords (search), or the URL or id (import)."
},
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"action": {
"enum": [
"search",
"import",
"random"
],
"type": "string"
},
"enrich": {
"type": "boolean",
"description": "With action='import': split the import into parallel tracks with cross-track triggers. One model call, capped per day."
},
"source": {
"enum": [
"themealdb",
"protocolsio",
"spoonacular",
"cooklang",
"opentrons",
"benchling",
"llm-text"
],
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| text* | string | The source text, all of it, as the user wrote or pasted it. |
| hints | string | Equipment and people limits in the user's words, e.g. 'one oven, two burners, one cook'. |
| token | string | Access token from the login tool. Omit when the account is connected. |
| deadline | string | When everything must be finished, if the user said: '18:00', 'dinner at six', an ISO datetime. |
| environmentType* | string | kitchen, lab, events, gym or generic. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"text",
"environmentType"
],
"properties": {
"text": {
"type": "string",
"description": "The source text, all of it, as the user wrote or pasted it."
},
"hints": {
"type": "string",
"description": "Equipment and people limits in the user's words, e.g. 'one oven, two burners, one cook'."
},
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"deadline": {
"type": "string",
"description": "When everything must be finished, if the user said: '18:00', 'dinner at six', an ISO datetime."
},
"environmentType": {
"type": "string",
"description": "kitchen, lab, events, gym or generic."
}
}
}List the user's saved programs. Needs the user's Rhylthyme account.
| Argument | Type | Description |
|---|---|---|
| token | string | Access token from the login tool. Omit when the account is connected. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
}
}
}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`.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Runs to return, newest first (default 50). |
| program | object | Program JSON to look up instead; hashed here. |
| program_hash | string | Program hash, 'sha256:' + 64 hex (a run record's programVersion). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Runs to return, newest first (default 50)."
},
"program": {
"type": "object",
"properties": {},
"description": "Program JSON to look up instead; hashed here.",
"additionalProperties": {}
},
"program_hash": {
"type": "string",
"description": "Program hash, 'sha256:' + 64 hex (a run record's programVersion)."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| token | string | Access token from the login tool. Omit when the account is connected. |
| program_id* | string | Program UUID from list_my_programs. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program_id"
],
"properties": {
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"program_id": {
"type": "string",
"description": "Program UUID from list_my_programs."
}
}
}Open one of the user's saved programs by id: summary plus live-timeline URL. Needs the user's Rhylthyme account.
| Argument | Type | Description |
|---|---|---|
| token | string | Access token from the login tool. Omit when the account is connected. |
| program_id* | string | Program UUID from list_my_programs. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program_id"
],
"properties": {
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"program_id": {
"type": "string",
"description": "Program UUID from list_my_programs."
}
}
}Open a public catalog entry by id: summary plus live-timeline URL.
| Argument | Type | Description |
|---|---|---|
| program_id* | string | Program UUID (from search_public_recipes) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program_id"
],
"properties": {
"program_id": {
"type": "string",
"description": "Program UUID (from search_public_recipes)"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| token | string | Access token from the login tool. Omit when the account is connected. |
| run_id* | string | Run UUID from list_runs. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"run_id"
],
"properties": {
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"run_id": {
"type": "string",
"description": "Run UUID from list_runs."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| token | string | The token from the login page. Leave empty on the first call to get the sign-in URL. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"token": {
"type": "string",
"description": "The token from the login page. Leave empty on the first call to get the sign-in URL."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| run | object | A recorded run of the same program (the `run` object from load_run): draws planned versus actual. |
| program* | object | Program JSON; shape under validate_program. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program"
],
"properties": {
"run": {
"type": "object",
"properties": {},
"description": "A recorded run of the same program (the `run` object from load_run): draws planned versus actual.",
"additionalProperties": {}
},
"program": {
"type": "object",
"properties": {},
"description": "Program JSON; shape under validate_program.",
"additionalProperties": {}
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| token | string | Access token from the login tool. Omit when the account is connected. |
| program* | object | Program JSON; shape under validate_program. |
| source_url | string | Its URL, when the text is not to hand. |
| source_text | string | The source text (recipe, protocol), if you have it. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program"
],
"properties": {
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"program": {
"type": "object",
"properties": {},
"description": "Program JSON; shape under validate_program.",
"additionalProperties": {}
},
"source_url": {
"type": "string",
"description": "Its URL, when the text is not to hand."
},
"source_text": {
"type": "string",
"description": "The source text (recipe, protocol), if you have it."
}
}
}Save a program to the user's account ('save this for later'); the same programId updates it. Needs the user's Rhylthyme account.
| Argument | Type | Description |
|---|---|---|
| token | string | Access token from the login tool. Omit when the account is connected. |
| program* | object | Program JSON; shape under validate_program. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program"
],
"properties": {
"token": {
"type": "string",
"description": "Access token from the login tool. Omit when the account is connected."
},
"program": {
"type": "object",
"properties": {},
"description": "Program JSON; shape under validate_program.",
"additionalProperties": {}
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query | string | Keyword; matches name and description. Empty returns the newest entries. |
| environment | string | Which catalog: kitchen (default), laboratory, event or gym. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"default": "",
"description": "Keyword; matches name and description. Empty returns the newest entries."
},
"environment": {
"enum": [
"kitchen",
"laboratory",
"gym",
"event",
"events"
],
"type": "string",
"default": "kitchen",
"description": "Which catalog: kitchen (default), laboratory, event or gym."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| program* | object | Program JSON: {programId, name, environmentType?, actors?, tracks: [{trackId, name, steps: [{stepId (unique program-wide), name, task?, duration, startTrigger, replicates?, choice?}]}], resourceConstraints: [{task, maxConcurrent}], metadata?}. duration: {type:'fixed', seconds} | {type:'variable', minSeconds, maxSeconds, defaultSeconds} | {type:'indefinite', defaultSeconds}; seconds are numbers or strings like '5m', '1h30m'. startTrigger: {type:'programStart'} | {type:'programStartOffset', offsetSeconds} | {type:'afterStep', stepId, offsetSeconds?, event?:'start', instances?:'each'|'all'} | {type:'afterStepWithBuffer', stepId, bufferSeconds} | {type:'manual'}. Steps in one track never overlap; every task needs a resourceConstraint. Rules and examples: rhylthyme://guide/authoring; full schema: rhylthyme://schema/program. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program"
],
"properties": {
"program": {
"type": "object",
"properties": {},
"description": "Program JSON: {programId, name, environmentType?, actors?, tracks: [{trackId, name, steps: [{stepId (unique program-wide), name, task?, duration, startTrigger, replicates?, choice?}]}], resourceConstraints: [{task, maxConcurrent}], metadata?}. duration: {type:'fixed', seconds} | {type:'variable', minSeconds, maxSeconds, defaultSeconds} | {type:'indefinite', defaultSeconds}; seconds are numbers or strings like '5m', '1h30m'. startTrigger: {type:'programStart'} | {type:'programStartOffset', offsetSeconds} | {type:'afterStep', stepId, offsetSeconds?, event?:'start', instances?:'each'|'all'} | {type:'afterStepWithBuffer', stepId, bufferSeconds} | {type:'manual'}. Steps in one track never overlap; every task needs a resourceConstraint. Rules and examples: rhylthyme://guide/authoring; full schema: rhylthyme://schema/program.",
"additionalProperties": {}
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| program* | object | Program JSON; shape under validate_program. |
| allowInvalid | boolean | Publish despite validation errors. Only when the user explicitly wants an imperfect draft shared. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"program"
],
"properties": {
"program": {
"type": "object",
"properties": {},
"description": "Program JSON; shape under validate_program.",
"additionalProperties": {}
},
"allowInvalid": {
"type": "boolean",
"default": false,
"description": "Publish despite validation errors. Only when the user explicitly wants an imperfect draft shared."
}
}
}