@bsv/simple-mcp 0.0.1

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.
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateServerRoute = generateServerRoute;
4
+ function generateServerRoute(routeType) {
5
+ if (routeType === 'identity-registry') {
6
+ return `\`\`\`typescript
7
+ // app/api/identity-registry/route.ts
8
+ import { createIdentityRegistryHandler } from '@bsv/simple/server'
9
+ const handler = createIdentityRegistryHandler()
10
+ export const GET = handler.GET, POST = handler.POST
11
+ \`\`\`
12
+
13
+ **API endpoints:**
14
+ - \`GET ?action=lookup&query=...\` → \`{ success, results: [{ tag, identityKey }] }\`
15
+ - \`GET ?action=list&identityKey=...\` → \`{ success, tags: [{ tag, createdAt }] }\`
16
+ - \`POST ?action=register\` body: \`{ tag, identityKey }\` → \`{ success, message, tag }\`
17
+ - \`POST ?action=revoke\` body: \`{ tag, identityKey }\` → \`{ success, message, tag }\`
18
+
19
+ **Custom config options:**
20
+ \`\`\`typescript
21
+ createIdentityRegistryHandler({
22
+ validateTag: (tag) => tag.startsWith('@') ? null : 'Must start with @',
23
+ maxTagsPerIdentity: 3
24
+ })
25
+ \`\`\``;
26
+ }
27
+ if (routeType === 'did-resolver') {
28
+ return `\`\`\`typescript
29
+ // app/api/resolve-did/route.ts
30
+ import { createDIDResolverHandler } from '@bsv/simple/server'
31
+ const handler = createDIDResolverHandler()
32
+ export const GET = handler.GET
33
+ \`\`\`
34
+
35
+ **API:** \`GET ?did=did:bsv:<txid>\` → \`DIDResolutionResult\`
36
+
37
+ **Custom config options:**
38
+ \`\`\`typescript
39
+ createDIDResolverHandler({
40
+ resolverUrl: 'https://custom-resolver.com', // nChain Universal Resolver by default
41
+ wocBaseUrl: 'https://api.whatsonchain.com', // WoC fallback
42
+ resolverTimeout: 10000, // ms
43
+ maxHops: 100 // chain-following limit
44
+ })
45
+ \`\`\``;
46
+ }
47
+ if (routeType === 'server-wallet') {
48
+ return `\`\`\`typescript
49
+ // app/api/server-wallet/route.ts
50
+ import { createServerWalletHandler } from '@bsv/simple/server'
51
+ const handler = createServerWalletHandler()
52
+ export const GET = handler.GET, POST = handler.POST
53
+ \`\`\`
54
+
55
+ **API endpoints:**
56
+ - \`GET ?action=create\` → \`{ success, serverIdentityKey, status }\`
57
+ - \`GET ?action=status\` → \`{ success, saved, identityKey }\`
58
+ - \`GET ?action=request&satoshis=1000\` → \`{ success, paymentRequest }\`
59
+ - \`GET ?action=balance\` → \`{ success, totalOutputs, totalSatoshis }\`
60
+ - \`GET ?action=outputs\` → \`{ success, outputs }\`
61
+ - \`GET ?action=reset\` → \`{ success, message }\`
62
+ - \`POST ?action=receive\` body: \`{ tx, senderIdentityKey, derivationPrefix, derivationSuffix, outputIndex }\`
63
+
64
+ **Custom config options:**
65
+ \`\`\`typescript
66
+ createServerWalletHandler({
67
+ envVar: 'SERVER_PRIVATE_KEY', // env var name
68
+ keyFile: '.server-wallet.json', // file persistence
69
+ network: 'main',
70
+ defaultRequestSatoshis: 1000,
71
+ requestMemo: 'Payment to server'
72
+ })
73
+ \`\`\`
74
+
75
+ Key persistence order: env var → file → auto-generate via \`generatePrivateKey()\`. No \`@bsv/sdk\` import needed.`;
76
+ }
77
+ if (routeType === 'credential-issuer') {
78
+ return `\`\`\`typescript
79
+ // app/api/credential-issuer/route.ts (no [[...path]] catch-all needed!)
80
+ import { createCredentialIssuerHandler } from '@bsv/simple/server'
81
+ const handler = createCredentialIssuerHandler({
82
+ schemas: [{
83
+ id: 'my-credential',
84
+ name: 'MyCredential',
85
+ fields: [
86
+ { key: 'name', label: 'Full Name', type: 'text', required: true },
87
+ { key: 'email', label: 'Email', type: 'email' },
88
+ ]
89
+ }]
90
+ })
91
+ export const GET = handler.GET, POST = handler.POST
92
+ \`\`\`
93
+
94
+ **API endpoints:**
95
+ - \`GET ?action=info\` → \`{ certifierPublicKey, certificateType, schemas }\`
96
+ - \`GET ?action=schema&id=...\` → schema details
97
+ - \`GET ?action=status&serialNumber=...\` → revocation status
98
+ - \`POST ?action=certify\` body: \`{ identityKey, schemaId, fields }\` → CertificateData
99
+ - \`POST ?action=issue\` body: \`{ subjectKey, schemaId, fields }\` → \`{ credential }\`
100
+ - \`POST ?action=verify\` body: \`{ credential }\` → \`{ verification }\`
101
+ - \`POST ?action=revoke\` body: \`{ serialNumber }\` → \`{ txid }\`
102
+
103
+ **Custom config options:**
104
+ \`\`\`typescript
105
+ createCredentialIssuerHandler({
106
+ schemas: [schemaConfig],
107
+ envVar: 'CREDENTIAL_ISSUER_KEY', // env var for private key
108
+ keyFile: '.credential-issuer-key.json', // file persistence
109
+ revocationStorePath: '.revocation-secrets.json'
110
+ })
111
+ \`\`\``;
112
+ }
113
+ // Default: show all routes
114
+ return `## All Server API Routes (Handler Factories)
115
+
116
+ No boilerplate needed. No \`@bsv/sdk\` import. Each is 3 lines:
117
+
118
+ \`\`\`typescript
119
+ // app/api/identity-registry/route.ts
120
+ import { createIdentityRegistryHandler } from '@bsv/simple/server'
121
+ const handler = createIdentityRegistryHandler()
122
+ export const GET = handler.GET, POST = handler.POST
123
+ \`\`\`
124
+
125
+ \`\`\`typescript
126
+ // app/api/resolve-did/route.ts
127
+ import { createDIDResolverHandler } from '@bsv/simple/server'
128
+ const handler = createDIDResolverHandler()
129
+ export const GET = handler.GET
130
+ \`\`\`
131
+
132
+ \`\`\`typescript
133
+ // app/api/server-wallet/route.ts
134
+ import { createServerWalletHandler } from '@bsv/simple/server'
135
+ const handler = createServerWalletHandler()
136
+ export const GET = handler.GET, POST = handler.POST
137
+ \`\`\`
138
+
139
+ \`\`\`typescript
140
+ // app/api/credential-issuer/route.ts (no [[...path]] needed!)
141
+ import { createCredentialIssuerHandler } from '@bsv/simple/server'
142
+ const handler = createCredentialIssuerHandler({
143
+ schemas: [{ id: 'my-cred', name: 'MyCred', fields: [{ key: 'name', label: 'Name', type: 'text', required: true }] }]
144
+ })
145
+ export const GET = handler.GET, POST = handler.POST
146
+ \`\`\``;
147
+ }
@@ -0,0 +1 @@
1
+ export declare function generateTokenHandler(operations: string[]): string;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateTokenHandler = generateTokenHandler;
4
+ function generateTokenHandler(operations) {
5
+ const sections = [];
6
+ if (operations.includes('create')) {
7
+ sections.push(`### Create Token
8
+ \`\`\`typescript
9
+ async function createToken(wallet: BrowserWallet, data: any, basket = 'my-tokens') {
10
+ const result = await wallet.createToken({
11
+ data,
12
+ basket,
13
+ satoshis: 1
14
+ })
15
+
16
+ console.log('Token created:', result.txid)
17
+ console.log('Basket:', result.basket, '| Encrypted:', result.encrypted)
18
+ return result
19
+ }
20
+
21
+ // Usage:
22
+ // await createToken(wallet, { type: 'loyalty', points: 100 })
23
+ \`\`\``);
24
+ }
25
+ if (operations.includes('list')) {
26
+ sections.push(`### List Tokens
27
+ \`\`\`typescript
28
+ async function listTokens(wallet: BrowserWallet, basket = 'my-tokens') {
29
+ const tokens = await wallet.listTokenDetails(basket)
30
+
31
+ for (const token of tokens) {
32
+ console.log(\`[\${token.outpoint}] \${token.satoshis} sats\`, token.data)
33
+ }
34
+
35
+ return tokens
36
+ }
37
+ \`\`\``);
38
+ }
39
+ if (operations.includes('send')) {
40
+ sections.push(`### Send Token
41
+ \`\`\`typescript
42
+ async function sendToken(
43
+ wallet: BrowserWallet,
44
+ basket: string,
45
+ outpoint: string,
46
+ recipientKey: string
47
+ ) {
48
+ const result = await wallet.sendToken({ basket, outpoint, to: recipientKey })
49
+ console.log('Token sent:', result.txid)
50
+ return result
51
+ }
52
+ \`\`\``);
53
+ }
54
+ if (operations.includes('redeem')) {
55
+ sections.push(`### Redeem Token
56
+ \`\`\`typescript
57
+ async function redeemToken(wallet: BrowserWallet, basket: string, outpoint: string) {
58
+ const result = await wallet.redeemToken({ basket, outpoint })
59
+ console.log('Token redeemed:', result.txid)
60
+ return result
61
+ }
62
+ \`\`\``);
63
+ }
64
+ if (operations.includes('messagebox')) {
65
+ sections.push(`### Send Token via MessageBox
66
+ \`\`\`typescript
67
+ async function sendTokenViaMessageBox(
68
+ wallet: BrowserWallet,
69
+ basket: string,
70
+ outpoint: string,
71
+ recipientKey: string
72
+ ) {
73
+ const result = await wallet.sendTokenViaMessageBox({ basket, outpoint, to: recipientKey })
74
+ console.log('Token sent via MessageBox:', result.txid)
75
+ return result
76
+ }
77
+
78
+ async function receiveTokens(wallet: BrowserWallet, targetBasket = 'received-tokens') {
79
+ const incoming = await wallet.listIncomingTokens()
80
+ console.log(\`\${incoming.length} incoming tokens\`)
81
+
82
+ for (const token of incoming) {
83
+ const accepted = await wallet.acceptIncomingToken(token, targetBasket)
84
+ console.log('Accepted token from:', accepted.sender)
85
+ }
86
+
87
+ return incoming.length
88
+ }
89
+ \`\`\``);
90
+ }
91
+ return sections.join('\n\n');
92
+ }
@@ -0,0 +1 @@
1
+ export declare function generateWalletSetup(target: string, framework: string): string;
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateWalletSetup = generateWalletSetup;
4
+ function generateWalletSetup(target, framework) {
5
+ if (target === 'browser') {
6
+ if (framework === 'nextjs') {
7
+ return `\`\`\`typescript
8
+ 'use client'
9
+ import { useState } from 'react'
10
+ import { createWallet, type BrowserWallet } from '@bsv/simple/browser'
11
+
12
+ export default function WalletProvider({ children }: { children: React.ReactNode }) {
13
+ const [wallet, setWallet] = useState<BrowserWallet | null>(null)
14
+ const [error, setError] = useState<string | null>(null)
15
+
16
+ const connect = async () => {
17
+ try {
18
+ setError(null)
19
+ const w = await createWallet()
20
+ setWallet(w)
21
+ } catch (e) {
22
+ setError((e as Error).message)
23
+ }
24
+ }
25
+
26
+ if (!wallet) {
27
+ return (
28
+ <div>
29
+ <button onClick={connect}>Connect Wallet</button>
30
+ {error && <p style={{ color: 'red' }}>{error}</p>}
31
+ </div>
32
+ )
33
+ }
34
+
35
+ return (
36
+ <div>
37
+ <p>Connected: {wallet.getIdentityKey().substring(0, 20)}...</p>
38
+ <p>Address: {wallet.getAddress()}</p>
39
+ {children}
40
+ </div>
41
+ )
42
+ }
43
+ \`\`\``;
44
+ }
45
+ if (framework === 'react') {
46
+ return `\`\`\`typescript
47
+ import { useState, useEffect } from 'react'
48
+ import { createWallet, type BrowserWallet } from '@bsv/simple/browser'
49
+
50
+ export function useWallet() {
51
+ const [wallet, setWallet] = useState<BrowserWallet | null>(null)
52
+ const [loading, setLoading] = useState(false)
53
+ const [error, setError] = useState<string | null>(null)
54
+
55
+ const connect = async () => {
56
+ try {
57
+ setLoading(true)
58
+ setError(null)
59
+ const w = await createWallet()
60
+ setWallet(w)
61
+ } catch (e) {
62
+ setError((e as Error).message)
63
+ } finally {
64
+ setLoading(false)
65
+ }
66
+ }
67
+
68
+ return { wallet, loading, error, connect }
69
+ }
70
+ \`\`\``;
71
+ }
72
+ return `\`\`\`typescript
73
+ import { createWallet } from '@bsv/simple/browser'
74
+
75
+ async function main() {
76
+ const wallet = await createWallet()
77
+ console.log('Connected:', wallet.getIdentityKey())
78
+ console.log('Address:', wallet.getAddress())
79
+ console.log('Status:', wallet.getStatus())
80
+ }
81
+
82
+ main().catch(console.error)
83
+ \`\`\``;
84
+ }
85
+ // Server target
86
+ if (framework === 'nextjs') {
87
+ return `\`\`\`typescript
88
+ // app/api/server-wallet/route.ts — Simplified with handler factory
89
+ import { createServerWalletHandler } from '@bsv/simple/server'
90
+ const handler = createServerWalletHandler()
91
+ export const GET = handler.GET, POST = handler.POST
92
+ \`\`\`
93
+
94
+ Handles lazy-init singleton, key persistence, and all actions automatically.
95
+
96
+ **Key persistence order:**
97
+ 1. \`process.env.SERVER_PRIVATE_KEY\` — Environment variable (production)
98
+ 2. \`.server-wallet.json\` file — Persisted from previous run (development)
99
+ 3. Auto-generated via \`generatePrivateKey()\` — Fresh key (first run)
100
+
101
+ **API endpoints:**
102
+ - \`GET ?action=create\` → server identity key + status
103
+ - \`GET ?action=request&satoshis=1000\` → BRC-29 payment request
104
+ - \`GET ?action=balance\` → output count + total satoshis
105
+ - \`POST ?action=receive\` body: \`{ tx, senderIdentityKey, derivationPrefix, derivationSuffix, outputIndex }\`
106
+
107
+ No \`@bsv/sdk\` import needed. Add \`.server-wallet.json\` to \`.gitignore\`.`;
108
+ }
109
+ return `\`\`\`typescript
110
+ import { ServerWallet, generatePrivateKey } from '@bsv/simple/server'
111
+
112
+ async function main() {
113
+ const privateKey = process.env.SERVER_PRIVATE_KEY || generatePrivateKey()
114
+
115
+ const wallet = await ServerWallet.create({
116
+ privateKey,
117
+ network: 'main',
118
+ storageUrl: 'https://storage.babbage.systems'
119
+ })
120
+
121
+ console.log('Server wallet ready:', wallet.getIdentityKey())
122
+ console.log('Status:', wallet.getStatus())
123
+ }
124
+
125
+ main().catch(console.error)
126
+ \`\`\``;
127
+ }
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@bsv/simple-mcp",
3
+ "version": "0.0.1",
4
+ "description": "MCP server for @bsv/simple — AI-assisted BSV blockchain development",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "simple-mcp": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "start": "node dist/index.js",
15
+ "dev": "tsc --watch",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": [
19
+ "bsv",
20
+ "blockchain",
21
+ "mcp",
22
+ "model-context-protocol",
23
+ "ai",
24
+ "claude",
25
+ "bitcoin"
26
+ ],
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/bsv-blockchain/simple-mcp.git"
31
+ },
32
+ "homepage": "https://github.com/bsv-blockchain/simple-mcp#readme",
33
+ "bugs": {
34
+ "url": "https://github.com/bsv-blockchain/simple-mcp/issues"
35
+ },
36
+ "engines": {
37
+ "node": ">=18"
38
+ },
39
+ "dependencies": {
40
+ "@modelcontextprotocol/sdk": "^1.11.0"
41
+ },
42
+ "devDependencies": {
43
+ "typescript": "^5.3.0",
44
+ "@types/node": "^20.0.0"
45
+ }
46
+ }