crw-parse — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited crw-parse (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
crw-scrape (step 2) instead — scrape handles remote PDFs via URL. If you want a typed JSON object from a page, see crw-extract (step 6).
(unlike Firecrawl's document endpoint). If you have a non-PDF document, convert it to PDF first or use an external tool.
CLI — crw scrape auto-detects a local file path and routes to the PDF parser; there is no separate crw parse subcommand:
crw scrape report.pdf # → markdown to stdout
crw scrape report.pdf --format json --extract '{"type":"object","properties":{"title":{"type":"string"}}}' -o out.jsonMCP (inside an agent harness):
crw_parse_file(
contentBase64="<base64-encoded PDF bytes>",
filename="report.pdf",
formats=["markdown"],
maxLength=0
# For structured JSON output:
# formats=["json"],
# jsonSchema={"type":"object","properties":{"title":{"type":"string"}}}
)REST — multipart upload, 50 MB limit, PDF only:
curl -X POST "$CRW_API_URL/v2/parse" \
-H "Authorization: Bearer $CRW_API_KEY" \
-F "[email protected]" \
-F 'options={"formats":["markdown"]}'| Need | CLI (crw scrape <path>) | MCP field | REST options field | |||
|---|---|---|---|---|---|---|
| Output format | `--format markdown\ | json\ | text\ | links` | formats | formats |
| Structured JSON | --extract '<schema>' | jsonSchema + formats:["json"] | jsonSchema + formats:["json"] | |||
| AI summary | --summary | formats:["summary"] | formats:["summary"] | |||
| Summary prompt | --prompt "TEXT" | — | summaryPrompt | |||
| Limit output chars | — | maxLength (0 = unbounded) | maxContentChars | |||
| Force parser | — | parsers:["pdf"] | parsers:["pdf"] |
Formats json and summary require a server-side LLM configured in [extraction.llm] of the server config (or via crw setup for the CLI).
%PDF- magic header.return empty markdown with a warning. There is no attempt_scanned option — scanned PDFs are a known gap.
in-process, so it shares the same underlying limit.
returns a 400.
.crw/ andgrep/head the output: crw scrape big.pdf -o .crw/big.md.
pass as contentBase64. The filename field is optional but helps with error messages.
extractable text layer, the REST response returns empty markdown with no warning field in the envelope. A warning (e.g. warning: pdf_partial_text) only appears on the CLI's stderr, never in the REST/MCP response. If you get empty markdown, assume a scanned/image-only PDF and handle it at call-site.
served over HTTP)
a schema
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.