@topolo/mcp 0.3.0 → 0.4.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.
package/dist/index.js CHANGED
@@ -61,6 +61,7 @@ var TopoloHttpError = class extends TopoloSdkError {
61
61
  var SERVICES = {
62
62
  agent: "https://agent-api.topolo.app",
63
63
  auth: "https://auth.topolo.app",
64
+ backup: "https://backup.topolo.app",
64
65
  books: "https://books.topolo.app",
65
66
  bugfix: "https://bugfix.topolo.app",
66
67
  bytes: "https://bytes-api.topolo.app",
@@ -71,7 +72,6 @@ var SERVICES = {
71
72
  compose: "https://compose.topolo.app",
72
73
  consent: "https://consent.topolo.app",
73
74
  crm: "https://crm-api.topolo.app",
74
- customer_success: "https://success.topolo.app",
75
75
  developers: "https://developers.topolo.app",
76
76
  director: "https://director.topolo.app",
77
77
  feed: "https://feed-api.topolo.app",
@@ -85,9 +85,10 @@ var SERVICES = {
85
85
  localize: "https://localize.topolo.app",
86
86
  mail: "https://mail.topolo.app",
87
87
  mdm: "https://mdm-api.topolo.app",
88
- messaging: "https://messages.topolo.app",
88
+ messages: "https://messages.topolo.app",
89
89
  nexus: "https://nexus-api.topolo.app",
90
90
  notify: "https://notify.topolo.app",
91
+ observability_watch: "https://observability-watch.topolo.app",
91
92
  one: "https://one.topolo.app",
92
93
  p2p: "https://p2p.topolo.app",
93
94
  pay: "https://pay.topolo.app",
@@ -101,6 +102,7 @@ var SERVICES = {
101
102
  socialize: "https://socialize-api.topolo.app",
102
103
  spaces: "https://spaces.topolo.app",
103
104
  status: "https://status.topolo.app",
105
+ success: "https://success.topolo.app",
104
106
  support: "https://support.topolo.app",
105
107
  survey: "https://survey.topolo.app",
106
108
  voice: "https://voice.topolo.app",
@@ -117,13 +119,21 @@ var APPLICATIONS = {
117
119
  "deployTargets": [
118
120
  {
119
121
  "name": "topolo-admin",
120
- "kind": "pages",
121
- "apiUrl": null,
122
+ "kind": "worker",
123
+ "apiUrl": "https://admin.topolo.app",
122
124
  "domains": [
123
125
  "admin.topolo.app"
124
126
  ],
125
127
  "routes": [],
126
128
  "serviceId": null
129
+ },
130
+ {
131
+ "name": "topolo-admin-api",
132
+ "kind": "worker",
133
+ "apiUrl": null,
134
+ "domains": [],
135
+ "routes": [],
136
+ "serviceId": null
127
137
  }
128
138
  ]
129
139
  },
@@ -140,7 +150,7 @@ var APPLICATIONS = {
140
150
  {
141
151
  "name": "topolo-agent",
142
152
  "kind": "worker",
143
- "apiUrl": null,
153
+ "apiUrl": "https://agent.topolo.app",
144
154
  "domains": [
145
155
  "agent.topolo.app"
146
156
  ],
@@ -148,7 +158,7 @@ var APPLICATIONS = {
148
158
  "serviceId": null
149
159
  },
150
160
  {
151
- "name": "topolo-agent-worker",
161
+ "name": "topolo-agent-api",
152
162
  "kind": "worker",
153
163
  "apiUrl": "https://agent-api.topolo.app",
154
164
  "domains": [
@@ -188,16 +198,20 @@ var APPLICATIONS = {
188
198
  "appDir": "TopoloBackup",
189
199
  "name": "topolo-backup",
190
200
  "packageName": "topolo-backup",
191
- "productionUrl": null,
192
- "services": [],
201
+ "productionUrl": "https://backup.topolo.app",
202
+ "services": [
203
+ "backup"
204
+ ],
193
205
  "deployTargets": [
194
206
  {
195
207
  "name": "topolo-backup",
196
208
  "kind": "worker",
197
- "apiUrl": null,
198
- "domains": [],
209
+ "apiUrl": "https://backup.topolo.app",
210
+ "domains": [
211
+ "backup.topolo.app"
212
+ ],
199
213
  "routes": [],
200
- "serviceId": null
214
+ "serviceId": "backup"
201
215
  }
202
216
  ]
203
217
  },
@@ -218,10 +232,16 @@ var APPLICATIONS = {
218
232
  "domains": [
219
233
  "books.topolo.app"
220
234
  ],
221
- "routes": [
222
- "books.topolo.app"
223
- ],
235
+ "routes": [],
224
236
  "serviceId": "books"
237
+ },
238
+ {
239
+ "name": "topolo-books-api",
240
+ "kind": "worker",
241
+ "apiUrl": null,
242
+ "domains": [],
243
+ "routes": [],
244
+ "serviceId": null
225
245
  }
226
246
  ]
227
247
  },
@@ -242,9 +262,7 @@ var APPLICATIONS = {
242
262
  "domains": [
243
263
  "bugfix.topolo.app"
244
264
  ],
245
- "routes": [
246
- "bugfix.topolo.app"
247
- ],
265
+ "routes": [],
248
266
  "serviceId": "bugfix"
249
267
  }
250
268
  ]
@@ -261,8 +279,8 @@ var APPLICATIONS = {
261
279
  "deployTargets": [
262
280
  {
263
281
  "name": "topolo-bytes",
264
- "kind": "pages",
265
- "apiUrl": null,
282
+ "kind": "worker",
283
+ "apiUrl": "https://bytes.topolo.app",
266
284
  "domains": [
267
285
  "bytes.topolo.app"
268
286
  ],
@@ -298,10 +316,16 @@ var APPLICATIONS = {
298
316
  "domains": [
299
317
  "calendar.topolo.app"
300
318
  ],
301
- "routes": [
302
- "calendar.topolo.app"
303
- ],
319
+ "routes": [],
304
320
  "serviceId": "calendar"
321
+ },
322
+ {
323
+ "name": "topolo-calendar-api",
324
+ "kind": "worker",
325
+ "apiUrl": null,
326
+ "domains": [],
327
+ "routes": [],
328
+ "serviceId": null
305
329
  }
306
330
  ]
307
331
  },
@@ -344,22 +368,19 @@ var APPLICATIONS = {
344
368
  "domains": [
345
369
  "chat.topolo.app"
346
370
  ],
347
- "routes": [
348
- "chat.topolo.app"
349
- ],
371
+ "routes": [],
350
372
  "serviceId": "chat"
373
+ },
374
+ {
375
+ "name": "topolo-chat-api",
376
+ "kind": "worker",
377
+ "apiUrl": null,
378
+ "domains": [],
379
+ "routes": [],
380
+ "serviceId": null
351
381
  }
352
382
  ]
353
383
  },
354
- "cloudcontrol": {
355
- "id": "cloudcontrol",
356
- "appDir": "TopoloCloudControl",
357
- "name": "cloudcontrol",
358
- "packageName": "topolo-cloudcontrol",
359
- "productionUrl": null,
360
- "services": [],
361
- "deployTargets": []
362
- },
363
384
  "commerce": {
364
385
  "id": "commerce",
365
386
  "appDir": "TopoloCommerce",
@@ -382,8 +403,8 @@ var APPLICATIONS = {
382
403
  },
383
404
  {
384
405
  "name": "topolo-commerce-guest-web",
385
- "kind": "pages",
386
- "apiUrl": null,
406
+ "kind": "worker",
407
+ "apiUrl": "https://guest.topolo.app",
387
408
  "domains": [
388
409
  "guest.topolo.app"
389
410
  ],
@@ -392,8 +413,8 @@ var APPLICATIONS = {
392
413
  },
393
414
  {
394
415
  "name": "topolo-commerce-ops-web",
395
- "kind": "pages",
396
- "apiUrl": null,
416
+ "kind": "worker",
417
+ "apiUrl": "https://commerce.topolo.app",
397
418
  "domains": [
398
419
  "commerce.topolo.app"
399
420
  ],
@@ -402,8 +423,8 @@ var APPLICATIONS = {
402
423
  },
403
424
  {
404
425
  "name": "topolo-commerce-station-web",
405
- "kind": "pages",
406
- "apiUrl": null,
426
+ "kind": "worker",
427
+ "apiUrl": "https://station-commerce.topolo.app",
407
428
  "domains": [
408
429
  "station-commerce.topolo.app"
409
430
  ],
@@ -429,10 +450,16 @@ var APPLICATIONS = {
429
450
  "domains": [
430
451
  "compose.topolo.app"
431
452
  ],
432
- "routes": [
433
- "compose.topolo.app"
434
- ],
453
+ "routes": [],
435
454
  "serviceId": "compose"
455
+ },
456
+ {
457
+ "name": "topolo-compose-api",
458
+ "kind": "worker",
459
+ "apiUrl": null,
460
+ "domains": [],
461
+ "routes": [],
462
+ "serviceId": null
436
463
  }
437
464
  ]
438
465
  },
@@ -453,10 +480,16 @@ var APPLICATIONS = {
453
480
  "domains": [
454
481
  "consent.topolo.app"
455
482
  ],
456
- "routes": [
457
- "consent.topolo.app"
458
- ],
483
+ "routes": [],
459
484
  "serviceId": "consent"
485
+ },
486
+ {
487
+ "name": "topolo-consent-api",
488
+ "kind": "worker",
489
+ "apiUrl": null,
490
+ "domains": [],
491
+ "routes": [],
492
+ "serviceId": null
460
493
  }
461
494
  ]
462
495
  },
@@ -483,7 +516,7 @@ var APPLICATIONS = {
483
516
  {
484
517
  "name": "topolo-crm-app",
485
518
  "kind": "worker",
486
- "apiUrl": null,
519
+ "apiUrl": "https://crm.topolo.app",
487
520
  "domains": [
488
521
  "crm.topolo.app"
489
522
  ],
@@ -492,30 +525,6 @@ var APPLICATIONS = {
492
525
  }
493
526
  ]
494
527
  },
495
- "customer_success": {
496
- "id": "customer_success",
497
- "appDir": "TopoloSuccess",
498
- "name": "topolo-success",
499
- "packageName": "topolo-success",
500
- "productionUrl": "https://success.topolo.app",
501
- "services": [
502
- "customer_success"
503
- ],
504
- "deployTargets": [
505
- {
506
- "name": "topolo-success",
507
- "kind": "worker",
508
- "apiUrl": "https://success.topolo.app",
509
- "domains": [
510
- "success.topolo.app"
511
- ],
512
- "routes": [
513
- "success.topolo.app"
514
- ],
515
- "serviceId": "customer_success"
516
- }
517
- ]
518
- },
519
528
  "developers": {
520
529
  "id": "developers",
521
530
  "appDir": "TopoloDevelopers",
@@ -543,6 +552,14 @@ var APPLICATIONS = {
543
552
  ],
544
553
  "routes": [],
545
554
  "serviceId": "developers"
555
+ },
556
+ {
557
+ "name": "topolo-developers-api",
558
+ "kind": "worker",
559
+ "apiUrl": null,
560
+ "domains": [],
561
+ "routes": [],
562
+ "serviceId": null
546
563
  }
547
564
  ]
548
565
  },
@@ -563,10 +580,16 @@ var APPLICATIONS = {
563
580
  "domains": [
564
581
  "director.topolo.app"
565
582
  ],
566
- "routes": [
567
- "director.topolo.app"
568
- ],
583
+ "routes": [],
569
584
  "serviceId": "director"
585
+ },
586
+ {
587
+ "name": "topolo-director-api",
588
+ "kind": "worker",
589
+ "apiUrl": null,
590
+ "domains": [],
591
+ "routes": [],
592
+ "serviceId": null
570
593
  }
571
594
  ]
572
595
  },
@@ -580,13 +603,21 @@ var APPLICATIONS = {
580
603
  "deployTargets": [
581
604
  {
582
605
  "name": "topolo-docs",
583
- "kind": "pages",
584
- "apiUrl": null,
606
+ "kind": "worker",
607
+ "apiUrl": "https://docs.topolo.app",
585
608
  "domains": [
586
609
  "docs.topolo.app"
587
610
  ],
588
611
  "routes": [],
589
612
  "serviceId": null
613
+ },
614
+ {
615
+ "name": "topolo-docs-api",
616
+ "kind": "worker",
617
+ "apiUrl": null,
618
+ "domains": [],
619
+ "routes": [],
620
+ "serviceId": null
590
621
  }
591
622
  ]
592
623
  },
@@ -595,7 +626,7 @@ var APPLICATIONS = {
595
626
  "appDir": "TopoloFeed",
596
627
  "name": "TopoloFeed",
597
628
  "packageName": "topolo-feed",
598
- "productionUrl": "https://feed-api.topolo.app",
629
+ "productionUrl": "https://feed.topolo.app",
599
630
  "services": [
600
631
  "feed"
601
632
  ],
@@ -607,9 +638,7 @@ var APPLICATIONS = {
607
638
  "domains": [
608
639
  "feed-analytics-api.topolo.app"
609
640
  ],
610
- "routes": [
611
- "feed-analytics-api.topolo.app"
612
- ],
641
+ "routes": [],
613
642
  "serviceId": null
614
643
  },
615
644
  {
@@ -619,10 +648,18 @@ var APPLICATIONS = {
619
648
  "domains": [
620
649
  "feed-api.topolo.app"
621
650
  ],
622
- "routes": [
623
- "feed-api.topolo.app"
624
- ],
651
+ "routes": [],
625
652
  "serviceId": "feed"
653
+ },
654
+ {
655
+ "name": "topolo-feed-web",
656
+ "kind": "worker",
657
+ "apiUrl": "https://feed.topolo.app",
658
+ "domains": [
659
+ "feed.topolo.app"
660
+ ],
661
+ "routes": [],
662
+ "serviceId": null
626
663
  }
627
664
  ]
628
665
  },
@@ -643,17 +680,23 @@ var APPLICATIONS = {
643
680
  "domains": [
644
681
  "flow.topolo.app"
645
682
  ],
646
- "routes": [
647
- "flow.topolo.app"
648
- ],
683
+ "routes": [],
649
684
  "serviceId": "flow"
685
+ },
686
+ {
687
+ "name": "topolo-flow-api",
688
+ "kind": "worker",
689
+ "apiUrl": null,
690
+ "domains": [],
691
+ "routes": [],
692
+ "serviceId": null
650
693
  }
651
694
  ]
