Rhylthyme
Real-time multi-track schedules for cooking, lab protocols, events and workouts. Validate and share.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"rhylthyme": {
"url": "https://mcp.rhylthyme.com/mcp"
}
}
}원격 엔드포인트
https://mcp.rhylthyme.com/mcpstreamable-http할 수 있는 일
도구 목록
도구 (19)
🟢validate_program(program)
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.
입력 스키마
{
"type": "object",
"properties": {
"program": {
"type": "object",
"properties": {},
"additionalProperties": {},
"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."
}
},
"required": [
"program"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}출력 스키마
{
"type": "object",
"properties": {
"valid": {
"type": "boolean"
},
"errors": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"warnings": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"info": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"stats": {
"anyOf": [
{
"type": "object",
"properties": {},
"additionalProperties": {}
},
{
"type": "null"
}
]
}
},
"required": [
"valid",
"errors",
"warnings",
"stats"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢analyze_schedule(program, finishAt, startAt, history, program_id, ...)
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` (or `program_id`) it also predicts durations from recorded runs; see rhylthyme://guide/tools.
입력 스키마
{
"type": "object",
"properties": {
"program": {
"type": "object",
"properties": {},
"additionalProperties": {},
"description": "Program JSON; shape under validate_program."
},
"finishAt": {
"description": "ISO 8601 datetime everything must END at, e.g. '2026-11-26T18:00:00-05:00'. Start times are worked backwards from it.",
"type": "string"
},
"startAt": {
"description": "ISO 8601 start datetime. Ignored with finishAt.",
"type": "string"
},
"history": {
"description": "Recorded runs of this program (from load_run); adds predicted durations.",
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"program_id": {
"description": "Saved program UUID: loads the user's own recorded runs as the history.",
"type": "string"
},
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
},
"predictionContext": {
"description": "Optional: environmentId, userTags (variance factors), userId, programVersion, minIdentical, minModel, corrThreshold, verdicts. See rhylthyme://guide/tools.",
"type": "object",
"properties": {},
"additionalProperties": {}
},
"useDurations": {
"default": "planned",
"description": "planned (default): analyse the program as authored. predicted: as the history says it will run.",
"type": "string",
"enum": [
"planned",
"predicted"
]
}
},
"required": [
"program"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}출력 스키마
{
"type": "object",
"properties": {
"programId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"makespanSeconds": {
"type": "number"
},
"makespan": {
"type": "string"
},
"tracks": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"criticalPath": {
"type": "array",
"items": {
"type": "string"
}
},
"bindingConstraints": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"resourceConflicts": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"inFlight": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"actorPeak": {
"type": "object",
"properties": {},
"additionalProperties": {}
},
"wallClock": {
"anyOf": [
{
"type": "object",
"properties": {},
"additionalProperties": {}
},
{
"type": "null"
}
]
},
"validation": {
"type": "object",
"properties": {},
"additionalProperties": {}
},
"durationsUsed": {
"type": "string"
},
"plannedMakespanSeconds": {
"type": "number"
},
"plannedMakespan": {
"type": "string"
},
"predictedMakespanSeconds": {
"type": "number"
},
"predictedMakespan": {
"type": "string"
},
"predictedCriticalPath": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"programId",
"name",
"makespanSeconds",
"makespan",
"tracks",
"steps",
"criticalPath",
"resourceConflicts",
"actorPeak",
"wallClock"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🔴visualize_schedule(program, allowInvalid)
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.
입력 스키마
{
"type": "object",
"properties": {
"program": {
"type": "object",
"properties": {},
"additionalProperties": {},
"description": "Program JSON; shape under validate_program."
},
"allowInvalid": {
"default": false,
"description": "Publish despite validation errors. Only when the user explicitly wants an imperfect draft shared.",
"type": "boolean"
}
},
"required": [
"program"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}출력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"shareId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"imageUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"makespanSeconds": {
"type": "number"
},
"warnings": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
}
},
"required": [
"url",
"shareId",
"imageUrl",
"makespanSeconds",
"warnings"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢import_from_source(source, action, query, text, enrich, ...)
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 login), import (query = URL or id), random. import, random and benchling need the account. `enrich: true` splits an import into parallel tracks. Returns the program.
입력 스키마
{
"type": "object",
"properties": {
"source": {
"type": "string",
"enum": [
"themealdb",
"protocolsio",
"spoonacular",
"cooklang",
"opentrons",
"benchling",
"llm-text"
]
},
"action": {
"type": "string",
"enum": [
"search",
"import",
"random"
]
},
"query": {
"description": "Keywords (search), or the URL or id (import).",
"type": "string"
},
"text": {
"description": "Pasted source (an Opentrons .py) instead of a URL.",
"type": "string"
},
"enrich": {
"description": "With action='import': split the import into parallel tracks with cross-track triggers. One model call, capped per day.",
"type": "boolean"
},
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
}
},
"required": [
"source",
"action"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢import_text(text, environmentType, deadline, hints, token)
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. Use when the user pastes the steps and no URL importer fits. Needs the user's Rhylthyme account. Capped per day; you can instead author the program yourself and call validate_program.
입력 스키마
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The source text, all of it, as the user wrote or pasted it."
},
"environmentType": {
"type": "string",
"description": "kitchen, lab, events, gym or generic."
},
"deadline": {
"description": "When everything must be finished, if the user said: '18:00', 'dinner at six', an ISO datetime.",
"type": "string"
},
"hints": {
"description": "Equipment and people limits in the user's words, e.g. 'one oven, two burners, one cook'.",
"type": "string"
},
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
}
},
"required": [
"text",
"environmentType"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢create_environment(name, type, description, actors, resourceConstraints)
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.
입력 스키마
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"kitchen",
"laboratory",
"bakery",
"airport",
"restaurant",
"manufacturing",
"hospital",
"workshop",
"event",
"gym",
"general"
]
},
"description": {
"type": "string"
},
"actors": {
"description": "How many people can work at once (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"resourceConstraints": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"task": {
"type": "string"
},
"maxConcurrent": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"description": {
"type": "string"
}
},
"required": [
"task",
"maxConcurrent"
],
"additionalProperties": {}
}
}
},
"required": [
"name",
"type",
"resourceConstraints"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢login(token)
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.
입력 스키마
{
"type": "object",
"properties": {
"token": {
"description": "The token from the login page. Leave empty on the first call to get the sign-in URL.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_my_programs(token)
List the user's saved programs. Needs the user's Rhylthyme account.
입력 스키마
{
"type": "object",
"properties": {
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢load_program(token, program_id)
Open one of the user's saved programs by id: summary plus live-timeline URL. Needs the user's Rhylthyme account.
입력 스키마
{
"type": "object",
"properties": {
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
},
"program_id": {
"type": "string",
"description": "Program UUID from list_my_programs."
}
},
"required": [
"program_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_runs(program_id, token)
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.
입력 스키마
{
"type": "object",
"properties": {
"program_id": {
"type": "string",
"description": "Program UUID from list_my_programs."
},
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
}
},
"required": [
"program_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢review_program(program, source_text, source_url, token)
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.
입력 스키마
{
"type": "object",
"properties": {
"program": {
"type": "object",
"properties": {},
"additionalProperties": {},
"description": "Program JSON; shape under validate_program."
},
"source_text": {
"description": "The source text (recipe, protocol), if you have it.",
"type": "string"
},
"source_url": {
"description": "Its URL, when the text is not to hand.",
"type": "string"
},
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
}
},
"required": [
"program"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢load_run(run_id, token)
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.
입력 스키마
{
"type": "object",
"properties": {
"run_id": {
"type": "string",
"description": "Run UUID from list_runs."
},
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
}
},
"required": [
"run_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢calibrate_program(program, program_id, history, k, since, ...)
Propose durations for a saved program from its recorded runs: median as the default, P10 to P90 as the range, never narrower than the author's, with the evidence per step and the effect on total length. Saves nothing: pass `accept` to get the calibrated program, then save_program. Needs the user's Rhylthyme account.
입력 스키마
{
"type": "object",
"properties": {
"program": {
"description": "Program JSON to calibrate; omit to use program_id's saved JSON.",
"type": "object",
"properties": {},
"additionalProperties": {}
},
"program_id": {
"description": "Saved program UUID whose recorded runs are the evidence.",
"type": "string"
},
"history": {
"description": "Run records to use instead of the stored ones.",
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"k": {
"description": "Measurements a step needs for a proposal (default 5).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"since": {
"description": "Only runs started on or after this date (YYYY-MM-DD or ISO).",
"type": "string"
},
"accept": {
"description": "Step ids to accept, or \"all\": also returns the calibrated program. Nothing is saved either way.",
"anyOf": [
{
"type": "string",
"const": "all"
},
{
"type": "array",
"items": {
"type": "string"
}
}
]
},
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_public_runs(program_hash, program, limit)
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 login needed. Pass `program` or `program_hash`.
입력 스키마
{
"type": "object",
"properties": {
"program_hash": {
"description": "Program hash, 'sha256:' + 64 hex (a run record's programVersion).",
"type": "string"
},
"program": {
"description": "Program JSON to look up instead; hashed here.",
"type": "object",
"properties": {},
"additionalProperties": {}
},
"limit": {
"description": "Runs to return, newest first (default 50).",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_public_recipes(query, environment, limit)
Search the public catalog of recipes, lab protocols, event templates and workouts by name or keyword. Returns ids, names, descriptions and URLs; no login. Pass an id to load_public_recipe.
입력 스키마
{
"type": "object",
"properties": {
"query": {
"default": "",
"type": "string",
"description": "Keyword; matches name and description. Empty returns the newest entries."
},
"environment": {
"default": "kitchen",
"description": "Which catalog: kitchen (default), laboratory, event or gym.",
"type": "string",
"enum": [
"kitchen",
"laboratory",
"gym",
"event",
"events"
]
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}출력 스키마
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"environment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"count": {
"type": "number"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"url": {
"type": "string"
}
},
"required": [
"id",
"name",
"description",
"url"
],
"additionalProperties": {}
}
}
},
"required": [
"query",
"environment",
"count",
"results"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢load_public_recipe(program_id)
Open a public catalog entry by id: summary plus live-timeline URL (no visualize_schedule call needed).
입력 스키마
{
"type": "object",
"properties": {
"program_id": {
"type": "string",
"description": "Program UUID (from search_public_recipes)"
}
},
"required": [
"program_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴save_program(token, program)
Save a program to the user's account ('save this for later'); the same programId updates it. Needs the user's Rhylthyme account.
입력 스키마
{
"type": "object",
"properties": {
"token": {
"description": "Access token from the login tool. Omit when the account is connected.",
"type": "string"
},
"program": {
"type": "object",
"properties": {},
"additionalProperties": {},
"description": "Program JSON; shape under validate_program."
}
},
"required": [
"program"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴preview_timeline(program, run)
Return a static Gantt image of a program, for 'show me a preview' or 'a picture of the timeline'. Returns the image and a caption; the image is hosted through a public share link, as visualize_schedule creates. visualize_schedule gives the live URL. Planned versus actual: pass `run` (from load_run) to draw the real bars over the plan.
입력 스키마
{
"type": "object",
"properties": {
"program": {
"type": "object",
"properties": {},
"additionalProperties": {},
"description": "Program JSON; shape under validate_program."
},
"run": {
"description": "A recorded run of the same program (the `run` object from load_run): draws planned versus actual.",
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"required": [
"program"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_renderer_source
Return the open-source timeline renderer's JavaScript (Apache-2.0, about 90 KB, no dependencies) to paste into a <script> in an HTML artifact whose sandbox blocks external scripts; then call Rhylthyme.renderTimeline(container, program).
입력 스키마
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}커뮤니티
증거