Skip to main content
Glama

uxlint

デザインに精通したレビュアーのように、あらゆるウェブサイトのUXを監査します。コントラスト、タップターゲット、タイプスケール、色の規律、スキャンパターン、ランドマーク。すべての指摘には、エージェント(または人間)が直接適用できる処方的な修正が付属します。コーディングエージェントのループ(MCP)に組み込んで、グリーンになるまで反復するように設計されています。

エージェントが価格ページを監査し、コントラストエラーと色の衝突の指摘をそれぞれの修正とともに取得し、それらを適用してルールを再チェックし、ページのグレードをBからAに再評価する

実際の実行、開始から終了まで: audit_url → グレードB、2.39:1のコントラストエラー、および3つの異なるアクセント色相の3つのCTA → 修正 → verify_fix → グレードA。その中のすべての数値はツールから返ってきたもので、カットされたのは待ち時間だけです。

これはCLIです。単一の静的Rustバイナリの小さなものです。すでにインストールされているChrome/ChromiumをDevToolsプロトコル経由で駆動し(Node不要、Playwright不要、ヘッドレスブラウザのダウンロード不要)、ページの見た目と読み取り内容をキャプチャして、uxlintのホスト型サーバーに送信します。実際のグレーディングはサーバー側で行われます。ルールエンジン、キャリブレーションされたしきい値、LLMジャッジはすべてサーバー側にあり、ルールが変更されてもクライアントを更新する必要はありません。

┌──────────────────────────┐        POST /v1/audit {snapshots}        ┌──────────────────────────┐
│ uxlint (this binary)     │ ───────────────────────────────────────▶ │ uxlint-server (hosted)    │
│ drives YOUR Chrome (CDP) │ ◀─────────────────────────────────────── │ rules engine + LLM judge  │
└──────────────────────────┘        report {findings + fixes}         └──────────────────────────┘

インストール

curl -fsSL https://uxlint.net/install.sh | sh    # detects OS/arch, verifies checksum

またはmiseを使用する場合 — そのgithubバックエンドがGitHub Releasesから一致するビルドを取得し、検証して、mise upで更新します:

mise use -g "github:uxlint-net/uxlint-cli[rename_exe=uxlint]@latest"

またはプロジェクトのmise.tomlにピン留めします:

[tools]
"github:uxlint-net/uxlint-cli" = { version = "latest", rename_exe = "uxlint" }

またはソースからビルドします(最近の安定版RustツールチェーンとPATH上のChrome/Chromiumが必要です):

git clone https://github.com/uxlint-net/uxlint-cli && cd uxlint-cli
cargo build --release
./target/release/uxlint --version

Related MCP server: Prufa

クイックスタート

uxlint auth login                                        # opens your browser, saves a token
uxlint audit --base https://your-site.com --routes /,/pricing

自分のプロジェクトを初めて監査しますか? uxlint initはレポートを添付するサイトを選択(または作成)し、uxlint.tomlを書き込むため、このディレクトリでの今後のすべての監査がそのまま機能します:

uxlint init
uxlint audit --base http://localhost:5173 --routes /,/pricing

設定された重大度を超える指摘があると終了コード1を返す → CIにそのまま組み込めます(テンプレートは.github/workflows/、またはuxlint-net/uxlint-action GitHub Actionを参照)。

監査からの要素の非表示(uxlint-hide)

ページ上のクロームの一部は製品UIではなく、判断されるべきではありません。開発/ステージング環境バナー、「DEV」マーカー、デバッグツールバー、Storybook/プレビューのアフォーダンスなどです。そのような要素にクラス**uxlint-hide**を追加すると、監査はそれを削除します — 最初のペイントからdisplay:noneになるため、スクリーンショットに表示されず、コレクターからも見えません(指摘を生成しません):

<div class="env-banner uxlint-hide">STAGING</div>

このクラスは実際のサイトでは不活性です — 監査が実行されている場合を除いて何もしません。なぜなら、それを非表示にするスタイルシート(.uxlint-hide { display: none !important; })は、ページ自身のスクリプトが実行される前に、uxlintのブラウザによってのみ注入されるからです。それ以外の時間は、要素を好きなようにスタイルできます。これはすべてのキャプチャパス(クロール、ゴールウォークテスト、修正プレビュー)に適用されます。

