Sezzlee XML

io.github.sezzleePublished by GitHub account sezzleev0.5.1Updated Oct 24, 2026

Query local XML documents with XPath, paged and sandboxed to one folder. Read-only.

VerifiedSTDIODesktop onlyFiles & StorageData & Analytics

Overview

AI-generated overview

A local, read-only MCP server that lets an assistant list, inspect and query XML documents inside one sandboxed folder using XPath and structured projections.

What you can do
List readable XML documents under a configured root folder without parsing them, and describe a document's root element, namespaces and structure counts with a usable address for reading nodes. Read bounded, ordered slices of the document tree as flat depth-first records. Search literal text in text nodes, attribute values or both. Run a single XPath 1.0 expression and get a typed result. Project a repeated element into rows and named columns with a status per cell, and compute counts, distinct counts and optional sums and averages per group.
When to use it
Useful when an assistant needs to answer questions about local XML, XSD, XHTML, SVG, project or config files without loading whole documents into context, and when you want that access confined to one folder and read-only.
Requirements
Runs as a local stdio process via npx from the npm package @sezzlee/xml-mcp. Needs Node.js 22 or 24 on macOS (x64 or arm64), glibc Linux (x64 or arm64) or Windows x64. The absolute path of the XML root folder is passed as the only argument; there is no environment variable for it. Desktop only.
Before you install
Read-only and sandboxed to the given root folder, but the assistant can read any readable XML-family file under it, so point the root at a narrow directory. DOCTYPE declarations and unsupported encodings are refused before parsing. Documents over the 8 MiB ceiling switch to a reduced mode where XPath, text search and aggregation are unavailable. Memory use is a budget rather than a hard limit, so very large documents can crash the process.

Installation

In SourceWeft

  1. Open Sezzlee XML in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

@sezzlee/xml-mcp

A read-only, sandboxed MCP server that reads local XML documents. It builds on @sezzlee/file-core; it does not depend on @sezzlee/core and imports nothing from packages/lab/xml-lab.

Documentation: https://docs.sezzlee.app/docs/xml-mcp/introduction — a tutorial, task guides, and the tool, error-code and limit reference generated from this package.

Quick start

The root is the only argument, as an absolute path; there is no environment variable for it.

json
{  "mcpServers": {    "xml": {      "command": "npx",      "args": ["-y", "@sezzlee/xml-mcp", "/path/to/xml/root"]    }  }}

With Claude Code:

bash
claude mcp add xml -- npx -y @sezzlee/xml-mcp /path/to/xml/root

Readable extensions: .xml, .xsd, .xhtml, .svg, .csproj, .props, .targets, .config, .resx. An extension like .config is not a guarantee of XML — a parse error there is expected behavior. Requires Node.js 22 or 24 on macOS (x64, arm64), glibc Linux (x64, arm64) or Windows x64.

Tools

ToolWhat it does
list_documentsLists readable XML documents under the root without parsing them
describe_documentDocument element, every namespace with a stable alias, structure counts, repeated-element candidates, and an address read_node takes
read_nodeA bounded, ordered slice of the tree as flat depth-first records
find_in_documentLiteral text in text nodes, attribute values or both
select_xpathOne XPath 1.0 expression, exactly as written, with a typed result
project_recordsA repeated element as rows and named columns, with a status per cell
aggregate_documentCounts, distinct counts and, with numericMode: binary64, sums and averages per group

Every argument, error code and limit is listed in the reference.

A document over the 8 MiB resident ceiling is read in a reduced-capability chunked mode: select_xpath, find_in_document and aggregate_document are unavailable there, while project_records still works.

Configuration

createXmlMcpServer(root, options) takes two optional settings; the CLI always uses the defaults.

OptionDefaultMeaning
documentCacheSize4Documents kept resident in memory at once (1–64)
maxConcurrentListings4Concurrent list_documents calls
ts
createXmlMcpServer(root, {  documentCacheSize: 4,  maxConcurrentListings: 4,});

documentCacheSize (S) is the single knob; the worker pool's capacity is derived as W = 2S, and the invariant W >= 2S-1 is pinned by a test — the worker keeps a document alive while the store still holds it, so its map must fit every store entry plus the one being adopted. This is a budget, not enforcement: worker.resourceLimits bounds the JS heap, not WASM linear memory, so exceeding the budget is a process crash rather than a clean resource_limit error. Measured cost is 9.25-10.08x the source byte count, so roughly 81 MiB resident per document at the 8 MiB ceiling; the default S=4 is safe on the smallest supported host.

Rules

Parsing happens in the worker. The main process only ever holds a serializable handle; a WASM pointer never crosses the boundary. No disposal hook was needed on @sezzlee/file-core's document store because of this.

Layout follows the worker/host boundary. engine/ is the worker-side graph and never names host/ or tools/; model/ and primitives/ are the shared vocabulary between the two sides. index.ts, cli.ts, xml-worker.ts and server.ts stay at the root — the tarball entry point, bin, the CI tarball check and the ../package.json read respectively tie them there.

The worker entry never imports the host surface. src/xml-worker.ts only sees node:worker_threads, node:buffer, libxml2-wasm and a type-only protocol; a lint rule enforces this. A worker returns a code string, and the host side constructs the error object.

DOCTYPE is refused before parsing. The prolog scanner runs in the main process; doc.dtd is only the second check. Measured: XML_PARSE_NO_XXE does not block the internal DTD subset.

The worker's stdout never mixes into the parent's fd 1. It is isolated with stdout: true; on stdio MCP, a single stray line breaks JSON-RPC.

diag is off in production and cannot be turned on through an environment variable: it costs 24.9% and its raw report carries an engine pointer.

Unsupported encodings are refused before parsing. The prolog scanner applies the XML 1.0 Appendix F four-byte autodetection; the UCS-4 and EBCDIC families get unsupported_encoding. Measured: the previous scanner missed DOCTYPE in these families.

libxml2-wasm is pinned to exact 0.7.2. A caret would silently invalidate the F0-01 integrity record; the CI tarball checker enforces this.

Development

bash
pnpm turbo run build --filter=@sezzlee/xml-mcppnpm turbo run test --filter=@sezzlee/xml-mcppnpm turbo run check-types --filter=@sezzlee/xml-mcp

Run tests through Turbo, not pnpm --filter @sezzlee/xml-mcp test: the bare filter skips dependsOn: ["^build"].

A change to a tool's arguments, an error code or a limit changes the generated reference in apps/docs; run pnpm --filter @sezzlee/docs gen and commit the result, or pnpm turbo run validate --filter=@sezzlee/docs fails.

Large-document tests are opt-in and skipped by default; set SEZZLEE_XML_LARGE=1 to run them.

Source: packages/servers/xml-mcp/README.md at commit 2614421

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.5.1LatestOct 11, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts