@xrpl-utilities/mcp 0.2.167 → 0.2.170
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/hSealReceipt.d.ts +40 -0
- package/dist/hSealReceipt.js +79 -0
- package/dist/hSealReceipt.js.map +1 -0
- package/dist/server.js +32 -3
- package/dist/server.js.map +1 -1
- package/dist/services/sentinel.js +1 -1
- package/dist/services/sentinel.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -51,7 +51,9 @@ provider attestation. The attestation rides on the tool result's
|
|
|
51
51
|
`_meta.hSeal`, so a caller can anchor a tamper-evident, independently
|
|
52
52
|
verifiable on-chain receipt of the interaction. When either var is unset the
|
|
53
53
|
feature is inert and responses are unchanged. Never hardcode the key — env
|
|
54
|
-
only. See `src/hSeal.ts
|
|
54
|
+
only. See `src/hSeal.ts` and the ops runbook
|
|
55
|
+
[`docs/hseal-provider.md`](docs/hseal-provider.md) (current identity, the
|
|
56
|
+
ed25519 curve gotcha, and how to rotate/recover the key).
|
|
55
57
|
|
|
56
58
|
## Use it
|
|
57
59
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2-party H-Seal receipt assembly.
|
|
3
|
+
*
|
|
4
|
+
* When a backend co-signs its own output (returning an `hSealAttestation` on the
|
|
5
|
+
* result), the MCP is the CALLER: it signs a receipt binding
|
|
6
|
+
* caller = the MCP (this gateway identity)
|
|
7
|
+
* provider = the backend that computed + attested the result
|
|
8
|
+
* and re-verifies it against the H-Seal service. The signed receipt body plus
|
|
9
|
+
* the verdict ride on the tool result's `_meta.hSealReceipt`.
|
|
10
|
+
*
|
|
11
|
+
* An H-Seal receipt carries caller + exactly ONE provider, so this is distinct
|
|
12
|
+
* from the MCP's own gateway attestation (`_meta.hSeal`), which stays as
|
|
13
|
+
* supplementary metadata.
|
|
14
|
+
*
|
|
15
|
+
* Caller identity/key come from MCP_IDENTITY / MCP_KEY_RAW, falling back to the
|
|
16
|
+
* gateway PROVIDER_IDENTITY / PROVIDER_KEY_RAW (same key, caller role here) so
|
|
17
|
+
* no new secret is required. Inert when unset. NB: the H-Seal API host is
|
|
18
|
+
* h-seal.xr-utilities.ai (the .com host is a browser-only, Cloudflare-challenged
|
|
19
|
+
* surface and returns 403 to server clients).
|
|
20
|
+
*/
|
|
21
|
+
export declare const hSealReceiptEnabled: boolean;
|
|
22
|
+
export interface HSealReceiptResult {
|
|
23
|
+
body: unknown;
|
|
24
|
+
verdict?: unknown;
|
|
25
|
+
verifyError?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build + verify a 2-party receipt from a backend provider attestation. Always
|
|
29
|
+
* returns the signed `body` (valid + independently verifiable) when signing
|
|
30
|
+
* succeeds; `verdict` is best-effort — if the H-Seal service is unreachable the
|
|
31
|
+
* body still stands and `verifyError` records why. Returns undefined only when
|
|
32
|
+
* H-Seal isn't configured or the attestation is malformed. Never throws.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildReceipt(opts: {
|
|
35
|
+
serviceEndpoint: string;
|
|
36
|
+
attestation: unknown;
|
|
37
|
+
startedAt: number;
|
|
38
|
+
completedAt: number;
|
|
39
|
+
latencyMs: number;
|
|
40
|
+
}): Promise<HSealReceiptResult | undefined>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2-party H-Seal receipt assembly.
|
|
3
|
+
*
|
|
4
|
+
* When a backend co-signs its own output (returning an `hSealAttestation` on the
|
|
5
|
+
* result), the MCP is the CALLER: it signs a receipt binding
|
|
6
|
+
* caller = the MCP (this gateway identity)
|
|
7
|
+
* provider = the backend that computed + attested the result
|
|
8
|
+
* and re-verifies it against the H-Seal service. The signed receipt body plus
|
|
9
|
+
* the verdict ride on the tool result's `_meta.hSealReceipt`.
|
|
10
|
+
*
|
|
11
|
+
* An H-Seal receipt carries caller + exactly ONE provider, so this is distinct
|
|
12
|
+
* from the MCP's own gateway attestation (`_meta.hSeal`), which stays as
|
|
13
|
+
* supplementary metadata.
|
|
14
|
+
*
|
|
15
|
+
* Caller identity/key come from MCP_IDENTITY / MCP_KEY_RAW, falling back to the
|
|
16
|
+
* gateway PROVIDER_IDENTITY / PROVIDER_KEY_RAW (same key, caller role here) so
|
|
17
|
+
* no new secret is required. Inert when unset. NB: the H-Seal API host is
|
|
18
|
+
* h-seal.xr-utilities.ai (the .com host is a browser-only, Cloudflare-challenged
|
|
19
|
+
* surface and returns 403 to server clients).
|
|
20
|
+
*/
|
|
21
|
+
import { randomUUID } from "node:crypto";
|
|
22
|
+
import { signReceipt, attachAttestation, HSealClient, ed25519Signer, } from "@xr-utilities/h-seal-provider";
|
|
23
|
+
const HSEAL_API = process.env["HSEAL_ENDPOINT"] ?? "https://h-seal.xr-utilities.ai";
|
|
24
|
+
const RECEIPT_TOPIC = process.env["HSEAL_RECEIPT_TOPIC"] ?? "0.0.10500472";
|
|
25
|
+
const callerIdentity = process.env["MCP_IDENTITY"] ?? process.env["PROVIDER_IDENTITY"];
|
|
26
|
+
const callerKeyRaw = process.env["MCP_KEY_RAW"] ?? process.env["PROVIDER_KEY_RAW"];
|
|
27
|
+
export const hSealReceiptEnabled = Boolean(callerIdentity && callerKeyRaw);
|
|
28
|
+
function looksLikeAttestation(a) {
|
|
29
|
+
return (typeof a === "object" && a !== null &&
|
|
30
|
+
typeof a["requestHash"] === "string" &&
|
|
31
|
+
typeof a["responseHash"] === "string" &&
|
|
32
|
+
typeof a["providerIdentity"] === "string");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build + verify a 2-party receipt from a backend provider attestation. Always
|
|
36
|
+
* returns the signed `body` (valid + independently verifiable) when signing
|
|
37
|
+
* succeeds; `verdict` is best-effort — if the H-Seal service is unreachable the
|
|
38
|
+
* body still stands and `verifyError` records why. Returns undefined only when
|
|
39
|
+
* H-Seal isn't configured or the attestation is malformed. Never throws.
|
|
40
|
+
*/
|
|
41
|
+
export async function buildReceipt(opts) {
|
|
42
|
+
if (!hSealReceiptEnabled)
|
|
43
|
+
return undefined;
|
|
44
|
+
if (!looksLikeAttestation(opts.attestation))
|
|
45
|
+
return undefined;
|
|
46
|
+
const att = opts.attestation;
|
|
47
|
+
try {
|
|
48
|
+
const signed = await signReceipt({
|
|
49
|
+
receipt: {
|
|
50
|
+
taskId: randomUUID(),
|
|
51
|
+
serviceEndpoint: opts.serviceEndpoint,
|
|
52
|
+
requestHash: att.requestHash, // MUST equal the attestation's
|
|
53
|
+
responseHash: att.responseHash, // MUST equal the attestation's
|
|
54
|
+
resultStatus: "success",
|
|
55
|
+
startedAt: opts.startedAt,
|
|
56
|
+
completedAt: opts.completedAt,
|
|
57
|
+
latencyMs: opts.latencyMs,
|
|
58
|
+
callerIdentity: callerIdentity, // signed verbatim
|
|
59
|
+
providerIdentity: att.providerIdentity,
|
|
60
|
+
receiptTopicId: RECEIPT_TOPIC,
|
|
61
|
+
},
|
|
62
|
+
signer: ed25519Signer(callerKeyRaw),
|
|
63
|
+
network: "mainnet",
|
|
64
|
+
});
|
|
65
|
+
const body = attachAttestation(signed.body, att);
|
|
66
|
+
try {
|
|
67
|
+
const verdict = await new HSealClient({ endpoint: HSEAL_API }).verify(body);
|
|
68
|
+
return { body, verdict };
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
return { body, verifyError: err.message };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error(`[hSealReceipt] sign failed: ${err.message}`);
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=hSealReceipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hSealReceipt.js","sourceRoot":"","sources":["../src/hSealReceipt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,aAAa,GAEd,MAAM,+BAA+B,CAAC;AAEvC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,gCAAgC,CAAC;AACpF,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,cAAc,CAAC;AAC3E,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACvF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,mBAAmB,GAAY,OAAO,CAAC,cAAc,IAAI,YAAY,CAAC,CAAC;AAQpF,SAAS,oBAAoB,CAAC,CAAU;IACtC,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QACnC,OAAQ,CAA6B,CAAC,aAAa,CAAC,KAAK,QAAQ;QACjE,OAAQ,CAA6B,CAAC,cAAc,CAAC,KAAK,QAAQ;QAClE,OAAQ,CAA6B,CAAC,kBAAkB,CAAC,KAAK,QAAQ,CACvE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAMlC;IACC,IAAI,CAAC,mBAAmB;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC/B,OAAO,EAAE;gBACP,MAAM,EAAE,UAAU,EAAE;gBACpB,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,WAAW,EAAE,GAAG,CAAC,WAAW,EAAI,+BAA+B;gBAC/D,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,+BAA+B;gBAC/D,YAAY,EAAE,SAAS;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,cAAc,EAAE,cAAwB,EAAI,kBAAkB;gBAC9D,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;gBACtC,cAAc,EAAE,aAAa;aAC9B;YACD,MAAM,EAAE,aAAa,CAAC,YAAsB,CAAC;YAC7C,OAAO,EAAE,SAAS;SACnB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,IAAI,EAAE,WAAW,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAAgC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -9,6 +9,7 @@ import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSche
|
|
|
9
9
|
import { ALL_TOOLS, SERVICES } from "./services/index.js";
|
|
10
10
|
import { dispatchTool } from "./dispatch.js";
|
|
11
11
|
import { attest } from "./hSeal.js";
|
|
12
|
+
import { buildReceipt } from "./hSealReceipt.js";
|
|
12
13
|
import { SERVER_VERSION } from "./version.js";
|
|
13
14
|
const SERVER_NAME = "xrpl-utilities";
|
|
14
15
|
export function buildServer(opts = {}) {
|
|
@@ -38,7 +39,9 @@ export function buildServer(opts = {}) {
|
|
|
38
39
|
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
39
40
|
const args = (req.params.arguments ?? {});
|
|
40
41
|
try {
|
|
42
|
+
const startedMs = Date.now();
|
|
41
43
|
const result = await dispatchTool(req.params.name, args, opts);
|
|
44
|
+
const endedMs = Date.now();
|
|
42
45
|
// Co-sign the (request, response) pair so the caller can anchor a
|
|
43
46
|
// tamper-evident H-Seal receipt carrying our attestation that we served
|
|
44
47
|
// it. Strip transport-only secrets from the signed request so the
|
|
@@ -47,15 +50,41 @@ export function buildServer(opts = {}) {
|
|
|
47
50
|
const signedArgs = { ...args };
|
|
48
51
|
delete signedArgs["payment_signature"];
|
|
49
52
|
delete signedArgs["_bypass_key"];
|
|
50
|
-
|
|
53
|
+
// If the backend co-signed its OWN output, build a 2-party receipt:
|
|
54
|
+
// caller = this MCP, provider = that backend. Split the provider
|
|
55
|
+
// attestation out of the displayed result and into _meta.hSealReceipt.
|
|
56
|
+
// Two shapes carry it: `hSealAttestation` (backend attaches it via its
|
|
57
|
+
// own /attest call) or `_hSeal` (the H-Seal v0.3.0 proxy sidecar merges
|
|
58
|
+
// it into every response). Accept either; prefer hSealAttestation.
|
|
59
|
+
let displayResult = result;
|
|
60
|
+
let hSealReceipt;
|
|
61
|
+
if (result &&
|
|
62
|
+
typeof result === "object" &&
|
|
63
|
+
("hSealAttestation" in result || "_hSeal" in result)) {
|
|
64
|
+
const { hSealAttestation, _hSeal, ...clean } = result;
|
|
65
|
+
displayResult = clean;
|
|
66
|
+
hSealReceipt = await buildReceipt({
|
|
67
|
+
serviceEndpoint: "https://mcp.xrpl-utilities.io",
|
|
68
|
+
attestation: hSealAttestation ?? _hSeal,
|
|
69
|
+
startedAt: Math.floor(startedMs / 1000),
|
|
70
|
+
completedAt: Math.floor(endedMs / 1000),
|
|
71
|
+
latencyMs: endedMs - startedMs,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const attestation = await attest({ tool: req.params.name, args: signedArgs }, displayResult);
|
|
75
|
+
const meta = {};
|
|
76
|
+
if (attestation)
|
|
77
|
+
meta.hSeal = attestation;
|
|
78
|
+
if (hSealReceipt)
|
|
79
|
+
meta.hSealReceipt = hSealReceipt;
|
|
51
80
|
return {
|
|
52
81
|
content: [
|
|
53
82
|
{
|
|
54
83
|
type: "text",
|
|
55
|
-
text: typeof
|
|
84
|
+
text: typeof displayResult === "string" ? displayResult : JSON.stringify(displayResult, null, 2),
|
|
56
85
|
},
|
|
57
86
|
],
|
|
58
|
-
...(
|
|
87
|
+
...(Object.keys(meta).length ? { _meta: meta } : {}),
|
|
59
88
|
};
|
|
60
89
|
}
|
|
61
90
|
catch (e) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAwB,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC,MAAM,UAAU,WAAW,CAAC,OAAwB,EAAE;IACpD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,EAC9C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAC/C,CAAC;IAEF,6EAA6E;IAC7E,yEAAyE;IACzE,2EAA2E;IAC3E,6EAA6E;IAC7E,8DAA8D;IAC9D,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACzB,MAAM,OAAO,GACX,CAAC,CAAC,QAAQ,KAAK,MAAM;gBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;gBAC9B,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,eAAe;oBAC9B,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE;oBAC5D,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,4BAA4B;wBACvC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE;wBACxG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;YACpE,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,KAAK,EAAE,EAAE,OAAO,EAAE;aACnB,CAAC;QACJ,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5D,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAA4B,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export const sentinel = {
|
|
|
12
12
|
label: "XR-Sentinel",
|
|
13
13
|
baseUrl: "https://sentinel.xrpl-utilities.io",
|
|
14
14
|
manifestUrl: "https://sentinel.xrpl-utilities.io/agents.json",
|
|
15
|
-
knownSchemaVersions: ["2026-09", "2.8.0", "2.9.0", "2.10.0", "2.11.0", "2.12.0", "2.13.0", "2.14.0", "2.15.0", "2.16.0", "2.17.0", "2.18.0", "2.19.0", "2.19.1", "2.19.2", "2.19.3", "2.20.0", "2.20.1", "2.21.0", "2.22.0", "2.23.0", "2.24.0", "2.25.0", "2.26.0", "2.27.0", "2.28.0", "2.29.0", "2.30.0", "2.31.0", "2.32.0", "2.33.0"],
|
|
15
|
+
knownSchemaVersions: ["2026-09", "2.8.0", "2.9.0", "2.10.0", "2.11.0", "2.12.0", "2.13.0", "2.14.0", "2.15.0", "2.16.0", "2.17.0", "2.18.0", "2.19.0", "2.19.1", "2.19.2", "2.19.3", "2.20.0", "2.20.1", "2.21.0", "2.22.0", "2.23.0", "2.24.0", "2.25.0", "2.26.0", "2.27.0", "2.28.0", "2.29.0", "2.30.0", "2.31.0", "2.32.0", "2.33.0", "2.33.1"],
|
|
16
16
|
tools: [
|
|
17
17
|
{
|
|
18
18
|
name: "xrpl_sentinel_scan",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../../src/services/sentinel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,CAAC,MAAM,QAAQ,GAAe;IAClC,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,aAAa;IACpB,OAAO,EAAE,oCAAoC;IAC7C,WAAW,EAAE,gDAAgD;IAC7D,mBAAmB,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../../src/services/sentinel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,CAAC,MAAM,QAAQ,GAAe;IAClC,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,aAAa;IACpB,OAAO,EAAE,oCAAoC;IAC7C,WAAW,EAAE,gDAAgD;IAC7D,mBAAmB,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;IACpV,KAAK,EAAE;QACL;YACE,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EACT,oBAAoB;gBACpB,wFAAwF;gBACxF,uFAAuF;YACzF,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iBAAiB;wBAC9B,OAAO,EAAE,gCAAgC;qBAC1C;oBACD,iBAAiB,EAAE;wBACjB,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,sBAAsB;qBACpC;iBACF;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;gBACrB,oBAAoB,EAAE,KAAK;aAC5B;YACD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,aAAa;YACvB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,CAAC,mBAAmB,CAAC;SACjC;QACD;YACE,IAAI,EAAE,4BAA4B;YAClC,WAAW,EACT,oBAAoB;gBACpB,yFAAyF;YAC3F,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iBAAiB;wBAC9B,OAAO,EAAE,gCAAgC;qBAC1C;oBACD,iBAAiB,EAAE;wBACjB,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,sBAAsB;qBACpC;iBACF;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;gBACrB,oBAAoB,EAAE,KAAK;aAC5B;YACD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,aAAa;YACvB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,CAAC,mBAAmB,CAAC;SACjC;KACF;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xrpl-utilities/mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.170",
|
|
4
4
|
"mcpName": "io.github.XRPL-Utilities/mcp",
|
|
5
5
|
"description": "Model Context Protocol server for the XRPL-Utilities portfolio: Sentinel (wallet classifier), Pulse (signal feed), Telemetry (supply + utility floor), Trust (XLS-70/80/81 directory), Vault (RWA tracker), and Flows (ETF AUM vs XRPL flow correlation). Exposes each service's read endpoints as MCP tools so AI agents can discover and use them via stdio (Claude Desktop) or HTTP/SSE (hosted at mcp.xrpl-utilities.io). Stateless passthrough. Caller provides their own x402 payment header.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
25
|
-
"@xr-utilities/h-seal-provider": "github:XR-Utilities/h-seal-provider#v0.
|
|
25
|
+
"@xr-utilities/h-seal-provider": "github:XR-Utilities/h-seal-provider#v0.2.0",
|
|
26
26
|
"express": "^4.21.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|