@moonbanking/mcp-server 1.5.1 → 1.7.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.
package/dist/index.js CHANGED
@@ -181,7 +181,7 @@ const tools = [
181
181
  },
182
182
  "include": {
183
183
  "type": "string",
184
- "description": "An optional comma-separated list of fields to include in the response. Possible values: `scores`, `country`, `meta`"
184
+ "description": "An optional comma-separated list of fields to include in the response. Possible values: `scores`, `country`, `meta`, `stocks`"
185
185
  },
186
186
  "countryId": {
187
187
  "type": "string",
@@ -206,7 +206,7 @@ const tools = [
206
206
  },
207
207
  "include": {
208
208
  "type": "string",
209
- "description": "An optional comma-separated list of fields to include in the response. Possible values: `scores`, `country`"
209
+ "description": "An optional comma-separated list of fields to include in the response. Possible values: `scores`, `country`, `stocks`"
210
210
  }
211
211
  },
212
212
  "required": [
@@ -298,6 +298,550 @@ const tools = [
298
298
  }
299
299
  }
300
300
  },
301
+ {
302
+ "name": "bankProduct_list",
303
+ "description": "This endpoint allows you to retrieve a paginated list of published bank products across all banks, so you can compare rates and terms between institutions. Filter by bank, country, category, type, currency, and rate, and sort by rate to find the most competitive offers. Products are supplied and maintained by each bank's own verified representatives. Every product includes the name of the bank that offers it.",
304
+ "inputSchema": {
305
+ "type": "object",
306
+ "properties": {
307
+ "limit": {
308
+ "type": "integer",
309
+ "description": "Number of items to return.",
310
+ "default": 10
311
+ },
312
+ "starting_after": {
313
+ "type": "string",
314
+ "description": "Cursor for forward pagination. Use the id of the last item from the previous page to get the next page."
315
+ },
316
+ "ending_before": {
317
+ "type": "string",
318
+ "description": "Cursor for backward pagination. Use the id of the first item from the current page to get the previous page."
319
+ },
320
+ "bankId": {
321
+ "type": "string",
322
+ "description": "Filter by the id of the bank that offers the product."
323
+ },
324
+ "countryCode": {
325
+ "type": "string",
326
+ "description": "Filter by the ISO country code of the bank offering the product."
327
+ },
328
+ "categories": {
329
+ "type": "string",
330
+ "description": "An optional comma-separated list of fields to include in the response. Possible values: `ACCOUNT`, `CARD`, `LOAN`, `INVESTMENT`, `INSURANCE`, `SERVICE`, `OTHER`"
331
+ },
332
+ "types": {
333
+ "type": "string",
334
+ "description": "An optional comma-separated list of fields to include in the response. Possible values: `CHECKING_ACCOUNT`, `SAVINGS_ACCOUNT`, `MONEY_MARKET_ACCOUNT`, `CERTIFICATE_OF_DEPOSIT`, `BUSINESS_CHECKING_ACCOUNT`, `BUSINESS_SAVINGS_ACCOUNT`, `YOUTH_ACCOUNT`, `CREDIT_CARD`, `DEBIT_CARD`, `BUSINESS_CREDIT_CARD`, `SECURED_CREDIT_CARD`, `PREPAID_CARD`, `PERSONAL_LOAN`, `AUTO_LOAN`, `MORTGAGE`, `HOME_EQUITY_LOAN`, `HOME_EQUITY_LINE_OF_CREDIT`, `STUDENT_LOAN`, `BUSINESS_LOAN`, `LINE_OF_CREDIT`, `CONSTRUCTION_LOAN`, `BROKERAGE_ACCOUNT`, `RETIREMENT_ACCOUNT`, `WEALTH_MANAGEMENT`, `INSURANCE`, `WIRE_TRANSFER`, `FOREIGN_EXCHANGE`, `MERCHANT_SERVICES`, `TREASURY_MANAGEMENT`, `SAFE_DEPOSIT_BOX`, `ONLINE_BANKING`, `MOBILE_BANKING`, `CRYPTO_SERVICE`, `OTHER`"
335
+ },
336
+ "currency": {
337
+ "type": "string",
338
+ "description": "Filter by the ISO 4217 currency code the product is denominated in."
339
+ },
340
+ "search": {
341
+ "type": "string",
342
+ "description": "Search products by name."
343
+ },
344
+ "minRatePercent": {
345
+ "type": "number",
346
+ "description": "Only return products whose rate reaches at least this percentage. A product matches on either its headline rate or the top of its rate range."
347
+ },
348
+ "maxRatePercent": {
349
+ "type": "number",
350
+ "description": "Only return products whose rate is no higher than this percentage. A product matches on either its headline rate or the bottom of its rate range."
351
+ },
352
+ "sortBy": {
353
+ "type": "string",
354
+ "description": "Field to sort by. Products that leave the sorted field empty are always returned last.",
355
+ "enum": [
356
+ "ratePercent",
357
+ "name",
358
+ "effectiveDate",
359
+ "createdAt",
360
+ "updatedAt"
361
+ ],
362
+ "default": "ratePercent"
363
+ },
364
+ "sortOrder": {
365
+ "type": "string",
366
+ "description": "Sort order. Either ascending or descending.",
367
+ "enum": [
368
+ "asc",
369
+ "desc"
370
+ ],
371
+ "default": "desc"
372
+ }
373
+ }
374
+ }
375
+ },
376
+ {
377
+ "name": "bankProduct_listByBank",
378
+ "description": "This endpoint allows you to retrieve the products and services a bank publishes on its Moon Banking profile, such as deposit accounts, loans, and credit cards. Products are supplied and maintained by the bank's own verified representatives. Only published products are returned; drafts, archived entries, and anything removed by the Moon Banking team are excluded.",
379
+ "inputSchema": {
380
+ "type": "object",
381
+ "properties": {
382
+ "bankId": {
383
+ "type": "string",
384
+ "description": "The bank's auto-generated unique identifier."
385
+ }
386
+ },
387
+ "required": [
388
+ "bankId"
389
+ ]
390
+ }
391
+ },
392
+ {
393
+ "name": "bankProduct_create",
394
+ "description": "This endpoint allows a bank's verified representatives to add a product to the bank's profile. Products default to published and appear on the bank's public page immediately. Pass `status` as `DRAFT` to stage a product without publishing it. You must be an approved representative of the bank.",
395
+ "inputSchema": {
396
+ "type": "object",
397
+ "properties": {
398
+ "bankId": {
399
+ "type": "string",
400
+ "description": "The bank's auto-generated unique identifier."
401
+ },
402
+ "category": {
403
+ "type": "string",
404
+ "description": "The broad category the product belongs to. Drives how the product is grouped on the bank's page.",
405
+ "enum": [
406
+ "ACCOUNT",
407
+ "CARD",
408
+ "LOAN",
409
+ "INVESTMENT",
410
+ "INSURANCE",
411
+ "SERVICE",
412
+ "OTHER"
413
+ ]
414
+ },
415
+ "type": {
416
+ "type": "string",
417
+ "description": "The specific kind of product.",
418
+ "enum": [
419
+ "CHECKING_ACCOUNT",
420
+ "SAVINGS_ACCOUNT",
421
+ "MONEY_MARKET_ACCOUNT",
422
+ "CERTIFICATE_OF_DEPOSIT",
423
+ "BUSINESS_CHECKING_ACCOUNT",
424
+ "BUSINESS_SAVINGS_ACCOUNT",
425
+ "YOUTH_ACCOUNT",
426
+ "CREDIT_CARD",
427
+ "DEBIT_CARD",
428
+ "BUSINESS_CREDIT_CARD",
429
+ "SECURED_CREDIT_CARD",
430
+ "PREPAID_CARD",
431
+ "PERSONAL_LOAN",
432
+ "AUTO_LOAN",
433
+ "MORTGAGE",
434
+ "HOME_EQUITY_LOAN",
435
+ "HOME_EQUITY_LINE_OF_CREDIT",
436
+ "STUDENT_LOAN",
437
+ "BUSINESS_LOAN",
438
+ "LINE_OF_CREDIT",
439
+ "CONSTRUCTION_LOAN",
440
+ "BROKERAGE_ACCOUNT",
441
+ "RETIREMENT_ACCOUNT",
442
+ "WEALTH_MANAGEMENT",
443
+ "INSURANCE",
444
+ "WIRE_TRANSFER",
445
+ "FOREIGN_EXCHANGE",
446
+ "MERCHANT_SERVICES",
447
+ "TREASURY_MANAGEMENT",
448
+ "SAFE_DEPOSIT_BOX",
449
+ "ONLINE_BANKING",
450
+ "MOBILE_BANKING",
451
+ "CRYPTO_SERVICE",
452
+ "OTHER"
453
+ ]
454
+ },
455
+ "name": {
456
+ "type": "string",
457
+ "description": "The product's marketing name."
458
+ },
459
+ "summary": {
460
+ "type": "string"
461
+ },
462
+ "details": {
463
+ "type": "string"
464
+ },
465
+ "url": {
466
+ "type": "string"
467
+ },
468
+ "currency": {
469
+ "type": "string"
470
+ },
471
+ "status": {
472
+ "type": "string",
473
+ "description": "Whether the product is a draft, published to the bank's page, or archived.",
474
+ "enum": [
475
+ "DRAFT",
476
+ "PUBLISHED",
477
+ "ARCHIVED"
478
+ ]
479
+ },
480
+ "rateType": {
481
+ "type": "string",
482
+ "description": "How the rate on this product should be read.",
483
+ "enum": [
484
+ "APY",
485
+ "APR",
486
+ "INTRO_APR",
487
+ "VARIABLE_APR",
488
+ "INTEREST_RATE"
489
+ ]
490
+ },
491
+ "ratePercent": {
492
+ "type": "number",
493
+ "minimum": 0,
494
+ "maximum": 1000
495
+ },
496
+ "rateMinPercent": {
497
+ "type": "number",
498
+ "minimum": 0,
499
+ "maximum": 1000
500
+ },
501
+ "rateMaxPercent": {
502
+ "type": "number",
503
+ "minimum": 0,
504
+ "maximum": 1000
505
+ },
506
+ "rateNote": {
507
+ "type": "string"
508
+ },
509
+ "monthlyFeeCents": {
510
+ "type": "integer",
511
+ "minimum": 0,
512
+ "maximum": 9007199254740991
513
+ },
514
+ "annualFeeCents": {
515
+ "type": "integer",
516
+ "minimum": 0,
517
+ "maximum": 9007199254740991
518
+ },
519
+ "minimumOpeningDepositCents": {
520
+ "type": "integer",
521
+ "minimum": 0,
522
+ "maximum": 9007199254740991
523
+ },
524
+ "minimumBalanceCents": {
525
+ "type": "integer",
526
+ "minimum": 0,
527
+ "maximum": 9007199254740991
528
+ },
529
+ "termMonths": {
530
+ "type": "integer",
531
+ "minimum": 0,
532
+ "maximum": 1200
533
+ },
534
+ "termNote": {
535
+ "type": "string"
536
+ },
537
+ "features": {
538
+ "type": "array",
539
+ "items": {
540
+ "type": "string"
541
+ }
542
+ },
543
+ "attributes": {
544
+ "type": "array",
545
+ "items": {
546
+ "type": "object",
547
+ "properties": {
548
+ "label": {
549
+ "type": "string",
550
+ "description": "The name of the attribute."
551
+ },
552
+ "value": {
553
+ "type": "string",
554
+ "description": "The value of the attribute."
555
+ }
556
+ },
557
+ "required": [
558
+ "label",
559
+ "value"
560
+ ]
561
+ }
562
+ },
563
+ "effectiveDate": {
564
+ "type": "string",
565
+ "description": "ISO 8601 date-time string",
566
+ "format": "date-time"
567
+ },
568
+ "displayOrder": {
569
+ "type": "integer",
570
+ "minimum": 0,
571
+ "maximum": 999
572
+ }
573
+ },
574
+ "required": [
575
+ "bankId",
576
+ "category",
577
+ "type",
578
+ "name"
579
+ ]
580
+ }
581
+ },
582
+ {
583
+ "name": "bankProduct_listForOwnedBank",
584
+ "description": "This endpoint allows a bank's verified representatives to retrieve every product on the bank's profile, including drafts and archived entries that the public list omits. Use it to reconcile your own catalog against Moon Banking before syncing changes. You must be an approved representative of the bank.",
585
+ "inputSchema": {
586
+ "type": "object",
587
+ "properties": {
588
+ "bankId": {
589
+ "type": "string",
590
+ "description": "The bank's auto-generated unique identifier."
591
+ }
592
+ },
593
+ "required": [
594
+ "bankId"
595
+ ]
596
+ }
597
+ },
598
+ {
599
+ "name": "bankProduct_update",
600
+ "description": "This endpoint allows a bank's verified representatives to replace a product's details. Every writable field is overwritten, so send the product's full state rather than only the fields that changed. This is the endpoint to call when rates or fees move. You must be an approved representative of the bank.",
601
+ "inputSchema": {
602
+ "type": "object",
603
+ "properties": {
604
+ "bankId": {
605
+ "type": "string",
606
+ "description": "The bank's auto-generated unique identifier."
607
+ },
608
+ "id": {
609
+ "type": "string",
610
+ "description": "The product's auto-generated unique identifier."
611
+ },
612
+ "category": {
613
+ "type": "string",
614
+ "description": "The broad category the product belongs to. Drives how the product is grouped on the bank's page.",
615
+ "enum": [
616
+ "ACCOUNT",
617
+ "CARD",
618
+ "LOAN",
619
+ "INVESTMENT",
620
+ "INSURANCE",
621
+ "SERVICE",
622
+ "OTHER"
623
+ ]
624
+ },
625
+ "type": {
626
+ "type": "string",
627
+ "description": "The specific kind of product.",
628
+ "enum": [
629
+ "CHECKING_ACCOUNT",
630
+ "SAVINGS_ACCOUNT",
631
+ "MONEY_MARKET_ACCOUNT",
632
+ "CERTIFICATE_OF_DEPOSIT",
633
+ "BUSINESS_CHECKING_ACCOUNT",
634
+ "BUSINESS_SAVINGS_ACCOUNT",
635
+ "YOUTH_ACCOUNT",
636
+ "CREDIT_CARD",
637
+ "DEBIT_CARD",
638
+ "BUSINESS_CREDIT_CARD",
639
+ "SECURED_CREDIT_CARD",
640
+ "PREPAID_CARD",
641
+ "PERSONAL_LOAN",
642
+ "AUTO_LOAN",
643
+ "MORTGAGE",
644
+ "HOME_EQUITY_LOAN",
645
+ "HOME_EQUITY_LINE_OF_CREDIT",
646
+ "STUDENT_LOAN",
647
+ "BUSINESS_LOAN",
648
+ "LINE_OF_CREDIT",
649
+ "CONSTRUCTION_LOAN",
650
+ "BROKERAGE_ACCOUNT",
651
+ "RETIREMENT_ACCOUNT",
652
+ "WEALTH_MANAGEMENT",
653
+ "INSURANCE",
654
+ "WIRE_TRANSFER",
655
+ "FOREIGN_EXCHANGE",
656
+ "MERCHANT_SERVICES",
657
+ "TREASURY_MANAGEMENT",
658
+ "SAFE_DEPOSIT_BOX",
659
+ "ONLINE_BANKING",
660
+ "MOBILE_BANKING",
661
+ "CRYPTO_SERVICE",
662
+ "OTHER"
663
+ ]
664
+ },
665
+ "name": {
666
+ "type": "string",
667
+ "description": "The product's marketing name."
668
+ },
669
+ "summary": {
670
+ "type": "string"
671
+ },
672
+ "details": {
673
+ "type": "string"
674
+ },
675
+ "url": {
676
+ "type": "string"
677
+ },
678
+ "currency": {
679
+ "type": "string"
680
+ },
681
+ "status": {
682
+ "type": "string",
683
+ "description": "Whether the product is a draft, published to the bank's page, or archived.",
684
+ "enum": [
685
+ "DRAFT",
686
+ "PUBLISHED",
687
+ "ARCHIVED"
688
+ ]
689
+ },
690
+ "rateType": {
691
+ "type": "string",
692
+ "description": "How the rate on this product should be read.",
693
+ "enum": [
694
+ "APY",
695
+ "APR",
696
+ "INTRO_APR",
697
+ "VARIABLE_APR",
698
+ "INTEREST_RATE"
699
+ ]
700
+ },
701
+ "ratePercent": {
702
+ "type": "number",
703
+ "minimum": 0,
704
+ "maximum": 1000
705
+ },
706
+ "rateMinPercent": {
707
+ "type": "number",
708
+ "minimum": 0,
709
+ "maximum": 1000
710
+ },
711
+ "rateMaxPercent": {
712
+ "type": "number",
713
+ "minimum": 0,
714
+ "maximum": 1000
715
+ },
716
+ "rateNote": {
717
+ "type": "string"
718
+ },
719
+ "monthlyFeeCents": {
720
+ "type": "integer",
721
+ "minimum": 0,
722
+ "maximum": 9007199254740991
723
+ },
724
+ "annualFeeCents": {
725
+ "type": "integer",
726
+ "minimum": 0,
727
+ "maximum": 9007199254740991
728
+ },
729
+ "minimumOpeningDepositCents": {
730
+ "type": "integer",
731
+ "minimum": 0,
732
+ "maximum": 9007199254740991
733
+ },
734
+ "minimumBalanceCents": {
735
+ "type": "integer",
736
+ "minimum": 0,
737
+ "maximum": 9007199254740991
738
+ },
739
+ "termMonths": {
740
+ "type": "integer",
741
+ "minimum": 0,
742
+ "maximum": 1200
743
+ },
744
+ "termNote": {
745
+ "type": "string"
746
+ },
747
+ "features": {
748
+ "type": "array",
749
+ "items": {
750
+ "type": "string"
751
+ }
752
+ },
753
+ "attributes": {
754
+ "type": "array",
755
+ "items": {
756
+ "type": "object",
757
+ "properties": {
758
+ "label": {
759
+ "type": "string",
760
+ "description": "The name of the attribute."
761
+ },
762
+ "value": {
763
+ "type": "string",
764
+ "description": "The value of the attribute."
765
+ }
766
+ },
767
+ "required": [
768
+ "label",
769
+ "value"
770
+ ]
771
+ }
772
+ },
773
+ "effectiveDate": {
774
+ "type": "string",
775
+ "description": "ISO 8601 date-time string",
776
+ "format": "date-time"
777
+ },
778
+ "displayOrder": {
779
+ "type": "integer",
780
+ "minimum": 0,
781
+ "maximum": 999
782
+ }
783
+ },
784
+ "required": [
785
+ "bankId",
786
+ "id",
787
+ "category",
788
+ "type",
789
+ "name"
790
+ ]
791
+ }
792
+ },
793
+ {
794
+ "name": "bankProduct_delete",
795
+ "description": "This endpoint allows a bank's verified representatives to permanently remove a product from the bank's profile. This cannot be undone. To retire a product while keeping its record, set its status to `ARCHIVED` instead. You must be an approved representative of the bank.",
796
+ "inputSchema": {
797
+ "type": "object",
798
+ "properties": {
799
+ "bankId": {
800
+ "type": "string",
801
+ "description": "The bank's auto-generated unique identifier."
802
+ },
803
+ "id": {
804
+ "type": "string",
805
+ "description": "The product's auto-generated unique identifier."
806
+ }
807
+ },
808
+ "required": [
809
+ "bankId",
810
+ "id"
811
+ ]
812
+ }
813
+ },
814
+ {
815
+ "name": "bankProduct_setStatus",
816
+ "description": "This endpoint allows a bank's verified representatives to move a product between draft, published, and archived without resubmitting its details. Archiving is the reversible way to retire a product you may bring back; deleting is permanent. You must be an approved representative of the bank.",
817
+ "inputSchema": {
818
+ "type": "object",
819
+ "properties": {
820
+ "bankId": {
821
+ "type": "string",
822
+ "description": "The bank's auto-generated unique identifier."
823
+ },
824
+ "id": {
825
+ "type": "string",
826
+ "description": "The product's auto-generated unique identifier."
827
+ },
828
+ "status": {
829
+ "type": "string",
830
+ "description": "Whether the product is a draft, published to the bank's page, or archived.",
831
+ "enum": [
832
+ "DRAFT",
833
+ "PUBLISHED",
834
+ "ARCHIVED"
835
+ ]
836
+ }
837
+ },
838
+ "required": [
839
+ "bankId",
840
+ "id",
841
+ "status"
842
+ ]
843
+ }
844
+ },
301
845
  {
302
846
  "name": "country_get",
303
847
  "description": "This endpoint allows you to retrieve a paginated list of all countries. By default, a maximum of ten countries are shown per page. You can search countries by name or 2-letter code, sort them by various fields, and include related data like scores.",
@@ -522,9 +1066,169 @@ const tools = [
522
1066
  }
523
1067
  }
