Skip to content

revert(icon): drop URL-form serverInfo.icons (#59) — not the icon mechanism#61

Merged
arapov merged 1 commit into
masterfrom
revert/icon-builder-url-form
May 29, 2026
Merged

revert(icon): drop URL-form serverInfo.icons (#59) — not the icon mechanism#61
arapov merged 1 commit into
masterfrom
revert/icon-builder-url-form

Conversation

@arapov
Copy link
Copy Markdown
Collaborator

@arapov arapov commented May 29, 2026

Why

PR #59 added a URL-form serverInfo.icons entry on the hypothesis that Claude.ai's connector UI reads serverInfo.icons and was skipping our data: URI. An empirical A/B between two of our own Cloud Run servers disproved that hypothesis:

loomiomcp (icon shows) capsulemcp (no icon)
Domain mcp.openssl-communities.org (custom) …run.app (PSL subdomain)
/favicon.ico crawler hits, 2d 39 (≈hourly) 0
Crawler AWS-hosted, desktop+mobile Chrome UAs
Reads serverInfo.icons? No (never fetched in either server's logs) No
Reads landing-page <link> tags? No (goes straight to /favicon.ico) No

The connector icon comes from a favicon crawler that fetches /favicon.ico directly and only crawls custom domains — not Public-Suffix-List platform subdomains (*.run.app, *.vercel.app, *.herokuapp.com). That's the whole difference between the sibling that works and this one.

So #59 was built on a wrong premise and is not load-bearing. It was harmless (spec-correct; would only matter if Anthropic ships serverInfo.icons consumption per modelcontextprotocol#152), but it added a helper + refactor justified by a disproven theory. Reverting for cleanliness.

What this reverts

What this keeps

  • PR feat(http): serve landing page at GET / with icon link tags #60's landing page — independent DX value (human-readable root instead of "Cannot GET /", favicon-checker greenness). Its CHANGELOG entry is corrected to no longer claim it fixes Claude icon display, with a scope note documenting the real favicon-crawler + custom-domain mechanism so the finding isn't lost.

The actual icon fix

Custom-domain mapping (mirror loomiomcp → mcp.<domain>). Infra-side, not a code change in this repo. Out of scope for this PR.

Test plan

  • 533 → 529 tests (−4, the icon-builder unit tests removed with the helper)
  • Typecheck / lint / format:check / build clean
  • No dangling icon-builder / buildIcons references (grep clean)
  • icon-source.test.ts drift-guard still passes (generator + generated file back in sync)
  • HOWTO test count (was stale at 523) + bundle figures resynced to 529 / ~165 / ~193 KB
  • Privacy sweep clean

🤖 Generated with Claude Code

…hanism

PR #59 emitted a URL-form serverInfo.icons entry on the theory that
Claude.ai's connector UI reads serverInfo.icons and was skipping our
data: URI. Empirical investigation (loomiomcp vs capsulemcp log A/B)
disproved that theory:

  - Claude.ai's connector icon comes from a favicon crawler
    (AWS-hosted, hourly, desktop+mobile Chrome UAs) that fetches
    /favicon.ico DIRECTLY. It never reads serverInfo.icons, and
    never parses the landing-page <link> tags.
  - It only crawls CUSTOM DOMAINS, not Public-Suffix-List platform
    subdomains (*.run.app, *.vercel.app, *.herokuapp.com). That's
    why the sibling loomiomcp on mcp.openssl-communities.org shows
    an icon and capsulemcp on *.run.app doesn't.

So #59 was built on a wrong hypothesis and is not load-bearing. It
was harmless (spec-correct, would only ever matter IF Anthropic
ships serverInfo.icons consumption per modelcontextprotocol#152),
but it added a helper + refactor justified by a disproven premise.
Reverting for cleanliness restores the simple `icons: ICONS`
data-URI shape that predated #59:

  - build-icon.mjs re-emits the ICONS export; icon.ts regenerated.
  - src/icon-builder.ts + tests/icon-builder.test.ts deleted.
  - server.ts back to `import { ICONS }` / `icons: ICONS`.

Kept: PR #60's landing page (independent DX merit — human-readable
root + favicon-checker support), but its CHANGELOG entry is
corrected to NOT claim it fixes Claude icon display, with a scope
note documenting the real favicon-crawler + custom-domain mechanism.

The actual fix for the connector icon (custom-domain mapping) is
infra-side, not a code change in this repo.

533 → 529 tests (−4, icon-builder tests removed). Bundle
165.18 KB stdio / 193.05 KB http. HOWTO test count + bundle figures
resynced (were stale at 523 / ~191 from earlier un-synced merges).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@arapov arapov merged commit afb88db into master May 29, 2026
1 check passed
@arapov arapov deleted the revert/icon-builder-url-form branch May 29, 2026 07:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant