# compare-xml
A toolkit for **structured XML comparison** — find what changed between two XML documents, with control over how keys, values, and arrays are matched.
> Online playground: **[comparexml.com](https://comparexml.com)**
## Why
Most XML diff tools either output unstructured text or hide the parts that matter (where an element was added, whether an array differs in order or in content). `compare-xml` parses XML into a structured representation and returns a list of differences — every entry carries a path, the side it belongs to (`base` / `contrast` / `both`), and the kind of change (`added`, `deleted`, `valueChanged`) — so you can render, filter, or program against it.
## Features
- **Deep comparison** of XML elements, attributes, arrays, and text values.
- **Three array comparison strategies**: `byIndex` (default), `lcs` (minimal diff via Longest Common Subsequence), and `unordered` (multiset match).
- **Case-insensitive** key and/or value matching.
- **Path tracking** with both segment-array and dot-notation forms.
- **CLI** with table or JSON output, reading from inline strings or files.
- **MCP server** built in — drop the CLI into any MCP-aware AI assistant.
- **Agent Skill** — a single skill that works in Claude Code, OpenAI Codex CLI, and OpenCode.
- Full **TypeScript** types.
## Packages
This is a pnpm workspace:
| Package | Description |
|---------|-------------|
| [`@compare-xml/core`](./packages/compare-xml-core) | Core comparison library (programmatic API). |
| [`@compare-xml/cli`](./packages/compare-xml-cli) | Command-line tool & MCP server, built on top of `core`. |
| [`compare-xml-vscode`](./apps/compare-xml-vscode) | VSCode extension: aligned diff view + difference navigator. |
## Quick Start
### Library
```bash
npm install @compare-xml/core
```
```typescript
import { compareXML } from '@compare-xml/core';
const differences = compareXML({
baseXML: 'Alice30',
contrastXML: 'Bob30bob@test.com',
});
// [
// { pathString: 'user.name', pathBelongsTo: 'both', diffType: 'valueChanged', ... },
// { pathString: 'user.email', pathBelongsTo: 'contrast', diffType: 'added', ... },
// ]
```
See the [core README](./packages/compare-xml-core/README.md) for the full API.
### CLI
```bash
npm install -g @compare-xml/cli
compare-xml base.xml contrast.xml
```
```
┌──────────────┬──────────────┐
│ Key │ Change Type │
├──────────────┼──────────────┤
│ (Base) a │ valueChanged │
│ (Base) b │ deleted │
│ (Contrast) c │ added │
└──────────────┴──────────────┘
```
Use `--json-export` for machine-readable output, or `--mcp` to launch as an MCP server. See the [CLI README](./packages/compare-xml-cli/README.md) for all flags and the MCP tool schema.
### MCP
```json
{
"mcpServers": {
"compare-xml": {
"command": "npx",
"args": ["@compare-xml/cli@latest", "--mcp"]
}
}
}
```
### Skill
A single [`SKILL.md`](./skills/compare-xml/SKILL.md) teaches AI coding assistants how to invoke the CLI on demand. The file follows the open [Agent Skills](https://github.com/anthropics/skills) format and works across Claude Code, OpenAI Codex CLI, OpenCode, Cursor, and 50+ others.
The fastest install is [`npx skills`](https://github.com/vercel-labs/skills) — it auto-detects every agent you have installed and drops the skill into each one:
```bash
npx skills add unitstack/compare-xml
```
## Development
Requires Node.js ≥ 20 and pnpm.
```bash
# install dependencies
pnpm install
# build all packages
pnpm -r build
# run tests across the workspace
pnpm -r test
# lint
pnpm -r lint
```
The repo layout:
```
apps/
└── compare-xml-vscode/ # VSCode extension
packages/
├── compare-xml-core/ # @compare-xml/core — library
├── compare-xml-cli/ # @compare-xml/cli — CLI + MCP server
└── internal/ # shared eslint/tsconfig (not published)
skills/
└── compare-xml/ # SKILL.md for Claude Code / Codex CLI / OpenCode
```
## License
MIT