Skip to content

Reproduce it

npm run bench regenerates this page's source, bench/RESULTS.md. Ids are seeded, so you'll get the same numbers.

Parley vs REST-style MCP — token benchmark ​

Tokenizer: o200k_base (gpt-tokenizer). Claude's tokenizer differs; the ratios are what matter. Both sides serve the same data. Ids are seeded, so runs are reproducible.

Total input counts what you pay for: each model turn re-reads the tool definitions plus the conversation so far (calls and results), and there's one final turn to answer.

Tool definitions in context every turn: REST MCP 761 tokens (11 tools) vs Parley 689 (4 generic tools + service briefs).

TaskCalls (REST → Parley)Total input: REST minified JSONREST pretty JSONParleySaved vs minifiedvs pretty
Reschedule a meeting (REST: search → free slots → update)3 → 13,8073,9621,55259%61%
Reschedule a meeting (REST: one outcome-level endpoint)1 → 11,6091,6301,5524%5%
Find vegan meals < 700 kcal and order four2 → 23,1763,6382,71415%25%
Read the full 60-item menu1 → 13,4524,5522,49928%45%
Skim the menu (first 30 items: REST limit=30, Parley budget=800)1 → 12,4673,0271,96520%35%
All tasks (CRUD reschedule row)12,90215,1798,73032%42%

Result tokens read, per task (minified REST → Parley): 316 → 129 · 62 → 129 · 462 → 308 · 1919 → 1095 · 932 → 558

What the model actually reads ​

Reschedule, REST CRUD (3 calls, pretty JSON) ​

json
[
  {
    "id": "e2",
    "title": "1:1 with Ana",
    "start": "2026-09-25T14:00:00Z",
    "end": "2026-09-25T14:30:00Z",
    "attendees": [
      "ana.ruiz@acme.co"
    ]
  }
]

{
  "day": "2026-09-27",
  "slots": [
    "2026-09-27T09:30:00Z",
    "2026-09-27T10:00:00Z",
    "2026-09-27T10:30:00Z",
    "2026-09-27T11:00:00Z",
    "2026-09-27T11:30:00Z",
    "2026-09-27T12:00:00Z",
    "2026-09-27T12:30:00Z",
    "2026-09-27T15:00:00Z",
    "2026-09-27T15:30:00Z",
    "2026-09-27T16:00:00Z",
    "2026-09-27T16:30:00Z",
    "2026-09-27T17:00:00Z",
    "2026-09-27T17:30:00Z"
  ]
}

{
  "id": "e2",
  "title": "1:1 with Ana",
  "start": "2026-09-27T09:30:00Z",
  "end": "2026-09-27T10:00:00Z",
  "attendees": [
    "ana.ruiz@acme.co"
  ],
  "updated": true
}

Reschedule, Parley (1 call, auto-commit) ​

✓ Move "1:1 with Ana" to 2026-09-27T09:30:00Z (receipt r_Fgb6EIWi) · undo until 2026-09-25T14:04:53Z
  ~ update event/e2.start: 2026-09-25T14:00:00Z → 2026-09-27T09:30:00Z
  > send ana.ruiz@acme.co — updated invite
  result:
    event: e2
    start: 2026-09-27T09:30:00Z

What the tokens don't show: the Parley agent acted only because the principal's grant allows low-risk, undoable changes, and it got back exactly what happened with a 24h undo window. In the auto-commit case the service chose the slot (the first free one), just like the REST outcome endpoint. An agent that wants to choose omits auto and gets three proposals instead.