@proofofwork-agency/toolpin 0.2.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 (61) hide show
  1. package/CONTRIBUTING.md +117 -0
  2. package/LICENSE +183 -0
  3. package/README.md +323 -0
  4. package/SECURITY.md +61 -0
  5. package/action.yml +134 -0
  6. package/dist/canonicalJson.js +38 -0
  7. package/dist/capabilities.js +139 -0
  8. package/dist/ci.js +26 -0
  9. package/dist/cli.js +1843 -0
  10. package/dist/clientSupport.js +76 -0
  11. package/dist/codexToml.js +213 -0
  12. package/dist/config.js +337 -0
  13. package/dist/constants.js +3 -0
  14. package/dist/continueYaml.js +76 -0
  15. package/dist/doctor.js +163 -0
  16. package/dist/install.js +191 -0
  17. package/dist/installed.js +405 -0
  18. package/dist/integrity.js +14 -0
  19. package/dist/inventory.js +169 -0
  20. package/dist/packageIntegrity.js +153 -0
  21. package/dist/plan.js +595 -0
  22. package/dist/policy.js +310 -0
  23. package/dist/registry.js +1610 -0
  24. package/dist/runtimeAdvisory.js +80 -0
  25. package/dist/safeFetch.js +157 -0
  26. package/dist/sarif.js +162 -0
  27. package/dist/scan.js +113 -0
  28. package/dist/search.js +44 -0
  29. package/dist/secrets.js +165 -0
  30. package/dist/signing.js +146 -0
  31. package/dist/tester.js +240 -0
  32. package/dist/trust.js +528 -0
  33. package/dist/tui/app.js +1731 -0
  34. package/dist/tui/command.js +50 -0
  35. package/dist/tui/configSnippet.js +11 -0
  36. package/dist/tui/constants.js +37 -0
  37. package/dist/tui/format.js +31 -0
  38. package/dist/tui/installedState.js +23 -0
  39. package/dist/tui/layout.js +65 -0
  40. package/dist/tui/selectors.js +282 -0
  41. package/dist/tui/types.js +1 -0
  42. package/dist/tui/ui/trust.js +77 -0
  43. package/dist/tui/views/installed.js +82 -0
  44. package/dist/tui/views/panels.js +637 -0
  45. package/dist/tui.js +12 -0
  46. package/dist/types.js +1 -0
  47. package/dist/verificationTrust.js +103 -0
  48. package/dist/verify.js +537 -0
  49. package/dist/version.js +1 -0
  50. package/dist/versions.js +127 -0
  51. package/docs/assets/readme/terminal-demo.svg +174 -0
  52. package/docs/assets/readme/tui-browse-overview.jpg +0 -0
  53. package/docs/assets/readme/tui-config-preview.jpg +0 -0
  54. package/docs/assets/readme/tui-help.jpg +0 -0
  55. package/docs/assets/readme/tui-installed-inventory.jpg +0 -0
  56. package/docs/how-to/catch-drift-in-ci.md +189 -0
  57. package/docs/how-to/custom-registries.md +156 -0
  58. package/docs/how-to/toolpin-curated-registry.md +153 -0
  59. package/package.json +76 -0
  60. package/registry/README.md +92 -0
  61. package/registry/v0/servers +115 -0
