@getmarrow/mcp 3.9.45 → 3.9.46

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.
package/README.md CHANGED
@@ -17,6 +17,20 @@ Use `@getmarrow/mcp` when your agent client supports the Model Context Protocol
17
17
  - **npm retrieval:** https://api.getmarrow.ai/v1/public/discovery/placements/plc_bdf1abadff99a79182556248
18
18
  - **MCP registry retrieval:** https://api.getmarrow.ai/v1/public/discovery/placements/plc_d3e06cb7675296dfd0c1021e
19
19
 
20
+ Maintainers can validate local registry metadata with `npm run registry:check`. After an approved registry publication, `npm run registry:verify` confirms that the official registry returns the exact package name and version; package metadata alone is not treated as publication proof.
21
+
22
+ Public operating guides:
23
+
24
+ - [Governance Readiness Assessment](https://getmarrow.ai/governance-readiness)
25
+ - [Marrow for MCP clients](https://getmarrow.ai/marrow-for-mcp)
26
+ - [Marrow for OpenAI Codex](https://getmarrow.ai/marrow-for-codex)
27
+ - [Marrow for Claude Code](https://getmarrow.ai/marrow-for-claude-code)
28
+ - [Marrow for Cursor](https://getmarrow.ai/marrow-for-cursor)
29
+ - [Marrow for Hermes Agent](https://getmarrow.ai/marrow-for-hermes)
30
+ - [Marrow for OpenClaw](https://getmarrow.ai/marrow-for-openclaw)
31
+
32
+ The assessment accepts bounded selections only. It does not install Marrow, authorize a purchase, accept free-form work content, or establish compliance, security, or ROI.
33
+
20
34
  ## Install
21
35
 
22
36
  ```bash
@@ -48,9 +62,9 @@ For most new installations, start with the universal installer instead:
48
62
  npx @getmarrow/install --yes
49
63
  ```
50
64
 
51
- ## What's New in v3.9.45
65
+ ## What's New in v3.9.46
52
66
 
53
- v3.9.45 adds official MCP registry metadata and a consistent distribution contract while preserving the always-on lifecycle introduced in v3.9.44:
67
+ v3.9.46 adds the official registry verification path, public Governance Readiness Assessment, and five proof-oriented harness guides while preserving the always-on lifecycle introduced in v3.9.44:
54
68
 
55
69
  - `server.json` and `mcpName` identify the stdio server, required secret, source repository, and package version for registry consumers;
56
70
  - GitHub, npm, and MCP registry surfaces use separate signed discovery placements;
package/dist/cli.js CHANGED
@@ -1319,7 +1319,7 @@ if (process.argv[2] !== 'keys') {
1319
1319
  success(id, {
1320
1320
  protocolVersion: '2024-11-05',
1321
1321
  capabilities: { tools: {}, prompts: {} },
1322
- serverInfo: { name: 'marrow', version: '3.9.45' },
1322
+ serverInfo: { name: 'marrow', version: '3.9.46' },
1323
1323
  });
1324
1324
  // Auto-enroll: emit enrollment notification on connection
1325
1325
  if (AUTO_ENROLL) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getmarrow/mcp",
3
- "version": "3.9.45",
3
+ "version": "3.9.46",
4
4
  "mcpName": "io.github.getmarrow/marrow",
5
5
  "description": "Runtime control, proof, and fleet intelligence for MCP-compatible AI agents.",
6
6
  "bin": {
@@ -11,7 +11,9 @@
11
11
  "scripts": {
12
12
  "build": "tsc",
13
13
  "dev": "tsc --watch",
14
- "test": "npm run build && node --test test/*.test.js"
14
+ "test": "npm run build && node --test test/*.test.js",
15
+ "registry:check": "node scripts/mcp-registry-check.cjs",
16
+ "registry:verify": "node scripts/mcp-registry-verify.cjs"
15
17
  },
16
18
  "keywords": [
17
19
  "mcp",
@@ -60,7 +62,9 @@
60
62
  "files": [
61
63
  "dist",
62
64
  "README.md",
63
- "server.json"
65
+ "server.json",
66
+ "scripts/mcp-registry-check.cjs",
67
+ "scripts/mcp-registry-verify.cjs"
64
68
  ],
65
69
  "dependencies": {
66
70
  "@getmarrow/sdk": "^3.7.43"
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('node:fs')
4
+ const path = require('node:path')
5
+
6
+ const root = path.resolve(__dirname, '..')
7
+ const packageJson = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'))
8
+ const server = JSON.parse(fs.readFileSync(path.join(root, 'server.json'), 'utf8'))
9
+ const publishedPackage = server.packages?.find((entry) => entry.registryType === 'npm')
10
+
11
+ const failures = []
12
+ if (packageJson.mcpName !== server.name) failures.push('package mcpName must match server name')
13
+ if (packageJson.version !== server.version) failures.push('package and server versions must match')
14
+ if (publishedPackage?.identifier !== packageJson.name) failures.push('npm package identifier must match package name')
15
+ if (publishedPackage?.version !== packageJson.version) failures.push('npm package version must match package version')
16
+ if (!server.repository?.url?.startsWith('https://github.com/getmarrow/')) failures.push('repository must use the canonical public Marrow GitHub URL')
17
+
18
+ if (failures.length > 0) {
19
+ console.error(`MCP_REGISTRY_CHECK=FAIL reason=${failures.join('; ')}`)
20
+ process.exitCode = 1
21
+ } else {
22
+ console.log(`MCP_REGISTRY_CHECK=PASS name=${server.name} version=${server.version}`)
23
+ }
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('node:fs')
4
+ const path = require('node:path')
5
+
6
+ const root = path.resolve(__dirname, '..')
7
+ const server = JSON.parse(fs.readFileSync(path.join(root, 'server.json'), 'utf8'))
8
+ const endpoint = new URL('https://registry.modelcontextprotocol.io/v0.1/servers')
9
+ endpoint.searchParams.set('search', server.name)
10
+
11
+ function identity(entry) {
12
+ const candidate = entry && typeof entry === 'object' && entry.server && typeof entry.server === 'object'
13
+ ? entry.server
14
+ : entry
15
+ return {
16
+ name: candidate && typeof candidate.name === 'string' ? candidate.name : '',
17
+ version: candidate && typeof candidate.version === 'string' ? candidate.version : '',
18
+ }
19
+ }
20
+
21
+ async function main() {
22
+ const response = await fetch(endpoint, { headers: { Accept: 'application/json' }, signal: AbortSignal.timeout(10_000) })
23
+ if (!response.ok) throw new Error(`MCP Registry query failed with HTTP ${response.status}`)
24
+ const body = await response.json()
25
+ const entries = Array.isArray(body?.servers) ? body.servers : []
26
+ const match = entries.map(identity).find((entry) => entry.name === server.name && entry.version === server.version)
27
+ if (!match) {
28
+ throw new Error(`MCP Registry is missing ${server.name}@${server.version}`)
29
+ }
30
+ console.log(`MCP_REGISTRY_VERIFY=PASS name=${match.name} version=${match.version}`)
31
+ }
32
+
33
+ main().catch((error) => {
34
+ console.error(`MCP_REGISTRY_VERIFY=FAIL reason=${error instanceof Error ? error.message : String(error)}`)
35
+ process.exitCode = 1
36
+ })
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/getmarrow/marrow-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "3.9.45",
9
+ "version": "3.9.46",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@getmarrow/mcp",
14
- "version": "3.9.45",
14
+ "version": "3.9.46",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },