revert(icon): drop URL-form serverInfo.icons (#59) — not the icon mechanism#61
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
PR #59 added a URL-form
serverInfo.iconsentry on the hypothesis that Claude.ai's connector UI readsserverInfo.iconsand was skipping ourdata:URI. An empirical A/B between two of our own Cloud Run servers disproved that hypothesis:mcp.openssl-communities.org(custom)…run.app(PSL subdomain)/favicon.icocrawler hits, 2dserverInfo.icons?<link>tags?/favicon.ico)The connector icon comes from a favicon crawler that fetches
/favicon.icodirectly 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.iconsconsumption per modelcontextprotocol#152), but it added a helper + refactor justified by a disproven theory. Reverting for cleanliness.What this reverts
scripts/build-icon.mjsre-emits theICONSexport;src/icon.tsregenerated to the pre-fix(icon): emit URL-form serverInfo.icons entry when PUBLIC_BASE_URL is set #59 shape (ICON_SVG+ICON_DATA_URI+ICONS).src/icon-builder.ts+tests/icon-builder.test.tsdeleted.src/server.tsback toimport { ICONS }/icons: ICONS(data-URI-only, the shape that shipped through v1.6.5).What this keeps
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
icon-builder/buildIconsreferences (grep clean)icon-source.test.tsdrift-guard still passes (generator + generated file back in sync)🤖 Generated with Claude Code