Inline Sign in

Inline for a company that makes software

01 · ALREADY HAPPENING

Someone already pointed an agent at your API.

Not a pilot you signed off on — a customer's own integration. One key with every permission you offer, no record of what it called. When it goes wrong, it lands in your support queue, not theirs.

THEIR CONFIG full access

customer-integration/.env

API_KEY=sk_live_4f8c1a9e2b7a…

scope: read · write · delete — everything you expose

YOUR INBOX #4471

"your API did something weird"

"not sure which key it was, but a subscription got cancelled and nobody here did it."

— opened by a customer's ops lead

This is the status quo today, whether or not you ship anything.

02 · HAND OVER THE FILE YOU HAVE

You already maintain the fix.

The OpenAPI description that powers your own docs. Nothing to build, nothing new to host, no protocol to learn — hand it over as it is.

payments-api.yaml 1.6 MB · OpenAPI 3.1

412 operations found

You choose which are reachable. The rest simply aren't.

  • GET/subscriptions/{id}
  • GET/customers/{id}
  • POST/subscriptions/{id}/upgrade
  • POST/subscriptions/{id}/items
  • DELETE/customers/{id}
  • POST/payouts

4 of 412 exposed

03 · SHIP THE JOBS

Ship the jobs, not the endpoints.

Your customers don't want 412 operations — they want the handful of jobs they actually do. Built on top of what you exposed, named plainly.

TOOLupgrade_plan

Move a customer to a bigger plan, within limits you set.

POST /subscriptions/{id}/upgrade

TOOLcheck_subscription

Look up a subscription and who it belongs to.

GET /subscriptions/{id} · GET /customers/{id}

TOOLupdate_seat_count

Change how many seats a plan bills for.

POST /subscriptions/{id}/items

This is your product's agent surface — designed by you, not guessed at separately by every customer who tries.

01 · YOUR API

How many operations are in your OpenAPI spec?

Most vendors don't know until they parse it. Ours ran 412.

THE RACE

Same request. Watch the gap.

Both get: “Set up Northwind as a new client and let them know.”

The first time

done

It doesn't know your process yet.

customers.search(name: "Northwind")
✕no match — wrong system
deals.get(name: "Northwind")
✓found, second try — the signed deal

“Standard plan or the custom one? Who owns it?”

nobody answers — guesses: standard
gmail.send(to: client, "You are all set!")
✓sent
stripe.subscriptions.create(plan: "standard")
✓account opened — after the email

missed steptold before it existed · checklist never started

Every time after

done

One call. Five steps. In order.

new_client_onboarding(client: "Northwind")
  1. 01account opened
  2. 02plan read from the signed dealcallModel
  3. 03client told
  4. 04onboarding ticket opened
  5. 05logged to the record

opened → read → told → started → logged — in that order

A capable assistant, not a dumb one — it just hadn't been taught yet. Both panes loop from the same starting line; the pacing is illustrative, not a benchmark.

YOU CORRECT IT — ONCE
“Open the account on the plan they signed, then start the onboarding, then tell the client — in that order. Never a custom plan over £200 a month without me.”
becomes
▸new_client_onboarding

Say it once, in plain language.

Inline turns what you just said into a named tool your assistant can call — the order, and the £200 line, built in.

Not faster once. Right every time — for you, and for everyone else on the team who runs it next.

02 · THE FIRST CORRECTION

What's the one instruction you'd give it first?

The thing support already explains by hand, every time.

ACT III · 01

A chat window is a rectangle for words.

Some jobs don't fit inside one — and you've been on one side of all four of these, with a person or with a bot.

asks

“Paste the full text of the invoice below.”

INV-2291 · Qty 14 · Net 30 · Remit to: Acme Ltd · line 1 of 40…
asks

“Which customer do you mean? Reply with a number, 1 to 200.”

you: 47? or maybe 74 — hard to tell from a list of numbers
asks

“Type APPROVE to continue.”

you: APPROVE
returns

the result, as a wall of JSON

