frenchie — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited frenchie (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.
Frenchie is an MCP-first multimodal utility that expands what agents can do. When installed via npx @lab94/frenchie install, Frenchie runs as a local stdio MCP server and results are auto-saved to .frenchie/<name>/. Hosted/web agents connect over HTTP at https://mcp.getfrenchie.dev — both transports are supported.
Shipping today: OCR for PDFs and images, transcription for audio and video, image generation from text prompts, and structured file extraction for Office/CSV files. Rolling out next: Markdown-to-file generation (Word, Excel). New tools appear in this skill as they launch.
Use the Frenchie MCP server. Never call model provider APIs directly.
| Tool | Purpose | Input |
|---|---|---|
ocr_to_markdown | PDF/Image to Markdown | file_path (stdio) or uploaded_file_reference (HTTP) |
transcribe_to_markdown | Audio/Video to Markdown | file_path (stdio) or uploaded_file_reference (HTTP) |
extract_to_markdown | Word/Excel/CSV/TSV/PowerPoint to Markdown | file_path (stdio) or uploaded_file_reference (HTTP) |
generate_image | Text prompt to image | prompt, optional style/size/quality/format/background/output_dir |
get_job_result | Poll async job result | job_id |
upload_file | Get presigned upload URL (HTTP only) | filename, file_size, mime_type |
fetch_result_file | Download result image (HTTP only) | object_key |
All tools accept optional api_key (only needed if FRENCHIE_API_KEY is not already set).
file_path works with absolute local paths. Results are auto-saved to .frenchie/<name>/ next to the source file.file_path over HTTP. Upload first, then use uploaded_file_reference.Hard rule: if the MCP server is configured with url or serverUrl, NEVER send file_path. file_path is only valid for local stdio MCP. Hard rule: HTTP mode MUST persist the final Markdown to .frenchie/{name}/result.md before concluding the task. This rule is HTTP-only because stdio mode already writes .frenchie/... automatically. Hard rule: in stdio mode the tool response returns metadata only (savedTo, wordCount, imageCount) — no inline markdown. If you need the content, call your own file-reading tool on savedTo. Do NOT call ocr_to_markdown / transcribe_to_markdown again expecting the markdown inline; re-processing will just burn more credits.
upload_file tool)upload_file MCP tool with filename, file_size (bytes), and mime_typeupload_url, object_key, and expires_inupload_url with the correct Content-Type header (e.g. via curl -X PUT -H "Content-Type: application/pdf" -T file.pdf "<upload_url>")object_key as uploaded_file_reference to ocr_to_markdown, transcribe_to_markdown, or extract_to_markdownfile_path. Upload first, then call ocr_to_markdown with uploaded_file_referencestdio: call ocr_to_markdown with file_path (absolute path to local file)
status: "done" in HTTP mode — persist the final Markdown to .frenchie/{name}/result.md before concluding the taskstatus: "done" in stdio mode — the server has already written .frenchie/<name>/result.md. The response contains savedTo, wordCount, and imageCount — read the file with your own file tool only if the task needs the contentstatus: "processing" — store jobId, then poll with get_job_resultSupported formats: PDF, PNG, JPG/JPEG, WebP
file_path. Upload first, then call transcribe_to_markdown with uploaded_file_referencestdio: call transcribe_to_markdown with file_path (absolute path to local file) If the user already told you the language, also pass language as an ISO 639-1 code.
status: "done" in HTTP mode — persist the final Markdown to .frenchie/{name}/result.md before concluding the taskstatus: "done" in stdio mode — the server has already written .frenchie/<name>/result.md. The response contains savedTo + metadata; read the file yourself only if the task needs the transcript contentstatus: "processing" — store jobId, then poll with get_job_resultSupported formats: MP3, WAV, M4A, MP4, MOV, WebM
file_path. Upload first, then call extract_to_markdown with uploaded_file_referencestdio: call extract_to_markdown with file_path (absolute path to local file)
status: "done" in HTTP mode — persist the final Markdown to .frenchie/{name}/result.md before concluding the taskstatus: "done" in stdio mode — the server has already written .frenchie/<name>/result.md. The response contains savedTo, wordCount, and imageCount — read the file with your own file tool only if the task needs the contentstatus: "processing" — store jobId, then poll with get_job_resultSupported formats: DOCX, XLSX, CSV, TSV, PPTX
generate_image with prompt (required). Optional inputs: style, size, quality, format, background, output_dir.output_dir with the absolute path of your current workspace root so the image lands in .frenchie/<slug>/generated.<ext> next to your work. Omit it only if you know the MCP server's process cwd already equals the workspace (Claude Code, Cursor, and most CLI agents do; Claude Desktop and other GUI agents do not — they spawn with $HOME as cwd and the image ends up in the wrong place).status: "done" in stdio mode — the server already saved the image to .frenchie/<slug>/generated.<ext>. The response includes savedTo. Tell the user the file path so they can open it.status: "done" in HTTP mode — the response includes a presigned imageUrl (expires in 30 minutes). You MUST download the image to the user's machine (or render it inline if the agent UI supports that) before concluding the task. Do not just hand the user a URL. output_dir is ignored in HTTP mode.status: "processing" — store jobId, then poll with get_job_result. The original output_dir is remembered internally for that job.Pricing: 20 credits per image (refunded automatically on failure). Rate limits: 50 images / hour, 250 images / day per user.
Hard rule: v1 generates exactly one image per call. To produce multiple variants, call the tool again. Hard rule: HTTP mode is not done until the image is on the user's machine. The presigned URL expires in 30 minutes and the underlying object is deleted shortly after.
When a tool returns status: "processing":
jobId and optional estimatedCompletion timestampget_job_result with the job_idIn HTTP mode, the final Markdown is not durable until the agent writes it locally. OCR images are stored on the server and the markdown may contain frenchie-result: references instead of local paths.
HTTP mode MUST persist the final Markdown to .frenchie/{name}/result.md before concluding the task. Do not tell the user the job is complete until the folder and final markdown file have been written locally.
Save results with the same structure as stdio mode using the source filename (without extension) as folder name:
mkdir -p .frenchie/{name} (e.g. report.pdf → .frenchie/report/)frenchie-result:{objectKey}, call fetch_result_file with object_keycurl -o ".frenchie/{name}/{filename}" "{download_url}" for each imagefrenchie-result:{objectKey} in the markdown with local filenames (e.g. img-0.png).frenchie/{name}/result.mdIf there are no frenchie-result: references, still create .frenchie/{name}/result.md with the returned Markdown. HTTP mode is not complete until that file exists.
Result for report.pdf:
.frenchie/report/
├── result.md ← markdown with  relative paths
├── img-0.png
└── ...In stdio mode, this structure is created automatically — no extra steps needed.
"processing".frenchie/{name}/result.md exists locally before you conclude the taskfetch_result_file expire in 15 minutes — download promptly| Error | Action |
|---|---|
| Missing API key | Ask user to configure FRENCHIE_API_KEY or pass api_key |
| Insufficient credits | Tell user to top up at the Frenchie dashboard |
| Job failed | Surface the backend error message |
| Result expired | Explain history remains but Markdown payload is gone |
To check account status (not an MCP tool):
GET https://api.getfrenchie.dev/balance — current creditsGET https://api.getfrenchie.dev/jobs?limit=10 — recent jobsBoth require Authorization: Bearer fr_... header.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.