@motiblog/mcp 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +73 -0
  2. package/package.json +3 -1
package/README.md CHANGED
@@ -147,6 +147,79 @@ node -e "console.log(Object.keys(require('@motiblog/mcp')))"
147
147
  MOTIBLOG_HTTP_PORT=3098 node_modules/.bin/motiblog-mcp-http
148
148
  ```
149
149
 
150
+ ## Listing in the official MCP Registry
151
+
152
+ `server.json` in this directory is the listing, validated against schema
153
+ `2025-12-11`. The registry is the canonical directory since 2026 and downstream
154
+ directories and newsletters ingest it, so **one publish propagates** — do this
155
+ before filling in any individual directory form.
156
+
157
+ ### The namespace
158
+
159
+ `server.json` claims `ai.motiblog/mcp` — the reverse-DNS namespace for a domain
160
+ we own, which is the identity a product should have rather than a personal
161
+ GitHub handle. Claiming it means proving control of `motiblog.ai`.
162
+
163
+ **The keypair is already generated and the proof is already deployed.** The
164
+ public half is served from the web app at
165
+ [`/.well-known/mcp-registry-auth`](../web/src/app/.well-known/mcp-registry-auth/route.ts);
166
+ the private half is at `~/.motiblog/mcp-registry-key` (mode 600, never in the
167
+ repo, same convention as the agent API key).
168
+
169
+ HTTP verification was chosen over the DNS TXT record deliberately: it lives in
170
+ this repository, so the proof is reviewable, versioned and deploys with the app
171
+ instead of depending on a registrar dashboard nobody remembers the login for.
172
+ The registry accepts either, with the same key — if you ever prefer DNS, the
173
+ record is:
174
+
175
+ ```
176
+ motiblog.ai. IN TXT "v=MCPv1; k=ed25519; p=<the same public key>"
177
+ ```
178
+
179
+ ### Publishing
180
+
181
+ `mcp-publisher` is a Go binary from
182
+ [github.com/modelcontextprotocol/registry releases](https://github.com/modelcontextprotocol/registry/releases)
183
+ (v1.8.1 at time of writing) — it is not on npm.
184
+
185
+ ```bash
186
+ cd apps/mcp
187
+ mcp-publisher login http \
188
+ --domain motiblog.ai \
189
+ --private-key "$(cat ~/.motiblog/mcp-registry-key)"
190
+ mcp-publisher publish
191
+ ```
192
+
193
+ The web app must be deployed with the well-known route before the login will
194
+ verify — the registry fetches `https://motiblog.ai/.well-known/mcp-registry-auth`
195
+ and checks the signature against it. Confirm it is live first:
196
+
197
+ ```bash
198
+ curl https://motiblog.ai/.well-known/mcp-registry-auth
199
+ # v=MCPv1; k=ed25519; p=...
200
+ ```
201
+
202
+ **If you rotate the key**, the constant in the route and the DNS record (if one
203
+ exists) must change together. A mismatch fails with a signature error that does
204
+ not explain itself.
205
+
206
+ Validate before publishing — the registry rejects on schema, and the limits
207
+ are tighter than they look (`description` caps at **100 characters**, which
208
+ the first draft of ours blew past):
209
+
210
+ ```bash
211
+ python3 - <<'PY'
212
+ import json, urllib.request, jsonschema
213
+ s = json.load(urllib.request.urlopen(json.load(open('server.json'))['$schema']))
214
+ jsonschema.validate(json.load(open('server.json')), s)
215
+ print('valid')
216
+ PY
217
+ ```
218
+
219
+ **Updating a listing needs a new version.** Bump `version` in both
220
+ `package.json` and `server.json` whenever the copy or the package changes, or
221
+ the publish is a no-op.
222
+
150
223
  ## Entry points
151
224
 
152
225
  | File | Shape | Use |
package/package.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "name": "@motiblog/mcp",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
+ "//mcpName": "Links this npm package to its official MCP Registry entry. The registry refuses to publish a listing that names an npm package which does not point back at it — that pairing is how it proves the same owner controls both. Must equal `name` in server.json.",
5
+ "mcpName": "ai.motiblog/mcp",
4
6
  "description": "MotiBlog MCP server — run a whole blog from an agent: propose topics, generate, fact-check, approve through a governed gate, publish, or export to your own codebase",
5
7
  "license": "UNLICENSED",
6
8
  "homepage": "https://motiblog.ai/mcp",