Odel

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.

IconBanner
Shown onEvery card and the module pageThe marketplace's ranked cards and spotlight
Without oneYour initialsYour icon, enlarged and blurred
Best sourceicons in your server.jsonYour repository's custom social preview
FormatsPNG, JPEG, WebP, SVG, or a .ico with a PNG insidePNG, JPEG, WebP
Stored at most512 × 512 px, 256 KB1280 px wide, 1 MB

The icon

Odel looks for an icon in these places, best first:

  1. Your registry entry. The icons list in server.json. Odel takes the first entry with an https:// URL that looks like an image, by its mimeType or its file extension. A PNG, JPEG or WebP wins over an SVG.
  2. Your server. For a remote server Odel can reach, the serverInfo.icons it returns from initialize. An SVG, or an icon declared "sizes": ["any"], comes first, then the largest declared size.
  3. Your sign-in. For a server behind OAuth, the logo_uri in its protected resource metadata.
  4. Your website. Up to three icons from your homepage's <head>: <link rel="icon">, apple-touch-icon and the icons in your web app manifest, with /favicon.ico last. The homepage is the registry entry's websiteUrl. Without one, Odel uses the domain your namespace names (com.example/weather reads example.com), then the domain your remote endpoint is served from. A server a hosting platform publishes for you uses its websiteUrl only, since the namespace and the endpoint are the platform's.
  5. 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. Plain http:// is skipped.
  • PNG, JPEG, WebP or SVG, judged by the bytes. A server that sends the wrong Content-Type still works. For a .ico, Odel keeps the largest PNG image inside it. A .ico that 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, an on… event-handler attribute, a <foreignObject>, a javascript: 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:

  1. 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.
  2. 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 a github.com/…/blob/… link is read as the raw file. It skips:
    • SVGs and GIFs;
    • badges: any URL with badge in its path, GitHub Actions status images, and badge and counter services such as shields.io, codecov and star-history;
    • an <img> whose width is under 600 or whose height is 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

  1. Link your GitHub repository in server.json. Without it you get no banner.
  2. Put a square icon in server.json's icons: a PNG or WebP of at least 512 × 512 px, or a clean SVG under 256 KB, at an https:// URL.
    "icons": [{ "src": "https://example.com/icon-512.png", "mimeType": "image/png", "sizes": ["512x512"] }]
  3. 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.
  4. 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.
  5. Set websiteUrl to your own site, and give its <head> a large apple-touch-icon or manifest icon. It's the fallback when the registry icon fails.
  6. 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.

On this page