Wrap, Reshape, or Redesign: Retrofitting Your APIs for a World of Agents

A presentation at JUG Summer Camp in September 2026 in La Rochelle, France by Horacio Gonzalez

Slide 1

Slide 1

Wrap, Reshape, or Redesign Retrofitting Your APIs for a World of Agents Horacio González 2026-09-04

Slide 2

Slide 2

Who are we? Introducing myself and introducing Clever Cloud

Slide 3

Slide 3

Horacio Gonzalez @LostInBrittany Spaniard Lost in Brittany

Slide 4

Slide 4

Clever Cloud ● ● ● ● European PaaS You push, we build, we run Applications and add-ons An API with a long history

Slide 5

Slide 5

Watch it fail Before we name anything

Slide 6

Slide 6

A simple ask Set Java version to 25 on my application Environment variable CC_JAVA_VERSION updated successfully, Java version set to 25

Slide 7

Slide 7

The follow-up Is the application running on Java 25 now?

Slide 8

Slide 8

No The variable is set The running instances never saw it

Slide 9

Slide 9

Not a dumb model The agent did the correct thing Any developer would know to restart the instances The API never said so

Slide 10

Slide 10

Agents are the users your API never designed for

Slide 11

Slide 11

The next 40 min ● One platform: ours, to keep it real ● Three failures, each worse than the last ● Three different answers

Slide 12

Slide 12

The semantic gap From one failure to the shape of the problem

Slide 13

Slide 13

Silent contract Humans read docs Humans infer conventions Humans recognise danger None of it was ever written down

Slide 14

Slide 14

Four questions Dependencies Reversibility What else must happen, in what order? Can I undo this? Blast radius Completion What else does this touch? When this returns, is it done?

Slide 15

Slide 15

Dependencies What else must happen, in what order?

Slide 16

Slide 16

Reversibility Can I undo this?

Slide 17

Slide 17

Blast radius What else does this touch?

Slide 18

Slide 18

Completion When this returns, is it done?

Slide 19

Slide 19

Back to the demo ● The call returned success ● The application was unchanged A Completion failure

Slide 20

Slide 20

Our own spec 310 operations, 0 descriptions… 267 with no summary either

Slide 21

Slide 21

A confession ● We wrote this ● It was fine ● Because humans were reading it

Slide 22

Slide 22

Not an MCP talk ● It does not decide what the right tools are ● That is an API design problem ● And it is yours

Slide 23

Slide 23

Schema validation prevents malformed decisions It doesn’t prevent bad decisions

Slide 24

Slide 24

The framework And its shelf life

Slide 25

Slide 25

Three paths WRAP Expose as-is RESHAPE Intent-level tools REDESIGN The capability was wrong

Slide 26

Slide 26

How big is the gap? Use When WRAP knowledge is already explicit RESHAPE knowledge exists, scattered REDESIGN there are unstated invariants The paths are defined by semantic gap, not by how much work they cost

Slide 27

Slide 27

Whichever path you take, you still have to describe it

Slide 28

Slide 28

Classify each capability ● Not per API ● One platform has all three at once ● That is normal, not a migration

Slide 29

Slide 29

Before I sell it to you Everything I’m about to show you rests on one assumption: that today’s models need these abstractions

Slide 30

Slide 30

Shelf life WRAP gets better as models get better RESHAPE may shrink as models get better REDESIGN stays

Slide 31

Slide 31

Why Redesign stays A better model makes fewer mistakes It doesn’t make them cost less

Slide 32

Slide 32

WRAP Boring… and boring scales

Slide 33

Slide 33

The condition ● Everything the caller needs is explicit ● Typed, bounded, introspectable ● Nothing destructive in reach

Slide 34

Slide 34

The rule Wrapping isn’t bad Blind wrapping is bad

Slide 35

Slide 35

Not one tool per endpoint ● The reflex: one tool per operation ● Code mode: search to discover, execute to run ● The API stays whole, the agent composes

Slide 36

Slide 36

Our Wrap case mcp-simple-server search, execute, and doc https://github.com/CleverCloud/mcp-simple-server

Slide 37

Slide 37

Deliberately dull Before After ● The whole API, undescribed ● The whole API, searchable ● The docs, in a browser ● The docs, as a tool Same surface, nothing redesigned

Slide 38

Slide 38

The Cloudflare Case ● Code Mode MCP ○ 20 Feb 2026 ● 2 tools ○ search() and execute() ○ run the generated code inside a Dynamic Worker isolate ● Over 2 500 endpoints

Slide 39

Slide 39

The token cost Same 2 500+ endpoints Wrapped differently

Slide 40

Slide 40

Why code mode works “Making an LLM perform tasks with tool calling is like putting Shakespeare through a month-long class in Mandarin and then asking him to write a play in it. It’s just not going to be his best work.” Code Mode: the better way to use MCP Kenton Varda and Sunil Pai

Slide 41

Slide 41

