@codai/axiom-mcp 2.0.0 → 2.1.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.
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@codai/axiom-mcp",
3
- "version": "2.0.0",
3
+ "mcpName": "io.github.dragoscv/axiom",
4
+ "version": "2.1.0",
4
5
  "description": "AXIOM v2 MCP server (stdio) and CLI: validate, compile, check and transactionally apply content-addressed manifest bundles inside an allowlisted set of roots",
5
6
  "license": "MIT",
6
7
  "author": "Dragos Catalin Vladulescu",
@@ -44,12 +45,13 @@
44
45
  "README.md"
45
46
  ],
46
47
  "dependencies": {
47
- "@codai/axiom-apply": "2.0.0",
48
- "@codai/axiom-axm": "2.0.0",
49
- "@codai/axiom-canon": "2.0.0",
50
- "@codai/axiom-checks": "2.0.0",
51
- "@codai/axiom-plan": "2.0.0",
52
- "@codai/axiom-schema": "2.0.0",
48
+ "@codai/axiom-apply": "2.1.0",
49
+ "@codai/axiom-axm": "2.1.0",
50
+ "@codai/axiom-canon": "2.1.0",
51
+ "@codai/axiom-checks": "2.1.0",
52
+ "@codai/axiom-emitters-web": "2.1.0",
53
+ "@codai/axiom-plan": "2.1.0",
54
+ "@codai/axiom-schema": "2.1.0",
53
55
  "@modelcontextprotocol/sdk": "1.30.0",
54
56
  "zod": "4.6.5"
55
57
  },
@@ -26,7 +26,7 @@
26
26
  {
27
27
  "name": "axiom_plan_compile",
28
28
  "risk": "ACT",
29
- "description": "Compile a Plan into a content-addressed ManifestBundle (sorted artifacts, sha256 digests, in-toto planDigest). `store: cas` writes blobs under <root>/.axiom/cas instead of inlining them. When a root is given the bundle is stored under <root>/.axiom/manifests/<hex>.json so later tools can reference it by digest.",
29
+ "description": "Compile a Plan into a content-addressed ManifestBundle (sorted artifacts, sha256 digests, in-toto planDigest). `store: cas` writes blobs under <root>/.axiom/cas instead of inlining them. When a root is given the bundle is stored under <root>/.axiom/manifests/<hex>.json so later tools can reference it by digest. `template` sources are rendered by the built-in `web` emitter (see `axiom emitters`); its version is recorded in toolchain.emitters.",
30
30
  "parameters": {
31
31
  "type": "object",
32
32
  "properties": {
@@ -59,7 +59,7 @@
59
59
  {
60
60
  "name": "axiom_manifest_verify",
61
61
  "risk": "READ",
62
- "description": "Structural and content-address verification: schema, recomputed manifestDigest, every inline blob hashes to its key, attestation subject matches. Never writes.",
62
+ "description": "Structural and content-address verification: schema, recomputed manifestDigest, every inline blob hashes to its key, attestation subject matches. When a root with .axiom/trust/keys.json is available, detached DSSE signatures are verified and the trusted keyids are reported under `signatures`. Never writes.",
63
63
  "parameters": {
64
64
  "type": "object",
65
65
  "properties": {
@@ -70,6 +70,10 @@
70
70
  },
71
71
  "additionalProperties": {},
72
72
  "description": "ManifestBundle"
73
+ },
74
+ "root": {
75
+ "description": "Absolute repository root; must equal or lie inside an allowlisted --root",
76
+ "type": "string"
73
77
  }
74
78
  },
75
79
  "required": [
@@ -278,6 +282,65 @@
278
282
  "type": "object",
279
283
  "properties": {}
280
284
  }
285
+ },
286
+ {
287
+ "name": "axiom_repo_snapshot",
288
+ "risk": "READ",
289
+ "description": "Deterministic, content-addressed inventory of a root: every regular file (and symlink) as { path, bytes, sha256, mode, kind }, sorted by code point, with snapshotDigest = sha256(JCS(body)). No timestamps, no absolute paths — the same tree gives the same digest on every machine. Honours the root .gitignore, always skips .git/ and .axiom/, never follows symlinks, never leaves the root. Use it to build Plans against real pre-image digests, or diff two snapshots with `axiom snapshot-diff`.",
290
+ "parameters": {
291
+ "type": "object",
292
+ "properties": {
293
+ "root": {
294
+ "description": "Absolute repository root; must equal or lie inside an allowlisted --root",
295
+ "type": "string"
296
+ },
297
+ "include": {
298
+ "description": "Relative globs (*, **, ?) to keep; default everything",
299
+ "type": "array",
300
+ "items": {
301
+ "type": "string",
302
+ "minLength": 1
303
+ }
304
+ },
305
+ "exclude": {
306
+ "description": "Relative globs to drop",
307
+ "type": "array",
308
+ "items": {
309
+ "type": "string",
310
+ "minLength": 1
311
+ }
312
+ },
313
+ "maxFiles": {
314
+ "default": 20000,
315
+ "description": "Stop after this many files (cap 50000); sets truncated",
316
+ "type": "integer",
317
+ "minimum": 1,
318
+ "maximum": 50000
319
+ },
320
+ "maxBytes": {
321
+ "default": 67108864,
322
+ "description": "Stop once the summed size would exceed this; sets truncated",
323
+ "type": "integer",
324
+ "minimum": 0,
325
+ "maximum": 9007199254740991
326
+ },
327
+ "followSymlinks": {
328
+ "default": false,
329
+ "description": "Always false; symlinks are recorded, never followed",
330
+ "type": "boolean",
331
+ "const": false
332
+ },
333
+ "respectGitignore": {
334
+ "default": true,
335
+ "type": "boolean"
336
+ },
337
+ "withContentDigest": {
338
+ "default": true,
339
+ "description": "false → sizes only, no sha256",
340
+ "type": "boolean"
341
+ }
342
+ }
343
+ }
281
344
  }
282
345
  ]
283
346
  }
