
TCL UDF
STDIOTCL execution server with namespace-based tool management via Model Context Protocol.
TCL execution server with namespace-based tool management via Model Context Protocol.
A Model Context Protocol (MCP) server that enables AI agents to execute TCL scripts and manage MCP tool ecosystems. Built with safety and developer experience in mind.
# Install and run (safe mode with Molt runtime) cargo install tcl-mcp-server tcl-mcp-server # Or build from source git clone https://github.com/cyberdione/mcp-tcl-udf-server cd mcp-tcl-udf-server cargo build --release ./target/release/tcl-mcp-server # OPTIONAL: Build with full unsafe TCL runtime (requires system TCL installation) # cargo build --release --features tcl
Choose between two TCL runtime implementations:
# Add external MCP servers tcl-mcp-server mcp add claude-flow "Claude Flow" -- npx claude-flow@alpha mcp start # List all servers tcl-mcp-server mcp list # Test connectivity tcl-mcp-server mcp ping claude-flow
Tools are organized using a namespace system with MCP-compatible naming:
bin__tcl_execute
- Execute TCL scriptsuser__alice__utils__reverse_string
- User-created toolsmcp__context7__get_library_docs
- External MCP server toolsDefault (Read-only mode)
tcl-mcp-server
Privileged Mode (Save/store scripts)
tcl-mcp-server --privileged # or use the admin wrapper tcl-mcp-server-admin
# Execute TCL directly tcl-mcp-server run tcl_execute '{"script": "expr {2 + 2}"}' # List available tools tcl-mcp-server list # Get tool information tcl-mcp-server info tcl_execute # Manage MCP servers tcl-mcp-server mcp add my-server "My Server" -- node server.js tcl-mcp-server mcp remove my-server
Claude Desktop
{ "mcpServers": { "tcl": { "command": "/path/to/tcl-mcp-server", "args": ["--runtime", "molt", "--privileged"] } } }
Claude Code
claude mcp add tcl /path/to/tcl-mcp-server
bin__tcl_execute
- Execute TCL scripts
{ "script": "set x 5; set y 10; expr {$x + $y}" }
bin__list_tools
- List available tools
{ "namespace": "user", "filter": "utils*" }
docs__molt_book
- Access TCL documentation
{ "topic": "basic_syntax" }
sbin__tcl_tool_add
- Create custom tools
{ "user": "alice", "package": "utils", "name": "reverse_string", "version": "1.0", "description": "Reverse a string", "script": "return [string reverse $text]", "parameters": [ { "name": "text", "description": "Text to reverse", "required": true, "type_name": "string" } ] }
sbin__mcp_add
- Add MCP servers programmatically
{ "id": "context7", "name": "Context7 Server", "command": "npx", "args": ["@modelcontextprotocol/server-everything"], "auto_start": true }
The server supports two TCL runtime implementations that must be selected at compile time:
# Build with Molt runtime only (recommended) cargo build --release # The resulting binary uses Molt by default ./target/release/tcl-mcp-server
# Build with full TCL runtime (requires system TCL installation) cargo build --release --no-default-features --features tcl # The resulting binary uses full TCL ./target/release/tcl-mcp-server
# Build with both runtimes available (maximum flexibility) cargo build --release --features molt,tcl # Select runtime at startup ./target/release/tcl-mcp-server --runtime molt # Safe mode ./target/release/tcl-mcp-server --runtime tcl # Complete mode
When built with multiple runtimes, you can choose at startup:
# Command line selection tcl-mcp-server --runtime molt # Safe: Molt runtime tcl-mcp-server --runtime tcl # Unsafe: Full TCL runtime # Environment variable export TCL_MCP_RUNTIME=molt tcl-mcp-server # Priority: CLI args > Environment > Default (Molt)
For Molt Runtime (default):
For TCL Runtime:
# Ubuntu/Debian sudo apt-get install tcl-dev # macOS brew install tcl-tk # Windows # Install TCL from https://www.tcl-lang.org/software/tcltk/
The build process automatically generates convenience wrappers:
# Generated during build ./target/release/tcl-mcp-server-admin # Privileged mode ./target/release/tcl-mcp-server-molt # Force Molt runtime ./target/release/tcl-mcp-server-admin-molt # Privileged + Molt ./target/release/tcl-mcp-server-ctcl # Force TCL runtime ./target/release/tcl-mcp-server-admin-ctcl # Privileged + TCL
# Basic server tcl-mcp-server mcp add my-server "My Server" -- node server.js # With environment variables tcl-mcp-server mcp add my-server "My Server" \ --env "NODE_ENV=production" \ --env "API_KEY=secret" \ -- node server.js # Custom timeout and retry settings tcl-mcp-server mcp add my-server "My Server" \ --timeout-ms 60000 \ --max-retries 5 \ -- node server.js
# List all servers tcl-mcp-server mcp list # Detailed view tcl-mcp-server mcp list --detailed # Server details tcl-mcp-server mcp info my-server
# Manual connection tcl-mcp-server mcp connect my-server # Test connectivity tcl-mcp-server mcp ping my-server # Disconnect tcl-mcp-server mcp disconnect my-server # Remove server tcl-mcp-server mcp remove my-server
⚠️ Use with caution
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ AI Agent ├────►│ MCP Server ├────►│TCL Executor │
│ (Claude) │ │ (JSON-RPC) │ │ (Molt) │
└─────────────┘ └──────────────┘ └─────────────┘
│
▼
┌─────────────┐
│ MCP Manager │
│ (External │
│ Servers) │
└─────────────┘
tcl-mcp-server run sbin__tcl_tool_add '{ "user": "dev", "package": "math", "name": "fibonacci", "version": "1.0", "description": "Calculate Fibonacci number", "script": "proc fib {n} { if {$n <= 1} {return $n} else {return [expr {[fib [expr {$n-1}]] + [fib [expr {$n-2}]]}]} }; return [fib $n]", "parameters": [ { "name": "n", "description": "Number to calculate Fibonacci for", "required": true, "type_name": "integer" } ] }'
tcl-mcp-server run user__dev__math__fibonacci '{"n": 10}'
Query runtime capabilities for intelligent code generation:
tcl-mcp-server run tcl_runtime_info '{ "include_examples": true, "category_filter": "safe" }'
Runtime Feature Comparison:
Feature | Molt Runtime | TCL Runtime |
---|---|---|
Memory Safety | ✅ Rust-based, memory-safe | ⚠️ C-based, manual memory management |
File I/O | ❌ Blocked for security | ✅ Full file operations |
System Commands | ❌ No exec or system calls | ✅ Complete system integration |
Networking | ❌ No socket operations | ✅ Full network capabilities |
Performance | ⚡ Fast startup, low overhead | 🐌 Slower startup, higher memory usage |
Compatibility | 📚 Core TCL subset | 🔧 Full TCL language + extensions |
Use Cases | Data processing, algorithms, safe scripting | System administration, complex applications |
Documentation | Molt Book | TCL Documentation |
FROM rust:1.70 as builder WORKDIR /app COPY . . RUN cargo build --release FROM debian:bookworm-slim COPY /app/target/release/tcl-mcp-server /usr/bin/ COPY /app/target/release/tcl-mcp-server-admin /usr/bin/ CMD ["/usr/bin/tcl-mcp-server"]
# Run the test suite ./scripts/run_mcp_tests.sh # Test specific functionality python3 tests/test_bin_exec_tool_mcp.py
Server configurations are stored in platform-appropriate locations:
~/.local/share/tcl-mcp-server/
~/Library/Application Support/tcl-mcp-server/
%APPDATA%\tcl-mcp-server\
Server won't start
# Check runtime availability tcl-mcp-server --runtime molt --privileged # Enable debug logging RUST_LOG=debug tcl-mcp-server
MCP server connection fails
# Test connectivity tcl-mcp-server mcp ping server-id # Check server logs TCL_MCP_DEBUG_STDERR=1 tcl-mcp-server
Tool not found
# List available tools tcl-mcp-server list # Check specific namespace tcl-mcp-server list --namespace user
MIT License - see LICENSE file for details