524
1068
  },
1069
+ {
1070
+ "name": "market_get",
1071
+ "description": "This endpoint allows you to retrieve a paginated list of markets (e.g. stock exchanges). You can search by name or code, filter by exact code, country, or market type, and sort the results.",
1072
+ "inputSchema": {
1073
+ "type": "object",
1074
+ "properties": {
1075
+ "limit": {
1076
+ "type": "integer",
1077
+ "description": "Number of items to return.",
1078
+ "default": 10
1079
+ },
1080
+ "starting_after": {
1081
+ "type": "string",
1082
+ "description": "Cursor for forward pagination. Use the id of the last item from the previous page to get the next page."
1083
+ },
1084
+ "ending_before": {
1085
+ "type": "string",
1086
+ "description": "Cursor for backward pagination. Use the id of the first item from the current page to get the previous page."
1087
+ },
1088
+ "search": {
1089
+ "type": "string",
1090
+ "description": "Search markets by name or code."
1091
+ },
1092
+ "code": {
1093
+ "type": "string",
1094
+ "description": "Filter by exact market code (case sensitive)."
1095
+ },
1096
+ "countryCode": {
1097
+ "type": "string",
1098
+ "description": "Filter by 2-letter ISO country code."
1099
+ },
1100
+ "type": {
1101
+ "type": "string",
1102
+ "description": "Filter by market type.",
1103
+ "enum": [
1104
+ "STOCK"
1105
+ ]
1106
+ },
1107
+ "sortBy": {
1108
+ "type": "string",
1109
+ "description": "Field to sort by.",
1110
+ "enum": [
1111
+ "name",
1112
+ "code",
1113
+ "createdAt"
1114
+ ],
1115
+ "default": "name"
1116
+ },
1117
+ "sortOrder": {
1118
+ "type": "string",
1119
+ "description": "Sort order. Either ascending or descending.",
1120
+ "enum": [
1121
+ "asc",
1122
+ "desc"
1123
+ ],
1124
+ "default": "asc"
1125
+ }
1126
+ }
1127
+ }
1128
+ },
1129
+ {
1130
+ "name": "market_getById",
1131
+ "description": "This endpoint allows you to retrieve a specific market (e.g. stock exchange) by providing the market id.",
1132
+ "inputSchema": {
1133
+ "type": "object",
1134
+ "properties": {
1135
+ "id": {
1136
+ "type": "string",
1137
+ "description": "The stock exchange's auto-generated unique identifier."
1138
+ }
1139
+ },
1140
+ "required": [
1141
+ "id"
1142
+ ]
1143
+ }
1144
+ },
1145
+ {
1146
+ "name": "stock_get",
1147
+ "description": "This endpoint allows you to retrieve a paginated list of stock listings. You can search by ticker symbol, filter by exact symbol, market, bank, or primary-listing status, and sort the results.",
1148
+ "inputSchema": {
1149
+ "type": "object",
1150
+ "properties": {
1151
+ "limit": {
1152
+ "type": "integer",
1153
+ "description": "Number of items to return.",
1154
+ "default": 10
1155
+ },
1156
+ "starting_after": {
1157
+ "type": "string",
1158
+ "description": "Cursor for forward pagination. Use the id of the last item from the previous page to get the next page."
1159
+ },
1160
+ "ending_before": {
1161
+ "type": "string",
1162
+ "description": "Cursor for backward pagination. Use the id of the first item from the current page to get the previous page."
1163
+ },
1164
+ "search": {
1165
+ "type": "string",
1166
+ "description": "Search stocks by ticker symbol."
1167
+ },
1168
+ "symbol": {
1169
+ "type": "string",
1170
+ "description": "Filter by exact ticker symbol (case sensitive)."
1171
+ },
1172
+ "marketId": {
1173
+ "type": "string",
1174
+ "description": "Filter by the id of the market this stock trades on."
1175
+ },
1176
+ "bankId": {
1177
+ "type": "string",
1178
+ "description": "Filter by the id of the bank this stock belongs to."
1179
+ },
1180
+ "isPrimary": {
1181
+ "type": "boolean",
1182
+ "description": "Filter by whether the listing is the bank's primary stock."
1183
+ },
1184
+ "sortBy": {
1185
+ "type": "string",
1186
+ "description": "Field to sort by.",
1187
+ "enum": [
1188
+ "symbol",
1189
+ "createdAt"
1190
+ ],
1191
+ "default": "symbol"
1192
+ },
1193
+ "sortOrder": {
1194
+ "type": "string",
1195
+ "description": "Sort order. Either ascending or descending.",
1196
+ "enum": [
1197
+ "asc",
1198
+ "desc"
1199
+ ],
1200
+ "default": "asc"
1201
+ },
1202
+ "include": {
1203
+ "type": "string",
1204
+ "description": "An optional comma-separated list of fields to include in the response. Possible values: `market`, `bank`"
1205
+ }
1206
+ }
1207
+ }
1208
+ },
1209
+ {
1210
+ "name": "stock_getById",
1211
+ "description": "This endpoint allows you to retrieve a specific stock listing by providing the stock id. You can optionally include the associated `market` and/or `bank` as nested objects.",
1212
+ "inputSchema": {
1213
+ "type": "object",
1214
+ "properties": {
1215
+ "id": {
1216
+ "type": "string",
1217
+ "description": "The stock's auto-generated unique identifier."
1218
+ },
1219
+ "include": {
1220
+ "type": "string",
1221
+ "description": "An optional comma-separated list of fields to include in the response. Possible values: `market`, `bank`"
1222
+ }
1223
+ },
1224
+ "required": [
1225
+ "id"
1226
+ ]
1227
+ }
1228
+ },
525
1229
  {
526
1230
  "name": "search_get",
527
- "description": "Search across banks, countries, and stories. You can specify which entities to search using the include parameter. If no include value is provided, all entities will be searched.",
1231
+ "description": "Search across banks, countries, stories, and stocks. You can specify which entities to search using the include parameter. If no include value is provided, all entities will be searched. Banks are also matched on the ticker symbol of their stock listings, so searching `BAC` returns Bank of America.",
528
1232
  "inputSchema": {
529
1233
  "type": "object",
530
1234
  "properties": {
@@ -534,7 +1238,7 @@ const tools = [
534
1238
  },
535
1239
  "include": {
536
1240
  "type": "string",
537
- "description": "An optional comma-separated list of fields to include in the response. Possible values: `banks`, `countries`, `stories`"
1241
+ "description": "An optional comma-separated list of fields to include in the response. Possible values: `banks`, `countries`, `stories`, `stocks`"
538
1242
  },
539
1243
  "limit": {
540
1244
  "type": "integer",
@@ -674,6 +1378,155 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
674
1378
  ],
675
1379
  };
676
1380
  }
1381
+ case 'bankProduct_list': {
1382
+ const result = await apiCall('GET', `/bank-products`, {
1383
+ params: {
1384
+ limit: args.limit,
1385
+ starting_after: args.starting_after,
1386
+ ending_before: args.ending_before,
1387
+ bankId: args.bankId,
1388
+ countryCode: args.countryCode,
1389
+ categories: args.categories,
1390
+ types: args.types,
1391
+ currency: args.currency,
1392
+ search: args.search,
1393
+ minRatePercent: args.minRatePercent,
1394
+ maxRatePercent: args.maxRatePercent,
1395
+ sortBy: args.sortBy,
1396
+ sortOrder: args.sortOrder,
1397
+ },
1398
+ });
1399
+ return {
1400
+ content: [
1401
+ {
1402
+ type: 'text',
1403
+ text: JSON.stringify(result, null, 2),
1404
+ },
1405
+ ],
1406
+ };
1407
+ }
1408
+ case 'bankProduct_listByBank': {
1409
+ const result = await apiCall('GET', `/banks/${args.bankId}/products`, {});
1410
+ return {
1411
+ content: [
1412
+ {
1413
+ type: 'text',
1414
+ text: JSON.stringify(result, null, 2),
1415
+ },
1416
+ ],
1417
+ };
1418
+ }
1419
+ case 'bankProduct_create': {
1420
+ const result = await apiCall('POST', `/banks/${args.bankId}/products`, {
1421
+ body: {
1422
+ category: args.category,
1423
+ type: args.type,
1424
+ name: args.name,
1425
+ summary: args.summary,
1426
+ details: args.details,
1427
+ url: args.url,
1428
+ currency: args.currency,
1429
+ status: args.status,
1430
+ rateType: args.rateType,
1431
+ ratePercent: args.ratePercent,
1432
+ rateMinPercent: args.rateMinPercent,
1433
+ rateMaxPercent: args.rateMaxPercent,
1434
+ rateNote: args.rateNote,
1435
+ monthlyFeeCents: args.monthlyFeeCents,
1436
+ annualFeeCents: args.annualFeeCents,
1437
+ minimumOpeningDepositCents: args.minimumOpeningDepositCents,
1438
+ minimumBalanceCents: args.minimumBalanceCents,
1439
+ termMonths: args.termMonths,
1440
+ termNote: args.termNote,
1441
+ features: args.features,
1442
+ attributes: args.attributes,
1443
+ effectiveDate: args.effectiveDate,
1444
+ displayOrder: args.displayOrder,
1445
+ },
1446
+ });
1447
+ return {
1448
+ content: [
1449
+ {
1450
+ type: 'text',
1451
+ text: JSON.stringify(result, null, 2),
1452
+ },
1453
+ ],
1454
+ };
1455
+ }
1456
+ case 'bankProduct_listForOwnedBank': {
1457
+ const result = await apiCall('GET', `/banks/${args.bankId}/managed-products`, {});
1458
+ return {
1459
+ content: [
1460
+ {
1461
+ type: 'text',
1462
+ text: JSON.stringify(result, null, 2),
1463
+ },
1464
+ ],
1465
+ };
1466
+ }
1467
+ case 'bankProduct_update': {
1468
+ const result = await apiCall('PUT', `/banks/${args.bankId}/products/${args.id}`, {
1469
+ body: {
1470
+ category: args.category,
1471
+ type: args.type,
1472
+ name: args.name,
1473
+ summary: args.summary,
1474
+ details: args.details,
1475
+ url: args.url,
1476
+ currency: args.currency,
1477
+ status: args.status,
1478
+ rateType: args.rateType,
1479
+ ratePercent: args.ratePercent,
1480
+ rateMinPercent: args.rateMinPercent,
1481
+ rateMaxPercent: args.rateMaxPercent,
1482
+ rateNote: args.rateNote,
1483
+ monthlyFeeCents: args.monthlyFeeCents,
1484
+ annualFeeCents: args.annualFeeCents,
1485
+ minimumOpeningDepositCents: args.minimumOpeningDepositCents,
1486
+ minimumBalanceCents: args.minimumBalanceCents,
1487
+ termMonths: args.termMonths,
1488
+ termNote: args.termNote,
1489
+ features: args.features,
1490
+ attributes: args.attributes,
1491
+ effectiveDate: args.effectiveDate,
1492
+ displayOrder: args.displayOrder,
1493
+ },
1494
+ });
1495
+ return {
1496
+ content: [
1497
+ {
1498
+ type: 'text',
1499
+ text: JSON.stringify(result, null, 2),
1500
+ },
1501
+ ],
1502
+ };
1503
+ }
1504
+ case 'bankProduct_delete': {
1505
+ const result = await apiCall('DELETE', `/banks/${args.bankId}/products/${args.id}`, {});
1506
+ return {
1507
+ content: [
1508
+ {
1509
+ type: 'text',
1510
+ text: JSON.stringify(result, null, 2),
1511
+ },
1512
+ ],
1513
+ };
1514
+ }
1515
+ case 'bankProduct_setStatus': {
1516
+ const result = await apiCall('PUT', `/banks/${args.bankId}/products/${args.id}/status`, {
1517
+ body: {
1518
+ status: args.status,
1519
+ },
1520
+ });
1521
+ return {
1522
+ content: [
1523
+ {
1524
+ type: 'text',
1525
+ text: JSON.stringify(result, null, 2),
1526
+ },
1527
+ ],
1528
+ };
1529
+ }
677
1530
  case 'country_get': {
678
1531
  const result = await apiCall('GET', `/countries`, {
679
1532
  params: {
@@ -764,6 +1617,80 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
764
1617
  ],
765
1618
  };
766
1619
  }
1620
+ case 'market_get': {
1621
+ const result = await apiCall('GET', `/markets`, {
1622
+ params: {
1623
+ limit: args.limit,
1624
+ starting_after: args.starting_after,
1625
+ ending_before: args.ending_before,
1626
+ search: args.search,
1627
+ code: args.code,
1628
+ countryCode: args.countryCode,
1629
+ type: args.type,
1630
+ sortBy: args.sortBy,
1631
+ sortOrder: args.sortOrder,
1632
+ },
1633
+ });
1634
+ return {
1635
+ content: [
1636
+ {
1637
+ type: 'text',
1638
+ text: JSON.stringify(result, null, 2),
1639
+ },
1640
+ ],
1641
+ };
1642
+ }
1643
+ case 'market_getById': {
1644
+ const result = await apiCall('GET', `/markets/${args.id}`, {});
1645
+ return {
1646
+ content: [
1647
+ {
1648
+ type: 'text',
1649
+ text: JSON.stringify(result, null, 2),
1650
+ },
1651
+ ],
1652
+ };
1653
+ }
1654
+ case 'stock_get': {
1655
+ const result = await apiCall('GET', `/stocks`, {
1656
+ params: {
1657
+ limit: args.limit,
1658
+ starting_after: args.starting_after,
1659
+ ending_before: args.ending_before,
1660
+ search: args.search,
1661
+ symbol: args.symbol,
1662
+ marketId: args.marketId,
1663
+ bankId: args.bankId,
1664
+ isPrimary: args.isPrimary,
1665
+ sortBy: args.sortBy,
1666
+ sortOrder: args.sortOrder,
1667
+ include: args.include,
1668
+ },
1669
+ });
1670
+ return {
1671
+ content: [
1672
+ {
1673
+ type: 'text',
1674
+ text: JSON.stringify(result, null, 2),
1675
+ },
1676
+ ],
1677
+ };
1678
+ }
1679
+ case 'stock_getById': {
1680
+ const result = await apiCall('GET', `/stocks/${args.id}`, {
1681
+ params: {
1682
+ include: args.include,
1683
+ },
1684
+ });
1685
+ return {
1686
+ content: [
1687
+ {
1688
+ type: 'text',
1689
+ text: JSON.stringify(result, null, 2),
1690
+ },
1691
+ ],
1692
+ };
1693
+ }
767
1694
  case 'search_get': {
768
1695
  const result = await apiCall('GET', `/search`, {
769
1696
  params: {