package/spec/tools.json CHANGED
@@ -68,7 +68,7 @@
68
68
  },
69
69
  {
70
70
  "name": "axiom_plan_compile",
71
- "description": "Compile a Plan into a content-addressed ManifestBundle (sorted artifacts, sha256 digests, in-toto planDigest). `store: cas` writes blobs under <root>/.axiom/cas instead of inlining them. When a root is given the bundle is stored under <root>/.axiom/manifests/<hex>.json so later tools can reference it by digest.",
71
+ "description": "Compile a Plan into a content-addressed ManifestBundle (sorted artifacts, sha256 digests, in-toto planDigest). `store: cas` writes blobs under <root>/.axiom/cas instead of inlining them. When a root is given the bundle is stored under <root>/.axiom/manifests/<hex>.json so later tools can reference it by digest. `template` sources are rendered by the built-in `web` emitter (see `axiom emitters`); its version is recorded in toolchain.emitters.",
72
72
  "riskClass": "ACT",
73
73
  "annotations": {
74
74
  "readOnlyHint": false,
@@ -255,6 +255,11 @@
255
255
  "emitters"
256
256
  ],
257
257
  "additionalProperties": false
258
+ },
259
+ "counter": {
260
+ "type": "integer",
261
+ "minimum": 0,
262
+ "maximum": 9007199254740991
258
263
  }
259
264
  },
260
265
  "required": [
@@ -374,6 +379,52 @@
374
379
  ],
375
380
  "additionalProperties": false
376
381
  },
382
+ "signatures": {
383
+ "type": "array",
384
+ "items": {
385
+ "type": "object",
386
+ "properties": {
387
+ "payloadType": {
388
+ "type": "string",
389
+ "const": "application/vnd.axiom.manifest+json"
390
+ },
391
+ "payload": {
392
+ "type": "string",
393
+ "format": "base64",
394
+ "contentEncoding": "base64",
395
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"
396
+ },
397
+ "signatures": {
398
+ "minItems": 1,
399
+ "type": "array",
400
+ "items": {
401
+ "type": "object",
402
+ "properties": {
403
+ "keyid": {
404
+ "type": "string"
405
+ },
406
+ "sig": {
407
+ "type": "string",
408
+ "format": "base64",
409
+ "contentEncoding": "base64",
410
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"
411
+ }
412
+ },
413
+ "required": [
414
+ "sig"
415
+ ],
416
+ "additionalProperties": false
417
+ }
418
+ }
419
+ },
420
+ "required": [
421
+ "payloadType",
422
+ "payload",
423
+ "signatures"
424
+ ],
425
+ "additionalProperties": false
426
+ }
427
+ },
377
428
  "blobs": {
378
429
  "default": {},
379
430
  "type": "object",
@@ -446,7 +497,7 @@
446
497
  },
