vastlint
About
VAST XML validation MCP server for programmatic video ad pipelines. Tools: validate_vast, validate_vast_url, list_rules, explain_rule, fix_vast. Hosted at vastlint.org/mcp or self-hostable.
Details
- Author
- aleksuix
- Categories
- Developer Tools, Other
Jump to
Setup
Install vastlint in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/aleksuix/vastlint
Follow the installation instructions in the repository README, then restart your MCP client.
Website & web validator:VAST tag validatorPaste a VAST tag and get results in your browser, no install required.
A high-performance VAST XML validator built on a pure-Rust core. Checks ad tags against the IAB Tech Lab VAST specification so you don't have to read it. Over $30 billion in annual CTV and video ad spend flows through VAST XML, and malformed tags are one of the most common causes of lost impressions, broken tracking, and revenue discrepancies between platforms. There is no widely adopted open-source tool that validates VAST XML against the full IAB specification across all published versions.
VASTlint ships a nativeMCP server- making VAST validation available as a callable tool from Claude, Cursor, theAAMP Buyer Agent SDK, or any MCP-compatible client. Connect tovastlint.org/mcpand callvalidate_vast,validate_vast_url,inspect_vast,list_rules,explain_rule, orfix_vast. Each tool returns structured JSON with rule IDs, XPath locations, and spec references.
Native bindings for realtime ad pipelines:vastlint-go(CGo, prebuilt static libs, no Rust toolchain needed),vastlint-java(gRPC client for JVM ad servers),vastlint-erlang(Elixir/Erlang: OTP port mode for production ad delivery, DirtyCpu NIF for non-critical paths), and a WASM npm package for Node.js and browsers. All bindings share the same compiled Rust core. Consistent results everywhere, sub-millisecond latency at scale.
Need a copy-paste frontend starting point? See the React drop-in example innpm/examples.
- IAB Tech Lab VAST2.0, 3.0, 4.0, 4.1, 4.2, and 4.3 — structural rules derived from the published XSD schemas (W3C REC-xmlschema-1) and spec prose (RFC 2119 normative key words)
- W3C XML 1.0well-formedness — malformed documents are rejected before any spec rule runs
- RFC 3986URI syntax — all URL fields
- IANA Media Types— MIME types on MediaFile, InteractiveCreativeFile, Mezzanine, and ClosedCaptionFile
- ISO 4217currency codes — Pricing elements
- Ad-IDregistry format — UniversalAdId
- IAB Tech Lab SIMID1.0, 1.0.1, 1.1, 1.2 — interactive creative validation for<InteractiveCreativeFile apiFramework="SIMID">and nonlinear<IFrameResource>(the IAB-sanctioned VPAID replacement)
- IAB Tech Lab OMID / Open Measurementcompatibility in VAST<AdVerifications>— vendor format, duplicate vendor detection, OMID resource semantics, verification tracking validation, and pre-4.1 extension-carried compatibility blocks
228 rules across required fields, schema validation, structural correctness, security, consistency, deprecated features, ambiguous usage, value formats, SIMID validation, OMID validation, VMAP 1.0, and DAAST 1.0. Rules marked with$have direct revenue impact - usevastlint check --fail-on-warningin CI to catch them before they reach production. Seecommon errorsfor the ones that cost real money. New to VASTlint? Start with thetutorial.
Full rule reference with examples and fix instructions:VAST error rule reference·RULES.md
How rules are derived:Rule derivation methodology·METHODOLOGY.md
Zero runtime dependencies in the core.vastlint-corehas three compile-time dependencies (quick-xml,url,phf) and no runtime dependencies whatsoever — no async runtime, no regex engine, no schema interpreter. Rules are compiled Rust functions. There is no transitive dependency graph to audit, no CVE surface to track, and no supply chain to compromise at runtime.
Verifiable build provenance.All release artifacts are signed withSLSA Build Level 2provenance via GitHub's native attestation store. Every binary, library,.vsix, and npm package can be verified cryptographically against the exact source commit that produced it. No developer machine is ever involved in producing release artifacts. SLSA L3 (hermetic, isolated signing) is in progress.
No data retention by default — and full self-hosting available.VAST XML submitted to the hosted API or MCP server is validated ephemerally in a Cloudflare Worker and never stored, logged, or transmitted to third parties. The VS Code extension and Chrome extension process all XML locally — nothing leaves the editor. The one opt-in exception is--contribute-sample(seeTelemetry and sample contributionbelow), which is off unless explicitly enabled. SeePRIVACY.mdfor the full policy.
For teams that require on-premise processing or air-gapped deployments, VASTlint runs entirely self-hosted: theCLI image(FROM scratch, under 5 MB, cold-start under 10 ms), thevastlint-grpcsidecar (aleksuix/vastlint-grpc:0.13.2), or the pre-built static musl binary. The Rust core has no network code: no callbacks, no telemetry, no license checks. The sidecar exposes partner tallies on/metrics(port 9090); scrape them yourself.
Apache 2.0 licensed.No CLA, no dual-license commercial upsell, no usage-based restrictions. Fork it, vendor it, embed it, redistribute it.
Dependency update automation.Dependabot monitors Cargo, npm, and GitHub Actions dependencies weekly and opens PRs automatically. Combined withcargo auditon every CI push and CodeQL static analysis on every push and PR, the dependency surface stays current without manual tracking.
Auditable.OpenSSF Scorecardruns weekly and publishes a public score.CII Best Practicesbadge covers vulnerability reporting, CI, fuzzing, and code review requirements. TheSecurity Advisorychannel provides a private disclosure path with a 48-hour acknowledgement SLA.
Fuzz-tested continuously.Three libFuzzer targets run on every CI push against the core validator and auto-fix engine. See theFuzzingsection below.
Benchmarked on Apple M4 (10-core), production-realistic VAST tags (17–44 KB):
A typical OpenRTB bid cycle takes 100–300 ms; validation adds less than 2.1% of that budget even on the heaviest tags. An SSAI pipeline doing 1,000 stitches/sec spends more time on DNS than on validating the VAST response.
No async runtime, no regex engine, no schema interpreter. Rules are compiled Rust functions. Three dependencies:quick-xml,url, andphf(compile-time hash maps).
CLI crate on crates.io:crates.io/crates/vastlint
Or download a pre-built binary from the[releases page.
docker run --rm -v "$(pwd)":/data aleksuix/vastlint check /data/tag.xml
cat tag.xml | docker run --rm -i aleksuix/vastlint check -
docker run --rm -v "$(pwd)":/data aleksuix/vastlint check /data/tag.xml --format json
…
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





