It's your data. Use it however you want.

lastTMS.ai is the TMS stripped to what it actually is: your freight data, served raw. REST, SQL, webhooks, and an MCP server on top so your agents can run freight and render their own interface.

agent session — claude ▸ last-tms MCP · streamable http

no app mounted

run a prompt — the agent fetches data and the host mounts the tool's interface here

log entries are simulated. the app panel is a real sandboxed iframe running an MCP-App-style document — view its source.

Your process isn't the problem.

Every TMS onboarding starts the same way: your team learns someone else's screens, renames its workflow after someone else's menus, and files feature requests that die in a queue. The software wins. You adjust.

lastTMS.ai inverts the deal. We run the freight database, the rails, and the domain logic. You decide what the software looks like, or whether it looks like anything at all.

The TMS is a database.
Loads, rates, carriers, documents, invoices: modeled by people who broker freight, hosted and versioned by us.
The API is the product.
Every screen we could have built is an endpoint instead. Nothing is held back for the "premium UI".
The interface is optional.
Use ours, build yours, or let your agents render their own — live, in the conversation.

Everything the TMS knows, addressable.

SurfaceWhat you getDetail
REST Every entity, every event OpenAPI 3.1 · idempotent writes
SQL Read replicas you can point BI at Postgres wire · row-level grants
WEBHOOKS Every state change, pushed signed · at-least-once
EXPORT Your entire history, any time parquet / csv · no exit fee
MCP The server your agents connect to streamable http · OAuth
api.lasttms.ai
$ curl api.lasttms.ai/v1/loads?status=uncovered

{
  "loads": [
    { "id": "LD-4827",
      "lane": "Chicago, IL → Dallas, TX",
      "pickup": "2026-08-01",
      "status": "UNCOVERED" },
    { "id": "LD-4831", … }
  ]
}

A TMS your agents can operate.

last-tms is an MCP server with every operation a broker does exposed as a typed tool. Point Claude at it — or the harness you built yourself.

  • loads.searchfind freight by lane, status, date, margin
  • loads.createbook a shipment from structured or messy input
  • loads.tenderoffer a load to a carrier, get an answer
  • rates.quoteprice a lane from live history
  • carriers.matchrank carriers for a load by lane history
  • carriers.scoreon-time, claims, margin — per carrier
  • tracking.subscribefollow a load; get called back on events
  • documents.getrate cons, BOLs, PODs — as data
  • invoices.postbill the moment the POD lands
  • analytics.margin_by_carrierwho makes you money, who costs you
tools/list · loads.search
{
  "name": "loads.search",
  "description": "Search loads by lane, status, dates",
  "inputSchema": {
    "type": "object",
    "properties": {
      "status":       { "type": "string" },
      "pickup_after": { "type": "string" }
    }
  },
  "_meta": { "ui": { "resourceUri": "ui://lasttms/load-board" } }
}
↑ this line is the point. keep reading.

Your TMS ships its own interface.

MCP Apps is the official MCP extension for interactive interfaces. When a tool declares a ui:// resource, the host fetches it and mounts it in a sandboxed iframe, right in the conversation. The app calls tools back through the host. The model sees what changed.

That demo at the top of the page isn't a video. It's three MCP-App-style documents in real sandboxed iframes, speaking JSON-RPC over postMessage.

  1. tools/callthe agent runs a tool
  2. ui://lasttms/load-boardthe tool's declared interface
  3. sandboxed iframemounted by the host, in-conversation
  4. tools/call ⟲the app acts; the model sees it

The interface travels with the data

renders today in Claude · Claude Desktop · VS Code Copilot · Microsoft 365 Copilot · Goose · Postman · any MCP Apps host. read the spec →

One database. Any surface you want.

The same loads.search that feeds an agent feeds your ops app and your Slack alerts. Build the workflow your floor actually runs, instead of renaming your process after our menus.

IN AN AGENT

Cover LD-4827 before 5pm. Don't go over $2,000.

▸ tools/call carriers.match · loads.tender

LD-4827 · CHI → DAL TENDERED Ozark Carriers · $1,930
IN YOUR OPS APP
ops.yourbrokerage.com
IN A WORKFLOW

#dispatch · tms-bot

LD-4831 still uncovered — picks up Aug 2, Atlanta → Charlotte.

[ tender to Prairie Express · $660 ]

Raw access, governed.

SCOPED KEYS
Per team, per entity, per verb. A pricing agent that can quote but never tender.
ROW-LEVEL GRANTS
SQL replicas enforce the same policy as the API. No side door.
AUDIT LOG
Every read, every write, every tool call. Attributable, exportable.
SIGNED WEBHOOKS
Verify the sender, replay-safe, at-least-once delivery.
SANDBOXED BY DESIGN
MCP Apps render in host-controlled iframes. The host gates every tool call the app makes.
NO LOCK-IN
Bulk export is always on. It's your data — leave whenever you want.

Built by brokers. Opened for agents.

lastTMS.ai runs on the same rails as Sunnybrook TMS, the platform brokers already clear real freight on.

NETWORK$1B+ combined revenue across Sunnybrook brokerages
CADENCE10+ platform enhancements shipped weekly
INTEGRATIONStypically live in about 7 days
ORIGINbuilt by brokers, for brokers. Now for their agents.

Stop onboarding. Start building.

Get keys, point your agent at the MCP server, and have a load board in the conversation this afternoon.