Skip to content

Commit 80da46f

Browse files
hyperpolymathclaude
andcommitted
fix(adapter): register all 99 cartridges; update count 96→99 everywhere
There are 99 cartridge directories, not 96. The V adapter's register_builtin_cartridges() only had 23 — now extended to all 99. Updated show-hn posts, container label, and QUICKSTART-USER.adoc to reflect the correct 99 count. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 9b4615a commit 80da46f

5 files changed

Lines changed: 84 additions & 7 deletions

File tree

.github/workflows/container-publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,6 @@ jobs:
5959
${{ secrets.DOCKERHUB_USERNAME && format('docker.io/{0}/boj-server:latest', secrets.DOCKERHUB_USERNAME) || '' }}
6060
labels: |
6161
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
62-
org.opencontainers.image.description=Bundle of Joy MCP Server — 96 formally verified cartridges
62+
org.opencontainers.image.description=Bundle of Joy MCP Server — 99 formally verified cartridges
6363
org.opencontainers.image.licenses=PMPL-1.0-or-later
6464
org.opencontainers.image.version=${{ steps.meta.outputs.version }}

QUICKSTART-USER.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ toc::[]
1010

1111
== What is BoJ Server?
1212

13-
Bundle of Joy (BoJ) Server is a cartridge-based MCP protocol gateway. Each cartridge (database-mcp, fleet-mcp, nesy-mcp, etc.) is a formally verified Idris2 ABI + Zig FFI + unified adapter triple. The server exposes REST (port 7700), gRPC (7701), GraphQL (7702), and SSE (7703) endpoints. 96 cartridges cover databases, clouds, messaging, CI/CD, git forges, secrets, queues, proofs, and more.
13+
Bundle of Joy (BoJ) Server is a cartridge-based MCP protocol gateway. Each cartridge (database-mcp, fleet-mcp, nesy-mcp, etc.) is a formally verified Idris2 ABI + Zig FFI + unified adapter triple. The server exposes REST (port 7700), gRPC (7701), GraphQL (7702), and SSE (7703) endpoints. 99 cartridges cover databases, clouds, messaging, CI/CD, git forges, secrets, queues, proofs, and more.
1414

1515
Three-class architecture: Class 1 (simple CLI), Class 2 (orchestrator with webhooks/MQTT), Class 3 (BEAM multiplier for global scale).
1616

adapter/v/src/main.v

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -864,6 +864,83 @@ fn (mut app BojApp) register_builtin_cartridges() ! {
864864
protocols: [ProtocolType.mcp, .rest, .grpc, .nesy]
865865
index: 0
866866
},
867+
// ── Remaining 73 cartridges (alphabetical) ─────────────────
868+
CartridgeInfo{ name: 'aerie-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
869+
CartridgeInfo{ name: 'affinescript-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
870+
CartridgeInfo{ name: 'airtable-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
871+
CartridgeInfo{ name: 'arango-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
872+
CartridgeInfo{ name: 'aws-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest, .grpc] index: 0 },
873+
CartridgeInfo{ name: 'browser-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
874+
CartridgeInfo{ name: 'buildkite-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
875+
CartridgeInfo{ name: 'burble-admin-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
876+
CartridgeInfo{ name: 'circleci-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
877+
CartridgeInfo{ name: 'civic-connect-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
878+
CartridgeInfo{ name: 'claude-ai-mcp' version: '0.1.0' status: .ready tier: .ayo domain: .cloud protocols: [ProtocolType.mcp, .rest, .grpc] index: 0 },
879+
CartridgeInfo{ name: 'clickhouse-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
880+
CartridgeInfo{ name: 'cloudflare-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
881+
CartridgeInfo{ name: 'codeseeker-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
882+
CartridgeInfo{ name: 'conflow-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
883+
CartridgeInfo{ name: 'crates-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
884+
CartridgeInfo{ name: 'digitalocean-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
885+
CartridgeInfo{ name: 'discord-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
886+
CartridgeInfo{ name: 'dns-shield-mcp' version: '0.1.0' status: .ready tier: .shield domain: .secrets protocols: [ProtocolType.mcp, .rest] index: 0 },
887+
CartridgeInfo{ name: 'docker-hub-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .container protocols: [ProtocolType.mcp, .rest] index: 0 },
888+
CartridgeInfo{ name: 'duckdb-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
889+
CartridgeInfo{ name: 'fly-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
890+
CartridgeInfo{ name: 'game-admin-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
891+
CartridgeInfo{ name: 'gcp-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest, .grpc] index: 0 },
892+
CartridgeInfo{ name: 'github-actions-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
893+
CartridgeInfo{ name: 'github-api-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .git protocols: [ProtocolType.mcp, .rest] index: 0 },
894+
CartridgeInfo{ name: 'gitlab-api-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .git protocols: [ProtocolType.mcp, .rest] index: 0 },
895+
CartridgeInfo{ name: 'google-docs-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
896+
CartridgeInfo{ name: 'google-sheets-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
897+
CartridgeInfo{ name: 'gossamer-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
898+
CartridgeInfo{ name: 'grafana-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .observe protocols: [ProtocolType.mcp, .rest] index: 0 },
899+
CartridgeInfo{ name: 'hackage-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
900+
CartridgeInfo{ name: 'hetzner-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
901+
CartridgeInfo{ name: 'hex-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
902+
CartridgeInfo{ name: 'hypatia-mcp' version: '0.1.0' status: .ready tier: .ayo domain: .proof protocols: [ProtocolType.mcp, .rest, .nesy] index: 0 },
903+
CartridgeInfo{ name: 'idaptik-admin-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
904+
CartridgeInfo{ name: 'jira-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
905+
CartridgeInfo{ name: 'kategoria-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
906+
CartridgeInfo{ name: 'laminar-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
907+
CartridgeInfo{ name: 'lang-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
908+
CartridgeInfo{ name: 'linear-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
909+
CartridgeInfo{ name: 'linode-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
910+
CartridgeInfo{ name: 'matrix-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
911+
CartridgeInfo{ name: 'model-router-mcp' version: '0.1.0' status: .ready tier: .ayo domain: .cloud protocols: [ProtocolType.mcp, .rest, .grpc] index: 0 },
912+
CartridgeInfo{ name: 'mongodb-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
913+
CartridgeInfo{ name: 'neo4j-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
914+
CartridgeInfo{ name: 'neon-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
915+
CartridgeInfo{ name: 'notion-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
916+
CartridgeInfo{ name: 'npm-registry-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
917+
CartridgeInfo{ name: 'obsidian-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
918+
CartridgeInfo{ name: 'opam-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
919+
CartridgeInfo{ name: 'opsm-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
920+
CartridgeInfo{ name: 'panic-attack-mcp' version: '0.1.0' status: .ready tier: .shield domain: .proof protocols: [ProtocolType.mcp, .rest] index: 0 },
921+
CartridgeInfo{ name: 'pmpl-mcp' version: '0.1.0' status: .ready tier: .shield domain: .proof protocols: [ProtocolType.mcp, .rest] index: 0 },
922+
CartridgeInfo{ name: 'postgresql-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
923+
CartridgeInfo{ name: 'prometheus-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .observe protocols: [ProtocolType.mcp, .rest] index: 0 },
924+
CartridgeInfo{ name: 'pypi-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
925+
CartridgeInfo{ name: 'railway-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
926+
CartridgeInfo{ name: 'redis-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
927+
CartridgeInfo{ name: 'render-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
928+
CartridgeInfo{ name: 'reposystem-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .git protocols: [ProtocolType.mcp, .rest] index: 0 },
929+
CartridgeInfo{ name: 'rokur-mcp' version: '0.1.0' status: .ready tier: .shield domain: .secrets protocols: [ProtocolType.mcp, .rest] index: 0 },
930+
CartridgeInfo{ name: 'sentry-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .observe protocols: [ProtocolType.mcp, .rest] index: 0 },
931+
CartridgeInfo{ name: 'slack-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
932+
CartridgeInfo{ name: 'stapeln-mcp' version: '0.1.0' status: .ready tier: .shield domain: .container protocols: [ProtocolType.mcp, .rest] index: 0 },
933+
CartridgeInfo{ name: 'supabase-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
934+
CartridgeInfo{ name: 'telegram-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
935+
CartridgeInfo{ name: 'todoist-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
936+
CartridgeInfo{ name: 'toolchain-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
937+
CartridgeInfo{ name: 'turso-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .database protocols: [ProtocolType.mcp, .rest] index: 0 },
938+
CartridgeInfo{ name: 'typed-wasm-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
939+
CartridgeInfo{ name: 'vault-mcp' version: '0.1.0' status: .ready tier: .shield domain: .secrets protocols: [ProtocolType.mcp, .rest] index: 0 },
940+
CartridgeInfo{ name: 'verisimdb-mcp' version: '0.1.0' status: .ready tier: .ayo domain: .database protocols: [ProtocolType.mcp, .rest, .grpc] index: 0 },
941+
CartridgeInfo{ name: 'vext-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
942+
CartridgeInfo{ name: 'vordr-mcp' version: '0.1.0' status: .ready tier: .shield domain: .secrets protocols: [ProtocolType.mcp, .rest] index: 0 },
943+
CartridgeInfo{ name: 'zotero-mcp' version: '0.1.0' status: .ready tier: .teranga domain: .cloud protocols: [ProtocolType.mcp, .rest] index: 0 },
867944
]
868945
for b in builtins {
869946
app.register_cartridge(b)!

docs/outreach/show-hn-draft.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
# Show HN: BoJ — 96-cartridge MCP server with formal proofs (Idris2 + Zig)
1+
# Show HN: BoJ — 99-cartridge MCP server with formal proofs (Idris2 + Zig)
22

3-
BoJ (Bundle of Joy) is an MCP server that bundles 96 tool cartridges — each with a formally verified ABI (Idris2), a C-compatible FFI (Zig), and a unified adapter exposing REST, gRPC, GraphQL, and SSE on four ports.
3+
BoJ (Bundle of Joy) is an MCP server that bundles 99 tool cartridges — each with a formally verified ABI (Idris2), a C-compatible FFI (Zig), and a unified adapter exposing REST, gRPC, GraphQL, and SSE on four ports.
44

55
What makes it different:
66

7-
- **96 cartridges** covering cloud (Cloudflare, Vercel), comms (Gmail, calendar), GitHub/GitLab, databases, containers, security (DNS Shield, container hash monitoring, PMPL provenance), browsers, and more
7+
- **99 cartridges** covering cloud (Cloudflare, Vercel), comms (Gmail, calendar), GitHub/GitLab, databases, containers, security (DNS Shield, container hash monitoring, PMPL provenance), browsers, and more
88
- **Formal safety proofs** — every cartridge has an Idris2 ABI module with dependent types and zero `believe_me` postulates. The type system prevents entire classes of runtime errors
99
- **Zero Python, zero TypeScript** — built with Zig (FFI), Idris2 (proofs), and a ReScript UI. No npm, no pip, no node_modules
1010
- **Glama AAA grade** — Security A, License A, Quality A

docs/outreach/show-hn-post.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
# Show HN Draft
66

7-
**Title:** Show HN: BoJ – One MCP server, 96 capability cartridges, zero Python
7+
**Title:** Show HN: BoJ – One MCP server, 99 capability cartridges, zero Python
88

99
---
1010

1111
**Body:**
1212

1313
I had three Claude instances, a Cursor session, and about twenty MCP/LSP/DAP servers running. My desktop froze. That was the moment I realised the problem wasn't any individual server — it was the combinatoric explosion of them.
1414

15-
BoJ (Bundle of Joy) is a single MCP server that covers 96 capability domains through swappable cartridges. Database, containers, git, secrets, queues, IaC, observability, static sites, proofs, fleet management, neurosymbolic AI, agent orchestration, cloud, Kubernetes, LSP, DAP, BSP, feedback, and more. Each cartridge has a formally verified interface (Idris2 dependent types prove the safety gate at compile time), a Zig FFI layer for native execution, and a unified adapter that exposes REST + gRPC + GraphQL + SSE on four ports. Five safety modules (SafeHTTP, SafePromptInjection, SafeCORS, SafeAPIKey, SafeWebSocket) guard the boundary.
15+
BoJ (Bundle of Joy) is a single MCP server that covers 99 capability domains through swappable cartridges. Database, containers, git, secrets, queues, IaC, observability, static sites, proofs, fleet management, neurosymbolic AI, agent orchestration, cloud, Kubernetes, LSP, DAP, BSP, feedback, and more. Each cartridge has a formally verified interface (Idris2 dependent types prove the safety gate at compile time), a Zig FFI layer for native execution, and a unified adapter that exposes REST + gRPC + GraphQL + SSE on four ports. Five safety modules (SafeHTTP, SafePromptInjection, SafeCORS, SafeAPIKey, SafeWebSocket) guard the boundary.
1616

1717
The architecture is a 2D matrix: protocols on one axis, domains on the other. Instead of N separate servers, you get one catalogue where AI agents read a menu and mount what they need. Federation is built in — community nodes discover each other via gossip with hash attestation, so you can self-host a node and join the network without any central coordination.
1818

0 commit comments

Comments
 (0)