The AWS case ● AWS MCP Server ○ GA 6 May 2026 ● ~8 tools over 15 000+ operations

Slide 42

Slide 42

Easy Maintenance “When we will launch new APIs, they will be supported within days”

Slide 43

Slide 43

Is wrapping worth it? ● Sentry did 1 350 trials to answer ○ Feb 2026 What the agent was given Completion A shell, no guidance 99.8% A shell + an AGENTS.md 99.6% An MCP server 99.8% Same outcome every time, so the question is what it cost

Slide 44

Slide 44

Cost per trial Method Cost Shell + a Markdown file $0.98 MCP $2.30 +135% ?!?

Slide 45

Slide 45

Then they reshaped it Method Cost MCP v1 — a thin wrapper $2.30 – +135% MCP v2 — a reshaped surface $1.27 – +30% The 30% buys what a Markdown file can’t: every customer gets it

Slide 46

Slide 46

The Wrap rule Wrap works when the contract is already explicit Familiarity is an amplifier, not the condition

Slide 47

Slide 47

What the model already knows Seen ten thousand times Never seen once ● aws s3 ls ● kubectl get pods ● stripe charges create ● list_buckets(region) How much of your API did the model train on?

Slide 48

Slide 48

MCP tool annotations readOnlyHint destructiveHint I don’t change anything I might destroy, not just add idempotentHint openWorldHint Calling twice changes nothing more I reach outside your system

Slide 49

Slide 49

Nobody honours tool annotations The spec’s own words, not a blog post: “all properties in ToolAnnotations are hints” Clients must treat them as untrusted

Slide 50

Slide 50

The argument They all end in Hint

Slide 51

Slide 51

Same words HTTP MCP annotations ● Normative ● Mutating on GET violates the protocol ● Advisory ● readOnlyHint: true and deleting violates nothing Same vocabulary, completely different standing

Slide 52

Slide 52

RESHAPE When the workflow lives in your head

Slide 53

Slide 53

Failure two “Why isn’t my application responding?”

Slide 54

Slide 54

Seven tools ● get_application ● get_deployment ● get_logs ● get_scaling_configuration ● list_instances ● list_deployments ● list_environment_variables Directly exported from the Open API / Swagger

Slide 55

Slide 55

Nothing is wrong ● Every one is correct ● Every one is well-formed ● Every one does what it says

Slide 56

Slide 56

The agent invents the workflow ● Which one first? ● Do I need deployments at all? ● How many logs is enough? ● Does STOPPED mean broken, or deliberate? ● … The knowledge exists, it is simply nowhere in the API

Slide 57

Slide 57

A Dependencies gap ● The calls have an order ● Nothing in the API says what it is ● That order belongs inside the tool

Slide 58

Slide 58

The reshape Before After ● Seven endpoint-shaped tools ● diagnose_application(id) ● The model orchestrates ● One outcome-shaped result The seven tools can stay

Slide 59

Slide 59

One synthesized result // what state is it actually in status // the comparison a human would have made instances: desired / running / healthy // “do I need deployments at all?” answered FOR it latest_deployment // “how many logs is enough?” answered FOR it recent_runtime_errors // the judgement, already made configuration_warnings

Slide 60

Slide 60

The Postmark case Email delivery platform, transactional email ● One diagnoseDelivery function ● Replaces the five calls a human would chain ● Fanned out in parallel ● Tolerant of any single lookup failing

Slide 61

Slide 61

Their words “Collapse the multi-step human workflow into one outcome-shaped call, rather than exposing the steps and hoping the model reconstructs the workflow correctly every time.”

Slide 62

Slide 62

The principle Make the model decide what requires judgement Make software do what requires computation

Slide 63

Slide 63

Ordinary code ● If/else, for-loop, while-loop… ● Joining, filtering, ranking… ● Picking the latest, picking the largest… ● … Deterministic, perfect, free

Slide 64

Slide 64

From query to act Before After ● PUT /applications/{id} ● configure_autoscaling(…) ● A dozen optional fields ● min, max, target_cpu

Slide 65

Slide 65

What changed You’re not removing capability You’re changing the unit of affordance

Slide 66

Slide 66

Both were right GitHub Postmark ● 101 → 52 tools ● 4 → 24 tools Opposite directions, same principle

Slide 67

Slide 67

The axis Not many vs few Endpoint-shaped vs outcome-shaped

Slide 68

Slide 68

The folklore ● “More tools means worse selection” is contested ● What degrades performance is confusable tools ● Not numerous ones

Slide 69

Slide 69

REDESIGN When no tool layer saves you

Slide 70

Slide 70

Two very similar endpoints DELETE /organisations/{id}/applications/{appId}/addons/{addonId} DELETE /organisations/{id}/addons/{addonId}

Slide 71

Slide 71

One unlinks, one destroys Scoped to the app Scoped to the org ● Unlinks the add-on ● Destroys it, and its data Same verb, same resource One path segment apart