@@ -0,0 +1,153 @@
1
+ # ToolPin Curated Registry
2
+
3
+ ToolPin hosts a first-party curated registry without running any custom
4
+ infrastructure. The registry is versioned JSON in this repository, fetched from
5
+ raw GitHub at runtime, and bundled in the npm package as an offline fallback
6
+ snapshot.
7
+
8
+ Use it for servers ToolPin maintainers are willing to recommend because the
9
+ metadata is installable, reviewable, lockable, and documented. Do not use it as
10
+ a broad directory.
11
+
12
+ ## URLs
13
+
14
+ Raw GitHub source of truth, no site deploy required:
15
+
16
+ ```text
17
+ https://raw.githubusercontent.com/proofofwork-agency/toolpin/main/registry/v0/servers
18
+ ```
19
+
20
+ GitHub Pages / Docusaurus static mirror:
21
+
22
+ ```text
23
+ https://proofofwork-agency.github.io/toolpin/registry/v0/servers
24
+ ```
25
+
26
+ For custom `official-compatible` registries, ToolPin appends `/servers`
27
+ automatically when configured with a base URL.
28
+
29
+ ## Built-In Source
30
+
31
+ ToolPin ships this registry as the built-in `toolpin` source: a GitHub-backed
32
+ curated registry with bundled fallback. It is first in the source list, enabled
33
+ by default, and pinned. Users can filter to another source, but `toolpin` cannot be
34
+ disabled through `.toolpin/registries.json`, `toolpin registry disable`, or the
35
+ TUI source selector.
36
+
37
+ Then:
38
+
39
+ ```sh
40
+ toolpin registry list
41
+ toolpin ingest --source toolpin
42
+ toolpin search github --source toolpin
43
+ ```
44
+
45
+ ## Add a Server by PR
46
+
47
+ Edit both files:
48
+
49
+ ```text
50
+ registry/v0/servers
51
+ website/static/registry/v0/servers
52
+ ```
53
+
54
+ They must stay identical. CI runs:
55
+
56
+ ```sh
57
+ npm run registry:check
58
+ ```
59
+
60
+ Each entry must be installable and include curation metadata:
61
+
62
+ ```json
63
+ {
64
+ "server": {
65
+ "name": "io.github.example/server",
66
+ "title": "Example MCP Server",
67
+ "description": "What this server does and why it is useful.",
68
+ "version": "1.0.0",
69
+ "repository": {
70
+ "url": "https://github.com/example/server",
71
+ "source": "github"
72
+ },
73
+ "packages": [
74
+ {
75
+ "registryType": "npm",
76
+ "identifier": "@example/server",
77
+ "version": "1.0.0",
78
+ "transport": {
79
+ "type": "stdio"
80
+ }
81
+ }
82
+ ]
83
+ },
84
+ "_meta": {
85
+ "dev.toolpin/curation": {
86
+ "status": "reviewed",
87
+ "reviewedAt": "2026-06-25",
88
+ "reviewedBy": "toolpin-maintainers",
89
+ "reason": "Why ToolPin recommends this server.",
90
+ "evidenceTier": "metadata-only",
91
+ "riskNotes": [],
92
+ "testedClients": ["claude"],
93
+ "toolpinEnforcement": {
94
+ "status": "not-verified",
95
+ "notes": "Branch protection and ToolPin CI enforcement have not been verified."
96
+ }
97
+ },
98
+ "dev.toolpin/clientSupport": {
99
+ "default": "unsupported",
100
+ "clients": {
101
+ "codex": {
102
+ "status": "toolpin-installable",
103
+ "installMode": "mcp-config",
104
+ "requirements": ["node>=22"],
105
+ "setupCommands": [],
106
+ "notes": "ToolPin can write this as a normal Codex MCP server."
107
+ },
108
+ "claude": {
109
+ "status": "toolpin-installable",
110
+ "installMode": "mcp-config",
111
+ "requirements": ["node>=22"],
112
+ "setupCommands": [],
113
+ "notes": "ToolPin can write this as a project MCP server."
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ ```
120
+
121
+ The container file (`registry/v0/servers`) wraps entries in a `servers` array plus a `metadata` block. If `metadata.count` or `metadata.total` is present, it must equal `servers.length`, or `npm run registry:check` fails. Package targets require `registryType`, `identifier`, and `transport.type`; remote targets require an `https://` URL.
122
+
123
+ `dev.toolpin/clientSupport` is ToolPin-owned metadata:
124
+
125
+ - `toolpin-installable`: ToolPin can generate the client MCP config directly.
126
+ - `external-setup`: the client is supported, but setup needs documented steps
127
+ outside ToolPin, such as plugins, daemons, project initialization, or
128
+ instruction-file writes.
129
+ - `unsupported`: ToolPin must not offer that client as an install target.
130
+
131
+ Use `requirements` for runtimes, CLIs, API-key prerequisites, OAuth support, or
132
+ other normal setup constraints. Use `setupCommands` only for documented external
133
+ steps; ToolPin does not run external setup commands from registry metadata.
134
+
135
+ For ContextRelay specifically, Codex is `toolpin-installable` through a normal
136
+ MCP config that runs package arguments equivalent to `contextrelay codex-mcp
137
+ server`. Claude is `external-setup`: install ContextRelay globally, run
138
+ `ctxrelay init --instructions project`, and use the generated Claude
139
+ plugin/setup. ToolPin must not run `ctxrelay init` until an explicit external
140
+ setup flow exists because it writes project files and plugin state.
141
+
142
+ Reviewers should reject entries that are hosted-only, source-missing,
143
+ non-installable, stale, duplicate, or not useful enough to recommend. Use
144
+ `evidenceTier` and `toolpinEnforcement.status` honestly: `metadata-only` and
145
+ `not-verified` are valid for seed entries; reserve stronger labels for checks
146
+ ToolPin can actually verify.
147
+
148
+ Local validation:
149
+
150
+ ```sh
151
+ npm run registry:check
152
+ npm test
153
+ ```
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@proofofwork-agency/toolpin",
3
+ "version": "0.2.3",
4
+ "description": "Trusted install, lockfile, and governance layer for MCP servers",
5
+ "license": "Apache-2.0",
6
+ "keywords": [
7
+ "mcp",
8
+ "model-context-protocol",
9
+ "lockfile",
10
+ "supply-chain",
11
+ "cli",
12
+ "github-action"
13
+ ],
14
+ "homepage": "https://proofofwork-agency.github.io/toolpin/",
15
+ "bugs": {
16
+ "url": "https://github.com/proofofwork-agency/toolpin/issues"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/proofofwork-agency/toolpin.git"
21
+ },
22
+ "type": "module",
23
+ "packageManager": "npm@10.9.2",
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ "LICENSE",
28
+ "SECURITY.md",
29
+ "CONTRIBUTING.md",
30
+ "action.yml",
31
+ "registry",
32
+ "docs/assets/readme",
33
+ "docs/how-to/catch-drift-in-ci.md",
34
+ "docs/how-to/custom-registries.md",
35
+ "docs/how-to/toolpin-curated-registry.md"
36
+ ],
37
+ "bin": {
38
+ "toolpin": "./dist/cli.js",
39
+ "tpn": "./dist/cli.js"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc -p tsconfig.json",
43
+ "postbuild": "node -e \"require('fs').chmodSync('dist/cli.js', 0o755)\"",
44
+ "docs:build": "docusaurus build website",
45
+ "docs:clear": "docusaurus clear website",
46
+ "docs:start": "docusaurus start website",
47
+ "registry:check": "node scripts/check-curated-registry.mjs",
48
+ "test": "npm run build && node --test",
49
+ "docs:check": "node scripts/check-doc-consistency.mjs",
50
+ "self:ci": "node dist/cli.js ci --file mcp-lock.json --source toolpin --live --verify --skip-live-verification --timeout 15000",
51
+ "audit:runtime": "npm audit --omit=dev",
52
+ "release:check": "npm test && npm run self:ci && npm run docs:check && npm run docs:build && npm run registry:check && npm run audit:runtime && node scripts/check-publish-target.mjs && npm pack --dry-run",
53
+ "prepare": "npm run build",
54
+ "prepublishOnly": "npm run release:check",
55
+ "start": "node dist/cli.js",
56
+ "dev": "npm run build && node dist/cli.js",
57
+ "tui": "npm run build && node dist/cli.js tui",
58
+ "smoke": "npm run build && node dist/cli.js search github --limit 3 --live"
59
+ },
60
+ "engines": {
61
+ "node": ">=22"
62
+ },
63
+ "devDependencies": {
64
+ "@docusaurus/core": "^3.10.1",
65
+ "@docusaurus/preset-classic": "^3.10.1",
66
+ "@types/node": "^22.10.7",
67
+ "@types/react": "^19.2.17",
68
+ "typescript": "^5.7.3"
69
+ },
70
+ "dependencies": {
71
+ "@modelcontextprotocol/sdk": "^1.29.0",
72
+ "ink": "^7.1.0",
73
+ "react": "^19.2.7",
74
+ "yaml": "^2.9.0"
75
+ }
76
+ }
@@ -0,0 +1,92 @@
1
+ # ToolPin Curated Registry
2
+
3
+ This directory is the source of the ToolPin Curated MCP Registry.
4
+
5
+ It is intentionally GitHub-native:
6
+
7
+ - entries are reviewed through pull requests;
8
+ - CI validates the registry shape before merge;
9
+ - no database or hosted backend is required;
10
+ - raw GitHub is the runtime source of truth, with GitHub Pages only as a static mirror.
11
+
12
+ ## Endpoints
13
+
14
+ Canonical source file:
15
+
16
+ ```text
17
+ registry/v0/servers
18
+ ```
19
+
20
+ Raw GitHub URL after merge to `main`:
21
+
22
+ ```text
23
+ https://raw.githubusercontent.com/proofofwork-agency/toolpin/main/registry/v0/servers
24
+ ```
25
+
26
+ GitHub Pages / Docusaurus mirror after the website is deployed:
27
+
28
+ ```text
29
+ https://proofofwork-agency.github.io/toolpin/registry/v0/servers
30
+ ```
31
+
32
+ For custom official-compatible registries, ToolPin appends `/servers`, so
33
+ configure the registry base URL without the trailing `/servers`.
34
+
35
+ ## Built-In CLI Source
36
+
37
+ Current ToolPin versions expose this registry as the built-in `toolpin` source.
38
+ The CLI fetches the raw GitHub `/servers` file first and uses the packaged
39
+ `registry/v0/servers` file only as an offline fallback snapshot.
40
+
41
+ Then run:
42
+
43
+ ```sh
44
+ toolpin registry list
45
+ toolpin ingest --source toolpin
46
+ toolpin search github --source toolpin
47
+ ```
48
+
49
+ ## Adding Servers
50
+
51
+ Add entries to `registry/v0/servers` and mirror the same content to
52
+ `website/static/registry/v0/servers`. Run:
53
+
54
+ ```sh
55
+ npm run registry:check
56
+ npm test
57
+ ```
58
+
59
+ Every server entry must be installable: it needs a package or remote target,
60
+ version/source metadata, transport, repository URL when available, declared
61
+ secrets, and ToolPin curation metadata.
62
+
63
+ Required curation metadata:
64
+
65
+ ```json
66
+ {
67
+ "_meta": {
68
+ "dev.toolpin/curation": {
69
+ "status": "reviewed",
70
+ "reviewedAt": "2026-06-25",
71
+ "reviewedBy": "toolpin-maintainers",
72
+ "reason": "Why this server belongs in the curated registry.",
73
+ "evidenceTier": "metadata-only",
74
+ "riskNotes": [],
75
+ "testedClients": ["claude"],
76
+ "toolpinEnforcement": {
77
+ "status": "not-verified",
78
+ "notes": "Branch protection and ToolPin CI enforcement have not been verified."
79
+ }
80
+ }
81
+ }
82
+ }
83
+ ```
84
+
85
+ Do not add hosted-only, source-missing, stale, duplicate, non-installable, or
86
+ unreviewed entries to this registry. `evidenceTier` must be honest:
87
+ `metadata-only` for reviewed metadata, `digest-pinned` for immutable pins,
88
+ `byte-verified` only when ToolPin recomputed or resolved artifact bytes, and
89
+ `provenance-attested` only when provenance verification is implemented. Use
90
+ `toolpinEnforcement.status: "enforced"` only when the ToolPin check is required
91
+ by branch protection or rulesets and can be validated; otherwise use
92
+ `not-verified` with notes. Use discovery registries for broad search.
@@ -0,0 +1,115 @@
1
+ {
2
+ "servers": [
3
+ {
4
+ "server": {
5
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
6
+ "name": "@proofofwork-agency/contextrelay",
7
+ "title": "ContextRelay",
8
+ "description": "Local coordination bridge that connects Codex and Claude Code agents in the same project session.",
9
+ "repository": {
10
+ "url": "https://github.com/proofofwork-agency/contextrelay",
11
+ "source": "github"
12
+ },
13
+ "version": "3.9.2",
14
+ "packages": [
15
+ {
16
+ "registryType": "npm",
17
+ "identifier": "@proofofwork-agency/contextrelay",
18
+ "version": "3.9.2",
19
+ "runtimeHint": "bun",
20
+ "packageArguments": [
21
+ "codex-mcp",
22
+ "server"
23
+ ],
24
+ "transport": {
25
+ "type": "stdio"
26
+ }
27
+ }
28
+ ]
29
+ },
30
+ "_meta": {
31
+ "dev.toolpin/curation": {
32
+ "status": "reviewed",
33
+ "reviewedAt": "2026-06-27T00:00:00.000Z",
34
+ "reviewedBy": "toolpin-maintainers",
35
+ "reason": "First-party ContextRelay bridge for agent collaboration; Codex consumes it as a stdio MCP server, not as a Codex plugin. Claude support requires project/plugin initialization.",
36
+ "evidenceTier": "byte-verified",
37
+ "riskNotes": [
38
+ "Requires Bun to run the npm package through bunx.",
39
+ "Upstream ContextRelay documents `ctxrelay codex-mcp install` as the canonical global Codex registration; ToolPin direct install writes the equivalent stdio MCP launch command into Codex config.",
40
+ "Claude setup writes project/plugin state and is documented as external setup until ToolPin has an explicit setup flow."
41
+ ],
42
+ "testedClients": [
43
+ "codex",
44
+ "claude"
45
+ ],
46
+ "toolpinEnforcement": {
47
+ "status": "not-verified",
48
+ "notes": "Repository branch protection and ToolPin CI enforcement have not been verified for this entry."
49
+ }
50
+ },
51
+ "dev.toolpin/evidence": [
52
+ {
53
+ "code": "npm_integrity_verified",
54
+ "status": "passed",
55
+ "message": "npm tarball integrity matched registry dist.integrity for @proofofwork-agency/contextrelay@3.9.2.",
56
+ "source": "npm-tarball",
57
+ "claim": "sha512-zUmS+iLWX/uRha5wzO8AdxSHUrOvXy8MOx+JHdMBRDRvMU+wS6jtQn0beWRUjRdMKN2RDZ0WRzxoHlDtEBmQYQ==",
58
+ "verificationMethod": "npm-packument-sri",
59
+ "verifiedByToolPin": true,
60
+ "trustedAnchor": true,
61
+ "trustAnchor": "registry.npmjs.org",
62
+ "verifiedAt": "2026-06-27T19:50:00.000Z"
63
+ }
64
+ ],
65
+ "dev.toolpin/clientSupport": {
66
+ "default": "unsupported",
67
+ "clients": {
68
+ "codex": {
69
+ "status": "toolpin-installable",
70
+ "installMode": "mcp-config",
71
+ "requirements": [
72
+ "bun>=1.0.0"
73
+ ],
74
+ "setupCommands": [
75
+ "ctxrelay codex-mcp install"
76
+ ],
77
+ "notes": "ToolPin direct install writes a Codex stdio MCP config for the same server that `ctxrelay codex-mcp install` registers globally. ContextRelay does not currently ship a Codex plugin manifest."
78
+ },
79
+ "claude": {
80
+ "status": "external-setup",
81
+ "installMode": "claude-plugin",
82
+ "requirements": [
83
+ "bun>=1.0.0",
84
+ "claude-code"
85
+ ],
86
+ "setupCommands": [
87
+ "npm install -g @proofofwork-agency/contextrelay",
88
+ "ctxrelay init --instructions project"
89
+ ],
90
+ "notes": "Claude support exists through the ContextRelay Claude plugin/init flow, not a plain mcpServers entry."
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ ],
97
+ "metadata": {
98
+ "count": 1,
99
+ "total": 1,
100
+ "name": "ToolPin Curated MCP Registry",
101
+ "description": "A PR-reviewed, GitHub-hosted registry for MCP servers ToolPin can normalize, review, lock, and recommend.",
102
+ "generatedAt": "2026-06-27T00:00:00.000Z",
103
+ "source": {
104
+ "type": "github",
105
+ "repository": "https://github.com/proofofwork-agency/toolpin",
106
+ "path": "registry/v0/servers"
107
+ },
108
+ "policy": {
109
+ "installableOnly": true,
110
+ "reviewRequired": true,
111
+ "prBasedUpdates": true,
112
+ "toolpinCiRequired": true
113
+ }
114
+ }
115
+ }