@topline-build/harness-mcp 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2126 @@
1
+ # Build MCP runtime reference
2
+
3
+ > Generated from `src/index.ts#BUILD_MCP_TOOLS`. Do not edit this file by hand.
4
+
5
+ Package: `@topline-build/harness-mcp@0.5.0`
6
+ Transport: `stdio`
7
+ Default protocol: `2025-11-25`
8
+ Canonical guide: https://topline.build/docs/build-mcp-guide
9
+
10
+ ## Quick start
11
+
12
+ ```bash
13
+ npx -y @topline-build/harness-mcp --url https://YOUR-TOPLINE-HOST
14
+ ```
15
+
16
+ The first authenticated tool call normally opens browser approval. Set `TOPLINE_WORKSPACE_ROOT` when the MCP host starts outside the repository containing the artifact app.
17
+
18
+ ## Configuration
19
+
20
+ | CLI flag | Environment | Default | Purpose |
21
+ | --- | --- | --- | --- |
22
+ | `--url` | `TOPLINE_API_URL`, `PLATFORM_API_URL`, `OVERSITE_API_URL` | required | Topline tenant base URL. HTTPS is required except for loopback development. |
23
+ | `--workspace-root` | `TOPLINE_WORKSPACE_ROOT`, `PLATFORM_WORKSPACE_ROOT` | `current working directory` | Local root that contains artifact app directories. |
24
+ | `--surface` | `TOPLINE_MCP_SURFACE` | `build` | Build is the current surface; harness preserves legacy OAuth compatibility. |
25
+ | `--protocol-version` | `TOPLINE_MCP_PROTOCOL_VERSION`, `PLATFORM_MCP_PROTOCOL_VERSION` | `2025-11-25` | MCP protocol version sent to Topline HTTP endpoints. |
26
+ | `--auth-file` | `TOPLINE_MCP_AUTH_FILE`, `PLATFORM_MCP_AUTH_FILE` | `per-tenant file in the local Topline config directory` | OAuth credential cache. Keep it outside artifact app directories. |
27
+ | `--scopes` | `TOPLINE_MCP_SCOPES`, `PLATFORM_MCP_SCOPES` | `harness:artifact:read harness:artifact:write harness:artifact:deploy harness:artifact:delete` | Space- or comma-separated OAuth scopes. |
28
+ | `--timeout-ms` | `TOPLINE_MCP_TIMEOUT_MS`, `PLATFORM_MCP_TIMEOUT_MS`, `OVERSITE_MCP_TIMEOUT_MS` | `120000` | Positive request timeout in milliseconds. |
29
+ | `--token` | `TOPLINE_MCP_TOKEN`, `PLATFORM_MCP_TOKEN`, `OVERSITE_MCP_TOKEN` | `optional` | Advanced manual bearer-token fallback. Prefer browser-approved OAuth. |
30
+
31
+ ## Structured failures
32
+
33
+ Tool failures set `isError: true` and return `structuredContent.error` with `code`, `message`, `retryable`, and `recoveryAction`.
34
+
35
+ - `platform_harness_timeout` (retryable): Retry the call. For a deployment, use platform_list_artifact_drafts to recover the artifact and platform_wait_artifact_deploy to resume progress.
36
+ - `platform_mcp_tool_error` (not automatically retryable): Read the returned error code, correct the request or OAuth scopes, then retry.
37
+ - `artifact_deploy_wait_timeout` (retryable): Call platform_wait_artifact_deploy again with the same artifactId and operationId.
38
+ - `artifact_delete_plan_stale` (retryable): Call platform_plan_artifact_draft_delete again, review the new effects, and use its planToken.
39
+ - `artifact_app_bundle_changed_after_inspection` (retryable): Call platform_inspect_artifact_app again, review the new bundle hash, then retry deployment with that hash.
40
+ - `artifact_app_bundle_hardlink_forbidden` (not automatically retryable): Replace the hard link with a regular file copied into appDir, then inspect again.
41
+ - `artifact_app_auth_file_inside_app_dir` (not automatically retryable): Move TOPLINE_MCP_AUTH_FILE outside appDir, reconnect the Build MCP, then inspect again.
42
+ - `artifact_app_manifest_not_found` (not automatically retryable): Create artifact-app.json inside appDir, or correct appDir, then inspect again.
43
+ - `artifact_app_manifest_too_large` (not automatically retryable): Keep artifact-app.json below 512 KiB. Move application data and source into separate files, then inspect again.
44
+ - `scope_required` (not automatically retryable): Reconnect the Build MCP and approve the requested scope.
45
+ - `artifact_app_scaffold_target_not_empty` (not automatically retryable): Choose an empty appDir or deploy the existing app without scaffolding.
46
+
47
+ ## Tools
48
+
49
+ ### `platform_connection_check`
50
+
51
+ Complete the one-time Developer Access verification challenge for this Build MCP client.
52
+
53
+ Safety: read-only=false, destructive=false, idempotent=false, open-world=true.
54
+
55
+ Example request:
56
+
57
+ ```json
58
+ {
59
+ "verificationCode": "example-verification-code"
60
+ }
61
+ ```
62
+
63
+ Example success:
64
+
65
+ ```json
66
+ {
67
+ "ok": true,
68
+ "verified": true,
69
+ "product": "build",
70
+ "verifiedAt": "<verifiedAt>"
71
+ }
72
+ ```
73
+
74
+ Input schema:
75
+
76
+ ```json
77
+ {
78
+ "type": "object",
79
+ "properties": {
80
+ "verificationCode": {
81
+ "type": "string",
82
+ "minLength": 16,
83
+ "maxLength": 80
84
+ }
85
+ },
86
+ "required": [
87
+ "verificationCode"
88
+ ],
89
+ "additionalProperties": false
90
+ }
91
+ ```
92
+
93
+ Output schema:
94
+
95
+ ```json
96
+ {
97
+ "type": "object",
98
+ "oneOf": [
99
+ {
100
+ "type": "object",
101
+ "properties": {
102
+ "ok": {
103
+ "type": "boolean"
104
+ },
105
+ "verified": {
106
+ "type": "boolean"
107
+ },
108
+ "product": {
109
+ "type": "string",
110
+ "enum": [
111
+ "build"
112
+ ]
113
+ },
114
+ "verifiedAt": {
115
+ "type": "string"
116
+ }
117
+ },
118
+ "required": [
119
+ "ok",
120
+ "verified",
121
+ "product",
122
+ "verifiedAt"
123
+ ]
124
+ },
125
+ {
126
+ "type": "object",
127
+ "properties": {
128
+ "ok": {
129
+ "const": false
130
+ },
131
+ "error": {
132
+ "type": "object",
133
+ "properties": {
134
+ "code": {
135
+ "type": "string"
136
+ },
137
+ "message": {
138
+ "type": "string"
139
+ },
140
+ "retryable": {
141
+ "type": "boolean"
142
+ },
143
+ "recoveryAction": {
144
+ "type": "string"
145
+ }
146
+ },
147
+ "required": [
148
+ "code",
149
+ "message",
150
+ "retryable",
151
+ "recoveryAction"
152
+ ],
153
+ "additionalProperties": false
154
+ }
155
+ },
156
+ "required": [
157
+ "ok",
158
+ "error"
159
+ ],
160
+ "additionalProperties": false
161
+ }
162
+ ]
163
+ }
164
+ ```
165
+
166
+ ### `platform_init_artifact_app`
167
+
168
+ Create a minimal, validated artifact app starter inside the configured local workspace.
169
+
170
+ Safety: read-only=false, destructive=false, idempotent=false, open-world=false.
171
+
172
+ Example request:
173
+
174
+ ```json
175
+ {
176
+ "appDir": "artifact-apps/example-app"
177
+ }
178
+ ```
179
+
180
+ Example success:
181
+
182
+ ```json
183
+ {
184
+ "ok": true,
185
+ "appDir": "artifact-apps/example-app",
186
+ "manifestId": "example-app",
187
+ "title": "Example app",
188
+ "files": [],
189
+ "nextAction": "Follow the tool-provided next action."
190
+ }
191
+ ```
192
+
193
+ Input schema:
194
+
195
+ ```json
196
+ {
197
+ "type": "object",
198
+ "properties": {
199
+ "appDir": {
200
+ "type": "string",
201
+ "minLength": 1
202
+ },
203
+ "manifestId": {
204
+ "type": "string"
205
+ },
206
+ "title": {
207
+ "type": "string"
208
+ }
209
+ },
210
+ "required": [
211
+ "appDir"
212
+ ],
213
+ "additionalProperties": false
214
+ }
215
+ ```
216
+
217
+ Output schema:
218
+
219
+ ```json
220
+ {
221
+ "type": "object",
222
+ "oneOf": [
223
+ {
224
+ "type": "object",
225
+ "properties": {
226
+ "ok": {
227
+ "type": "boolean"
228
+ },
229
+ "appDir": {
230
+ "type": "string"
231
+ },
232
+ "manifestId": {
233
+ "type": "string"
234
+ },
235
+ "title": {
236
+ "type": "string"
237
+ },
238
+ "files": {
239
+ "type": "array",
240
+ "items": {
241
+ "type": "string"
242
+ }
243
+ },
244
+ "nextAction": {
245
+ "type": "string"
246
+ }
247
+ },
248
+ "required": [
249
+ "ok",
250
+ "appDir",
251
+ "manifestId",
252
+ "title",
253
+ "files",
254
+ "nextAction"
255
+ ]
256
+ },
257
+ {
258
+ "type": "object",
259
+ "properties": {
260
+ "ok": {
261
+ "const": false
262
+ },
263
+ "error": {
264
+ "type": "object",
265
+ "properties": {
266
+ "code": {
267
+ "type": "string"
268
+ },
269
+ "message": {
270
+ "type": "string"
271
+ },
272
+ "retryable": {
273
+ "type": "boolean"
274
+ },
275
+ "recoveryAction": {
276
+ "type": "string"
277
+ }
278
+ },
279
+ "required": [
280
+ "code",
281
+ "message",
282
+ "retryable",
283
+ "recoveryAction"
284
+ ],
285
+ "additionalProperties": false
286
+ }
287
+ },
288
+ "required": [
289
+ "ok",
290
+ "error"
291
+ ],
292
+ "additionalProperties": false
293
+ }
294
+ ]
295
+ }
296
+ ```
297
+
298
+ ### `platform_deploy_artifact_app`
299
+
300
+ Package a local artifact app directory, upload it, deploy a private draft, and return status.
301
+
302
+ Safety: read-only=false, destructive=false, idempotent=false, open-world=true.
303
+
304
+ Example request:
305
+
306
+ ```json
307
+ {
308
+ "appDir": "artifact-apps/example-app"
309
+ }
310
+ ```
311
+
312
+ Example success:
313
+
314
+ ```json
315
+ {
316
+ "ok": true,
317
+ "artifactId": "00000000-0000-4000-8000-000000000001",
318
+ "artifactVersionId": "00000000-0000-4000-8000-000000000002",
319
+ "clientRequestId": "example-request",
320
+ "operationId": "00000000-0000-4000-8000-000000000004",
321
+ "bundle": {},
322
+ "create": {},
323
+ "deploy": {}
324
+ }
325
+ ```
326
+
327
+ Input schema:
328
+
329
+ ```json
330
+ {
331
+ "type": "object",
332
+ "properties": {
333
+ "appDir": {
334
+ "type": "string",
335
+ "minLength": 1
336
+ },
337
+ "artifactId": {
338
+ "type": "string",
339
+ "format": "uuid"
340
+ },
341
+ "title": {
342
+ "type": "string"
343
+ },
344
+ "description": {
345
+ "type": "string"
346
+ },
347
+ "projectId": {
348
+ "type": "string",
349
+ "format": "uuid"
350
+ },
351
+ "expectedBundleSha256": {
352
+ "type": "string",
353
+ "pattern": "^[0-9a-fA-F]{64}$",
354
+ "description": "Optional SHA-256 from platform_inspect_artifact_app; deployment fails locally if source changed."
355
+ },
356
+ "requestId": {
357
+ "type": "string",
358
+ "minLength": 1,
359
+ "maxLength": 128,
360
+ "description": "Optional stable retry key; generated deterministically when omitted."
361
+ }
362
+ },
363
+ "required": [
364
+ "appDir"
365
+ ],
366
+ "additionalProperties": false
367
+ }
368
+ ```
369
+
370
+ Output schema:
371
+
372
+ ```json
373
+ {
374
+ "type": "object",
375
+ "oneOf": [
376
+ {
377
+ "type": "object",
378
+ "properties": {
379
+ "ok": {
380
+ "type": "boolean"
381
+ },
382
+ "artifactId": {
383
+ "type": "string"
384
+ },
385
+ "artifactVersionId": {
386
+ "type": "string"
387
+ },
388
+ "clientRequestId": {
389
+ "type": "string"
390
+ },
391
+ "operationId": {
392
+ "type": [
393
+ "string",
394
+ "null"
395
+ ]
396
+ },
397
+ "bundle": {
398
+ "type": "object"
399
+ },
400
+ "create": {
401
+ "type": "object"
402
+ },
403
+ "deploy": {
404
+ "type": "object"
405
+ }
406
+ },
407
+ "required": [
408
+ "ok",
409
+ "artifactId",
410
+ "artifactVersionId",
411
+ "clientRequestId",
412
+ "operationId",
413
+ "bundle",
414
+ "create",
415
+ "deploy"
416
+ ]
417
+ },
418
+ {
419
+ "type": "object",
420
+ "properties": {
421
+ "ok": {
422
+ "const": false
423
+ },
424
+ "error": {
425
+ "type": "object",
426
+ "properties": {
427
+ "code": {
428
+ "type": "string"
429
+ },
430
+ "message": {
431
+ "type": "string"
432
+ },
433
+ "retryable": {
434
+ "type": "boolean"
435
+ },
436
+ "recoveryAction": {
437
+ "type": "string"
438
+ }
439
+ },
440
+ "required": [
441
+ "code",
442
+ "message",
443
+ "retryable",
444
+ "recoveryAction"
445
+ ],
446
+ "additionalProperties": false
447
+ }
448
+ },
449
+ "required": [
450
+ "ok",
451
+ "error"
452
+ ],
453
+ "additionalProperties": false
454
+ }
455
+ ]
456
+ }
457
+ ```
458
+
459
+ ### `platform_inspect_artifact_app`
460
+
461
+ Inspect local artifact paths and package boundaries without authenticating, uploading, or creating a remote draft.
462
+
463
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=false.
464
+
465
+ Example request:
466
+
467
+ ```json
468
+ {
469
+ "appDir": "artifact-apps/example-app"
470
+ }
471
+ ```
472
+
473
+ Example success:
474
+
475
+ ```json
476
+ {
477
+ "ok": true,
478
+ "packageReady": true,
479
+ "serverManifestValidationRequired": true,
480
+ "appDir": "artifact-apps/example-app",
481
+ "platformAppDir": "<platformAppDir>",
482
+ "manifest": {},
483
+ "bundle": {},
484
+ "nextAction": "Follow the tool-provided next action."
485
+ }
486
+ ```
487
+
488
+ Input schema:
489
+
490
+ ```json
491
+ {
492
+ "type": "object",
493
+ "properties": {
494
+ "appDir": {
495
+ "type": "string",
496
+ "minLength": 1
497
+ }
498
+ },
499
+ "required": [
500
+ "appDir"
501
+ ],
502
+ "additionalProperties": false
503
+ }
504
+ ```
505
+
506
+ Output schema:
507
+
508
+ ```json
509
+ {
510
+ "type": "object",
511
+ "oneOf": [
512
+ {
513
+ "type": "object",
514
+ "properties": {
515
+ "ok": {
516
+ "type": "boolean"
517
+ },
518
+ "packageReady": {
519
+ "type": "boolean"
520
+ },
521
+ "serverManifestValidationRequired": {
522
+ "type": "boolean"
523
+ },
524
+ "appDir": {
525
+ "type": "string"
526
+ },
527
+ "platformAppDir": {
528
+ "type": "string"
529
+ },
530
+ "manifest": {
531
+ "type": "object"
532
+ },
533
+ "bundle": {
534
+ "type": "object"
535
+ },
536
+ "nextAction": {
537
+ "type": "string"
538
+ }
539
+ },
540
+ "required": [
541
+ "ok",
542
+ "packageReady",
543
+ "serverManifestValidationRequired",
544
+ "appDir",
545
+ "platformAppDir",
546
+ "manifest",
547
+ "bundle",
548
+ "nextAction"
549
+ ]
550
+ },
551
+ {
552
+ "type": "object",
553
+ "properties": {
554
+ "ok": {
555
+ "const": false
556
+ },
557
+ "error": {
558
+ "type": "object",
559
+ "properties": {
560
+ "code": {
561
+ "type": "string"
562
+ },
563
+ "message": {
564
+ "type": "string"
565
+ },
566
+ "retryable": {
567
+ "type": "boolean"
568
+ },
569
+ "recoveryAction": {
570
+ "type": "string"
571
+ }
572
+ },
573
+ "required": [
574
+ "code",
575
+ "message",
576
+ "retryable",
577
+ "recoveryAction"
578
+ ],
579
+ "additionalProperties": false
580
+ }
581
+ },
582
+ "required": [
583
+ "ok",
584
+ "error"
585
+ ],
586
+ "additionalProperties": false
587
+ }
588
+ ]
589
+ }
590
+ ```
591
+
592
+ ### `platform_list_build_workspaces`
593
+
594
+ List Topline workspaces available for artifact placement.
595
+
596
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=true.
597
+
598
+ Example request:
599
+
600
+ ```json
601
+ {}
602
+ ```
603
+
604
+ Example success:
605
+
606
+ ```json
607
+ {
608
+ "ok": true,
609
+ "workspaces": []
610
+ }
611
+ ```
612
+
613
+ Input schema:
614
+
615
+ ```json
616
+ {
617
+ "type": "object",
618
+ "properties": {},
619
+ "additionalProperties": false
620
+ }
621
+ ```
622
+
623
+ Output schema:
624
+
625
+ ```json
626
+ {
627
+ "type": "object",
628
+ "oneOf": [
629
+ {
630
+ "type": "object",
631
+ "properties": {
632
+ "ok": {
633
+ "type": "boolean"
634
+ },
635
+ "workspaces": {
636
+ "type": "array",
637
+ "items": {
638
+ "type": "object"
639
+ }
640
+ }
641
+ },
642
+ "required": [
643
+ "ok",
644
+ "workspaces"
645
+ ]
646
+ },
647
+ {
648
+ "type": "object",
649
+ "properties": {
650
+ "ok": {
651
+ "const": false
652
+ },
653
+ "error": {
654
+ "type": "object",
655
+ "properties": {
656
+ "code": {
657
+ "type": "string"
658
+ },
659
+ "message": {
660
+ "type": "string"
661
+ },
662
+ "retryable": {
663
+ "type": "boolean"
664
+ },
665
+ "recoveryAction": {
666
+ "type": "string"
667
+ }
668
+ },
669
+ "required": [
670
+ "code",
671
+ "message",
672
+ "retryable",
673
+ "recoveryAction"
674
+ ],
675
+ "additionalProperties": false
676
+ }
677
+ },
678
+ "required": [
679
+ "ok",
680
+ "error"
681
+ ],
682
+ "additionalProperties": false
683
+ }
684
+ ]
685
+ }
686
+ ```
687
+
688
+ ### `platform_list_artifact_drafts`
689
+
690
+ Discover private artifact drafts created through this Build MCP connection.
691
+
692
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=true.
693
+
694
+ Example request:
695
+
696
+ ```json
697
+ {}
698
+ ```
699
+
700
+ Example success:
701
+
702
+ ```json
703
+ {
704
+ "ok": true,
705
+ "drafts": []
706
+ }
707
+ ```
708
+
709
+ Input schema:
710
+
711
+ ```json
712
+ {
713
+ "type": "object",
714
+ "properties": {
715
+ "projectId": {
716
+ "type": "string",
717
+ "format": "uuid"
718
+ },
719
+ "limit": {
720
+ "type": "integer",
721
+ "minimum": 1,
722
+ "maximum": 100
723
+ }
724
+ },
725
+ "additionalProperties": false
726
+ }
727
+ ```
728
+
729
+ Output schema:
730
+
731
+ ```json
732
+ {
733
+ "type": "object",
734
+ "oneOf": [
735
+ {
736
+ "type": "object",
737
+ "properties": {
738
+ "ok": {
739
+ "type": "boolean"
740
+ },
741
+ "drafts": {
742
+ "type": "array",
743
+ "items": {
744
+ "type": "object"
745
+ }
746
+ }
747
+ },
748
+ "required": [
749
+ "ok",
750
+ "drafts"
751
+ ]
752
+ },
753
+ {
754
+ "type": "object",
755
+ "properties": {
756
+ "ok": {
757
+ "const": false
758
+ },
759
+ "error": {
760
+ "type": "object",
761
+ "properties": {
762
+ "code": {
763
+ "type": "string"
764
+ },
765
+ "message": {
766
+ "type": "string"
767
+ },
768
+ "retryable": {
769
+ "type": "boolean"
770
+ },
771
+ "recoveryAction": {
772
+ "type": "string"
773
+ }
774
+ },
775
+ "required": [
776
+ "code",
777
+ "message",
778
+ "retryable",
779
+ "recoveryAction"
780
+ ],
781
+ "additionalProperties": false
782
+ }
783
+ },
784
+ "required": [
785
+ "ok",
786
+ "error"
787
+ ],
788
+ "additionalProperties": false
789
+ }
790
+ ]
791
+ }
792
+ ```
793
+
794
+ ### `platform_deploy_operation`
795
+
796
+ Read durable server-side progress for one artifact deployment operation.
797
+
798
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=true.
799
+
800
+ Example request:
801
+
802
+ ```json
803
+ {
804
+ "artifactId": "00000000-0000-4000-8000-000000000001",
805
+ "operationId": "00000000-0000-4000-8000-000000000001"
806
+ }
807
+ ```
808
+
809
+ Example success:
810
+
811
+ ```json
812
+ {
813
+ "ok": true,
814
+ "phase": "<phase>",
815
+ "artifactId": "00000000-0000-4000-8000-000000000001",
816
+ "operationId": "00000000-0000-4000-8000-000000000004",
817
+ "taskStatus": "<taskStatus>",
818
+ "progress": 1,
819
+ "terminal": true,
820
+ "successful": true,
821
+ "events": []
822
+ }
823
+ ```
824
+
825
+ Input schema:
826
+
827
+ ```json
828
+ {
829
+ "type": "object",
830
+ "properties": {
831
+ "artifactId": {
832
+ "type": "string",
833
+ "format": "uuid"
834
+ },
835
+ "operationId": {
836
+ "type": "string",
837
+ "format": "uuid"
838
+ },
839
+ "afterSeq": {
840
+ "type": "integer",
841
+ "minimum": 0
842
+ }
843
+ },
844
+ "required": [
845
+ "artifactId",
846
+ "operationId"
847
+ ],
848
+ "additionalProperties": false
849
+ }
850
+ ```
851
+
852
+ Output schema:
853
+
854
+ ```json
855
+ {
856
+ "type": "object",
857
+ "oneOf": [
858
+ {
859
+ "type": "object",
860
+ "properties": {
861
+ "ok": {
862
+ "type": "boolean"
863
+ },
864
+ "phase": {
865
+ "type": "string"
866
+ },
867
+ "artifactId": {
868
+ "type": "string"
869
+ },
870
+ "operationId": {
871
+ "type": "string"
872
+ },
873
+ "taskStatus": {
874
+ "type": "string"
875
+ },
876
+ "progress": {
877
+ "type": "number"
878
+ },
879
+ "terminal": {
880
+ "type": "boolean"
881
+ },
882
+ "successful": {
883
+ "type": "boolean"
884
+ },
885
+ "events": {
886
+ "type": "array",
887
+ "items": {
888
+ "type": "object"
889
+ }
890
+ }
891
+ },
892
+ "required": [
893
+ "ok",
894
+ "phase",
895
+ "artifactId",
896
+ "operationId",
897
+ "taskStatus",
898
+ "progress",
899
+ "terminal",
900
+ "successful",
901
+ "events"
902
+ ]
903
+ },
904
+ {
905
+ "type": "object",
906
+ "properties": {
907
+ "ok": {
908
+ "const": false
909
+ },
910
+ "error": {
911
+ "type": "object",
912
+ "properties": {
913
+ "code": {
914
+ "type": "string"
915
+ },
916
+ "message": {
917
+ "type": "string"
918
+ },
919
+ "retryable": {
920
+ "type": "boolean"
921
+ },
922
+ "recoveryAction": {
923
+ "type": "string"
924
+ }
925
+ },
926
+ "required": [
927
+ "code",
928
+ "message",
929
+ "retryable",
930
+ "recoveryAction"
931
+ ],
932
+ "additionalProperties": false
933
+ }
934
+ },
935
+ "required": [
936
+ "ok",
937
+ "error"
938
+ ],
939
+ "additionalProperties": false
940
+ }
941
+ ]
942
+ }
943
+ ```
944
+
945
+ ### `platform_wait_artifact_deploy`
946
+
947
+ Wait for a durable deployment operation and stream server-derived progress.
948
+
949
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=true.
950
+
951
+ Example request:
952
+
953
+ ```json
954
+ {
955
+ "artifactId": "00000000-0000-4000-8000-000000000001",
956
+ "operationId": "00000000-0000-4000-8000-000000000001"
957
+ }
958
+ ```
959
+
960
+ Example success:
961
+
962
+ ```json
963
+ {
964
+ "ok": true,
965
+ "phase": "<phase>",
966
+ "artifactId": "00000000-0000-4000-8000-000000000001",
967
+ "operationId": "00000000-0000-4000-8000-000000000004",
968
+ "taskStatus": "<taskStatus>",
969
+ "progress": 1,
970
+ "terminal": true,
971
+ "successful": true,
972
+ "events": []
973
+ }
974
+ ```
975
+
976
+ Input schema:
977
+
978
+ ```json
979
+ {
980
+ "type": "object",
981
+ "properties": {
982
+ "artifactId": {
983
+ "type": "string",
984
+ "format": "uuid"
985
+ },
986
+ "operationId": {
987
+ "type": "string",
988
+ "format": "uuid"
989
+ },
990
+ "timeoutSeconds": {
991
+ "type": "integer",
992
+ "minimum": 1,
993
+ "maximum": 900
994
+ }
995
+ },
996
+ "required": [
997
+ "artifactId",
998
+ "operationId"
999
+ ],
1000
+ "additionalProperties": false
1001
+ }
1002
+ ```
1003
+
1004
+ Output schema:
1005
+
1006
+ ```json
1007
+ {
1008
+ "type": "object",
1009
+ "oneOf": [
1010
+ {
1011
+ "type": "object",
1012
+ "properties": {
1013
+ "ok": {
1014
+ "type": "boolean"
1015
+ },
1016
+ "phase": {
1017
+ "type": "string"
1018
+ },
1019
+ "artifactId": {
1020
+ "type": "string"
1021
+ },
1022
+ "operationId": {
1023
+ "type": "string"
1024
+ },
1025
+ "taskStatus": {
1026
+ "type": "string"
1027
+ },
1028
+ "progress": {
1029
+ "type": "number"
1030
+ },
1031
+ "terminal": {
1032
+ "type": "boolean"
1033
+ },
1034
+ "successful": {
1035
+ "type": "boolean"
1036
+ },
1037
+ "events": {
1038
+ "type": "array",
1039
+ "items": {
1040
+ "type": "object"
1041
+ }
1042
+ }
1043
+ },
1044
+ "required": [
1045
+ "ok",
1046
+ "phase",
1047
+ "artifactId",
1048
+ "operationId",
1049
+ "taskStatus",
1050
+ "progress",
1051
+ "terminal",
1052
+ "successful",
1053
+ "events"
1054
+ ]
1055
+ },
1056
+ {
1057
+ "type": "object",
1058
+ "properties": {
1059
+ "ok": {
1060
+ "const": false
1061
+ },
1062
+ "error": {
1063
+ "type": "object",
1064
+ "properties": {
1065
+ "code": {
1066
+ "type": "string"
1067
+ },
1068
+ "message": {
1069
+ "type": "string"
1070
+ },
1071
+ "retryable": {
1072
+ "type": "boolean"
1073
+ },
1074
+ "recoveryAction": {
1075
+ "type": "string"
1076
+ }
1077
+ },
1078
+ "required": [
1079
+ "code",
1080
+ "message",
1081
+ "retryable",
1082
+ "recoveryAction"
1083
+ ],
1084
+ "additionalProperties": false
1085
+ }
1086
+ },
1087
+ "required": [
1088
+ "ok",
1089
+ "error"
1090
+ ],
1091
+ "additionalProperties": false
1092
+ }
1093
+ ]
1094
+ }
1095
+ ```
1096
+
1097
+ ### `platform_artifact_status`
1098
+
1099
+ Read private draft deployment status for a hosted artifact app.
1100
+
1101
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=true.
1102
+
1103
+ Example request:
1104
+
1105
+ ```json
1106
+ {
1107
+ "artifactId": "00000000-0000-4000-8000-000000000001"
1108
+ }
1109
+ ```
1110
+
1111
+ Example success:
1112
+
1113
+ ```json
1114
+ {
1115
+ "ok": true,
1116
+ "phase": "<phase>",
1117
+ "artifactId": "00000000-0000-4000-8000-000000000001",
1118
+ "deployments": []
1119
+ }
1120
+ ```
1121
+
1122
+ Input schema:
1123
+
1124
+ ```json
1125
+ {
1126
+ "type": "object",
1127
+ "properties": {
1128
+ "artifactId": {
1129
+ "type": "string",
1130
+ "format": "uuid"
1131
+ },
1132
+ "limit": {
1133
+ "type": "integer",
1134
+ "minimum": 1,
1135
+ "maximum": 50
1136
+ }
1137
+ },
1138
+ "required": [
1139
+ "artifactId"
1140
+ ],
1141
+ "additionalProperties": false
1142
+ }
1143
+ ```
1144
+
1145
+ Output schema:
1146
+
1147
+ ```json
1148
+ {
1149
+ "type": "object",
1150
+ "oneOf": [
1151
+ {
1152
+ "type": "object",
1153
+ "properties": {
1154
+ "ok": {
1155
+ "type": "boolean"
1156
+ },
1157
+ "phase": {
1158
+ "type": "string"
1159
+ },
1160
+ "artifactId": {
1161
+ "type": "string"
1162
+ },
1163
+ "deployments": {
1164
+ "type": "array",
1165
+ "items": {
1166
+ "type": "object"
1167
+ }
1168
+ }
1169
+ },
1170
+ "required": [
1171
+ "ok",
1172
+ "phase",
1173
+ "artifactId",
1174
+ "deployments"
1175
+ ]
1176
+ },
1177
+ {
1178
+ "type": "object",
1179
+ "properties": {
1180
+ "ok": {
1181
+ "const": false
1182
+ },
1183
+ "error": {
1184
+ "type": "object",
1185
+ "properties": {
1186
+ "code": {
1187
+ "type": "string"
1188
+ },
1189
+ "message": {
1190
+ "type": "string"
1191
+ },
1192
+ "retryable": {
1193
+ "type": "boolean"
1194
+ },
1195
+ "recoveryAction": {
1196
+ "type": "string"
1197
+ }
1198
+ },
1199
+ "required": [
1200
+ "code",
1201
+ "message",
1202
+ "retryable",
1203
+ "recoveryAction"
1204
+ ],
1205
+ "additionalProperties": false
1206
+ }
1207
+ },
1208
+ "required": [
1209
+ "ok",
1210
+ "error"
1211
+ ],
1212
+ "additionalProperties": false
1213
+ }
1214
+ ]
1215
+ }
1216
+ ```
1217
+
1218
+ ### `platform_read_artifact_logs`
1219
+
1220
+ Read bounded, redacted deployment logs for a hosted artifact app.
1221
+
1222
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=true.
1223
+
1224
+ Example request:
1225
+
1226
+ ```json
1227
+ {
1228
+ "artifactId": "00000000-0000-4000-8000-000000000001"
1229
+ }
1230
+ ```
1231
+
1232
+ Example success:
1233
+
1234
+ ```json
1235
+ {
1236
+ "ok": true,
1237
+ "phase": "<phase>",
1238
+ "artifactId": "00000000-0000-4000-8000-000000000001"
1239
+ }
1240
+ ```
1241
+
1242
+ Input schema:
1243
+
1244
+ ```json
1245
+ {
1246
+ "type": "object",
1247
+ "properties": {
1248
+ "artifactId": {
1249
+ "type": "string",
1250
+ "format": "uuid"
1251
+ },
1252
+ "deploymentRecordId": {
1253
+ "type": "string",
1254
+ "format": "uuid"
1255
+ },
1256
+ "environment": {
1257
+ "type": "string",
1258
+ "enum": [
1259
+ "draft",
1260
+ "live"
1261
+ ]
1262
+ },
1263
+ "limit": {
1264
+ "type": "integer",
1265
+ "minimum": 1,
1266
+ "maximum": 200
1267
+ },
1268
+ "severity": {
1269
+ "type": "string"
1270
+ },
1271
+ "contains": {
1272
+ "type": "string"
1273
+ },
1274
+ "since": {
1275
+ "type": "string",
1276
+ "format": "date-time"
1277
+ },
1278
+ "windowMinutes": {
1279
+ "type": "integer",
1280
+ "minimum": 1,
1281
+ "maximum": 1440
1282
+ },
1283
+ "trace": {
1284
+ "type": "string"
1285
+ },
1286
+ "requestId": {
1287
+ "type": "string"
1288
+ },
1289
+ "route": {
1290
+ "type": "string"
1291
+ }
1292
+ },
1293
+ "required": [
1294
+ "artifactId"
1295
+ ],
1296
+ "additionalProperties": false
1297
+ }
1298
+ ```
1299
+
1300
+ Output schema:
1301
+
1302
+ ```json
1303
+ {
1304
+ "type": "object",
1305
+ "oneOf": [
1306
+ {
1307
+ "type": "object",
1308
+ "properties": {
1309
+ "ok": {
1310
+ "type": "boolean"
1311
+ },
1312
+ "phase": {
1313
+ "type": "string"
1314
+ },
1315
+ "artifactId": {
1316
+ "type": "string"
1317
+ },
1318
+ "entries": {
1319
+ "type": "array",
1320
+ "items": {
1321
+ "type": "object"
1322
+ }
1323
+ }
1324
+ },
1325
+ "required": [
1326
+ "ok",
1327
+ "phase",
1328
+ "artifactId"
1329
+ ]
1330
+ },
1331
+ {
1332
+ "type": "object",
1333
+ "properties": {
1334
+ "ok": {
1335
+ "const": false
1336
+ },
1337
+ "error": {
1338
+ "type": "object",
1339
+ "properties": {
1340
+ "code": {
1341
+ "type": "string"
1342
+ },
1343
+ "message": {
1344
+ "type": "string"
1345
+ },
1346
+ "retryable": {
1347
+ "type": "boolean"
1348
+ },
1349
+ "recoveryAction": {
1350
+ "type": "string"
1351
+ }
1352
+ },
1353
+ "required": [
1354
+ "code",
1355
+ "message",
1356
+ "retryable",
1357
+ "recoveryAction"
1358
+ ],
1359
+ "additionalProperties": false
1360
+ }
1361
+ },
1362
+ "required": [
1363
+ "ok",
1364
+ "error"
1365
+ ],
1366
+ "additionalProperties": false
1367
+ }
1368
+ ]
1369
+ }
1370
+ ```
1371
+
1372
+ ### `platform_open_artifact`
1373
+
1374
+ Return the operator URL and latest draft/live URLs for a hosted artifact app.
1375
+
1376
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=true.
1377
+
1378
+ Example request:
1379
+
1380
+ ```json
1381
+ {
1382
+ "artifactId": "00000000-0000-4000-8000-000000000001"
1383
+ }
1384
+ ```
1385
+
1386
+ Example success:
1387
+
1388
+ ```json
1389
+ {
1390
+ "ok": true,
1391
+ "artifactId": "00000000-0000-4000-8000-000000000001",
1392
+ "openUrl": "<openUrl>",
1393
+ "draftUrl": "<draftUrl>",
1394
+ "liveUrl": "<liveUrl>",
1395
+ "versionUrl": "<versionUrl>"
1396
+ }
1397
+ ```
1398
+
1399
+ Input schema:
1400
+
1401
+ ```json
1402
+ {
1403
+ "type": "object",
1404
+ "properties": {
1405
+ "artifactId": {
1406
+ "type": "string",
1407
+ "format": "uuid"
1408
+ }
1409
+ },
1410
+ "required": [
1411
+ "artifactId"
1412
+ ],
1413
+ "additionalProperties": false
1414
+ }
1415
+ ```
1416
+
1417
+ Output schema:
1418
+
1419
+ ```json
1420
+ {
1421
+ "type": "object",
1422
+ "oneOf": [
1423
+ {
1424
+ "type": "object",
1425
+ "properties": {
1426
+ "ok": {
1427
+ "type": "boolean"
1428
+ },
1429
+ "artifactId": {
1430
+ "type": "string"
1431
+ },
1432
+ "openUrl": {
1433
+ "type": "string"
1434
+ },
1435
+ "draftUrl": {
1436
+ "type": [
1437
+ "string",
1438
+ "null"
1439
+ ]
1440
+ },
1441
+ "liveUrl": {
1442
+ "type": [
1443
+ "string",
1444
+ "null"
1445
+ ]
1446
+ },
1447
+ "versionUrl": {
1448
+ "type": [
1449
+ "string",
1450
+ "null"
1451
+ ]
1452
+ }
1453
+ },
1454
+ "required": [
1455
+ "ok",
1456
+ "artifactId",
1457
+ "openUrl",
1458
+ "draftUrl",
1459
+ "liveUrl",
1460
+ "versionUrl"
1461
+ ]
1462
+ },
1463
+ {
1464
+ "type": "object",
1465
+ "properties": {
1466
+ "ok": {
1467
+ "const": false
1468
+ },
1469
+ "error": {
1470
+ "type": "object",
1471
+ "properties": {
1472
+ "code": {
1473
+ "type": "string"
1474
+ },
1475
+ "message": {
1476
+ "type": "string"
1477
+ },
1478
+ "retryable": {
1479
+ "type": "boolean"
1480
+ },
1481
+ "recoveryAction": {
1482
+ "type": "string"
1483
+ }
1484
+ },
1485
+ "required": [
1486
+ "code",
1487
+ "message",
1488
+ "retryable",
1489
+ "recoveryAction"
1490
+ ],
1491
+ "additionalProperties": false
1492
+ }
1493
+ },
1494
+ "required": [
1495
+ "ok",
1496
+ "error"
1497
+ ],
1498
+ "additionalProperties": false
1499
+ }
1500
+ ]
1501
+ }
1502
+ ```
1503
+
1504
+ ### `platform_storybook_access`
1505
+
1506
+ Return the tenant Storybook preview URL and HTTP MCP server config.
1507
+
1508
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=false.
1509
+
1510
+ Example request:
1511
+
1512
+ ```json
1513
+ {}
1514
+ ```
1515
+
1516
+ Example success:
1517
+
1518
+ ```json
1519
+ {
1520
+ "ok": true,
1521
+ "storybookUrl": "<storybookUrl>",
1522
+ "mcpUrl": "<mcpUrl>",
1523
+ "mcpServers": {}
1524
+ }
1525
+ ```
1526
+
1527
+ Input schema:
1528
+
1529
+ ```json
1530
+ {
1531
+ "type": "object",
1532
+ "properties": {},
1533
+ "additionalProperties": false
1534
+ }
1535
+ ```
1536
+
1537
+ Output schema:
1538
+
1539
+ ```json
1540
+ {
1541
+ "type": "object",
1542
+ "oneOf": [
1543
+ {
1544
+ "type": "object",
1545
+ "properties": {
1546
+ "ok": {
1547
+ "type": "boolean"
1548
+ },
1549
+ "storybookUrl": {
1550
+ "type": "string"
1551
+ },
1552
+ "mcpUrl": {
1553
+ "type": "string"
1554
+ },
1555
+ "mcpServers": {
1556
+ "type": "object"
1557
+ }
1558
+ },
1559
+ "required": [
1560
+ "ok",
1561
+ "storybookUrl",
1562
+ "mcpUrl",
1563
+ "mcpServers"
1564
+ ]
1565
+ },
1566
+ {
1567
+ "type": "object",
1568
+ "properties": {
1569
+ "ok": {
1570
+ "const": false
1571
+ },
1572
+ "error": {
1573
+ "type": "object",
1574
+ "properties": {
1575
+ "code": {
1576
+ "type": "string"
1577
+ },
1578
+ "message": {
1579
+ "type": "string"
1580
+ },
1581
+ "retryable": {
1582
+ "type": "boolean"
1583
+ },
1584
+ "recoveryAction": {
1585
+ "type": "string"
1586
+ }
1587
+ },
1588
+ "required": [
1589
+ "code",
1590
+ "message",
1591
+ "retryable",
1592
+ "recoveryAction"
1593
+ ],
1594
+ "additionalProperties": false
1595
+ }
1596
+ },
1597
+ "required": [
1598
+ "ok",
1599
+ "error"
1600
+ ],
1601
+ "additionalProperties": false
1602
+ }
1603
+ ]
1604
+ }
1605
+ ```
1606
+
1607
+ ### `platform_validate_artifact`
1608
+
1609
+ Read trusted smoke and health evidence for a private artifact draft without requiring a browser session.
1610
+
1611
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=false.
1612
+
1613
+ Example request:
1614
+
1615
+ ```json
1616
+ {
1617
+ "artifactId": "00000000-0000-4000-8000-000000000001"
1618
+ }
1619
+ ```
1620
+
1621
+ Example success:
1622
+
1623
+ ```json
1624
+ {
1625
+ "ok": true,
1626
+ "phase": "<phase>",
1627
+ "artifactId": "00000000-0000-4000-8000-000000000001",
1628
+ "deploymentRecordId": "00000000-0000-4000-8000-000000000003",
1629
+ "deploymentState": "<deploymentState>",
1630
+ "healthy": true,
1631
+ "checkedAt": "<checkedAt>",
1632
+ "draftUrl": "<draftUrl>",
1633
+ "smoke": {}
1634
+ }
1635
+ ```
1636
+
1637
+ Input schema:
1638
+
1639
+ ```json
1640
+ {
1641
+ "type": "object",
1642
+ "properties": {
1643
+ "artifactId": {
1644
+ "type": "string",
1645
+ "format": "uuid"
1646
+ },
1647
+ "deploymentRecordId": {
1648
+ "type": "string",
1649
+ "format": "uuid"
1650
+ }
1651
+ },
1652
+ "required": [
1653
+ "artifactId"
1654
+ ],
1655
+ "additionalProperties": false
1656
+ }
1657
+ ```
1658
+
1659
+ Output schema:
1660
+
1661
+ ```json
1662
+ {
1663
+ "type": "object",
1664
+ "oneOf": [
1665
+ {
1666
+ "type": "object",
1667
+ "properties": {
1668
+ "ok": {
1669
+ "type": "boolean"
1670
+ },
1671
+ "phase": {
1672
+ "type": "string"
1673
+ },
1674
+ "artifactId": {
1675
+ "type": "string"
1676
+ },
1677
+ "deploymentRecordId": {
1678
+ "type": "string"
1679
+ },
1680
+ "deploymentState": {
1681
+ "type": "string"
1682
+ },
1683
+ "healthy": {
1684
+ "type": "boolean"
1685
+ },
1686
+ "checkedAt": {
1687
+ "type": [
1688
+ "string",
1689
+ "null"
1690
+ ]
1691
+ },
1692
+ "draftUrl": {
1693
+ "type": [
1694
+ "string",
1695
+ "null"
1696
+ ]
1697
+ },
1698
+ "smoke": {
1699
+ "type": [
1700
+ "object",
1701
+ "null"
1702
+ ]
1703
+ }
1704
+ },
1705
+ "required": [
1706
+ "ok",
1707
+ "phase",
1708
+ "artifactId",
1709
+ "deploymentRecordId",
1710
+ "deploymentState",
1711
+ "healthy",
1712
+ "checkedAt",
1713
+ "draftUrl",
1714
+ "smoke"
1715
+ ]
1716
+ },
1717
+ {
1718
+ "type": "object",
1719
+ "properties": {
1720
+ "ok": {
1721
+ "const": false
1722
+ },
1723
+ "error": {
1724
+ "type": "object",
1725
+ "properties": {
1726
+ "code": {
1727
+ "type": "string"
1728
+ },
1729
+ "message": {
1730
+ "type": "string"
1731
+ },
1732
+ "retryable": {
1733
+ "type": "boolean"
1734
+ },
1735
+ "recoveryAction": {
1736
+ "type": "string"
1737
+ }
1738
+ },
1739
+ "required": [
1740
+ "code",
1741
+ "message",
1742
+ "retryable",
1743
+ "recoveryAction"
1744
+ ],
1745
+ "additionalProperties": false
1746
+ }
1747
+ },
1748
+ "required": [
1749
+ "ok",
1750
+ "error"
1751
+ ],
1752
+ "additionalProperties": false
1753
+ }
1754
+ ]
1755
+ }
1756
+ ```
1757
+
1758
+ ### `platform_run_artifact_smoke`
1759
+
1760
+ Rerun the trusted draft smoke check and return fresh rendered-page evidence.
1761
+
1762
+ Safety: read-only=false, destructive=false, idempotent=false, open-world=true.
1763
+
1764
+ Example request:
1765
+
1766
+ ```json
1767
+ {
1768
+ "artifactId": "00000000-0000-4000-8000-000000000001"
1769
+ }
1770
+ ```
1771
+
1772
+ Example success:
1773
+
1774
+ ```json
1775
+ {
1776
+ "ok": true,
1777
+ "phase": "<phase>",
1778
+ "artifactId": "00000000-0000-4000-8000-000000000001",
1779
+ "deploymentRecordId": "00000000-0000-4000-8000-000000000003",
1780
+ "smoke": {},
1781
+ "validation": {}
1782
+ }
1783
+ ```
1784
+
1785
+ Input schema:
1786
+
1787
+ ```json
1788
+ {
1789
+ "type": "object",
1790
+ "properties": {
1791
+ "artifactId": {
1792
+ "type": "string",
1793
+ "format": "uuid"
1794
+ },
1795
+ "deploymentRecordId": {
1796
+ "type": "string",
1797
+ "format": "uuid"
1798
+ }
1799
+ },
1800
+ "required": [
1801
+ "artifactId"
1802
+ ],
1803
+ "additionalProperties": false
1804
+ }
1805
+ ```
1806
+
1807
+ Output schema:
1808
+
1809
+ ```json
1810
+ {
1811
+ "type": "object",
1812
+ "oneOf": [
1813
+ {
1814
+ "type": "object",
1815
+ "properties": {
1816
+ "ok": {
1817
+ "type": "boolean"
1818
+ },
1819
+ "phase": {
1820
+ "type": "string"
1821
+ },
1822
+ "artifactId": {
1823
+ "type": "string"
1824
+ },
1825
+ "deploymentRecordId": {
1826
+ "type": "string"
1827
+ },
1828
+ "smoke": {
1829
+ "type": "object"
1830
+ },
1831
+ "validation": {
1832
+ "type": "object"
1833
+ }
1834
+ },
1835
+ "required": [
1836
+ "ok",
1837
+ "phase",
1838
+ "artifactId",
1839
+ "deploymentRecordId",
1840
+ "smoke",
1841
+ "validation"
1842
+ ]
1843
+ },
1844
+ {
1845
+ "type": "object",
1846
+ "properties": {
1847
+ "ok": {
1848
+ "const": false
1849
+ },
1850
+ "error": {
1851
+ "type": "object",
1852
+ "properties": {
1853
+ "code": {
1854
+ "type": "string"
1855
+ },
1856
+ "message": {
1857
+ "type": "string"
1858
+ },
1859
+ "retryable": {
1860
+ "type": "boolean"
1861
+ },
1862
+ "recoveryAction": {
1863
+ "type": "string"
1864
+ }
1865
+ },
1866
+ "required": [
1867
+ "code",
1868
+ "message",
1869
+ "retryable",
1870
+ "recoveryAction"
1871
+ ],
1872
+ "additionalProperties": false
1873
+ }
1874
+ },
1875
+ "required": [
1876
+ "ok",
1877
+ "error"
1878
+ ],
1879
+ "additionalProperties": false
1880
+ }
1881
+ ]
1882
+ }
1883
+ ```
1884
+
1885
+ ### `platform_plan_artifact_draft_delete`
1886
+
1887
+ Preview cleanup effects and receive the state-bound plan token required for deletion.
1888
+
1889
+ Safety: read-only=true, destructive=false, idempotent=false, open-world=true.
1890
+
1891
+ Example request:
1892
+
1893
+ ```json
1894
+ {
1895
+ "artifactId": "00000000-0000-4000-8000-000000000001"
1896
+ }
1897
+ ```
1898
+
1899
+ Example success:
1900
+
1901
+ ```json
1902
+ {
1903
+ "ok": true,
1904
+ "phase": "<phase>",
1905
+ "artifactId": "00000000-0000-4000-8000-000000000001",
1906
+ "eligible": true,
1907
+ "effects": {},
1908
+ "planToken": "example-plan-token"
1909
+ }
1910
+ ```
1911
+
1912
+ Input schema:
1913
+
1914
+ ```json
1915
+ {
1916
+ "type": "object",
1917
+ "properties": {
1918
+ "artifactId": {
1919
+ "type": "string",
1920
+ "format": "uuid"
1921
+ }
1922
+ },
1923
+ "required": [
1924
+ "artifactId"
1925
+ ],
1926
+ "additionalProperties": false
1927
+ }
1928
+ ```
1929
+
1930
+ Output schema:
1931
+
1932
+ ```json
1933
+ {
1934
+ "type": "object",
1935
+ "oneOf": [
1936
+ {
1937
+ "type": "object",
1938
+ "properties": {
1939
+ "ok": {
1940
+ "type": "boolean"
1941
+ },
1942
+ "phase": {
1943
+ "type": "string"
1944
+ },
1945
+ "artifactId": {
1946
+ "type": "string"
1947
+ },
1948
+ "eligible": {
1949
+ "type": "boolean"
1950
+ },
1951
+ "effects": {
1952
+ "type": "object"
1953
+ },
1954
+ "planToken": {
1955
+ "type": "string"
1956
+ }
1957
+ },
1958
+ "required": [
1959
+ "ok",
1960
+ "phase",
1961
+ "artifactId",
1962
+ "eligible",
1963
+ "effects",
1964
+ "planToken"
1965
+ ]
1966
+ },
1967
+ {
1968
+ "type": "object",
1969
+ "properties": {
1970
+ "ok": {
1971
+ "const": false
1972
+ },
1973
+ "error": {
1974
+ "type": "object",
1975
+ "properties": {
1976
+ "code": {
1977
+ "type": "string"
1978
+ },
1979
+ "message": {
1980
+ "type": "string"
1981
+ },
1982
+ "retryable": {
1983
+ "type": "boolean"
1984
+ },
1985
+ "recoveryAction": {
1986
+ "type": "string"
1987
+ }
1988
+ },
1989
+ "required": [
1990
+ "code",
1991
+ "message",
1992
+ "retryable",
1993
+ "recoveryAction"
1994
+ ],
1995
+ "additionalProperties": false
1996
+ }
1997
+ },
1998
+ "required": [
1999
+ "ok",
2000
+ "error"
2001
+ ],
2002
+ "additionalProperties": false
2003
+ }
2004
+ ]
2005
+ }
2006
+ ```
2007
+
2008
+ ### `platform_delete_artifact_draft`
2009
+
2010
+ Permanently remove an unpromoted private draft created by this MCP connection after exact-id confirmation.
2011
+
2012
+ Safety: read-only=false, destructive=true, idempotent=false, open-world=true.
2013
+
2014
+ Example request:
2015
+
2016
+ ```json
2017
+ {
2018
+ "artifactId": "00000000-0000-4000-8000-000000000001",
2019
+ "confirmArtifactId": "00000000-0000-4000-8000-000000000001",
2020
+ "planToken": "example-plan-token"
2021
+ }
2022
+ ```
2023
+
2024
+ Example success:
2025
+
2026
+ ```json
2027
+ {
2028
+ "ok": true,
2029
+ "deleted": true,
2030
+ "artifactId": "00000000-0000-4000-8000-000000000001"
2031
+ }
2032
+ ```
2033
+
2034
+ Input schema:
2035
+
2036
+ ```json
2037
+ {
2038
+ "type": "object",
2039
+ "properties": {
2040
+ "artifactId": {
2041
+ "type": "string",
2042
+ "format": "uuid"
2043
+ },
2044
+ "confirmArtifactId": {
2045
+ "type": "string",
2046
+ "format": "uuid"
2047
+ },
2048
+ "planToken": {
2049
+ "type": "string",
2050
+ "minLength": 1
2051
+ }
2052
+ },
2053
+ "required": [
2054
+ "artifactId",
2055
+ "confirmArtifactId",
2056
+ "planToken"
2057
+ ],
2058
+ "additionalProperties": false
2059
+ }
2060
+ ```
2061
+
2062
+ Output schema:
2063
+
2064
+ ```json
2065
+ {
2066
+ "type": "object",
2067
+ "oneOf": [
2068
+ {
2069
+ "type": "object",
2070
+ "properties": {
2071
+ "ok": {
2072
+ "type": "boolean"
2073
+ },
2074
+ "deleted": {
2075
+ "type": "boolean"
2076
+ },
2077
+ "artifactId": {
2078
+ "type": "string"
2079
+ }
2080
+ },
2081
+ "required": [
2082
+ "ok",
2083
+ "deleted",
2084
+ "artifactId"
2085
+ ]
2086
+ },
2087
+ {
2088
+ "type": "object",
2089
+ "properties": {
2090
+ "ok": {
2091
+ "const": false
2092
+ },
2093
+ "error": {
2094
+ "type": "object",
2095
+ "properties": {
2096
+ "code": {
2097
+ "type": "string"
2098
+ },
2099
+ "message": {
2100
+ "type": "string"
2101
+ },
2102
+ "retryable": {
2103
+ "type": "boolean"
2104
+ },
2105
+ "recoveryAction": {
2106
+ "type": "string"
2107
+ }
2108
+ },
2109
+ "required": [
2110
+ "code",
2111
+ "message",
2112
+ "retryable",
2113
+ "recoveryAction"
2114
+ ],
2115
+ "additionalProperties": false
2116
+ }
2117
+ },
2118
+ "required": [
2119
+ "ok",
2120
+ "error"
2121
+ ],
2122
+ "additionalProperties": false
2123
+ }
2124
+ ]
2125
+ }
2126
+ ```