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",