storeExternalSite() now passes through category, githubUrl, githubStars, displayName, description, verified on upsert (previously hardcoded category: null and omitted fields on conflict)
scripts/import-third-party.ts + pnpm import:third-party:prod for future re-imports
Directory CATEGORY_LABELS extended with 10 new categories: search, database, infrastructure, productivity, communication, utilities, payments, web-scraping, email, design
Directory — Benchmark Rating Stars
renderStars(rating) helper added to lib/ui-utils.ts — converts 1–5 float to ★/☆ string
Directory cards: show amber ★ stars below Agent Score when benchmarkRating is set
Agent detail page: Benchmark stars displayed inline next to Agent Score in header
E-commerce Generators (OSS)
Product extraction: JSON-LD → microdata → OG tag precedence, per-URL dedup, quality filter (name + price/description)
MCP tools: search-products, get-product, check-inventory, get-reviews — added to all 3 server templates (standalone, Vercel, CF Workers) with shared handler code
Product schema JSON-LD: generates @type: Product with Offers, Brand, AggregateRating for pages with microdata/OG product data but no existing Product JSON-LD
Pass-through for sites with existing /.well-known/ucp manifest (validated JSON)
Generated manifest advertises product_search capability pointing to agent's MCP endpoint
Storage: sites/{slug}/ucp.json in Vercel Blob, wired into deploy + directory-submit + refresh flows
Serving: /.well-known/ucp on agent subdomains via middleware rewrite + dedicated route handler
Lightweight loadSiteUcpManifest() loader (reads only ucp.json, not full SiteData)
A2A Commerce Integration
Commerce-ready agent cards: e-commerce sites (UCP manifest or category: "ecommerce") get product-search, get-product-details, and optional initiate-checkout skills in /.well-known/agent-card.json
deriveCapabilities() extended with optional category param — emits "commerce" badge for ecommerce sites
Directory filter UI: new "Commerce" capability filter badge
Meta-agent search_websiteshasCapability enum updated with "commerce" — DB-filters by category = "ecommerce"
GitHub Action Polish
GitHub Action polish: enhanced packages/github-action with better error messages (::error:: annotations), badge integration (badge-url output, badge in PR comments), configurable formats (formats input), max-pages input, and generate: false audit-only mode. Updated README with badge embedding guide, new examples, and troubleshooting section.
Public REST API at GET /api/v0/servers — list/search directory agents with filtering by category, capability, hosting type, min score; pagination (limit/offset); 60 req/min per IP; edge-cached (s-maxage=60)
Single-server endpoint at GET /api/v0/servers/[slug] — full metadata including raw tools array
Extended lib/directory/search.ts: searchWebsitesWithCount() (pagination + total count), buildSearchConditions() helper, offset param on searchWebsites()
lib/ai-bots.ts: canonical registry of 58+ AI bots (OpenAI, Anthropic, Google, Meta, ByteDance, Perplexity, and 50+ more) with regex patterns; matchBot(userAgent) function
bot_visits DB table: daily aggregation per bot per site — (site_id, date, bot_name, count), unique index on triple, secondary index on (site_id, date) for dashboard queries; migration 0017_nappy_red_skull.sql
20 new unit tests covering pass/partial/fail/skip for all 3 checks
Score Segment History
Extended site_score_history table with 3 nullable real columns: quality_score, reliability_score, popularity_score (0-1 float each)
computeAgentScoreWithSegments() exported from lib/quality-score.ts — returns composite + per-axis scores in one call
Cron (/api/cron/quality-score) now stores per-axis segments alongside composite score on each upsert
Drizzle migration drizzle/0018_score_segments.sql; historical rows retain null for segment columns
GitHub Action Polish (OSS)
Enhanced packages/github-action with better error messages (::error:: annotations on audit/parse failures, null guards for jq output), badge integration (badge-url output, badge image in PR comments, leaderboard link), configurable formats (formats input), max-pages input, and generate: false audit-only mode
Updated README with badge embedding guide, 2 new example workflows (audit-only, custom formats), and troubleshooting section
Added audit-only test job to CI, badge-url output verification
Fixed slug derivation to use node -e "new URL().hostname" matching platform's generateSlug() exactly (avoids port/auth divergence from pure bash approach)
YAML Adapter Agents
Declarative agent definitions via data/adapters/{slug}.yaml — no crawling required
37 unit tests: parsing, template evaluation, pipeline steps, loadAdapter, MCP server creation
Adoption Dashboard (/adoption)
Public page tracking agent web growth over time
Stat cards: total agents, protocols detected, categories covered
SVG area chart: total agents over time (monthly snapshots)
Protocol breakdown + Tranco tier distribution side-by-side
Top categories horizontal bar chart
Empty state when no snapshot data exists
Linked from header Community section and footer
Audit Warnings — JS-Heavy Site Detection
AuditWarning type (OSS): New interface added to AuditReport. computeWarnings() in the audit engine detects JS-heavy sites (based on no-js-dependency and token-efficiency check scores) and populates report.warnings.
Warning banner (platform): JS-heavy sites now surface a prominent amber warning banner in the audit tool, shared audit pages, and leaderboard detail pages, surfacing above "Top Issues" when the engine detects JavaScript-dependent content (sites where AI crawlers would see empty pages).
API Surface Richness Scoring
classifyToolTier(name): infers tier from tool name patterns (submit-* → write, api-* → api, site-search → discover, default → read)
computeCapabilityDiversity: diversity bonus (0–1) based on presence of 4 capability types (FAQ, forms, native-search, API endpoints)
computeQuality now uses surfaceRichness = 0.6 * tierWeightedDepth + 0.4 * diversityBonus — sites with diverse capabilities score up to 40% higher on the quality axis
Backward-compatible: callers passing { name } (cron job, backfill script) auto-classify without changes
Sites with API/form tools will score higher on next cron run; run pnpm backfill:quality-scores --dry-run to preview
API Surface Richness Sub-Score
computeApiSurfaceRichness() in lib/quality-score.ts: scores 4 signals (search, pagination, form submission, API presence) + API depth (tool count, capped at 3) → 0–1
Word-count threshold raised from 50 → 100 when framework markers are present (SSR fallback often meets old threshold but most content is still client-rendered)
Detected framework names surfaced in check details field and the js-heavy-site warning details
computeWarnings() message updated: "Audit scores may be lower than actual quality" (more accurate framing)
[OSS] Mask webhookToken in CLI deploy output
Added --show-token flag to deploy and agentize commands to reveal plaintext token
maskToken() helper preserves the prefix (e.g. w2wh_) and replaces the rest with ****
Fix agent display names for Mailchimp, Twilio, CircleCI
scripts/fix-display-names.ts: targeted DB update script with hardcoded overrides for 3 missed slugs
pnpm fix:display-names:dry / pnpm fix:display-names script entries added to package.json
Auth Cascade Probing
lib/content-validity.ts: validateContent(html) — heuristics to classify fetched content as real vs blocked (length, Cloudflare challenges, CAPTCHA, access denied, JS-required patterns)
lib/auth-cascade.ts: probeAuthCascade(url) — cascades PUBLIC → COOKIE → intercept stub; returns AuthProbeResult with strategy, cookies, and details booleans