Frenchie
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"frenchie-skill": {
"url": "https://mcp.getfrenchie.dev"
}
}
}Remote endpoints
https://mcp.getfrenchie.devstreamable-httpWhat it can do
Tool inventory
Tools (7)
⚪ocr_to_markdown(file_path, uploaded_file_reference, api_key)
Convert PDF/image files into Markdown through Frenchie
Input Schema
{
"type": "object",
"properties": {
"file_path": {
"type": "string",
"minLength": 1,
"description": "Absolute local file path. Stdio transport only — over HTTP, upload via upload_file first and pass uploaded_file_reference instead."
},
"uploaded_file_reference": {
"type": "string",
"minLength": 1,
"description": "Object key returned by upload_file. Required for HTTP transport; ignored when file_path is provided in stdio."
},
"api_key": {
"type": "string",
"minLength": 1,
"description": "Optional Frenchie API key (fr_...). Falls back to the FRENCHIE_API_KEY env var when omitted."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"done",
"processing"
]
},
"jobId": {
"type": "string",
"minLength": 1
},
"creditsUsed": {
"type": "number",
"minimum": 0
},
"resultExpiresAt": {
"type": "string",
"format": "date-time"
},
"estimatedCompletion": {
"type": "string",
"format": "date-time"
},
"result": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "markdown"
},
"markdown": {
"type": "string",
"description": "HTTP mode: inline markdown. Stdio mode: omitted (read savedTo instead)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path from output root to the saved result.md"
},
"pages": {
"type": "integer",
"minimum": 0,
"description": "Number of pages processed — OCR only"
},
"wordCount": {
"type": "integer",
"minimum": 0,
"description": "Approximate word count of the markdown"
},
"imageCount": {
"type": "integer",
"minimum": 0,
"description": "Number of embedded images saved alongside result.md"
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "image"
},
"format": {
"type": "string",
"enum": [
"png",
"jpeg",
"webp"
]
},
"mimeType": {
"type": "string"
},
"size": {
"type": "string",
"enum": [
"1024x1024",
"1536x1024",
"1024x1536",
"auto"
]
},
"background": {
"type": "string",
"enum": [
"transparent",
"opaque",
"auto"
]
},
"style": {
"type": "string"
},
"imageUrl": {
"type": "string",
"format": "uri",
"description": "HTTP mode: presigned HTTPS link (~30 min expiry)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path to the persisted image file"
}
},
"required": [
"kind",
"format",
"mimeType"
],
"additionalProperties": false
}
]
}
},
"required": [
"status"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡transcribe_to_markdown(file_path, uploaded_file_reference, api_key, language)
Convert audio/video files into Markdown transcripts through Frenchie. Set language (ISO 639-1 code, e.g. 'th', 'en', 'ja') for better accuracy; omit for auto-detection.
Input Schema
{
"type": "object",
"properties": {
"file_path": {
"type": "string",
"minLength": 1,
"description": "Absolute local file path. Stdio transport only — over HTTP, upload via upload_file first and pass uploaded_file_reference instead."
},
"uploaded_file_reference": {
"type": "string",
"minLength": 1,
"description": "Object key returned by upload_file. Required for HTTP transport; ignored when file_path is provided in stdio."
},
"api_key": {
"type": "string",
"minLength": 1,
"description": "Optional Frenchie API key (fr_...). Falls back to the FRENCHIE_API_KEY env var when omitted."
},
"language": {
"type": "string",
"minLength": 2,
"maxLength": 10,
"description": "Optional ISO 639-1 language code (e.g. 'th', 'en', 'ja') for better accuracy; omit for auto-detection."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"done",
"processing"
]
},
"jobId": {
"type": "string",
"minLength": 1
},
"creditsUsed": {
"type": "number",
"minimum": 0
},
"resultExpiresAt": {
"type": "string",
"format": "date-time"
},
"estimatedCompletion": {
"type": "string",
"format": "date-time"
},
"result": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "markdown"
},
"markdown": {
"type": "string",
"description": "HTTP mode: inline markdown. Stdio mode: omitted (read savedTo instead)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path from output root to the saved result.md"
},
"pages": {
"type": "integer",
"minimum": 0,
"description": "Number of pages processed — OCR only"
},
"wordCount": {
"type": "integer",
"minimum": 0,
"description": "Approximate word count of the markdown"
},
"imageCount": {
"type": "integer",
"minimum": 0,
"description": "Number of embedded images saved alongside result.md"
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "image"
},
"format": {
"type": "string",
"enum": [
"png",
"jpeg",
"webp"
]
},
"mimeType": {
"type": "string"
},
"size": {
"type": "string",
"enum": [
"1024x1024",
"1536x1024",
"1024x1536",
"auto"
]
},
"background": {
"type": "string",
"enum": [
"transparent",
"opaque",
"auto"
]
},
"style": {
"type": "string"
},
"imageUrl": {
"type": "string",
"format": "uri",
"description": "HTTP mode: presigned HTTPS link (~30 min expiry)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path to the persisted image file"
}
},
"required": [
"kind",
"format",
"mimeType"
],
"additionalProperties": false
}
]
}
},
"required": [
"status"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢generate_image(prompt, style, size, quality, format, ...)
Generate a single image from a text prompt through Frenchie. Required: prompt. Optional: style (free-text style direction), size, quality, format, background. stdio mode auto-saves the image to .frenchie/<slug>/generated.<ext>; HTTP mode returns a presigned imageUrl that the agent should download for the user.
Input Schema
{
"type": "object",
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"maxLength": 3500,
"description": "Required. Plain-language description of the image to generate (e.g. 'poster of a ramen shop at night')."
},
"style": {
"type": "string",
"maxLength": 500,
"description": "Optional style direction (e.g. 'flat vector, neon palette'). Merged into the generation prompt by Frenchie."
},
"size": {
"type": "string",
"enum": [
"1024x1024",
"1536x1024",
"1024x1536",
"auto"
],
"description": "Optional output size. Defaults to automatic selection."
},
"quality": {
"type": "string",
"enum": [
"low",
"medium",
"high",
"auto"
],
"description": "Optional output quality."
},
"format": {
"type": "string",
"enum": [
"png",
"jpeg",
"webp"
],
"description": "Optional output format. Defaults to png."
},
"background": {
"type": "string",
"enum": [
"transparent",
"opaque",
"auto"
],
"description": "Optional background. transparent is rejected when format is jpeg."
},
"output_dir": {
"type": "string",
"minLength": 1,
"description": "Stdio mode only: absolute directory under which .frenchie/<slug>/generated.<ext> is saved. Defaults to the MCP server's process cwd. Recommended: pass your workspace root so the image lands next to your work instead of $HOME."
},
"api_key": {
"type": "string",
"minLength": 1,
"description": "Optional Frenchie API key (fr_...). Falls back to the FRENCHIE_API_KEY env var when omitted."
}
},
"required": [
"prompt"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"done",
"processing"
]
},
"jobId": {
"type": "string",
"minLength": 1
},
"creditsUsed": {
"type": "number",
"minimum": 0
},
"resultExpiresAt": {
"type": "string",
"format": "date-time"
},
"estimatedCompletion": {
"type": "string",
"format": "date-time"
},
"result": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "markdown"
},
"markdown": {
"type": "string",
"description": "HTTP mode: inline markdown. Stdio mode: omitted (read savedTo instead)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path from output root to the saved result.md"
},
"pages": {
"type": "integer",
"minimum": 0,
"description": "Number of pages processed — OCR only"
},
"wordCount": {
"type": "integer",
"minimum": 0,
"description": "Approximate word count of the markdown"
},
"imageCount": {
"type": "integer",
"minimum": 0,
"description": "Number of embedded images saved alongside result.md"
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "image"
},
"format": {
"type": "string",
"enum": [
"png",
"jpeg",
"webp"
]
},
"mimeType": {
"type": "string"
},
"size": {
"type": "string",
"enum": [
"1024x1024",
"1536x1024",
"1024x1536",
"auto"
]
},
"background": {
"type": "string",
"enum": [
"transparent",
"opaque",
"auto"
]
},
"style": {
"type": "string"
},
"imageUrl": {
"type": "string",
"format": "uri",
"description": "HTTP mode: presigned HTTPS link (~30 min expiry)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path to the persisted image file"
}
},
"required": [
"kind",
"format",
"mimeType"
],
"additionalProperties": false
}
]
}
},
"required": [
"status"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢extract_to_markdown(file_path, uploaded_file_reference, api_key)
Extract structured documents (.docx, .xlsx, .csv, .tsv, .pptx) into Markdown through Frenchie. stdio mode auto-saves the result to .frenchie/<name>/result.md; HTTP mode returns inline Markdown.
Input Schema
{
"type": "object",
"properties": {
"file_path": {
"type": "string",
"minLength": 1,
"description": "Absolute local file path. Stdio transport only — over HTTP, upload via upload_file first and pass uploaded_file_reference instead."
},
"uploaded_file_reference": {
"type": "string",
"minLength": 1,
"description": "Object key returned by upload_file. Required for HTTP transport; ignored when file_path is provided in stdio."
},
"api_key": {
"type": "string",
"minLength": 1,
"description": "Optional Frenchie API key (fr_...). Falls back to the FRENCHIE_API_KEY env var when omitted."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"done",
"processing"
]
},
"jobId": {
"type": "string",
"minLength": 1
},
"creditsUsed": {
"type": "number",
"minimum": 0
},
"resultExpiresAt": {
"type": "string",
"format": "date-time"
},
"estimatedCompletion": {
"type": "string",
"format": "date-time"
},
"result": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "markdown"
},
"markdown": {
"type": "string",
"description": "HTTP mode: inline markdown. Stdio mode: omitted (read savedTo instead)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path from output root to the saved result.md"
},
"pages": {
"type": "integer",
"minimum": 0,
"description": "Number of pages processed — OCR only"
},
"wordCount": {
"type": "integer",
"minimum": 0,
"description": "Approximate word count of the markdown"
},
"imageCount": {
"type": "integer",
"minimum": 0,
"description": "Number of embedded images saved alongside result.md"
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "image"
},
"format": {
"type": "string",
"enum": [
"png",
"jpeg",
"webp"
]
},
"mimeType": {
"type": "string"
},
"size": {
"type": "string",
"enum": [
"1024x1024",
"1536x1024",
"1024x1536",
"auto"
]
},
"background": {
"type": "string",
"enum": [
"transparent",
"opaque",
"auto"
]
},
"style": {
"type": "string"
},
"imageUrl": {
"type": "string",
"format": "uri",
"description": "HTTP mode: presigned HTTPS link (~30 min expiry)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path to the persisted image file"
}
},
"required": [
"kind",
"format",
"mimeType"
],
"additionalProperties": false
}
]
}
},
"required": [
"status"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_job_result(job_id, api_key)
Fetch the latest async Frenchie job result
Input Schema
{
"type": "object",
"properties": {
"job_id": {
"type": "string",
"minLength": 1,
"description": "Job ID returned by ocr_to_markdown, transcribe_to_markdown, or generate_image when status was 'processing'."
},
"api_key": {
"type": "string",
"minLength": 1,
"description": "Optional Frenchie API key (fr_...). Falls back to the FRENCHIE_API_KEY env var when omitted."
}
},
"required": [
"job_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"done",
"processing"
]
},
"jobId": {
"type": "string",
"minLength": 1
},
"creditsUsed": {
"type": "number",
"minimum": 0
},
"resultExpiresAt": {
"type": "string",
"format": "date-time"
},
"estimatedCompletion": {
"type": "string",
"format": "date-time"
},
"result": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "markdown"
},
"markdown": {
"type": "string",
"description": "HTTP mode: inline markdown. Stdio mode: omitted (read savedTo instead)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path from output root to the saved result.md"
},
"pages": {
"type": "integer",
"minimum": 0,
"description": "Number of pages processed — OCR only"
},
"wordCount": {
"type": "integer",
"minimum": 0,
"description": "Approximate word count of the markdown"
},
"imageCount": {
"type": "integer",
"minimum": 0,
"description": "Number of embedded images saved alongside result.md"
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "image"
},
"format": {
"type": "string",
"enum": [
"png",
"jpeg",
"webp"
]
},
"mimeType": {
"type": "string"
},
"size": {
"type": "string",
"enum": [
"1024x1024",
"1536x1024",
"1024x1536",
"auto"
]
},
"background": {
"type": "string",
"enum": [
"transparent",
"opaque",
"auto"
]
},
"style": {
"type": "string"
},
"imageUrl": {
"type": "string",
"format": "uri",
"description": "HTTP mode: presigned HTTPS link (~30 min expiry)"
},
"savedTo": {
"type": "string",
"description": "Stdio mode: relative path to the persisted image file"
}
},
"required": [
"kind",
"format",
"mimeType"
],
"additionalProperties": false
}
]
}
},
"required": [
"status"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡upload_file(filename, file_size, mime_type, api_key)
Get a presigned upload URL for use with ocr_to_markdown, transcribe_to_markdown, or extract_to_markdown in HTTP mode. After calling this tool, PUT the file to upload_url (with the correct Content-Type header), then pass object_key as uploaded_file_reference to the processing tool.
Input Schema
{
"type": "object",
"properties": {
"filename": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Original filename with extension (e.g. 'report.pdf')."
},
"file_size": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 2147483648,
"description": "File size in bytes."
},
"mime_type": {
"type": "string",
"minLength": 1,
"description": "MIME type (e.g. 'application/pdf', 'audio/mpeg')."
},
"api_key": {
"type": "string",
"minLength": 1,
"description": "Optional Frenchie API key (fr_...). Falls back to the FRENCHIE_API_KEY env var when omitted."
}
},
"required": [
"filename",
"file_size",
"mime_type"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"upload_url": {
"type": "string",
"format": "uri",
"description": "Presigned URL — PUT the file here with the correct Content-Type header"
},
"object_key": {
"type": "string",
"minLength": 1,
"description": "Pass this as uploaded_file_reference to ocr_to_markdown, transcribe_to_markdown, or extract_to_markdown"
},
"expires_in": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "URL expiry in seconds"
}
},
"required": [
"upload_url",
"object_key",
"expires_in"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢fetch_result_file(object_key, api_key)
Get a temporary download URL for a result file from OCR/transcription output. Use this to download images referenced as frenchie-result: in the result markdown.
Input Schema
{
"type": "object",
"properties": {
"object_key": {
"type": "string",
"minLength": 1,
"description": "The object key parsed from a frenchie-result:<objectKey> reference in the result markdown."
},
"api_key": {
"type": "string",
"minLength": 1,
"description": "Optional Frenchie API key (fr_...). Falls back to the FRENCHIE_API_KEY env var when omitted."
}
},
"required": [
"object_key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"download_url": {
"type": "string",
"description": "Temporary HTTPS download URL for the result file."
},
"filename": {
"type": "string",
"description": "Suggested filename derived from the original object key."
},
"expires_in": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "URL expiry in seconds (typically 900)."
}
},
"required": [
"download_url",
"filename",
"expires_in"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence