@axorum/mcp 0.0.0-stage → 1.0.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/LICENSE +202 -0
- package/README.md +241 -2
- package/dist/config.d.ts +52 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +227 -0
- package/dist/config.js.map +1 -0
- package/dist/convert.d.ts +49 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +102 -0
- package/dist/convert.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +35 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +41 -0
- package/dist/json.js.map +1 -0
- package/dist/main.d.ts +21 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +41 -0
- package/dist/main.js.map +1 -0
- package/dist/render.d.ts +156 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +482 -0
- package/dist/render.js.map +1 -0
- package/dist/schemas.d.ts +238 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +234 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +47 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +438 -0
- package/dist/server.js.map +1 -0
- package/dist/verify.d.ts +109 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +297 -0
- package/dist/verify.js.map +1 -0
- package/package.json +64 -3
package/dist/verify.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline verification of `axorum.evidence.v0` envelopes — the `verify_receipt`
|
|
3
|
+
* tool's engine, in nothing but `node:crypto`.
|
|
4
|
+
*
|
|
5
|
+
* This is a deliberate second implementation of the verifier the Rust
|
|
6
|
+
* `axorum-evidence` crate ships, built from the committed JSON Schemas
|
|
7
|
+
* (`spec/schemas/`) and `spec/evidence-signing.md` §3.1/§4 alone. It shares no
|
|
8
|
+
* code with the service: an envelope that verifies here has been checked the
|
|
9
|
+
* way a stranger's stack would check it. The refusal sentences are the spec's
|
|
10
|
+
* §4 catalogue, verbatim.
|
|
11
|
+
*
|
|
12
|
+
* The signed message is:
|
|
13
|
+
*
|
|
14
|
+
* ```text
|
|
15
|
+
* "axorum.evidence.v0" || 0x0A || kind || 0x0A || deployment || 0x0A || SHA-256(payload)
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* with the deployment and kind *inside* the signed bytes — no artifact
|
|
19
|
+
* transplants across deployments, no signature replays across kinds.
|
|
20
|
+
*
|
|
21
|
+
* @packageDocumentation
|
|
22
|
+
*/
|
|
23
|
+
import { createHash, createPublicKey, verify as cryptoVerify } from "node:crypto";
|
|
24
|
+
/** The line-feed-free, non-empty deployment constraint the committed schema pins. */
|
|
25
|
+
const DEPLOYMENT_PATTERN = /^[^\n]+$/;
|
|
26
|
+
/** The envelope format version this verifier understands. */
|
|
27
|
+
export const ENVELOPE_VERSION = "axorum.evidence.v0";
|
|
28
|
+
/** The key-list format version this verifier understands. */
|
|
29
|
+
export const KEYS_VERSION = "axorum.keys.v0";
|
|
30
|
+
/** The receipt payload version this verifier understands. */
|
|
31
|
+
export const RECEIPT_VERSION = "axorum.receipt.v0";
|
|
32
|
+
/** The closed six-kind artifact vocabulary (`spec/evidence-signing.md` §3.1). */
|
|
33
|
+
export const ARTIFACT_KINDS = [
|
|
34
|
+
"receipt",
|
|
35
|
+
"evidence-package",
|
|
36
|
+
"lake-manifest",
|
|
37
|
+
"lake-head",
|
|
38
|
+
"oplog-head",
|
|
39
|
+
"key-list",
|
|
40
|
+
];
|
|
41
|
+
/** The RFC 8410 SPKI prefix for a raw 32-byte Ed25519 public key. */
|
|
42
|
+
const SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
|
|
43
|
+
/** A verification refusal, carrying the §4 sentence as its message. */
|
|
44
|
+
export class VerifyRefusal extends Error {
|
|
45
|
+
}
|
|
46
|
+
const HEX_64 = /^[0-9a-f]{64}$/;
|
|
47
|
+
const HEX_128 = /^[0-9a-f]{128}$/;
|
|
48
|
+
function refuse(message) {
|
|
49
|
+
throw new VerifyRefusal(message);
|
|
50
|
+
}
|
|
51
|
+
function asRecord(value, what) {
|
|
52
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
53
|
+
refuse(`the ${what} is not a JSON object`);
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
function asString(value, what) {
|
|
58
|
+
if (typeof value !== "string") {
|
|
59
|
+
refuse(`the ${what} is not a string`);
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
/** Reads and structurally checks a wire envelope from parsed JSON. */
|
|
64
|
+
export function readEnvelope(value) {
|
|
65
|
+
const raw = asRecord(value, "envelope");
|
|
66
|
+
const envelope = {
|
|
67
|
+
version: asString(raw.version, "envelope version"),
|
|
68
|
+
kind: asString(raw.kind, "envelope kind"),
|
|
69
|
+
deployment: asString(raw.deployment, "envelope deployment"),
|
|
70
|
+
key_id: asString(raw.key_id, "envelope key_id"),
|
|
71
|
+
payload: asString(raw.payload, "envelope payload"),
|
|
72
|
+
signature: asString(raw.signature, "envelope signature"),
|
|
73
|
+
};
|
|
74
|
+
if (envelope.version !== ENVELOPE_VERSION) {
|
|
75
|
+
refuse(`the envelope version is '${envelope.version}', not '${ENVELOPE_VERSION}'`);
|
|
76
|
+
}
|
|
77
|
+
if (!ARTIFACT_KINDS.includes(envelope.kind)) {
|
|
78
|
+
refuse(`'${envelope.kind}' is not one of the six artifact kinds`);
|
|
79
|
+
}
|
|
80
|
+
if (!DEPLOYMENT_PATTERN.test(envelope.deployment)) {
|
|
81
|
+
refuse("the envelope deployment is empty or contains a line feed");
|
|
82
|
+
}
|
|
83
|
+
if (!HEX_64.test(envelope.key_id)) {
|
|
84
|
+
refuse("the envelope key_id is not 64 lowercase hex characters");
|
|
85
|
+
}
|
|
86
|
+
if (!HEX_128.test(envelope.signature)) {
|
|
87
|
+
refuse("the envelope signature is not 128 lowercase hex characters");
|
|
88
|
+
}
|
|
89
|
+
return envelope;
|
|
90
|
+
}
|
|
91
|
+
/** Strict standard base64: decodes, and refuses any non-canonical spelling. */
|
|
92
|
+
function decodeBase64Strict(payload) {
|
|
93
|
+
const decoded = Buffer.from(payload, "base64");
|
|
94
|
+
if (decoded.toString("base64") !== payload) {
|
|
95
|
+
refuse("the envelope payload is not canonical standard base64");
|
|
96
|
+
}
|
|
97
|
+
return decoded;
|
|
98
|
+
}
|
|
99
|
+
/** The §3.1 signed message for `(kind, deployment, payload)`. */
|
|
100
|
+
export function signedMessage(kind, deployment, payload) {
|
|
101
|
+
const digest = createHash("sha256").update(payload).digest();
|
|
102
|
+
return Buffer.concat([
|
|
103
|
+
Buffer.from(`${ENVELOPE_VERSION}\n`, "utf8"),
|
|
104
|
+
Buffer.from(`${kind}\n`, "utf8"),
|
|
105
|
+
Buffer.from(`${deployment}\n`, "utf8"),
|
|
106
|
+
digest,
|
|
107
|
+
]);
|
|
108
|
+
}
|
|
109
|
+
/** Ed25519 signature check against a raw 32-byte public key (hex). */
|
|
110
|
+
function signatureVerifies(publicKeyHex, message, signatureHex) {
|
|
111
|
+
const spki = Buffer.concat([SPKI_PREFIX, Buffer.from(publicKeyHex, "hex")]);
|
|
112
|
+
const key = createPublicKey({ key: spki, format: "der", type: "spki" });
|
|
113
|
+
return cryptoVerify(null, message, key, Buffer.from(signatureHex, "hex"));
|
|
114
|
+
}
|
|
115
|
+
/** SHA-256 of the raw public key bytes — the key's identity. */
|
|
116
|
+
function keyIdFor(publicKeyHex) {
|
|
117
|
+
return createHash("sha256").update(Buffer.from(publicKeyHex, "hex")).digest("hex");
|
|
118
|
+
}
|
|
119
|
+
/** The SPKI PEM a raw 32-byte Ed25519 public key encodes to — the canonical
|
|
120
|
+
* form, so a key-list entry's `public_key_pem` can be checked against its raw
|
|
121
|
+
* `public_key` (the Rust verifier's `pem_matches` rule). */
|
|
122
|
+
function spkiPemFor(publicKeyHex) {
|
|
123
|
+
const der = Buffer.concat([SPKI_PREFIX, Buffer.from(publicKeyHex, "hex")]);
|
|
124
|
+
const key = createPublicKey({ key: der, format: "der", type: "spki" });
|
|
125
|
+
return key.export({ format: "pem", type: "spki" }).toString();
|
|
126
|
+
}
|
|
127
|
+
/** Structural checks every entry must pass, duplicates refused (both paths). */
|
|
128
|
+
function readKeyList(value) {
|
|
129
|
+
const raw = asRecord(value, "key list");
|
|
130
|
+
const version = asString(raw.version, "key list version");
|
|
131
|
+
if (version !== KEYS_VERSION) {
|
|
132
|
+
refuse(`the key list version is '${version}', not '${KEYS_VERSION}'`);
|
|
133
|
+
}
|
|
134
|
+
const deployment = asString(raw.deployment, "key list deployment");
|
|
135
|
+
const generation = raw.generation;
|
|
136
|
+
if (typeof generation !== "number" || !Number.isInteger(generation) || generation < 0) {
|
|
137
|
+
refuse("the key list generation is not a non-negative integer");
|
|
138
|
+
}
|
|
139
|
+
if (!Array.isArray(raw.keys)) {
|
|
140
|
+
refuse("the key list carries no keys array");
|
|
141
|
+
}
|
|
142
|
+
const seen = new Set();
|
|
143
|
+
const keys = raw.keys.map((item) => {
|
|
144
|
+
const record = asRecord(item, "key entry");
|
|
145
|
+
const keyId = asString(record.key_id, "key entry key_id");
|
|
146
|
+
const publicKey = asString(record.public_key, "key entry public_key");
|
|
147
|
+
const pem = asString(record.public_key_pem, "key entry public_key_pem");
|
|
148
|
+
const status = asString(record.status, "key entry status");
|
|
149
|
+
if (!HEX_64.test(keyId) || !HEX_64.test(publicKey)) {
|
|
150
|
+
refuse("a key entry's hex fields are not 64 lowercase hex characters");
|
|
151
|
+
}
|
|
152
|
+
if (status !== "active" && status !== "retired" && status !== "revoked") {
|
|
153
|
+
refuse(`'${status}' is not a key status`);
|
|
154
|
+
}
|
|
155
|
+
if (keyIdFor(publicKey) !== keyId) {
|
|
156
|
+
refuse(`key ${keyId} does not hash from its own public key`);
|
|
157
|
+
}
|
|
158
|
+
// The PEM must encode the same raw key (the Rust verifier's pem_matches):
|
|
159
|
+
// normalize both to DER so line-ending / trailing-newline differences do
|
|
160
|
+
// not matter, only the key material.
|
|
161
|
+
if (createPublicKey({ key: pem, format: "pem", type: "spki" })
|
|
162
|
+
.export({ format: "der", type: "spki" })
|
|
163
|
+
.toString("hex") !==
|
|
164
|
+
createPublicKey({ key: spkiPemFor(publicKey), format: "pem", type: "spki" })
|
|
165
|
+
.export({ format: "der", type: "spki" })
|
|
166
|
+
.toString("hex")) {
|
|
167
|
+
refuse(`key ${keyId}'s PEM does not encode its raw public key`);
|
|
168
|
+
}
|
|
169
|
+
if (seen.has(keyId)) {
|
|
170
|
+
refuse(`key ${keyId} appears more than once in the list`);
|
|
171
|
+
}
|
|
172
|
+
seen.add(keyId);
|
|
173
|
+
const entry = {
|
|
174
|
+
key_id: keyId,
|
|
175
|
+
public_key: publicKey,
|
|
176
|
+
public_key_pem: pem,
|
|
177
|
+
status,
|
|
178
|
+
};
|
|
179
|
+
return entry;
|
|
180
|
+
});
|
|
181
|
+
return { version, deployment, generation, keys };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Verifies a signed key-list envelope (`kind: key-list`, self-signed by its
|
|
185
|
+
* own active key) and returns the verified list. `pinnedGeneration` refuses a
|
|
186
|
+
* rolled-back list, exactly as the spec's §4 row words it.
|
|
187
|
+
*/
|
|
188
|
+
export function verifyKeyList(value, pinnedGeneration) {
|
|
189
|
+
const envelope = readEnvelope(value);
|
|
190
|
+
if (envelope.kind !== "key-list") {
|
|
191
|
+
refuse(`the key list envelope's kind is '${envelope.kind}', not 'key-list'`);
|
|
192
|
+
}
|
|
193
|
+
const payload = decodeBase64Strict(envelope.payload);
|
|
194
|
+
const list = readKeyList(JSON.parse(payload.toString("utf8")));
|
|
195
|
+
if (list.deployment !== envelope.deployment) {
|
|
196
|
+
refuse(`the key list names deployment '${list.deployment}' but its envelope names ` +
|
|
197
|
+
`'${envelope.deployment}'`);
|
|
198
|
+
}
|
|
199
|
+
const actives = list.keys.filter((key) => key.status === "active");
|
|
200
|
+
if (actives.length !== 1) {
|
|
201
|
+
refuse(`the key list carries ${actives.length} active keys; exactly one is required`);
|
|
202
|
+
}
|
|
203
|
+
const active = actives[0];
|
|
204
|
+
if (envelope.key_id !== active.key_id) {
|
|
205
|
+
refuse("the key list envelope is not signed by the list's own active key — a " +
|
|
206
|
+
"revocation-stripping forgery, or a stale envelope");
|
|
207
|
+
}
|
|
208
|
+
const message = signedMessage(envelope.kind, envelope.deployment, payload);
|
|
209
|
+
if (!signatureVerifies(active.public_key, message, envelope.signature)) {
|
|
210
|
+
refuse("The signature does not verify: these are not the bytes that were signed, " +
|
|
211
|
+
`or the signature was not produced by key ${envelope.key_id}.`);
|
|
212
|
+
}
|
|
213
|
+
if (pinnedGeneration !== undefined && list.generation < pinnedGeneration) {
|
|
214
|
+
refuse(`The supplied key list is generation ${list.generation}, older than the ` +
|
|
215
|
+
`generation ${pinnedGeneration} list previously pinned. Refusing to verify ` +
|
|
216
|
+
"against a rolled-back key list.");
|
|
217
|
+
}
|
|
218
|
+
return list;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Verifies one envelope against a **verified** key list, with the spec's §4
|
|
222
|
+
* refusal sentences: unknown key, revoked key, deployment mismatch, and the
|
|
223
|
+
* signature itself.
|
|
224
|
+
*/
|
|
225
|
+
export function verifyEnvelope(value, list) {
|
|
226
|
+
const envelope = readEnvelope(value);
|
|
227
|
+
if (envelope.deployment !== list.deployment) {
|
|
228
|
+
refuse(`The artifact was issued by deployment ${envelope.deployment} but the supplied ` +
|
|
229
|
+
`key list belongs to ${list.deployment}. Obtain the issuing deployment's key ` +
|
|
230
|
+
"list and retry.");
|
|
231
|
+
}
|
|
232
|
+
const entry = list.keys.find((key) => key.key_id === envelope.key_id);
|
|
233
|
+
if (entry === undefined) {
|
|
234
|
+
refuse(`The artifact names signing key ${envelope.key_id}, which is not in the ` +
|
|
235
|
+
"supplied key list. Obtain the deployment's published key list and retry.");
|
|
236
|
+
}
|
|
237
|
+
if (entry.status === "revoked") {
|
|
238
|
+
refuse(`The artifact was signed by key ${envelope.key_id}, which has been revoked. ` +
|
|
239
|
+
"Artifacts signed by this key can no longer be relied upon.");
|
|
240
|
+
}
|
|
241
|
+
const payload = decodeBase64Strict(envelope.payload);
|
|
242
|
+
const message = signedMessage(envelope.kind, envelope.deployment, payload);
|
|
243
|
+
if (!signatureVerifies(entry.public_key, message, envelope.signature)) {
|
|
244
|
+
refuse("The signature does not verify: these are not the bytes that were signed, " +
|
|
245
|
+
`or the signature was not produced by key ${envelope.key_id}.`);
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
kind: envelope.kind,
|
|
249
|
+
deployment: envelope.deployment,
|
|
250
|
+
keyId: envelope.key_id,
|
|
251
|
+
keyStatus: entry.status,
|
|
252
|
+
payload,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/** Reads the exact `tick` digits from the signed payload bytes (never rounded). */
|
|
256
|
+
function exactTick(payloadText) {
|
|
257
|
+
const match = /"tick"\s*:\s*(\d+)/.exec(payloadText);
|
|
258
|
+
return match ? match[1] : "unknown";
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* The whole `axorum verify` flow for one receipt, offline: verify the key
|
|
262
|
+
* list (self-signed, generation-pinned), verify the receipt envelope against
|
|
263
|
+
* it, parse and cross-check the payload. Throws {@link VerifyRefusal} with
|
|
264
|
+
* the spec's §4 sentence on any failure.
|
|
265
|
+
*/
|
|
266
|
+
export function verifyReceipt(receiptEnvelope, keyListEnvelope, pinnedGeneration) {
|
|
267
|
+
const list = verifyKeyList(keyListEnvelope, pinnedGeneration);
|
|
268
|
+
const verified = verifyEnvelope(receiptEnvelope, list);
|
|
269
|
+
if (verified.kind !== "receipt") {
|
|
270
|
+
refuse(`the envelope's kind is '${verified.kind}', not 'receipt'`);
|
|
271
|
+
}
|
|
272
|
+
const payloadText = verified.payload.toString("utf8");
|
|
273
|
+
const receipt = asRecord(JSON.parse(payloadText), "receipt payload");
|
|
274
|
+
if (receipt.version !== RECEIPT_VERSION) {
|
|
275
|
+
refuse(`the receipt payload version is '${String(receipt.version)}', not '${RECEIPT_VERSION}'`);
|
|
276
|
+
}
|
|
277
|
+
if (receipt.deployment !== verified.deployment) {
|
|
278
|
+
refuse(`the receipt payload names deployment '${String(receipt.deployment)}' but its ` +
|
|
279
|
+
`envelope names '${verified.deployment}'`);
|
|
280
|
+
}
|
|
281
|
+
const evidence = receipt.evidence;
|
|
282
|
+
if (!Array.isArray(evidence) || evidence.length === 0) {
|
|
283
|
+
refuse("the receipt payload carries no evidence vector");
|
|
284
|
+
}
|
|
285
|
+
if (evidence[evidence.length - 1] !== receipt.justification_hash) {
|
|
286
|
+
refuse("the receipt's justification_hash is not the final evidence element — the " +
|
|
287
|
+
"§3.2 contract does not hold, so this payload was not minted by the ledger");
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
deployment: verified.deployment,
|
|
291
|
+
keyStatus: verified.keyStatus,
|
|
292
|
+
keyId: verified.keyId,
|
|
293
|
+
receipt,
|
|
294
|
+
tickExact: exactTick(payloadText),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,qFAAqF;AACrF,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAEtC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE7C,6DAA6D;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAEnD,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,SAAS;IACT,kBAAkB;IAClB,eAAe;IACf,WAAW;IACX,YAAY;IACZ,UAAU;CACF,CAAC;AAEX,qEAAqE;AACrE,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;AA4BnE,uEAAuE;AACvE,MAAM,OAAO,aAAc,SAAQ,KAAK;CAAG;AAE3C,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAChC,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAElC,SAAS,MAAM,CAAC,OAAe;IAC7B,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,IAAY;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,IAAY;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAiB;QAC7B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC;QAClD,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC;QACzC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,qBAAqB,CAAC;QAC3D,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC;QAC/C,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC;QAClD,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,oBAAoB,CAAC;KACzD,CAAC;IACF,IAAI,QAAQ,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;QAC1C,MAAM,CAAC,4BAA4B,QAAQ,CAAC,OAAO,WAAW,gBAAgB,GAAG,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAE,cAAoC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,wCAAwC,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,0DAA0D,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,wDAAwD,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,4DAA4D,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+EAA+E;AAC/E,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC;QAC3C,MAAM,CAAC,uDAAuD,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAAkB,EAAE,OAAe;IAC7E,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,IAAI,EAAE,MAAM,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,EAAE,MAAM,CAAC;QACtC,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AACtE,SAAS,iBAAiB,CAAC,YAAoB,EAAE,OAAe,EAAE,YAAoB;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,gEAAgE;AAChE,SAAS,QAAQ,CAAC,YAAoB;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrF,CAAC;AAED;;4DAE4D;AAC5D,SAAS,UAAU,CAAC,YAAoB;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAChE,CAAC;AAED,gFAAgF;AAChF,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,4BAA4B,OAAO,WAAW,YAAY,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACtF,MAAM,CAAC,uDAAuD,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,oCAAoC,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,8DAA8D,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACxE,MAAM,CAAC,IAAI,MAAM,uBAAuB,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,KAAK,wCAAwC,CAAC,CAAC;QAC/D,CAAC;QACD,0EAA0E;QAC1E,yEAAyE;QACzE,qCAAqC;QACrC,IACE,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACvD,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACvC,QAAQ,CAAC,KAAK,CAAC;YAClB,eAAe,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iBACzE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iBACvC,QAAQ,CAAC,KAAK,CAAC,EAClB,CAAC;YACD,MAAM,CAAC,OAAO,KAAK,2CAA2C,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,KAAK,qCAAqC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,MAAM,KAAK,GAAiB;YAC1B,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,SAAS;YACrB,cAAc,EAAE,GAAG;YACnB,MAAM;SACP,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,gBAAyB;IACrE,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,oCAAoC,QAAQ,CAAC,IAAI,mBAAmB,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,CACJ,kCAAkC,IAAI,CAAC,UAAU,2BAA2B;YAC1E,IAAI,QAAQ,CAAC,UAAU,GAAG,CAC7B,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,wBAAwB,OAAO,CAAC,MAAM,uCAAuC,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,CACJ,uEAAuE;YACrE,mDAAmD,CACtD,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3E,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvE,MAAM,CACJ,2EAA2E;YACzE,4CAA4C,QAAQ,CAAC,MAAM,GAAG,CACjE,CAAC;IACJ,CAAC;IACD,IAAI,gBAAgB,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC;QACzE,MAAM,CACJ,uCAAuC,IAAI,CAAC,UAAU,mBAAmB;YACvE,cAAc,gBAAgB,8CAA8C;YAC5E,iCAAiC,CACpC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAYD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAiB;IAC9D,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,CACJ,yCAAyC,QAAQ,CAAC,UAAU,oBAAoB;YAC9E,uBAAuB,IAAI,CAAC,UAAU,wCAAwC;YAC9E,iBAAiB,CACpB,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,CACJ,kCAAkC,QAAQ,CAAC,MAAM,wBAAwB;YACvE,0EAA0E,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CACJ,kCAAkC,QAAQ,CAAC,MAAM,4BAA4B;YAC3E,4DAA4D,CAC/D,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3E,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,MAAM,CACJ,2EAA2E;YACzE,4CAA4C,QAAQ,CAAC,MAAM,GAAG,CACjE,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,OAAO;KACR,CAAC;AACJ,CAAC;AAsBD,mFAAmF;AACnF,SAAS,SAAS,CAAC,WAAmB;IACpC,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,eAAwB,EACxB,eAAwB,EACxB,gBAAyB;IAEzB,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,2BAA2B,QAAQ,CAAC,IAAI,kBAAkB,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;QACxC,MAAM,CAAC,mCAAmC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,eAAe,GAAG,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC/C,MAAM,CACJ,yCAAyC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY;YAC7E,mBAAmB,QAAQ,CAAC,UAAU,GAAG,CAC5C,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,gDAAgD,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACjE,MAAM,CACJ,2EAA2E;YACzE,2EAA2E,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,OAAO;QACP,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC;KAClC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axorum/mcp",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "The official Axorum MCP server — exposes the Axorum agent plane as MCP tools, so any MCP-capable agent becomes a policy-governed spender with no integration code.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": "Roland Rodriguez <roland@axorum.com>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/AxorumHQ/axorum.git",
|
|
10
|
+
"directory": "clients/mcp"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/AxorumHQ/axorum/tree/main/clients/mcp#readme",
|
|
13
|
+
"bugs": "https://github.com/AxorumHQ/axorum/issues",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"axorum",
|
|
16
|
+
"mcp",
|
|
17
|
+
"mcp-server",
|
|
18
|
+
"model-context-protocol",
|
|
19
|
+
"agent",
|
|
20
|
+
"agent-plane",
|
|
21
|
+
"ledger",
|
|
22
|
+
"payments",
|
|
23
|
+
"policy"
|
|
24
|
+
],
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"type": "module",
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20"
|
|
31
|
+
},
|
|
32
|
+
"bin": {
|
|
33
|
+
"axorum-mcp": "./dist/main.js"
|
|
34
|
+
},
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
|
+
"import": "./dist/index.js",
|
|
39
|
+
"default": "./dist/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./package.json": "./package.json"
|
|
42
|
+
},
|
|
43
|
+
"types": "./dist/index.d.ts",
|
|
44
|
+
"main": "./dist/index.js",
|
|
45
|
+
"files": [
|
|
46
|
+
"dist",
|
|
47
|
+
"README.md"
|
|
48
|
+
],
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
51
|
+
"zod": "^4.4.3",
|
|
52
|
+
"@axorum/client": "^1.0.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^22.10.2",
|
|
56
|
+
"typescript": "^5.7.2",
|
|
57
|
+
"undici": "^7.28.0",
|
|
58
|
+
"vitest": "^2.1.8"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"typecheck": "tsc --noEmit",
|
|
62
|
+
"build": "tsc --project tsconfig.build.json",
|
|
63
|
+
"test": "vitest run",
|
|
64
|
+
"test:unit": "vitest run test/unit",
|
|
65
|
+
"test:integration": "vitest run test/integration"
|
|
66
|
+
}
|
|
6
67
|
}
|