evolveLABSCO SUMMARY
The model writes its own tools, inside a box it cannot break out of.
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.
What it is
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.
What you get
- 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
Requirements
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.
Setup effort
Follow the published steps — cabal build
USE CASES
Giving the model exact arithmetic instead of guessed arithmetic
Send an inline lambda to run and get a computed answer back, rather than a number the model produced by predicting one.
Building up a small vocabulary for the task at hand
evolve registers each helper by name; later calls reference it as a string, so a multi-step problem gets decomposed once and reused.
Having a tool inspect another tool's definition
code_of returns a tool's source as quoted data, so a tool can count the operations in another one or transform it before evaluating.
Seeing what this session has already defined
list shows the registry, which is the only place evolved tools exist — worth checking before defining a name twice.
Looking up a primitive without leaving the conversation
help returns the documentation for a category of primitives, so the model can check the shape of a fold instead of guessing at it.
4 tools
Listed in project docs. Your client may show a different list.
runlisthelpBEFORE YOU INSTALL
What to know first
Tools you get
4 tools named in the project's documentation. evolve creates new tools stored in the registry and run executes them, so a session's registry grows. Names like quote, eval and fold are primitives inside code you pass, not tools.
Requires
cabal build
INSTALLATION
Connect your client
Server setup
Build the project
cabal buildEnable debug mode for detailed evaluation tracing
MCP_DEBUG=1 cabal run mcp-pifMCP Clients
Run the server
cabal run mcp-pif