@smbcloud / cli / commits / 89b3560

Fix case-sensitive namespace

Seto Elkahfi committed Jul 22, 2026 at 16:47 UTC 89b3560d196558711462aa3be1b200b90c091d7b
7 files changed +45 -16
.github/workflows/release-mcp-registry.yml
+21 -3
@@ -55,16 +55,34 @@ jobs:
55 mv server.tmp server.json
56 cat server.json
57
58 - - name: Verify the packages are published
58 + - name: Verify the published packages carry the ownership marker
59 shell: bash
60 run: |
61 - # The registry only stores metadata and validates it against the real
62 - # packages, so both must already exist at this version.
61 + # The registry stores metadata only, and validates it by fetching each
62 + # listed package and looking for a marker naming this server. Checking
63 + # the sources isn't enough: a package published before the marker
64 + # landed will still be missing it. Both comparisons are case-sensitive.
65 + server_name="$(jq -r '.name' server.json)"
66 +
67 npm view "@smbcloud/cli@${RELEASE_VERSION}" version
68 + npm_mcp_name="$(npm view "@smbcloud/cli@${RELEASE_VERSION}" mcpName)"
69 + if [ "${npm_mcp_name}" != "${server_name}" ]; then
70 + echo "@smbcloud/cli@${RELEASE_VERSION} declares mcpName '${npm_mcp_name}', expected '${server_name}'." >&2
71 + echo "npm versions are immutable — cut a new release with the marker in place." >&2
72 + exit 1
73 + fi
74
75 nuget_versions="$(curl -fsSL https://api.nuget.org/v3-flatcontainer/smbcloud.cli/index.json)"
76 echo "${nuget_versions}" | jq -e --arg v "${RELEASE_VERSION}" '.versions | index($v)'
77
78 + curl -fsSL -o package.nupkg \
79 + "https://api.nuget.org/v3-flatcontainer/smbcloud.cli/${RELEASE_VERSION}/smbcloud.cli.${RELEASE_VERSION}.nupkg"
80 + if ! unzip -p package.nupkg README.md | grep -q "mcp-name: ${server_name}"; then
81 + echo "SmbCloud.Cli ${RELEASE_VERSION} README is missing the 'mcp-name: ${server_name}' marker." >&2
82 + exit 1
83 + fi
84 + rm package.nupkg
85 +
86 - name: Install mcp-publisher
87 shell: bash
88 run: |
docs/mcp-registry.md
+19 -8
@@ -1,7 +1,7 @@
1 # MCP Registry
2
3 The smbCloud CLI's MCP server is listed in the [official MCP Registry](https://registry.modelcontextprotocol.io)
4 -as **`io.github.smbcloudxyz/smbcloud-cli`**. The registry is a metadata index —
4 +as **`io.github.smbcloudXYZ/smbcloud-cli`**. The registry is a metadata index —
5 it doesn't host binaries — so the listing points at packages we already publish
6 to npm and NuGet, and clients that browse the registry can offer a one-click
7 install of `smb --mcp`.
@@ -19,15 +19,26 @@ For running and configuring the server itself, see [MCP Server](./mcp.md).
19
20 The registry checks each listed package for a marker naming the server. If the
21 marker is missing or doesn't match `name` in `server.json`, publishing fails
22 -with "Registry validation failed for package". The publish workflow greps for
23 -both markers before it does anything else, so a mismatch shows up as a failed
24 -job rather than a rejected upload.
22 +with "Registry validation failed for package".
23
26 -### Why the name is `io.github.smbcloudxyz/...`
24 +The markers ship *inside* the published artifacts, so they have to be in place
25 +before the npm and NuGet packages are built — a version published before the
26 +marker landed can never be listed, since neither registry lets you overwrite a
27 +version. The publish workflow checks the real published artifacts (not just the
28 +sources in this repo) and stops early if a marker is missing.
29 +
30 +### Why the name is `io.github.smbcloudXYZ/...`
31
32 The namespace has to match the authentication method. We authenticate with
29 -GitHub OIDC from Actions, which grants the `io.github.smbcloudxyz/*` namespace
30 -(the reverse-DNS form of the `smbcloudXYZ` org). Publishing under
33 +GitHub OIDC from Actions, which grants the `io.github.smbcloudXYZ/*` namespace
34 +(the reverse-DNS form of the `smbcloudXYZ` org).
35 +
36 +**The casing matters.** The registry grants the namespace with the org's exact
37 +GitHub casing, and compares case-sensitively — `io.github.smbcloudxyz/...` is
38 +rejected with a 403 even though GitHub itself treats org names
39 +case-insensitively. Every marker has to use the same `smbcloudXYZ` spelling.
40 +
41 +Publishing under
42 `xyz.smbcloud/*` instead would mean domain-based auth: a `v=MCPv1` TXT record on
43 `smbcloud.xyz` plus an Ed25519 private key stored as a repo secret. OIDC needs
44 no secret at all, so that's what we use.
@@ -72,7 +83,7 @@ the workflow checks for both and stops early if they aren't.
83 Confirm the listing afterwards:
84
85 ```sh
75 -curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.smbcloudxyz/smbcloud-cli"
86 +curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.smbcloudXYZ/smbcloud-cli"
87 ```
88
89 ## Publishing by hand
docs/mcp.md
+1 -1
@@ -10,7 +10,7 @@ tools covering the account, project, tenant, Mail, and Auth surfaces.
10 This page is the setup guide and the full tool reference. For how `--mcp`
11 compares to the CLI's other two interfaces (headless and `--tui`), see
12 [Interfaces](./interfaces.md). The server is also listed in the official MCP
13 -Registry as `io.github.smbcloudxyz/smbcloud-cli`, so clients that browse the
13 +Registry as `io.github.smbcloudXYZ/smbcloud-cli`, so clients that browse the
14 registry can install it for you — see [MCP Registry](./mcp-registry.md).
15
16 ## Prerequisites
npm/package-main.json.tmpl
+1 -1
@@ -1,7 +1,7 @@
1 {
2 "name": "@smbcloud/cli",
3 "version": "${release_version}",
4 - "mcpName": "io.github.smbcloudxyz/smbcloud-cli",
4 + "mcpName": "io.github.smbcloudXYZ/smbcloud-cli",
5 "keywords": [
6 "smbcloud",
7 "cli",
npm/scripts/render-main-package.cjs
+1 -1
@@ -13,7 +13,7 @@ const packageJson = {
13 name: "@smbcloud/cli",
14 version,
15 // Ownership proof for the MCP Registry: must match `name` in ../../server.json.
16 - mcpName: "io.github.smbcloudxyz/smbcloud-cli",
16 + mcpName: "io.github.smbcloudXYZ/smbcloud-cli",
17 keywords: [
18 "smbcloud",
19 "cli",
nuget/smbcloud-cli/README.md
+1 -1
@@ -1,6 +1,6 @@
1 # smbCloud CLI for .NET
2
3 -<!-- mcp-name: io.github.smbcloudxyz/smbcloud-cli -->
3 +<!-- mcp-name: io.github.smbcloudXYZ/smbcloud-cli -->
4
5 `smb` is the command-line interface for [smbCloud](https://smbcloud.xyz/).
6
server.json
+1 -1
@@ -1,6 +1,6 @@
1 {
2 "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3 - "name": "io.github.smbcloudxyz/smbcloud-cli",
3 + "name": "io.github.smbcloudXYZ/smbcloud-cli",
4 "title": "smbCloud CLI",
5 "description": "Manage smbCloud projects, deployments, tenants, Mail apps, and Auth apps.",
6 "version": "0.4.12",