
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 分