docs
Documentation
Everything you need to go from zero to parsing. One page, no sidebar rabbit holes.
Quick start
Three things. Account, skills, and a file to parse.
1. Create an account
Sign up at getfrenchie.dev/register. You get 100 free credits — no credit card required.
Once you're in, grab your API key from the dashboard. It looks like this:
fr_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4Keep it somewhere safe. You'll need it in the next step.
2. Install the MCP server & skills
Add Frenchie to your MCP config. The package is @lab94/frenchie.
Claude Code — add to ~/.claude/settings.json:
{
"mcpServers": {
"frenchie": {
"command": "npx",
"args": ["-y", "@lab94/frenchie"],
"env": {
"FRENCHIE_API_KEY": "fr_your_key_here"
}
}
}
}Cursor — add to .cursor/mcp.json:
{
"mcpServers": {
"frenchie": {
"command": "npx",
"args": ["-y", "@lab94/frenchie"],
"env": {
"FRENCHIE_API_KEY": "fr_your_key_here"
}
}
}
}VS Code — add to .vscode/mcp.json:
{
"mcpServers": {
"frenchie": {
"command": "npx",
"args": ["-y", "@lab94/frenchie"],
"env": {
"FRENCHIE_API_KEY": "fr_your_key_here"
}
}
}
}Default transport is stdio. For HTTP mode in production, the endpoint is https://api.getfrenchie.dev/mcp.
Install slash commands:
$ npx @lab94/frenchie installThis auto-detects your agent and installs /ocr, /transcribe, and /frenchie-status commands. Skills ensure your agent uses Frenchie correctly even if it doesn't call MCP tools directly.
Supported agents: Claude Code, Cursor, Codex CLI, Antigravity. You can also target a specific agent:
$ npx @lab94/frenchie install --agent claude
$ npx @lab94/frenchie install --agent cursor
$ npx @lab94/frenchie install --agent codex3. Parse something
Tell your agent to use Frenchie — or just use the slash commands:
"Parse this PDF and summarize the key findings"
"Transcribe this recording and pull out the action items"
// Or use slash commands directly:
/ocr invoice.pdf
/transcribe meeting.mp3Your agent calls the right Frenchie tool, gets clean Markdown back, and keeps working. That's it.
MCP tools
Frenchie exposes three tools through MCP. Your agent picks the right one automatically.
ocr_to_markdown
Converts a PDF or image to Markdown using OCR.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
file_path | string | Yes* | Local path to the file |
uploaded_file_reference | string | Yes* | Reference to an already-uploaded file |
api_key | string | No | Override the env API key for this request |
* One of file_path or uploaded_file_reference is required.
Supported file types:
application/pdf image/png image/jpeg image/webpCredits: 1 per page.
Routing:
| File | Mode | Behavior |
|---|---|---|
| Single-page PDF or small image | Sync | Result returned immediately |
| Multi-page PDF or large file | Async | Returns jobId — MCP auto-polls for up to 90s, then returns status |
Response (done):
{
"status": "done",
"markdown": "# Invoice\n\n| Item | Amount |\n|------|--------|\n| Widget | $42.00 |",
"creditsUsed": 4,
"resultExpiresAt": "2026-04-10T15:30:00Z"
}Response (processing):
{
"status": "processing",
"jobId": "fr_job_29xk",
"estimatedCompletion": "2026-04-10T15:02:30Z"
}transcribe_to_markdown
Converts audio or video to a Markdown transcript.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
file_path | string | Yes* | Local path to the file |
uploaded_file_reference | string | Yes* | Reference to an already-uploaded file |
api_key | string | No | Override the env API key for this request |
* One of file_path or uploaded_file_reference is required.
Supported file types:
Audio: audio/mpeg audio/mp3 audio/m4a audio/wav audio/x-wav audio/wave audio/mp4 audio/webm
Video: video/mp4 video/quicktime (MOV) video/webmCredits: 2 per minute (rounded up).
Routing: Determined by duration + file size. Short clips may resolve sync. Longer files go async — chunked and reassembled automatically.
Response format: Same as ocr_to_markdown.
get_job_result
Retrieves the result of an async job.
Most of the time you don't need to call this directly — the MCP server auto-polls for up to 90 seconds after submitting a job. You only need get_job_result if the auto-poll timed out and returned a "processing" status.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id | string | Yes | The job ID from a previous async response |
api_key | string | No | Override the env API key for this request |
Response (done):
{
"status": "done",
"markdown": "...",
"creditsUsed": 96,
"resultExpiresAt": "2026-04-10T15:30:00Z"
}Response (still processing):
{
"status": "processing",
"jobId": "fr_job_29xk",
"estimatedCompletion": "2026-04-10T15:02:30Z"
}Sync and async routing
You don't pick sync or async — Frenchie does.
Small files (single-page PDFs, short clips) resolve sync — the result comes back in the same request.
Larger files go async:
- Frenchie returns a
jobIdimmediately - The MCP server auto-polls every 3 seconds for up to 90 seconds
- If the job finishes within that window, you get the result back transparently
- If it doesn't, you get
{ "status": "processing", "jobId": "..." }— callget_job_resultlater
For most files, the auto-poll handles everything. Your agent doesn't need to know or care about the difference.
small file
agent ──────────► Frenchie ──────────► result (sync, ~2s)
large file
agent ──────────► Frenchie ──► jobId ──► auto-poll (up to 90s) ──► result
│
└── if timeout: agent calls get_job_result laterSupported files
OCR (→ Markdown):
| Type | MIME |
|---|---|
application/pdf | |
| PNG | image/png |
| JPEG | image/jpeg |
| WebP | image/webp |
Transcription (→ Markdown):
| Type | MIME |
|---|---|
| MP3 | audio/mpeg, audio/mp3 |
| M4A | audio/m4a |
| WAV | audio/wav, audio/x-wav, audio/wave |
| Audio MP4 | audio/mp4 |
| Audio WebM | audio/webm |
| MP4 video | video/mp4 |
| MOV | video/quicktime |
| WebM video | video/webm |
Limits:
| Limit | Value |
|---|---|
| Max file size | 2 GB |
| Max concurrent jobs | 5 per user |
If you send an unsupported type, you'll get a 400 with "Unsupported file type for [filename]".
Credits
Everything runs on credits. No subscriptions, no monthly fees.
| Action | Cost |
|---|---|
| OCR | 1 credit per page |
| Transcription | 2 credits per minute (rounded up) |
Credit packs:
| Pack | Price | Per-credit |
|---|---|---|
| 100 credits | $1 | $0.010 |
| 500 credits | $5 | $0.010 |
| 2,000 credits | $20 | $0.010 |
| 10,000 credits | $100 | $0.010 |
New accounts get 100 free credits. No card required. Credits don't expire.
If your balance is too low for a job, the request fails with a 402:
{
"isError": true,
"content": [{ "type": "text", "text": "Insufficient credits" }]
}The response also includes your current balance and the required amount, so your agent (or you) knows exactly how many credits to top up.
Rate limits
Generous enough that you probably won't hit them. But here they are.
| Limit | Value |
|---|---|
| Requests per minute | 60 |
| Concurrent jobs per user | 5 |
| OCR pages per hour | 500 |
| Transcription minutes per hour | 120 |
| Credits per day | 5,000 |
If you exceed a limit, you'll get a 422 with details on what you hit and when it resets.
For most users, these limits are invisible. If you're consistently hitting them, reach out — we want to hear about your use case.
Result expiry
Results are available for 30 minutes after first delivery. After that, the Markdown content is deleted and the API returns 410 Gone.
{
"isError": true,
"content": [{ "type": "text", "text": "Job result has expired and is no longer available" }]
}The job record stays in the system (for your usage history), but the actual content is gone. If you need the result again, re-submit the file.
We don't store your files or results longer than necessary. That's the point.
Errors
When something goes wrong, Frenchie returns a standard MCP error:
{
"isError": true,
"content": [{ "type": "text", "text": "<error message>" }]
}Here's what you might see:
| HTTP | Condition | Message |
|---|---|---|
400 | Unsupported file type or bad payload | "Unsupported file type for [filename]" |
402 | Not enough credits | "Insufficient credits" + required/current balance |
408 | More than 5 concurrent jobs | "Concurrent job limit exceeded" |
410 | Result expired (>30 min) | "Job result has expired and is no longer available" |
422 | Rate limit exceeded | Error + quota details |
500 | Processing failed | "Frenchie job failed" + error details |
Most errors are self-explanatory. If you hit a 500, it's on us — retry once, and if it persists, let us know at support@getfrenchie.dev.
API key
Your API key is created when you sign up. Find it on your dashboard.
Format: fr_ followed by 32 hex characters.
fr_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4Two ways to authenticate:
- Environment variable (recommended): Set
FRENCHIE_API_KEYin your MCP config. The server reads it on startup. - Per-request parameter: Pass
api_keyin any tool call. This overrides the env key for that specific request — useful if you're managing multiple accounts.
Your key is hashed (SHA-256) before storage. We never store it in plaintext.
If your key is compromised, revoke it from the dashboard and generate a new one. Active jobs will finish, but new requests with the old key will be rejected.
FAQ
My agent says "Frenchie tool not found" — what's wrong?
Your MCP server isn't connected. Check that the config is in the right file for your editor, the API key is correct, and restart your editor/agent. Most "not found" issues are a missing restart. Also try running npx @lab94/frenchie install to install skills — they give your agent instructions even without MCP.
Can I use Frenchie without MCP? Like a REST API?
The MCP server supports HTTP mode — point it at https://api.getfrenchie.dev/mcp. But Frenchie is designed MCP-first. The HTTP interface follows MCP protocol, not a traditional REST API. You can also use the slash commands (/ocr, /transcribe) installed via skills.
How do I check my credit balance?
Log into your dashboard at getfrenchie.dev/dashboard. Your balance and usage history are on the main page. Or use the /frenchie-status slash command directly in your agent.
I sent a large PDF and got a "processing" status. Now what?
Wait a bit and call get_job_result with the jobId. The MCP server auto-polls for 90 seconds, so if you got processing back, the job is taking longer than usual. Most large files finish within 5 minutes.
Can I parse a password-protected PDF?
No. Remove the password first, then send it through. We can't unlock files on your behalf.
My OCR result has weird formatting. What gives?
OCR quality depends on the source. Clean digital PDFs produce near-perfect Markdown. Scanned documents, handwriting, and low-res images are best-effort — usually good, occasionally imperfect. If something looks consistently wrong, let us know.
Do you support [language X] for transcription?
Transcription handles most major languages automatically. We don't require you to specify a language — it's detected from the audio.
I'm hitting rate limits. Can you increase them?
Reach out at support@getfrenchie.dev with your use case. We're happy to discuss higher limits for legitimate workloads.