MCP(コーディングエージェントから使用)

Claude Code、1コマンド:

/plugin marketplace add uxlint-net/uxlint-cli
/plugin install uxlint@uxlint

これによりuxlint MCPサーバーがインストールされ、CLIがまだPATHにない場合は、上記と同じチェックサム検証インストーラーで一致するバージョンが一度だけフェッチされます — そのため/plugin updateはその下のCLIも更新します。Nodeは不要です: 1つの静的バイナリ(公開されたチェックサムに対して検証済み)をダウンロードし、すでに持っているChromeを駆動します。

その他のエージェント — 1行(npmパッケージがプラットフォーム用のバイナリをフェッチし、その横に公開されたチェックサムを検証して、引き渡します)。これは**Node 18+**が必要な唯一のルートで、npx自体のためです。避けたい場合は、上部の行でバイナリをインストールして、それを登録します:

claude mcp add uxlint -- npx -y @uxlint-net/uxlint mcp

または、JSON設定を読み取るクライアントの場合:

{ "mcpServers": { "uxlint": { "command": "npx", "args": ["-y", "@uxlint-net/uxlint", "mcp"] } } }

uxlintはMCPレジストリにもio.github.uxlint-net/uxlintとして登録されており、それを参照するクライアント向けです。すでにCLIをお持ちですか? uxlint mcp installでnpxラッパーなしで直接登録できます。

最初に設定するトークンはありません: サインアウトした状態でエージェントに何かを監査させると、トークンを生成して保存するサインインリンクが渡されます(UXLINT_API_KEYはCI用で、ブラウザがありません)。

5つのツール: audit_url(完全な監査、グレード付きの判定+アクションプラン)、verify_fix(編集後に1ページで1つのルールを再チェック、約2秒)、get_shot(指摘の注釈付きスクリーンショットを取得)、ux_guidance(UIを構築する前に読むべきベストプラクティスガイダンス)、そしてlint_feedback — オプトインでデフォルトではオフ(§プライバシー)— 3種類のシグナルのための1つのツール: 指摘が役に立ったかどうか、uxlintが欠落しているlint、認識されなかったコンポーネントライブラリ。エージェントは監査し、修正を読み、編集し、グリーンになるまで再監査します。

プライバシーと信頼

