Skip to content

Commit cf22c6c

Browse files
committed
chore(mcp): resolve main conflict in server settings
2 parents b320326 + 0630edb commit cf22c6c

9 files changed

Lines changed: 33 additions & 13 deletions

File tree

‎docs/runbooks/agent-app-directories.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,11 @@ Any paid Claude plan can submit. Use these fields in the portal.
7575
Before you submit, add the server in Claude as a custom connector and call each tool once.
7676
After submission, Anthropic scans the server and lists it as a Community connector.
7777
Status and reviewer feedback appear in the portal. Escalations go to `mcp-review@anthropic.com`.
78+
79+
## Icons
80+
81+
Claude shows a connector's icon from Google's favicon service (`google.com/s2/favicons?domain=skilld.dev`), not from skilld.dev directly.
82+
Google caches that icon. Until 2026-10-07 it served a retired skilld mark, because the site declared no large icon.
83+
The site now declares `/apple-touch-icon.png`, and the MCP server lists its icons in `serverInfo.icons`.
84+
The Claude listing sets its custom icon URL to `https://skilld.dev/logo-icon.png`, which overrides the favicon in the directory listing only.
85+
The chat tile updates when Google refreshes its cache.

‎integrations/openai-plugin/plugin.json‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
33
"name": "skilld",
4-
"version": "1.0.0",
4+
"version": "1.0.1",
55
"description": "Search skilld.dev, a curated registry of agent skills, read who wrote each skill, and get the command that runs it.",
66
"author": {
77
"name": "Harlan Wilton",
@@ -54,31 +54,31 @@
5454
"description": "Search skills by topic",
5555
"prompt": "Find a skill for Tailwind CSS.",
5656
"tools_triggered": "search_skills",
57-
"expected_behavior": "Lists Tailwind CSS skills from skilld.dev. Each result names the skill, its GitHub owner and repository, and its GitHub star count, with a skilld.dev page link and an npx skilld run command."
57+
"expected_behavior": "Returns at least one Tailwind CSS skill from skilld.dev, with its author or source repository, a link to its skilld.dev page, and an npx skilld run command."
5858
},
5959
{
6060
"description": "Show who wrote a skill and when it changed",
6161
"prompt": "Who wrote the web-design-guidelines skill in vercel-labs/agent-skills, and when did it last change?",
6262
"tools_triggered": "get_skill",
63-
"expected_behavior": "Names Vercel Labs as the publisher. Links the SKILL.md file on GitHub and gives its commit, the last repository push date, and the last skill change date."
63+
"expected_behavior": "Names Vercel Labs as the publisher, gives the last skill change date and the last repository push date, and links the SKILL.md source on GitHub at its recorded commit."
6464
},
6565
{
6666
"description": "Browse a track",
6767
"prompt": "Which skills help with testing and debugging?",
6868
"tools_triggered": "list_tracks, get_track",
69-
"expected_behavior": "Finds the Testing and debugging track and lists its skills, each with its author, skilld.dev page, and npx skilld run command."
69+
"expected_behavior": "Finds the Testing and debugging track and lists skills from it with their publisher and skilld.dev page. It gives npx skilld run commands for the skills it suggests."
7070
},
7171
{
7272
"description": "See what developers talk about",
7373
"prompt": "What skills are developers talking about this week?",
7474
"tools_triggered": "list_trending",
75-
"expected_behavior": "Lists this week's trending skills in rank order. Each row says why it is there: developers mentioned it on X or Bluesky, with one post, or its GitHub stars rose. Each row gives an npx skilld run command. It does not call any skill popular or safe."
75+
"expected_behavior": "Lists skills from this week's trending board in board order, with the reason each one is there: mentions on X or Bluesky, or a GitHub star surge. It does not call any skill popular or safe."
7676
},
7777
{
7878
"description": "Get the run command for one skill",
7979
"prompt": "Give me the command to try anthropics/skills/skill-creator without installing it.",
8080
"tools_triggered": "install_command",
81-
"expected_behavior": "Returns npx skilld run anthropics/skills/skill-creator and says that it writes no files. Offers npx skilld install anthropics/skills/skill-creator to keep the skill. States that the user runs the command, and does not claim that anything ran."
81+
"expected_behavior": "Returns npx skilld run anthropics/skills/skill-creator and says that it installs nothing and writes no files. It does not claim that anything ran."
8282
}
8383
],
8484
"negative": [
@@ -97,11 +97,12 @@
9797
]
9898
},
9999
"commerce": false,
100-
"commerce_description": "skilld sells nothing and processes no payments."
100+
"commerce_description": "skilld sells nothing and processes no payments.",
101+
"demo_recording_url": "https://media.skilld.dev/review/openai/skilld-chatgpt-demo-2026-10-07.mp4"
101102
},
102103
"publication": {
103104
"countries": [],
104-
"release_notes": "First release. Search skilld.dev for agent skills, show who wrote each skill and where its source lives, browse tracks and the trending board, and return run and install commands."
105+
"release_notes": "First release. Search skilld.dev for agent skills, show who wrote each skill and where its source lives, browse tracks and the trending board, list a repository's skills, and return run and install commands."
105106
}
106107
}
107108
}