447
498
  {
448
499
  "name": "axiom_manifest_verify",
449
- "description": "Structural and content-address verification: schema, recomputed manifestDigest, every inline blob hashes to its key, attestation subject matches. Never writes.",
500
+ "description": "Structural and content-address verification: schema, recomputed manifestDigest, every inline blob hashes to its key, attestation subject matches. When a root with .axiom/trust/keys.json is available, detached DSSE signatures are verified and the trusted keyids are reported under `signatures`. Never writes.",
450
501
  "riskClass": "READ",
451
502
  "annotations": {
452
503
  "readOnlyHint": true,
@@ -465,6 +516,10 @@
465
516
  },
466
517
  "additionalProperties": {},
467
518
  "description": "ManifestBundle"
519
+ },
520
+ "root": {
521
+ "description": "Absolute repository root; must equal or lie inside an allowlisted --root",
522
+ "type": "string"
468
523
  }
469
524
  },
470
525
  "required": [
@@ -537,6 +592,12 @@
537
592
  "ERR_PROVIDER_FAILED",
538
593
  "ERR_GUARD_TIMEOUT",
539
594
  "ERR_GUARD_OUTPUT",
595
+ "ERR_SIGNATURE_MISSING",
596
+ "ERR_SIGNATURE_INVALID",
597
+ "ERR_ROLLBACK",
598
+ "ERR_EMITTER_UNKNOWN",
599
+ "ERR_TEMPLATE_UNKNOWN",
600
+ "ERR_TEMPLATE_PARAMS",
540
601
  "ERR_GIT_NOT_FOUND",
541
602
  "ERR_GIT_NOT_REPO",
542
603
  "ERR_GIT_DIRTY",
@@ -544,6 +605,9 @@
544
605
  "ERR_GIT_BRANCH_INVALID",
545
606
  "ERR_GIT_FAILED",
546
607
  "ERR_REF_OFFLINE",
608
+ "ERR_NET_DISABLED",
609
+ "ERR_NET_DENIED",
610
+ "ERR_NET_FAILED",
547
611
  "ERR_NOT_CANONICAL",
548
612
  "ERR_UNSUPPORTED_OP",
549
613
  "ERR_INTERNAL"
@@ -561,6 +625,47 @@
561
625
  "message"
562
626
  ]
563
627
  }
628
+ },
629
+ "signatures": {
630
+ "type": "object",
631
+ "properties": {
632
+ "trustFile": {
633
+ "type": "string"
634
+ },
635
+ "keyids": {
636
+ "type": "array",
637
+ "items": {
638
+ "type": "string"
639
+ }
640
+ },
641
+ "findings": {
642
+ "type": "array",
643
+ "items": {
644
+ "type": "object",
645
+ "properties": {
646
+ "id": {
647
+ "type": "string"
648
+ },
649
+ "message": {
650
+ "type": "string"
651
+ }
652
+ },
653
+ "required": [
654
+ "id",
655
+ "message"
656
+ ]
657
+ }
658
+ },
659
+ "ok": {
660
+ "type": "boolean"
661
+ }
662
+ },
663
+ "required": [
664
+ "trustFile",
665
+ "keyids",
666
+ "findings",
667
+ "ok"
668
+ ]
564
669
  }
565
670
  },
566
671
  "required": [
@@ -962,6 +1067,12 @@
962
1067
  "ERR_PROVIDER_FAILED",
963
1068
  "ERR_GUARD_TIMEOUT",
964
1069
  "ERR_GUARD_OUTPUT",
1070
+ "ERR_SIGNATURE_MISSING",
1071
+ "ERR_SIGNATURE_INVALID",
1072
+ "ERR_ROLLBACK",
1073
+ "ERR_EMITTER_UNKNOWN",
1074
+ "ERR_TEMPLATE_UNKNOWN",
1075
+ "ERR_TEMPLATE_PARAMS",
965
1076
  "ERR_GIT_NOT_FOUND",
966
1077
  "ERR_GIT_NOT_REPO",
967
1078
  "ERR_GIT_DIRTY",
@@ -969,6 +1080,9 @@
969
1080
  "ERR_GIT_BRANCH_INVALID",
970
1081
  "ERR_GIT_FAILED",
971
1082
  "ERR_REF_OFFLINE",
1083
+ "ERR_NET_DISABLED",
1084
+ "ERR_NET_DENIED",
1085
+ "ERR_NET_FAILED",
972
1086
  "ERR_NOT_CANONICAL",
973
1087
  "ERR_UNSUPPORTED_OP",
974
1088
  "ERR_INTERNAL"
@@ -1214,6 +1328,12 @@
1214
1328
  "ERR_PROVIDER_FAILED",
1215
1329
  "ERR_GUARD_TIMEOUT",
1216
1330
  "ERR_GUARD_OUTPUT",
1331
+ "ERR_SIGNATURE_MISSING",
1332
+ "ERR_SIGNATURE_INVALID",
1333
+ "ERR_ROLLBACK",
1334
+ "ERR_EMITTER_UNKNOWN",
1335
+ "ERR_TEMPLATE_UNKNOWN",
1336
+ "ERR_TEMPLATE_PARAMS",
1217
1337
  "ERR_GIT_NOT_FOUND",
1218
1338
  "ERR_GIT_NOT_REPO",
1219
1339
  "ERR_GIT_DIRTY",
@@ -1221,6 +1341,9 @@
1221
1341
  "ERR_GIT_BRANCH_INVALID",
1222
1342
  "ERR_GIT_FAILED",
1223
1343
  "ERR_REF_OFFLINE",
1344
+ "ERR_NET_DISABLED",
1345
+ "ERR_NET_DENIED",
1346
+ "ERR_NET_FAILED",
1224
1347
  "ERR_NOT_CANONICAL",
1225
1348
  "ERR_UNSUPPORTED_OP",
1226
1349
  "ERR_INTERNAL"
@@ -1675,6 +1798,11 @@
1675
1798
  "additionalProperties": false
1676
1799
  }