このCLIはあなたのマシンで実行され、実際のページに対して実際のブラウザを駆動するため、正確に何をキャプチャしてどこに送信するのかを尋ねるのは当然です。私たちが伝えられることは、このリポジトリのコードが実際に行うことだからです:

  • コレクターは組み込まれており、読み取り可能です。 このバイナリにコンパイルされています(assets/collector.jsのinclude_str!)ので、uxlint --versionは正確なキャプチャコードを固定し、サーバーは実行時に何も注入できません。キャプチャするものはすべて、ページのジオメトリ、表示テキスト、計算済みスタイル、スクリーンショットです。埋め込まれた<iframe>については、srcのホストのみを記録します — クエリ文字列にセッションIDやトークンを含む可能性のある完全な埋め込みURLは決して記録しません。ソースコードやuxlint.toml以外のファイルシステムを読み取ることはありません。少しのプロジェクトの来歴を読み取り、レポートとともに送信します: 現在のgitコミットSHAとブランチ名(git rev-parse)、マシンのホスト名、そしてGitHub Actionsではリポジトリ/PR/コミットリンク。UXLINT_RUNNERを設定してホスト名を上書きできます。

  • シークレットとPIIの編集はベストエフォートであり、保証ではありません。 何かをアップロードする前に、コレクターはキャプチャされたページテキスト内のトークン、APIキー、パスワード、メールアドレスのように見えるテキストをマスクし、コンソールログとネイティブダイアログメッセージから同じパターンを編集します。すべてのチャネルが1つのパターンリスト(assets/redact.js)を共有するため、ドリフトできません。スクリーンショットはキャプチャの直前に追加のパスを受けます: すべてのフォームフィールド値がマスクされ(パスワードはブランク、その他の入力はドットに置換)、ページ上のテキスト内のパターンマッチするシークレットがスクラブされるため、入力されたデータと表示されたキーが画像に含まれません。そのパスはシャドウDOM(attachShadowインターセプターによるクローズドルートを含む)と同一オリジンのiframeに到達し、クロスオリジンのiframeはそのピクセルを編集できないため不透明なボックスで覆われます。しかし、編集はパターンベースであり、スクリーンショットは依然としてピクセルです: パターンが捕捉しない任意の表示コンテンツ(ページ上の顧客名、注文データ)、分割された値、画像や<canvas>に描画されたものはすり抜ける可能性があります。--header/--storage/--login-*で渡す資格情報はあなたのブラウザのみを駆動し、uxlintのサーバーには決して送信されません。

    レポートはページのHTML、テキスト、スクリーンショットをキャプチャするため、機密コンテンツがレポートに漏れるのを完全に防ぐことは不可能です。実際のアカウントや本番アカウントではなく、テストアカウントを使用してください。 ローカル開発では、データがローカル開発データのみである限り、リスクは低いです。実際のシークレットや個人データを保持する認証済みサイトを監査する場合は、送信する前に何が送信されるかを確認してください: --dry-runを使用して正確なペイロード(ページテキスト、来歴、スクリーンショット)をローカルフォルダに書き込み、アップロードせずに検査します。編集は偶発的な露出を減らしますが、セキュリティ境界ではなく、uxlintを向ける対象に対してあなたが責任を負います。

  • ナビゲーションテキストは意図的にシークレットのみスクラブされます。 コントロールラベル、メニューと<select>のオプション、ワークスペース/組織スイッチャー名は同じシークレットパターンを通過しますが、名前やその他の任意のコンテンツに対しては編集されません。その理由はゴールウォークです: 監査はLLMでページを駆動し、LLMは正確にこのテキストを読んで正しいコントロールを見つけ、操作し、その選択をDOMにマッチさせます。マスキングするとウォークが機能しなくなります。なぜなら、ジャッジが2つのオプションを区別したり、選択したものをクリックしたりできなくなるからです。したがって、監査がナビゲートするために必要なラベルは読み取り可能なままであり、その1つに含まれる実際の名前は、編集ではなく上記のテストアカウントルールでカバーされます。これは意図的なトレードオフです: ゴールウォークを機能させ続けることは、テストアカウントルールがすでに保護しているテキストをブランクにするよりも価値があります。

  • テレメトリはありません。 このバイナリは、あなたが指示したホストにのみアウトバウンドコールを行います: uxlint APIサーバー(--server/UXLINT_SERVER、またはデフォルトのホスト型オリジン)、監査を依頼したサイト、そして明示的にオプトインした場合のみ、匿名のルールフィードバックシグナル。別の分析/クラッシュレポート/電話ホーム先はどこにも組み込まれていません。

  • フィードバックはオプトインで、デフォルトではオフです。 uxlint initは一度だけ尋ねます。feedback = trueをuxlint.tomlに書き込むのは、あなたが「はい」と言った場合のみで、いつでも戻せます。

  • 監査ブラウザは一時的なプロファイルを使用します。 各監査はChromeを新しい使い捨てのユーザーデータディレクトリで起動するため、日常のブラウジングからのCookie、履歴、拡張機能が監査セッションに読み込まれることはなく、プロセス終了後に何も残りません。

  • あなたのログインはローカルに留まります。 uxlint auth loginはトークンを~/.config/uxlint/credentialsに保存し、chmod0600です。ログに記録されることはなく、印刷されることもありません(1つの意図的なケースを除く: uxlint signupは新しく生成されたキーを印刷してエクスポートできるようにします)、レポートにバンドルされることもありません。

これはソースを読むことの代わりにはなりません。短いですし、それが公開するポイントです。この説明と一致しないものを見つけた場合は、issueを開いてください。

このCLIがではないもの

