Skip to content

Commit 309a70c

Browse files
authored
refactor: rename icon field to logo and require URL-only values (#118)
* refactor: rename `icon` field to `logo` and require URL-only values The server-definition `icon` field has long accepted both emoji and URLs, which made icon rendering ambiguous in the registry UI (the discover site showed raw emoji where a product logo was intended). This PR: - Renames `icon` to `logo` in every server definition and example, and replaces the seven remaining emoji icons (🛡 mcpshield, 🐛 sentry x3, ⚡ supabase x2, 🪞 vardoger) with real logo URLs sourced from GitHub org avatars. - Updates the JSON schema to accept `logo` as `format: uri` with an `^https?://` pattern, and keeps `icon` as a deprecated alias with the same URL constraint (no more emoji). Emits helpful messages so contributors understand which field to use. - Adds schema-validation tests that reject emoji in both `icon` and `logo`, assert every server file uses `logo` (not `icon`), and assert every `logo` is an HTTP(S) URL. - Updates contributor docs — CONTRIBUTING, AGENTS, README, the PR template, and the examples README — plus the `mcp-server-crawler` skill that agents use to draft new definitions. This is the source-of-truth rename; the bundler, registry API, and discover UI land separate PRs that mirror both fields on output so the desktop app (which still reads `icon`) keeps working. Signed-off-by: Mohammod Al Amin Ashik <maa.ashik00@gmail.com> * docs(examples): replace emoji in example definitions with real logo URLs The rename made emoji invalid under the URL-only `logo` schema, so the example server definitions would not validate. Use the matching GitHub organisation avatars for each example's real-world service (GitHub, Atlassian, Cloudflare, Notion) so copy-paste templates pass validation out of the box. Signed-off-by: Mohammod Al Amin Ashik <maa.ashik00@gmail.com> --------- Signed-off-by: Mohammod Al Amin Ashik <maa.ashik00@gmail.com>
1 parent c0ff984 commit 309a70c

127 files changed

Lines changed: 1078 additions & 692 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ CONTRIBUTING.md → "Platform-Managed Fields (Do Not Set)".
7070
<!-- See CONTRIBUTING.md → "Trademark & Branding Policy" for details. -->
7171

7272
- [ ] No "official" / "certified" / "endorsed" wording unless I represent the trademark owner
73-
- [ ] I have the right to reference the `icon` URL (emoji or an asset I'm allowed to hot-link)
73+
- [ ] I have the right to reference the `logo` URL (an asset I'm allowed to hot-link — emoji are not accepted)
7474

7575
### Tested locally (recommended for new servers)
7676

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ These are computed or granted by McpMux maintainers after verification.
9090
## Trademark & Branding
9191

9292
- Reference third-party products with "works with", "for", or "connects to" — never "official", "certified", "endorsed" unless you represent the trademark owner and are verified.
93-
- Icons are referenced by URL (emoji or external) — McpMux does not host icon files. Only link to assets you have the right to reference.
93+
- Logos are referenced by HTTP(S) URL in the `logo` field — McpMux does not host logo files and emoji are not accepted. Only link to assets you have the right to reference. The legacy field name `icon` is still accepted for backward compatibility.
9494
- See `TRADEMARK-TAKEDOWN.md` for the full IP policy.
9595

9696
## Commit & PR Guidelines

CONTRIBUTING.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ Strongly encouraged — the registry UI shows them prominently and users filter
149149
| `$schema` | string | `"../schemas/server-definition.schema.json"` — gives editors autocomplete. |
150150
| `description` | string | One sentence, plain English. Shown in listings. |
151151
| `alias` | string | Short CLI alias, pattern `^[a-z0-9-]+$`. Must not collide with any `id` or other alias. |
152-
| `icon` | string | Emoji (e.g. `"🐙"`) or a stable image URL (avatars, project logos). McpMux does **not** host icon files. |
152+
| `logo` | string | Stable HTTP(S) URL to a logo image (avatar or project PNG/SVG). Emoji are **not** accepted — use a GitHub avatar URL like `https://avatars.githubusercontent.com/u/{id}?v=4`. McpMux does **not** host logo files. (The legacy field name `icon` is still accepted for backward compatibility, but `logo` is the preferred name.) |
153153
| `schema_version` | string | Currently `"2.1"`. Bump when the project publishes a new contributor schema version. |
154154
| `categories` | string[] | IDs from [`categories.json`](categories.json). At least one. |
155155
| `tags` | string[] | Lowercase keywords for search (`"git"`, `"search"`, `"wiki"`). 3–8 is a good target. |
@@ -582,11 +582,12 @@ The registry is community-built but consumed via the McpMux brand, so we're care
582582
- **Implied endorsement is not:** "Official GitHub MCP", "Certified by Notion", "Endorsed by Linear" — unless you actually represent the trademark owner and have been verified.
583583
- Phrases to prefer: *works with*, *for*, *connects to*, *integrates with*.
584584

585-
### Icons
585+
### Logos
586586

587-
- McpMux does not host icon files. The `icon` field is either an emoji or a URL to an image.
587+
- McpMux does not host logo files. The `logo` field must be an HTTP(S) URL to an image. Emoji are not accepted.
588588
- **Only reference assets you have the right to use.** Corporate logos are usually fine for descriptive, non-commercial use in a directory listing; but don't hot-link assets with restrictive terms.
589589
- Prefer GitHub avatars (`https://avatars.githubusercontent.com/u/<id>?v=4`) or official brand URLs over random CDN copies that may rotate.
590+
- The legacy field name `icon` is still accepted for backward compatibility, but new submissions should use `logo`.
590591

591592
### Official / verified claims
592593

@@ -603,7 +604,7 @@ By opening a PR you agree that:
603604
1. You have the right to reference any URLs you include.
604605
2. You're not claiming official status or endorsement you don't have.
605606
3. You accept responsibility for trademark compliance of your submission.
606-
4. You grant McpMux a license to display your definition — including rendering any referenced icon URLs — on the discover site and desktop app.
607+
4. You grant McpMux a license to display your definition — including rendering any referenced logo URLs — on the discover site and desktop app.
607608
5. McpMux may modify or remove your submission in response to trademark concerns.
608609

609610
---

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Every definition must include these three fields:
9292
"$schema": "../schemas/server-definition.schema.json",
9393
"description": "What the server does in one sentence",
9494
"alias": "my-srv", // short CLI alias (lowercase kebab-case)
95-
"icon": "https://...", // emoji or image URL
95+
"logo": "https://...", // HTTP(S) URL to a logo image (emoji not accepted)
9696
"schema_version": "2.1",
9797
"categories": ["developer-tools"],
9898
"tags": ["keyword1", "keyword2"],
@@ -368,7 +368,7 @@ Edit the existing JSON file in `servers/` and submit a PR. The same validation r
368368
## Trademark & Branding Policy
369369

370370
- **Names:** You may reference third-party products (e.g., "MCP Server for GitHub"). Use language like "works with", "for", or "connects to".
371-
- **Icons:** Emoji or external URLs only — McpMux does not host icon files. Only reference assets you have the right to use.
371+
- **Logos:** HTTP(S) URLs only — McpMux does not host logo files and emoji are not accepted. Only reference assets you have the right to use.
372372
- **Official claims:** Do NOT use "official", "certified", or "endorsed" unless you represent the trademark owner and have been verified by McpMux.
373373

374374
See [TRADEMARK-TAKEDOWN.md](TRADEMARK-TAKEDOWN.md) for the full IP policy.
@@ -397,7 +397,7 @@ pnpm build # Generate bundle/bundle.json
397397
"name": "Brave Search",
398398
"alias": "brave",
399399
"description": "Search the web using the Brave Search API with privacy-focused results.",
400-
"icon": "https://avatars.githubusercontent.com/u/12301619?v=4",
400+
"logo": "https://avatars.githubusercontent.com/u/12301619?v=4",
401401
"schema_version": "2.1",
402402
"categories": ["search"],
403403
"tags": ["brave", "search", "web-search", "privacy"],
@@ -466,7 +466,7 @@ pnpm build # Generate bundle/bundle.json
466466
"name": "Cloudflare Docs",
467467
"alias": "cf-docs",
468468
"description": "Search Cloudflare developer documentation using semantic search.",
469-
"icon": "https://avatars.githubusercontent.com/u/314135?v=4",
469+
"logo": "https://avatars.githubusercontent.com/u/314135?v=4",
470470
"schema_version": "2.1",
471471
"categories": ["documentation", "cloud"],
472472
"tags": ["cloudflare", "docs", "workers", "pages"],

examples/README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ Key features:
8888

8989
### Recommended Fields
9090
- `description` - What the server does
91-
- `icon` - Emoji or image URL
91+
- `logo` - HTTP(S) URL to a logo image (PNG/SVG). Emoji are not accepted. Legacy `icon` field name is still supported.
9292
- `categories` - For discoverability
9393
- `badges` - Trust indicators (official, verified, featured, sponsored, popular)
9494
- `hosting_type` - local, remote, or hybrid
@@ -143,10 +143,11 @@ Key features:
143143

144144
## Best Practices
145145

146-
### Icons
147-
- Use emoji (📊, 🚀, 📖) for simplicity
148-
- Or provide URL to PNG/SVG icon
146+
### Logos
147+
- Provide an HTTP(S) URL to a PNG/SVG logo — emoji are not accepted
148+
- Prefer GitHub avatars (`https://avatars.githubusercontent.com/u/<id>?v=4`) or official brand URLs
149149
- Recommended size: 128x128px or 256x256px
150+
- The field name is `logo`; the legacy `icon` field name is still supported but discouraged
150151

151152
### Screenshots
152153
- Max 5 screenshots

examples/complete-example.json

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,27 @@
44
"name": "GitHub",
55
"alias": "gh",
66
"description": "Interact with GitHub repositories, issues, pull requests, and more through the GitHub API.",
7-
"icon": "🐙",
7+
"logo": "https://avatars.githubusercontent.com/u/9919?v=4",
88
"schema_version": "2.1",
9-
"categories": ["developer-tools", "version-control"],
10-
"tags": ["git", "code", "issues", "pr", "repos"],
11-
9+
"categories": [
10+
"developer-tools",
11+
"version-control"
12+
],
13+
"tags": [
14+
"git",
15+
"code",
16+
"issues",
17+
"pr",
18+
"repos"
19+
],
1220
"transport": {
1321
"type": "stdio",
1422
"command": "docker",
1523
"args": [
16-
"run", "-i", "--rm", "-e",
24+
"run",
25+
"-i",
26+
"--rm",
27+
"-e",
1728
"GITHUB_PERSONAL_ACCESS_TOKEN",
1829
"ghcr.io/github/github-mcp-server"
1930
],
@@ -39,25 +50,22 @@
3950
]
4051
}
4152
},
42-
4353
"auth": {
4454
"type": "api_key",
4555
"instructions": "Create a token at https://github.com/settings/tokens with repo scope"
4656
},
47-
4857
"contributor": {
4958
"name": "Model Context Protocol",
5059
"github": "modelcontextprotocol",
5160
"url": "https://modelcontextprotocol.io"
5261
},
53-
5462
"links": {
5563
"repository": "https://github.com/modelcontextprotocol/servers",
5664
"documentation": "https://modelcontextprotocol.io/docs"
5765
},
58-
59-
"platforms": ["all"],
60-
66+
"platforms": [
67+
"all"
68+
],
6169
"capabilities": {
6270
"tools": true,
6371
"resources": true,

examples/read-only-example.json

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,40 @@
44
"name": "Cloudflare Docs",
55
"alias": "cfdocs",
66
"description": "Search and browse Cloudflare documentation",
7-
"icon": "📚",
7+
"logo": "https://avatars.githubusercontent.com/u/314135?v=4",
88
"schema_version": "2.1",
9-
"categories": ["documentation", "cloud"],
10-
"tags": ["cloudflare", "docs", "documentation", "search"],
11-
9+
"categories": [
10+
"documentation",
11+
"cloud"
12+
],
13+
"tags": [
14+
"cloudflare",
15+
"docs",
16+
"documentation",
17+
"search"
18+
],
1219
"transport": {
1320
"type": "http",
1421
"url": "https://docs.mcp.cloudflare.com/mcp",
1522
"metadata": {
1623
"inputs": []
1724
}
1825
},
19-
2026
"auth": {
2127
"type": "none"
2228
},
23-
2429
"contributor": {
2530
"name": "Cloudflare",
2631
"github": "cloudflare",
2732
"url": "https://developers.cloudflare.com"
2833
},
29-
3034
"links": {
3135
"repository": "https://github.com/cloudflare/mcp-server-cloudflare",
3236
"documentation": "https://developers.cloudflare.com/mcp"
3337
},
34-
35-
"platforms": ["all"],
36-
38+
"platforms": [
39+
"all"
40+
],
3741
"capabilities": {
3842
"tools": true,
3943
"resources": true,

examples/remote-hosted-example.json

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,41 @@
44
"name": "Atlassian (Jira & Confluence)",
55
"alias": "atlassian",
66
"description": "Interact with Jira issues and Confluence pages",
7-
"icon": "🔷",
7+
"logo": "https://avatars.githubusercontent.com/u/168166?v=4",
88
"schema_version": "2.1",
9-
"categories": ["productivity", "developer-tools"],
10-
"tags": ["jira", "confluence", "atlassian", "issues", "wiki"],
11-
9+
"categories": [
10+
"productivity",
11+
"developer-tools"
12+
],
13+
"tags": [
14+
"jira",
15+
"confluence",
16+
"atlassian",
17+
"issues",
18+
"wiki"
19+
],
1220
"transport": {
1321
"type": "http",
1422
"url": "https://mcp.atlassian.com/v1/mcp",
1523
"metadata": {
1624
"inputs": []
1725
}
1826
},
19-
2027
"auth": {
2128
"type": "oauth"
2229
},
23-
2430
"contributor": {
2531
"name": "Atlassian",
2632
"github": "atlassian",
2733
"url": "https://developer.atlassian.com"
2834
},
29-
3035
"links": {
3136
"homepage": "https://developer.atlassian.com/cloud/mcp",
3237
"documentation": "https://developer.atlassian.com/cloud/mcp/docs"
3338
},
34-
35-
"platforms": ["all"],
36-
39+
"platforms": [
40+
"all"
41+
],
3742
"capabilities": {
3843
"tools": true,
3944
"prompts": true,

examples/sponsored-example.json

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,25 @@
44
"name": "Notion",
55
"alias": "notion",
66
"description": "Read and write Notion pages, databases, and blocks",
7-
"icon": "📝",
7+
"logo": "https://avatars.githubusercontent.com/u/4792552?v=4",
88
"schema_version": "2.1",
9-
"categories": ["productivity", "documentation"],
10-
"tags": ["notion", "notes", "wiki", "database"],
11-
9+
"categories": [
10+
"productivity",
11+
"documentation"
12+
],
13+
"tags": [
14+
"notion",
15+
"notes",
16+
"wiki",
17+
"database"
18+
],
1219
"transport": {
1320
"type": "stdio",
1421
"command": "npx",
15-
"args": ["-y", "@notionhq/notion-mcp-server"],
22+
"args": [
23+
"-y",
24+
"@notionhq/notion-mcp-server"
25+
],
1626
"env": {
1727
"NOTION_API_KEY": "${input:NOTION_API_KEY}"
1828
},
@@ -35,25 +45,22 @@
3545
]
3646
}
3747
},
38-
3948
"auth": {
4049
"type": "api_key",
4150
"instructions": "Create an integration at notion.so/my-integrations"
4251
},
43-
4452
"contributor": {
4553
"name": "Notion",
4654
"github": "makenotion",
4755
"url": "https://notion.so"
4856
},
49-
5057
"links": {
5158
"repository": "https://github.com/makenotion/notion-mcp-server",
5259
"documentation": "https://developers.notion.com"
5360
},
54-
55-
"platforms": ["all"],
56-
61+
"platforms": [
62+
"all"
63+
],
5764
"capabilities": {
5865
"tools": true,
5966
"resources": true,

schemas/server-definition.schema.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,18 @@
2525
"type": "string",
2626
"description": "Short description of what the server does"
2727
},
28+
"logo": {
29+
"type": "string",
30+
"format": "uri",
31+
"pattern": "^https?://",
32+
"description": "URL to a logo image (PNG/SVG). Must be an HTTP(S) URL - emoji are no longer accepted. Prefer a GitHub avatar (https://avatars.githubusercontent.com/u/{id}?v=4) or a stable brand asset."
33+
},
2834
"icon": {
2935
"type": "string",
30-
"description": "Emoji or URL to icon image"
36+
"format": "uri",
37+
"pattern": "^https?://",
38+
"deprecated": true,
39+
"description": "Deprecated: use `logo` instead. Kept for backward compatibility with older bundles; when present it must be an HTTP(S) URL."
3140
},
3241
"schema_version": {
3342
"type": "string",

0 commit comments

Comments
 (0)