Validates XML instances against SDC4 XSD schemas using two-tier error classification and schema-aware XML/JSON conversion.
Also known as SemanticDataCharter/sdcvalidator
- Stars
- 1
- Tools
- 3
- Downloads, 30 days
- 2,536
- Latest version
- 4.6.3
- Last commit
- Nov 10, 2026
- License
- Apache-2.0
What is sdcvalidator MCP?
sdcvalidator validates XML instances against SDC4 XSD schemas using two-tier error classification and schema-aware XML/JSON conversion. It exposes 3 tools, such as validate_instance, validate_and_report, check_schema_compliance.
Summary generated from the project's README
About sdcvalidator MCP server
Validating SDC4 XML instances against XSD schemas is what this server enables for developers working with Semantic Data Charter standards. It provides a specialized validation engine that distinguishes between structural errors that require rejection and semantic errors that can be reported or recovered. This distinction allows for more nuanced data processing where a record might remain partially usable even if certain values fail type or pattern checks.
Users interact with the server via a stdio connection using the uvx command. The server provides specific tools including validate_instance for basic pass/fail checks, validate_and_report for detailed two-tier error breakdowns, and check_schema_compliance to ensure XSD files follow SDC4 principles by using restriction instead of extension. It also handles schema-aware conversions between XML and JSON formats. This setup is ideal for AI agents that need to verify data integrity without needing to import the underlying Python library directly.
What you can do with it
- 1Verify SDC4 schema complianceCheck if an XSD schema follows SDC4 principles by ensuring it only uses restriction and not extension.
- 2Classify XML validation errorsDistinguish between structural errors that necessitate rejection and semantic errors that can be reported.
- 3Perform schema-aware data conversionConvert data between XML and JSON formats while maintaining awareness of the underlying schema.
- 4Recover from semantic data errorsIdentify unusable values and insert an ExceptionalValue so the rest of the record remains usable.
Written from the project's README. Every use case is checked against a quote from it.
How to install sdcvalidator MCP
Formats verified 10 Nov 2026Add to CursorAdd to GooseInstall sdcvalidator MCP in Claude Code
$ claude mcp add sdcvalidator -- uvx sdcvalidatorInstall sdcvalidator MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"sdcvalidator": {
"command": "uvx",
"args": [
"sdcvalidator"
]
}
}
}Install sdcvalidator MCP in VS Code
.vscode/mcp.json
{
"servers": {
"sdcvalidator": {
"type": "stdio",
"command": "uvx",
"args": [
"sdcvalidator"
]
}
}
}Install sdcvalidator MCP in VS Code CLI
$ code --add-mcp '{"name":"sdcvalidator","type":"stdio","command":"uvx","args":["sdcvalidator"]}'Install sdcvalidator MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"sdcvalidator": {
"command": "uvx",
"args": [
"sdcvalidator"
]
}
}
}Install sdcvalidator MCP in Codex
$ codex mcp add sdcvalidator -- uvx sdcvalidatorInstall sdcvalidator MCP in Codex config.toml
~/.codex/config.toml
[mcp_servers.sdcvalidator] command = "uvx" args = ["sdcvalidator"]
Install sdcvalidator MCP in Gemini CLI
$ gemini mcp add -s user sdcvalidator uvx -- sdcvalidatorInstall sdcvalidator MCP in Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"sdcvalidator": {
"command": "uvx",
"args": [
"sdcvalidator"
]
}
}
}sdcvalidator MCP tools 3
Detected from the READMEvalidate_instancevalidate_and_reportcheck_schema_compliance
| validate_instance | — | |
| validate_and_report | — | |
| check_schema_compliance | — |
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 reachablesemanticdatacharter/sdcvalidator is public and reachablegithub.com/semanticdatacharter/sdcvalidator ↗Pass
- Package names this repository as its sourceNot checked
- Build provenance (Sigstore attestation)Sigstore attestation for sdcvalidatorpypi.org/project/sdcvalidator/ ↗Pass
- Open source license (OSI)Apache-2.0spdx.org/licenses/Apache-2.0.html ↗Pass
- Commit or release in the last yearLast commit or release 2026-11-10github.com/semanticdatacharter/sdcvalidator ↗Pass
- OpenSSF ScorecardNot checked
- Package name not close to a popular packageNo popular package one edit away from sdcvalidatorPass
- No critical advisory in the package or its dependencies3 resolved dependencies checked; no critical advisoryosv.dev ↗Pass
- No hidden instructions to the model3 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 GitHubsdcvalidator
SDC4 structural validator — a thin wrapper over xmlschema with two-tier error classification.
What it does
- Validates XML instances against SDC4 XSD schemas
- Classifies errors into structural (Tier 1: reject) vs semantic (Tier 2: report)
- Checks SDC4 schema compliance (no
xsd:extension— onlyxsd:restriction) - Strict validation by default — catches invalid restriction derivations (wrong element names, type mismatches) at schema load time
- Converts between XML and JSON using schema-aware conversion
Install
pip install sdcvalidator
Or from source:
git clone https://github.com/SemanticDataCharter/sdcvalidator.git
cd sdcvalidator
pip install -e .
Python API
from sdcvalidator import SDC4Validator, ErrorTier
# Validate an XML instance (strict mode by default)
validator = SDC4Validator("my_schema.xsd")
result = validator.validate("my_instance.xml")
if result.is_valid:
print("Valid!")
else:
for err in result.structural_errors:
print(f"STRUCTURAL: {err.reason}")
for err in result.semantic_errors:
print(f"SEMANTIC: {err.reason}")
Validation modes
The validation parameter controls how strictly the XSD schema itself is checked when loaded:
'strict'(default) — RaisesXMLSchemaParseErrorif the schema contains invalid restriction derivations (e.g., element names that don't match the base type). This is the recommended mode.'lax'— Silently collects schema derivation errors without raising. Use only for pre-existing schemas known to have issues.'skip'— Skips schema-level validation entirely.
# Explicit lax mode for legacy schemas
validator = SDC4Validator("legacy_schema.xsd", validation='lax')
Schema compliance checking
from sdcvalidator import validate_sdc4_schema_compliance, assert_sdc4_schema_compliance
# Check if a schema uses xsd:extension (not allowed in SDC4)
is_valid, errors = validate_sdc4_schema_compliance("schema.xsd")
# Or raise an exception
assert_sdc4_schema_compliance("schema.xsd")
Error classification
from sdcvalidator import ErrorClassifier, ErrorTier
classifier = ErrorClassifier()
tier = classifier.classify(some_xmlschema_error)
# ErrorTier.STRUCTURAL or ErrorTier.SEMANTIC
Exceptional Value recovery
A semantic (Tier 2) error does not have to reject a record. Recovery keeps the value and inserts an ISO 21090 ExceptionalValue beside it (Invalid, for a value that fails its type, pattern, range or enumeration), so the record says which value is unusable and why, and the rest of it stays usable.
from sdcvalidator import SDC4Validator, SDC4UnrecoverableError
v = SDC4Validator("dm-xxxx.xsd", validation="lax")
result = v.recover("record.xml") # RecoveryResult; the source is never mutated
for r in result.recoveries: # Recovery: path, code ("INV"), name, reason, inserted
print(r.code, r.reason, r.path)
if not result.ok: # an error no ExceptionalValue covers
print(result.unrecoverable)
tree = v.validate_with_recovery("record.xml", save=False) # raises SDC4UnrecoverableError instead
- An ExceptionalValue the record already carries (a refusal, a masked field, written where the record was made) is
kept, and covers its value; recovery never inserts a second one.
remove_existing_ev=Trueremoves them first. - An error recovery cannot cover is returned in
unrecoverablebyrecover(), and raised asSDC4UnrecoverableErrorbyvalidate_with_recovery(); it is never skipped. - Structural (Tier 1) errors raise
SDC4StructuralValidationError. - Pass an
XMLResourcewhen the record carries prefixed QNames in content (xsi:type="sdc4:...").
XML/JSON conversion
from sdcvalidator.converters import xml_to_json, json_to_xml
# XML -> JSON (schema-aware)
data = xml_to_json("instance.xml", schema_path="schema.xsd")
# JSON -> XML
json_to_xml(data, "schema.xsd", "output.xml")
CLI
sdcvalidate — Validate XML against schema
# Basic validation
sdcvalidate schema.xsd instance.xml
# JSON output
sdcvalidate schema.xsd instance.xml --json
# Skip SDC4 compliance check
sdcvalidate --no-compliance-check schema.xsd instance.xml
Exit codes: 0 valid, 1 semantic errors only, 2 structural errors.
sdcvalidator-xml2json — Convert XML to JSON
sdcvalidator-xml2json instance.xml --schema schema.xsd
sdcvalidator-xml2json instance.xml -o output.json
sdcvalidator-json2xml — Convert JSON to XML
sdcvalidator-json2xml data.json schema.xsd -o output.xml
MCP Server
sdcvalidator ships a stdio MCP (Model Context Protocol) server so any MCP-capable agent can validate SDC4 data without importing the Python library. It implements JSON-RPC 2.0 directly over stdio — no external MCP SDK dependency.
sdcvalidator # what an MCP registry client runs (uvx sdcvalidator)
sdcvalidator mcp # the same, spelled like the other Semantic Data Charter servers
sdcvalidator-mcp serve --mcp # still works for existing client configurations
A client configuration needs only "command": "uvx", "args": ["sdcvalidator"].
Tools
| Tool | Purpose |
|---|---|
validate_instance |
Validate an XML instance against its SDC4 XSD schema. Returns pass/fail with error count and classified errors. |
validate_and_report |
Validate an instance and return a detailed report with two-tier (structural vs semantic) error classification. |
check_schema_compliance |
Check whether an XSD schema follows SDC4 principles (restriction only, no xsd:extension). Does not validate instances. |
validate_instance and validate_and_report take schema_path and instance_path, plus an optional check_compliance boolean (default true). check_schema_compliance takes schema_path only.
Also listed on mcprush.
Two-Tier Error Classification
| Tier | Type | Examples | Action |
|---|---|---|---|
| 1 | Structural | Unknown elements, cardinality violations, wrong nesting | Reject |
| 2 | Semantic | Type errors, pattern violations, enumeration mismatches | Report, or recover with an ExceptionalValue |
SDC4 Schema Compliance
SDC4 data models must use xsd:restriction only — never xsd:extension. This enforces separation of structure (reference model) and semantics (data models), guaranteeing global interoperability.
The validator checks this by default and rejects schemas that violate this principle.
Status
Production-ready. Available on PyPI under Apache 2.0.
License
Apache License 2.0 — see LICENSE.
Links
sdcvalidator MCP questions
How do I add sdcvalidator MCP to Claude Code?
Run claude mcp add sdcvalidator -- uvx sdcvalidator in your terminal. Add --scope user to make it available in every project.
How do I add sdcvalidator 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 sdcvalidator MCP provide?
It exposes 3 tools, including validate_instance, validate_and_report, check_schema_compliance.
What is the difference between structural and semantic errors?
Structural errors (Tier 1) involve unknown elements or cardinality violations and require rejection, while semantic errors (Tier 2) involve type or pattern violations and can be reported or recovered.
Can the validator recover from semantic errors?
Yes, semantic errors can be recovered by inserting an ISO 21090 ExceptionalValue beside the invalid value, allowing the rest of the record to remain usable.
Does the tool support XML to JSON conversion?
Yes, it provides schema-aware conversion between XML and JSON formats.