意図的に単純です: ナビゲートし、組み込みのコレクターを実行し、スナップショットをアップロードし、レポートを印刷します。ルール、しきい値、ジャッジモデルはこのリポジトリにはなく、今後もありません。それらが実際の製品であり、サーバー側にのみ存在します。このCLIのビルドは、uxlintサーバー(デフォルトではhttps://uxlint.netのホスト型、または独自のもの)と通信できなければ役に立ちません。

ライセンス

Apache License 2.0(LICENSEを参照)。読んで、監査して、フォークして、ソースからビルドして、独自のツールに組み込んでください — 通常の帰属表示と特許条項以外の条件はありません。

これは以前はBusiness Source Licenseであり、2030年の変更日にApache-2.0に変換される予定でした。私たちは単に早めに到達しただけです。それが担っていた制限 — このコードに基づく競合するホスト型「サイト監査」サービスを構築しないこと — は間違ったものを保護していました: 価値があるのはルール、キャリブレーションされたしきい値、ジャッジであり、それらはサーバー側にあり、このリポジトリにはありません。ここにあるのは、uxlintサーバーがなければ価値がないクライアントであり、クライアントこそがインストール、読み取り、ベンダリングが摩擦のないものであるべき部分です。

v0.1.30までのリリースはBUSL-1.1で公開されました。v0.1.31以降はApache-2.0です。

Available Tools

6 tools
acknowledge_findingA

Mark ONE finding as a known false positive for this site, so later audits stop counting it — it moves out of the findings, the counts and the grade into the report's acknowledged list, where it stays visible with your reason. Use it only after you've checked the finding is wrong on this page (the rule misread it), never to silence a real problem you'd rather not fix. Pass the report (URL or id), the rule and the selector exactly as the finding gives them, and a reason. undo=true puts it back. Works on reports filed under a site.

NameRequiredDescriptionDefault
ruleYesThe finding's rule, exactly as the report names it.
undoNotrue to withdraw an earlier acknowledgement, putting the finding back.
reasonNoWhy the finding is wrong HERE — shown beside it in every later report, so whoever reads the report can see why it isn't counted. Required to acknowledge (20+ characters); not needed to undo.
reportYesThe report the finding is in: its URL (…/r/<id>) or its id.
selectorNoThe finding's selector (`selector` in the structured result); `site` for a site-wide finding.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full disclosure burden, and it does so well: it explains the state transition (out of findings, counts and grade), persistence in the `acknowledged` list 'where it stays visible with your reason', and the reversal mechanism ('undo=true puts it back'). It also notes the site-scoping constraint ('Works on reports filed under a site'). It does not mention permissions/authorization or idempotency of repeat acknowledgements, keeping it below 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and effect in the first sentence, then adds usage guidance, parameter passing, and undo in a tight sequence. Every sentence is functional, though the em-dash-heavy compound sentences and the trailing site-scoping note reduce crispness slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description covers purpose, effect, usage constraints, and reversal, which is close to what an agent needs. It omits the response shape and whether the report must be a site report in all cases beyond the terse 'Works on reports filed under a site' note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter (report, rule, selector, reason, undo) is documented in the schema itself, so the baseline is 3. The description mostly restates that set ('Pass the report (URL or id), the rule and the selector exactly as the finding gives them, and a reason') with only slight added guidance about copying values verbatim from the finding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Mark ONE finding as a known false positive for this site') and immediately describes the downstream effect on findings, counts, grade, and the acknowledged list. This is unmistakably distinct from audit_url, get_report, get_shot, and verify_fix without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ('only after you've checked the finding is wrong on this page (the rule misread it)') and an explicit exclusion ('never to silence a real problem you'd rather not fix'), which is strong when/when-not guidance. It does not name an alternative tool (e.g. verify_fix) for the case where the problem is real, so it stops short of full 5-level routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_urlA

Audit a website's UX/design: contrast, tap targets, type scale, colour discipline, copy clarity, scan patterns. Each finding returns its RULE name (pass it to verify_fix), a SOURCE file:line hint (for local audits, grepped from the project you're in), the SELECTOR, the concrete FIX, and — for copy issues — the exact text EDIT (replace X with Y).

