Structural editing MCP server for Emacs Lisp, Scheme, and Common Lisp
31 tools with complete JSON Schema input definitions and descriptions. Naming follows verb_noun pattern consistently (structural_*). Descriptions are present but vary in quality (avg ~120 chars, below 194-char baseline). Most parameters have type+description, but many lack constraints (enums, ranges, patterns). Output schemas are not documented. Error handling is minimal, no recovery guidance or categorization. Security: write/destructive operations lack confirmation patterns. Composition is strong, tools chain well via symbol/path parameters. STDIO transport caps protocol score at 50.
Validate a whole structural Lisp file. Pass semantic=true for deep validation.
Validate a complete top-level node without saving.
Analyze a file for unused symbols, unresolved calls, and arity mismatches.
Paredit barf: eject the last form from a list.
Return byte positions START:END for a named top-level form.
Symbols called directly from a definition's body across PATH.
Find all callers of a symbol. PATH may be a file, directory, or glob.
Output schemas not documented. LLMs cannot plan downstream tool calls or extract structured data from results. Every tool lacks return type documentation.
Destructive/write operations (structural_remove, structural_replace, structural_flatten) lack confirmation or dry-run patterns. Agents can accidentally delete code without preview.
Parameter descriptions lack constraints. 'depth' and 'symbol' parameters have no min/max, regex, or enum guidance. LLMs may pass invalid values (negative depth, empty symbol).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Complete missing closing parens of an s-expression.
Return outline plus full text of each top-level form.
Convert between let and let* bindings.
Map git changes since REF to touched symbols (and optional blast radius).
Evaluate using native tool (emacs byte-compile, sbcl --script, guile -s). Requires LISP_SITTER_ENABLE_EVAL=1 or true.
Source + callers + callees for a symbol across PATH.
Extract a sub-expression into a new function.
List MISSING tokens and ERROR nodes in a Lisp file as reported by tree-sitter. Use this to locate missing parentheses or other structural problems without reading the whole file.
Inline all call sites of a function with its body and remove the definition. PATH may be a file, directory, or glob for project-wide flatten.
Re-indent a file (depth-based, 2-space indent).
Return the full text of a named top-level form.
Transitive callers (blast radius) of a symbol across PATH.
Insert a complete top-level form after __start__, __end__, or a symbol name. Pass write=true to save; without it returns the updated file content (or a diff when diff=true).
Instrument a form's body with tracing (--with for body, --at/--wrap for sub-expressions).
Move a top-level form after another symbol, __start__, or __end__.
Paredit raise: promote a sub-expression over its enclosing list.
Remove a top-level form. Use --keep-calls to leave call sites as-is.
Rename a top-level form and its call sites. PATH may be a file, directory, or glob for project-wide rename.
Replace one top-level form with complete new text. Pass write=true to save; without it returns the updated file content (or a diff when diff=true).
Paredit slurp: absorb the next form into a list.
Paredit splice: dissolve a wrapper list in place.
Replace a sub-expression inside a named form.
Outline of top-level forms. Set depth > 1 for sub-form navigation. Set all=true to include non-definition forms (require, provide, setq, …).
Wrap the body of a form in a construct (progn, let, if).
Error handling is absent. No recovery guidance, categorization (retryable vs fatal), or actionable error messages. LLMs cannot self-correct on failures.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are missing. Clients cannot infer safety properties without reading descriptions.