Agent / Expose, do not reimplement

Why have a contract at all?

A direct "LLM tool -> application code" integration tends to grow a second application by accident:

  • a tool handler reimplements a transition the UI already has;
  • the tool receives the whole Model because selecting a safe context is work;
  • fact Messages containing ids or timestamps become callable like intents;
  • each transport invents its own authorization and error mapping;
  • dispatching a Message is mistaken for finishing the operation;
  • WebMCP, MCP, A2A, and other integrations each grow their own schema and handler layer.

The agent contract fixes that by declaring two boundaries once:

information boundary
  "What may this agent know?"
        -> Surface / Projection

capability boundary
  "What may this agent cause?"
        -> selected application Messages

Everything after that is interpretation and transport.