bsv-mcp 0.0.26 → 0.0.28

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,685 @@
1
+ import {
2
+ type McpServer,
3
+ ResourceTemplate,
4
+ } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+
6
+ /**
7
+ * BRC Categories for organizing the Bitcoin Request for Comments specifications
8
+ */
9
+ export enum BRCCategory {
10
+ Wallet = "wallet",
11
+ Transactions = "transactions",
12
+ Scripts = "scripts",
13
+ Tokens = "tokens",
14
+ Overlays = "overlays",
15
+ Payments = "payments",
16
+ PeerToPeer = "peer-to-peer",
17
+ KeyDerivation = "key-derivation",
18
+ Outpoints = "outpoints",
19
+ Opinions = "opinions",
20
+ StateMachines = "state-machines",
21
+ Apps = "apps",
22
+ }
23
+
24
+ /**
25
+ * Interface defining a BRC document
26
+ */
27
+ interface BRCDocument {
28
+ number: string;
29
+ title: string;
30
+ category: BRCCategory;
31
+ }
32
+
33
+ /**
34
+ * Register all BRC-related resources with the MCP server
35
+ * @param server The MCP server instance
36
+ */
37
+ export function registerBRCsResources(server: McpServer): void {
38
+ // Register BRCs repository main README
39
+ server.resource(
40
+ "brcs_readme",
41
+ "https://raw.githubusercontent.com/bitcoin-sv/BRCs/master/README.md",
42
+ {
43
+ title: "Bitcoin SV BRCs Overview",
44
+ description:
45
+ "Overview of all Bitcoin SV protocol specifications in the BRCs repository",
46
+ },
47
+ async (uri) => {
48
+ const resp = await fetch(uri.href);
49
+ const text = await resp.text();
50
+ return {
51
+ contents: [
52
+ {
53
+ uri: uri.href,
54
+ text,
55
+ },
56
+ ],
57
+ };
58
+ },
59
+ );
60
+
61
+ // Register SUMMARY file which has the ToC
62
+ server.resource(
63
+ "brcs_summary",
64
+ "https://raw.githubusercontent.com/bitcoin-sv/BRCs/master/SUMMARY.md",
65
+ {
66
+ title: "Bitcoin SV BRCs Summary",
67
+ description: "Table of contents for all Bitcoin SV BRCs",
68
+ },
69
+ async (uri) => {
70
+ const resp = await fetch(uri.href);
71
+ const text = await resp.text();
72
+ return {
73
+ contents: [
74
+ {
75
+ uri: uri.href,
76
+ text,
77
+ },
78
+ ],
79
+ };
80
+ },
81
+ );
82
+
83
+ // Add a dynamic BRC specification resource for any BRC by path
84
+ server.resource(
85
+ "brc_spec",
86
+ new ResourceTemplate("brc://{category}/{brcNumber}", { list: undefined }),
87
+ {
88
+ title: "Bitcoin SV BRC Specification",
89
+ description: "Access specific BRC specifications by category and number",
90
+ },
91
+ async (uri, { category, brcNumber }) => {
92
+ const path = `${category}/${brcNumber}.md`;
93
+ const resp = await fetch(
94
+ `https://raw.githubusercontent.com/bitcoin-sv/BRCs/master/${path}`,
95
+ );
96
+
97
+ if (!resp.ok) {
98
+ throw new Error(`BRC specification not found: ${path}`);
99
+ }
100
+
101
+ const text = await resp.text();
102
+ return {
103
+ contents: [
104
+ {
105
+ uri: uri.href,
106
+ text,
107
+ },
108
+ ],
109
+ };
110
+ },
111
+ );
112
+
113
+ // Register individual BRCs
114
+ registerAllBRCs(server);
115
+ }
116
+
117
+ /**
118
+ * Register all BRC specifications from the master list
119
+ */
120
+ function registerAllBRCs(server: McpServer): void {
121
+ // Complete list of BRCs from the README.md
122
+ const brcs: BRCDocument[] = [
123
+ {
124
+ number: "0",
125
+ title: "Banana-Powered Bitcoin Wallet Control Protocol",
126
+ category: BRCCategory.Wallet,
127
+ },
128
+ {
129
+ number: "1",
130
+ title: "Transaction Creation",
131
+ category: BRCCategory.Wallet,
132
+ },
133
+ {
134
+ number: "2",
135
+ title: "Data Encryption and Decryption",
136
+ category: BRCCategory.Wallet,
137
+ },
138
+ {
139
+ number: "3",
140
+ title: "Digital Signature Creation and Verification",
141
+ category: BRCCategory.Wallet,
142
+ },
143
+ { number: "4", title: "Input Redemption", category: BRCCategory.Wallet },
144
+ {
145
+ number: "5",
146
+ title: "HTTP Wallet Communications Substrate",
147
+ category: BRCCategory.Wallet,
148
+ },
149
+ {
150
+ number: "6",
151
+ title: "XDM Wallet Communications Substrate",
152
+ category: BRCCategory.Wallet,
153
+ },
154
+ {
155
+ number: "7",
156
+ title: "Window Wallet Communication Substrate",
157
+ category: BRCCategory.Wallet,
158
+ },
159
+ {
160
+ number: "8",
161
+ title: "Everett-style Transaction Envelopes",
162
+ category: BRCCategory.Transactions,
163
+ },
164
+ {
165
+ number: "9",
166
+ title: "Simplified Payment Verification",
167
+ category: BRCCategory.Transactions,
168
+ },
169
+ {
170
+ number: "10",
171
+ title: "Merkle proof standardised format",
172
+ category: BRCCategory.Transactions,
173
+ },
174
+ {
175
+ number: "11",
176
+ title: "TSC Proof Format with Heights",
177
+ category: BRCCategory.Transactions,
178
+ },
179
+ {
180
+ number: "12",
181
+ title: "Raw Transaction Format",
182
+ category: BRCCategory.Transactions,
183
+ },
184
+ {
185
+ number: "13",
186
+ title: "TXO Transaction Object Format",
187
+ category: BRCCategory.Transactions,
188
+ },
189
+ {
190
+ number: "14",
191
+ title: "Bitcoin Script Binary, Hex and ASM Formats",
192
+ category: BRCCategory.Scripts,
193
+ },
194
+ {
195
+ number: "15",
196
+ title: "Bitcoin Script Assembly Language",
197
+ category: BRCCategory.Scripts,
198
+ },
199
+ {
200
+ number: "16",
201
+ title: "Pay to Public Key Hash",
202
+ category: BRCCategory.Scripts,
203
+ },
204
+ {
205
+ number: "17",
206
+ title: "Pay to R Puzzle Hash",
207
+ category: BRCCategory.Scripts,
208
+ },
209
+ {
210
+ number: "18",
211
+ title: "Pay to False Return",
212
+ category: BRCCategory.Scripts,
213
+ },
214
+ {
215
+ number: "19",
216
+ title: "Pay to True Return",
217
+ category: BRCCategory.Scripts,
218
+ },
219
+ { number: "20", title: "There is no BRC-20", category: BRCCategory.Tokens },
220
+ { number: "21", title: "Push TX", category: BRCCategory.Scripts },
221
+ {
222
+ number: "22",
223
+ title: "Overlay Network Data Synchronization",
224
+ category: BRCCategory.Overlays,
225
+ },
226
+ {
227
+ number: "23",
228
+ title: "Confederacy Host Interconnect Protocol (CHIP)",
229
+ category: BRCCategory.Overlays,
230
+ },
231
+ {
232
+ number: "24",
233
+ title: "Overlay Network Lookup Services",
234
+ category: BRCCategory.Overlays,
235
+ },
236
+ {
237
+ number: "25",
238
+ title: "Confederacy Lookup Availability Protocol (CLAP)",
239
+ category: BRCCategory.Overlays,
240
+ },
241
+ {
242
+ number: "26",
243
+ title: "Universal Hash Resolution Protocol",
244
+ category: BRCCategory.Overlays,
245
+ },
246
+ {
247
+ number: "27",
248
+ title: "Direct Payment Protocol (DPP)",
249
+ category: BRCCategory.Payments,
250
+ },
251
+ {
252
+ number: "28",
253
+ title: "Paymail Payment Destinations",
254
+ category: BRCCategory.Payments,
255
+ },
256
+ {
257
+ number: "29",
258
+ title: "Simple Authenticated BSV P2PKH Payment Protocol",
259
+ category: BRCCategory.Payments,
260
+ },
261
+ {
262
+ number: "30",
263
+ title: "Transaction Extended Format (EF)",
264
+ category: BRCCategory.Transactions,
265
+ },
266
+ {
267
+ number: "31",
268
+ title: "Authrite Mutual Authentication",
269
+ category: BRCCategory.PeerToPeer,
270
+ },
271
+ {
272
+ number: "32",
273
+ title: "BIP32 Key Derivation Scheme",
274
+ category: BRCCategory.KeyDerivation,
275
+ },
276
+ {
277
+ number: "33",
278
+ title: "PeerServ Message Relay Interface",
279
+ category: BRCCategory.PeerToPeer,
280
+ },
281
+ {
282
+ number: "34",
283
+ title: "PeerServ Host Interconnect Protocol",
284
+ category: BRCCategory.PeerToPeer,
285
+ },
286
+ // #35 is unused
287
+ {
288
+ number: "36",
289
+ title: "Format for Bitcoin Outpoints",
290
+ category: BRCCategory.Outpoints,
291
+ },
292
+ {
293
+ number: "37",
294
+ title: "Spending Instructions Extension for UTXO Storage Format",
295
+ category: BRCCategory.Outpoints,
296
+ },
297
+ // 38, 39, 40 are placeholders in the README
298
+ {
299
+ number: "41",
300
+ title: "PacketPay HTTP Payment Mechanism",
301
+ category: BRCCategory.Payments,
302
+ },
303
+ {
304
+ number: "42",
305
+ title: "BSV Key Derivation Scheme (BKDS)",
306
+ category: BRCCategory.KeyDerivation,
307
+ },
308
+ {
309
+ number: "43",
310
+ title: "Security Levels, Protocol IDs, Key IDs and Counterparties",
311
+ category: BRCCategory.KeyDerivation,
312
+ },
313
+ {
314
+ number: "44",
315
+ title: "Admin-reserved and Prohibited Key Derivation Protocols",
316
+ category: BRCCategory.KeyDerivation,
317
+ },
318
+ {
319
+ number: "45",
320
+ title: "Definition of UTXOs as Bitcoin Tokens",
321
+ category: BRCCategory.Tokens,
322
+ },
323
+ {
324
+ number: "46",
325
+ title: "Wallet Transaction Output Tracking (Output Baskets)",
326
+ category: BRCCategory.Wallet,
327
+ },
328
+ {
329
+ number: "47",
330
+ title: "Bare Multi-Signature",
331
+ category: BRCCategory.Scripts,
332
+ },
333
+ { number: "48", title: "Pay to Push Drop", category: BRCCategory.Scripts },
334
+ {
335
+ number: "49",
336
+ title: "Users should never see an address",
337
+ category: BRCCategory.Opinions,
338
+ },
339
+ {
340
+ number: "50",
341
+ title: "Submitting Received Payments to a Wallet",
342
+ category: BRCCategory.Wallet,
343
+ },
344
+ {
345
+ number: "51",
346
+ title: "List of user experiences",
347
+ category: BRCCategory.Opinions,
348
+ },
349
+ {
350
+ number: "52",
351
+ title: "Identity Certificates",
352
+ category: BRCCategory.PeerToPeer,
353
+ },
354
+ {
355
+ number: "53",
356
+ title: "Certificate Creation and Revelation",
357
+ category: BRCCategory.Wallet,
358
+ },
359
+ {
360
+ number: "54",
361
+ title: "Hybrid Payment Mode for DPP",
362
+ category: BRCCategory.Payments,
363
+ },
364
+ {
365
+ number: "55",
366
+ title: "HTTPS Transport Mechanism for DPP",
367
+ category: BRCCategory.Payments,
368
+ },
369
+ {
370
+ number: "56",
371
+ title: "Unified Abstract Wallet-to-Application Messaging Layer",
372
+ category: BRCCategory.Wallet,
373
+ },
374
+ {
375
+ number: "57",
376
+ title: "Legitimate Uses for mAPI",
377
+ category: BRCCategory.Opinions,
378
+ },
379
+ {
380
+ number: "58",
381
+ title: "Merkle Path JSON format",
382
+ category: BRCCategory.Transactions,
383
+ },
384
+ {
385
+ number: "59",
386
+ title: "Security and Scalability Benefits of UTXO-based Overlay Networks",
387
+ category: BRCCategory.Opinions,
388
+ },
389
+ {
390
+ number: "60",
391
+ title: "Simplifying State Machine Event Chains in Bitcoin",
392
+ category: BRCCategory.StateMachines,
393
+ },
394
+ {
395
+ number: "61",
396
+ title: "Compound Merkle Path Format",
397
+ category: BRCCategory.Transactions,
398
+ },
399
+ {
400
+ number: "62",
401
+ title: "Background Evaluation Extended Format (BEEF) Transactions",
402
+ category: BRCCategory.Transactions,
403
+ },
404
+ {
405
+ number: "63",
406
+ title: "Genealogical Identity Protocol",
407
+ category: BRCCategory.PeerToPeer,
408
+ },
409
+ {
410
+ number: "64",
411
+ title: "Overlay Network Transaction History Tracking",
412
+ category: BRCCategory.Overlays,
413
+ },
414
+ {
415
+ number: "65",
416
+ title: "Transaction Labels and List Actions",
417
+ category: BRCCategory.Wallet,
418
+ },
419
+ {
420
+ number: "66",
421
+ title: "Output Basket Removal and Certificate Deletion",
422
+ category: BRCCategory.Wallet,
423
+ },
424
+ {
425
+ number: "67",
426
+ title: "Simplified Payment Verification",
427
+ category: BRCCategory.Transactions,
428
+ },
429
+ {
430
+ number: "68",
431
+ title: "Publishing Trust Anchor Details at an Internet Domain",
432
+ category: BRCCategory.PeerToPeer,
433
+ },
434
+ {
435
+ number: "69",
436
+ title: "Revealing Key Linkages",
437
+ category: BRCCategory.KeyDerivation,
438
+ },
439
+ {
440
+ number: "70",
441
+ title: "Paymail BEEF Transaction",
442
+ category: BRCCategory.Payments,
443
+ },
444
+ {
445
+ number: "71",
446
+ title: "Merkle Path Binary Format",
447
+ category: BRCCategory.Transactions,
448
+ },
449
+ {
450
+ number: "72",
451
+ title: "Protecting BRC-69 Key Linkage Information in Transit",
452
+ category: BRCCategory.KeyDerivation,
453
+ },
454
+ {
455
+ number: "73",
456
+ title: "Group Permissions for App Access",
457
+ category: BRCCategory.Wallet,
458
+ },
459
+ {
460
+ number: "74",
461
+ title: "BSV Unified Merkle Path (BUMP) Format",
462
+ category: BRCCategory.Transactions,
463
+ },
464
+ {
465
+ number: "75",
466
+ title: "Mnemonic For Master Private Key",
467
+ category: BRCCategory.KeyDerivation,
468
+ },
469
+ {
470
+ number: "76",
471
+ title: "Graph Aware Sync Protocol",
472
+ category: BRCCategory.Transactions,
473
+ },
474
+ {
475
+ number: "77",
476
+ title: "Message Signature Creation and Verification",
477
+ category: BRCCategory.PeerToPeer,
478
+ },
479
+ {
480
+ number: "78",
481
+ title: "Serialization Format for Portable Encrypted Messages",
482
+ category: BRCCategory.PeerToPeer,
483
+ },
484
+ {
485
+ number: "79",
486
+ title: "Token Exchange Protocol for UTXO-based Overlay Networks",
487
+ category: BRCCategory.Tokens,
488
+ },
489
+ {
490
+ number: "80",
491
+ title: "Improving on MLD for BSV Multicast Services",
492
+ category: BRCCategory.Opinions,
493
+ },
494
+ {
495
+ number: "81",
496
+ title: "Private Overlays with P2PKH Transactions",
497
+ category: BRCCategory.Overlays,
498
+ },
499
+ {
500
+ number: "82",
501
+ title:
502
+ "Defining a Scalable IPv6 Multicast Protocol for Blockchain Transaction Broadcast",
503
+ category: BRCCategory.PeerToPeer,
504
+ },
505
+ {
506
+ number: "83",
507
+ title: "Scalable Transaction Processing in the BSV Network",
508
+ category: BRCCategory.Transactions,
509
+ },
510
+ {
511
+ number: "84",
512
+ title: "Linked Key Derivation Scheme",
513
+ category: BRCCategory.KeyDerivation,
514
+ },
515
+ {
516
+ number: "85",
517
+ title: "Proven Identity Key Exchange (PIKE)",
518
+ category: BRCCategory.PeerToPeer,
519
+ },
520
+ {
521
+ number: "86",
522
+ title:
523
+ "Bidirectionally Authenticated Derivation of Privacy Restricted Type 42 Keys",
524
+ category: BRCCategory.KeyDerivation,
525
+ },
526
+ {
527
+ number: "87",
528
+ title:
529
+ "Standardized Naming Conventions for BRC-22 Topic Managers and BRC-24 Lookup Services",
530
+ category: BRCCategory.Overlays,
531
+ },
532
+ {
533
+ number: "88",
534
+ title: "Overlay Services Synchronization Architecture",
535
+ category: BRCCategory.Overlays,
536
+ },
537
+ {
538
+ number: "89",
539
+ title: "Web 3.0 Standard (at a high level)",
540
+ category: BRCCategory.Opinions,
541
+ },
542
+ {
543
+ number: "90",
544
+ title: "Thoughts on the Mandala Network",
545
+ category: BRCCategory.Opinions,
546
+ },
547
+ {
548
+ number: "91",
549
+ title: "Outputs, Overlays, and Scripts in the Mandala Network",
550
+ category: BRCCategory.Opinions,
551
+ },
552
+ {
553
+ number: "92",
554
+ title: "Mandala Token Protocol",
555
+ category: BRCCategory.Tokens,
556
+ },
557
+ {
558
+ number: "93",
559
+ title: "Limitations of BRC-69 Key Linkage Revelation",
560
+ category: BRCCategory.KeyDerivation,
561
+ },
562
+ {
563
+ number: "94",
564
+ title: "Verifiable Revelation of Shared Secrets Using Schnorr Protocol",
565
+ category: BRCCategory.KeyDerivation,
566
+ },
567
+ {
568
+ number: "95",
569
+ title: "Atomic BEEF Transactions",
570
+ category: BRCCategory.Transactions,
571
+ },
572
+ {
573
+ number: "96",
574
+ title: "BEEF V2 Txid Only Extension",
575
+ category: BRCCategory.Transactions,
576
+ },
577
+ {
578
+ number: "97",
579
+ title: "Extensible Proof-Type Format for Specific Key Linkage Claims",
580
+ category: BRCCategory.Wallet,
581
+ },
582
+ {
583
+ number: "98",
584
+ title: "P Protocols: Allowing future wallet protocol permission schemes",
585
+ category: BRCCategory.Wallet,
586
+ },
587
+ {
588
+ number: "99",
589
+ title:
590
+ "P Baskets: Allowing Future Wallet Basket and Digital Asset Permission Schemes",
591
+ category: BRCCategory.Wallet,
592
+ },
593
+ {
594
+ number: "100",
595
+ title:
596
+ "Unified, Vendor-Neutral, Unchanging, and Open BSV Blockchain Standard Wallet-to-Application Interface",
597
+ category: BRCCategory.Wallet,
598
+ },
599
+ {
600
+ number: "101",
601
+ title:
602
+ "Diverse Facilitators and URL Protocols for SHIP and SLAP Overlay Advertisements",
603
+ category: BRCCategory.Overlays,
604
+ },
605
+ {
606
+ number: "102",
607
+ title: "The deployment-info.json Specification",
608
+ category: BRCCategory.Apps,
609
+ },
610
+ {
611
+ number: "103",
612
+ title:
613
+ "Peer-to-Peer Mutual Authentication and Certificate Exchange Protocol",
614
+ category: BRCCategory.PeerToPeer,
615
+ },
616
+ {
617
+ number: "104",
618
+ title: "HTTP Transport for BRC-103 Mutual Authentication",
619
+ category: BRCCategory.PeerToPeer,
620
+ },
621
+ {
622
+ number: "105",
623
+ title: "HTTP Service Monetization Framework",
624
+ category: BRCCategory.Payments,
625
+ },
626
+ ];
627
+
628
+ // Register each BRC
629
+ for (const brc of brcs) {
630
+ // Format the BRC number with leading zeros for consistency in resource IDs
631
+ const paddedNumber = brc.number.padStart(4, "0");
632
+
633
+ // Use a shorter resource ID that includes a relevant key from the title
634
+ const titleKeywords = brc.title.replace(/[^a-zA-Z0-9 ]/g, "").split(" ");
635
+ const keyword =
636
+ titleKeywords.find(
637
+ (word) =>
638
+ word.length > 3 &&
639
+ ![
640
+ "with",
641
+ "from",
642
+ "that",
643
+ "this",
644
+ "your",
645
+ "when",
646
+ "then",
647
+ "them",
648
+ "they",
649
+ "bitcoin",
650
+ ].includes(word.toLowerCase()),
651
+ ) ||
652
+ titleKeywords[0] ||
653
+ "brc";
654
+
655
+ // Create a descriptive resource ID
656
+ const resourceId = `brc_${paddedNumber}_${keyword.toLowerCase()}`;
657
+
658
+ // Build the URL to the BRC file
659
+ const url = `https://raw.githubusercontent.com/bitcoin-sv/BRCs/master/${brc.category}/${brc.number.padStart(4, "0")}.md`;
660
+
661
+ server.resource(
662
+ resourceId,
663
+ url,
664
+ {
665
+ title: `BRC-${brc.number}: ${brc.title}`,
666
+ description: `Bitcoin SV BRC-${brc.number}: ${brc.title}`,
667
+ },
668
+ async (uri) => {
669
+ const resp = await fetch(uri.href);
670
+ if (!resp.ok) {
671
+ throw new Error(`BRC-${brc.number} not found at ${uri.href}`);
672
+ }
673
+ const text = await resp.text();
674
+ return {
675
+ contents: [
676
+ {
677
+ uri: uri.href,
678
+ text,
679
+ },
680
+ ],
681
+ };
682
+ },
683
+ );
684
+ }
685
+ }
@@ -0,0 +1,44 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+
5
+ /**
6
+ * Register the changelog resource with the MCP server
7
+ * @param server The MCP server instance
8
+ */
9
+ export function registerChangelogResource(server: McpServer): void {
10
+ server.resource(
11
+ "bsv-mcp-changelog",
12
+ "https://github.com/b-open-io/bsv-mcp/blob/main/CHANGELOG.md",
13
+ {
14
+ title: "BSV MCP Server Changelog",
15
+ description: "Version history and changelog for the BSV MCP server",
16
+ },
17
+ async (uri) => {
18
+ try {
19
+ // Read the CHANGELOG.md file from the project root
20
+ const changelogPath = join(process.cwd(), "CHANGELOG.md");
21
+ const changelogContent = readFileSync(changelogPath, "utf-8");
22
+
23
+ return {
24
+ contents: [
25
+ {
26
+ uri: uri.href,
27
+ text: changelogContent,
28
+ },
29
+ ],
30
+ };
31
+ } catch (error) {
32
+ console.error("Error reading CHANGELOG.md:", error);
33
+ return {
34
+ contents: [
35
+ {
36
+ uri: uri.href,
37
+ text: "# BSV MCP Server Changelog\n\nError: Could not load changelog content.",
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ },
43
+ );
44
+ }