Odile Labs
REMOTE · ODILELABS.COM · SCANNED SEP 25
Odile Make reformats video and photos for social. Receptionist benchmark and prices need no sign-in.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security89
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability70
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 1834 tokens (~203/item across 9 items; 9 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management7
- Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 9 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the Odile Labs MCP server?
Odile Labs is a hosted endpoint at https://odilelabs.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · odilelabs.com
claude mcp add --transport http com-odilelabs-odile 'https://odilelabs.com/mcp'
{
"mcpServers": {
"com-odilelabs-odile": {
"url": "https://odilelabs.com/mcp"
}
}
} {
"servers": {
"com-odilelabs-odile": {
"type": "http",
"url": "https://odilelabs.com/mcp"
}
}
} [mcp_servers.com-odilelabs-odile] url = "https://odilelabs.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-odilelabs-odile": {
"type": "remote",
"url": "https://odilelabs.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-odilelabs-odile --url 'https://odilelabs.com/mcp' --transport streamable-http
mcp_servers:
com-odilelabs-odile:
url: "https://odilelabs.com/mcp" {
"McpServers": {
"com-odilelabs-odile": {
"Transport": "http",
"Url": "https://odilelabs.com/mcp"
}
}
} assistant mcp add com-odilelabs-odile -t streamable-http -u 'https://odilelabs.com/mcp'
{
"mcpServers": {
"com-odilelabs-odile": {
"type": "http",
"url": "https://odilelabs.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 24 Sept 26 +2
- Tool “create_media_job” rewrote its description, which is the text the model reads security
- Tool “estimate_media_job” rewrote its description, which is the text the model reads security
- Tool “get_balance” rewrote its description, which is the text the model reads security
- Tool “get_catalog” rewrote its description, which is the text the model reads security
- Tool “get_downloads” rewrote its description, which is the text the model reads security
- Tool “get_job” rewrote its description, which is the text the model reads security
- Tool “get_receptionist_benchmark” rewrote its description, which is the text the model reads security
- Tool “prepare_upload” rewrote its description, which is the text the model reads security
- Tool “unlock_job” rewrote its description, which is the text the model reads security
- Schema quality: pass → fail ▼ functional
- Tool coverage: 21% → 100% ▲ functional
- Stability: unverified → 0.03 ▲ functional
- Schema quality: good → excellent functional
- “create_media_job” reworded the description of “outputs” cosmetic
- “create_media_job” reworded the description of “trim” cosmetic
- “estimate_media_job” reworded the description of “kind” cosmetic
- “estimate_media_job” reworded the description of “outputs” cosmetic
- “estimate_media_job” reworded the description of “photo_count” cosmetic
- “get_downloads” reworded the description of “job_id” cosmetic
- “get_job” reworded the description of “job_id” cosmetic
- “get_receptionist_benchmark” reworded the description of “include_evidence” cosmetic
- “get_receptionist_benchmark” reworded the description of “line_id” cosmetic
- “get_receptionist_benchmark” reworded the description of “scenario_id” cosmetic
- “prepare_upload” reworded the description of “kind” cosmetic
- “unlock_job” reworded the description of “job_id” cosmetic
- “unlock_job” reworded the description of “max_credits” cosmetic
- 23 Sept 26 +39
- Transport: unverified → pass ▲ security
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Authorization: Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. security
- MCP protocol: unverified → pass ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- First check of Schema quality: fail functional
- First check of Destructive annotations: pass functional
- First check of Tool coverage: 21 functional
- First check of Schema quality: pass functional
- First check of Schema quality: good functional
- 22 Sept 26 36
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 25 Sept 2026 · Probed https://odilelabs.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=odilelabs.com | CN=WE1,O=Google Trust Services,C=US | 5 Sept 2026 | 4 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | 85394aa62e1c0b0ebf1a6c31ea8fde |
| SANs: odilelabs.com, api.odilelabs.com, *.api.odilelabs.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of odilelabs.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| odilelabs.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer realm="OAuth", resource_metadata="https://odilelabs.com/.well-known/oauth-protected-resource/mcp"
Bearer realm="OAuth", resource_metadata="https://odilelabs.com/.well-known/oauth-protected-resource/mcp" Protected resource metadata
| Document | https://odilelabs.com/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://odilelabs.com/mcp |
| Authorisation server | https://odilelabs.com |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://odilelabs.com/mcp | Verified | 200 | |
| http (plaintext) | http://odilelabs.com/mcp | HTTPS enforced | 301 | https://odilelabs.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
create_media_job Start a formatting job ~181
Queue an Odile Formats job from sources uploaded with prepare_upload's helper. Costs nothing: credits are only spent by unlock_job, after the customer approves. One set of uploads makes exactly one job: calling it again with the same sources returns the existing job (replayed: true) whatever outputs, fit or trim are passed, so to render different outputs, upload again with prepare_upload. Needs a signed-in connection with write access. Returns at once with the job (same shape as get_job) plus replayed and next; poll get_job until state is ready.
| Name | Type | Req | Description |
|---|---|---|---|
| outputs | array | yes | 1 to 4 outputs; one finished file per entry. |
| sources | array | yes | Source keys printed by the upload helper |
| trim | object | – | Video only: keep just this part of the source. Omit to use the whole video. |
No output schema declared.
No examples provided.
estimate_media_job Estimate credits for a job ~239
Price an Odile Formats job in credits before anything is uploaded or charged; use it to tell the customer the cost and get their approval before unlock_job. Needs no sign-in and changes nothing. Photos are priced exactly. Reel, Feed and Square video outputs cost exactly 1 credit each; YouTube 16:9 costs 1 or 2 because the length is only known once the file is read. Returns { minimum_credits, maximum_credits, final_price_known, charge_now: 0, why }. An unknown preset or a photo count out of range returns an error naming the valid values (get_catalog lists them).
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | yes | 'video' for one video file, 'photos' for a set of still images. |
| outputs | array | yes | 1 to 4 output preset names from get_catalog.presets (video presets for kind video, photo presets for kind photos); one finished file per preset. |
| photo_count | integer | – | Required when kind is 'photos' (the call fails without it): how many source photos, 1 to 10. Must be omitted when kind is 'video'. |
No output schema declared.
No examples provided.
get_balance Credit balance ~108
The signed-in customer's Odile Formats credit balance. Use it before unlock_job to check the job is affordable, or when the customer asks what they have left. Needs a signed-in connection; takes no arguments and changes nothing. Returns { account, credits (whole number, 0 when empty), next_expiry ({ at: epoch milliseconds, credits } for the next credits to lapse, or null), buy_credits_at }. This connection cannot buy credits: send the customer to buy_credits_at.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_catalog Odile Formats: what it does and what it costs ~174
The live price list and limits for Odile Formats, which reformats an existing video or photos for social platforms (it does not pick clips, write captions or edit). Call it first, before estimate_media_job or prepare_upload, to learn the preset and fit names, the file limits and the job flow. Needs no sign-in, takes no arguments and changes nothing. Returns { currency, packs[{id, credits, cents}], free_credits_per_account, credits_valid_months, buy_credits_at, purchasable_through_this_connection: false, units, presets{video[], photos[]} (preset name strings), fits[] (fit name strings), limits{video_source_bytes, photo_source_bytes, max_source_photos, max_trim_seconds}, flow[] }. Prices are read from the same source the website charges from.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_downloads Download links for an unlocked job ~176
Signed download links for every finished file of a job, once unlock_job has succeeded for it. Use it as the last step of the flow, and again whenever links have expired. Needs a signed-in connection and changes nothing. Returns { job_id, files[{name, preset, bytes, width, height, duration, url, expires_at}], how }. Each link works for 15 minutes and needs no login: fetch the files with curl (see how) rather than reading them into the conversation, or, without a shell, give the customer the links to open. Files are kept for 30 days. A job that is not unlocked returns an error with its state and cost; call unlock_job first.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | The id (UUID) of a job on this account that unlock_job has already unlocked. |
No output schema declared.
No examples provided.
get_job Job status ~207
One Odile Formats job by id, or the ten most recent when no id is given. Use it to poll a job after create_media_job (every 10-20 seconds, up to 10 minutes) until state is ready or failed; if it is still rendering after that, tell the customer and check again later (nothing is charged until unlock_job). Needs a signed-in connection and changes nothing. Returns one job { job_id, kind, state (queued | rendering | ready | failed), error, unlocked, credits_cost, credits_cost_known, credits_spent, outputs[{name, preset, ready, bytes, duration}], created_at, updated_at }, or { jobs[] } of the same shape. credits_cost is final only once credits_cost_known is true. An id that is not on this account returns 'No such job'.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | – | The job id (UUID) returned by create_media_job. Omit to list the ten most recent jobs. |
No output schema declared.
No examples provided.
get_receptionist_benchmark Published receptionist benchmark: real test calls, scored in public ~381
Odile Labs' published benchmark of AI phone receptionists: real test calls placed to public lines, scored against stated measures. Use it when someone asks how AI receptionists actually handle calls, or to compare named products; call it with no arguments first, then filter. Needs no sign-in and changes nothing. Returns { source, date, calls, minutes, run_by, limitations, fairness_note, scenarios[{id,name,brief}], lines[{id, vendor, business, kind, answers_as, list_price, ranked, points, possible, by_scenario{<scenario_id>:{points, possible, answered, first_words_s, ai_disclosed_unprompted, reply_language, price_quoted, measures}}}], read_more }. An unknown line_id or scenario_id returns an error listing the valid ids. Vendor-run by Odile Labs (which sells After Hours and Dusklin), not independent; it does not test the caller's own line or set up a receptionist (for that, see read_more.free_line_check).
| Name | Type | Req | Description |
|---|---|---|---|
| include_evidence | boolean | – | Default false: each scenario's measures come back as strings like 'yes: <measure>'. true: measures come back as [{measure, score (0 or 1), evidence (quoted transcript)}] (much longer output). |
| line_id | string | – | Only this tested line, e.g. 'afterhours-plumbing', 'afterhours-vet', 'rosie', 'myaifrontdesk' or 'dialzara'. Omit for every line. |
| scenario_id | string | – | Only this scenario: 'emergency' (leak after hours), 'booking' (book a slot), 'price' (price probe), 'disclosure' (are you real?) or 'spanish' (caller in Spanish). Omit for all. |
No output schema declared.
No examples provided.
prepare_upload Get ready to upload source files ~173
Step one of an Odile Formats job: returns a 30-minute upload token and the helper command. Run the helper in a shell on the customer's machine: file bytes go straight to Odile and never enter this conversation. The helper prints the source keys to pass to create_media_job. Needs a signed-in connection with write access; nothing is charged. Returns { kind, upload_token, expires_at, helper_url, run[], accepts, part_size, note }. One video OR up to ten photos per job. Each call mints a new token; earlier tokens stay valid until their own expiry.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | yes | 'video' to upload one MP4 or MOV (up to 500 MB, 10 minutes); 'photos' to upload 1 to 10 JPEG, PNG or WebP files. |
No output schema declared.
No examples provided.
unlock_job Spend credits to unlock a finished job ~195
Spends the customer's credits to unlock a finished job's files. Only call once get_job says the job is ready and the customer has approved a maximum spend. Refuses, charging nothing, if the job costs more than max_credits, is not ready, or the balance is short (the error says which, with the amount needed). A job that is already unlocked comes back as it is, with no charge and no balance or max_credits check. Needs a signed-in connection with spend access. Returns the job (same shape as get_job, with unlocked: true) plus credits_left and next: 'get_downloads'.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | The id (UUID) of a ready job on this account. |
| max_credits | integer | yes | The most the customer agreed to spend on this job, 1 to 100 credits. The unlock is refused, charging nothing, if the job costs more. |
No output schema declared.
No examples provided.
What is the Odile Labs MCP server?
Odile Labs is an MCP server listed in the public MCP registry as com.odilelabs/odile. Odile Make reformats video and photos for social. Receptionist benchmark and prices need no sign-in. This page covers its hosted endpoint (https://odilelabs.com/mcp).
Is the Odile Labs MCP server safe to use?
Odile Labs scores 77 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Odile Labs MCP server expose?
Odile Labs exposes 9 tools: get_receptionist_benchmark, get_catalog, estimate_media_job, get_balance, get_job, and 4 more. Their descriptions and schemas cost roughly 1,834 tokens of context every time the server is loaded.
Does the Odile Labs MCP server require authentication?
Yes. Odile Labs asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the Odile Labs MCP server still maintained?
Odile Labs is still listed as active in the MCP registry. We last reached this channel on 25 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.