WORKFLOW: (1) Before you change anything, call ux_guidance for the area(s) the findings touch (forms, lists, layout, copy, …) so you fix toward the idiomatic, DRY pattern — not a one-off patch. If the result names a STYLEGUIDE, open it first and build to the components/tokens it shows. (2) Open the source line and apply the SMALLEST fix that reuses the project's existing components/tokens and voice (don't add a new one-off to silence the finding) without regressing the quality floor — responsive, visible keyboard focus, reduced motion, no new layout shift — then verify_fix. (3) Iterate until green. A finding you've checked and found WRONG on this page (the rule misread it)? acknowledge_finding marks it a known false positive for the site, so it stops coming back and stops counting against the grade — it stays visible in the report, with your reason. If a lint_feedback tool is in your tool list, also send a verdict for each finding you act on — it's how rules get kept, tuned or retired. It is absent unless the project set feedback = true (via uxlint init), so don't go looking for it: this result tells you when it's there.

SAFETY: interaction probes navigate, read, and click candidate menu/disclosure/dialog controls. Discovery skips recognised action words — delete, remove, accept, leave, revoke, pay, publish, add, create, save — using the full label. Labels cannot guarantee a click has no side effects; use an environment you control with disposable data. the write probes (which click Add/Create, and Delete through its confirm dialog) need the CLI's own --allow-mutation flag, which is not reachable from here. Declared tests are the exception and the only one: if the project's uxlint.toml declares tests that sign in as a persona, running them will SUBMIT forms and may DELETE items — that's what a test does, and it exercises create/delete flows on your own app. Point it only at an app you own / a throwaway env, never a site you don't control.

SETUP: in a project with no uxlint.toml, this returns the exact config to write first (org/site/base/routes) — write that file, check it in, then call again. Without it a local target can't be audited at all and a public one files its report under a site nobody chose.

AUTH: for a logged-in site, DON'T pass secrets here — credentials come from the project's uxlint.toml [personas] (the local client replays them; nothing touches this tool call or the transcript). If the audit hits a login wall, this tool returns the exact setup instructions.

NameRequiredDescriptionDefault
baseNoBase URL to audit — an ORIGIN like http://localhost:5173, NOT a path (a path gets appended to every route and mis-crawls). Optional: omit to use the `base` in the project's uxlint.toml.
crawlNoMax routes to discover and audit from the seeds (default 12). Set 0 to audit only the given routes.
judgeNoRun the AI copy/design judge (prose quality, test-run navigation). ON by default; set false for a fast, deterministic-only pass while iterating.
testsNoRun the site's declared tests (whole-site reachability). ON by default; auto-scoped to crawling audits. Set false to skip for speed. Tests are a paid-plan feature — on a free plan, tests declared but not run print a one-line skip warning instead.
detailNo`full` for every finding's fix, best practice, rect and screenshot URL in the structured result. Default is compact: every finding, with each rule's fix said once — the full form can run past a client's output limit on a big site.
routesNoComma-separated routes (default /)
statesNoDrive hover/focus/keyboard interaction states — catches dead hover styles, hover-only content unreachable by touch/keyboard, illogical focus order, keyboard traps, form-validation gaps. ON by default; set false to skip it (faster) on large public crawls.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses that interaction probes navigate/read/click, that discovery skips action-word labels, that write probes need an unreachable --allow-mutation flag, that declared tests SUBMIT forms and may DELETE items, and that credentials come from uxlint.toml personas. Mutation and side-effect risks are stated plainly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is long, but it is organized into labelled WORKFLOW/SAFETY/SETUP/AUTH blocks with the purpose and return shape front-loaded, and each block carries decision-relevant content rather than filler. A few sentences could be tightened, but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter, zero-annotation tool with mutation-capable probes, no output schema, and a setup prerequisite, the description covers return shape, workflow, safety, auth, and setup. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents base, crawl, judge, tests, detail, routes, and states with defaults and constraints. The description adds output-format detail (RULE, SOURCE file:line, SELECTOR, FIX, EDIT) but little beyond the schema on the parameters themselves, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Audit a website's UX/design') and enumerates the concrete dimensions checked (contrast, tap targets, type scale, copy clarity). It also describes the shape of each finding and explicitly routes to siblings (verify_fix, ux_guidance, acknowledge_finding), so the agent can distinguish it from the rest of the toolset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit numbered WORKFLOW with when-to-do-what ordering (ux_guidance before changes, open source line, smallest fix, verify_fix, iterate), plus the acknowledge_finding escape hatch for false positives and the conditional lint_feedback path. Alternatives and their triggering conditions are named rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reportA