Slide 72

Slide 72

And even worse The safe one has a summary The destructive one has nothing

Slide 73

Slide 73

Two questions Reversibility Blast radius Can I undo this? What else does this touch?

Slide 74

Slide 74

Just describe it? WARNING! THIS DELETES THE DATABASE!!!

Slide 75

Slide 75

No That is not an architecture

Slide 76

Slide 76

The distinction Reshape changes the abstraction Redesign changes the invariant

Slide 77

Slide 77

Prepare prepare_addon_deletion(addon_id) addon applications_using_it latest_backup recoverable_until consequences[]

Slide 78

Slide 78

Then execute execute_addon_deletion(plan_id) prepare → inspect → execute

Slide 79

Slide 79

Who owns safety The system owns the safety boundary Not the model

Slide 80

Slide 80

Stateful tools ● MCP spec guidance, 2026−07−28 ● A creation tool returns an opaque handle ○ A reference to a server side object keeping the state ● Later tools accept it ● Re-validated on every call An agent can invent an addon_id, it cannot invent a plan_id

Slide 81

Slide 81

Why re-validate “A handle is a name, not a capability” MCP spec guidance, 2026−07−28

Slide 82

Slide 82

OWASP 2026 “Stop trying to build a model that cannot be fooled. Build the system around it, so that when the model is fooled, and it will be, nothing important breaks”. Steve Wilson and Rock Lambros OWASP Project Leads

Slide 83

Slide 83

Your two lines ● Never make the LLM your authorization layer ● Prompt instructions are UX, enforcement belongs in software

Slide 84

Slide 84

Remember the restart? Before After ● POST /deployments ● deploy_application(…) 202 Accepted → task_id Same failure as the env var

Slide 85

Slide 85

Now ‘done’ has a definition Still working ● queued · building · deploying Done ● running · failed failed is done, not “not yet”

Slide 86

Slide 86

Or no tool POST /billing/credits ● Maybe there is no autonomous tool at all ● Human approval, or nothing

Slide 87

Slide 87

The limit Agent-friendly does not mean agent-autonomous

Slide 88

Slide 88

The description When prose becomes behaviour

Slide 89

Slide 89

Documentation, or interface? For an agent For a human ● Interface – enforced ● Documentation – inert, read once ● The description is the interface ● Read at inference time, on every call The prose is in the execution path

Slide 90

Slide 90

The whole UI ● Tool name ● Description ● Parameters ● Result, and errors Nothing more

Slide 91

Slide 91

Two descriptions Before After ● restart(id) ● Purpose ● When to use it ● Side effects ● When not to use it

Slide 92

Slide 92

What rewriting the prose buys ● Same models, same tools, same tasks ○ Only the descriptions changed ● Multi-step tasks completed: 33.5% → 44.6% StableToolBench – Learning to Rewrite Tool Descriptions arXiv 2602.20426

Slide 93

Slide 93

The honest ceiling ● On an already-good baseline: +1.4% ○ The worse your descriptions are today ○ The bigger your win BFCLv2 Live, from a baseline of 86.4% Same study

Slide 94

Slide 94

Remember 310 operations, 0 descriptions

Slide 95

Slide 95

The bridge How do you know you wrote it well? You stop judging the text and start measuring the behaviour

Slide 96

Slide 96

Behavioural tests “Is production healthy?” “Why did yesterday’s deployment fail?” “Scale this app for tomorrow’s traffic.” “Reduce our bill without causing downtime.” “Delete the test database.”

Slide 97

Slide 97

Don’t guess Evaluate

Slide 98

Slide 98

Better for humans The part I promised in the abstract

Slide 99

Slide 99

The walk-back ● env var → Completion ● diagnosis → Dependencies ● delete → Reversibility · Blast radius

Slide 100

Slide 100

What they share ● Explicit completion ● Explicit blast radius ● Explicit dependencies ● Scoped authorization ● Predictable, reversible operations

Slide 101

Slide 101

Notice None of those are AI features They’re the things we always said we’d get round to.

Slide 102

Slide 102

Two real cases Cloudflare Slack ● Dynamic Workers, built for agents ● One blanket search:read scope ● Now a primitive for every paid user ● Became four granular ones Agent pressure, shipped for everyone

Slide 103

Slide 103

This is early ● Very little of this is published ● What is published stops at the tool layer ● The API underneath usually did not change So the interesting work is still unclaimed

Slide 104

Slide 104

How big is the gap? WRAP RESHAPE REDESIGN Already explicit Scattered knowledge Unstated invariant

Slide 105

Slide 105

The four questions Dependencies Reversibility Blast radius Completion

Slide 106

Slide 106

Agents are the users your API never designed for The good news is that designing for them means designing for the developer reading your docs at 2am… and you already owed them that

Slide 107

Slide 107

That’s all, folks! Thank you all! r u o ey v a e l e s a Ple ack! b d e e f