{"_id":"@aroha-sdk/mcp-bridge","_rev":"5-4ef5af5566ffa8524979f225ef54064c","name":"@aroha-sdk/mcp-bridge","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@aroha-sdk/mcp-bridge","version":"1.0.0","_id":"@aroha-sdk/mcp-bridge@1.0.0","maintainers":[{"name":"aroha-labs","email":"projectmed99@gmail.com"}],"dist":{"shasum":"b86a32fa727ac11bd51841f82dd8e4b66f19382a","tarball":"https://registry.npmjs.org/@aroha-sdk/mcp-bridge/-/mcp-bridge-1.0.0.tgz","fileCount":4,"integrity":"sha512-lXoJ5ddFSuiSmIA8oziK85pac829c4owkQLsZBguIw5BVElamVrK4OI1LXT0eTbfF05MpZH6RxTrQ5VwRegtEQ==","signatures":[{"sig":"MEUCIF/CtVcy6blYSiL7Xeb7DA8cDjsKooMRBRydxnVYGNBiAiEA/hrbpXKmCHXFMAZEC8q+0S2WNdjVvrzRObvlM0t4dRs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12586},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"67cbe687cd0664deb4374aaa75788c9d7119d74b","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"aroha-labs","email":"projectmed99@gmail.com"},"_npmVersion":"11.13.0","description":"Aroha ↔ MCP (Model Context Protocol) adapter","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@aroha-sdk/core":"^1.0.0","@aroha-sdk/registry":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.6.0","typescript":"^5.4.5","@types/node":"^20.14.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-bridge_1.0.0_1782173740731_0.24265256102855948","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aroha-sdk/mcp-bridge","version":"1.2.0","_id":"@aroha-sdk/mcp-bridge@1.2.0","maintainers":[{"name":"aroha-labs","email":"projectmed99@gmail.com"}],"dist":{"shasum":"ffd0c76976bc7aa2667dd45fc612b665d3427fa0","tarball":"https://registry.npmjs.org/@aroha-sdk/mcp-bridge/-/mcp-bridge-1.2.0.tgz","fileCount":11,"integrity":"sha512-/DLn1C5sa0g5WWg0pEj4qBKVjVVGRj6OSANzjxK4taM6b6OLchL2UZKGvOM7DwnbkdauNyyC1KMFO7zg8j/LwQ==","signatures":[{"sig":"MEUCIQCpTJpY7znxUzxhYePjwg36SScvVZvBO9cB9rkrUdbQ/wIge9KD9aI2lt5oH45vVluxlUQeUdvbha6UfhtZgHyl3IA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35775},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"3fd6d5ab883e07e6c38989dc642f87ef70bb6320","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"aroha-labs","email":"projectmed99@gmail.com"},"_npmVersion":"11.13.0","description":"Aroha â†” MCP (Model Context Protocol) adapter","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@aroha-sdk/core":"^1.0.0","@aroha-sdk/registry":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.6.0","typescript":"^5.4.5","@types/node":"^20.14.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-bridge_1.2.0_1782181471302_0.6446069675589172","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@aroha-sdk/mcp-bridge","version":"1.2.1","_id":"@aroha-sdk/mcp-bridge@1.2.1","maintainers":[{"name":"aroha-labs","email":"projectmed99@gmail.com"}],"dist":{"shasum":"74a37b61b8da5d0b1cbab6c813ee4aac0d5bbcdd","tarball":"https://registry.npmjs.org/@aroha-sdk/mcp-bridge/-/mcp-bridge-1.2.1.tgz","fileCount":11,"integrity":"sha512-Vsp2AHgPDVsxGJQxjXYU69uN07P+gONvHpPDGqmoHLhA/sqm/mmsppp+EI17WU0d4idwFNk7PmTnG0UPYEKq2g==","signatures":[{"sig":"MEQCIDf5mH7M5UTgBn1SD1uq914bZd0nTriwSFCp+n1KzYy5AiAkOXBRrl3OeBs3ZpVg6+R6sYMzu2SRqlZtsXuWMSBVyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54648},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"a7fc3b14f2e9a4b83b1483442dc68e46d0ac4872","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"aroha-labs","email":"projectmed99@gmail.com"},"_npmVersion":"11.16.0","description":"Aroha â†” MCP (Model Context Protocol) adapter","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@aroha-sdk/core":"^1.0.0","@aroha-sdk/registry":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.6.0","typescript":"^5.4.5","@types/node":"^20.14.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-bridge_1.2.1_1783118053456_0.24756932422167433","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@aroha-sdk/mcp-bridge","version":"1.2.2","license":"MIT","_id":"@aroha-sdk/mcp-bridge@1.2.2","maintainers":[{"name":"aroha-labs","email":"projectmed99@gmail.com"}],"dist":{"shasum":"3ccfe2c0a6d65cedfab6e019f5a8ab79fbafae64","tarball":"https://registry.npmjs.org/@aroha-sdk/mcp-bridge/-/mcp-bridge-1.2.2.tgz","fileCount":11,"integrity":"sha512-HQDVsj50gmm8d65iI9k8CQT1aSIdPKgmYm5nLQsCji8J2kPpGbd/52DwzNhuo0oclcVYuWcd8FhLiKdICRiXJg==","signatures":[{"sig":"MEYCIQCakN336x8crI4o2VkGjeyBaoOjlbXxp+oddZIVmLtDPwIhAMjOYl1HNMhF8nrTlncWlZhGW7o3hN5R6YDY1SLEZdIW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54711},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ca0800d55b453d5e9b38ffce3dff055f010619eb","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"aroha-labs","email":"projectmed99@gmail.com"},"_npmVersion":"11.16.0","description":"Aroha â†” MCP (Model Context Protocol) adapter","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@aroha-sdk/core":"^1.0.0","@aroha-sdk/registry":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.6.0","typescript":"^5.4.5","@types/node":"^20.14.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-bridge_1.2.2_1783119729995_0.7808587625581576","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@aroha-sdk/mcp-bridge","version":"2.0.0","description":"Aroha â†” MCP (Model Context Protocol) adapter","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run"},"dependencies":{"@aroha-sdk/core":"^1.0.0","@aroha-sdk/credentials":"^1.0.0","@aroha-sdk/registry":"^1.0.0","@noble/ed25519":"^2.1.0"},"devDependencies":{"typescript":"^5.4.5","vitest":"^1.6.0","@types/node":"^20.14.0"},"license":"MIT","engines":{"node":">=18.0.0"},"gitHead":"8e225a48d330ac33d79a3d6476c6ac7eda8e0244","_id":"@aroha-sdk/mcp-bridge@2.0.0","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-ZVrkBXcNVUvo1VQt8mTu1AB3zg3zUeySbx4Cbtgjhg7xsrYgMySE6O6AFGBG+d7w4KMJ/FdrNhq06QhLiTO2jA==","shasum":"eae4e64f24499f1e9a762754f113e97eea770d9b","tarball":"https://registry.npmjs.org/@aroha-sdk/mcp-bridge/-/mcp-bridge-2.0.0.tgz","fileCount":12,"unpackedSize":122839,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCHoUwmW/EaiECceBvL0K4QnH3K2rCAvdmGScCaCNd5UQIhAOh4KyS20/aoqdr1kV0ngb2muCFJ9uOdSpd5qen/DXDQ"}]},"_npmUser":{"name":"aroha-labs","email":"projectmed99@gmail.com"},"directories":{},"maintainers":[{"name":"aroha-labs","email":"projectmed99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-bridge_2.0.0_1786139387670_0.2676400630563982"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-23T00:15:40.550Z","modified":"2026-08-07T21:49:47.999Z","1.0.0":"2026-06-23T00:15:40.898Z","1.2.0":"2026-06-23T02:24:31.442Z","1.2.1":"2026-07-03T22:34:13.582Z","1.2.2":"2026-07-03T23:02:10.126Z","2.0.0":"2026-08-07T21:49:47.811Z"},"license":"MIT","description":"Aroha â†” MCP (Model Context Protocol) adapter","maintainers":[{"name":"aroha-labs","email":"projectmed99@gmail.com"}],"readme":"# @aroha-sdk/mcp-bridge\n\n![Beta](https://img.shields.io/badge/status-beta-blue) ![npm](https://img.shields.io/npm/v/@aroha-sdk/mcp-bridge)\n\nTranslate between MCP tool definitions and Aroha agents, in both directions:\nwrap an MCP tool server as a callable Aroha agent, or call a discovered Aroha\nagent's capabilities as MCP tools.\n\n## Install\n\n```bash\nnpm install @aroha-sdk/mcp-bridge\n```\n\n## Quick example\n\n```typescript\nimport { wrapMcp, registryPublicKeyResolver } from \"@aroha-sdk/mcp-bridge\";\n\n// Expose your MCP tools as an Aroha agent\nconst agent = await wrapMcp(server.listTools(), {\n  name: \"weather-tools\",\n  price: 0.01, // optional: charge $0.01 per call\n  resolvePublicKey: registryPublicKeyResolver(), // verifies who's actually calling\n  handlers: {\n    // One entry per tool name returned by listTools(). Each must return the\n    // tool's real result — wrapMcp() has no way to run your tool for you.\n    get_weather: async (args) => ({\n      content: [{ type: \"text\", text: await getWeather(args) }],\n    }),\n  },\n});\n\nawait agent.start(); // throws if any tool in the list has no handler entry\n// ✓ did:aroha:weather-tools  →  http://localhost:3001\n```\n\nEvery incoming request is verified before any tool runs: signature (against\nthe sender DID `resolvePublicKey` resolves), expiry, and nonce replay — the\nsame `validateEnvelope()` every other Aroha transport in the SDK uses, not a\nbridge-specific check. A caller `resolvePublicKey` can't resolve, or whose\nsignature doesn't match, never reaches a tool handler.\n\n## Requiring a spending mandate\n\n```typescript\nconst agent = await wrapMcp(server.listTools(), {\n  name: \"weather-tools\",\n  price: 0.01,\n  resolvePublicKey: registryPublicKeyResolver(),\n  requireMandate: true, // reject any call with no valid mandate granting the caller\n  handlers: { /* ... */ },\n});\n```\n\nWith `requireMandate: true`, every request must carry a spending mandate (in\n`body.credentialToken`) that (a) grants the calling agent's DID specifically —\na mandate granted to someone else is rejected — and (b) is signed by an\nissuer `resolvePublicKey` can resolve, with a real, checked signature — not\njust a mandate-shaped object present in the request. Issue mandates with\n`issueIntentMandate` / `issueTaskMandate` from `@aroha-sdk/credentials`.\n\n## API\n\n- `wrapMcp(tools, opts)` — wrap an array of MCP tool definitions as an Aroha agent. Returns `{ did, port, endpoint, capabilities, start() }`.\n- `opts.name` — agent name (used to generate the DID).\n- `opts.handlers` — **required.** Real tool implementations, keyed by tool name, each returning `{ content: [{ type: \"text\", text }], isError? }`.\n- `opts.resolvePublicKey` — **required.** Resolves a caller DID to its Ed25519 public key, used to verify every request's signature. Use `registryPublicKeyResolver()` for the common case, or supply your own.\n- `opts.requireMandate` — when `true`, reject any request without a valid spending mandate granting the caller. Default `false`.\n- `opts.price` — per-call price in USD, attached to the derived capability's pricing metadata.\n- `opts.did` / `opts.port` / `opts.privateKey` — override the auto-generated identity/port.\n- `registryPublicKeyResolver(baseUrl?)` — a `resolvePublicKey` implementation backed by the Aroha registry.\n- `arohaAgentToMcpTools(agent, orchestratorDID, orchestratorPrivateKey, client, correlationId)` — the other direction: call a discovered Aroha agent's capabilities as MCP tools. Returns `{ tools, handleToolCall }`.\n- `mcpToolsToArohaCapabilities(tools)` — convert MCP tool definitions into Aroha capability definitions, used internally by `wrapMcp()`.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}