Read an EXISTING report's findings — one the user started from the dashboard, a run whose audit_url call you lost, or one that TIMED OUT (it keeps whatever it found before the cap, and says so). Pass the report's URL as the user sees it (…/r/) or its id. Returns the same thing audit_url does: the grade, what moved since the last run, and every finding with its rule, location, source hint, fix and screenshot_url — so you can act on it and confirm each fix with verify_fix. Reports are private; this reads them with your uxlint login.

NameRequiredDescriptionDefault
detailNo`full` for every finding's fix, best practice, rect and screenshot URL in the structured result; compact by default (see audit_url).
reportYesThe report to read: its URL as the dashboard shows it (`https://uxlint.net/sites/8/r/abc123`), a `/r/…` path, or the bare report id.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden, and it delivers: it labels the operation as a read, discloses that timed-out reports preserve partial findings and say so, and notes reports are private and read with the user's uxlint login. It also commits to a stable output shape by enumerating the returned fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, and each sentence adds a distinct fact: use cases, input formats, return payload, and privacy/auth. It is longer than minimal but dense and without filler, though the parenthetical examples could be slightly tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the returned grade, deltas, and each finding's fields, and by explaining timeout behavior and auth requirements. It does not cover error cases or exact formatting, but the schema handles parameter formatting, making this complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters with 100% coverage, so the baseline is 3. The description restates the report parameter's accepted URL/path/id forms but adds no new semantic detail beyond the schema; detail's full-vs-compact behavior is delegated to audit_url and already covered in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair ('Read an EXISTING report's findings') and immediately distinguishes the tool from siblings by mentioning audit_url and verify_fix. It makes the scope explicit: existing reports, including timed-out ones, not new audits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly identifies when to use get_report: reports started in the dashboard, lost audit_url calls, or timed-out runs. It does not explicitly say 'use audit_url for new audits', but 'EXISTING' and the audit_url reference make the boundary inferable, giving clear context without a formal when-not clause.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_shotA

View a report's annotated screenshot — the flagged element boxed on its page. Reports are PRIVATE, so a finding's screenshot_url can't be fetched with a plain GET; this tool fetches it with your uxlint login. Pass the finding's screenshot_url (from audit_url / verify_fix). Returns the image inline (if your client renders MCP images) and always writes it to a local file whose path you can open/Read.

NameRequiredDescriptionDefault
screenshot_urlYesThe `screenshot_url` from an audit_url / verify_fix finding — the annotated shot with the flagged element boxed. A full URL or a `/r/…` path on your uxlint server.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that reports are PRIVATE, reads requires the user's uxlint login, returns image inline (if client supports MCP images), and always writes to a local file. This adds significant behavioral context beyond what an annotation might provide, such as side effects (writing a file) and authentication requirements. The only minor gap is not detailing the exact file path or cleanup behavior, but the description is quite transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (about 3 sentences) and front-loads the core action. Every sentence provides essential information: purpose, why it's needed, what to pass, and what happens. No fluff or redundancy. The structure is logical: what, why, how, outcome.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is only one parameter, no output schema, and no annotations, the description is complete. It covers the tool's purpose, usage, parameter source, return behavior (inline and local file), and the limitation about private reports. This is sufficient for an agent to select and correctly invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and it already explains the screenshot_url parameter clearly. The description adds contextual meaning by tying the parameter to the finding's screenshot_url and specifying the source (audit_url/verify_fix). It also clarifies that the URL can be a full URL or a /r/… path. This adds value beyond the schema, so a slightly above baseline score is warranted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to view a report's annotated screenshot, with the flagged element boxed. It also distinguishes it from siblings by explaining why a plain GET won't work and that it requires the finding's screenshot_url. The verb 'View' and specific resource 'report's annotated screenshot' are precise.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool (to fetch a screenshot_url from audit_url/verify_fix findings) and why it's necessary (reports are private, plain GET won't work). It also provides context that the screenshot URL comes from specific sources, serving as an alternative to direct fetching. This is exactly the kind of usage guidance expected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ux_guidanceA

