Pixellint
FreeNot checkedMCP server for Pixellint: exposes pixel, postback, and tracking URL validation as callable tools
About
MCP server for Pixellint: exposes pixel, postback, and tracking URL validation as callable tools
README
Rust crates.io npm docs.rs license
Pixellint is a spec-first validator for pixels, postbacks, conversion API payloads, and other measurement artifacts. It runs in a terminal, in CI, and in agents, and every finding carries a stable id, a severity, an evidence level, and the document it came from.
Broken pixels cost attribution, QA time, and campaign money. The tooling that exists is fragmented: vendor-specific helpers, enterprise tag auditors, and schema linters that know nothing about ad tech. Pixellint is the open validation layer underneath all of that.
$ pixellint validate url 'https://www.facebook.com/tr?ev=Purchse&[email protected]'
rulepack: core
ok
rulepack: vendor/meta (vendor: meta)
error vendor.meta.param.id.missing `id` is required on Meta Pixel requests but is not present. It is the numeric Pixel ID from Events Manager.
fix: Set `id` to the numeric Pixel ID shown in Events Manager.
docs: https://developers.facebook.com/docs/meta-pixel/get-started
warning vendor.meta.param.ev.invalid `ev` is `Purchse`, which is not one of the documented values: PageView, AddPaymentInfo, ...
fix: Use a standard event name, or confirm the custom event is registered in Events Manager.
docs: https://developers.facebook.com/docs/meta-pixel/reference
error vendor.meta.pii.unhashed_email A parameter carries what looks like a raw email address. Meta requires customer information to be normalized and SHA-256 hashed before it is sent.
fix: Normalize the value, hash it with SHA-256, and send the hex digest instead of the plain address.
docs: https://developers.facebook.com/docs/meta-pixel/advanced/advanced-matching
2 error(s), 1 warning(s), 0 info message(s) across 2 rulepack(s).
Server-side events are checked in the body, one event at a time:
$ pixellint validate json '{"data":[{"event_name":"Purchase","event_time":1770000000000,
"action_source":"website","user_data":{"em":"[email protected]"}}]}'
rulepack: vendor/meta-conversions-api (vendor: meta)
error vendor.meta-conversions-api.body.event_time.invalid `event_time` must be at most 10 digits, but `1770000000000` has 13. Meta documents it as a Unix timestamp in seconds...
fix: Send seconds, not milliseconds: divide a JavaScript `Date.now()` by 1000 and floor it.
error vendor.meta-conversions-api.body.purchase_requires_value_and_currency A `Purchase` event is missing `custom_data.value` or `custom_data.currency`.
error vendor.meta-conversions-api.body.website_requires_source_url The event is marked `action_source: website` but carries no `event_source_url`.
Install
cargo install pixellint # CLI
cargo install pixellint-mcp # MCP server
npm install pixellint # library, WASM-backed
Or paste a URL into the playground at pixellint.org, which runs the same engine in your browser and sends nothing anywhere. Vendor contracts are at pixellint.org/packs/. Guides for pixels, conversion APIs, and consent are at pixellint.org/docs/.
Use it
QA
Validate an inline artifact, a file with @path, or stdin with -:
pixellint validate url 'https://px.ads.linkedin.com/collect?pid=123456&fmt=gif'
pixellint validate postback @conversion-endpoint.txt --json
curl -s "$TAG_URL" | pixellint validate vast -
If the artifact is still a template with unexpanded macros, say so, and macro rules adjust:
pixellint validate url 'https://example.com/pixel?cb=[CACHEBUSTING]' --state template
CI
pixellint validate exits 0 when the artifact is clean or only produced
warnings, 1 when any error-severity finding is present, and 2 on a usage or
input problem.
- uses: aleksUIX/[email protected]
with:
path: fixtures/conversion-pixel.txt
kind: url
version selects the CLI release (auto follows the action's own v* tag).
Linux and macOS runners, x86_64 and aarch64. The Action downloads a prebuilt
tarball from GitHub Releases.
Or install the CLI:
- name: Validate tracking artifacts
run: |
cargo install pixellint
pixellint validate url @fixtures/conversion-pixel.txt
Agents
cargo install pixellint-mcp
pixellint-mcp speaks MCP over stdio and exposes three tools:
list_rulepackslist_vendors, optionally filtered bycategoryor attributing a singlehostvalidate_artifact, takingartifact_kind,artifact, and optionalclaimed_vendor,expansion_state,rulepacks,except_rulepacks
Responses include the structured findings, the detected vendors, and a severity summary, so an agent can act on the result without parsing prose.
Node and the browser
import { validate, isOk } from "pixellint";
const summary = validate("https://www.facebook.com/tr?ev=Purchase");
isOk(summary); // false, the pixel id is missing
Library
use pixellint_core::{ArtifactKind, Engine, ExpansionState, ValidationOptions, ValidationRequest};
let engine = Engine::default();
let request = ValidationRequest {
artifact_kind: ArtifactKind::Url,
artifact: "https://www.facebook.com/tr?id=1234567890123456&ev=PageView".to_string(),
claimed_vendor: None,
expansion_state: ExpansionState::Unknown,
};
let summary = engine.validate(&request, &ValidationOptions::default())?;
assert!(summary.is_ok());
Rulepacks
core runs on every URL-like artifact. Vendor packs run only when the artifact
targets their endpoints, so you get vendor checks without asking for them, and
nothing fires on an endpoint it does not understand. A conversion API body has
no endpoint to go by, so those packs claim it by the shape of the payload.
| Rulepack | Covers | Evidence |
|---|---|---|
core |
URL validity, transport, credentials, fragments, ad-tech macro handling, IAB consent signals | normative |
vendor/meta |
facebook.com/tr pixel requests |
official vendor |
vendor/meta-conversions-api |
Graph API events edge, URL and JSON event payload | official vendor |
vendor/google-analytics |
GA4 Measurement Protocol, URL and JSON event payload | official vendor |
vendor/google-analytics-collect |
The /g/collect transport the Google tag uses in the browser |
ecosystem reference |
vendor/google-tag-manager |
gtm.js, gtag/js, and ns.html loader requests |
official vendor |
vendor/google-ads-conversion |
Google Ads conversion and view-through pixels | official vendor |
vendor/google-ads-click-conversions |
Google Ads UploadClickConversions JSON | official vendor |
vendor/floodlight |
Campaign Manager Floodlight activity tags | official vendor |
vendor/adobe-analytics |
Adobe Analytics data collection beacons | official vendor |
vendor/pinterest |
Pinterest tag requests and the noscript fallback | official vendor |
vendor/pinterest-conversions-api |
Conversions API events, URL and JSON event payload | official vendor |
vendor/snapchat |
Snap Conversions API v3, URL and JSON event payload | official vendor |
vendor/tiktok |
TikTok Pixel loader and collection requests | ecosystem reference |
vendor/tiktok-events-api |
Events API pixel track and batch, URL and JSON event payload | official vendor |
vendor/linkedin |
LinkedIn conversion image pixels | ecosystem reference |
vendor/linkedin-conversions-api |
LinkedIn conversion events, single and batched | official vendor |
vendor/microsoft-uet |
Microsoft Advertising Universal Event Tracking | ecosystem reference |
vendor/reddit |
Reddit Pixel conversion requests | ecosystem reference |
vendor/reddit-conversions-api |
Conversions API v3 events, URL and JSON event payload | official vendor |
vendor/x-conversions-api |
X conversion API measurement events, URL and JSON payload | official vendor |
vendor/x |
X website tag image pixels on analytics.twitter.com/i/adsct | ecosystem reference |
vendor/the-trade-desk |
The Trade Desk universal pixel iframe on insight.adsrvr.org/track/up | official vendor |
vendor/criteo |
Criteo OneTag loader ld.js?a= |
official vendor |
vendor/taboola |
Taboola Pixel loader, account ID in the path | official vendor |
vendor/hotjar |
Hotjar tracking code, site ID in the path | official template |
vendor/hubspot |
HubSpot tracking code, Hub ID in the path | official template |
vendor/awin |
Awin fall-back conversion pixel and S2S read | official vendor |
vendor/amazon-ads |
Amazon Ad Tag conversion loader, Tag ID in the path | ecosystem reference |
vendor/outbrain |
Outbrain conversion pixel, ob_adv_id or ob_click_id | ecosystem reference |
vendor/baidu |
Baidu Tongji collect hm.gif?si= |
ecosystem reference |
vendor/kwai |
Kwai Pixel loader, sdkid on s1.kwai.net | ecosystem reference |
vendor/hubspot-pixel |
HubSpot __ptq.gif collect pixel |
ecosystem reference |
vendor/cj |
CJ Affiliate conversion pixel on emjcd.com/u | official vendor |
vendor/impact |
impact.com Universal Tracking Tag, UUID in the path | official template |
vendor/rakuten |
Rakuten Advertising conversion pixel on /ep | ecosystem reference |
vendor/brevo-js |
Brevo JavaScript tracker sa.js?key= |
official template |
vendor/yahoo-dot |
Yahoo DSP Dot image pixels | official vendor |
vendor/yandex-metrica |
Yandex Metrica Measurement Protocol | official vendor |
vendor/openai |
OpenAI Ads image tag | official vendor |
vendor/openai-conversions-api |
OpenAI Ads Conversions API, URL and JSON payload | official vendor |
vendor/kochava |
Kochava S2S events, JSON payload | official vendor |
vendor/singular |
Singular S2S EVENT, query parameters | official vendor |
vendor/amplitude |
Amplitude HTTP V2 event uploads | official vendor |
vendor/mixpanel |
Mixpanel track ingestion | official vendor |
vendor/posthog |
PostHog capture, single and batched | official vendor |
vendor/klaviyo |
Klaviyo event creation | official vendor |
vendor/braze |
Braze user track: events, purchases, attributes | official vendor |
vendor/brevo |
Brevo Tracker REST trackEvent |
official vendor |
vendor/segment |
Segment HTTP Tracking API, single and batched | official vendor |
vendor/rudderstack |
RudderStack HTTP Tracking API and Pixel API | official vendor |
vendor/adjust |
Adjust S2S events on s2s.adjust.com | official vendor |
vendor/appsflyer |
AppsFlyer S2S in-app events, URL and JSON payload | official vendor |
vendor/branch |
Branch Events API standard and custom events | official vendor |
Vendor directory
Rulepacks cover fifty-three endpoint families in depth. The vendor directory covers the rest by attribution: 93 vendors and 237 hosts, so an unrecognized pixel still gets a name.
$ pixellint validate url 'https://trc.taboola.com/actions?a=1'
rulepack: directory (vendor: taboola)
info directory.no_rulepack_coverage This endpoint belongs to Taboola (native). No Pixellint rulepack covers it, so only the core checks ran. The `vendor/taboola` rulepack covers other Taboola endpoints, not this one.
Directory entries make one claim, that a host belongs to a vendor. They carry
no parameter contracts, the finding is always info, and attribution never
changes an exit code. See docs/VENDOR_DIRECTORY.md.
pixellint list-vendors
pixellint list-vendors --json
Select packs per run:
pixellint validate url "$ARTIFACT" --rulepack core
pixellint validate url "$ARTIFACT" --except vendor/meta
pixellint list-rulepacks --json
Full rule inventory with citations: docs/STANDARDS.md.
Evidence levels
Findings say where their authority comes from, and you can hold packs to different standards accordingly:
normative: a formal standard such as the WHATWG URL Standard or an RFCofficial_vendor: a parameter contract the vendor publishes, with the URLofficial_template: vendor-published templates or SDK behaviorecosystem_reference: consistent real-world behavior the vendor generates in its own UI but does not documentheuristic: Pixellint's judgment, labeled as such
The manifest loader refuses to compile a pack that claims official_vendor
without citing documentation.
Custom rulepacks
Rulepacks are data, not code. First-party vendor packs are written in the same JSON format you can write for an internal endpoint:
{
"id": "custom/acme",
"display_name": "Acme internal pixel",
"description": "Contract for the internal conversion endpoint.",
"vendor": "acme",
"source_level": "heuristic",
"match": { "hosts": ["px.acme.example"], "path_prefixes": ["/collect"] },
"params": [
{ "name": "aid", "requirement": "required", "format": { "kind": "integer" } },
{ "name": "ev", "requirement": "required", "format": { "kind": "enum", "values": ["view", "purchase"] } }
]
}
pixellint validate url 'https://px.acme.example/collect?ev=purchase' --rulepack-file acme.json
The format is documented in docs/RULEPACK_SCHEMA.md.
What Pixellint does not do
- It does not extract artifacts from documents. Callers such as Vastlint parse VAST, HTML, or GTM containers and hand Pixellint the URLs they found. The planned document-level result model is in docs/MULTI_ARTIFACT_SCHEMA.md.
- It does not fire requests or check whether an endpoint responds.
- It does not auto-fix. Findings carry fix hints; applying them is on you.
Evidence
Every rule is backed by tests: unit tests in crates/pixellint-core/src/, a
golden corpus in fixtures/ with one directory per rulepack, and integration
tests that drive the real CLI binary and the real MCP stdio transport.
cargo test --workspace
Docs
- Standards and rule inventory
- Vendor directory
- npm package
- Rulepack manifest schema
- Architecture
- Roadmap
- Multi-artifact output model
License
Apache-2.0. Pixellint is not affiliated with or endorsed by any vendor named in its rulepacks; see NOTICE.
Installing Pixellint
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/aleksUIX/pixellintFAQ
Is Pixellint MCP free?
Yes, Pixellint MCP is free — one-click install via Unyly at no cost.
Does Pixellint need an API key?
No, Pixellint runs without API keys or environment variables.
Is Pixellint hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Pixellint in Claude Desktop, Claude Code or Cursor?
Open Pixellint on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectAmap Maps Mcp Server
MCP server for using the AMap Maps API
by duxiaohuiSupabase
Database, auth and storage
by SupabaseEverything
Reference / test server with prompts, resources, and tools.
Git
Tools to read, search, and manipulate Git repositories.
Sequential Thinking
Dynamic and reflective problem-solving through thought sequences.
Time
Time and timezone conversion capabilities.
Compare Pixellint with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
