aieo について
aieo は、ウェブサイトのビルド成果物、フレームワーク設定、デプロイ設定を調べ、SEO と AI 検索の問題を検出するコマンドラインツールです。サイト開発者は問題箇所をソースファイルまで追跡し、保存したベースラインと比較して変更を判定できます。
主な機能
- 01ビルド成果物とフレームワーク設定の検査
- 02問題箇所をソースファイルまで追跡
- 03保存したベースラインとの比較
- 04クローラーと AI 流入のアクセスログ分析
- 05検索パフォーマンスとインデックス情報の確認
- 06問題のエクスポートと IndexNow による変更 URL の送信
活用シーン
- 01デプロイ前に CI で SEO の不備を検出
- 02サイト変更で新たに生じた問題を特定
- 03クローラーのブロックと AI 検索のカバレッジを調査
- 04ビルド成果物と検索エンジンのインデックスを照合
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
aieo-cli
サイトを公開する前に、ビルド出力のSEO/GEOをチェックします。aieo.eeの内部を確認できます。
aieo.eeは、サイトがHTTP経由で配信する内容をチェックします。aieoは、ビルドで生成された内容(dist/)、フレームワークの宣言、デプロイ設定で追加される内容(_redirects、_headers、vercel.json、netlify.toml、Next.jsマニフェスト)を読み取り、各要素が相互に整合しているかをチェックします。
サイトマップ ↔ robots.txt ↔ canonical ↔ hreflang ↔ 内部リンク ↔ llms.txt ↔ リダイレクト ↔ フレームワーク設定。ベースラインを指定すると、変更によって悪化した項目だけを対象にビルドを失敗させます。
aieo init # detect the framework, write aieo.toml
aieo check # check ./dist; exit 1 when the gate fails
aieo snapshot # save .aieo/baseline.json
aieo diff # fail only on findings new since the baseline
aieo export # .aieo/bundle.json.gz (aieo-bundle/v1) for aieo.ee
aieo rules / aieo explain C-SITEMAP-URL-NOINDEX
aieo logs ingest /var/log/nginx/ # crawler & AI-referral evidence from access logs
aieo logs report # coverage, verification, blocking, errors, AI referrals
aieo search google inspect # Google's view of the build's pages (URL Inspection)
aieo indexnow submit --yes # tell Bing & co. what changed since the baseline
aieo login && aieo push # upload the bundle to the aieo.ee project
aieo mcp # the same checks as read-only MCP tools for AI agents
インストール
curl -fsSL https://raw.githubusercontent.com/web-casa/aieo-cli/main/scripts/install.sh | sh
Linux(x86_64、aarch64)、macOS(Apple silicon、Intel)、Windows用の静的バイナリは、それぞれのGitHubリリースに添付されています。各バイナリの横には.sha256ファイルがあり、install.shが検証したうえで~/.local/binにインストールします(AIEO_VERSION=1.0.0でリリースを固定でき、AIEO_INSTALL_DIRでディレクトリを変更できます)。ソースからインストールする場合:cargo install --git https://github.com/web-casa/aieo-cli aieo-cli(Rust 1.88以降)。
フレームワーク
プリセットはpackage.jsonと設定ファイルから検出されます(強制するには--presetを指定します)。検出結果には、ページのビルド元となったソースファイルが示されます。
| プリセット | チェック対象のビルド | 設定から読み取る項目(リテラルのみ) | トレース先のページ |
|---|---|---|---|
static | 任意のディレクトリ | — | — |
astro、starlight | dist/(outDir) | site、base、trailingSlash | src/pages/**、src/content/docs/** |
next | out/(output: 'export')または.next/ | basePath、trailingSlash、output、metadataBase | app/**/page.*、pages/** |
nuxt | .output/public | site.url、app.baseURL、ssr、routeRulesのリダイレクト | app/pages/**、pages/** |
vue | dist/(build.outDir) | base | src/pages/**(ファイルルーティング) |
tanstack | dist/client、.output/public、dist/ | base | src/routes/** |
hugo | public/(publishDir) | baseURL、uglyURLs、言語 | content/** |
vitepress | .vitepress/dist | sitemap.hostname、base、cleanUrls、srcDir | **/*.md |
docusaurus | build/ | url、baseUrl、trailingSlash | docs/**、blog/**、src/pages/** |
サーバービルド(Next.jsの.next/、およびサーバーバンドルを使用するNuxtとTanStack Start)は、本番環境と同様に処理されます。プリレンダリング済みHTML、public/、routes-manifest.jsonのリダイレクト/リライト/ヘッダーが配信され、その他のすべてのルートはリクエスト時にレンダリングされます。これらのルートへのリンクは動作しているものとして扱われますが、HTMLはチェックされません。また、サーバーでレンダリングされるホームページがある場合、ホームページのモジュールは未検証となります(--allow-incompleteを指定しない場合、終了コード2)。クライアントでレンダリングされるSPAは、JavaScriptを実行しないクローラーから見える内容を対象にチェックされます(K-SPA-SHELL)。
fixtures/presets/には、各フレームワークで同じサイトを実際にビルドしたものと、そのスナップショットが格納されています(cargo test -p aieo-cli --test presets)。
チェック項目
| ファミリー | 例 | |
|---|---|---|
| F01–F18 | ビルドを基に判定する、aieo.ee の AI 対応状況モジュール | robots.txt の AI クローラー対応マトリクス、noindex、サイトマップ、canonical、llms.txt、JavaScript なしでは表示されないコンテンツ |
| P01–P04 | 複数ページを対象とするモジュール(GEOReady のもの)。インデックス可能なすべてのページを対象に、それぞれ独立して 0~100 で採点 | 固有のメタデータ、ナビゲーションと内容、API/製品データ、組織アイデンティティの統一 |
| T-… | ページごと | title の欠落、重複した title(hreflang の代替ページは除く)、不正な JSON-LD、schema.org の @context がない JSON-LD、Google がリッチリザルトに要求するプロパティの欠落、廃止されたリッチリザルトの種類(HowTo、FAQPage、…) |
| C-… | ビルド全体 | サイトマップに、存在しない/noindex/canonical でない/別のホストにある/robots.txt でブロックされているページが含まれている、戻りリンクのない hreflang、存在しないページまたは別のホストを指す canonical、内部リンク切れ、孤立ページ、存在しないページへのリンクを含む llms.txt、本番環境に配置された Disallow: /、AI 検索クローラーのブロック |
| K-… | 設定 | フレームワークの site/ベースパス/末尾スラッシュ設定と canonical およびサイトマップの URL の不一致、リダイレクトループ、リダイレクトチェーン、転送先のないリダイレクト(ファイルと行番号を表示)、サイトマップのページを noindex にするヘッダールール、静的エクスポートで無視される Next.js の redirects()、クライアント側でレンダリングされた単一のシェルが応答するルート |
| L-… | アクセスログ(aieo logs) | WAF/CDN によるクローラーのブロック、クローラーへの 5xx 応答、robots.txt にアクセスできない、デプロイ後の 404 急増、偽装クローラー、許可されていないパスへのクロール、AI 検索のカバレッジ不足 |
| S-… | 検索エンジン(aieo search) | インデックス可能なページがインデックス未登録、Google による canonical の上書き、本番環境の応答とビルドの不一致、クリック数の半減、IndexNow キーが配信されていない |
| D-… | ベースラインとの比較 | ページがリダイレクトなしで削除された、ページが noindex に変更された、canonical が変更された、hreflang または構造化データが失われた、コンテンツが縮小した |
各ルールには ID、重大度、情報源があります。aieo rules、aieo explain <id> を参照してください。
重大度:error は確定的な不具合です(デフォルトのゲートで失敗します)。
warning は高リスクです(新たに発生した場合、diff で失敗します)。notice は助言です。公式な情報源がないルールにはヒューリスティックと明記され、デフォルトでエラーになることはありません。長さに基づく title のルールは、有効にしない限り無効です。
終了コード:0 ゲート通過 · 1 ゲート失敗 · 2 証拠不十分(ホームページがない、オリジン不明、HTML をデコードできない)、または使用方法のエラー — 十分な情報を確認できなかったチェックが「問題なし」と報告することはありません。
aieo.ee と同じルール
spec/ のルールメタデータ、クローラーカタログ、バンドルスキーマは、aieo.ee のスキャナーが読み込むパッケージ @aieo/rules からエクスポートされています。F02–F18 は 2 回実装されています(aieo.ee では TypeScript、こちらでは Rust)。spec/fixtures/conformance の適合性フィクスチャによって、同じ小規模サイト、同じモジュールステータス、比率、理由を用いて整合性が保たれています(cargo test -p aieo-rules --test conformance)。F01(HTTPS、リダイレクト)には稼働中のオリジンが必要です。F15 はコンテンツネゴシエーションの代わりに、ホームページの .md 版を読み込みます。
アクセスログ
aieo logs ingest access.log access.log.1.gz # Nginx/Apache, Caddy, Cloudflare Logpush,
# Vercel drains, CloudFront — detected per file
aieo logs ingest app.log --format "nginx:\$host \$remote_addr [\$time_local] \"\$request\" \$status …"
CLOUDFLARE_API_TOKEN=… aieo logs pull cloudflare --zone <zone id> --since 7d
aieo logs report [--since 30d] [--format json]
aieo logs gaps --actor search_index # indexable pages AI search crawlers never fetched
aieo logs referrals # landing pages of visits from ChatGPT, Perplexity, …
- 対象:ユーザーエージェントを共通のクローラーカタログ(
spec/crawlers.json:OAI-SearchBot、ChatGPT-User、GPTBot、Claude-*、 PerplexityBot、Googlebot、Bingbot、Applebot、…)と照合し、search_index、user_fetch、training、classic_search、その他の 自動化ツール、または人に分類します。リファラー(またはutm_source)が AI 回答プラットフォームの場合、そのアクセスは AI 経由の参照です。 - 検証の有無:クローラーを名乗るアクセスは、運営者が公開する IP 範囲
(
.aieo/cache/にダウンロードして1日間キャッシュし、一覧のcreationTimeを記録)で確認し、その運営者が文書化している場合は 正引き確認付き逆引き DNS でも検証します。mismatchはなりすましです。 公開された検証方法がないクローラーはunverifiableとし、偽物とは 判定しません。--offlineを指定すると、ネットワークアクセスを省略します。 - ローカル保存先:
.aieo/logs.db(SQLite)。ファイルは先頭バイトで 認識するため、増加中のログは続きから処理され、ローテーションされた コピーは二重にカウントされません。クローラーのリクエストではソルト付きの IP ハッシュ(.aieo/salt)を保持し、人のアクセスについては日ごとの件数 のみを保持します。IP アドレスやブラウザーのユーザーエージェントは 保存しません。.aieo/.gitignoreにより、ソルト、データベース、 キャッシュが Git に含まれないようになっています。 - 検出事項(L):クローラーの応答の大半が 401/403/429(WAF/ボット 保護)だった場合、クローラーの 5xx、robots.txt が利用できない場合 (5xx/429)、クローラーの 404 急増、なりすましクローラー、許可されて いないパスにアクセスした検証済みクローラー、インデックス可能なページに あまり到達していない AI 検索クローラーを検出します。ログと同じ場所に ビルドがある場合、カバレッジはそのビルドのインデックス可能なページを 基準に測定します。
- Cloudflare GraphQL は、IP アドレスを含まないサンプリング済みの
時間別件数を返します。各行には件数が含まれ、検証状態は
uncheckedの ままです。プランの制限はゾーンのsettingsから読み取ります。 .aieo/logs.dbが存在する場合、aieo exportはログの集計値を (aieo-bundle/v1のlogsとして)追加します。
検索エンジン
すべての処理は独自の認証情報を使って実行されます。認証情報は設定
ディレクトリ(~/.config/aieo/credentials.json、所有者のみアクセス可能)
に保存するか、CI では環境から取得します。データは .aieo/search.db に
保存されます。
# Google Search Console — your own "Desktop app" OAuth client from Google Cloud
aieo search google login --client-secret client_secret.json # browser, loopback redirect
aieo search google pull --days 28 # clicks per page and day, top queries
aieo search google inspect [--limit 200] # URL Inspection of indexable pages, stalest first
# Bing Webmaster Tools — API key from Settings → API Access
aieo search bing key # or BING_WEBMASTER_API_KEY
aieo search bing pull
aieo search bing import-ai export.csv # AI Performance overview export (Date, Citations, Cited Pages)
aieo search report
- CI:Search Console のプロパティのユーザーであるサービスアカウントの
メールアドレスを持つサービスアカウントキーに
GOOGLE_APPLICATION_CREDENTIALSを設定します(デバイスフローでは Search Console のスコープを使用できません)。 - URL 検査:ローカルのクォータ台帳(プロパティごとに1日2,000件、 1分あたり600件)を保持し、最後に調査した時点が最も古い URL から検査します。
- 検出事項(S)。ビルドと照合して読み取ります。Google がインデックスに 登録していないインデックス可能なページ、Google が上書きした canonical、 Google が取得できなかった/ブロックされていると判断した/noindex を確認 した、ビルドで提供されるページ(本番環境がビルド時の内容と異なります)、 前の期間と比較してクリック数が半減した場合、ビルドで提供されない IndexNow キーを検出します。
- Bing の AI Performance と Google の AI Overviews レポートには API が ありません。Bing の概要エクスポートは、aieo.ee と同じルールで インポートされます。
IndexNow
aieo indexnow keygen --write # key file into public/ (static/ for Hugo, Docusaurus)
aieo indexnow verify # in the build? served live?
aieo indexnow submit # plan: new, changed and removed pages since the baseline
aieo indexnow submit --yes # send (Bing, Yandex, Seznam, Naver, … share it; not Google)
変更は、ページハッシュをベースライン(aieo snapshot)と比較して検出する
ため、デプロイによって変更されたものだけが送信されます。--yes を指定
しない限り何も送信されず、すべてのリクエストは .aieo/audit.jsonl に
記録されます。
aieo.ee
aieo login # an organisation API key with write access; finds the project for `site`
aieo push # export the bundle (check + logs + search) and upload it
aieo push は、aieo.toml の [aieo] project(または --to <id>)に
アップロードします。同じコミットと種類を2回アップロードしても、1回の実行
として認識されます。バンドルには検出事項、ページ一覧、集計値が含まれます。
ページのソース、未加工のログ、IP アドレスは含まれません。また、プロジェクトの
「Inside view」ページにドロップすることもできます。
設定(aieo.toml)
site = "https://example.com" # production origin
dist = "dist"
preset = "starlight"
[check]
# fail_on = ["error"] # default; with a baseline ["new:error", "new:warning"]
baseline = ".aieo/baseline.json"
ignore = ["/drafts/**"] # URL paths left out of page rules
[rules]
"C-ORPHAN-PAGE" = "notice" # error | warning | notice | off | on
[[suppress]] # every suppression has an owner, a reason and an expiry
rule = "C-LINK-BROKEN"
url = "/legacy/**"
reason = "old docs, removed in Q1"
owner = "docs-team"
expires = "2026-12-31"
[aieo]
project = "…" # aieo.ee project id for `aieo push`
[search]
google_property = "sc-domain:example.com" # default: the property covering `site`
bing_site = "https://example.com/"
[indexnow]
key = "…" # public; served as /<key>.txt
[[hosting.rewrites]] # routing the build cannot show (middleware, edge functions)
from = "/:path*"
to = "/en/:path*"
[[hosting.redirects]]
from = "/old/:slug"
to = "/new/:slug"
status = 301
[[hosting.*]] ルールは、ビルドとホストの設定で宣言されたルールの後に
適用されます。ルーティングがコード(Next.js ミドルウェア、エッジ関数)に
ある場合は、このルールを使用してください。そうすることで、書き換えられた
パスへのリンクが壊れていると報告されなくなります。
CI
- run: npm run build
- uses: web-casa/aieo-cli@v1 # composite action, see action.yml
with:
version: 1.3.0 # prebuilt binary; the default "source" builds with cargo
command: diff # or check
upload-sarif: "true" # GitHub code scanning (security-events: write)
# push: "true" # upload the bundle to aieo.ee (aieo-api-key: ${{ secrets.AIEO_API_KEY }})
# indexnow: "true" # submit what changed since the baseline
検出結果はプルリクエストのアノテーションとして表示され、Markdown の概要がジョブの概要に追加され、SARIF とエビデンスバンドルがプロジェクトの隣に書き込まれます。アクションを使わない場合:
aieo diff --format github --report sarif=aieo.sarif --report bundle=.aieo/bundle.json.gz。
GitLab:ci/gitlab-ci.yml を読み込み、.aieo を拡張します。検出結果はマージリクエストに JUnit テストレポートとして表示されます。
AI エージェント(プラグイン、スキル、MCP)
aieo バイナリが PATH に設定されている必要があります(「インストール」を参照)。そのうえで、次の手順を実行します。
| エージェント | インストール |
|---|---|
| Claude Code | /plugin marketplace add web-casa/aieo-cli を実行し、続けて /plugin install aieo@aieo を実行 |
| Codex | codex plugin marketplace add web-casa/aieo-cli を実行し、続けて codex plugin add aieo@aieo を実行 |
| スキルに対応する任意のエージェント(OpenClaw、Hermes、Cursor、…) | npx skills add web-casa/aieo-cli |
| Claude Desktop およびその他の MCPB ホスト | リリースから aieo-v<version>.mcpb を開き、サイトのディレクトリを選択 |
| 任意の MCP クライアント | {"command": "aieo", "args": ["mcp"]} をプロジェクトディレクトリで起動 |
同じディレクトリは Cursor Marketplace 用の Cursor プラグイン(.cursor-plugin/)でもあります。Marketplace に掲載されるまでは、上記のスキルと MCP の行に記載された方法を使ってください。
このプラグインには 5 つのスキル — aieo(チェック → ソースファイルを編集 → 再ビルド → チェック)、aieo-ci、aieo-crawlers、aieo-indexing、aieo-llms-txt(plugins/aieo/skills)— と MCP サーバーが含まれます。
aieo mcp は stdio 経由で読み取り専用のツールを提供します:check、diff、page、explain_rule、list_rules、logs_report、logs_gaps、search_report、indexnow_plan、push_plan。各ツールでは、モノレポ内の 1 つのサイトを対象にするため、任意で project(サーバーの実行場所からの相対パスとなるディレクトリ)を指定できます。マシンの外部に書き込みを行うものはツールではありません。*_plan ツールは aieo indexnow submit --yes または aieo push が実行する内容を示すので、ユーザーが実行してください。
出力とデータ
--format pretty | json | sarif | github | markdown | junit に加え、任意の数の --report FORMAT=PATH(bundle = gzip 圧縮 JSON)を指定できます。JSON とバンドルは aieo-bundle/v1(spec/bundle.schema.json)形式です。含まれるのは検出結果、ページ一覧、対応状況、複数ページのスコアであり、ページソース、未加工のログ、IP アドレスは含まれません。設定に関する検出結果には設定ファイルと行番号(astro.config.mjs:4、vercel.json:12)が含まれるため、SARIF と GitHub のアノテーションは変更すべき設定箇所を示します。
ルールのバージョン
ルールは @aieo/rules(バイナリに埋め込み)から取得されます。パッチリリースでは文言の変更や誤検知の修正が行われ、マイナーリリースではルールが追加され、メジャーリリースでは既存のルールの意味が変更されます。ルール ID は再利用されません。ベースライン作成後に追加されたルール、または対象範囲が拡大されたルール(spec/rules-history.json の changed を参照)による検出結果は new ではなく unknown として報告されるため、aieo のアップグレードだけで aieo diff が失敗することはありません。新しいルールを採用するには、新たにスナップショットを取得してください。
開発
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
# refresh spec/ from aieo.ee's @aieo/rules (in the aieo-v5 monorepo)
pnpm --filter @aieo/rules export:cli <path to this repo>
クレート:aieo-core(仕様、検出結果、設定、バンドル) · aieo-site(本番環境で提供されるビルドディレクトリ:ルート、ホストルール、robots、サイトマップ、HTML、フレームワークのプリセット) · aieo-rules(F / P / T / C / K / D) · aieo-report(フォーマット) · aieo-logs(パーサー、分類、IP 検証、SQLite ストア、Cloudflare GraphQL) · aieo-search(Search Console、Bing Webmaster、IndexNow、認証情報、aieo.ee アップロード) · aieo-cli(aieo バイナリ)。
MIT ライセンスです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。