paper-mono 0.62.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,1748 @@
1
+ {
2
+ "schemaVersion": "mono-tools.v1",
3
+ "specialist": "paper",
4
+ "ownerCommand": "paper mono",
5
+ "agentHome": "~/.paper/agent",
6
+ "domain": {
7
+ "comment": "REQ: Paper Desktop design-to-code agent CLI powered by the Paper MCP bridge at http://127.0.0.1:29979/mcp.",
8
+ "toolIds": [
9
+ "paper_get_basic_info",
10
+ "paper_get_selection",
11
+ "paper_get_node_info",
12
+ "paper_get_children",
13
+ "paper_get_tree_summary",
14
+ "paper_get_screenshot",
15
+ "paper_get_jsx",
16
+ "paper_get_computed_styles",
17
+ "paper_get_fill_image",
18
+ "paper_get_font_family_info",
19
+ "paper_get_guide",
20
+ "paper_find_placement",
21
+ "paper_mcp_reachability_check",
22
+ "paper_style_tokens_extract",
23
+ "paper_materialize_system_direction",
24
+ "paper_create_page",
25
+ "paper_open_page",
26
+ "paper_rename_nodes",
27
+ "paper_revise_artboard",
28
+ "paper_delete_nodes",
29
+ "paper_find_nodes",
30
+ "paper_get_tokens",
31
+ "paper_capture_provenance",
32
+ "paper_create_tokens",
33
+ "paper_set_tokens",
34
+ "paper_write_html",
35
+ "paper_move_nodes"
36
+ ]
37
+ },
38
+ "tools": [
39
+ {
40
+ "id": "paper_get_basic_info",
41
+ "version": 1,
42
+ "label": "Paper: Get Basic Info",
43
+ "description": "Get file name, page name, node count, and list of artboards with dimensions from the currently open Paper file.",
44
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
45
+ "sourcePack": null,
46
+ "demandRefs": [
47
+ "mono-fleet-era:paper-tool-contract",
48
+ "audit:paper-reads"
49
+ ],
50
+ "safety": "read",
51
+ "requires": {
52
+ "allOf": [
53
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
54
+ ],
55
+ "anyOf": [],
56
+ "cli": [
57
+ "paper mono"
58
+ ],
59
+ "endpoint": [],
60
+ "optional": false
61
+ },
62
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
63
+ "output": {
64
+ "envelope": "mono-tool-result.v1",
65
+ "maxBytes": 12288,
66
+ "maxItems": 50
67
+ },
68
+ "doctorProbe": "endpoint",
69
+ "cases": [
70
+ "./tool-walk/fixtures.json#paper-get-basic-info"
71
+ ],
72
+ "cliFallback": null,
73
+ "guidelines": [
74
+ "Use as the first read when grounding in the open Paper file.",
75
+ "If Paper Desktop is not running, fall back to fixtures or ask the operator to open a file."
76
+ ],
77
+ "safetyContract": {
78
+ "modes": [
79
+ "mock"
80
+ ],
81
+ "guarantees": {
82
+ "mock": {
83
+ "networkSpend": "forbidden",
84
+ "filesystemWrites": "none",
85
+ "filesystemRoots": [],
86
+ "externalMutations": "forbidden",
87
+ "requiresConfirmation": false
88
+ }
89
+ },
90
+ "fixtureRefs": [
91
+ "./tool-walk/safety-fixtures.json#paper_get_basic_info-mock-safety"
92
+ ],
93
+ "outputBudget": {
94
+ "maxBytes": 12288,
95
+ "maxLines": 200
96
+ }
97
+ }
98
+ },
99
+ {
100
+ "id": "paper_get_selection",
101
+ "version": 1,
102
+ "label": "Paper: Get Selection",
103
+ "description": "Get details about the currently selected nodes in Paper Desktop (IDs, names, types, size, artboard). Use this to see what the user is pointing at.",
104
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
105
+ "sourcePack": null,
106
+ "demandRefs": [
107
+ "mono-fleet-era:paper-tool-contract",
108
+ "audit:paper-reads"
109
+ ],
110
+ "safety": "read",
111
+ "requires": {
112
+ "allOf": [
113
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
114
+ ],
115
+ "anyOf": [],
116
+ "cli": [
117
+ "paper mono"
118
+ ],
119
+ "endpoint": [],
120
+ "optional": false
121
+ },
122
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
123
+ "output": {
124
+ "envelope": "mono-tool-result.v1",
125
+ "maxBytes": 12288,
126
+ "maxItems": 50
127
+ },
128
+ "doctorProbe": "endpoint",
129
+ "cases": [
130
+ "./tool-walk/fixtures.json#paper-get-selection"
131
+ ],
132
+ "cliFallback": null,
133
+ "guidelines": [
134
+ "Use when the user refers to 'this' or 'selected' without naming a node.",
135
+ "Returns empty selection when no nodes are selected; do not invent selected nodes."
136
+ ],
137
+ "safetyContract": {
138
+ "modes": [
139
+ "mock"
140
+ ],
141
+ "guarantees": {
142
+ "mock": {
143
+ "networkSpend": "forbidden",
144
+ "filesystemWrites": "none",
145
+ "filesystemRoots": [],
146
+ "externalMutations": "forbidden",
147
+ "requiresConfirmation": false
148
+ }
149
+ },
150
+ "fixtureRefs": [
151
+ "./tool-walk/safety-fixtures.json#paper_get_selection-mock-safety"
152
+ ],
153
+ "outputBudget": {
154
+ "maxBytes": 12288,
155
+ "maxLines": 200
156
+ }
157
+ }
158
+ },
159
+ {
160
+ "id": "paper_get_node_info",
161
+ "version": 1,
162
+ "label": "Paper: Get Node Info",
163
+ "description": "Get details for a specific node by ID: size, visibility, lock state, parent, children, text content.",
164
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
165
+ "sourcePack": null,
166
+ "demandRefs": [
167
+ "mono-fleet-era:paper-tool-contract",
168
+ "audit:paper-reads"
169
+ ],
170
+ "safety": "read",
171
+ "requires": {
172
+ "allOf": [
173
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
174
+ ],
175
+ "anyOf": [],
176
+ "cli": [
177
+ "paper mono"
178
+ ],
179
+ "endpoint": [],
180
+ "optional": false
181
+ },
182
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
183
+ "output": {
184
+ "envelope": "mono-tool-result.v1",
185
+ "maxBytes": 12288,
186
+ "maxItems": 50
187
+ },
188
+ "doctorProbe": "endpoint",
189
+ "cases": [
190
+ "./tool-walk/fixtures.json#paper-get-node-info"
191
+ ],
192
+ "cliFallback": null,
193
+ "guidelines": [
194
+ "Use after get_selection or get_tree_summary to inspect a specific node.",
195
+ "If the node ID does not exist, report the exact MCP error without guessing."
196
+ ],
197
+ "safetyContract": {
198
+ "modes": [
199
+ "mock"
200
+ ],
201
+ "guarantees": {
202
+ "mock": {
203
+ "networkSpend": "forbidden",
204
+ "filesystemWrites": "none",
205
+ "filesystemRoots": [],
206
+ "externalMutations": "forbidden",
207
+ "requiresConfirmation": false
208
+ }
209
+ },
210
+ "fixtureRefs": [
211
+ "./tool-walk/safety-fixtures.json#paper_get_node_info-mock-safety"
212
+ ],
213
+ "outputBudget": {
214
+ "maxBytes": 12288,
215
+ "maxLines": 200
216
+ }
217
+ }
218
+ },
219
+ {
220
+ "id": "paper_get_children",
221
+ "version": 1,
222
+ "label": "Paper: Get Children",
223
+ "description": "Get direct children of a node: IDs, names, types, and child counts.",
224
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
225
+ "sourcePack": null,
226
+ "demandRefs": [
227
+ "mono-fleet-era:paper-tool-contract",
228
+ "audit:paper-reads"
229
+ ],
230
+ "safety": "read",
231
+ "requires": {
232
+ "allOf": [
233
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
234
+ ],
235
+ "anyOf": [],
236
+ "cli": [
237
+ "paper mono"
238
+ ],
239
+ "endpoint": [],
240
+ "optional": false
241
+ },
242
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
243
+ "output": {
244
+ "envelope": "mono-tool-result.v1",
245
+ "maxBytes": 12288,
246
+ "maxItems": 50
247
+ },
248
+ "doctorProbe": "endpoint",
249
+ "cases": [
250
+ "./tool-walk/fixtures.json#paper-get-children"
251
+ ],
252
+ "cliFallback": null,
253
+ "guidelines": [
254
+ "Use to walk the layer tree one level at a time.",
255
+ "Respect maxItems; paginate large artboards via repeated calls if the MCP supports it."
256
+ ],
257
+ "safetyContract": {
258
+ "modes": [
259
+ "mock"
260
+ ],
261
+ "guarantees": {
262
+ "mock": {
263
+ "networkSpend": "forbidden",
264
+ "filesystemWrites": "none",
265
+ "filesystemRoots": [],
266
+ "externalMutations": "forbidden",
267
+ "requiresConfirmation": false
268
+ }
269
+ },
270
+ "fixtureRefs": [
271
+ "./tool-walk/safety-fixtures.json#paper_get_children-mock-safety"
272
+ ],
273
+ "outputBudget": {
274
+ "maxBytes": 12288,
275
+ "maxLines": 200
276
+ }
277
+ }
278
+ },
279
+ {
280
+ "id": "paper_get_tree_summary",
281
+ "version": 1,
282
+ "label": "Paper: Get Tree Summary",
283
+ "description": "Get a bounded summary of one targeted subtree. Depth defaults to 4 and must be 1 through 8; start from an artboard or smaller subtree instead of a Snapshot-scale document root.",
284
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
285
+ "sourcePack": null,
286
+ "demandRefs": [
287
+ "mono-fleet-era:paper-tool-contract",
288
+ "audit:paper-reads"
289
+ ],
290
+ "safety": "read",
291
+ "requires": {
292
+ "allOf": [
293
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
294
+ ],
295
+ "anyOf": [],
296
+ "cli": [
297
+ "paper mono"
298
+ ],
299
+ "endpoint": [],
300
+ "optional": false
301
+ },
302
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
303
+ "output": {
304
+ "envelope": "mono-tool-result.v1",
305
+ "maxBytes": 165000,
306
+ "maxItems": 50
307
+ },
308
+ "doctorProbe": "endpoint",
309
+ "cases": [
310
+ "./tool-walk/fixtures.json#paper-get-tree-summary"
311
+ ],
312
+ "cliFallback": null,
313
+ "guidelines": [
314
+ "Start from basic info, then target one artboard or subtree instead of the document root.",
315
+ "Depth defaults to 4 and accepts only integers from 1 through 8; retry a suppressed result with a shallower depth or smaller subtree."
316
+ ],
317
+ "safetyContract": {
318
+ "modes": [
319
+ "mock"
320
+ ],
321
+ "guarantees": {
322
+ "mock": {
323
+ "networkSpend": "forbidden",
324
+ "filesystemWrites": "none",
325
+ "filesystemRoots": [],
326
+ "externalMutations": "forbidden",
327
+ "requiresConfirmation": false
328
+ }
329
+ },
330
+ "fixtureRefs": [
331
+ "./tool-walk/safety-fixtures.json#paper_get_tree_summary-mock-safety"
332
+ ],
333
+ "outputBudget": {
334
+ "maxBytes": 12288,
335
+ "maxLines": 200
336
+ }
337
+ }
338
+ },
339
+ {
340
+ "id": "paper_get_screenshot",
341
+ "version": 1,
342
+ "label": "Paper: Get Screenshot",
343
+ "description": "Screenshot one targeted artboard or node. Start with scale 1; use scale 2 only for a specific detail after the scale-1 read is insufficient.",
344
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
345
+ "sourcePack": null,
346
+ "demandRefs": [
347
+ "mono-fleet-era:paper-tool-contract",
348
+ "audit:paper-reads"
349
+ ],
350
+ "safety": "read",
351
+ "requires": {
352
+ "allOf": [
353
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
354
+ ],
355
+ "anyOf": [],
356
+ "cli": [
357
+ "paper mono"
358
+ ],
359
+ "endpoint": [],
360
+ "optional": false
361
+ },
362
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
363
+ "output": {
364
+ "envelope": "mono-tool-result.v1",
365
+ "maxBytes": 8400000,
366
+ "maxItems": 50
367
+ },
368
+ "doctorProbe": "endpoint",
369
+ "cases": [
370
+ "./tool-walk/fixtures.json#paper-get-screenshot"
371
+ ],
372
+ "cliFallback": null,
373
+ "guidelines": [
374
+ "Target one artboard or node and start with scale 1; do not begin with a full Snapshot page at scale 2.",
375
+ "Decoded image data over 6291456 bytes is suppressed whole with a narrower-retry receipt."
376
+ ],
377
+ "safetyContract": {
378
+ "modes": [
379
+ "mock"
380
+ ],
381
+ "guarantees": {
382
+ "mock": {
383
+ "networkSpend": "forbidden",
384
+ "filesystemWrites": "none",
385
+ "filesystemRoots": [],
386
+ "externalMutations": "forbidden",
387
+ "requiresConfirmation": false
388
+ }
389
+ },
390
+ "fixtureRefs": [
391
+ "./tool-walk/safety-fixtures.json#paper_get_screenshot-mock-safety"
392
+ ],
393
+ "outputBudget": {
394
+ "maxBytes": 12288,
395
+ "maxLines": 200
396
+ }
397
+ }
398
+ },
399
+ {
400
+ "id": "paper_get_jsx",
401
+ "version": 1,
402
+ "label": "Paper: Get JSX",
403
+ "description": "Get JSX for one targeted node and its descendants. Request an artboard section or smaller subtree rather than a full Snapshot page; choose 'tailwind' or 'inline' styles.",
404
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
405
+ "sourcePack": null,
406
+ "demandRefs": [
407
+ "mono-fleet-era:paper-tool-contract",
408
+ "audit:paper-reads"
409
+ ],
410
+ "safety": "read",
411
+ "requires": {
412
+ "allOf": [
413
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
414
+ ],
415
+ "anyOf": [],
416
+ "cli": [
417
+ "paper mono"
418
+ ],
419
+ "endpoint": [],
420
+ "optional": false
421
+ },
422
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
423
+ "output": {
424
+ "envelope": "mono-tool-result.v1",
425
+ "maxBytes": 165000,
426
+ "maxItems": 50
427
+ },
428
+ "doctorProbe": "endpoint",
429
+ "cases": [
430
+ "./tool-walk/fixtures.json#paper-get-jsx"
431
+ ],
432
+ "cliFallback": null,
433
+ "guidelines": [
434
+ "Read one implementation-relevant subtree at a time and summarize it before requesting another.",
435
+ "UTF-8 text over 163840 bytes is suppressed whole; retry with a smaller subtree instead of requesting a full Snapshot page."
436
+ ],
437
+ "safetyContract": {
438
+ "modes": [
439
+ "mock"
440
+ ],
441
+ "guarantees": {
442
+ "mock": {
443
+ "networkSpend": "forbidden",
444
+ "filesystemWrites": "none",
445
+ "filesystemRoots": [],
446
+ "externalMutations": "forbidden",
447
+ "requiresConfirmation": false
448
+ }
449
+ },
450
+ "fixtureRefs": [
451
+ "./tool-walk/safety-fixtures.json#paper_get_jsx-mock-safety"
452
+ ],
453
+ "outputBudget": {
454
+ "maxBytes": 12288,
455
+ "maxLines": 200
456
+ }
457
+ }
458
+ },
459
+ {
460
+ "id": "paper_get_computed_styles",
461
+ "version": 1,
462
+ "label": "Paper: Get Computed Styles",
463
+ "description": "Get exact computed CSS values for 1 through 50 targeted nodes. Read only the subtree nodes needed for the current implementation decision.",
464
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
465
+ "sourcePack": null,
466
+ "demandRefs": [
467
+ "mono-fleet-era:paper-tool-contract",
468
+ "audit:paper-reads"
469
+ ],
470
+ "safety": "read",
471
+ "requires": {
472
+ "allOf": [
473
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
474
+ ],
475
+ "anyOf": [],
476
+ "cli": [
477
+ "paper mono"
478
+ ],
479
+ "endpoint": [],
480
+ "optional": false
481
+ },
482
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
483
+ "output": {
484
+ "envelope": "mono-tool-result.v1",
485
+ "maxBytes": 165000,
486
+ "maxItems": 50
487
+ },
488
+ "doctorProbe": "endpoint",
489
+ "cases": [
490
+ "./tool-walk/fixtures.json#paper-get-computed-styles"
491
+ ],
492
+ "cliFallback": null,
493
+ "guidelines": [
494
+ "Use 1 through 50 exact node IDs from the current subtree; never request styles for the entire document.",
495
+ "UTF-8 text over 163840 bytes is suppressed whole; retry with fewer node IDs and summarize the relevant decisions."
496
+ ],
497
+ "safetyContract": {
498
+ "modes": [
499
+ "mock"
500
+ ],
501
+ "guarantees": {
502
+ "mock": {
503
+ "networkSpend": "forbidden",
504
+ "filesystemWrites": "none",
505
+ "filesystemRoots": [],
506
+ "externalMutations": "forbidden",
507
+ "requiresConfirmation": false
508
+ }
509
+ },
510
+ "fixtureRefs": [
511
+ "./tool-walk/safety-fixtures.json#paper_get_computed_styles-mock-safety"
512
+ ],
513
+ "outputBudget": {
514
+ "maxBytes": 12288,
515
+ "maxLines": 200
516
+ }
517
+ }
518
+ },
519
+ {
520
+ "id": "paper_get_fill_image",
521
+ "version": 1,
522
+ "label": "Paper: Get Fill Image",
523
+ "description": "Get image data from one exact node already confirmed to have an image fill. Avoid broad reference roots; the result is base64 JPEG data.",
524
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
525
+ "sourcePack": null,
526
+ "demandRefs": [
527
+ "mono-fleet-era:paper-tool-contract",
528
+ "audit:paper-reads"
529
+ ],
530
+ "safety": "read",
531
+ "requires": {
532
+ "allOf": [
533
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
534
+ ],
535
+ "anyOf": [],
536
+ "cli": [
537
+ "paper mono"
538
+ ],
539
+ "endpoint": [],
540
+ "optional": false
541
+ },
542
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
543
+ "output": {
544
+ "envelope": "mono-tool-result.v1",
545
+ "maxBytes": 8400000,
546
+ "maxItems": 50
547
+ },
548
+ "doctorProbe": "endpoint",
549
+ "cases": [
550
+ "./tool-walk/fixtures.json#paper-get-fill-image"
551
+ ],
552
+ "cliFallback": null,
553
+ "guidelines": [
554
+ "Use only on one exact node already confirmed to have an image fill.",
555
+ "Decoded image data over 6291456 bytes is suppressed whole; retry the exact smaller fill node or use a targeted scale 1 screenshot."
556
+ ],
557
+ "safetyContract": {
558
+ "modes": [
559
+ "mock"
560
+ ],
561
+ "guarantees": {
562
+ "mock": {
563
+ "networkSpend": "forbidden",
564
+ "filesystemWrites": "none",
565
+ "filesystemRoots": [],
566
+ "externalMutations": "forbidden",
567
+ "requiresConfirmation": false
568
+ }
569
+ },
570
+ "fixtureRefs": [
571
+ "./tool-walk/safety-fixtures.json#paper_get_fill_image-mock-safety"
572
+ ],
573
+ "outputBudget": {
574
+ "maxBytes": 12288,
575
+ "maxLines": 200
576
+ }
577
+ }
578
+ },
579
+ {
580
+ "id": "paper_get_font_family_info",
581
+ "version": 1,
582
+ "label": "Paper: Get Font Info",
583
+ "description": "Look up whether a font family is available on the user's machine or Google Fonts. Inspect weights and styles.",
584
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
585
+ "sourcePack": null,
586
+ "demandRefs": [
587
+ "mono-fleet-era:paper-tool-contract",
588
+ "audit:paper-reads"
589
+ ],
590
+ "safety": "read",
591
+ "requires": {
592
+ "allOf": [
593
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
594
+ ],
595
+ "anyOf": [],
596
+ "cli": [
597
+ "paper mono"
598
+ ],
599
+ "endpoint": [],
600
+ "optional": false
601
+ },
602
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
603
+ "output": {
604
+ "envelope": "mono-tool-result.v1",
605
+ "maxBytes": 12288,
606
+ "maxItems": 50
607
+ },
608
+ "doctorProbe": "endpoint",
609
+ "cases": [
610
+ "./tool-walk/fixtures.json#paper-get-font-family-info"
611
+ ],
612
+ "cliFallback": null,
613
+ "guidelines": [
614
+ "Use to decide whether a font can be used directly or needs a fallback.",
615
+ "Consider Google Fonts availability as a hint, not a guarantee, without network proof."
616
+ ],
617
+ "safetyContract": {
618
+ "modes": [
619
+ "mock"
620
+ ],
621
+ "guarantees": {
622
+ "mock": {
623
+ "networkSpend": "forbidden",
624
+ "filesystemWrites": "none",
625
+ "filesystemRoots": [],
626
+ "externalMutations": "forbidden",
627
+ "requiresConfirmation": false
628
+ }
629
+ },
630
+ "fixtureRefs": [
631
+ "./tool-walk/safety-fixtures.json#paper_get_font_family_info-mock-safety"
632
+ ],
633
+ "outputBudget": {
634
+ "maxBytes": 12288,
635
+ "maxLines": 200
636
+ }
637
+ }
638
+ },
639
+ {
640
+ "id": "paper_get_guide",
641
+ "version": 1,
642
+ "label": "Paper: Get Guide",
643
+ "description": "Retrieve guided workflow documentation for a topic (e.g., 'figma-import' for Figma import steps).",
644
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
645
+ "sourcePack": null,
646
+ "demandRefs": [
647
+ "mono-fleet-era:paper-tool-contract",
648
+ "audit:paper-reads"
649
+ ],
650
+ "safety": "read",
651
+ "requires": {
652
+ "allOf": [
653
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
654
+ ],
655
+ "anyOf": [],
656
+ "cli": [
657
+ "paper mono"
658
+ ],
659
+ "endpoint": [],
660
+ "optional": false
661
+ },
662
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
663
+ "output": {
664
+ "envelope": "mono-tool-result.v1",
665
+ "maxBytes": 12288,
666
+ "maxItems": 50
667
+ },
668
+ "doctorProbe": "endpoint",
669
+ "cases": [
670
+ "./tool-walk/fixtures.json#paper-get-guide"
671
+ ],
672
+ "cliFallback": null,
673
+ "guidelines": [
674
+ "Use when the operator asks about Paper-specific workflows.",
675
+ "Do not invent guide content; only return what the MCP provides."
676
+ ],
677
+ "safetyContract": {
678
+ "modes": [
679
+ "mock"
680
+ ],
681
+ "guarantees": {
682
+ "mock": {
683
+ "networkSpend": "forbidden",
684
+ "filesystemWrites": "none",
685
+ "filesystemRoots": [],
686
+ "externalMutations": "forbidden",
687
+ "requiresConfirmation": false
688
+ }
689
+ },
690
+ "fixtureRefs": [
691
+ "./tool-walk/safety-fixtures.json#paper_get_guide-mock-safety"
692
+ ],
693
+ "outputBudget": {
694
+ "maxBytes": 12288,
695
+ "maxLines": 200
696
+ }
697
+ }
698
+ },
699
+ {
700
+ "id": "paper_find_placement",
701
+ "version": 1,
702
+ "label": "Paper: Find Placement",
703
+ "description": "Get suggested x/y coordinates on the canvas to place a new artboard without overlapping existing ones.",
704
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
705
+ "sourcePack": null,
706
+ "demandRefs": [
707
+ "mono-fleet-era:paper-tool-contract",
708
+ "audit:paper-reads"
709
+ ],
710
+ "safety": "read",
711
+ "requires": {
712
+ "allOf": [
713
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
714
+ ],
715
+ "anyOf": [],
716
+ "cli": [
717
+ "paper mono"
718
+ ],
719
+ "endpoint": [],
720
+ "optional": false
721
+ },
722
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
723
+ "output": {
724
+ "envelope": "mono-tool-result.v1",
725
+ "maxBytes": 12288,
726
+ "maxItems": 50
727
+ },
728
+ "doctorProbe": "endpoint",
729
+ "cases": [
730
+ "./tool-walk/fixtures.json#paper-find-placement"
731
+ ],
732
+ "cliFallback": null,
733
+ "guidelines": [
734
+ "Use before creating a new artboard to avoid overlaps.",
735
+ "The returned coordinates are suggestions; the operator may override them."
736
+ ],
737
+ "safetyContract": {
738
+ "modes": [
739
+ "mock"
740
+ ],
741
+ "guarantees": {
742
+ "mock": {
743
+ "networkSpend": "forbidden",
744
+ "filesystemWrites": "none",
745
+ "filesystemRoots": [],
746
+ "externalMutations": "forbidden",
747
+ "requiresConfirmation": false
748
+ }
749
+ },
750
+ "fixtureRefs": [
751
+ "./tool-walk/safety-fixtures.json#paper_find_placement-mock-safety"
752
+ ],
753
+ "outputBudget": {
754
+ "maxBytes": 12288,
755
+ "maxLines": 200
756
+ }
757
+ }
758
+ },
759
+ {
760
+ "id": "paper_mcp_reachability_check",
761
+ "version": 1,
762
+ "label": "Paper: MCP Reachability Check",
763
+ "description": "Check whether Paper Desktop's MCP server is reachable on http://127.0.0.1:29979/mcp. Use before other Paper tools to decide whether to use live Paper state or a fixture.",
764
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
765
+ "sourcePack": null,
766
+ "demandRefs": [
767
+ "mono-fleet-era:paper-tool-contract",
768
+ "audit:paper-doctor"
769
+ ],
770
+ "safety": "read",
771
+ "requires": {
772
+ "allOf": [],
773
+ "anyOf": [],
774
+ "cli": [
775
+ "paper mono"
776
+ ],
777
+ "endpoint": [
778
+ "http://127.0.0.1:29979/mcp"
779
+ ],
780
+ "optional": false
781
+ },
782
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
783
+ "output": {
784
+ "envelope": "mono-tool-result.v1",
785
+ "maxBytes": 12288,
786
+ "maxItems": 50
787
+ },
788
+ "doctorProbe": "endpoint",
789
+ "cases": [
790
+ "./tool-walk/fixtures.json#paper-mcp-reachability-check"
791
+ ],
792
+ "cliFallback": null,
793
+ "guidelines": [
794
+ "Call this before any other Paper tool to decide whether live Paper state is available.",
795
+ "If unreachable, explain the exact failure (app not running vs transport/schema error)."
796
+ ],
797
+ "safetyContract": {
798
+ "modes": [
799
+ "mock"
800
+ ],
801
+ "guarantees": {
802
+ "mock": {
803
+ "networkSpend": "forbidden",
804
+ "filesystemWrites": "none",
805
+ "filesystemRoots": [],
806
+ "externalMutations": "forbidden",
807
+ "requiresConfirmation": false
808
+ }
809
+ },
810
+ "fixtureRefs": [
811
+ "./tool-walk/safety-fixtures.json#paper_mcp_reachability_check-mock-safety"
812
+ ],
813
+ "outputBudget": {
814
+ "maxBytes": 12288,
815
+ "maxLines": 200
816
+ }
817
+ }
818
+ },
819
+ {
820
+ "id": "paper_style_tokens_extract",
821
+ "version": 1,
822
+ "label": "Paper: Extract Style Tokens",
823
+ "description": "Extract design tokens (colors, typography, spacing, fonts) from one or more Paper nodes by reading computed styles and font metadata, then emit a JSON token file. Useful for grounding code implementation in actual Paper styles.",
824
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
825
+ "sourcePack": null,
826
+ "demandRefs": [
827
+ "mono-fleet-era:paper-tool-contract",
828
+ "audit:paper-reads"
829
+ ],
830
+ "safety": "mutate",
831
+ "requires": {
832
+ "allOf": [
833
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
834
+ ],
835
+ "anyOf": [],
836
+ "cli": [
837
+ "paper mono"
838
+ ],
839
+ "endpoint": [],
840
+ "optional": false
841
+ },
842
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
843
+ "output": {
844
+ "envelope": "mono-tool-result.v1",
845
+ "maxBytes": 24576,
846
+ "maxItems": 50
847
+ },
848
+ "doctorProbe": "endpoint",
849
+ "cases": [
850
+ "./tool-walk/fixtures.json#paper-style-tokens-extract"
851
+ ],
852
+ "cliFallback": null,
853
+ "guidelines": [
854
+ "Use to ground code implementation in actual Paper styles.",
855
+ "Dry-run first; live extraction requires an approved absolute project-local output path."
856
+ ],
857
+ "safetyContract": {
858
+ "modes": [
859
+ "mock"
860
+ ],
861
+ "guarantees": {
862
+ "mock": {
863
+ "networkSpend": "forbidden",
864
+ "filesystemWrites": "none",
865
+ "filesystemRoots": [],
866
+ "externalMutations": "forbidden",
867
+ "requiresConfirmation": false
868
+ }
869
+ },
870
+ "fixtureRefs": [
871
+ "./tool-walk/safety-fixtures.json#paper_style_tokens_extract-mock-safety"
872
+ ],
873
+ "outputBudget": {
874
+ "maxBytes": 12288,
875
+ "maxLines": 200
876
+ }
877
+ }
878
+ },
879
+ {
880
+ "id": "paper_materialize_system_direction",
881
+ "version": 1,
882
+ "label": "Paper: Materialize System Direction",
883
+ "description": "Create a new, non-destructive system-direction artboard from literal inline HTML, place it without overlap, screenshot the result, and return an execution receipt. Always dry-run first.",
884
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
885
+ "sourcePack": null,
886
+ "demandRefs": [
887
+ "campaign-20260725-specialist-excellence:paper-showpiece",
888
+ "audit:paper-mutations"
889
+ ],
890
+ "safety": "mutate",
891
+ "requires": {
892
+ "allOf": [
893
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
894
+ "Operator approval after a successful dry run"
895
+ ],
896
+ "anyOf": [],
897
+ "cli": [
898
+ "paper mono"
899
+ ],
900
+ "endpoint": [],
901
+ "optional": false
902
+ },
903
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
904
+ "output": {
905
+ "envelope": "mono-tool-result.v1",
906
+ "maxBytes": 24576,
907
+ "maxItems": 50
908
+ },
909
+ "doctorProbe": "endpoint",
910
+ "cases": [
911
+ "./tool-walk/fixtures.json#paper-materialize-system-direction-dry-run"
912
+ ],
913
+ "cliFallback": null,
914
+ "guidelines": [
915
+ "Run with dryRun=true first and show the five-step receipt before requesting approval.",
916
+ "Create a new adjacent artboard; never replace source artboards.",
917
+ "Treat the returned screenshot as the live materialization proof."
918
+ ],
919
+ "safetyContract": {
920
+ "modes": [
921
+ "dry_run",
922
+ "confirm-gate"
923
+ ],
924
+ "guarantees": {
925
+ "dry_run": {
926
+ "networkSpend": "forbidden",
927
+ "filesystemWrites": "none",
928
+ "filesystemRoots": [],
929
+ "externalMutations": "forbidden",
930
+ "requiresConfirmation": false
931
+ },
932
+ "confirm-gate": {
933
+ "networkSpend": "forbidden",
934
+ "filesystemWrites": "none",
935
+ "filesystemRoots": [],
936
+ "externalMutations": "confirm-gated",
937
+ "requiresConfirmation": true
938
+ }
939
+ },
940
+ "fixtureRefs": [
941
+ "./tool-walk/safety-fixtures.json#paper_materialize_system_direction-dry-run-safety",
942
+ "./tool-walk/safety-fixtures.json#paper_materialize_system_direction-confirm-gate-safety"
943
+ ],
944
+ "outputBudget": {
945
+ "maxBytes": 24576,
946
+ "maxLines": 300
947
+ }
948
+ }
949
+ },
950
+ {
951
+ "id": "paper_create_page",
952
+ "version": 1,
953
+ "label": "Paper: Create Page",
954
+ "description": "Create one explicitly named page in an explicit Paper file and return its page ID. This does not open, rename, overwrite, or delete any page.",
955
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
956
+ "sourcePack": null,
957
+ "demandRefs": [
958
+ "goal-paper-guarded-page-operator:create",
959
+ "audit:paper-mutations"
960
+ ],
961
+ "safety": "mutate",
962
+ "requires": {
963
+ "allOf": [
964
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
965
+ "Explicit file ID and non-empty page name"
966
+ ],
967
+ "anyOf": [],
968
+ "cli": [
969
+ "paper mono"
970
+ ],
971
+ "endpoint": [],
972
+ "optional": false
973
+ },
974
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
975
+ "output": {
976
+ "envelope": "mono-tool-result.v1",
977
+ "maxBytes": 4096,
978
+ "maxItems": 1
979
+ },
980
+ "doctorProbe": "endpoint",
981
+ "cases": [
982
+ "./tool-walk/fixtures.json#paper-create-page"
983
+ ],
984
+ "cliFallback": null,
985
+ "guidelines": [
986
+ "Require an explicit file ID and non-empty page name; never infer either target.",
987
+ "Return the provider-created page ID and keep creation separate from opening.",
988
+ "Do not delete, rename, overwrite, or auto-select an existing same-name page."
989
+ ],
990
+ "safetyContract": {
991
+ "modes": [
992
+ "mock"
993
+ ],
994
+ "guarantees": {
995
+ "mock": {
996
+ "networkSpend": "forbidden",
997
+ "filesystemWrites": "none",
998
+ "filesystemRoots": [],
999
+ "externalMutations": "forbidden",
1000
+ "requiresConfirmation": false
1001
+ }
1002
+ },
1003
+ "fixtureRefs": [
1004
+ "./tool-walk/safety-fixtures.json#paper_create_page-mock-safety"
1005
+ ],
1006
+ "outputBudget": {
1007
+ "maxBytes": 4096,
1008
+ "maxLines": 80
1009
+ }
1010
+ }
1011
+ },
1012
+ {
1013
+ "id": "paper_open_page",
1014
+ "version": 1,
1015
+ "label": "Paper: Open Page",
1016
+ "description": "Open an explicit Paper file and page, then return a receipt only when Paper reports that exact target as active. This cannot infer a target or alter page contents.",
1017
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1018
+ "sourcePack": null,
1019
+ "demandRefs": [
1020
+ "goal-paper-guarded-page-operator:open",
1021
+ "audit:paper-mutations"
1022
+ ],
1023
+ "safety": "mutate",
1024
+ "requires": {
1025
+ "allOf": [
1026
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
1027
+ "Explicit file ID and page ID"
1028
+ ],
1029
+ "anyOf": [],
1030
+ "cli": [
1031
+ "paper mono"
1032
+ ],
1033
+ "endpoint": [],
1034
+ "optional": false
1035
+ },
1036
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1037
+ "output": {
1038
+ "envelope": "mono-tool-result.v1",
1039
+ "maxBytes": 4096,
1040
+ "maxItems": 1
1041
+ },
1042
+ "doctorProbe": "endpoint",
1043
+ "cases": [
1044
+ "./tool-walk/fixtures.json#paper-open-page"
1045
+ ],
1046
+ "cliFallback": null,
1047
+ "guidelines": [
1048
+ "Require explicit file and page IDs; never infer the active target.",
1049
+ "Treat open_file basic-info output as proof only when it reports the requested file and page.",
1050
+ "Keep opening separate from page creation so partial completion remains reportable."
1051
+ ],
1052
+ "safetyContract": {
1053
+ "modes": [
1054
+ "mock"
1055
+ ],
1056
+ "guarantees": {
1057
+ "mock": {
1058
+ "networkSpend": "forbidden",
1059
+ "filesystemWrites": "none",
1060
+ "filesystemRoots": [],
1061
+ "externalMutations": "forbidden",
1062
+ "requiresConfirmation": false
1063
+ }
1064
+ },
1065
+ "fixtureRefs": [
1066
+ "./tool-walk/safety-fixtures.json#paper_open_page-mock-safety"
1067
+ ],
1068
+ "outputBudget": {
1069
+ "maxBytes": 4096,
1070
+ "maxLines": 80
1071
+ }
1072
+ }
1073
+ },
1074
+ {
1075
+ "id": "paper_rename_nodes",
1076
+ "version": 1,
1077
+ "label": "Paper: Rename Nodes Safely",
1078
+ "description": "Rename exactly the listed Paper nodes through a dry-run and explicit-confirmation receipt. This cannot edit styles, content, hierarchy, or delete nodes. Targets not created in this process session and active file require sourceAcknowledgement='rename-source'.",
1079
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1080
+ "sourcePack": null,
1081
+ "demandRefs": [
1082
+ "goal-paper-operator-control:rename",
1083
+ "audit:paper-mutations"
1084
+ ],
1085
+ "safety": "mutate",
1086
+ "requires": {
1087
+ "allOf": [
1088
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
1089
+ "Operator approval after a successful dry run"
1090
+ ],
1091
+ "anyOf": [],
1092
+ "cli": [
1093
+ "paper mono"
1094
+ ],
1095
+ "endpoint": [],
1096
+ "optional": false
1097
+ },
1098
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1099
+ "output": {
1100
+ "envelope": "mono-tool-result.v1",
1101
+ "maxBytes": 24576,
1102
+ "maxItems": 50
1103
+ },
1104
+ "doctorProbe": "endpoint",
1105
+ "cases": [
1106
+ "./tool-walk/fixtures.json#paper-rename-nodes-dry-run"
1107
+ ],
1108
+ "cliFallback": null,
1109
+ "guidelines": [
1110
+ "Run with dryRun=true first and review the exact node IDs and replacement names.",
1111
+ "Use confirm=true for a live rename; add sourceAcknowledgement='rename-source' for targets not created in this process session and active file.",
1112
+ "Use only for names; it cannot change styles, content, hierarchy, or delete nodes."
1113
+ ],
1114
+ "safetyContract": {
1115
+ "modes": [
1116
+ "dry_run",
1117
+ "confirm-gate"
1118
+ ],
1119
+ "guarantees": {
1120
+ "dry_run": {
1121
+ "networkSpend": "forbidden",
1122
+ "filesystemWrites": "none",
1123
+ "filesystemRoots": [],
1124
+ "externalMutations": "forbidden",
1125
+ "requiresConfirmation": false
1126
+ },
1127
+ "confirm-gate": {
1128
+ "networkSpend": "forbidden",
1129
+ "filesystemWrites": "none",
1130
+ "filesystemRoots": [],
1131
+ "externalMutations": "confirm-gated",
1132
+ "requiresConfirmation": true
1133
+ }
1134
+ },
1135
+ "fixtureRefs": [
1136
+ "./tool-walk/safety-fixtures.json#paper_rename_nodes-dry-run-safety",
1137
+ "./tool-walk/safety-fixtures.json#paper_rename_nodes-confirm-gate-safety"
1138
+ ],
1139
+ "outputBudget": {
1140
+ "maxBytes": 24576,
1141
+ "maxLines": 300
1142
+ }
1143
+ }
1144
+ },
1145
+ {
1146
+ "id": "paper_revise_artboard",
1147
+ "version": 1,
1148
+ "label": "Paper: Revise Artboard Safely",
1149
+ "description": "Replace only the children of one existing Paper artboard from validated literal inline-CSS HTML, then screenshot the result. This cannot replace the artboard root or touch siblings. Artboards not created in this process session and active file require sourceAcknowledgement='revise-source'.",
1150
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1151
+ "sourcePack": null,
1152
+ "demandRefs": [
1153
+ "goal-paper-operator-control:revise",
1154
+ "audit:paper-mutations"
1155
+ ],
1156
+ "safety": "mutate",
1157
+ "requires": {
1158
+ "allOf": [
1159
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
1160
+ "Operator approval after a successful dry run"
1161
+ ],
1162
+ "anyOf": [],
1163
+ "cli": [
1164
+ "paper mono"
1165
+ ],
1166
+ "endpoint": [],
1167
+ "optional": false
1168
+ },
1169
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1170
+ "output": {
1171
+ "envelope": "mono-tool-result.v1",
1172
+ "maxBytes": 24576,
1173
+ "maxItems": 50
1174
+ },
1175
+ "doctorProbe": "endpoint",
1176
+ "cases": [
1177
+ "./tool-walk/fixtures.json#paper-revise-artboard-dry-run"
1178
+ ],
1179
+ "cliFallback": null,
1180
+ "guidelines": [
1181
+ "Run with dryRun=true first and review the target artboard and literal HTML.",
1182
+ "Use confirm=true for a live revision; add sourceAcknowledgement='revise-source' for an artboard not created in this process session and active file.",
1183
+ "Use literal inline-CSS HTML only; the tool replaces children, preserves the artboard root, and screenshots the result."
1184
+ ],
1185
+ "safetyContract": {
1186
+ "modes": [
1187
+ "dry_run",
1188
+ "confirm-gate"
1189
+ ],
1190
+ "guarantees": {
1191
+ "dry_run": {
1192
+ "networkSpend": "forbidden",
1193
+ "filesystemWrites": "none",
1194
+ "filesystemRoots": [],
1195
+ "externalMutations": "forbidden",
1196
+ "requiresConfirmation": false
1197
+ },
1198
+ "confirm-gate": {
1199
+ "networkSpend": "forbidden",
1200
+ "filesystemWrites": "none",
1201
+ "filesystemRoots": [],
1202
+ "externalMutations": "confirm-gated",
1203
+ "requiresConfirmation": true
1204
+ }
1205
+ },
1206
+ "fixtureRefs": [
1207
+ "./tool-walk/safety-fixtures.json#paper_revise_artboard-dry-run-safety",
1208
+ "./tool-walk/safety-fixtures.json#paper_revise_artboard-confirm-gate-safety"
1209
+ ],
1210
+ "outputBudget": {
1211
+ "maxBytes": 24576,
1212
+ "maxLines": 300
1213
+ }
1214
+ }
1215
+ },
1216
+ {
1217
+ "id": "paper_delete_nodes",
1218
+ "version": 1,
1219
+ "label": "Paper: Delete Nodes Safely",
1220
+ "description": "Delete exactly the listed Paper nodes and descendants after a dry run, explicit confirmation, named-node preflight, and absence verification. This cannot delete root or page nodes. Targets not created in this process session and active file require sourceAcknowledgement='delete-source'.",
1221
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1222
+ "sourcePack": null,
1223
+ "demandRefs": [
1224
+ "goal-paper-operator-control:delete",
1225
+ "audit:paper-mutations"
1226
+ ],
1227
+ "safety": "mutate",
1228
+ "requires": {
1229
+ "allOf": [
1230
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
1231
+ "Operator approval after a successful dry run"
1232
+ ],
1233
+ "anyOf": [],
1234
+ "cli": [
1235
+ "paper mono"
1236
+ ],
1237
+ "endpoint": [],
1238
+ "optional": false
1239
+ },
1240
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1241
+ "output": {
1242
+ "envelope": "mono-tool-result.v1",
1243
+ "maxBytes": 24576,
1244
+ "maxItems": 50
1245
+ },
1246
+ "doctorProbe": "endpoint",
1247
+ "cases": [
1248
+ "./tool-walk/fixtures.json#paper-delete-nodes-dry-run"
1249
+ ],
1250
+ "cliFallback": null,
1251
+ "guidelines": [
1252
+ "Run with dryRun=true first and review every exact node ID before deletion.",
1253
+ "Use confirm=true for a live delete; add sourceAcknowledgement='delete-source' for targets not created in this process session and active file.",
1254
+ "The tool refuses root/page nodes, preflights names, and verifies each deleted ID returns not-found."
1255
+ ],
1256
+ "safetyContract": {
1257
+ "modes": [
1258
+ "dry_run",
1259
+ "confirm-gate"
1260
+ ],
1261
+ "guarantees": {
1262
+ "dry_run": {
1263
+ "networkSpend": "forbidden",
1264
+ "filesystemWrites": "none",
1265
+ "filesystemRoots": [],
1266
+ "externalMutations": "forbidden",
1267
+ "requiresConfirmation": false
1268
+ },
1269
+ "confirm-gate": {
1270
+ "networkSpend": "forbidden",
1271
+ "filesystemWrites": "none",
1272
+ "filesystemRoots": [],
1273
+ "externalMutations": "confirm-gated",
1274
+ "requiresConfirmation": true
1275
+ }
1276
+ },
1277
+ "fixtureRefs": [
1278
+ "./tool-walk/safety-fixtures.json#paper_delete_nodes-dry-run-safety",
1279
+ "./tool-walk/safety-fixtures.json#paper_delete_nodes-confirm-gate-safety"
1280
+ ],
1281
+ "outputBudget": {
1282
+ "maxBytes": 24576,
1283
+ "maxLines": 300
1284
+ }
1285
+ }
1286
+ },
1287
+ {
1288
+ "id": "paper_find_nodes",
1289
+ "version": 1,
1290
+ "label": "Paper: Find Nodes Safely",
1291
+ "description": "Find Paper nodes by computed-style filters and/or text in an explicitly targeted file. scopeId must be an exact node ID; the belt preflights it and rejects names or stale IDs instead of returning a misleading empty result.",
1292
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1293
+ "sourcePack": null,
1294
+ "demandRefs": [
1295
+ "paper-belt-20260825:item-9",
1296
+ "audit:paper-reads"
1297
+ ],
1298
+ "safety": "read",
1299
+ "requires": {
1300
+ "allOf": [
1301
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
1302
+ ],
1303
+ "anyOf": [],
1304
+ "cli": [
1305
+ "paper mono"
1306
+ ],
1307
+ "endpoint": [],
1308
+ "optional": false
1309
+ },
1310
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1311
+ "output": {
1312
+ "envelope": "mono-tool-result.v1",
1313
+ "maxBytes": 12288,
1314
+ "maxItems": 50
1315
+ },
1316
+ "doctorProbe": "endpoint",
1317
+ "cases": [
1318
+ "./tool-walk/fixtures.json#paper-find-nodes"
1319
+ ],
1320
+ "cliFallback": null,
1321
+ "guidelines": [
1322
+ "Pass fileId to bind the query to the intended Paper file.",
1323
+ "Pass scopeId only after obtaining an actual node ID from a Paper read; names are rejected loudly."
1324
+ ],
1325
+ "safetyContract": {
1326
+ "modes": [
1327
+ "mock"
1328
+ ],
1329
+ "guarantees": {
1330
+ "mock": {
1331
+ "networkSpend": "forbidden",
1332
+ "filesystemWrites": "none",
1333
+ "filesystemRoots": [],
1334
+ "externalMutations": "forbidden",
1335
+ "requiresConfirmation": false
1336
+ }
1337
+ },
1338
+ "fixtureRefs": [
1339
+ "./tool-walk/safety-fixtures.json#paper_find_nodes-mock-safety"
1340
+ ],
1341
+ "outputBudget": {
1342
+ "maxBytes": 12288,
1343
+ "maxLines": 200
1344
+ }
1345
+ }
1346
+ },
1347
+ {
1348
+ "id": "paper_get_tokens",
1349
+ "version": 1,
1350
+ "label": "Paper: Get Tokens",
1351
+ "description": "List the explicit file's flat design-token namespace in JSON, CSS, or Tailwind format. Paper currently supports breakpoint, color, container, fontFamily, fontSize, fontWeight, letterSpacing, lineHeight, radius, and spacing only; it has no shadow/duration/easing types or theme dimension.",
1352
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1353
+ "sourcePack": null,
1354
+ "demandRefs": [
1355
+ "paper-belt-20260825:item-2",
1356
+ "audit:paper-reads"
1357
+ ],
1358
+ "safety": "read",
1359
+ "requires": {
1360
+ "allOf": [
1361
+ "Paper Desktop running at http://127.0.0.1:29979/mcp"
1362
+ ],
1363
+ "anyOf": [],
1364
+ "cli": [
1365
+ "paper mono"
1366
+ ],
1367
+ "endpoint": [],
1368
+ "optional": false
1369
+ },
1370
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1371
+ "output": {
1372
+ "envelope": "mono-tool-result.v1",
1373
+ "maxBytes": 24576,
1374
+ "maxItems": 100
1375
+ },
1376
+ "doctorProbe": "endpoint",
1377
+ "cases": [
1378
+ "./tool-walk/fixtures.json#paper-get-tokens"
1379
+ ],
1380
+ "cliFallback": null,
1381
+ "guidelines": [
1382
+ "Pass fileId even though reads remain optional for provider compatibility.",
1383
+ "Paper currently exposes a flat token namespace and ten provider token types; it does not expose modes."
1384
+ ],
1385
+ "safetyContract": {
1386
+ "modes": [
1387
+ "mock"
1388
+ ],
1389
+ "guarantees": {
1390
+ "mock": {
1391
+ "networkSpend": "forbidden",
1392
+ "filesystemWrites": "none",
1393
+ "filesystemRoots": [],
1394
+ "externalMutations": "forbidden",
1395
+ "requiresConfirmation": false
1396
+ }
1397
+ },
1398
+ "fixtureRefs": [
1399
+ "./tool-walk/safety-fixtures.json#paper_get_tokens-mock-safety"
1400
+ ],
1401
+ "outputBudget": {
1402
+ "maxBytes": 24576,
1403
+ "maxLines": 300
1404
+ }
1405
+ }
1406
+ },
1407
+ {
1408
+ "id": "paper_capture_provenance",
1409
+ "version": 1,
1410
+ "label": "Paper: Prepare Capture Provenance",
1411
+ "description": "Prepare a deterministic Paper capture/import name and provenance record before capture. The generated <=50-character artboardName carries route, viewport, theme, and UTC date; the receipt retains the full source URL for a sidecar manifest.",
1412
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1413
+ "sourcePack": null,
1414
+ "demandRefs": [
1415
+ "paper-belt-20260825:item-11",
1416
+ "audit:capture-provenance"
1417
+ ],
1418
+ "safety": "read",
1419
+ "requires": {
1420
+ "allOf": [],
1421
+ "anyOf": [],
1422
+ "cli": [
1423
+ "paper mono"
1424
+ ],
1425
+ "endpoint": [],
1426
+ "optional": false
1427
+ },
1428
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1429
+ "output": {
1430
+ "envelope": "mono-tool-result.v1",
1431
+ "maxBytes": 12288,
1432
+ "maxItems": 50
1433
+ },
1434
+ "doctorProbe": "none",
1435
+ "cases": [
1436
+ "./tool-walk/fixtures.json#paper-capture-provenance"
1437
+ ],
1438
+ "cliFallback": null,
1439
+ "guidelines": [
1440
+ "Call before importing every browser or device capture and use the returned artboardName instead of Frame.",
1441
+ "Persist the returned provenance sidecar with the capture receipt."
1442
+ ],
1443
+ "safetyContract": {
1444
+ "modes": [
1445
+ "mock"
1446
+ ],
1447
+ "guarantees": {
1448
+ "mock": {
1449
+ "networkSpend": "forbidden",
1450
+ "filesystemWrites": "none",
1451
+ "filesystemRoots": [],
1452
+ "externalMutations": "forbidden",
1453
+ "requiresConfirmation": false
1454
+ }
1455
+ },
1456
+ "fixtureRefs": [
1457
+ "./tool-walk/safety-fixtures.json#paper_capture_provenance-mock-safety"
1458
+ ],
1459
+ "outputBudget": {
1460
+ "maxBytes": 12288,
1461
+ "maxLines": 200
1462
+ }
1463
+ }
1464
+ },
1465
+ {
1466
+ "id": "paper_create_tokens",
1467
+ "version": 1,
1468
+ "label": "Paper: Create Tokens Safely",
1469
+ "description": "Create file-scoped Paper design tokens through dry-run, explicit confirmation, and a per-entry receipt. The belt rejects unsupported types and known provider-invalid color-mix()/size-alias expressions before transport.",
1470
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1471
+ "sourcePack": null,
1472
+ "demandRefs": [
1473
+ "paper-belt-20260825:item-2",
1474
+ "audit:paper-mutations"
1475
+ ],
1476
+ "safety": "mutate",
1477
+ "requires": {
1478
+ "allOf": [
1479
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
1480
+ "Operator approval after a successful dry run"
1481
+ ],
1482
+ "anyOf": [],
1483
+ "cli": [
1484
+ "paper mono"
1485
+ ],
1486
+ "endpoint": [],
1487
+ "optional": false
1488
+ },
1489
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1490
+ "output": {
1491
+ "envelope": "mono-tool-result.v1",
1492
+ "maxBytes": 24576,
1493
+ "maxItems": 100
1494
+ },
1495
+ "doctorProbe": "endpoint",
1496
+ "cases": [
1497
+ "./tool-walk/fixtures.json#paper-create-tokens-dry-run"
1498
+ ],
1499
+ "cliFallback": null,
1500
+ "guidelines": [
1501
+ "Run with dryRun=true first; live creation requires fileId and confirm=true.",
1502
+ "Supported types are breakpoint, color, container, fontFamily, fontSize, fontWeight, letterSpacing, lineHeight, radius, and spacing.",
1503
+ "Paper does not currently support shadow, duration, easing, token modes, color-mix(), or var() aliases for radius, spacing, and fontSize."
1504
+ ],
1505
+ "safetyContract": {
1506
+ "modes": [
1507
+ "dry_run",
1508
+ "confirm-gate"
1509
+ ],
1510
+ "guarantees": {
1511
+ "dry_run": {
1512
+ "networkSpend": "forbidden",
1513
+ "filesystemWrites": "none",
1514
+ "filesystemRoots": [],
1515
+ "externalMutations": "forbidden",
1516
+ "requiresConfirmation": false
1517
+ },
1518
+ "confirm-gate": {
1519
+ "networkSpend": "forbidden",
1520
+ "filesystemWrites": "none",
1521
+ "filesystemRoots": [],
1522
+ "externalMutations": "confirm-gated",
1523
+ "requiresConfirmation": true
1524
+ }
1525
+ },
1526
+ "fixtureRefs": [
1527
+ "./tool-walk/safety-fixtures.json#paper_create_tokens-dry-run-safety",
1528
+ "./tool-walk/safety-fixtures.json#paper_create_tokens-confirm-gate-safety"
1529
+ ],
1530
+ "outputBudget": {
1531
+ "maxBytes": 24576,
1532
+ "maxLines": 300
1533
+ }
1534
+ }
1535
+ },
1536
+ {
1537
+ "id": "paper_set_tokens",
1538
+ "version": 1,
1539
+ "label": "Paper: Set Tokens Safely",
1540
+ "description": "Rename, update, describe, or delete existing file-scoped Paper tokens through dry-run, explicit confirmation, source-token acknowledgement, and preserved per-entry results.",
1541
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1542
+ "sourcePack": null,
1543
+ "demandRefs": [
1544
+ "paper-belt-20260825:item-2",
1545
+ "audit:paper-mutations"
1546
+ ],
1547
+ "safety": "mutate",
1548
+ "requires": {
1549
+ "allOf": [
1550
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
1551
+ "Operator approval and sourceAcknowledgement='set-source-tokens' after a successful dry run"
1552
+ ],
1553
+ "anyOf": [],
1554
+ "cli": [
1555
+ "paper mono"
1556
+ ],
1557
+ "endpoint": [],
1558
+ "optional": false
1559
+ },
1560
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1561
+ "output": {
1562
+ "envelope": "mono-tool-result.v1",
1563
+ "maxBytes": 24576,
1564
+ "maxItems": 100
1565
+ },
1566
+ "doctorProbe": "endpoint",
1567
+ "cases": [
1568
+ "./tool-walk/fixtures.json#paper-set-tokens-dry-run"
1569
+ ],
1570
+ "cliFallback": null,
1571
+ "guidelines": [
1572
+ "Run with dryRun=true first; live updates require fileId, confirm=true, and sourceAcknowledgement='set-source-tokens'.",
1573
+ "The belt rejects expression values conservatively because set_tokens does not report token type in its input schema."
1574
+ ],
1575
+ "safetyContract": {
1576
+ "modes": [
1577
+ "dry_run",
1578
+ "confirm-gate"
1579
+ ],
1580
+ "guarantees": {
1581
+ "dry_run": {
1582
+ "networkSpend": "forbidden",
1583
+ "filesystemWrites": "none",
1584
+ "filesystemRoots": [],
1585
+ "externalMutations": "forbidden",
1586
+ "requiresConfirmation": false
1587
+ },
1588
+ "confirm-gate": {
1589
+ "networkSpend": "forbidden",
1590
+ "filesystemWrites": "none",
1591
+ "filesystemRoots": [],
1592
+ "externalMutations": "confirm-gated",
1593
+ "requiresConfirmation": true
1594
+ }
1595
+ },
1596
+ "fixtureRefs": [
1597
+ "./tool-walk/safety-fixtures.json#paper_set_tokens-dry-run-safety",
1598
+ "./tool-walk/safety-fixtures.json#paper_set_tokens-confirm-gate-safety"
1599
+ ],
1600
+ "outputBudget": {
1601
+ "maxBytes": 24576,
1602
+ "maxLines": 300
1603
+ }
1604
+ }
1605
+ },
1606
+ {
1607
+ "id": "paper_write_html",
1608
+ "version": 1,
1609
+ "label": "Paper: Write HTML Safely",
1610
+ "description": "Insert one incremental inline-HTML item under an exact target after dry-run and confirmation. The receipt always surfaces the provider response as payload.createdNodes (for example {createdNodes:[{id,name}]}); replacement is intentionally handled by paper_revise_artboard.",
1611
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1612
+ "sourcePack": null,
1613
+ "demandRefs": [
1614
+ "paper-belt-20260825:item-4",
1615
+ "audit:paper-mutations"
1616
+ ],
1617
+ "safety": "mutate",
1618
+ "requires": {
1619
+ "allOf": [
1620
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
1621
+ "Operator approval and sourceAcknowledgement='write-source' after a successful dry run"
1622
+ ],
1623
+ "anyOf": [],
1624
+ "cli": [
1625
+ "paper mono"
1626
+ ],
1627
+ "endpoint": [],
1628
+ "optional": false
1629
+ },
1630
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1631
+ "output": {
1632
+ "envelope": "mono-tool-result.v1",
1633
+ "maxBytes": 24576,
1634
+ "maxItems": 100
1635
+ },
1636
+ "doctorProbe": "endpoint",
1637
+ "cases": [
1638
+ "./tool-walk/fixtures.json#paper-write-html-dry-run"
1639
+ ],
1640
+ "cliFallback": null,
1641
+ "guidelines": [
1642
+ "Only insert-children mode is exposed; broad raw write_html remains private.",
1643
+ "Run with dryRun=true first; live insertion requires fileId, confirm=true, and sourceAcknowledgement='write-source'.",
1644
+ "Use payload.createdNodes from the receipt and never guess generated IDs."
1645
+ ],
1646
+ "safetyContract": {
1647
+ "modes": [
1648
+ "dry_run",
1649
+ "confirm-gate"
1650
+ ],
1651
+ "guarantees": {
1652
+ "dry_run": {
1653
+ "networkSpend": "forbidden",
1654
+ "filesystemWrites": "none",
1655
+ "filesystemRoots": [],
1656
+ "externalMutations": "forbidden",
1657
+ "requiresConfirmation": false
1658
+ },
1659
+ "confirm-gate": {
1660
+ "networkSpend": "forbidden",
1661
+ "filesystemWrites": "none",
1662
+ "filesystemRoots": [],
1663
+ "externalMutations": "confirm-gated",
1664
+ "requiresConfirmation": true
1665
+ }
1666
+ },
1667
+ "fixtureRefs": [
1668
+ "./tool-walk/safety-fixtures.json#paper_write_html-dry-run-safety",
1669
+ "./tool-walk/safety-fixtures.json#paper_write_html-confirm-gate-safety"
1670
+ ],
1671
+ "outputBudget": {
1672
+ "maxBytes": 24576,
1673
+ "maxLines": 300
1674
+ }
1675
+ }
1676
+ },
1677
+ {
1678
+ "id": "paper_move_nodes",
1679
+ "version": 1,
1680
+ "label": "Paper: Move Nodes Safely",
1681
+ "description": "Move exact node IDs through dry-run, confirmation, and a receipt while preserving identity. Every live destination must be separately typed and fingerprinted in the approved brief; the root alias and unverified cross-page roots are rejected by the public runtime. The receipt surfaces resolved moves and affectedParents.",
1682
+ "handlerRef": "./src/core/tools/paper-mcp.ts#paperTools",
1683
+ "sourcePack": null,
1684
+ "demandRefs": [
1685
+ "paper-belt-20260825:item-10",
1686
+ "audit:paper-mutations"
1687
+ ],
1688
+ "safety": "mutate",
1689
+ "requires": {
1690
+ "allOf": [
1691
+ "Paper Desktop running at http://127.0.0.1:29979/mcp",
1692
+ "Operator approval and sourceAcknowledgement='move-source' after a successful dry run"
1693
+ ],
1694
+ "anyOf": [],
1695
+ "cli": [
1696
+ "paper mono"
1697
+ ],
1698
+ "endpoint": [],
1699
+ "optional": false
1700
+ },
1701
+ "inputSchemaRef": "./src/core/tools/paper-mcp.ts",
1702
+ "output": {
1703
+ "envelope": "mono-tool-result.v1",
1704
+ "maxBytes": 24576,
1705
+ "maxItems": 100
1706
+ },
1707
+ "doctorProbe": "endpoint",
1708
+ "cases": [
1709
+ "./tool-walk/fixtures.json#paper-move-nodes-dry-run"
1710
+ ],
1711
+ "cliFallback": null,
1712
+ "guidelines": [
1713
+ "Run with dryRun=true first; live moves require fileId, confirm=true, and sourceAcknowledgement='move-source'.",
1714
+ "Declare every live destination separately in paperTarget.moveDestinations and retain payload.affectedParents as the receipt."
1715
+ ],
1716
+ "safetyContract": {
1717
+ "modes": [
1718
+ "dry_run",
1719
+ "confirm-gate"
1720
+ ],
1721
+ "guarantees": {
1722
+ "dry_run": {
1723
+ "networkSpend": "forbidden",
1724
+ "filesystemWrites": "none",
1725
+ "filesystemRoots": [],
1726
+ "externalMutations": "forbidden",
1727
+ "requiresConfirmation": false
1728
+ },
1729
+ "confirm-gate": {
1730
+ "networkSpend": "forbidden",
1731
+ "filesystemWrites": "none",
1732
+ "filesystemRoots": [],
1733
+ "externalMutations": "confirm-gated",
1734
+ "requiresConfirmation": true
1735
+ }
1736
+ },
1737
+ "fixtureRefs": [
1738
+ "./tool-walk/safety-fixtures.json#paper_move_nodes-dry-run-safety",
1739
+ "./tool-walk/safety-fixtures.json#paper_move_nodes-confirm-gate-safety"
1740
+ ],
1741
+ "outputBudget": {
1742
+ "maxBytes": 24576,
1743
+ "maxLines": 300
1744
+ }
1745
+ }
1746
+ }
1747
+ ]
1748
+ }