Query local XML documents using XPath and structured tools within a sandboxed, read-only environment.
Also known as sezzlee/mcp, xml, @sezzlee/xml-mcp
- Stars
- 1
- Tools
- 7
- Downloads, 30 days
- —
- Latest version
- 0.5.1
- Last commit
- Nov 13, 2026
- License
- MIT
What is Sezzlee XML MCP?
Sezzlee XML queries local XML documents using XPath and structured tools within a sandboxed, read-only environment. It exposes 7 tools, such as list_documents, describe_document, read_node.
Summary generated from the project's README
About Sezzlee XML MCP server
Sezzlee XML provides a sandboxed, read-only environment for querying local XML files. It is designed for developers who need to inspect structured data within files like .xml, .xsd, .svg, or .config. The server runs locally via Node.js on macOS, Linux, or Windows, and requires an absolute path to a root directory passed as a command line argument during setup.
Users interact with the server through specific tools such as select_xpath for executing XPath 1.0 expressions and project_records for converting repeated elements into rows and columns. It also includes tools for listing documents, describing structures, finding literal text, and performing aggregations like sums or averages. To maintain stability, the server uses a worker-based architecture where parsing occurs in a separate thread.
Performance is managed through a document cache that keeps a set number of files in memory. For very large files exceeding an 8 MiB resident ceiling, the server enters a chunked mode. In this state, certain tools like select_xpath and aggregate_document are unavailable, though project_records remains functional to allow continued data inspection.
Written from the project's README. Every use case is checked against a quote from it.
How to install Sezzlee XML MCP
Formats verified 10 Nov 2026Add to CursorAdd to GooseInstall Sezzlee XML MCP in Claude Code
$ claude mcp add xml -- npx -y @sezzlee/xml-mcpInstall Sezzlee XML MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"xml": {
"command": "npx",
"args": [
"-y",
"@sezzlee/xml-mcp"
]
}
}
}Install Sezzlee XML MCP in VS Code
.vscode/mcp.json
{
"servers": {
"xml": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@sezzlee/xml-mcp"
]
}
}
}Install Sezzlee XML MCP in VS Code CLI
$ code --add-mcp '{"name":"xml","type":"stdio","command":"npx","args":["-y","@sezzlee/xml-mcp"]}'Install Sezzlee XML MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"xml": {
"command": "npx",
"args": [
"-y",
"@sezzlee/xml-mcp"
]
}
}
}Install Sezzlee XML MCP in Codex
$ codex mcp add xml -- npx -y @sezzlee/xml-mcpInstall Sezzlee XML MCP in Codex config.toml
~/.codex/config.toml
[mcp_servers.xml] command = "npx" args = ["-y", "@sezzlee/xml-mcp"]
Install Sezzlee XML MCP in Gemini CLI
$ gemini mcp add -s user xml npx -- -y @sezzlee/xml-mcpInstall Sezzlee XML MCP in Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"xml": {
"command": "npx",
"args": [
"-y",
"@sezzlee/xml-mcp"
]
}
}
}Sezzlee XML MCP tools 7
Detected from the READMElist_documentsdescribe_documentread_nodefind_in_documentselect_xpathproject_recordsaggregate_document
| list_documents | — | |
| describe_document | — | |
| read_node | — | |
| find_in_document | — | |
| select_xpath | — | |
| project_records | — | |
| aggregate_document | — |
Automated checks
Ran Nov 13, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work
- Source repository linked and reachablesezzlee/mcp is public and reachablegithub.com/sezzlee/mcp ↗Pass
- Package names this repository as its source@sezzlee/xml-mcp names sezzlee/mcp as sourcenpmjs.com/package/@sezzlee/xml-mcp ↗Pass
- Build provenance (Sigstore attestation)Sigstore attestation for @sezzlee/xml-mcpnpmjs.com/package/@sezzlee/xml-mcp/v/0.5.1#provenance ↗Pass
- Open source license (OSI)MITspdx.org/licenses/MIT.html ↗Pass
- Commit or release in the last yearLast commit or release 2026-11-09github.com/sezzlee/mcp ↗Pass
- OpenSSF ScorecardNot checked
- Package name not close to a popular packageNo popular package one edit away from @sezzlee/xml-mcpPass
- No critical advisory in the package or its dependencies8 resolved dependencies checked; no critical advisoryosv.dev ↗Pass
- No hidden instructions to the model7 tool descriptions and the README read; no override phrases, credential paths or hidden charactersPass
- Destructive tools are labelledNo tool named like delete, drop or execPass
- Remote endpoint answers the MCP handshakeNot checked
README
View on GitHub@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.
{
"mcpServers": {
"xml": {
"command": "npx",
"args": ["-y", "@sezzlee/xml-mcp", "/path/to/xml/root"]
}
}
}
With Claude Code:
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
| Tool | What it does |
|---|---|
list_documents |
Lists readable XML documents under the root without parsing them |
describe_document |
Document element, every namespace with a stable alias, structure counts, repeated-element candidates, and an address read_node takes |
read_node |
A bounded, ordered slice of the tree as flat depth-first records |
find_in_document |
Literal text in text nodes, attribute values or both |
select_xpath |
One XPath 1.0 expression, exactly as written, with a typed result |
project_records |
A repeated element as rows and named columns, with a status per cell |
aggregate_document |
Counts, 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.
| Option | Default | Meaning |
|---|---|---|
documentCacheSize |
4 |
Documents kept resident in memory at once (1–64) |
maxConcurrentListings |
4 |
Concurrent list_documents calls |
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
pnpm turbo run build --filter=@sezzlee/xml-mcp
pnpm turbo run test --filter=@sezzlee/xml-mcp
pnpm 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.
Sezzlee XML MCP questions
How do I add Sezzlee XML MCP to Claude Code?
Run claude mcp add xml -- npx -y @sezzlee/xml-mcp in your terminal. Add --scope user to make it available in every project.
How do I add Sezzlee XML MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
What tools does Sezzlee XML MCP provide?
It exposes 7 tools, including list_documents, describe_document, read_node, find_in_document, select_xpath.
What file extensions can this server read?
The server supports .xml, .xsd, .xhtml, .svg, .csproj, .props, .targets, .config, and .resx.
How does the server handle very large XML files?
Documents exceeding the 8 MiB resident ceiling are read in a reduced-capability 'chunked' mode where select_xpath, find_in_document, and aggregate_document are unavailable.
Is the server capable of modifying my files?
No, the server is designed to be read-only and sandboxed to a single folder.