One action contract. Every surface. A framework-agnostic TypeScript registry that keeps validation, execution, errors and retry semantics attached to one action, then exposes thin adapters around it.
const lookup = defineAction({
name: "lookup-lead",
input: z.object({ id: z.string() }),
output: z.object({ status: z.string() }),
run: async ({ id }) => db.leads.find(id)
})
registry.register(lookup)
// agent · MCP · HTTP · CLI → same action