Registry listings
Where Odel finds the icon and banner for a server in the MCP registry, and how to make yours look good.
Every server published to the official MCP registry gets a listing in the Odel marketplace. You don't upload anything to Odel for it. Odel reads your registry entry, the GitHub repository it links to and your website once a day, and builds the listing from what it finds there. The icon and the banner are the two things that decide how the listing looks, and both come from places you control.
| Icon | Banner | |
|---|---|---|
| Shown on | Every card and the module page | The marketplace's ranked cards and spotlight |
| Without one | Your initials | Your icon, enlarged and blurred |
| Best source | icons in your server.json | Your repository's custom social preview |
| Formats | PNG, JPEG, WebP, SVG, or a .ico with a PNG inside | PNG, JPEG, WebP |
| Stored at most | 512 × 512 px, 256 KB | 1280 px wide, 1 MB |
The icon
Odel looks for an icon in these places, best first:
- Your registry entry. The
iconslist inserver.json. Odel takes the first entry with anhttps://URL that looks like an image, by itsmimeTypeor its file extension. A PNG, JPEG or WebP wins over an SVG. - Your server. For a remote server Odel can reach, the
serverInfo.iconsit returns frominitialize. An SVG, or an icon declared"sizes": ["any"], comes first, then the largest declared size. - Your sign-in. For a server behind OAuth, the
logo_uriin its protected resource metadata. - Your website. Up to three icons from your homepage's
<head>:<link rel="icon">,apple-touch-iconand the icons in your web app manifest, with/favicon.icolast. The homepage is the registry entry'swebsiteUrl. Without one, Odel uses the domain your namespace names (com.example/weatherreadsexample.com), then the domain your remote endpoint is served from. A server a hosting platform publishes for you uses itswebsiteUrlonly, since the namespace and the endpoint are the platform's. - Your GitHub owner's avatar. An organization's avatar is usually its logo and competes like any other candidate. A person's avatar is a face, so it is used only when nothing else could be copied.
The first candidate that is at least 128 px on its shorter edge is the icon. An SVG always counts as large enough. When none is that large, the largest one found is used. A 32 px favicon no longer stops the search for your 512 px logo further down the list. Up to five new URLs are tried for a listing each night.
Below 128 px an icon still shows, but the marketplace's large layouts draw it smaller.
What an icon has to be
- An
https://URL. Plainhttp://is skipped. - PNG, JPEG, WebP or SVG, judged by the bytes. A server that sends the wrong
Content-Typestill works. For a.ico, Odel keeps the largest PNG image inside it. A.icothat holds only bitmaps is refused. - At most 8 MB to download.
- A raster larger than 512 × 512 px, or over 256 KB, is shrunk to fit within 512 × 512 px and stored as WebP. It is refused only if it is still over 256 KB after that.
- An SVG is stored as you wrote it, never shrunk, so it has to be 256 KB or less as it is. It is
refused if it contains a
<script>element, anon…event-handler attribute, a<foreignObject>, ajavascript:URL or an entity declaration.
The banner
A banner needs a GitHub repository. Your registry entry has to link one, with
"repository": { "source": "github", "url": "https://github.com/you/your-server" }. Without it
there is no banner and no avatar.
Odel tries, in order:
- Your repository's custom social preview (GitHub's guide to setting one). The card GitHub generates when you haven't set one is not used. Odel checks for a new social preview once a week.
- The first images in your README, at most three, in document order. Odel reads Markdown
images and
<img>tags, but not those inside code blocks or HTML comments. Relative paths are resolved against your default branch, and agithub.com/…/blob/…link is read as the raw file. It skips:- SVGs and GIFs;
- badges: any URL with
badgein its path, GitHub Actions status images, and badge and counter services such as shields.io, codecov and star-history; - an
<img>whosewidthis under 600 or whoseheightis under 100.
The first image that passes these checks is the banner. A README image never replaces your social preview.
- PNG, JPEG or WebP, judged by the bytes.
- At least 600 px wide.
- Banner-shaped: between 1.3 and 4.5 times as wide as it is tall. A square screenshot or a thin strip is refused.
- At most 8 MB to download. Wider than 1280 px, or over 1 MB, it is shrunk to 1280 px wide and stored as WebP. It is refused only if it is still over 1 MB after that.
How the images are kept
Odel downloads a copy of each image and serves the marketplace from that copy. It never links to your server, so a visitor's browser never loads anything from your site, and moving the file later doesn't break the listing.
A URL is downloaded once. Changing the picture behind the same URL doesn't change the
listing. To replace an image, publish it under a new URL: a new file name, or a ?v=2 on the
end. A new social preview on GitHub gets a new URL by itself.
If a download fails because the image doesn't pass the checks above, or the server answers 404, Odel tries that URL again after 30 days. If the server times out, rate-limits, or answers with a 5xx, it tries again the next night.
Getting the best-looking listing
- Link your GitHub repository in
server.json. Without it you get no banner. - Put a square icon in
server.json'sicons: a PNG or WebP of at least 512 × 512 px, or a clean SVG under 256 KB, at anhttps://URL."icons": [{ "src": "https://example.com/icon-512.png", "mimeType": "image/png", "sizes": ["512x512"] }] - Set a custom social preview on the repository, PNG or JPEG. 1280 × 640 px is a good size: it is the widest Odel stores, and 2:1 sits well inside the shape limits.
- If you'd rather use a README image, make the first image in the README a wide picture at least 600 px across, not an SVG or a GIF.
- Set
websiteUrlto your own site, and give its<head>a largeapple-touch-iconor manifest icon. It's the fallback when the registry icon fails. - To change an image later, give the new one a new URL.
The registry is read once a day. A new or changed entry shows up in the marketplace after the next nightly run.