evolve turns a JSON expression into a callable tool, run executes it, and code_of hands a tool's source back so one tool can analyse another. Every evaluation is pure and fuel-bounded — no file access, no network, no runaway recursion — and an evolved tool cannot create new tools, which is the line that keeps the self-modification from going anywhere unbounded.
A JSON-native lambda calculus exposed over MCP. Instead of a fixed set of functions or an open shell, the model composes tools from a small vocabulary of primitives and registers them, and every evaluation is pure and bounded.
- evolve — create a new tool from a JSON lambda expression and store it in the registry
- run — execute a registered tool, or an inline lambda, against an input
- list — show every tool currently registered
- help — documentation for the primitives and the system tools, by category
- A primitive vocabulary covering lambda abstraction and application, arithmetic, comparison, logic, conditionals, lists, pairs and folds
- Metaprogramming primitives: quote holds code as data, eval executes quoted code, code_of returns another tool's source for analysis
- Continuation-style recursion for work too deep for direct recursion, with each step handed back to the client
- Inputs are normalised on the way in — quoted numbers, quoted booleans and JSON strings are coerced before evaluation
Built from source with a Haskell toolchain and run as a local process over stdio. No account, no key, no network call. The metaprogramming stops at the server boundary: the primitives, the parser and the evaluation strategy are fixed at runtime, and a tool created through evolve cannot itself create further tools.
