
aieo
io.github.web-casa由 GitHub 帳號 web-casa 發布v1.3.0更新於 Oct 29, 2026
SEO and AI-search checks for a website's build output, fixed in the source files
概覽
以唯讀 MCP 工具執行 aieo 的 SEO 與 AI 搜尋檢查,針對網站的建置產物,讓助理檢視檢查結果與計畫。
- 可以做什麼
- 執行建置檢查與基準差異比對,並檢視單一頁面的檢查結果
- 查詢規則中繼資料並解釋檢查項編號
- 報告存取日誌涵蓋情形、爬蟲抓取缺口與搜尋引擎資料
- 顯示 IndexNow 提交與上傳至 aieo.ee 的計畫,但不實際送出
- 透過選用的 project 目錄把工具限定在 monorepo 中的某個網站
- 適用情境
- 適合在助理協助維護以支援框架(Astro、Next.js、Nuxt、Hugo、VitePress、Docusaurus 等)建置的網站時,在發布前從建置產物診斷 SEO、結構化資料、網站地圖、robots 或 AI 爬蟲問題,或檢視某次部署帶來哪些變更。
- 執行需求
- 需要安裝 aieo 執行檔並加入 PATH;伺服器以 stdio 在本機執行,須在專案目錄中啟動。選用功能需要各自的憑證:Search Console 需要 Google Cloud OAuth 用戶端或 GOOGLE_APPLICATION_CREDENTIALS,Bing 需要 BING_WEBMASTER_API_KEY,拉取日誌需要 CLOUDFLARE_API_TOKEN,推送至 aieo.ee 需要組織 API 金鑰。爬蟲 IP 驗證與搜尋資料需要網路存取,除非使用離線模式。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 aieo,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
aieo-cli
SEO/GEO checks for a site's build output, before it ships — the inside view for aieo.ee.
aieo.ee checks what a site serves over HTTP. aieo reads what the build
produced (dist/), what the framework declares and what the deployment
config adds (_redirects, _headers, vercel.json, netlify.toml,
Next.js manifests), and checks that the pieces agree with each other:
sitemap ↔ robots.txt ↔ canonical ↔ hreflang ↔ internal links ↔ llms.txt ↔
redirects ↔ framework settings. With a baseline it fails a build only on
what the change made worse.
Install
Static binaries for Linux (x86_64, aarch64), macOS (Apple silicon, Intel)
and Windows are attached to each GitHub release,
with a .sha256 next to each; install.sh verifies it and installs to
~/.local/bin (AIEO_VERSION=1.0.0 pins a release, AIEO_INSTALL_DIR
changes the directory). From source: cargo install --git https://github.com/web-casa/aieo-cli aieo-cli
(Rust 1.88+).
Frameworks
The preset is detected from package.json and config files (--preset to
force one). Findings point at the source file a page was built from.
Server builds (Next.js .next/, Nuxt and TanStack Start with a server
bundle) are served as production would: prerendered HTML, public/, the
redirects/rewrites/headers of routes-manifest.json, and every other route
as rendered on request — links to it count as working, its HTML is not
checked, and a server-rendered homepage makes the homepage modules
unverified (exit 2 unless --allow-incomplete). Client-rendered SPAs are
checked for what crawlers without JavaScript see (K-SPA-SHELL).
fixtures/presets/ holds a real build of the same site per framework with
its snapshot (cargo test -p aieo-cli --test presets).
What it checks
Every rule has an id, a tier and a source: aieo rules, aieo explain <id>.
Tiers: error = a deterministic defect (fails the default gate),
warning = high risk (fails a diff when new), notice = advice. Rules
without an official source are marked heuristic and are never errors by
default; length-based title rules are off unless enabled.
Exit codes: 0 gate passed · 1 gate failed · 2 incomplete evidence
(no homepage, origin unknown, undecodable HTML) or a usage error — a check
that could not see enough never reports "all clear".
Same rules as aieo.ee
The rule metadata, crawler catalog and bundle schema in spec/ are exported
from @aieo/rules, the package aieo.ee's scanner reads. F02–F18 are
implemented twice (TypeScript in aieo.ee, Rust here) and held together by
the conformance fixtures in spec/fixtures/conformance: the same tiny sites,
the same module status, ratio and reason (cargo test -p aieo-rules --test conformance). F01 (HTTPS, redirects) needs a live origin; F15 reads a .md
twin of the homepage instead of content negotiation.
Access logs
- Who: user agents are matched against the shared crawler catalog
(
spec/crawlers.json: OAI-SearchBot, ChatGPT-User, GPTBot, Claude-*, PerplexityBot, Googlebot, Bingbot, Applebot, …) and classed assearch_index,user_fetch,training,classic_search, other automation or people. Visits whose referrer (orutm_source) is an AI answer platform are AI referrals. - Verified or not: a claimed crawler is checked against its
operator's published IP ranges (downloaded, cached a day under
.aieo/cache/, listcreationTimerecorded), then by forward-confirmed reverse DNS where the operator documents it.mismatch= spoofed; a crawler without a published method isunverifiable, never called fake.--offlineskips the network. - Kept locally:
.aieo/logs.db(SQLite). A file is recognised by its first bytes, so a growing log resumes and a rotated copy is not counted twice. Crawler requests keep a salted IP hash (.aieo/salt), people only per-day counts — no IPs, no browser user agents..aieo/.gitignorekeeps the salt, database and caches out of git. - Findings (L): a crawler mostly answered 401/403/429 (WAF / bot protection), crawler 5xx, robots.txt unavailable (5xx/429), a crawler 404 spike, spoofed crawlers, verified crawlers on disallowed paths, AI search crawlers reaching few indexable pages. With a build next to the logs, coverage is measured against its indexable pages.
- Cloudflare GraphQL returns sampled hourly counts without IPs: rows
carry their count, verification stays
unchecked, and the plan's limits are read from the zone'ssettings. aieo exportadds the log aggregates (logsinaieo-bundle/v1) when.aieo/logs.dbexists.
Search engines
Everything runs with your own credentials, stored in your config
directory (~/.config/aieo/credentials.json, owner-only) or taken from
the environment in CI. Data lands in .aieo/search.db.
- CI: set
GOOGLE_APPLICATION_CREDENTIALSto a service account key whose e-mail is a user of the Search Console property (the device flow does not allow Search Console scopes). - URL Inspection keeps a local quota ledger (2,000 per property a day, 600 a minute) and inspects the URLs it looked at longest ago first.
- Findings (S), read against the build: an indexable page Google has not indexed, a canonical Google overrode, a page the build serves that Google could not fetch / found blocked / saw noindexed (production is not what was built), clicks halved against the previous period, an IndexNow key the build does not serve.
- Bing's AI Performance and Google's AI Overviews report have no API; the Bing overview export is imported with the same rules as aieo.ee.
IndexNow
Changes are found by comparing page hashes with the baseline
(aieo snapshot), so only what a deploy touched is sent. Nothing is
sent without --yes, and every request is recorded in
.aieo/audit.jsonl.
aieo.ee
aieo push uploads to [aieo] project in aieo.toml (or --to <id>).
The same commit and kinds uploaded twice are recognised as one run. The
bundle carries findings, page inventory and aggregates — no page source,
raw logs or IP addresses — and can also be dropped on the project's
"Inside view" page.
Configuration (aieo.toml)
[[hosting.*]] rules apply after the ones the build and the host config
declare; use them when routing lives in code (Next.js middleware, an edge
function) so that links into rewritten paths are not reported as broken.
CI
Findings appear as annotations on the pull request, a Markdown summary is
added to the job summary, SARIF and the evidence bundle are written next to
the project. Without the action:
aieo diff --format github --report sarif=aieo.sarif --report bundle=.aieo/bundle.json.gz.
GitLab: include ci/gitlab-ci.yml and extend .aieo;
findings show as a JUnit test report on the merge request.
AI agents (plugin, skills, MCP)
The aieo binary must be on PATH (see Install). Then:
The same directory is a Cursor plugin (.cursor-plugin/), for the Cursor
Marketplace; until it is listed there, use the skills and MCP rows above.
The plugin brings five skills — aieo (check → edit the source file →
rebuild → check), aieo-ci, aieo-crawlers, aieo-indexing,
aieo-llms-txt (plugins/aieo/skills) — and the MCP
server.
aieo mcp serves read-only tools over stdio: check, diff, page,
explain_rule, list_rules, logs_report, logs_gaps, search_report,
indexnow_plan, push_plan. Each takes an optional project (a directory
relative to where the server runs) for one site in a monorepo. Nothing
that writes outside the machine is a tool — the *_plan tools show what
aieo indexnow submit --yes or aieo push would do, for the user to run.
Output and data
--format pretty | json | sarif | github | markdown | junit, plus any number of
--report FORMAT=PATH (bundle = gzip JSON). JSON and the bundle are
aieo-bundle/v1 (spec/bundle.schema.json): findings, page inventory,
readiness and multi-page scores — never page source, raw logs or IP
addresses. Configuration findings carry the config file and line
(astro.config.mjs:4, vercel.json:12), so SARIF and GitHub annotations
land on the setting to change.
Rule versions
Rules come from @aieo/rules (embedded in the binary):
a patch release changes wording or fixes a false positive, a minor release
adds rules, a major release changes what an existing rule means. Rule ids
are never reused. A finding from a rule added — or widened, see changed
in spec/rules-history.json — after the
baseline was taken is reported as unknown, not new, so upgrading aieo
alone never fails aieo diff; take a new snapshot to adopt it.
Development
Crates: aieo-core (spec, findings, config, bundle) · aieo-site (build
directory as production serves it: routes, host rules, robots, sitemaps,
HTML, framework presets) · aieo-rules (F / P / T / C / K / D) ·
aieo-report (formats) · aieo-logs (parsers, classification, IP
verification, SQLite store, Cloudflare GraphQL) · aieo-search (Search
Console, Bing Webmaster, IndexNow, credentials, aieo.ee upload) ·
aieo-cli (the aieo binary).
MIT licensed.
來源:README.md,提交 c23ab55
工具
0版本歷史
3- v1.3.0最新Oct 29, 2026
- v1.2.0Oct 22, 2026
- v1.1.1Oct 22, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分