End-to-End MCP Workflow
April 1, 2026 · View on GitHub
This tutorial walks from "nothing running" to "first connection, first eval, first error, first restart" using unified repl_* tools only. Use this as a copy-paste reference for agents.
Prerequisites
- MCP server started by your client (Cursor, OpenCode, Kilocode). See docs/starting-the-mcp.md if the MCP won't start.
- Either a Swank server already running (e.g.
(swank:create-server :port 4006 :dont-close t)), or use Step 0 to launch one automatically.
Step 0: Bootstrap — Launch a Swank Server (if needed)
If no Swank server is running, launch one via the swank_launch tool:
Tool: swank_launch
Arguments: { "port": 4006 }
This starts a child SBCL process with Swank and waits until the port is ready. Once it returns { "success": true }, proceed to Step 1.
Skip this step if you already have a Swank server on port 4006.
Step 1: Connect
Tool: repl_connect
Arguments: { "port": 4006 }
Or with explicit type and host:
Tool: repl_connect
Arguments: { "type": "swank", "host": "127.0.0.1", "port": 4006 }
Step 2: First Eval
Tool: repl_eval
Arguments: { "code": "(+ 1 2)" }
Expected: result "3" (or similar). If the tool requires user approval, the client will show an approval prompt; after approval, re-invoke with approval_request_id and approved: true as documented in AGENTS.md.
Step 3: Trigger an Error (e.g. buggy factorial)
Tool: repl_eval
Arguments: { "code": "(defun buggy-fact (n) (if (zerop n) 1 (* n (buggy-fact (1- n)))))" }
Then:
Tool: repl_eval
Arguments: { "code": "(buggy-fact -1)" }
This can enter the debugger (infinite recursion or error depending on implementation).
Step 4: Get Backtrace
Tool: repl_backtrace
Arguments: {}
Use the result to see stack frames and the error location.
Step 5: Get Restarts
Tool: repl_get_restarts
Arguments: {}
Note the index of the restart you want (e.g. ABORT).
Step 6: Invoke Restart
Tool: repl_invoke_restart
Arguments: { "restart_index": 0 }
(Use the index from the previous step; 0 is often ABORT.)
Step 7: Hot-Fix and Verify
Fix the code (e.g. add a base case) and compile:
Tool: repl_compile
Arguments: { "code": "(defun buggy-fact (n) (if (<= n 0) 1 (* n (buggy-fact (1- n)))))" }
Then eval again:
Tool: repl_eval
Arguments: { "code": "(buggy-fact 5)" }
Expected: "120" (or equivalent).
Summary
- Use only
repl_*tools after connecting:repl_connect,repl_eval,repl_backtrace,repl_get_restarts,repl_invoke_restart,repl_compile, etc. - Use
repl_*after connecting viarepl_connectorswank_connect; do not mix with rawswank_*in normal workflows. - See prompts/workflow-examples.md for more examples and AGENTS.md for approval and tool reference.