{"status":"ok","id":"ch_9k2f01","amount":24000,"currency":"usd","customer":{"id":"cus_88q4",…

None of this is a bug. It's just the wrong shape for these four jobs — and it's a little humiliating for both sides, every single time.

ACT III · 02

So the tool brings its own screen.

An MCP app is a small interface a tool carries with it. The assistant opens it mid-answer, right there in the conversation — you use it, and the answer carries on.

assistant opens a panel sandboxed · inside this chat
a drop zone, not a paste
search, not “reply 1–200”
fields, not free text
a table, not a JSON wall

You describe the tool once; the panel is built for you — nobody on your team hand-codes this screen.

ACT III · 03

The case that matters most: approvals.

Anything over the line you've drawn stops and waits for a person. This is the screen they answer it on — not a wall of text to parse under pressure.

waiting on you req_8841
purchase order $240.00
requested by
reorder-bot
supplier
Acme Ltd · #47
reason
stock below reorder point
signed in as mara@northwind written down either way

One credential per person, never a shared key — so the record says who decided, not just what happened.

03 · NEEDS MORE THAN A REPLY

Which of your flows needs a real screen, not a chat message?

SHIP IT · 01

Publish once. Customers install it on their own.

Your tools become a versioned package — a name, a version, who built it, what it touches. Every customer who installs it gets their own copy, running independently of the rest.

close_the_ticket v2.1.0

Published by you

Northwind Retail v2.1.0
Fieldstone Co. v2.1.0
Ledger Ops v2.1.0
Harbor & Vine v2.1.0

Examples of the shape, not a live directory — publishing and installing are real, a browsable store like this isn't, yet. A version doesn't change once it's out; yank it later and new installs stop seeing it, while every customer already running it keeps going.

SHIP IT · 02

It runs on their account. Never on yours.

When a customer installs your tools, they bind them to their own Stripe, their own Zendesk, their own Gmail — signed in as themselves. You never hold their credentials and you never see their data.

Northwind Retail their login
their Zendesk their Stripe
Fieldstone Co. their login
their Zendesk their Gmail
Ledger Ops their login
their Stripe their Gmail

Three separate customers, three separate accounts, none of them touching each other or touching you. What crosses from you to them is the tool's steps — nothing that runs is a copy of your systems, and nothing that runs writes back to yours.

SHIP IT · 03

Every customer gets this, and you didn't write a line of it.

This is the part you'd otherwise be building yourself: identity, limits, a record, a ceiling on spend, and a way to answer "what did your API just do." It comes with the install.

One login per person

Never a shared key. Remove one person from their team and every agent running as them stops that same instant.

Limits they set themselves

Read-only, or read-and-write but never delete. Anything past the line they drew doesn't run quietly — it waits for a person.

A record of every call

Written down as it happens, arguments redacted before storage — not a summary assembled afterward from whatever's left.

A cap on spend

A runaway assistant stops at a number the customer set, not at the invoice — the failure mode moves from money to a paused agent.

Support that can see what happened

"Your API did something weird" turns into a line you can both look at — same call, same timestamp, same arguments — instead of a ticket neither side can reproduce.

04 · WHAT YOUR CUSTOMERS WILL ASK FOR

Once it's running on their account, what will they want proof of?

Pick as many as apply — their security team won't stop at one.

ACT IV · 01

One line. Every key obeys it.

A person sets the ceiling once — read and write, never delete, say. From then on every key issued under it holds to it, whoever built the tool and however the tool describes itself.

out of reach
delete customers
drop table
wire transfer
the ceiling · set once, by a person
allowed
read orders
write draft
list rows

Checked on every call, not at connection time — a key that behaved yesterday can't creep past the line today.

ACT IV · 02

Anything above it waits.

Not refused. Not failed. Held — pending a person. The agent doesn't error out and it doesn't guess a workaround. It asks, and then it carries on.

held req_8841
requested
delete → 14 rows, customers
by agent
reorder-bot
under key
mara@northwind · agent key 04
ceiling
write, never delete
approved luis · 41s later → the call carries on

The wait is the whole point — most readers have never considered that a governed agent has a third option besides succeed or fail.

ACT IV · 03

And all of it is written down.

Live, as it happens — not a log you go digging for later. Arguments have credential-looking values removed before anything is stored, and the database deletes each record after a set time — 365 days today — rather than leaving that to a promise.

live arguments redacted before storage
time agent · key call outcome ms
09:41:02 reorder-bot · key 04 delete → customers held → approved, luis 612
09:38:17 digest-bot · key 01 read → inbox ok 84
09:35:55 cleanup-bot · key 07 drop table → invoices refused · above ceiling 3
09:12:40 sync-bot · key 02 write → project page refused · key revoked 2

You can hand agents real work because you can see all of it — and stop any of it.

Run a company on other people's software too? There's a version of this for that.