TypeScript framework for agentic apps
One action.
Two callers.
Define a capability once. The agent calls it as a tool, your React code calls the same function, and both go through the same validation and permissions.
The agent does not click through the UI. The project states it plainly: it works through the same action layer the interface uses.
actions/hello.ts
Example from the projecthelloReceived as a tool, with the schema as its argument contract.
useActionQuery("hello", { name: "Alex" })Called from React, hitting the same implementation.
one definition underneath
defineAction({
description: "Return a friendly greeting.",
schema: z.object({ name: z.string() }),
run: async ({ name }) => ({ message: `Hello, ${name}!` })
})Code is condensed from the project's own example, not a benchmark or a product screenshot.
The same action is also exposed over HTTP, MCP, A2A and the CLI.