1677
1800
  },
1801
+ "counter": {
1802
+ "type": "integer",
1803
+ "minimum": 0,
1804
+ "maximum": 9007199254740991
1805
+ },
1678
1806
  "metadata": {
1679
1807
  "default": {},
1680
1808
  "type": "object",
@@ -1744,6 +1872,12 @@
1744
1872
  "ERR_PROVIDER_FAILED",
1745
1873
  "ERR_GUARD_TIMEOUT",
1746
1874
  "ERR_GUARD_OUTPUT",
1875
+ "ERR_SIGNATURE_MISSING",
1876
+ "ERR_SIGNATURE_INVALID",
1877
+ "ERR_ROLLBACK",
1878
+ "ERR_EMITTER_UNKNOWN",
1879
+ "ERR_TEMPLATE_UNKNOWN",
1880
+ "ERR_TEMPLATE_PARAMS",
1747
1881
  "ERR_GIT_NOT_FOUND",
1748
1882
  "ERR_GIT_NOT_REPO",
1749
1883
  "ERR_GIT_DIRTY",
@@ -1751,6 +1885,9 @@
1751
1885
  "ERR_GIT_BRANCH_INVALID",
1752
1886
  "ERR_GIT_FAILED",
1753
1887
  "ERR_REF_OFFLINE",
1888
+ "ERR_NET_DISABLED",
1889
+ "ERR_NET_DENIED",
1890
+ "ERR_NET_FAILED",
1754
1891
  "ERR_NOT_CANONICAL",
1755
1892
  "ERR_UNSUPPORTED_OP",
1756
1893
  "ERR_INTERNAL"
@@ -1962,5 +2099,190 @@
1962
2099
  "roots"
1963
2100
  ]
1964
2101
  }
