@topolo/mcp 0.2.2 → 0.2.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/README.md +4 -0
- package/dist/index.js +1332 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -101,6 +101,10 @@ clients surface that as a failed server launch.
|
|
|
101
101
|
| ---------------------------- | --------------------- | ---------------- |
|
|
102
102
|
| `topolo_whoami` | (none) | no |
|
|
103
103
|
| `topolo_list_services` | (none) | no |
|
|
104
|
+
| `topolo_list_applications` | (none) | no |
|
|
105
|
+
| `topolo_get_application` | (none) | no |
|
|
106
|
+
| `topolo_list_application_requirements` | (none) | no |
|
|
107
|
+
| `topolo_audit_applications` | (none) | no |
|
|
104
108
|
| `topolo_crm_list_contacts` | `crm.contacts:read` | no |
|
|
105
109
|
| `topolo_crm_get_contact` | `crm.contacts:read` | no |
|
|
106
110
|
| `topolo_api_call` | (service-enforced) | yes |
|
package/dist/index.js
CHANGED
|
@@ -63,12 +63,14 @@ var SERVICES = {
|
|
|
63
63
|
auth: "https://auth.topolo.app",
|
|
64
64
|
bugfix: "https://bugfix.topolo.app",
|
|
65
65
|
bytes: "https://r2-media-manager-worker.topolo.workers.dev",
|
|
66
|
+
calendar: "https://calendar.topolo.app",
|
|
66
67
|
chat: "https://chat.topolo.app",
|
|
67
68
|
commerce: "https://topolo-commerce-api.topolo.workers.dev",
|
|
68
69
|
crm: "https://crm-api.topolo.app",
|
|
69
70
|
forecast: "https://forecast-worker-production.topolo.workers.dev",
|
|
70
71
|
learn: "https://topololearn-api.topolo.workers.dev",
|
|
71
|
-
|
|
72
|
+
mail: "https://mail.topolo.app",
|
|
73
|
+
mdm: "https://topolo-mdm-api.topolo.app",
|
|
72
74
|
messaging: "https://messages.topolo.app",
|
|
73
75
|
nexus: "https://topolo-nexus-gateway.topolo.workers.dev",
|
|
74
76
|
one: "https://topoloone-worker.topolo.workers.dev",
|
|
@@ -79,12 +81,1174 @@ var SERVICES = {
|
|
|
79
81
|
social_studio: "https://topolo-social-studio-api.topolo.workers.dev",
|
|
80
82
|
socialize: "https://socialize-prod-api.topolo.workers.dev",
|
|
81
83
|
support: "https://support.topolo.app",
|
|
82
|
-
|
|
83
|
-
"web.runtime": "https://sites.topolo.app"
|
|
84
|
+
web: "https://web-api.topolo.app"
|
|
84
85
|
};
|
|
85
86
|
var PLATFORM_SERVICE_IDS = {
|
|
86
87
|
crm: "srv_iCwM4jGXcwlj"
|
|
87
88
|
};
|
|
89
|
+
var APPLICATIONS = {
|
|
90
|
+
"admin": {
|
|
91
|
+
"id": "admin",
|
|
92
|
+
"appDir": "TopoloAdmin",
|
|
93
|
+
"name": "topoloadmin",
|
|
94
|
+
"packageName": "topolo-admin",
|
|
95
|
+
"productionUrl": "https://admin.topolo.app",
|
|
96
|
+
"services": [],
|
|
97
|
+
"deployTargets": [
|
|
98
|
+
{
|
|
99
|
+
"name": "topoloadmin",
|
|
100
|
+
"kind": "pages",
|
|
101
|
+
"apiUrl": null,
|
|
102
|
+
"domains": [],
|
|
103
|
+
"routes": [],
|
|
104
|
+
"serviceId": null
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"agent": {
|
|
109
|
+
"id": "agent",
|
|
110
|
+
"appDir": "TopoloAgent",
|
|
111
|
+
"name": "topolo-agent",
|
|
112
|
+
"packageName": "topolo-agent",
|
|
113
|
+
"productionUrl": "https://agent.topolo.app",
|
|
114
|
+
"services": [
|
|
115
|
+
"agent"
|
|
116
|
+
],
|
|
117
|
+
"deployTargets": [
|
|
118
|
+
{
|
|
119
|
+
"name": "topolo-agent",
|
|
120
|
+
"kind": "pages",
|
|
121
|
+
"apiUrl": null,
|
|
122
|
+
"domains": [],
|
|
123
|
+
"routes": [],
|
|
124
|
+
"serviceId": null
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "topolo-agent-worker",
|
|
128
|
+
"kind": "worker",
|
|
129
|
+
"apiUrl": "https://topolo-agent-worker.topolo.workers.dev",
|
|
130
|
+
"domains": [],
|
|
131
|
+
"routes": [],
|
|
132
|
+
"serviceId": "agent"
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
"auth": {
|
|
137
|
+
"id": "auth",
|
|
138
|
+
"appDir": "TopoloAuth",
|
|
139
|
+
"name": "topolo-auth",
|
|
140
|
+
"packageName": "topolo-auth",
|
|
141
|
+
"productionUrl": "https://auth.topolo.app/login",
|
|
142
|
+
"services": [
|
|
143
|
+
"auth"
|
|
144
|
+
],
|
|
145
|
+
"deployTargets": [
|
|
146
|
+
{
|
|
147
|
+
"name": "topolo-auth",
|
|
148
|
+
"kind": "worker",
|
|
149
|
+
"apiUrl": "https://auth.topolo.app",
|
|
150
|
+
"domains": [
|
|
151
|
+
"auth.topolo.app"
|
|
152
|
+
],
|
|
153
|
+
"routes": [
|
|
154
|
+
"auth.topolo.app"
|
|
155
|
+
],
|
|
156
|
+
"serviceId": "auth"
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
},
|
|
160
|
+
"bugfix": {
|
|
161
|
+
"id": "bugfix",
|
|
162
|
+
"appDir": "TopoloBugFix",
|
|
163
|
+
"name": "topolo-bugfix",
|
|
164
|
+
"packageName": "topolo-bugfix",
|
|
165
|
+
"productionUrl": "https://bugfix.topolo.app",
|
|
166
|
+
"services": [
|
|
167
|
+
"bugfix"
|
|
168
|
+
],
|
|
169
|
+
"deployTargets": [
|
|
170
|
+
{
|
|
171
|
+
"name": "topolo-bugfix",
|
|
172
|
+
"kind": "worker",
|
|
173
|
+
"apiUrl": "https://bugfix.topolo.app",
|
|
174
|
+
"domains": [
|
|
175
|
+
"bugfix.topolo.app"
|
|
176
|
+
],
|
|
177
|
+
"routes": [
|
|
178
|
+
"bugfix.topolo.app"
|
|
179
|
+
],
|
|
180
|
+
"serviceId": "bugfix"
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
},
|
|
184
|
+
"bytes": {
|
|
185
|
+
"id": "bytes",
|
|
186
|
+
"appDir": "TopoloBytes",
|
|
187
|
+
"name": "topolo-bytes",
|
|
188
|
+
"packageName": "topolo-bytes",
|
|
189
|
+
"productionUrl": "https://bytes.topolo.app",
|
|
190
|
+
"services": [
|
|
191
|
+
"bytes"
|
|
192
|
+
],
|
|
193
|
+
"deployTargets": [
|
|
194
|
+
{
|
|
195
|
+
"name": "bytes",
|
|
196
|
+
"kind": "pages",
|
|
197
|
+
"apiUrl": null,
|
|
198
|
+
"domains": [],
|
|
199
|
+
"routes": [],
|
|
200
|
+
"serviceId": null
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"name": "r2-media-manager-worker",
|
|
204
|
+
"kind": "worker",
|
|
205
|
+
"apiUrl": "https://r2-media-manager-worker.topolo.workers.dev",
|
|
206
|
+
"domains": [],
|
|
207
|
+
"routes": [],
|
|
208
|
+
"serviceId": "bytes"
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
},
|
|
212
|
+
"calendar": {
|
|
213
|
+
"id": "calendar",
|
|
214
|
+
"appDir": "TopoloCalendar",
|
|
215
|
+
"name": "topolo-calendar",
|
|
216
|
+
"packageName": "topolo-calendar",
|
|
217
|
+
"productionUrl": "https://calendar.topolo.app",
|
|
218
|
+
"services": [
|
|
219
|
+
"calendar"
|
|
220
|
+
],
|
|
221
|
+
"deployTargets": [
|
|
222
|
+
{
|
|
223
|
+
"name": "topolo-calendar",
|
|
224
|
+
"kind": "worker",
|
|
225
|
+
"apiUrl": "https://calendar.topolo.app",
|
|
226
|
+
"domains": [
|
|
227
|
+
"calendar.topolo.app"
|
|
228
|
+
],
|
|
229
|
+
"routes": [
|
|
230
|
+
"calendar.topolo.app"
|
|
231
|
+
],
|
|
232
|
+
"serviceId": "calendar"
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
"chat": {
|
|
237
|
+
"id": "chat",
|
|
238
|
+
"appDir": "TopoloChat",
|
|
239
|
+
"name": "topolo-chat",
|
|
240
|
+
"packageName": "topolo-chat",
|
|
241
|
+
"productionUrl": "https://chat.topolo.app",
|
|
242
|
+
"services": [
|
|
243
|
+
"chat"
|
|
244
|
+
],
|
|
245
|
+
"deployTargets": [
|
|
246
|
+
{
|
|
247
|
+
"name": "topolo-chat",
|
|
248
|
+
"kind": "worker",
|
|
249
|
+
"apiUrl": "https://chat.topolo.app",
|
|
250
|
+
"domains": [
|
|
251
|
+
"chat.topolo.app"
|
|
252
|
+
],
|
|
253
|
+
"routes": [
|
|
254
|
+
"chat.topolo.app"
|
|
255
|
+
],
|
|
256
|
+
"serviceId": "chat"
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
},
|
|
260
|
+
"cli": {
|
|
261
|
+
"id": "cli",
|
|
262
|
+
"appDir": "TopoloCli",
|
|
263
|
+
"name": "@topolo/cli",
|
|
264
|
+
"packageName": "@topolo/cli",
|
|
265
|
+
"productionUrl": null,
|
|
266
|
+
"services": [],
|
|
267
|
+
"deployTargets": []
|
|
268
|
+
},
|
|
269
|
+
"cloudcontrol": {
|
|
270
|
+
"id": "cloudcontrol",
|
|
271
|
+
"appDir": "TopoloCloudControl",
|
|
272
|
+
"name": "topolo-cloudcontrol",
|
|
273
|
+
"packageName": "topolo-cloudcontrol",
|
|
274
|
+
"productionUrl": null,
|
|
275
|
+
"services": [],
|
|
276
|
+
"deployTargets": []
|
|
277
|
+
},
|
|
278
|
+
"commerce": {
|
|
279
|
+
"id": "commerce",
|
|
280
|
+
"appDir": "TopoloCommerce",
|
|
281
|
+
"name": "topolo-commerce",
|
|
282
|
+
"packageName": "topolo-commerce",
|
|
283
|
+
"productionUrl": "https://commerce.topolo.app",
|
|
284
|
+
"services": [
|
|
285
|
+
"commerce"
|
|
286
|
+
],
|
|
287
|
+
"deployTargets": [
|
|
288
|
+
{
|
|
289
|
+
"name": "topolo-commerce-api",
|
|
290
|
+
"kind": "worker",
|
|
291
|
+
"apiUrl": "https://topolo-commerce-api.topolo.workers.dev",
|
|
292
|
+
"domains": [
|
|
293
|
+
"topolo-commerce-api.topolo.workers.dev"
|
|
294
|
+
],
|
|
295
|
+
"routes": [],
|
|
296
|
+
"serviceId": "commerce"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"name": "topolo-commerce-guest-web",
|
|
300
|
+
"kind": "pages",
|
|
301
|
+
"apiUrl": null,
|
|
302
|
+
"domains": [
|
|
303
|
+
"guest.topolo.app",
|
|
304
|
+
"topolo-commerce-guest-web.pages.dev"
|
|
305
|
+
],
|
|
306
|
+
"routes": [],
|
|
307
|
+
"serviceId": null
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"name": "topolo-commerce-ops-web",
|
|
311
|
+
"kind": "pages",
|
|
312
|
+
"apiUrl": null,
|
|
313
|
+
"domains": [
|
|
314
|
+
"commerce.topolo.app",
|
|
315
|
+
"topolo-commerce-ops-web.pages.dev"
|
|
316
|
+
],
|
|
317
|
+
"routes": [],
|
|
318
|
+
"serviceId": null
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"name": "topolo-commerce-station-web",
|
|
322
|
+
"kind": "pages",
|
|
323
|
+
"apiUrl": null,
|
|
324
|
+
"domains": [
|
|
325
|
+
"station-commerce.topolo.app",
|
|
326
|
+
"topolo-commerce-station-web.pages.dev"
|
|
327
|
+
],
|
|
328
|
+
"routes": [],
|
|
329
|
+
"serviceId": null
|
|
330
|
+
}
|
|
331
|
+
]
|
|
332
|
+
},
|
|
333
|
+
"crm": {
|
|
334
|
+
"id": "crm",
|
|
335
|
+
"appDir": "TopoloCRM",
|
|
336
|
+
"name": "topolo-crm",
|
|
337
|
+
"packageName": "topolo-crm",
|
|
338
|
+
"productionUrl": "https://crm.topolo.app",
|
|
339
|
+
"services": [
|
|
340
|
+
"crm"
|
|
341
|
+
],
|
|
342
|
+
"deployTargets": [
|
|
343
|
+
{
|
|
344
|
+
"name": "topolo-crm-frontend",
|
|
345
|
+
"kind": "pages",
|
|
346
|
+
"apiUrl": null,
|
|
347
|
+
"domains": [],
|
|
348
|
+
"routes": [],
|
|
349
|
+
"serviceId": null
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"name": "topolo-crm-worker",
|
|
353
|
+
"kind": "worker",
|
|
354
|
+
"apiUrl": "https://crm-api.topolo.app",
|
|
355
|
+
"domains": [],
|
|
356
|
+
"routes": [],
|
|
357
|
+
"serviceId": "crm"
|
|
358
|
+
}
|
|
359
|
+
]
|
|
360
|
+
},
|
|
361
|
+
"developers": {
|
|
362
|
+
"id": "developers",
|
|
363
|
+
"appDir": "TopoloDevelopers",
|
|
364
|
+
"name": "topolo-developers",
|
|
365
|
+
"packageName": "topolo-developers",
|
|
366
|
+
"productionUrl": "https://developers.topolo.app",
|
|
367
|
+
"services": [],
|
|
368
|
+
"deployTargets": [
|
|
369
|
+
{
|
|
370
|
+
"name": "topolo-developers",
|
|
371
|
+
"kind": "pages",
|
|
372
|
+
"apiUrl": null,
|
|
373
|
+
"domains": [
|
|
374
|
+
"developers.topolo.app"
|
|
375
|
+
],
|
|
376
|
+
"routes": [],
|
|
377
|
+
"serviceId": null
|
|
378
|
+
}
|
|
379
|
+
]
|
|
380
|
+
},
|
|
381
|
+
"docs": {
|
|
382
|
+
"id": "docs",
|
|
383
|
+
"appDir": "TopoloDocs",
|
|
384
|
+
"name": "topolo-docs",
|
|
385
|
+
"packageName": "topolo-docs",
|
|
386
|
+
"productionUrl": "https://docs.topolo.app",
|
|
387
|
+
"services": [],
|
|
388
|
+
"deployTargets": [
|
|
389
|
+
{
|
|
390
|
+
"name": "topolo-docs",
|
|
391
|
+
"kind": "pages",
|
|
392
|
+
"apiUrl": null,
|
|
393
|
+
"domains": [
|
|
394
|
+
"docs.topolo.app"
|
|
395
|
+
],
|
|
396
|
+
"routes": [],
|
|
397
|
+
"serviceId": null
|
|
398
|
+
}
|
|
399
|
+
]
|
|
400
|
+
},
|
|
401
|
+
"feed": {
|
|
402
|
+
"id": "feed",
|
|
403
|
+
"appDir": "TopoloFeed",
|
|
404
|
+
"name": "TopoloFeed",
|
|
405
|
+
"packageName": null,
|
|
406
|
+
"productionUrl": null,
|
|
407
|
+
"services": [],
|
|
408
|
+
"deployTargets": [
|
|
409
|
+
{
|
|
410
|
+
"name": "topolo-feed-analytics-api",
|
|
411
|
+
"kind": "worker",
|
|
412
|
+
"apiUrl": null,
|
|
413
|
+
"domains": [],
|
|
414
|
+
"routes": [],
|
|
415
|
+
"serviceId": null
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
"name": "topolo-feed-api",
|
|
419
|
+
"kind": "worker",
|
|
420
|
+
"apiUrl": null,
|
|
421
|
+
"domains": [],
|
|
422
|
+
"routes": [],
|
|
423
|
+
"serviceId": null
|
|
424
|
+
}
|
|
425
|
+
]
|
|
426
|
+
},
|
|
427
|
+
"forecast": {
|
|
428
|
+
"id": "forecast",
|
|
429
|
+
"appDir": "TopoloForecast",
|
|
430
|
+
"name": "forecast-cloud",
|
|
431
|
+
"packageName": "topolo-forecast",
|
|
432
|
+
"productionUrl": "https://forecast.topolo.app",
|
|
433
|
+
"services": [
|
|
434
|
+
"forecast"
|
|
435
|
+
],
|
|
436
|
+
"deployTargets": [
|
|
437
|
+
{
|
|
438
|
+
"name": "forecast",
|
|
439
|
+
"kind": "pages",
|
|
440
|
+
"apiUrl": null,
|
|
441
|
+
"domains": [],
|
|
442
|
+
"routes": [],
|
|
443
|
+
"serviceId": null
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"name": "forecast-worker-production",
|
|
447
|
+
"kind": "worker",
|
|
448
|
+
"apiUrl": "https://forecast-worker-production.topolo.workers.dev",
|
|
449
|
+
"domains": [],
|
|
450
|
+
"routes": [],
|
|
451
|
+
"serviceId": "forecast"
|
|
452
|
+
}
|
|
453
|
+
]
|
|
454
|
+
},
|
|
455
|
+
"learn": {
|
|
456
|
+
"id": "learn",
|
|
457
|
+
"appDir": "TopoloLearn",
|
|
458
|
+
"name": "topololearn",
|
|
459
|
+
"packageName": "topolo-learn",
|
|
460
|
+
"productionUrl": "https://learn.topolo.app",
|
|
461
|
+
"services": [
|
|
462
|
+
"learn"
|
|
463
|
+
],
|
|
464
|
+
"deployTargets": [
|
|
465
|
+
{
|
|
466
|
+
"name": "topololearn",
|
|
467
|
+
"kind": "pages",
|
|
468
|
+
"apiUrl": null,
|
|
469
|
+
"domains": [
|
|
470
|
+
"learn.topolo.app"
|
|
471
|
+
],
|
|
472
|
+
"routes": [],
|
|
473
|
+
"serviceId": null
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"name": "topololearn-api",
|
|
477
|
+
"kind": "worker",
|
|
478
|
+
"apiUrl": "https://topololearn-api.topolo.workers.dev",
|
|
479
|
+
"domains": [
|
|
480
|
+
"topololearn-api.topolo.workers.dev"
|
|
481
|
+
],
|
|
482
|
+
"routes": [],
|
|
483
|
+
"serviceId": "learn"
|
|
484
|
+
}
|
|
485
|
+
]
|
|
486
|
+
},
|
|
487
|
+
"mail": {
|
|
488
|
+
"id": "mail",
|
|
489
|
+
"appDir": "TopoloMail",
|
|
490
|
+
"name": "topolo-mail",
|
|
491
|
+
"packageName": "topolo-mail",
|
|
492
|
+
"productionUrl": "https://mail.topolo.app",
|
|
493
|
+
"services": [
|
|
494
|
+
"mail"
|
|
495
|
+
],
|
|
496
|
+
"deployTargets": [
|
|
497
|
+
{
|
|
498
|
+
"name": "topolo-mail",
|
|
499
|
+
"kind": "workers",
|
|
500
|
+
"apiUrl": "https://mail.topolo.app",
|
|
501
|
+
"domains": [
|
|
502
|
+
"mail.topolo.app"
|
|
503
|
+
],
|
|
504
|
+
"routes": [
|
|
505
|
+
"mail.topolo.app"
|
|
506
|
+
],
|
|
507
|
+
"serviceId": "mail"
|
|
508
|
+
}
|
|
509
|
+
]
|
|
510
|
+
},
|
|
511
|
+
"mcp": {
|
|
512
|
+
"id": "mcp",
|
|
513
|
+
"appDir": "TopoloMCP",
|
|
514
|
+
"name": "@topolo/mcp",
|
|
515
|
+
"packageName": "@topolo/mcp",
|
|
516
|
+
"productionUrl": null,
|
|
517
|
+
"services": [],
|
|
518
|
+
"deployTargets": []
|
|
519
|
+
},
|
|
520
|
+
"mdm": {
|
|
521
|
+
"id": "mdm",
|
|
522
|
+
"appDir": "TopoloMDM",
|
|
523
|
+
"name": "TopoloMDM",
|
|
524
|
+
"packageName": null,
|
|
525
|
+
"productionUrl": "https://mdm.topolo.app",
|
|
526
|
+
"services": [
|
|
527
|
+
"mdm"
|
|
528
|
+
],
|
|
529
|
+
"deployTargets": [
|
|
530
|
+
{
|
|
531
|
+
"name": "topolo-mdm-api",
|
|
532
|
+
"kind": "worker",
|
|
533
|
+
"apiUrl": "https://topolo-mdm-api.topolo.app",
|
|
534
|
+
"domains": [
|
|
535
|
+
"topolo-mdm-api.topolo.app"
|
|
536
|
+
],
|
|
537
|
+
"routes": [
|
|
538
|
+
"topolo-mdm-api.topolo.app"
|
|
539
|
+
],
|
|
540
|
+
"serviceId": "mdm"
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
"name": "topolo-mdm-console",
|
|
544
|
+
"kind": "pages",
|
|
545
|
+
"apiUrl": null,
|
|
546
|
+
"domains": [
|
|
547
|
+
"mdm.topolo.app",
|
|
548
|
+
"topolo-mdm-console.pages.dev"
|
|
549
|
+
],
|
|
550
|
+
"routes": [
|
|
551
|
+
"mdm.topolo.app"
|
|
552
|
+
],
|
|
553
|
+
"serviceId": null
|
|
554
|
+
}
|
|
555
|
+
]
|
|
556
|
+
},
|
|
557
|
+
"messaging": {
|
|
558
|
+
"id": "messaging",
|
|
559
|
+
"appDir": "TopoloMessaging",
|
|
560
|
+
"name": "topolo-messaging",
|
|
561
|
+
"packageName": "topolo-messaging",
|
|
562
|
+
"productionUrl": "https://messages.topolo.app",
|
|
563
|
+
"services": [
|
|
564
|
+
"messaging"
|
|
565
|
+
],
|
|
566
|
+
"deployTargets": [
|
|
567
|
+
{
|
|
568
|
+
"name": "topolo-messaging",
|
|
569
|
+
"kind": "workers",
|
|
570
|
+
"apiUrl": "https://messages.topolo.app",
|
|
571
|
+
"domains": [
|
|
572
|
+
"messages.topolo.app"
|
|
573
|
+
],
|
|
574
|
+
"routes": [],
|
|
575
|
+
"serviceId": "messaging"
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
"name": "topolo-messaging-dispatch",
|
|
579
|
+
"kind": "workers",
|
|
580
|
+
"apiUrl": null,
|
|
581
|
+
"domains": [],
|
|
582
|
+
"routes": [],
|
|
583
|
+
"serviceId": null
|
|
584
|
+
}
|
|
585
|
+
]
|
|
586
|
+
},
|
|
587
|
+
"nexus": {
|
|
588
|
+
"id": "nexus",
|
|
589
|
+
"appDir": "TopoloNexus",
|
|
590
|
+
"name": "topolo-nexus",
|
|
591
|
+
"packageName": "topolo-nexus",
|
|
592
|
+
"productionUrl": "https://nexus.topolo.app",
|
|
593
|
+
"services": [
|
|
594
|
+
"nexus"
|
|
595
|
+
],
|
|
596
|
+
"deployTargets": [
|
|
597
|
+
{
|
|
598
|
+
"name": "topolo-nexus-dashboard",
|
|
599
|
+
"kind": "pages",
|
|
600
|
+
"apiUrl": null,
|
|
601
|
+
"domains": [
|
|
602
|
+
"nexus.topolo.app",
|
|
603
|
+
"topolo-nexus-dashboard.pages.dev"
|
|
604
|
+
],
|
|
605
|
+
"routes": [],
|
|
606
|
+
"serviceId": null
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
"name": "topolo-nexus-gateway",
|
|
610
|
+
"kind": "worker",
|
|
611
|
+
"apiUrl": "https://topolo-nexus-gateway.topolo.workers.dev",
|
|
612
|
+
"domains": [
|
|
613
|
+
"topolo-nexus-gateway.topolo.workers.dev"
|
|
614
|
+
],
|
|
615
|
+
"routes": [],
|
|
616
|
+
"serviceId": "nexus"
|
|
617
|
+
}
|
|
618
|
+
]
|
|
619
|
+
},
|
|
620
|
+
"one": {
|
|
621
|
+
"id": "one",
|
|
622
|
+
"appDir": "TopoloOne",
|
|
623
|
+
"name": "topolo-oneclick-sso",
|
|
624
|
+
"packageName": "topolo-oneclick-sso",
|
|
625
|
+
"productionUrl": "https://one.topolo.app",
|
|
626
|
+
"services": [
|
|
627
|
+
"one"
|
|
628
|
+
],
|
|
629
|
+
"deployTargets": [
|
|
630
|
+
{
|
|
631
|
+
"name": "ai-chat-rag",
|
|
632
|
+
"kind": "worker",
|
|
633
|
+
"apiUrl": null,
|
|
634
|
+
"domains": [
|
|
635
|
+
"ai-chat-rag.topolo.workers.dev"
|
|
636
|
+
],
|
|
637
|
+
"routes": [],
|
|
638
|
+
"serviceId": null
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
"name": "topoloone",
|
|
642
|
+
"kind": "pages",
|
|
643
|
+
"apiUrl": null,
|
|
644
|
+
"domains": [
|
|
645
|
+
"oneclick-dashboard.pages.dev"
|
|
646
|
+
],
|
|
647
|
+
"routes": [],
|
|
648
|
+
"serviceId": null
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
"name": "topoloone-website",
|
|
652
|
+
"kind": "worker",
|
|
653
|
+
"apiUrl": null,
|
|
654
|
+
"domains": [
|
|
655
|
+
"one.topolo.io"
|
|
656
|
+
],
|
|
657
|
+
"routes": [],
|
|
658
|
+
"serviceId": null
|
|
659
|
+
},
|
|
660
|
+
{
|
|
661
|
+
"name": "topoloone-worker",
|
|
662
|
+
"kind": "worker",
|
|
663
|
+
"apiUrl": "https://topoloone-worker.topolo.workers.dev",
|
|
664
|
+
"domains": [],
|
|
665
|
+
"routes": [
|
|
666
|
+
"one.topolo.app/*"
|
|
667
|
+
],
|
|
668
|
+
"serviceId": "one"
|
|
669
|
+
}
|
|
670
|
+
]
|
|
671
|
+
},
|
|
672
|
+
"pay": {
|
|
673
|
+
"id": "pay",
|
|
674
|
+
"appDir": "TopoloPay",
|
|
675
|
+
"name": "topolo-pay",
|
|
676
|
+
"packageName": "topolo-pay",
|
|
677
|
+
"productionUrl": "https://pay.topolo.app",
|
|
678
|
+
"services": [
|
|
679
|
+
"pay"
|
|
680
|
+
],
|
|
681
|
+
"deployTargets": [
|
|
682
|
+
{
|
|
683
|
+
"name": "topolo-pay",
|
|
684
|
+
"kind": "worker",
|
|
685
|
+
"apiUrl": "https://topolo-pay.topolo.workers.dev",
|
|
686
|
+
"domains": [],
|
|
687
|
+
"routes": [],
|
|
688
|
+
"serviceId": "pay"
|
|
689
|
+
}
|
|
690
|
+
]
|
|
691
|
+
},
|
|
692
|
+
"quro": {
|
|
693
|
+
"id": "quro",
|
|
694
|
+
"appDir": "TopoloQuro",
|
|
695
|
+
"name": "TopoloQuro",
|
|
696
|
+
"packageName": null,
|
|
697
|
+
"productionUrl": "https://quro.topolo.app",
|
|
698
|
+
"services": [
|
|
699
|
+
"quro.api",
|
|
700
|
+
"quro.redirect"
|
|
701
|
+
],
|
|
702
|
+
"deployTargets": [
|
|
703
|
+
{
|
|
704
|
+
"name": "quro-api",
|
|
705
|
+
"kind": "worker",
|
|
706
|
+
"apiUrl": "https://api.ol0.me",
|
|
707
|
+
"domains": [],
|
|
708
|
+
"routes": [],
|
|
709
|
+
"serviceId": "quro.api"
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
"name": "quro-redirect-system",
|
|
713
|
+
"kind": "worker",
|
|
714
|
+
"apiUrl": "https://ol0.me",
|
|
715
|
+
"domains": [],
|
|
716
|
+
"routes": [
|
|
717
|
+
"ol0.me/*"
|
|
718
|
+
],
|
|
719
|
+
"serviceId": "quro.redirect"
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
"name": "quro-ui",
|
|
723
|
+
"kind": "pages",
|
|
724
|
+
"apiUrl": null,
|
|
725
|
+
"domains": [],
|
|
726
|
+
"routes": [],
|
|
727
|
+
"serviceId": null
|
|
728
|
+
}
|
|
729
|
+
]
|
|
730
|
+
},
|
|
731
|
+
"roadmapper": {
|
|
732
|
+
"id": "roadmapper",
|
|
733
|
+
"appDir": "TopoloRoadmapper",
|
|
734
|
+
"name": "topolo-roadmapper",
|
|
735
|
+
"packageName": "topolo-roadmapper",
|
|
736
|
+
"productionUrl": "https://roadmapper.topolo.app",
|
|
737
|
+
"services": [
|
|
738
|
+
"roadmapper"
|
|
739
|
+
],
|
|
740
|
+
"deployTargets": [
|
|
741
|
+
{
|
|
742
|
+
"name": "roadmapper",
|
|
743
|
+
"kind": "pages",
|
|
744
|
+
"apiUrl": null,
|
|
745
|
+
"domains": [
|
|
746
|
+
"roadmapper.topolo.app"
|
|
747
|
+
],
|
|
748
|
+
"routes": [],
|
|
749
|
+
"serviceId": null
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"name": "topolo-production-roadmapper",
|
|
753
|
+
"kind": "worker",
|
|
754
|
+
"apiUrl": "https://roadmapper-api.topolo.app",
|
|
755
|
+
"domains": [
|
|
756
|
+
"roadmapper-api.topolo.app"
|
|
757
|
+
],
|
|
758
|
+
"routes": [],
|
|
759
|
+
"serviceId": "roadmapper"
|
|
760
|
+
}
|
|
761
|
+
]
|
|
762
|
+
},
|
|
763
|
+
"social_studio": {
|
|
764
|
+
"id": "social_studio",
|
|
765
|
+
"appDir": "TopoloSocialStudio",
|
|
766
|
+
"name": "topolo-social-studio",
|
|
767
|
+
"packageName": "topolo-social-studio",
|
|
768
|
+
"productionUrl": "https://studio.topolo.app",
|
|
769
|
+
"services": [
|
|
770
|
+
"social_studio"
|
|
771
|
+
],
|
|
772
|
+
"deployTargets": [
|
|
773
|
+
{
|
|
774
|
+
"name": "topolo-social-studio",
|
|
775
|
+
"kind": "pages",
|
|
776
|
+
"apiUrl": null,
|
|
777
|
+
"domains": [],
|
|
778
|
+
"routes": [],
|
|
779
|
+
"serviceId": null
|
|
780
|
+
},
|
|
781
|
+
{
|
|
782
|
+
"name": "topolo-social-studio-api",
|
|
783
|
+
"kind": "worker",
|
|
784
|
+
"apiUrl": "https://topolo-social-studio-api.topolo.workers.dev",
|
|
785
|
+
"domains": [],
|
|
786
|
+
"routes": [],
|
|
787
|
+
"serviceId": "social_studio"
|
|
788
|
+
},
|
|
789
|
+
{
|
|
790
|
+
"name": "topolo-social-studio-queue",
|
|
791
|
+
"kind": "worker",
|
|
792
|
+
"apiUrl": null,
|
|
793
|
+
"domains": [],
|
|
794
|
+
"routes": [],
|
|
795
|
+
"serviceId": null
|
|
796
|
+
}
|
|
797
|
+
]
|
|
798
|
+
},
|
|
799
|
+
"socialize": {
|
|
800
|
+
"id": "socialize",
|
|
801
|
+
"appDir": "TopoloSocialize",
|
|
802
|
+
"name": "socialize",
|
|
803
|
+
"packageName": "topolo-socialize",
|
|
804
|
+
"productionUrl": "https://socialize.topolo.app",
|
|
805
|
+
"services": [
|
|
806
|
+
"socialize"
|
|
807
|
+
],
|
|
808
|
+
"deployTargets": [
|
|
809
|
+
{
|
|
810
|
+
"name": "socialize",
|
|
811
|
+
"kind": "pages",
|
|
812
|
+
"apiUrl": null,
|
|
813
|
+
"domains": [],
|
|
814
|
+
"routes": [],
|
|
815
|
+
"serviceId": null
|
|
816
|
+
},
|
|
817
|
+
{
|
|
818
|
+
"name": "socialize-prod-api",
|
|
819
|
+
"kind": "worker",
|
|
820
|
+
"apiUrl": "https://socialize-prod-api.topolo.workers.dev",
|
|
821
|
+
"domains": [],
|
|
822
|
+
"routes": [],
|
|
823
|
+
"serviceId": "socialize"
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"name": "socialize-prod-scheduler",
|
|
827
|
+
"kind": "worker",
|
|
828
|
+
"apiUrl": null,
|
|
829
|
+
"domains": [],
|
|
830
|
+
"routes": [],
|
|
831
|
+
"serviceId": null
|
|
832
|
+
}
|
|
833
|
+
]
|
|
834
|
+
},
|
|
835
|
+
"support": {
|
|
836
|
+
"id": "support",
|
|
837
|
+
"appDir": "TopoloSupport",
|
|
838
|
+
"name": "topolo-support",
|
|
839
|
+
"packageName": "topolo-support",
|
|
840
|
+
"productionUrl": "https://support.topolo.app",
|
|
841
|
+
"services": [
|
|
842
|
+
"support"
|
|
843
|
+
],
|
|
844
|
+
"deployTargets": [
|
|
845
|
+
{
|
|
846
|
+
"name": "topolo-support",
|
|
847
|
+
"kind": "workers",
|
|
848
|
+
"apiUrl": "https://support.topolo.app",
|
|
849
|
+
"domains": [
|
|
850
|
+
"support.topolo.app"
|
|
851
|
+
],
|
|
852
|
+
"routes": [
|
|
853
|
+
"support.topolo.app/*"
|
|
854
|
+
],
|
|
855
|
+
"serviceId": "support"
|
|
856
|
+
}
|
|
857
|
+
]
|
|
858
|
+
},
|
|
859
|
+
"web": {
|
|
860
|
+
"id": "web",
|
|
861
|
+
"appDir": "TopoloWeb",
|
|
862
|
+
"name": "topoloweb",
|
|
863
|
+
"packageName": "topolo-web",
|
|
864
|
+
"productionUrl": "https://web.topolo.app",
|
|
865
|
+
"services": [
|
|
866
|
+
"web"
|
|
867
|
+
],
|
|
868
|
+
"deployTargets": [
|
|
869
|
+
{
|
|
870
|
+
"name": "topoloweb-api",
|
|
871
|
+
"kind": "worker",
|
|
872
|
+
"apiUrl": "https://web-api.topolo.app",
|
|
873
|
+
"domains": [
|
|
874
|
+
"web-api.topolo.app"
|
|
875
|
+
],
|
|
876
|
+
"routes": [],
|
|
877
|
+
"serviceId": "web"
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
"name": "topoloweb-runtime",
|
|
881
|
+
"kind": "worker",
|
|
882
|
+
"apiUrl": "https://sites.topolo.app",
|
|
883
|
+
"domains": [
|
|
884
|
+
"sites.topolo.app"
|
|
885
|
+
],
|
|
886
|
+
"routes": [],
|
|
887
|
+
"serviceId": null
|
|
888
|
+
},
|
|
889
|
+
{
|
|
890
|
+
"name": "topoloweb-studio",
|
|
891
|
+
"kind": "pages",
|
|
892
|
+
"apiUrl": null,
|
|
893
|
+
"domains": [
|
|
894
|
+
"web.topolo.app"
|
|
895
|
+
],
|
|
896
|
+
"routes": [],
|
|
897
|
+
"serviceId": null
|
|
898
|
+
}
|
|
899
|
+
]
|
|
900
|
+
}
|
|
901
|
+
};
|
|
902
|
+
var APPLICATION_REQUIREMENTS_VERSION = "2026-04-22.1";
|
|
903
|
+
var APPLICATION_REQUIREMENTS = [
|
|
904
|
+
{
|
|
905
|
+
id: "platform-metadata",
|
|
906
|
+
title: "Register the application in platform metadata",
|
|
907
|
+
summary: "Every app must have a stable application ID, CloudControl metadata for deployed surfaces, and package metadata where code is shipped.",
|
|
908
|
+
appliesTo: ["all"],
|
|
909
|
+
evidence: [
|
|
910
|
+
"topolo.cloudcontrol.json exists for every deployed app surface",
|
|
911
|
+
"package.json names the package or app when the repo ships code",
|
|
912
|
+
"The SDK application catalog exposes the app through topolo apps and MCP discovery"
|
|
913
|
+
],
|
|
914
|
+
implementation: [
|
|
915
|
+
"Add the app to the SDK application catalog generator before exposing it to agents",
|
|
916
|
+
"Keep production URLs, Worker names, Pages projects, routes, domains, and bindings current in CloudControl metadata",
|
|
917
|
+
"Do not leave a new Topolo* app directory without an explicit application ID"
|
|
918
|
+
]
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
id: "canonical-docs",
|
|
922
|
+
title: "Update canonical docs with the code change",
|
|
923
|
+
summary: "TopoloDocs is the source of truth for application behavior, ownership, deployment shape, auth boundaries, and operations.",
|
|
924
|
+
appliesTo: ["all"],
|
|
925
|
+
evidence: [
|
|
926
|
+
"Matching system registry entry exists in TopoloDocs",
|
|
927
|
+
"Internal handbook coverage exists for the system",
|
|
928
|
+
"npm run validate passes in TopoloDocs when docs are touched"
|
|
929
|
+
],
|
|
930
|
+
implementation: [
|
|
931
|
+
"Read the matching TopoloDocs system entry before coding",
|
|
932
|
+
"Update docs in the same change when behavior, API, auth, data ownership, deployment, or operations change",
|
|
933
|
+
"Update last_verified dates on touched canonical pages"
|
|
934
|
+
]
|
|
935
|
+
},
|
|
936
|
+
{
|
|
937
|
+
id: "shared-auth-boundary",
|
|
938
|
+
title: "Use the shared Topolo auth boundary",
|
|
939
|
+
summary: "Applications must derive identity, organization, scopes, and service entitlement from TopoloAuth rather than inventing parallel auth state.",
|
|
940
|
+
appliesTo: ["browser", "api", "tooling", "agent_surface"],
|
|
941
|
+
evidence: [
|
|
942
|
+
"@topolo/auth-client or @topolo/auth-middleware is used where applicable",
|
|
943
|
+
"No public command, tool, or SDK method accepts orgId",
|
|
944
|
+
"Service slug and Auth service registration are documented for protected services"
|
|
945
|
+
],
|
|
946
|
+
implementation: [
|
|
947
|
+
"Use shared auth packages instead of copying token parsing or browser storage flows",
|
|
948
|
+
"Derive organization from the credential on every request",
|
|
949
|
+
"Route OAuth, refresh, logout, and SSO paths according to the shared Auth contract"
|
|
950
|
+
]
|
|
951
|
+
},
|
|
952
|
+
{
|
|
953
|
+
id: "shared-shell-and-launcher",
|
|
954
|
+
title: "Use the shared shell, launcher, and account menu",
|
|
955
|
+
summary: "Browser applications should feel like one platform and should not create isolated navigation or account surfaces.",
|
|
956
|
+
appliesTo: ["browser"],
|
|
957
|
+
evidence: [
|
|
958
|
+
"@topolo/ui-kit is used for the platform shell where the app has authenticated UI",
|
|
959
|
+
"The shared launcher/app switcher is reachable from authenticated app chrome",
|
|
960
|
+
"Account menu and sign-out behavior use the shared platform affordance"
|
|
961
|
+
],
|
|
962
|
+
implementation: [
|
|
963
|
+
"Use TopoloShell or the current shared shell contract for authenticated app layouts",
|
|
964
|
+
"Use shared design tokens and platform UI primitives before creating local equivalents",
|
|
965
|
+
"Keep mobile and desktop shell behavior aligned with the platform UI kit"
|
|
966
|
+
]
|
|
967
|
+
},
|
|
968
|
+
{
|
|
969
|
+
id: "service-registration-and-scopes",
|
|
970
|
+
title: "Register protected APIs as platform services",
|
|
971
|
+
summary: "Callable app APIs need a stable service ID, service slug, permissions, role bundles, and API-key scopes before agents or users rely on them.",
|
|
972
|
+
appliesTo: ["api"],
|
|
973
|
+
evidence: [
|
|
974
|
+
"Auth service catalog contains the service ID and slug",
|
|
975
|
+
"Permissions, role bundles, and API-key scopes exist for the service",
|
|
976
|
+
"SDK, CLI, and MCP service discovery include the callable production API"
|
|
977
|
+
],
|
|
978
|
+
implementation: [
|
|
979
|
+
"Add production Worker api_url metadata before adding an SDK service ID",
|
|
980
|
+
"Expose stable service IDs through DEFAULT_SERVICE_URLS",
|
|
981
|
+
"Keep typed SDK/CLI/MCP surfaces in sync when an API contract stabilizes"
|
|
982
|
+
]
|
|
983
|
+
},
|
|
984
|
+
{
|
|
985
|
+
id: "organization-scoped-data",
|
|
986
|
+
title: "Keep application data organization-scoped",
|
|
987
|
+
summary: "Protected data access must be scoped by the authenticated organization at the backend boundary, not by client-provided hints.",
|
|
988
|
+
appliesTo: ["api"],
|
|
989
|
+
evidence: [
|
|
990
|
+
"Backend request handlers derive org membership from credential validation",
|
|
991
|
+
"Queries and Durable Object keys include the authenticated organization boundary where data is tenant-owned",
|
|
992
|
+
"MCP and CLI inputs do not include orgId overrides"
|
|
993
|
+
],
|
|
994
|
+
implementation: [
|
|
995
|
+
"Reject or ignore organization hints supplied by clients",
|
|
996
|
+
"Bind SQL, KV, R2, queue, and Durable Object access to the authenticated organization",
|
|
997
|
+
"Document service-local exceptions explicitly in the system security assurance record"
|
|
998
|
+
]
|
|
999
|
+
},
|
|
1000
|
+
{
|
|
1001
|
+
id: "cloudflare-deployment-contract",
|
|
1002
|
+
title: "Keep Cloudflare deployment metadata complete",
|
|
1003
|
+
summary: "Workers, Pages, bindings, routes, env vars, queues, cron triggers, and deployment commands must be discoverable through CloudControl metadata.",
|
|
1004
|
+
appliesTo: ["browser", "api"],
|
|
1005
|
+
evidence: [
|
|
1006
|
+
"topolo.cloudcontrol.json lists production deploy targets and URLs",
|
|
1007
|
+
"Wrangler/Pages configuration matches CloudControl metadata",
|
|
1008
|
+
"Secrets and environment variables are not committed"
|
|
1009
|
+
],
|
|
1010
|
+
implementation: [
|
|
1011
|
+
"Update CloudControl metadata whenever deployment topology changes",
|
|
1012
|
+
"Prefer Cloudflare-native runtime surfaces for new Topolo app infrastructure",
|
|
1013
|
+
"Keep Worker bindings and Pages domains explicit enough for agents to inspect before deploying"
|
|
1014
|
+
]
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
id: "agent-and-operator-surfaces",
|
|
1018
|
+
title: "Expose agent-safe operations through SDK, CLI, and MCP",
|
|
1019
|
+
summary: "Agent-accessible functionality should be discoverable, scope-gated, and write-confirmed instead of hidden behind ad hoc HTTP calls.",
|
|
1020
|
+
appliesTo: ["api", "tooling", "agent_surface"],
|
|
1021
|
+
evidence: [
|
|
1022
|
+
"Read operations have typed SDK/CLI/MCP surfaces once their contract stabilizes",
|
|
1023
|
+
"Mutating generic calls require --confirm or confirm:true",
|
|
1024
|
+
"MCP tools never accept orgId and advertise only appropriate scope-gated tools"
|
|
1025
|
+
],
|
|
1026
|
+
implementation: [
|
|
1027
|
+
"Add SDK types first, then CLI commands and MCP tools for durable workflows",
|
|
1028
|
+
"Use generic API passthrough only as a temporary escape hatch",
|
|
1029
|
+
"Keep command output JSON-stable for agents and human-readable with --no-json"
|
|
1030
|
+
]
|
|
1031
|
+
},
|
|
1032
|
+
{
|
|
1033
|
+
id: "observability-and-audit",
|
|
1034
|
+
title: "Emit platform audit and debugging signals",
|
|
1035
|
+
summary: "Requests, agent actions, and operational workflows need traceable IDs, client labels, and useful failure evidence.",
|
|
1036
|
+
appliesTo: ["api", "tooling", "agent_surface"],
|
|
1037
|
+
evidence: [
|
|
1038
|
+
"Requests carry X-Topolo-Client and X-Topolo-Request-Id where the SDK is involved",
|
|
1039
|
+
"Agent-originated calls can include X-Topolo-Agent",
|
|
1040
|
+
"Failure modes are documented with request IDs or deployment/log lookup paths"
|
|
1041
|
+
],
|
|
1042
|
+
implementation: [
|
|
1043
|
+
"Use TopoloClient for platform API calls rather than raw fetch where practical",
|
|
1044
|
+
"Keep logs free of secrets and tokens",
|
|
1045
|
+
"Document live smoke commands and request-id correlation in canonical docs"
|
|
1046
|
+
]
|
|
1047
|
+
},
|
|
1048
|
+
{
|
|
1049
|
+
id: "verification-gates",
|
|
1050
|
+
title: "Ship with build, test, docs, and smoke verification",
|
|
1051
|
+
summary: "A Topolo app change is not complete until the relevant code checks and docs checks have been run or explicitly reported as blocked.",
|
|
1052
|
+
appliesTo: ["all"],
|
|
1053
|
+
evidence: [
|
|
1054
|
+
"Relevant package build/typecheck/test commands pass",
|
|
1055
|
+
"TopoloDocs validation passes when docs are touched",
|
|
1056
|
+
"Live or local smoke evidence is captured for user-visible or API behavior"
|
|
1057
|
+
],
|
|
1058
|
+
implementation: [
|
|
1059
|
+
"Prefer existing package scripts before adding new tooling",
|
|
1060
|
+
"Run app-specific checks and shared docs validation for behavior changes",
|
|
1061
|
+
"Report any skipped verification with the blocker and residual risk"
|
|
1062
|
+
]
|
|
1063
|
+
}
|
|
1064
|
+
];
|
|
1065
|
+
function applicationRequirementScopes(application) {
|
|
1066
|
+
const scopes = /* @__PURE__ */ new Set(["all"]);
|
|
1067
|
+
const hasBrowserSurface = Boolean(application.productionUrl) || application.deployTargets.some((target) => target.kind === "pages");
|
|
1068
|
+
const hasApiSurface = application.services.length > 0 || application.deployTargets.some((target) => Boolean(target.apiUrl));
|
|
1069
|
+
if (hasBrowserSurface) scopes.add("browser");
|
|
1070
|
+
if (hasApiSurface) scopes.add("api");
|
|
1071
|
+
if (application.id === "cli" || application.id === "mcp" || application.id === "cloudcontrol") {
|
|
1072
|
+
scopes.add("tooling");
|
|
1073
|
+
}
|
|
1074
|
+
if (application.id === "cli" || application.id === "mcp" || hasApiSurface) {
|
|
1075
|
+
scopes.add("agent_surface");
|
|
1076
|
+
}
|
|
1077
|
+
return Array.from(scopes);
|
|
1078
|
+
}
|
|
1079
|
+
function requirementsForApplication(applicationOrId) {
|
|
1080
|
+
const application = typeof applicationOrId === "string" ? APPLICATIONS[applicationOrId] : applicationOrId;
|
|
1081
|
+
const scopes = new Set(applicationRequirementScopes(application));
|
|
1082
|
+
return APPLICATION_REQUIREMENTS.filter(
|
|
1083
|
+
(requirement) => requirement.appliesTo.some((scope) => scopes.has(scope))
|
|
1084
|
+
);
|
|
1085
|
+
}
|
|
1086
|
+
function auditApplicationRequirements(applicationOrId) {
|
|
1087
|
+
const application = typeof applicationOrId === "string" ? APPLICATIONS[applicationOrId] : applicationOrId;
|
|
1088
|
+
const scopes = applicationRequirementScopes(application);
|
|
1089
|
+
const findings = requirementsForApplication(application).map(
|
|
1090
|
+
(requirement) => evaluateRequirement(application, requirement)
|
|
1091
|
+
);
|
|
1092
|
+
return {
|
|
1093
|
+
version: APPLICATION_REQUIREMENTS_VERSION,
|
|
1094
|
+
application,
|
|
1095
|
+
scopes,
|
|
1096
|
+
score: scoreFindings(findings),
|
|
1097
|
+
findings
|
|
1098
|
+
};
|
|
1099
|
+
}
|
|
1100
|
+
function auditAllApplicationRequirements(applicationIds = Object.keys(APPLICATIONS).sort()) {
|
|
1101
|
+
const applications = applicationIds.map(
|
|
1102
|
+
(applicationId) => auditApplicationRequirements(applicationId)
|
|
1103
|
+
);
|
|
1104
|
+
const migrationQueue = applications.flatMap(
|
|
1105
|
+
(audit) => audit.findings.filter((finding2) => finding2.status !== "met").map((finding2) => ({
|
|
1106
|
+
applicationId: audit.application.id,
|
|
1107
|
+
applicationName: audit.application.name,
|
|
1108
|
+
requirementId: finding2.requirementId,
|
|
1109
|
+
title: finding2.title,
|
|
1110
|
+
status: finding2.status,
|
|
1111
|
+
reason: finding2.reason,
|
|
1112
|
+
nextActions: finding2.nextActions
|
|
1113
|
+
}))
|
|
1114
|
+
).sort((a, b) => {
|
|
1115
|
+
const statusOrder = statusRank(a.status) - statusRank(b.status);
|
|
1116
|
+
if (statusOrder !== 0) return statusOrder;
|
|
1117
|
+
const appOrder = a.applicationId.localeCompare(b.applicationId);
|
|
1118
|
+
if (appOrder !== 0) return appOrder;
|
|
1119
|
+
return a.requirementId.localeCompare(b.requirementId);
|
|
1120
|
+
});
|
|
1121
|
+
return {
|
|
1122
|
+
version: APPLICATION_REQUIREMENTS_VERSION,
|
|
1123
|
+
applications,
|
|
1124
|
+
migrationQueue
|
|
1125
|
+
};
|
|
1126
|
+
}
|
|
1127
|
+
function evaluateRequirement(application, requirement) {
|
|
1128
|
+
const evidence = [];
|
|
1129
|
+
switch (requirement.id) {
|
|
1130
|
+
case "platform-metadata": {
|
|
1131
|
+
if (application.packageName) evidence.push(`package=${application.packageName}`);
|
|
1132
|
+
if (application.productionUrl) evidence.push(`productionUrl=${application.productionUrl}`);
|
|
1133
|
+
if (application.deployTargets.length > 0) {
|
|
1134
|
+
evidence.push(`deployTargets=${application.deployTargets.length}`);
|
|
1135
|
+
}
|
|
1136
|
+
if (application.services.length > 0) {
|
|
1137
|
+
evidence.push(`services=${application.services.join(",")}`);
|
|
1138
|
+
}
|
|
1139
|
+
if (evidence.length === 0) {
|
|
1140
|
+
return finding(requirement, "missing", "No package, production URL, deploy target, or service metadata is available.", evidence);
|
|
1141
|
+
}
|
|
1142
|
+
return finding(requirement, "met", "Catalog metadata exists for this application.", evidence);
|
|
1143
|
+
}
|
|
1144
|
+
case "canonical-docs":
|
|
1145
|
+
return finding(
|
|
1146
|
+
requirement,
|
|
1147
|
+
"needs_review",
|
|
1148
|
+
"Catalog metadata cannot verify matching TopoloDocs system and handbook coverage.",
|
|
1149
|
+
evidence
|
|
1150
|
+
);
|
|
1151
|
+
case "shared-auth-boundary":
|
|
1152
|
+
return finding(
|
|
1153
|
+
requirement,
|
|
1154
|
+
"needs_review",
|
|
1155
|
+
"Catalog metadata cannot verify that implementation uses shared Topolo auth packages and derives org from credentials.",
|
|
1156
|
+
evidence
|
|
1157
|
+
);
|
|
1158
|
+
case "shared-shell-and-launcher":
|
|
1159
|
+
return finding(
|
|
1160
|
+
requirement,
|
|
1161
|
+
"needs_review",
|
|
1162
|
+
"Catalog metadata cannot verify shared shell, launcher, and account menu adoption.",
|
|
1163
|
+
evidence
|
|
1164
|
+
);
|
|
1165
|
+
case "service-registration-and-scopes": {
|
|
1166
|
+
if (application.services.length > 0) {
|
|
1167
|
+
evidence.push(`services=${application.services.join(",")}`);
|
|
1168
|
+
return finding(
|
|
1169
|
+
requirement,
|
|
1170
|
+
"partial",
|
|
1171
|
+
"SDK service discovery exists, but Auth catalog permissions, role bundles, and API-key scopes still need confirmation.",
|
|
1172
|
+
evidence
|
|
1173
|
+
);
|
|
1174
|
+
}
|
|
1175
|
+
return finding(requirement, "missing", "No SDK service ID is registered for this callable API surface.", evidence);
|
|
1176
|
+
}
|
|
1177
|
+
case "organization-scoped-data":
|
|
1178
|
+
return finding(
|
|
1179
|
+
requirement,
|
|
1180
|
+
"needs_review",
|
|
1181
|
+
"Catalog metadata cannot verify backend tenant filters, storage keys, or Durable Object boundaries.",
|
|
1182
|
+
evidence
|
|
1183
|
+
);
|
|
1184
|
+
case "cloudflare-deployment-contract": {
|
|
1185
|
+
if (application.deployTargets.length === 0) {
|
|
1186
|
+
return finding(requirement, "missing", "No CloudControl deploy targets are registered.", evidence);
|
|
1187
|
+
}
|
|
1188
|
+
evidence.push(`deployTargets=${application.deployTargets.length}`);
|
|
1189
|
+
if (application.productionUrl) evidence.push(`productionUrl=${application.productionUrl}`);
|
|
1190
|
+
return finding(requirement, "met", "CloudControl deploy target metadata is present.", evidence);
|
|
1191
|
+
}
|
|
1192
|
+
case "agent-and-operator-surfaces": {
|
|
1193
|
+
if (application.services.length > 0) {
|
|
1194
|
+
evidence.push(`services=${application.services.join(",")}`);
|
|
1195
|
+
return finding(requirement, "partial", "SDK service discovery exists; typed SDK/CLI/MCP workflow coverage should be checked as APIs stabilize.", evidence);
|
|
1196
|
+
}
|
|
1197
|
+
if (application.id === "cli" || application.id === "mcp" || application.id === "cloudcontrol") {
|
|
1198
|
+
evidence.push(`tooling=${application.id}`);
|
|
1199
|
+
return finding(requirement, "met", "This application is itself an agent/operator surface.", evidence);
|
|
1200
|
+
}
|
|
1201
|
+
return finding(requirement, "missing", "No SDK service or tooling surface is registered.", evidence);
|
|
1202
|
+
}
|
|
1203
|
+
case "observability-and-audit":
|
|
1204
|
+
return finding(
|
|
1205
|
+
requirement,
|
|
1206
|
+
"needs_review",
|
|
1207
|
+
"Catalog metadata cannot verify runtime request IDs, client labels, or log redaction.",
|
|
1208
|
+
evidence
|
|
1209
|
+
);
|
|
1210
|
+
case "verification-gates":
|
|
1211
|
+
return finding(
|
|
1212
|
+
requirement,
|
|
1213
|
+
"needs_review",
|
|
1214
|
+
"Catalog metadata cannot verify package checks, docs validation, or smoke evidence.",
|
|
1215
|
+
evidence
|
|
1216
|
+
);
|
|
1217
|
+
default:
|
|
1218
|
+
return finding(requirement, "needs_review", "No automated evaluator exists for this requirement yet.", evidence);
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
function finding(requirement, status, reason, evidence) {
|
|
1222
|
+
return {
|
|
1223
|
+
requirementId: requirement.id,
|
|
1224
|
+
title: requirement.title,
|
|
1225
|
+
status,
|
|
1226
|
+
reason,
|
|
1227
|
+
evidence,
|
|
1228
|
+
nextActions: status === "met" ? [] : requirement.implementation
|
|
1229
|
+
};
|
|
1230
|
+
}
|
|
1231
|
+
function scoreFindings(findings) {
|
|
1232
|
+
const met = findings.filter((finding2) => finding2.status === "met").length;
|
|
1233
|
+
const partial = findings.filter((finding2) => finding2.status === "partial").length;
|
|
1234
|
+
const missing = findings.filter((finding2) => finding2.status === "missing").length;
|
|
1235
|
+
const needsReview = findings.filter((finding2) => finding2.status === "needs_review").length;
|
|
1236
|
+
const total = findings.length;
|
|
1237
|
+
const weighted = met + partial * 0.5;
|
|
1238
|
+
return {
|
|
1239
|
+
met,
|
|
1240
|
+
partial,
|
|
1241
|
+
missing,
|
|
1242
|
+
needsReview,
|
|
1243
|
+
total,
|
|
1244
|
+
percent: total === 0 ? 100 : Math.round(weighted / total * 100)
|
|
1245
|
+
};
|
|
1246
|
+
}
|
|
1247
|
+
function statusRank(status) {
|
|
1248
|
+
if (status === "missing") return 0;
|
|
1249
|
+
if (status === "partial") return 1;
|
|
1250
|
+
return 2;
|
|
1251
|
+
}
|
|
88
1252
|
var DEFAULT_SERVICE_URLS = SERVICES;
|
|
89
1253
|
function resolveServiceUrl(service, overrides) {
|
|
90
1254
|
const override = overrides?.[service];
|
|
@@ -414,6 +1578,7 @@ function splitService(servicePart) {
|
|
|
414
1578
|
}
|
|
415
1579
|
|
|
416
1580
|
// src/tools.ts
|
|
1581
|
+
var APPLICATION_IDS = Object.keys(APPLICATIONS).sort();
|
|
417
1582
|
var SERVICE_IDS = Object.keys(DEFAULT_SERVICE_URLS).sort();
|
|
418
1583
|
var HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
|
|
419
1584
|
var TOOLS = [
|
|
@@ -450,6 +1615,133 @@ var TOOLS = [
|
|
|
450
1615
|
return { services };
|
|
451
1616
|
}
|
|
452
1617
|
},
|
|
1618
|
+
{
|
|
1619
|
+
name: "topolo_list_applications",
|
|
1620
|
+
title: "List every Topolo platform application",
|
|
1621
|
+
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.",
|
|
1622
|
+
requiredScopes: [],
|
|
1623
|
+
destructive: false,
|
|
1624
|
+
inputSchema: {
|
|
1625
|
+
type: "object",
|
|
1626
|
+
properties: {},
|
|
1627
|
+
additionalProperties: false
|
|
1628
|
+
},
|
|
1629
|
+
handler: async () => ({
|
|
1630
|
+
applications: APPLICATION_IDS.map((id) => APPLICATIONS[id])
|
|
1631
|
+
})
|
|
1632
|
+
},
|
|
1633
|
+
{
|
|
1634
|
+
name: "topolo_get_application",
|
|
1635
|
+
title: "Describe one Topolo platform application",
|
|
1636
|
+
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.",
|
|
1637
|
+
requiredScopes: [],
|
|
1638
|
+
destructive: false,
|
|
1639
|
+
inputSchema: {
|
|
1640
|
+
type: "object",
|
|
1641
|
+
properties: {
|
|
1642
|
+
application: {
|
|
1643
|
+
type: "string",
|
|
1644
|
+
enum: APPLICATION_IDS,
|
|
1645
|
+
description: "Application ID from topolo_list_applications."
|
|
1646
|
+
}
|
|
1647
|
+
},
|
|
1648
|
+
required: ["application"],
|
|
1649
|
+
additionalProperties: false
|
|
1650
|
+
},
|
|
1651
|
+
handler: async (_topolo, args) => {
|
|
1652
|
+
const application = args["application"];
|
|
1653
|
+
if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
|
|
1654
|
+
throw new Error(
|
|
1655
|
+
`Unknown application "${String(application)}". Known: ${APPLICATION_IDS.join(", ")}`
|
|
1656
|
+
);
|
|
1657
|
+
}
|
|
1658
|
+
return { application: APPLICATIONS[application] };
|
|
1659
|
+
}
|
|
1660
|
+
},
|
|
1661
|
+
{
|
|
1662
|
+
name: "topolo_list_application_requirements",
|
|
1663
|
+
title: "List Topolo application build requirements",
|
|
1664
|
+
description: "Returns the current versioned Topolo application-build contract, optionally filtered to one application. Use this before creating or expanding a Topolo app so the agent follows shared metadata, docs, auth, shell, service registration, deployment, observability, and verification requirements.",
|
|
1665
|
+
requiredScopes: [],
|
|
1666
|
+
destructive: false,
|
|
1667
|
+
inputSchema: {
|
|
1668
|
+
type: "object",
|
|
1669
|
+
properties: {
|
|
1670
|
+
application: {
|
|
1671
|
+
type: "string",
|
|
1672
|
+
enum: APPLICATION_IDS,
|
|
1673
|
+
description: "Optional application ID from topolo_list_applications."
|
|
1674
|
+
}
|
|
1675
|
+
},
|
|
1676
|
+
additionalProperties: false
|
|
1677
|
+
},
|
|
1678
|
+
handler: async (_topolo, args) => {
|
|
1679
|
+
const application = args["application"];
|
|
1680
|
+
if (application === void 0) {
|
|
1681
|
+
return {
|
|
1682
|
+
version: APPLICATION_REQUIREMENTS_VERSION,
|
|
1683
|
+
application: null,
|
|
1684
|
+
scopes: ["all", "browser", "api", "tooling", "agent_surface"],
|
|
1685
|
+
requirements: APPLICATION_REQUIREMENTS
|
|
1686
|
+
};
|
|
1687
|
+
}
|
|
1688
|
+
if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
|
|
1689
|
+
throw new Error(
|
|
1690
|
+
`Unknown application "${String(application)}". Known: ${APPLICATION_IDS.join(", ")}`
|
|
1691
|
+
);
|
|
1692
|
+
}
|
|
1693
|
+
const app = APPLICATIONS[application];
|
|
1694
|
+
return {
|
|
1695
|
+
version: APPLICATION_REQUIREMENTS_VERSION,
|
|
1696
|
+
application: app,
|
|
1697
|
+
scopes: applicationRequirementScopes(app),
|
|
1698
|
+
requirements: requirementsForApplication(app)
|
|
1699
|
+
};
|
|
1700
|
+
}
|
|
1701
|
+
},
|
|
1702
|
+
{
|
|
1703
|
+
name: "topolo_audit_applications",
|
|
1704
|
+
title: "Audit Topolo applications against platform requirements",
|
|
1705
|
+
description: "Returns catalog-backed conformance scores and migration-queue items for all Topolo apps, or one application when provided. Use this to see which shared platform requirements need implementation, verification, or deeper review.",
|
|
1706
|
+
requiredScopes: [],
|
|
1707
|
+
destructive: false,
|
|
1708
|
+
inputSchema: {
|
|
1709
|
+
type: "object",
|
|
1710
|
+
properties: {
|
|
1711
|
+
application: {
|
|
1712
|
+
type: "string",
|
|
1713
|
+
enum: APPLICATION_IDS,
|
|
1714
|
+
description: "Optional application ID from topolo_list_applications."
|
|
1715
|
+
},
|
|
1716
|
+
failOn: {
|
|
1717
|
+
type: "string",
|
|
1718
|
+
enum: ["missing", "needs_review", "partial"],
|
|
1719
|
+
description: "Optional conformance gate. Returns conformanceGate.passed=false when findings at this severity or worse exist."
|
|
1720
|
+
}
|
|
1721
|
+
},
|
|
1722
|
+
additionalProperties: false
|
|
1723
|
+
},
|
|
1724
|
+
handler: async (_topolo, args) => {
|
|
1725
|
+
const application = args["application"];
|
|
1726
|
+
const failOn = args["failOn"];
|
|
1727
|
+
if (failOn !== void 0 && typeof failOn !== "string") {
|
|
1728
|
+
throw new Error("failOn must be one of: missing, needs_review, partial");
|
|
1729
|
+
}
|
|
1730
|
+
const gate = failOn ? normalizeFailOn(failOn) : null;
|
|
1731
|
+
let report;
|
|
1732
|
+
if (application === void 0) {
|
|
1733
|
+
report = auditAllApplicationRequirements();
|
|
1734
|
+
return gate ? { ...report, conformanceGate: evaluateApplicationAuditGate(report, gate) } : report;
|
|
1735
|
+
}
|
|
1736
|
+
if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
|
|
1737
|
+
throw new Error(
|
|
1738
|
+
`Unknown application "${String(application)}". Known: ${APPLICATION_IDS.join(", ")}`
|
|
1739
|
+
);
|
|
1740
|
+
}
|
|
1741
|
+
report = auditAllApplicationRequirements([application]);
|
|
1742
|
+
return gate ? { ...report, conformanceGate: evaluateApplicationAuditGate(report, gate) } : report;
|
|
1743
|
+
}
|
|
1744
|
+
},
|
|
453
1745
|
{
|
|
454
1746
|
name: "topolo_crm_list_contacts",
|
|
455
1747
|
title: "List CRM contacts",
|
|
@@ -570,9 +1862,45 @@ var TOOLS = [
|
|
|
570
1862
|
function filterToolsByScopes(tools, scopes) {
|
|
571
1863
|
return tools.filter((t) => hasAnyScope(scopes, t.requiredScopes));
|
|
572
1864
|
}
|
|
1865
|
+
function evaluateApplicationAuditGate(report, threshold) {
|
|
1866
|
+
const counts = {
|
|
1867
|
+
met: 0,
|
|
1868
|
+
partial: 0,
|
|
1869
|
+
missing: 0,
|
|
1870
|
+
needs_review: 0
|
|
1871
|
+
};
|
|
1872
|
+
for (const audit of report.applications) {
|
|
1873
|
+
for (const finding2 of audit.findings) {
|
|
1874
|
+
counts[finding2.status] += 1;
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
const failingFindings = statusesAtOrWorse(threshold).reduce(
|
|
1878
|
+
(total, status) => total + counts[status],
|
|
1879
|
+
0
|
|
1880
|
+
);
|
|
1881
|
+
return {
|
|
1882
|
+
threshold,
|
|
1883
|
+
passed: failingFindings === 0,
|
|
1884
|
+
message: failingFindings === 0 ? `No findings at or above ${threshold}.` : `${failingFindings} finding(s) at or above ${threshold}.`,
|
|
1885
|
+
failingFindings,
|
|
1886
|
+
counts
|
|
1887
|
+
};
|
|
1888
|
+
}
|
|
1889
|
+
function normalizeFailOn(value) {
|
|
1890
|
+
const normalized = value.trim().toLowerCase().replace(/-/g, "_");
|
|
1891
|
+
if (normalized === "missing" || normalized === "needs_review" || normalized === "partial") {
|
|
1892
|
+
return normalized;
|
|
1893
|
+
}
|
|
1894
|
+
throw new Error("failOn must be one of: missing, needs_review, partial");
|
|
1895
|
+
}
|
|
1896
|
+
function statusesAtOrWorse(threshold) {
|
|
1897
|
+
if (threshold === "missing") return ["missing"];
|
|
1898
|
+
if (threshold === "needs_review") return ["missing", "needs_review"];
|
|
1899
|
+
return ["missing", "needs_review", "partial"];
|
|
1900
|
+
}
|
|
573
1901
|
|
|
574
1902
|
// src/version.ts
|
|
575
|
-
var MCP_VERSION = "0.2.
|
|
1903
|
+
var MCP_VERSION = "0.2.3";
|
|
576
1904
|
|
|
577
1905
|
// src/server.ts
|
|
578
1906
|
function buildServer(topolo, scopes, tools = TOOLS) {
|
package/package.json
CHANGED