‎layers/mcp/server/mcp/index.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ const MAX_MCP_BODY_BYTES = 64 * 1024
77

88
export default defineMcpHandler({
99
description: 'Search and browse skilld.dev for agent skills, and read who wrote each one.',
10+
// MCP clients that read server icons show these instead of a cached favicon.
11+
icons: [
12+
{ src: 'https://skilld.dev/logo-icon.png', mimeType: 'image/png', sizes: ['512x512'] },
13+
{ src: 'https://skilld.dev/logo-icon.svg', mimeType: 'image/svg+xml', sizes: ['any'] },
14+
],
1015
instructions: 'skilld.dev is a curated registry of agent skills. Search first, inspect provenance before recommending a skill, then return the run command for the user to approve and run. Offer the install command only when the user wants the skill in every session. Without a shell, such as in a chat app, follow the markdown from get_skill for this session, and tell the user the skill name and source repository first. If its behaviors list any with tier ask, show those to the user and wait for their approval before you follow the markdown, as skilld run does. Those behaviors cover SKILL.md and the file names only. skilld.dev shows who wrote a skill and where its source lives. It does not review skills for safety, so never call a skill safe or verified. This server never runs or installs anything.',
1116
tools: (event) => {
1217
const deps: McpToolDeps = {

‎nuxt.config.ts‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,9 @@ export default defineNuxtConfig({
386386
// .ico is a fixed multi-size bitmap, so it declares what it contains.
387387
{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg', sizes: 'any' },
388388
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico', sizes: '16x16 32x32 48x48' },
389+
// Google's favicon service, which Claude uses for connector icons, prefers a
390+
// large icon. Without one it kept serving a retired mark for skilld.dev.
391+
{ rel: 'apple-touch-icon', href: '/apple-touch-icon.png', sizes: '512x512' },
389392
],
390393
style: [
391394
// A browser orders cascade layers by where each name first appears.

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"postinstall": "nuxt prepare",
2323
"lint": "eslint .",
2424
"lint:fix": "eslint . --fix",
25-
"typecheck": "wrangler types --check --config wrangler.jsonc --env-file .dev.vars.example && nuxt typecheck",
25+
"typecheck": "wrangler types --check --config wrangler.jsonc --env-file .dev.vars.example && nuxt typecheck && pnpm --filter @skilld/artifact-signer-worker typecheck",
2626
"test": "vitest",
2727
"test:run": "vitest run",
2828
"test:e2e": "pnpm build:test && playwright test",

‎public/apple-touch-icon.png‎

8.01 KB
Loading

‎shared/server/github-app-credential.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ async function readBoundedJson(response: Response, maximumBytes: number): Promis
574574
bytes.set(chunk, offset)
575575
offset += chunk.byteLength
576576
}
577-
const text = new TextDecoder('utf-8', { fatal: true }).decode(bytes)
577+
const text = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes)
578578
// A JSON.parse error quotes the start of the body, which holds the token.
579579
try {
580580
return JSON.parse(text) as unknown

‎worker-configuration.d.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable */
2-
// Generated by Wrangler by running `wrangler types --config=wrangler.jsonc --env-file=.dev.vars.example` (hash: 91ae1b6a0c6d3e279dd2c18ecea4e0c4)
2+
// Generated by Wrangler by running `wrangler types --config=wrangler.jsonc --env-file=.dev.vars.example` (hash: d9c17df945873e507413a75b5172eec0)
33
// Runtime types generated with workerd@1.20260828.1 2026-08-20 nodejs_compat
44
interface __BaseEnv_Env {
55
KV_CACHE: KVNamespace;
@@ -26,6 +26,7 @@ interface __BaseEnv_Env {
2626
ARTIFACT_KEY_WRAP_KEY_ACTIVE_SLOT: "primary";
2727
ARTIFACT_KEY_WRAP_KEY_PRIMARY_ID: "skilld-wrap-2026-08";
2828
ARTIFACT_KEY_WRAP_KEY_SECONDARY_ID: "";
29+
NUXT_OPENAI_APPS_CHALLENGE: "IygUmSBQJVU5v275Y6kWojVpQkVxqckQf4k8cVmBiys";
2930
NUXT_SESSION_PASSWORD: string;
3031
NUXT_ADMIN_SECRET: string;
3132
NUXT_TOKEN_KEY: string;
@@ -68,7 +69,7 @@ type StringifyValues<EnvType extends Record<string, unknown>> = {
6869
[Binding in keyof EnvType]: EnvType[Binding] extends string ? EnvType[Binding] : string;
6970
};
7071
declare namespace NodeJS {
71-
interface ProcessEnv extends StringifyValues<Pick<Cloudflare.Env, "ARTIFACT_PUBLIC_BASE_URL" | "ARTIFACT_PRIVATE_BASE_URL" | "ARTIFACT_KEY_WRAP_KEY_ACTIVE_SLOT" | "ARTIFACT_KEY_WRAP_KEY_PRIMARY_ID" | "ARTIFACT_KEY_WRAP_KEY_SECONDARY_ID" | "NUXT_SESSION_PASSWORD" | "NUXT_ADMIN_SECRET" | "NUXT_TOKEN_KEY" | "NUXT_HEALTH_CHECK_NOTIFY_TO" | "NUXT_PUBLIC_SITE_URL" | "NUXT_OAUTH_GITHUB_CLIENT_ID" | "NUXT_OAUTH_GITHUB_CLIENT_SECRET" | "NUXT_OG_IMAGE_SECRET" | "NUXT_IMAGE_PROXY_KEY" | "NUXT_AI_READY_RUNTIME_SYNC_SECRET" | "GITHUB_TOKEN" | "ARTIFACT_GITHUB_TOKEN" | "SKILLD_READ_APP_ID" | "SKILLD_READ_APP_INSTALLATION_ID" | "SKILLD_READ_APP_PRIVATE_KEY_PKCS8" | "ARTIFACT_PRIVATE_ACCESS_ENABLED" | "GITHUB_APP_ID" | "GITHUB_APP_CLIENT_ID" | "GITHUB_APP_CLIENT_SECRET" | "GITHUB_APP_PRIVATE_KEY_PKCS8" | "GITHUB_APP_WEBHOOK_SECRET" | "ARTIFACT_KEY_WRAP_KEY_PRIMARY" | "ARTIFACT_KEY_WRAP_KEY_SECONDARY" | "ARTIFACT_GRANT_IDEMPOTENCY_KEY" | "ARTIFACT_TRUSTED_ROOT_JSON" | "ANTHROPIC_API_KEY" | "VOYAGE_API_KEY" | "X_BEARER_KEY" | "BSKY_IDENTIFIER" | "BSKY_APP_PASSWORD" | "DISCORD_WEBHOOK_URL">> {}
72+
interface ProcessEnv extends StringifyValues<Pick<Cloudflare.Env, "ARTIFACT_PUBLIC_BASE_URL" | "ARTIFACT_PRIVATE_BASE_URL" | "ARTIFACT_KEY_WRAP_KEY_ACTIVE_SLOT" | "ARTIFACT_KEY_WRAP_KEY_PRIMARY_ID" | "ARTIFACT_KEY_WRAP_KEY_SECONDARY_ID" | "NUXT_OPENAI_APPS_CHALLENGE" | "NUXT_SESSION_PASSWORD" | "NUXT_ADMIN_SECRET" | "NUXT_TOKEN_KEY" | "NUXT_HEALTH_CHECK_NOTIFY_TO" | "NUXT_PUBLIC_SITE_URL" | "NUXT_OAUTH_GITHUB_CLIENT_ID" | "NUXT_OAUTH_GITHUB_CLIENT_SECRET" | "NUXT_OG_IMAGE_SECRET" | "NUXT_IMAGE_PROXY_KEY" | "NUXT_AI_READY_RUNTIME_SYNC_SECRET" | "GITHUB_TOKEN" | "ARTIFACT_GITHUB_TOKEN" | "SKILLD_READ_APP_ID" | "SKILLD_READ_APP_INSTALLATION_ID" | "SKILLD_READ_APP_PRIVATE_KEY_PKCS8" | "ARTIFACT_PRIVATE_ACCESS_ENABLED" | "GITHUB_APP_ID" | "GITHUB_APP_CLIENT_ID" | "GITHUB_APP_CLIENT_SECRET" | "GITHUB_APP_PRIVATE_KEY_PKCS8" | "GITHUB_APP_WEBHOOK_SECRET" | "ARTIFACT_KEY_WRAP_KEY_PRIMARY" | "ARTIFACT_KEY_WRAP_KEY_SECONDARY" | "ARTIFACT_GRANT_IDEMPOTENCY_KEY" | "ARTIFACT_TRUSTED_ROOT_JSON" | "ANTHROPIC_API_KEY" | "VOYAGE_API_KEY" | "X_BEARER_KEY" | "BSKY_IDENTIFIER" | "BSKY_APP_PASSWORD" | "DISCORD_WEBHOOK_URL">> {}
7273
}
7374

7475
// Begin runtime types

‎wrangler.jsonc‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@
135135
"ARTIFACT_PRIVATE_ACCESS_ENABLED": "false",
136136
"ARTIFACT_KEY_WRAP_KEY_ACTIVE_SLOT": "primary",
137137
"ARTIFACT_KEY_WRAP_KEY_PRIMARY_ID": "skilld-wrap-2026-08",
138-
"ARTIFACT_KEY_WRAP_KEY_SECONDARY_ID": ""
138+
"ARTIFACT_KEY_WRAP_KEY_SECONDARY_ID": "",
139+
// Public token the OpenAI plugin portal reads at /.well-known/openai-apps-challenge.
140+
"NUXT_OPENAI_APPS_CHALLENGE": "IygUmSBQJVU5v275Y6kWojVpQkVxqckQf4k8cVmBiys"
139141
},
140142
"ai": {
141143
"binding": "AI",

0 commit comments

Comments
 (0)