2102
+ },
2103
+ {
2104
+ "name": "axiom_repo_snapshot",
2105
+ "description": "Deterministic, content-addressed inventory of a root: every regular file (and symlink) as { path, bytes, sha256, mode, kind }, sorted by code point, with snapshotDigest = sha256(JCS(body)). No timestamps, no absolute paths — the same tree gives the same digest on every machine. Honours the root .gitignore, always skips .git/ and .axiom/, never follows symlinks, never leaves the root. Use it to build Plans against real pre-image digests, or diff two snapshots with `axiom snapshot-diff`.",
2106
+ "riskClass": "READ",
2107
+ "annotations": {
2108
+ "readOnlyHint": true,
2109
+ "destructiveHint": false,
2110
+ "idempotentHint": true,
2111
+ "openWorldHint": false
2112
+ },
2113
+ "inputSchema": {
2114
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2115
+ "type": "object",
2116
+ "properties": {
2117
+ "root": {
2118
+ "description": "Absolute repository root; must equal or lie inside an allowlisted --root",
2119
+ "type": "string"
2120
+ },
2121
+ "include": {
2122
+ "description": "Relative globs (*, **, ?) to keep; default everything",
2123
+ "type": "array",
2124
+ "items": {
2125
+ "type": "string",
2126
+ "minLength": 1
2127
+ }
2128
+ },
2129
+ "exclude": {
2130
+ "description": "Relative globs to drop",
2131
+ "type": "array",
2132
+ "items": {
2133
+ "type": "string",
2134
+ "minLength": 1
2135
+ }
2136
+ },
2137
+ "maxFiles": {
2138
+ "default": 20000,
2139
+ "description": "Stop after this many files (cap 50000); sets truncated",
2140
+ "type": "integer",
2141
+ "minimum": 1,
2142
+ "maximum": 50000
2143
+ },
2144
+ "maxBytes": {
2145
+ "default": 67108864,
2146
+ "description": "Stop once the summed size would exceed this; sets truncated",
2147
+ "type": "integer",
2148
+ "minimum": 0,
2149
+ "maximum": 9007199254740991
2150
+ },
2151
+ "followSymlinks": {
2152
+ "default": false,
2153
+ "description": "Always false; symlinks are recorded, never followed",
2154
+ "type": "boolean",
2155
+ "const": false
2156
+ },
2157
+ "respectGitignore": {
2158
+ "default": true,
2159
+ "type": "boolean"
2160
+ },
2161
+ "withContentDigest": {
2162
+ "default": true,
2163
+ "description": "false → sizes only, no sha256",
2164
+ "type": "boolean"
2165
+ }
2166
+ }
2167
+ },
2168
+ "outputSchema": {
2169
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2170
+ "type": "object",
2171
+ "properties": {
2172
+ "apiVersion": {
2173
+ "type": "string",
2174
+ "const": "axiom.dev/v2"
2175
+ },
2176
+ "kind": {
2177
+ "type": "string",
2178
+ "const": "RepoSnapshot"
2179
+ },
2180
+ "root": {
2181
+ "type": "object",
2182
+ "properties": {
2183
+ "kind": {
2184
+ "type": "string",
2185
+ "const": "relative"
2186
+ }
2187
+ },
2188
+ "required": [
2189
+ "kind"
2190
+ ],
2191
+ "additionalProperties": false
2192
+ },
2193
+ "snapshotDigest": {
2194
+ "type": "string",
2195
+ "pattern": "^sha256:[a-f0-9]{64}$",
2196
+ "description": "sha256:<64 lowercase hex>"
2197
+ },
2198
+ "body": {
2199
+ "type": "object",
2200
+ "properties": {
2201
+ "files": {
2202
+ "type": "array",
2203
+ "items": {
2204
+ "type": "object",
2205
+ "properties": {
2206
+ "path": {
2207
+ "type": "string",
2208
+ "minLength": 1,
2209
+ "maxLength": 1024,
2210
+ "description": "Relative POSIX path, NFC, no reserved names"
2211
+ },
2212
+ "bytes": {
2213
+ "type": "integer",
2214
+ "minimum": 0,
2215
+ "maximum": 9007199254740991
2216
+ },
2217
+ "sha256": {
2218
+ "type": "string",
2219
+ "pattern": "^[a-f0-9]{64}$",
2220
+ "description": "Lowercase hex-encoded sha256"
2221
+ },
2222
+ "mode": {
2223
+ "type": "string",
2224
+ "enum": [
2225
+ "0644",
2226
+ "0755"
2227
+ ]
2228
+ },
2229
+ "kind": {
2230
+ "type": "string",
2231
+ "enum": [
2232
+ "file",
2233
+ "symlink"
2234
+ ]
2235
+ }
2236
+ },
2237
+ "required": [
2238
+ "path",
2239
+ "bytes",
2240
+ "mode",
2241
+ "kind"
2242
+ ],
2243
+ "additionalProperties": false
2244
+ }
2245
+ },
2246
+ "truncated": {
2247
+ "type": "boolean"
2248
+ },
2249
+ "counts": {
2250
+ "type": "object",
2251
+ "properties": {
2252
+ "files": {
2253
+ "type": "integer",
2254
+ "minimum": 0,
2255
+ "maximum": 9007199254740991
2256
+ },
2257
+ "bytes": {
2258
+ "type": "integer",
2259
+ "minimum": 0,
2260
+ "maximum": 9007199254740991
2261
+ }
2262
+ },
2263
+ "required": [
2264
+ "files",
2265
+ "bytes"
2266
+ ],
2267
+ "additionalProperties": false
2268
+ }
2269
+ },
2270
+ "required": [
2271
+ "files",
2272
+ "truncated",
2273
+ "counts"
2274
+ ],
2275
+ "additionalProperties": false
2276
+ }
2277
+ },
2278
+ "required": [
2279
+ "apiVersion",
2280
+ "kind",
2281
+ "root",
2282
+ "snapshotDigest",
2283
+ "body"
2284
+ ],
2285
+ "additionalProperties": false
2286
+ }
1965
2287
  }
1966
2288
  ]