cooklang-validation
Skill9 starsChanged 38 days agoMITView on GitHub
Use when checking or validating Cooklang - one .cook recipe, a folder, or the whole collection - for syntax errors and broken references, or when asked to fix or clean up Cooklang (e.g. a stray ingredient list or unbraced multi-word names).
1 other project uses a version of this.
Adopted by
Most recently taken up by
- cook-md/cook-mcpword for word, first seen Oct 8, 2026
Other versions1 project uses a version of this.
Word for word · 1
- cook-md/cook-mcp★ 1100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository14 other files it gives its agents.
- AGENTS.mdAGENTS.md
- cooklang-editingSkill
- export-recipeSkill
- meal-planningSkill
- metadataSkill
- nutrition-goalsSkill
- nutrition-reportsSkill
- organize-collectionSkill
- pantrySkill
- recipe-importSkill
- recipe-searchSkill
- report-authoringSkill
- scale-recipeSkill
- shopping-listSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 1 is distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 10
Use when checking or validating a .cook recipe for syntax errors, or when asked to fix or clean up Cooklang.
- Very specific: line 17
Read the file with read_recipe (skip if the content is already in hand) and check it against every rule below too — some of them (a …
- Very specific: line 19
If the user wants it fixed, run validate on the corrected text (content), then save it with write_recipe (full file content).
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Skill: cooklang-validation
Needs the Cook MCP server (tools like validate and read_recipe). If these tools are missing, the Cook MCP server isn't connected: if you installed the cooklang plugin or extension, check that its cook server is running (e.g. /mcp) or reinstall it; otherwise add it from https://github.com/cook-md/cook-mcp. Do not judge validity by eye alone instead.
Use when checking or validating a .cook recipe for syntax errors, or when asked to fix or clean up Cooklang. The cooklang-editing and recipe-import skills also self-check against these rules before they save a file.
These rules are for .cook recipes. Menu files (.menu) share most syntax but are not the focus here — if the task is about a meal plan, follow the meal-planning skill (cooklang://skills/meal-planning).
Workflow
- Run
validate: withpathfor one file or folder, with no arguments for the whole collection, or withcontent(plusas_path) for text that is not saved yet. It reports parse errors and warnings and recipe references that don't resolve; for a folder or the whole collection it also lists ingredients missing fromconfig/aisle.conf— runvalidatewith no arguments to see ingredients with no aisle. (It warns "Unnecessary scaling lock modifier" on fixed quantities{=…}: a known parser quirk; keep the=and ignore that warning.) - Read the file with
read_recipe(skip if the content is already in hand) and check it against every rule below too — some of them (a separate ingredient list, repeated quantities) parse fine and only show up as wrong data. - For each violation, name the rule, quote the offending line, and give the corrected line. Order the report by severity: errors (the file doesn't parse, a reference doesn't resolve), then rule violations below, then suggestions (missing
servings, which scaling, plans and nutrition need). - If the user wants it fixed, run
validateon the corrected text (content), then save it withwrite_recipe(full file content). - Tell the user what you fixed and saved.
Rules
- No separate ingredient or shopping-list section. A section such as
= Ingredientsor= Shopping Listthat lists@ingredient{qty}declarations is invalid — reason: Cooklang derives the ingredient list from inline tags, so a manual list plus inline references double-counts every ingredient. Move each quantity into the step that uses it and delete the section.- BAD:
= Ingredients/@bacon{6%slices}… then= Instructions/Cook the @bacon... - GOOD:
Cook the @bacon{6%slices} in a #skillet over medium heat.
- BAD:
- Declare each quantity once. The first mention of an ingredient carries the quantity; every later mention is bare — reason: each
@name{qty}becomes its own entry in the derived ingredient list, so repeating the quantity duplicates it there.- BAD:
@bacon{6%slices}in one step and@bacon{6%slices}in another. - GOOD:
@bacon{6%slices}the first time, then@baconafter.
- BAD:
- Multi-word names need
{}. An inline@or#name without braces captures only the first word — reason: the parser stops at the first space.- BAD:
Toast all the @white sandwich bread slices(captures only "white"). - GOOD:
Toast all the @white sandwich bread{}and#baking sheet{}.
- BAD:
- YAML frontmatter only. Metadata goes between
---markers at the file start — reason: the old>>metadata lines are deprecated and must not be used;write_reciperefuses them. Convert any you find into frontmatter keys.- GOOD:
---/servings: 2/---
- GOOD:
- Quantity form is
{n%unit}. The%separates amount from unit — reason:{n unit}treats the whole thing as one amount and{n/unit}is a fraction.- BAD:
@milk{1 cup},@milk{1/cup} - GOOD:
@milk{1%cup},@milk{1/2%cup}
- BAD:
- Recipe references use
@./pathwith no.cookextension. Reason: the spec's reference form has no extension.- BAD:
@./sauces/pesto.cook{150%g} - GOOD:
@./sauces/pesto{150%g}
- BAD:
- Steps are paragraphs. A blank line ends a step — reason: consecutive lines with no blank line between them parse as one step, so a recipe written one sentence per line collapses into a single step.
Do not skip the fix
| Excuse | Rebuttal |
| "I only pointed out the errors, that's enough." | If the user wanted a fix, validate the corrected content and save it with write_recipe. Listing errors does not change the file. |
"validate passed, so the recipe is fine." | Rules 1, 2, 3, 5, 6 and 7 get through validate; check them by eye. |
| "The recipe already has an ingredients list, keep it." | A separate ingredient list is the violation (rule 1). Remove it and put the quantities inline; do not preserve it. |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

