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 MessagesEverything after that is interpretation and transport.