SKILL.md Lint
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Lint a SKILL.md for frontmatter, structure, secrets and size. All 6 tools free.
| Author | com.moltlinestudio |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 155 ms |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"SKILL.md Lint": {
"url": "https://mcp.moltlinestudio.com/skillmd-lint",
"transport": "streamable-http"
}
}
}
Measured tools (6)
lint_skillread-onlyLint one SKILL.md file the way marketplaces and agents parse it. FREE. Checks YAML frontmatter presence and required fields (name, description), description quality, body structure (procedure steps, rules, degradation), secret/credential leakage, injection-style phrasing, and size budget. Typical input {"content": "<full SKILL.md text>"} returns {"verdict": "pass" | "pass-with-warnings" | "fail", "errors": ["..."], "warnings": ["..."], "stats": {"body_words": N, "has_frontmatter": bool}}. Use on the full text of one SKILL.md. Not for the surrounding archive layout (packaging_check). Errors: on invalid, missing, or malformed input this tool never raises a protocol error; it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "content is empty: pass the full SKILL.md text including frontmatter"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
Parameters:
content(required) — string — The complete SKILL.md file text, frontmatter included; must be non-empty.
Hints: read-only yes · destructive no · idempotent yes · open-world no
packaging_checkread-onlyValidate a zip layout plan for a skill marketplace before packaging. FREE. Checks SKILL.md placement rules and flags junk files. Typical input {"file_paths": ["my-skill/SKILL.md", "my-skill/examples.md"], "marketplace": "agensi"} returns {"verdict": "pass" | "fail", "issues": ["..."], "skill_files_found": ["my-skill/SKILL.md"]}. Use on a planned file layout, before zipping. Not for the content of a skill file (lint_skill). Errors: on invalid, missing, or malformed input this tool never raises a protocol error; it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "file_paths is empty: list every file that will be inside the zip"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
Parameters:
file_paths(required) — array — Every file path that will be inside the zip, relative to the zip root, e.g. ["my-skill/SKILL.md"]; at least 1 entry.marketplace— string — Rule set to apply: "agensi" (SKILL.md at root or one folder deep) or "generic" (junk-file checks only). Default "agensi".
Hints: read-only yes · destructive no · idempotent yes · open-world no
regex_testread-onlyTest a regular expression against sample strings. FREE. Typical input {"pattern": "v(\\d+)", "samples": ["v12", "beta"]} returns {"pattern": ..., "results": [{"sample": "v12", "match": true, "matched_text": "v12", "groups": ["12"]}, {"sample": "beta", "match": false, ...}], "match_count": 1}. Use to confirm a pattern matches what you expect before shipping it. Not for validating JSON (json_validate). The pattern is compiled and run in a short-lived, CPU-capped child process, so a pattern that backtracks catastrophically is stopped instead of stalling the server. Errors: on invalid, missing, or malformed input this tool never raises a protocol error; it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "a sample is too long (max 10000 characters); shorten it and retry"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
Parameters:
pattern(required) — string — A Python-flavor regular expression as a string, e.g. "v(\\d+)".samples(required) — array — Strings to test the pattern against; only the first 50 are evaluated.
Hints: read-only yes · destructive no · idempotent yes · open-world no
json_validateread-onlyValidate JSON text and summarize its structure. FREE. Typical input {"text": "{\"a\": [1, 2]}"} returns {"valid": true, "structure": {"a": ["array[2]", "int"]}}; invalid JSON returns {"valid": false, "error": "<parser message>", "line": N, "column": N} instead. Use when JSON may be malformed or its shape is unknown. Reports structure, not conformance to a schema. Not for testing a pattern (regex_test). Errors: on invalid, missing, or malformed input this tool never raises a protocol error; it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "text is empty: pass the JSON document as a raw string"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
Parameters:
text(required) — string — The JSON document to validate, as a raw string; must be non-empty.
Hints: read-only yes · destructive no · idempotent yes · open-world no
diff_textsread-onlyProduce a unified diff between two texts. FREE. Useful for comparing two SKILL.md versions. Typical input {"a": "<old text>", "b": "<new text>"} returns {"changed_lines": N, "diff": "--- \n+++ \n@@ ... @@\n-old line\n+new line"}; identical inputs return {"changed_lines": 0, "diff": "(identical)"}. The diff is capped at 400 lines. Use to show exactly what changed between two versions of a text. Not for judging the risk of a code change - the codereview server's review_diff does that. Errors: on invalid, missing, or malformed input this tool never raises a protocol error; it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "each text must be at most 500000 characters"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
Parameters:
a(required) — string — The original text (left side of the diff); at most 500000 characters.b(required) — string — The revised text (right side of the diff); at most 500000 characters.
Hints: read-only yes · destructive no · idempotent yes · open-world no
cron_explainread-onlyExplain a 5-field cron expression in plain English and flag mistakes. FREE. Typical input {"expression": "0 9 * * 1-5"} returns {"expression": "0 9 * * 1-5", "meaning": "at minute 0; at hour 9; every day of month; every month; day of week 1-5", "issues": ["none"]}; out-of-range fields are listed in "issues". Use to read a schedule back in plain English before trusting it. Assumes 5-field cron; not for 6-field or seconds-precision variants. Errors: on invalid, missing, or malformed input this tool never raises a protocol error; it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "expected 5 fields, got <value>"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
Parameters:
expression(required) — string — A standard 5-field cron string (minute hour day-of-month month day-of-week), e.g. "0 9 * * 1-5"; must be non-empty.
Hints: read-only yes · destructive no · idempotent yes · open-world no
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.