{"name":"com.rhylthyme/rhylthyme","slug":"rhylthyme","title":"Rhylthyme","description":"Real-time multi-track schedules for cooking, lab protocols, events and workouts. Validate and share.","url":"https://mcp.market/server/rhylthyme","rating":null,"grade":"B","score":84,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-29T10:53:56.000Z","license":"Apache-2.0"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T13:16:37.668Z","last_ok_at":"2026-11-04T13:16:37.668Z","latency_ms":527},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/rhylthyme/rhylthyme-mcp","website":"https://www.rhylthyme.com","version":"1.3.0","remotes":[{"type":"streamable-http","url":"https://mcp.rhylthyme.com/mcp"}],"packages":[],"tools":[{"name":"analyze_schedule","description":"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.","write_action":true,"price_micros":0,"input_schema":{"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"}},{"name":"calibrate_program","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"create_environment","description":"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.","write_action":true,"price_micros":0,"input_schema":{"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"}},{"name":"get_renderer_source","description":"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).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"import_from_source","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"import_text","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"list_my_programs","description":"List the user's saved programs. Needs the user's Rhylthyme account.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"list_public_runs","description":"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`.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"list_runs","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"load_program","description":"Open one of the user's saved programs by id: summary plus live-timeline URL. Needs the user's Rhylthyme account.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"load_public_recipe","description":"Open a public catalog entry by id: summary plus live-timeline URL.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"load_run","description":"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.","write_action":true,"price_micros":0,"input_schema":{"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"}},{"name":"login","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"preview_timeline","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"review_program","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"save_program","description":"Save a program to the user's account ('save this for later'); the same programId updates it. Needs the user's Rhylthyme account.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"search_public_recipes","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"validate_program","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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"}},{"name":"visualize_schedule","description":"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.","write_action":true,"price_micros":0,"input_schema":{"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"}}],"scan":{"score":84,"grade":"B","scanned_at":"2026-10-02T22:38:37.366Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-02T22:38:37.282Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 590ms"]},"poisoning":{"score":15,"max":15,"notes":["19 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 4 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 3 days ago"]},"identity":{"score":10,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year","website matches verified namespace"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mcp.rhylthyme.com/mcp","reachable":true,"authRequired":false,"latencyMs":590,"serverInfo":{"name":"rhylthyme-mcp","version":"1.3.0"}}],"packages":[],"repo":{"found":true,"owner":"rhylthyme","repo":"rhylthyme-mcp","archived":false,"pushedAt":"2026-09-29T10:53:56Z","stars":0,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/216607184?v=4","ownerCreatedAt":"2025-06-16T20:30:31Z","license":"Apache-2.0"},"icon":{"url":"https://www.rhylthyme.com/static/favicon.svg","source":"registry"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"Apache-2.0","lastPushAt":"2026-09-29T10:53:56.000Z","score":23}}}},"grade_history":[],"reviews":[]}