development
documentation
public
metaprogramming
AI
What is A self-modifying MCP server in ClojureScript enabling runtime tool creation and safe self-modification.?
MCP-PIF-CLJS is a Model Context Protocol (MCP) server written in ClojureScript that explores homoiconicity, introspection, and metaprogramming to enable runtime tool creation and safe self-modification capabilities. It allows models like Claude to create and execute new tools during runtime without restarting the server. It leverages Clojure's code-as-data philosophy, is designed to block dangerous operations, and all modifications are journaled and auditable.
Documentation
MCP-PIF-CLJS: A Self-Modifying MCP Server
A Model Context Protocol (MCP) server written in ClojureScript that explores homoiconicity, introspection, and metaprogramming to enable runtime tool creation and safe self-modification capabilities. It allows models like Claude to create and execute new tools during runtime without restarting the server. For example, tools for arithmetic can perform actual calculations, not LLM approximations based on pattern matching.
It leverages Clojure's code-as-data philosophy known as homoiconicity, is designed to block dangerous operations, and all modifications are journaled and auditable.
For easier use and distribution, you can create a .dxt package:
./package-dxt.sh
This creates mcp-pif-cljs.dxt which can be installed via drag-and-drop in Claude Desktop.
π οΈ Available Tools# Base Tools
memory-store - Store key-value pairs in memory
memory-retrieve - Retrieve stored values
journal-recent - View recent activity journal
server-info - Get comprehensive server information (all tools, state, statistics)
Meta-Programming Tools
meta-evolve - Create new tools at runtime
execute-tool - Execute any tool by name (including dynamic ones)
π‘ Example Usage# Basic Memory Storage
You: "Store my favorite programming language as ClojureScript"
Claude: I'll store that for you using the memory-store tool.
You: "What's my favorite programming language?"
Claude: Your favorite programming language is ClojureScript.
Creating Custom Tools
You: "I need a tool that calculates the area of a circle"
Claude: I'll create that tool for you using meta-evolve...
[Creates tool with code: (args) => Math.PI * args.radius * args.radius]
You: "What's the area of a circle with radius 5?"
Claude: The area is 78.54 square units.
The Dynamic Tool Workflow
Due to MCP client caching, newly created tools must be called via execute-tool:
Create a tool:
Use meta-evolve to create "multiply":
code: "(args) => args.x * args.y"
tool-type: "arithmetic"
Verify creation:
Use server-info
(You'll see "multiply [RUNTIME]" in the tools list)
Namespace Protection: Core namespaces cannot be modified
Activity Journal: All actions are logged and auditable
Session-Only: Changes don't persist between restarts
π§ͺ Development
npx shadow-cljs watch mcp-server
# Run tests
npm test
# Create .dxt package
./package-dxt.sh
Testing the Server
node test-clean-protocol.js
# Dynamic tools test
node test-dynamic-tools.js
π― Philosophy
This project explores the intersection of:
Homoiconicity: Code as data, data as code
Self-Reference: A system that can reason about itself
Controlled Evolution: Safe boundaries for self-modification
Human-AI Collaboration: AI proposes, human uses
π Roadmap
Completed:
Basic MCP server in ClojureScript
Runtime tool creation
Universal tool executor (workaround for client caching)
.dxt packaging support
In progress:
Tool composition (tools that use other tools)
Namespace evolution
Import capabilities from other MCP servers
Persistent tool storage
β οΈ Important Notes
Tool Persistence: Tools only exist while server is running
Client Caching: Use execute-tool to call runtime-created tools
Real Computation: Tools execute actual code, not LLM approximations
π€ Contributing
This is an experimental project exploring metaprogramming in the context of AI tools. Contributions that enhance self-modification capabilities or improve safety are welcome!
π License
MIT
"The significant problems we face cannot be solved at the same level of thinking we were at when we created them." - Einstein
This project asks: What if our tools could evolve their own thinking?