# Odile Labs (remote · odilelabs.com)

Odile Make reformats video and photos for social. Receptionist benchmark and prices need no sign-in.

- Trust score: 77/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-25

## Components

- remote · `odilelabs.com`: 77/100 (this document), [markdown](https://verifymcp.io/servers/com-odilelabs-odile/odilelabs.md), [page](https://verifymcp.io/servers/com-odilelabs-odile/odilelabs)

## Channel facts

- Endpoint: `https://odilelabs.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.1.0`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-25.

- **Endpoint Security**: 89/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - 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.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 70/100
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 7/100
  - Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 9 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### 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.

### Claude

```bash
claude mcp add --transport http com-odilelabs-odile 'https://odilelabs.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-odilelabs-odile": {
      "url": "https://odilelabs.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-odilelabs-odile": {
      "type": "http",
      "url": "https://odilelabs.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-odilelabs-odile]
url = "https://odilelabs.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-odilelabs-odile": {
      "type": "remote",
      "url": "https://odilelabs.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-odilelabs-odile --url 'https://odilelabs.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-odilelabs-odile:
    url: "https://odilelabs.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-odilelabs-odile": {
      "Transport": "http",
      "Url": "https://odilelabs.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-odilelabs-odile -t streamable-http -u 'https://odilelabs.com/mcp'
```

### Other

```json
{
  "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.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-25 (score 77, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-24 (score 77, +2)

- [security] 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
- [functional regression] Schema quality: pass → fail
- [functional improvement] Tool coverage: 21% → 100%
- [functional improvement] Stability: unverified → 0.03
- [functional] Schema quality: good → excellent
- [cosmetic] “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”

### 2026-09-23 (score 75, +39)

- [security improvement] Transport: unverified → pass
- [security improvement] 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.
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] 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

### 2026-09-22 (score 36)

First indexed and scored.

## MCP tools (9)

### `get_receptionist_benchmark` (~381 tokens)

Published receptionist benchmark: real test calls, scored in public

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).

Input parameters:

- `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.

### `get_catalog` (~174 tokens)

Odile Formats: what it does and what it costs

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.

### `estimate_media_job` (~239 tokens)

Estimate credits for a job

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).

Input parameters:

- `kind` (string, required): 'video' for one video file, 'photos' for a set of still images.
- `outputs` (array, required): 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'.

### `get_balance` (~108 tokens)

Credit balance

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.

### `get_job` (~207 tokens)

Job status

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'.

Input parameters:

- `job_id` (string): The job id (UUID) returned by create_media_job. Omit to list the ten most recent jobs.

### `get_downloads` (~176 tokens)

Download links for an unlocked job

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.

Input parameters:

- `job_id` (string, required): The id (UUID) of a job on this account that unlock_job has already unlocked.

### `prepare_upload` (~173 tokens)

Get ready to upload source files

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.

Input parameters:

- `kind` (string, required): 'video' to upload one MP4 or MOV (up to 500 MB, 10 minutes); 'photos' to upload 1 to 10 JPEG, PNG or WebP files.

### `create_media_job` (~181 tokens)

Start a formatting job

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.

Input parameters:

- `outputs` (array, required): 1 to 4 outputs; one finished file per entry.
- `sources` (array, required): Source keys printed by the upload helper
- `trim` (object): Video only: keep just this part of the source. Omit to use the whole video.

### `unlock_job` (~195 tokens)

Spend credits to unlock a finished job

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'.

Input parameters:

- `job_id` (string, required): The id (UUID) of a ready job on this account.
- `max_credits` (integer, required): 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.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-odilelabs-odile/odilelabs#diagnostics

## Score history

- 2026-09-25: 77
- 2026-09-24: 77
- 2026-09-23: 75
- 2026-09-22: 36

## Common questions

### 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.

## Links

- Remote endpoint: https://odilelabs.com/mcp
- Repository: https://github.com/tolga-boop/odile-mcp
- Website: https://odilelabs.com/developers
- Changelog RSS feed: https://verifymcp.io/servers/com-odilelabs-odile/odilelabs.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-odilelabs-odile/odilelabs.json
- HTML version of this page: https://verifymcp.io/servers/com-odilelabs-odile/odilelabs