Project design memory and best-practice UI guidance to read BEFORE building or changing UI — usability, consistency, and performance patterns distilled from uxlint's audit corpus, so you build idiomatic, DRY, testable components the first time instead of getting audited after. Reads the nearest project’s uxlint.design.json on each call; only explicitly approved versioned decisions guide edits. Never auto-approve or rewrite that contract to silence a lint. Covers whole-row click targets, single-column labelled forms, tabs/radiogroup vs plain buttons, one shared width scale + aligned panels, pagination by scroll length, CLS-safe layout, copy that reads as UI (active voice, honest labels, useful empty/error states), and money surfaces (plans, usage, the cost of an action shown before it runs, failed payments). Each item names the uxlint rule that catches a miss, so the loop is: read the topic, build to it, then audit_url to confirm.

NameRequiredDescriptionDefault
topicNoWhich area to get guidance for: layout, forms, lists, navigation, components, performance, accessibility, content, money (plans, checkout, usage, cost before an action). Omit for the index of topics; "all" for everything. Accepts aliases (copy, nav, a11y, perf, dry, …) and falls back to the index for anything unrecognized.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral load and does so well: it re-reads the nearest project's uxlint.design.json on each call, only approved versioned decisions steer edits, and it never auto-approves or rewrites the contract. The implicit read-only nature is conveyed rather than stated outright, but the governance constraints are unusually explicit for a retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The governing instruction (read before building) is front-loaded in the first clause, and the closing loop sentence ties usage together. It is on the long side and the enumerated topic catalogue slightly pad it, but every sentence carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must characterize returns, and it does: guidance items each name the uxlint rule that catches a miss. Combined with the read-before-build workflow and the config source, an agent has enough to invoke and interpret it. Return format granularity (single topic vs index) is only implied by the topic parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single topic parameter is fully documented in the schema, including the alias and fallback behavior, so the schema does the heavy lifting. The description's topic list largely restates the schema enum values and adds little parameter-level meaning beyond the schema itself. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (read UI/design guidance before building or changing UI) sourced from uxlint's audit corpus and the project's uxlint.design.json. It also distinguishes itself from siblings by defining the loop that terminates in audit_url. An agent can tell exactly what this tool returns versus audit_url or get_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to read BEFORE building or changing UI, names the alternative audit_url as the confirmation step after building, and states the exclusions: only explicitly approved versioned decisions guide edits, and never auto-approve or rewrite the contract. When-to-use, when-not, and the sibling handoff are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_fixA

