Rhylthyme

Real-time multi-track schedules for cooking, lab protocols, events and workouts. Validate and share.

사용해야 할까요

품질 및 안전성

A
설명 품질
100%
스키마 완전성
92%
이름 품질
98%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~4,989토큰 (도구 정의)
~2.0 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 3.90%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`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"
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 19개
검증됨버전이 기록되지 않음도구 18개