652
695
  },
653
696
  "forecast": {
654
697
  "id": "forecast",
655
698
  "appDir": "TopoloForecast",
656
- "name": "forecast-cloud",
699
+ "name": "topolo-forecast",
657
700
  "packageName": "topolo-forecast",
658
701
  "productionUrl": "https://forecast.topolo.app",
659
702
  "services": [
@@ -663,7 +706,7 @@ var APPLICATIONS = {
663
706
  {
664
707
  "name": "topolo-forecast",
665
708
  "kind": "worker",
666
- "apiUrl": null,
709
+ "apiUrl": "https://forecast.topolo.app",
667
710
  "domains": [
668
711
  "forecast.topolo.app"
669
712
  ],
@@ -699,10 +742,16 @@ var APPLICATIONS = {
699
742
  "domains": [
700
743
  "forms.topolo.app"
701
744
  ],
702
- "routes": [
703
- "forms.topolo.app"
704
- ],
745
+ "routes": [],
705
746
  "serviceId": "forms"
747
+ },
748
+ {
749
+ "name": "topolo-forms-api",
750
+ "kind": "worker",
751
+ "apiUrl": null,
752
+ "domains": [],
753
+ "routes": [],
754
+ "serviceId": null
706
755
  }
707
756
  ]
708
757
  },
@@ -723,10 +772,16 @@ var APPLICATIONS = {
723
772
  "domains": [
724
773
  "home.topolo.app"
725
774
  ],
726
- "routes": [
727
- "home.topolo.app"
728
- ],
775
+ "routes": [],
729
776
  "serviceId": "home"
777
+ },
778
+ {
779
+ "name": "topolo-home-api",
780
+ "kind": "worker",
781
+ "apiUrl": null,
782
+ "domains": [],
783
+ "routes": [],
784
+ "serviceId": null
730
785
  }
731
786
  ]
732
787
  },
@@ -747,10 +802,16 @@ var APPLICATIONS = {
747
802
  "domains": [
748
803
  "insights.topolo.app"
749
804
  ],
750
- "routes": [
751
- "insights.topolo.app"
752
- ],
805
+ "routes": [],
753
806
  "serviceId": "insights"
807
+ },
808
+ {
809
+ "name": "topolo-insights-api",
810
+ "kind": "worker",
811
+ "apiUrl": null,
812
+ "domains": [],
813
+ "routes": [],
814
+ "serviceId": null
754
815
  }
755
816
  ]
756
817
  },
@@ -771,10 +832,16 @@ var APPLICATIONS = {
771
832
  "domains": [
772
833
  "inventory.topolo.app"
773
834
  ],
774
- "routes": [
775
- "inventory.topolo.app"
776
- ],
835
+ "routes": [],
777
836
  "serviceId": "inventory"
837
+ },
838
+ {
839
+ "name": "topolo-inventory-api",
840
+ "kind": "worker",
841
+ "apiUrl": null,
842
+ "domains": [],
843
+ "routes": [],
844
+ "serviceId": null
778
845
  }
779
846
  ]
780
847
  },
@@ -791,7 +858,7 @@ var APPLICATIONS = {
791
858
  {
792
859
  "name": "topolo-learn",
793
860
  "kind": "worker",
794
- "apiUrl": null,
861
+ "apiUrl": "https://learn.topolo.app",
795
862
  "domains": [
796
863
  "learn.topolo.app"
797
864
  ],
@@ -851,10 +918,16 @@ var APPLICATIONS = {
851
918
  "domains": [
852
919
  "mail.topolo.app"
853
920
  ],
854
- "routes": [
855
- "mail.topolo.app"
856
- ],
921
+ "routes": [],
857
922
  "serviceId": "mail"
923
+ },
924
+ {
925
+ "name": "topolo-mail-api",
926
+ "kind": "worker",
927
+ "apiUrl": null,
928
+ "domains": [],
929
+ "routes": [],
930
+ "serviceId": null
858
931
  }
859
932
  ]
860
933
  },
@@ -875,47 +948,51 @@ var APPLICATIONS = {
875
948
  "domains": [
876
949
  "mdm-api.topolo.app"
877
950
  ],
878
- "routes": [
879
- "mdm-api.topolo.app"
880
- ],
951
+ "routes": [],
881
952
  "serviceId": "mdm"
882
953
  },
883
954
  {
884
955
  "name": "topolo-mdm-console",
885
956
  "kind": "worker",
886
- "apiUrl": null,
957
+ "apiUrl": "https://mdm.topolo.app",
887
958
  "domains": [
888
959
  "mdm.topolo.app"
889
960
  ],
890
- "routes": [
891
- "mdm.topolo.app"
892
- ],
961
+ "routes": [],
893
962
  "serviceId": null
894
963
  }
895
964
  ]
896
965
  },
897
- "messaging": {
898
- "id": "messaging",
899
- "appDir": "TopoloMessaging",
900
- "name": "topolo-messaging",
901
- "packageName": "topolo-messaging",
966
+ "messages": {
967
+ "id": "messages",
968
+ "appDir": "TopoloMessages",
969
+ "name": "topolo-messages",
970
+ "packageName": "topolo-messages",
902
971
  "productionUrl": "https://messages.topolo.app",
903
972
  "services": [
904
- "messaging"
973
+ "messages"
905
974
  ],
906
975
  "deployTargets": [
907
976
  {
908
- "name": "topolo-messaging",
977
+ "name": "topolo-messages",
909
978
  "kind": "worker",
910
979
  "apiUrl": "https://messages.topolo.app",
911
980
  "domains": [
912
981
  "messages.topolo.app"
913
982
  ],
914
983
  "routes": [],
915
- "serviceId": "messaging"
984
+ "serviceId": "messages"
985
+ },
986
+ {
987
+ "name": "topolo-messages-api",
988
+ "kind": "worker",
989
+ "apiUrl": null,
990
+ "domains": [],
991
+ "routes": [],
992
+ "serviceId": null
916
993
  },
917
994
  {
918
- "name": "topolo-messaging-dispatch",
995
+ "name": "topolo-messages-dispatch",
919
996
  "kind": "worker",
920
997
  "apiUrl": null,
921
998
  "domains": [],
@@ -985,9 +1062,22 @@ var APPLICATIONS = {
985
1062
  "appDir": "TopoloObservabilityWatch",
986
1063
  "name": "topolo-observability-watch",
987
1064
  "packageName": "topolo-observability-watch",
988
- "productionUrl": null,
989
- "services": [],
990
- "deployTargets": []
1065
+ "productionUrl": "https://observability-watch.topolo.app",
1066
+ "services": [
1067
+ "observability_watch"
1068
+ ],
1069
+ "deployTargets": [
1070
+ {
1071
+ "name": "topolo-observability-watch",
1072
+ "kind": "worker",
1073
+ "apiUrl": "https://observability-watch.topolo.app",
1074
+ "domains": [
1075
+ "observability-watch.topolo.app"
1076
+ ],
1077
+ "routes": [],
1078
+ "serviceId": "observability_watch"
1079
+ }
1080
+ ]
991
1081
  },
992
1082
  "one": {
993
1083
  "id": "one",
@@ -1001,40 +1091,37 @@ var APPLICATIONS = {
1001
1091
  "deployTargets": [
1002
1092
  {
1003
1093
  "name": "topolo-one",
1004
- "kind": "pages",
1005
- "apiUrl": null,
1006
- "domains": [
1007
- "one.topolo.app"
1008
- ],
1009
- "routes": [],
1010
- "serviceId": null
1011
- },
1012
- {
1013
- "name": "topolo-one-website",
1014
1094
  "kind": "worker",
1015
1095
  "apiUrl": null,
1016
- "domains": [
1017
- "topolo.io",
1018
- "www.topolo.io"
1019
- ],
1096
+ "domains": [],
1020
1097
  "routes": [],
1021
1098
  "serviceId": null
1022
1099
  },
1023
1100
  {
1024
- "name": "topolo-one-worker",
1101
+ "name": "topolo-one-api",
1025
1102
  "kind": "worker",
1026
1103
  "apiUrl": "https://one.topolo.app",
1027
1104
  "domains": [
1028
- "one.topolo.app",
1029
- "topolo.app",
1030
- "www.topolo.app"
1105
+ "one.topolo.app"
1031
1106
  ],
1032
1107
  "routes": [
1033
1108
  "one.topolo.app/*",
1034
- "topolo.app",
1035
1109
  "www.topolo.app/*"
1036
1110
  ],
1037
1111
  "serviceId": "one"
1112
+ },
1113
+ {
1114
+ "name": "topolo-one-website",
1115
+ "kind": "worker",
1116
+ "apiUrl": "https://topolo.io",
1117
+ "domains": [
1118
+ "topolo.io"
1119
+ ],
1120
+ "routes": [
1121
+ "topolo.io",
1122
+ "www.topolo.io"
1123
+ ],
1124
+ "serviceId": null
1038
1125
  }
1039
1126
  ]
1040
1127
  },
@@ -1055,10 +1142,16 @@ var APPLICATIONS = {
1055
1142
  "domains": [
1056
1143
  "p2p.topolo.app"
1057
1144
  ],
1058
- "routes": [
1059
- "p2p.topolo.app"
1060
- ],
1145
+ "routes": [],
1061
1146
  "serviceId": "p2p"
1147
+ },
1148
+ {
1149
+ "name": "topolo-p2p-api",
1150
+ "kind": "worker",
1151
+ "apiUrl": null,
1152
+ "domains": [],
1153
+ "routes": [],
1154
+ "serviceId": null
1062
1155
  }
1063
1156
  ]
1064
1157
  },
@@ -1081,6 +1174,14 @@ var APPLICATIONS = {
1081
1174
  ],
1082
1175
  "routes": [],
1083
1176
  "serviceId": "pay"
1177
+ },
1178
+ {
1179
+ "name": "topolo-pay-api",
1180
+ "kind": "worker",
1181
+ "apiUrl": null,
1182
+ "domains": [],
1183
+ "routes": [],
1184
+ "serviceId": null
1084
1185
  }
1085
1186
  ]
1086
1187
  },
@@ -1101,10 +1202,16 @@ var APPLICATIONS = {
1101
1202
  "domains": [
1102
1203
  "people.topolo.app"
1103
1204
  ],
1104
- "routes": [
1105
- "people.topolo.app"
1106
- ],
1205
+ "routes": [],
1107
1206
  "serviceId": "people"
1207
+ },
1208
+ {
1209
+ "name": "topolo-people-api",
1210
+ "kind": "worker",
1211
+ "apiUrl": null,
1212
+ "domains": [],
1213
+ "routes": [],
1214
+ "serviceId": null
1108
1215
  }
1109
1216
  ]
1110
1217
  },
@@ -1125,10 +1232,16 @@ var APPLICATIONS = {
1125
1232
  "domains": [
1126
1233
  "pulse.topolo.app"
1127
1234
  ],
1128
- "routes": [
1129
- "pulse.topolo.app"
1130
- ],
1235
+ "routes": [],
1131
1236
  "serviceId": "pulse"
1237
+ },
1238
+ {
1239
+ "name": "topolo-pulse-api",
1240
+ "kind": "worker",
1241
+ "apiUrl": null,
1242
+ "domains": [],
1243
+ "routes": [],
1244
+ "serviceId": null
1132
1245
  }
1133
1246
  ]
1134
1247
  },
@@ -1150,7 +1263,9 @@ var APPLICATIONS = {
1150
1263
  "domains": [
1151
1264
  "api.ol0.me"
1152
1265
  ],
1153
- "routes": [],
1266
+ "routes": [
1267
+ "api.ol0.me/*"
1268
+ ],
1154
1269
  "serviceId": "quro.api"
1155
1270
  },
1156
1271
  {
@@ -1168,7 +1283,7 @@ var APPLICATIONS = {
1168
1283
  {
1169
1284
  "name": "quro-ui",
1170
1285
  "kind": "worker",
1171
- "apiUrl": null,
1286
+ "apiUrl": "https://quro.topolo.app",
1172
1287
  "domains": [
1173
1288
  "quro.topolo.app"
1174
1289
  ],
@@ -1190,7 +1305,7 @@ var APPLICATIONS = {
1190
1305
  {
1191
1306
  "name": "topolo-roadmapper",
1192
1307
  "kind": "worker",
1193
- "apiUrl": null,
1308
+ "apiUrl": "https://roadmapper.topolo.app",
1194
1309
  "domains": [
1195
1310
  "roadmapper.topolo.app"
1196
1311
  ],
@@ -1226,10 +1341,16 @@ var APPLICATIONS = {
1226
1341
  "domains": [
1227
1342
  "sign.topolo.app"
1228
1343
  ],
1229
- "routes": [
1230
- "sign.topolo.app"
1231
- ],
1344
+ "routes": [],
1232
1345
  "serviceId": "sign"
1346
+ },
1347
+ {
1348
+ "name": "topolo-sign-api",
1349
+ "kind": "worker",
1350
+ "apiUrl": null,
1351
+ "domains": [],
1352
+ "routes": [],
1353
+ "serviceId": null
1233
1354
  }
1234
1355
  ]
1235
1356
  },
@@ -1246,7 +1367,7 @@ var APPLICATIONS = {
1246
1367
  {
1247
1368
  "name": "topolo-social-studio",
1248
1369
  "kind": "worker",
1249
- "apiUrl": null,
1370
+ "apiUrl": "https://studio.topolo.app",
1250
1371
  "domains": [
1251
1372
  "studio.topolo.app"
1252
1373
  ],
@@ -1285,8 +1406,8 @@ var APPLICATIONS = {
1285
1406
  "deployTargets": [
1286
1407
  {
1287
1408
  "name": "topolo-socialize",
1288
- "kind": "pages",
1289
- "apiUrl": null,
1409
+ "kind": "worker",
1410
+ "apiUrl": "https://socialize.topolo.app",
1290
1411
  "domains": [
1291
1412
  "socialize.topolo.app"
1292
1413
  ],
@@ -1330,10 +1451,16 @@ var APPLICATIONS = {
1330
1451
  "domains": [
1331
1452
  "spaces.topolo.app"
1332
1453
  ],
1333
- "routes": [
1334
- "spaces.topolo.app"
1335
- ],
1454
+ "routes": [],
1336
1455
  "serviceId": "spaces"
1456
+ },
1457
+ {
1458
+ "name": "topolo-spaces-api",
1459
+ "kind": "worker",
1460
+ "apiUrl": null,
1461
+ "domains": [],
1462
+ "routes": [],
1463
+ "serviceId": null
1337
1464
  }
1338
1465
  ]
1339
1466
  },
@@ -1354,10 +1481,40 @@ var APPLICATIONS = {
1354
1481
  "domains": [
1355
1482
  "status.topolo.app"
1356
1483
  ],
1484
+ "routes": [],
1485
+ "serviceId": "status"
1486
+ }
1487
+ ]
1488
+ },
1489
+ "success": {
1490
+ "id": "success",
1491
+ "appDir": "TopoloSuccess",
1492
+ "name": "topolo-success",
1493
+ "packageName": "topolo-success",
1494
+ "productionUrl": "https://success.topolo.app",
1495
+ "services": [
1496
+ "success"
1497
+ ],
1498
+ "deployTargets": [
1499
+ {
1500
+ "name": "topolo-success",
1501
+ "kind": "worker",
1502
+ "apiUrl": "https://success.topolo.app",
1503
+ "domains": [
1504
+ "success.topolo.app"
1505
+ ],
1357
1506
  "routes": [
1358
- "status.topolo.app"
1507
+ "success.topolo.app"
1359
1508
  ],
1360
- "serviceId": "status"
1509
+ "serviceId": "success"
1510
+ },
1511
+ {
1512
+ "name": "topolo-success-api",
1513
+ "kind": "worker",
1514
+ "apiUrl": null,
1515
+ "domains": [],
1516
+ "routes": [],
1517
+ "serviceId": null
1361
1518
  }
1362
1519
  ]
1363
1520
  },
@@ -1382,6 +1539,14 @@ var APPLICATIONS = {
1382
1539
  "support.topolo.app/*"
1383
1540
  ],
1384
1541
  "serviceId": "support"
1542
+ },
1543
+ {
1544
+ "name": "topolo-support-api",
1545
+ "kind": "worker",
1546
+ "apiUrl": null,
1547
+ "domains": [],
1548
+ "routes": [],
1549
+ "serviceId": null
1385
1550
  }
1386
1551
  ]
1387
1552
  },
@@ -1402,10 +1567,16 @@ var APPLICATIONS = {
1402
1567
  "domains": [
1403
1568
  "survey.topolo.app"
1404
1569
  ],
1405
- "routes": [
1406
- "survey.topolo.app"
1407
- ],
1570
+ "routes": [],
1408
1571
  "serviceId": "survey"
1572
+ },
1573
+ {
1574
+ "name": "topolo-survey-api",
1575
+ "kind": "worker",
1576
+ "apiUrl": null,
1577
+ "domains": [],
1578
+ "routes": [],
1579
+ "serviceId": null
1409
1580
  }
1410
1581
  ]
1411
1582
  },
@@ -1426,10 +1597,16 @@ var APPLICATIONS = {
1426
1597
  "domains": [
1427
1598
  "voice.topolo.app"
1428
1599
  ],
1429
- "routes": [
1430
- "voice.topolo.app"
1431
- ],
1600
+ "routes": [],
1432
1601
  "serviceId": "voice"
1602
+ },
1603
+ {
1604
+ "name": "topolo-voice-api",
1605
+ "kind": "worker",
1606
+ "apiUrl": null,
1607
+ "domains": [],
1608
+ "routes": [],
1609
+ "serviceId": null
1433
1610
  }
1434
1611
  ]
1435
1612
  },
@@ -1460,13 +1637,16 @@ var APPLICATIONS = {
1460
1637
  "domains": [
1461
1638
  "sites.topolo.app"
1462
1639
  ],
1463
- "routes": [],
1640
+ "routes": [
1641
+ "*.sites.topolo.app/*",
1642
+ "sites.topolo.app"
1643
+ ],
1464
1644
  "serviceId": null
1465
1645
  },
1466
1646
  {
1467
1647
  "name": "topolo-web-studio",
1468
1648
  "kind": "worker",
1469
- "apiUrl": null,
1649
+ "apiUrl": "https://web.topolo.app",
1470
1650
  "domains": [
1471
1651
  "web.topolo.app"
1472
1652
  ],
@@ -1516,12 +1696,12 @@ var APPLICATION_REQUIREMENTS = [
1516
1696
  summary: "Applications must derive identity, organization, scopes, and service entitlement from TopoloAuth rather than inventing parallel auth state.",
1517
1697
  appliesTo: ["browser", "api", "tooling", "agent_surface"],
1518
1698
  evidence: [
1519
- "@topolo/auth-client or @topolo/auth-middleware is used where applicable",
1699
+ "@topolo/auth-client or @topolo-io/worker-runtime is used where applicable",
1520
1700
  "No public command, tool, or SDK method accepts orgId",
1521
1701
  "Service slug and Auth service registration are documented for protected services"
1522
1702
  ],
1523
1703
  implementation: [
1524
- "Use shared auth packages instead of copying token parsing or browser storage flows",
1704
+ "Use shared auth/runtime packages instead of copying token parsing, gateway, or browser storage flows",
1525
1705
  "Derive organization from the credential on every request",
1526
1706
  "Route OAuth, refresh, logout, and SSO paths according to the shared Auth contract"
1527
1707
  ]
@@ -1554,11 +1734,13 @@ var APPLICATION_REQUIREMENTS = [
1554
1734
  evidence: [
1555
1735
  "Auth service catalog contains the service ID and slug",
1556
1736
  "Permissions, role bundles, and API-key scopes exist for the service",
1557
- "SDK, CLI, and MCP service discovery include the callable production API"
1737
+ "SDK, CLI, and MCP service discovery include the callable production API",
1738
+ "CloudControl production HTTP targets classify agent reachability with sdk_service_id or agent_callable:false"
1558
1739
  ],
1559
1740
  implementation: [
1560
- "Add production Worker api_url metadata before adding an SDK service ID",
1561
- "Expose stable service IDs through DEFAULT_SERVICE_URLS",
1741
+ "Add production Worker api_url metadata and sdk_service_id for every agent-callable API target",
1742
+ "Mark browser, documentation, and runtime-only Worker targets with agent_callable:false",
1743
+ "Expose stable service IDs through generated DEFAULT_SERVICE_URLS and live catalog discovery",
1562
1744
  "Keep typed SDK/CLI/MCP surfaces in sync when an API contract stabilizes"
1563
1745
  ]
1564
1746
  },
@@ -1662,8 +1844,10 @@ var APPLICATION_REQUIREMENTS = [
1662
1844
  function applicationRequirementScopes(application) {
1663
1845
  const scopes = /* @__PURE__ */ new Set(["all"]);
1664
1846
  const appId = application.id;
1665
- const hasBrowserSurface = Boolean(application.productionUrl) || application.deployTargets.some((target) => target.kind === "pages");
1666
- const hasApiSurface = application.services.length > 0 || application.deployTargets.some((target) => Boolean(target.apiUrl));
1847
+ const hasBrowserSurface = Boolean(application.productionUrl) || // String() keeps this guard valid after the Pages->Worker migration narrowed
1848
+ // the generated kind union to "worker" (no "pages" literal remains).
1849
+ application.deployTargets.some((target) => String(target.kind) === "pages");
1850
+ const hasApiSurface = application.services.length > 0 || application.deployTargets.some((target) => Boolean(target.serviceId));
1667
1851
  if (hasBrowserSurface) scopes.add("browser");
1668
1852
  if (hasApiSurface) scopes.add("api");
1669
1853
  if (appId === "cli" || appId === "mcp" || appId === "cloudcontrol") {
@@ -1780,7 +1964,7 @@ function evaluateRequirement(application, requirement) {
1780
1964
  evidence
1781
1965
  );
1782
1966
  case "cloudflare-deployment-contract": {
1783
- if (application.deployTargets.length === 0) {
1967
+ if (application.deployTargets.length < 1) {
1784
1968
  return finding(requirement, "missing", "No CloudControl deploy targets are registered.", evidence);
1785
1969
  }
1786
1970
  evidence.push(`deployTargets=${application.deployTargets.length}`);
@@ -1867,6 +2051,7 @@ function resolveServiceUrl(service, overrides) {
1867
2051
  var WRITE_METHODS = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH", "DELETE"]);
1868
2052
  var POSITIVE_CACHE_TTL_MS = 5 * 60 * 1e3;
1869
2053
  var NEGATIVE_CACHE_TTL_MS = 60 * 1e3;
2054
+ var CATALOG_CACHE_TTL_MS = 60 * 1e3;
1870
2055
  var TopoloClient = class _TopoloClient {
1871
2056
  credential;
1872
2057
  agent;
@@ -1876,6 +2061,7 @@ var TopoloClient = class _TopoloClient {
1876
2061
  timeoutMs;
1877
2062
  fetchImpl;
1878
2063
  debug;
2064
+ serviceCatalogCache = null;
1879
2065
  /**
1880
2066
  * Process-wide cache for slug → service-id lookups. Keyed by
1881
2067
  * `${authBaseUrl}|${slug}` so multiple `TopoloClient` instances pointing at
@@ -1921,7 +2107,8 @@ var TopoloClient = class _TopoloClient {
1921
2107
  `Mutating ${method} requests require { confirm: true }. This guardrail prevents agents from issuing writes without an explicit human-in-the-loop acknowledgement.`
1922
2108
  );
1923
2109
  }
1924
- const baseUrl = resolveServiceUrl(opts.service, this.serviceUrls);
2110
+ const resolvedService = await this.resolveRequestService(opts.service);
2111
+ const baseUrl = resolvedService.baseUrl;
1925
2112
  const url = new URL(opts.path, baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`);
1926
2113
  if (opts.query) {
1927
2114
  for (const [k, v] of Object.entries(opts.query)) {
@@ -1931,7 +2118,7 @@ var TopoloClient = class _TopoloClient {
1931
2118
  const headers = new Headers();
1932
2119
  headers.set("Accept", "application/json");
1933
2120
  if (opts.body !== void 0) headers.set("Content-Type", "application/json");
1934
- const platformServiceId = resolveConfiguredServiceId(opts.service, this.serviceIds);
2121
+ const platformServiceId = resolveConfiguredServiceId(resolvedService.serviceKey, this.serviceIds);
1935
2122
  if (platformServiceId) headers.set("X-Service-ID", platformServiceId);
1936
2123
  applyAuthHeaders(headers, this.credential);
1937
2124
  const requestId = generateRequestId();
@@ -1944,7 +2131,7 @@ var TopoloClient = class _TopoloClient {
1944
2131
  const signal = opts.signal ? mergeSignals(opts.signal, controller.signal) : controller.signal;
1945
2132
  const urlStr = url.toString();
1946
2133
  const startedAt = Date.now();
1947
- this.emit({ phase: "request", method, service: opts.service, path: opts.path, url: urlStr, requestId });
2134
+ this.emit({ phase: "request", method, service: resolvedService.serviceKey, path: opts.path, url: urlStr, requestId });
1948
2135
  let res;
1949
2136
  try {
1950
2137
  res = await this.fetchImpl(urlStr, {
@@ -1957,7 +2144,7 @@ var TopoloClient = class _TopoloClient {
1957
2144
  this.emit({
1958
2145
  phase: "error",
1959
2146
  method,
1960
- service: opts.service,
2147
+ service: resolvedService.serviceKey,
1961
2148
  path: opts.path,
1962
2149
  url: urlStr,
1963
2150
  requestId,
@@ -1976,7 +2163,7 @@ var TopoloClient = class _TopoloClient {
1976
2163
  this.emit({
1977
2164
  phase: "error",
1978
2165
  method,
1979
- service: opts.service,
2166
+ service: resolvedService.serviceKey,
1980
2167
  path: opts.path,
1981
2168
  url: urlStr,
1982
2169
  requestId,
@@ -1991,12 +2178,12 @@ var TopoloClient = class _TopoloClient {
1991
2178
  extractRequired(parsed)
1992
2179
  );
1993
2180
  }
1994
- throw new TopoloHttpError(opts.service, opts.path, res.status, parsed);
2181
+ throw new TopoloHttpError(resolvedService.serviceKey, opts.path, res.status, parsed);
1995
2182
  }
1996
2183
  this.emit({
1997
2184
  phase: "response",
1998
2185
  method,
1999
- service: opts.service,
2186
+ service: resolvedService.serviceKey,
2000
2187
  path: opts.path,
2001
2188
  url: urlStr,
2002
2189
  requestId,
@@ -2005,6 +2192,31 @@ var TopoloClient = class _TopoloClient {
2005
2192
  });
2006
2193
  return parsed;
2007
2194
  }
2195
+ async resolveRequestService(service) {
2196
+ const serviceKey = normalizeLookupKey(service);
2197
+ if (!serviceKey) {
2198
+ throw new TopoloSdkError("unknown_service", "service is required");
2199
+ }
2200
+ const overrideUrl = resolveConfiguredServiceUrl(serviceKey, this.serviceUrls);
2201
+ if (overrideUrl) return { serviceKey, baseUrl: overrideUrl };
2202
+ const staticUrl = DEFAULT_SERVICE_URLS[serviceKey];
2203
+ if (staticUrl) return { serviceKey, baseUrl: staticUrl };
2204
+ const live = await this.resolveLiveCallableService(serviceKey);
2205
+ if (live) return live;
2206
+ throw new TopoloSdkError(
2207
+ "unknown_service",
2208
+ `Unknown Topolo service "${service}". Run service discovery first and pass a callable service id or slug.`
2209
+ );
2210
+ }
2211
+ async resolveLiveCallableService(serviceKey) {
2212
+ const catalog = await this.listServices();
2213
+ const match = catalog.find((entry) => catalogEntryMatches(entry, serviceKey));
2214
+ if (!match?.baseUrl || !isCallableCatalogEntry(match)) return null;
2215
+ return {
2216
+ serviceKey: normalizeLookupKey(match.slug || match.name || match.serviceId) || serviceKey,
2217
+ baseUrl: match.baseUrl
2218
+ };
2219
+ }
2008
2220
  /**
2009
2221
  * Resolve a service-slug → opaque service-id via caller config or TopoloAuth.
2010
2222
  *
@@ -2062,6 +2274,68 @@ var TopoloClient = class _TopoloClient {
2062
2274
  });
2063
2275
  return value;
2064
2276
  }
2277
+ /**
2278
+ * List the platform service catalog from the live registry
2279
+ * (`GET /api/services/catalog` on TopoloAuth). Credential-aware: the
2280
+ * caller's credential is attached, so an authenticated caller in an
2281
+ * entitled org also receives the `developer_only` services its role
2282
+ * permits; an unauthenticated/agent caller receives `active` only.
2283
+ *
2284
+ * Resilient: on any network/HTTP failure this falls back to the
2285
+ * build-time generated `APPLICATIONS` snapshot so offline/degraded
2286
+ * callers still get a usable (if static) catalog. The live result is
2287
+ * authoritative; the snapshot is a floor, not a cap.
2288
+ */
2289
+ async listServices() {
2290
+ const now = Date.now();
2291
+ if (this.serviceCatalogCache && this.serviceCatalogCache.expiresAt > now) {
2292
+ return this.serviceCatalogCache.entries;
2293
+ }
2294
+ try {
2295
+ const res = await this.request({ service: "auth", method: "GET", path: "/api/services/catalog" });
2296
+ const raw = res.data?.services ?? res.services;
2297
+ if (Array.isArray(raw) && raw.length > 0) {
2298
+ const entries = [];
2299
+ for (const item of raw) {
2300
+ const s = item;
2301
+ const serviceId = typeof s.service_id === "string" ? s.service_id : typeof s.id === "string" ? s.id : null;
2302
+ if (!serviceId) continue;
2303
+ entries.push({
2304
+ serviceId,
2305
+ slug: typeof s.app_slug === "string" ? s.app_slug : null,
2306
+ name: typeof s.name === "string" ? s.name : null,
2307
+ description: typeof s.description === "string" ? s.description : null,
2308
+ baseUrl: typeof s.base_url === "string" ? s.base_url : null,
2309
+ status: typeof s.status === "string" ? s.status : null,
2310
+ surfaceKind: typeof s.surface_kind === "string" ? s.surface_kind : null,
2311
+ launchable: s.launchable === true
2312
+ });
2313
+ }
2314
+ if (entries.length > 0) {
2315
+ this.serviceCatalogCache = {
2316
+ entries,
2317
+ expiresAt: now + CATALOG_CACHE_TTL_MS
2318
+ };
2319
+ return entries;
2320
+ }
2321
+ }
2322
+ } catch {
2323
+ }
2324
+ return this.generatedCatalogFallback();
2325
+ }
2326
+ generatedCatalogFallback() {
2327
+ const apps = Object.values(APPLICATIONS);
2328
+ return apps.map((app) => ({
2329
+ serviceId: app.id,
2330
+ slug: app.id,
2331
+ name: app.name ?? app.id,
2332
+ description: null,
2333
+ baseUrl: app.productionUrl ?? null,
2334
+ status: "active",
2335
+ surfaceKind: "application",
2336
+ launchable: Boolean(app.productionUrl)
2337
+ }));
2338
+ }
2065
2339
  /**
2066
2340
  * Introspect the current credential. Returns the caller's resolved identity,
2067
2341
  * organization, and permission set. Used by CLI `whoami` and by MCP to gate
@@ -2108,8 +2382,18 @@ function resolveConfiguredServiceId(slug, serviceIds) {
2108
2382
  }
2109
2383
  return null;
2110
2384
  }
2385
+ function resolveConfiguredServiceUrl(slug, serviceUrls) {
2386
+ for (const serviceKey of serviceKeyCandidates(slug)) {
2387
+ const configured = serviceUrls?.[serviceKey];
2388
+ if (typeof configured === "string" && configured.trim()) return configured.trim();
2389
+ const envKey = `TOPOLO_SERVICE_URL_${serviceKey.replace(/\./g, "_").toUpperCase()}`;
2390
+ const envValue = typeof process !== "undefined" ? process.env?.[envKey] : void 0;
2391
+ if (typeof envValue === "string" && envValue.trim()) return envValue.trim();
2392
+ }
2393
+ return null;
2394
+ }
2111
2395
  function serviceKeyCandidates(slug) {
2112
- const normalized = slug.trim().toLowerCase();
2396
+ const normalized = normalizeLookupKey(slug);
2113
2397
  const withoutTopolo = normalized.startsWith("topolo-") ? normalized.slice("topolo-".length) : normalized;
2114
2398
  return [.../* @__PURE__ */ new Set([
2115
2399
  normalized,
@@ -2118,6 +2402,33 @@ function serviceKeyCandidates(slug) {
2118
2402
  withoutTopolo.replace(/-/g, "_")
2119
2403
  ])];
2120
2404
  }
2405
+ function normalizeLookupKey(value) {
2406
+ return String(value || "").trim().toLowerCase();
2407
+ }
2408
+ function catalogEntryMatches(entry, needle) {
2409
+ return catalogEntryLookupKeys(entry).includes(needle);
2410
+ }
2411
+ function catalogEntryLookupKeys(entry) {
2412
+ const values = [entry.serviceId, entry.slug, entry.name].filter((value) => typeof value === "string" && value.trim().length > 0);
2413
+ const keys = /* @__PURE__ */ new Set();
2414
+ for (const value of values) {
2415
+ const normalized = normalizeLookupKey(value);
2416
+ if (!normalized) continue;
2417
+ keys.add(normalized);
2418
+ keys.add(normalized.replace(/-/g, "_"));
2419
+ if (normalized.startsWith("topolo-")) {
2420
+ const withoutTopolo = normalized.slice("topolo-".length);
2421
+ keys.add(withoutTopolo);
2422
+ keys.add(withoutTopolo.replace(/-/g, "_"));
2423
+ }
2424
+ }
2425
+ return [...keys];
2426
+ }
2427
+ function isCallableCatalogEntry(entry) {
2428
+ const kind = normalizeLookupKey(entry.surfaceKind || "");
2429
+ if (kind === "api" || kind === "technical_service" || kind === "service") return true;
2430
+ return Boolean(entry.slug && Object.prototype.hasOwnProperty.call(DEFAULT_SERVICE_URLS, catalogEntryLookupKeys(entry)[0] ?? ""));
2431
+ }
2121
2432
  function describeError(body, fallback) {
2122
2433
  if (body && typeof body === "object") {
2123
2434
  const maybe = body;
@@ -2283,7 +2594,6 @@ function splitService(servicePart) {
2283
2594
 
2284
2595
  // src/tools.ts
2285
2596
  var APPLICATION_IDS = Object.keys(APPLICATIONS).sort();
2286
- var SERVICE_IDS = Object.keys(DEFAULT_SERVICE_URLS).sort();
2287
2597
  var HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
2288
2598
  var TOOLS = [
2289
2599
  {
@@ -2322,7 +2632,7 @@ var TOOLS = [
2322
2632
  {
2323
2633
  name: "topolo_list_applications",
2324
2634
  title: "List every Topolo platform application",
2325
- description: "Returns the generated Topolo application catalog, including pages-only apps, tooling apps, and API-backed apps. Use this before choosing a service-specific or generic API operation. Pure metadata: no credential introspection, no permission check, no external call.",
2635
+ description: "Returns the live Topolo application catalog from the platform registry. Reflects apps as they are registered/removed with no client rebuild. Authenticated callers in an entitled org also see the developer_only apps their role permits. Falls back to a bundled snapshot only if the registry is unreachable.",
2326
2636
  requiredScopes: [],
2327
2637
  destructive: false,
2328
2638
  inputSchema: {
@@ -2330,14 +2640,14 @@ var TOOLS = [
2330
2640
  properties: {},
2331
2641
  additionalProperties: false
2332
2642
  },
2333
- handler: async () => ({
2334
- applications: APPLICATION_IDS.map((id) => APPLICATIONS[id])
2643
+ handler: async (topolo) => ({
2644
+ applications: await topolo.client.listServices()
2335
2645
  })
2336
2646
  },
2337
2647
  {
2338
2648
  name: "topolo_get_application",
2339
2649
  title: "Describe one Topolo platform application",
2340
- description: "Returns one application catalog entry with its package name, production URL, deploy targets, and SDK service IDs when the app has callable APIs. Pure metadata: no credential introspection, no permission check, no external call.",
2650
+ description: "Returns one live application catalog entry (service id, slug, name, base URL, status). Accepts the service id, slug, or name. Resolved against the live registry so newly-registered apps work without a client rebuild.",
2341
2651
  requiredScopes: [],
2342
2652
  destructive: false,
2343
2653
  inputSchema: {
@@ -2345,21 +2655,29 @@ var TOOLS = [
2345
2655
  properties: {
2346
2656
  application: {
2347
2657
  type: "string",
2348
- enum: APPLICATION_IDS,
2349
- description: "Application ID from topolo_list_applications."
2658
+ description: "Application identifier: service id, slug, or name from topolo_list_applications."
2350
2659
  }
2351
2660
  },
2352
2661
  required: ["application"],
2353
2662
  additionalProperties: false
2354
2663
  },
2355
- handler: async (_topolo, args) => {
2664
+ handler: async (topolo, args) => {
2356
2665
  const application = args["application"];
2357
- if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
2666
+ if (typeof application !== "string" || !application.trim()) {
2667
+ throw new Error("`application` must be a non-empty string.");
2668
+ }
2669
+ const needle = application.trim().toLowerCase();
2670
+ const catalog = await topolo.client.listServices();
2671
+ const match = catalog.find(
2672
+ (e) => e.serviceId.toLowerCase() === needle || e.slug && e.slug.toLowerCase() === needle || e.name && e.name.toLowerCase() === needle
2673
+ );
2674
+ if (!match) {
2675
+ const known = catalog.map((e) => e.slug || e.serviceId).sort().filter((value) => typeof value === "string" && value.length > 0);
2358
2676
  throw new Error(
2359
- `Unknown application "${String(application)}". Known: ${APPLICATION_IDS.join(", ")}`
2677
+ `Unknown application "${application}". ${formatKnownValues(known, "applications")}`
2360
2678
  );
2361
2679
  }
2362
- return { application: APPLICATIONS[application] };
2680
+ return { application: match };
2363
2681
  }
2364
2682
  },
2365
2683
  {
@@ -2373,7 +2691,6 @@ var TOOLS = [
2373
2691
  properties: {
2374
2692
  application: {
2375
2693
  type: "string",
2376
- enum: APPLICATION_IDS,
2377
2694
  description: "Optional application ID from topolo_list_applications."
2378
2695
  }
2379
2696
  },
@@ -2391,7 +2708,7 @@ var TOOLS = [
2391
2708
  }
2392
2709
  if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
2393
2710
  throw new Error(
2394
- `Unknown application "${String(application)}". Known: ${APPLICATION_IDS.join(", ")}`
2711
+ `Unknown application "${String(application)}". ${formatKnownValues(APPLICATION_IDS, "applications")}`
2395
2712
  );
2396
2713
  }
2397
2714
  const app = APPLICATIONS[application];
@@ -2414,7 +2731,6 @@ var TOOLS = [
2414
2731
  properties: {
2415
2732
  application: {
2416
2733
  type: "string",
2417
- enum: APPLICATION_IDS,
2418
2734
  description: "Optional application ID from topolo_list_applications."
2419
2735
  },
2420
2736
  failOn: {
@@ -2439,7 +2755,7 @@ var TOOLS = [
2439
2755
  }
2440
2756
  if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
2441
2757
  throw new Error(
2442
- `Unknown application "${String(application)}". Known: ${APPLICATION_IDS.join(", ")}`
2758
+ `Unknown application "${String(application)}". ${formatKnownValues(APPLICATION_IDS, "applications")}`
2443
2759
  );
2444
2760
  }
2445
2761
  report = auditAllApplicationRequirements([application]);
@@ -2472,7 +2788,7 @@ var TOOLS = [
2472
2788
  {
2473
2789
  name: "topolo_api_call",
2474
2790
  title: "Call any Topolo platform service",
2475
- description: `Low-level passthrough to any Topolo service. Use when no domain-specific tool exists for the operation you need. The request is signed with the current credential and scoped to the caller's organization \u2014 the target service will return 403 if your scopes do not permit the operation, even though this tool is advertised. Mutating calls (non-GET methods) require confirm:true. Known services: ${SERVICE_IDS.join(", ")}.`,
2791
+ description: "Low-level passthrough to any Topolo service. Use when no domain-specific tool exists for the operation you need. The request is signed with the current credential and scoped to the caller's organization \u2014 the target service will return 403 if your scopes do not permit the operation, even though this tool is advertised. Mutating calls (non-GET methods) require confirm:true. Call topolo_list_services first to discover callable service IDs; the SDK can also resolve live Auth-catalog service ids/slugs for newly registered API surfaces.",
2476
2792
  requiredScopes: [],
2477
2793
  destructive: true,
2478
2794
  inputSchema: {
@@ -2480,7 +2796,6 @@ var TOOLS = [
2480
2796
  properties: {
2481
2797
  service: {
2482
2798
  type: "string",
2483
- enum: SERVICE_IDS,
2484
2799
  description: "Target service ID from the platform registry."
2485
2800
  },
2486
2801
  method: {
@@ -2513,8 +2828,8 @@ var TOOLS = [
2513
2828
  handler: async (topolo, args) => {
2514
2829
  const service = args["service"];
2515
2830
  const path = args["path"];
2516
- if (typeof service !== "string" || !SERVICE_IDS.includes(service)) {
2517
- throw new Error(`Unknown service "${String(service)}". Known: ${SERVICE_IDS.join(", ")}`);
2831
+ if (typeof service !== "string" || !service.trim()) {
2832
+ throw new Error("service is required. Call topolo_list_services first to discover callable services.");
2518
2833
  }
2519
2834
  if (typeof path !== "string" || !path) {
2520
2835
  throw new Error("path is required");
@@ -2529,7 +2844,7 @@ var TOOLS = [
2529
2844
  Object.entries(query).map(([k, v]) => [k, String(v)])
2530
2845
  ) : void 0;
2531
2846
  return topolo.client.request({
2532
- service,
2847
+ service: service.trim(),
2533
2848
  method,
2534
2849
  path,
2535
2850
  body: args["body"],
@@ -2602,9 +2917,15 @@ function statusesAtOrWorse(threshold) {
2602
2917
  if (threshold === "needs_review") return ["missing", "needs_review"];
2603
2918
  return ["missing", "needs_review", "partial"];
2604
2919
  }
2920
+ function formatKnownValues(values, label) {
2921
+ const sorted = [...values].sort();
2922
+ const preview = sorted.slice(0, 25).join(", ");
2923
+ const suffix = sorted.length > 25 ? `, ... +${sorted.length - 25} more` : "";
2924
+ return `Run discovery for the full ${label} list. Known snapshot sample: ${preview}${suffix}`;
2925
+ }
2605
2926
 
2606
2927
  // src/version.ts
2607
- var MCP_VERSION = "0.3.0";
2928
+ var MCP_VERSION = "0.4.1";
2608
2929
 
2609
2930
  // src/server.ts
2610
2931
  function buildServer(topolo, scopes, tools = TOOLS) {