After editing to fix a finding, re-check ONE rule on ONE page — the 'did my fix land?' loop, far quicker than a full re-audit (one route, no crawl, no judge). Returns whether the rule still fires, AND names any OTHER deterministic findings now on that page (the regression guard — so a fix that clears your rule but breaks something else here doesn't read as all-clear). Returns status passed, failed, not_evaluated or inconclusive. A pass requires explicit server evidence for the requested route and both viewports. Currently supported passing checks: page-title-missing, html-lang-missing, horizontal-overflow. Other rules can report observed failures but cannot pass without execution evidence; re-run audit_url for judge, interaction and site checks. Unknown rules and missing evidence never clear. A cleared finding is not a user endorsement of the fix.

NameRequiredDescriptionDefault
baseNoBase URL — an ORIGIN like http://localhost:5173, NOT a path. Optional: omit to use the `base` in the project's uxlint.toml.
ruleYesThe rule to verify is gone, e.g. contrast, tap-target, unlabelled-field
routeNoThe route to check, e.g. /pricing (default /)
statesNoDrive interaction states (needed for state/form/interaction rules)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does a good job: discloses that the tool only reports observed failures for rules not in the supported passing list, that unknown rules and missing evidence never clear, and that a cleared finding is not a user endorsement of the fix. It also explains the regression guard behavior. It does not explicitly state whether the operation is read-only or has side effects, but given the described behavior (a check), this is implicit. One might argue for a 5, but the lack of explicit mention of side-effect-freeness or any destructive potential is a tiny gap; still, it's quite thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a solid paragraph, slightly long but information-dense. It front-loads the purpose, then adds critical caveats. It could be split into bullet points for readability, but every sentence earns its place — no filler. The length is justified given the complexity (supported rules, evidential requirements, regression guard, exclusions).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema and no annotations, the description does an excellent job of covering everything an agent needs: what it does, when to use it, what the return statuses mean, what constitutes a pass (explicit server evidence for the requested route and both viewports), which rules are supported for passing, what happens for other rules, and how to handle judge/interaction/site checks. It also mentions the regression guard, covering the risk of a fix breaking something else. Very complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds context about the rule parameter (which rules are supported for passing) and hints at the interaction states for state/form/interaction rules, but does not add substantial new semantics beyond what's in the schema. The description does not mention default values or relationships that are not already present in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific verb ('re-check'), resource ('ONE rule on ONE page'), and purpose ('did my fix land?'). It clearly distinguishes itself from a full re-audit by naming the alternative (audit_url) and explaining the difference (one route, no crawl, no judge). The description is not a tautology; it explains the tool's role in the fix-verify workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (after editing to fix a finding, to verify a specific fix) and when not to use it (for judge, interaction and site checks — says to re-run audit_url for those). It also names the sibling tool audit_url as the alternative. It provides clear conditions: a pass requires explicit server evidence for the requested route and both viewports, and unsupported rules cannot pass. This is explicit and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.1.46
    • Addedacknowledge_finding
    • Changedux_guidance1 field changed
      • changedInput schema / properties / topic / description
        Previous value: -"Which area to get guidance for: layout, forms, lists, navigation, components, performance,\naccessibility, content. Omit for the index of topics; \"all\" for everything. Accepts aliases\n(copy, nav, a11y, perf, dry, …) and falls back to the index for anything unrecognized."New value: +"Which area to get guidance for: layout, forms, lists, navigation, components, performance,\naccessibility, content, money (plans, checkout, usage, cost before an action). Omit for the\nindex of topics; \"all\" for everything. Accepts aliases\n(copy, nav, a11y, perf, dry, …) and falls back to the index for anything unrecognized."
  2. 2 tool updatesv0.1.41
    • Changedaudit_url1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": null,
        +  "description": "`full` for every finding's fix, best practice, rect and screenshot URL in the structured\nresult. Default is compact: every finding, with each rule's fix said once — the full form can\nrun past a client's output limit on a big site.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedget_report
  3. 4 tool updates
    • First observedaudit_url
    • First observedget_shot
    • First observedux_guidance
    • First observedverify_fix

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a distinct role in the audit workflow: running audits, reading reports, viewing screenshots, verifying fixes, acknowledging findings, and getting design guidance. While audit_url and get_report both surface findings, one initiates a run and the other retrieves an existing one, and the descriptions make this boundary clear. No two tools appear interchangeable.

Naming Consistency4/5

Most tools follow a verb_noun pattern (acknowledge_finding, get_report, get_shot, verify_fix), with audit_url fitting the same style. The sole deviation is ux_guidance, a noun phrase with a ux_ prefix, which breaks the pattern slightly but remains readable and unambiguous.

Tool Count5/5

Six tools cleanly cover the core loop of guidance, audit, inspect, verify, and acknowledge. Nothing feels redundant or missing at this scale, and the set is well-scoped for a focused UX linting server.

Completeness4/5

The surface covers the main lifecycle: read guidance, run an audit, retrieve reports, view evidence, verify individual fixes, and acknowledge false positives. A list_reports tool for discovering existing report IDs without already having a URL is a minor missing convenience, but most workflows are fully supported.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Audit any website for privacy, security, accessibility, and performance issues — with scores, grades, and actionable fix instructions. No account required.
    3
    7 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Point your coding agent at a URL and get a real-browser QA audit: broken signup/login/checkout flows, JS console errors, missing analytics, consent + security headers, mobile tap targets, and accessibility — returned as machine-verified findings graded A-F.
    44
    22 PyPI
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Design review for UI code, inside your coding agent. Reviews React, Vue, Svelte, CSS and SwiftUI against 313 rules and returns scored findings with file:line fixes your agent can apply and verify.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI coding agents to audit rendered web pages for design and UI defects by measuring geometry, styles, contrast and motion in a local browser and judging them against evidence-tiered rules. Findings come back as short, fixable items expressed in the project's own design tokens, while only sanitized numeric measurements leave the machine.
    Apache 2.0