@xrpl-utilities/mcp 0.2.166 → 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 +13 -0
- package/dist/hSeal.d.ts +29 -0
- package/dist/hSeal.js +49 -0
- package/dist/hSeal.js.map +1 -0
- package/dist/hSealReceipt.d.ts +40 -0
- package/dist/hSealReceipt.js +79 -0
- package/dist/hSealReceipt.js.map +1 -0
- package/dist/server.js +41 -1
- 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 -1
package/README.md
CHANGED
|
@@ -42,6 +42,19 @@ Operators can set `MCP_BYPASS_KEY` on the server to enable an opt-in
|
|
|
42
42
|
bypass for friendlies / demos. The caller passes the matching key as
|
|
43
43
|
`_bypass_key` in the tool args. Rate-limited at the proxy layer.
|
|
44
44
|
|
|
45
|
+
### H-Seal receipt co-signing (optional)
|
|
46
|
+
|
|
47
|
+
Set `PROVIDER_IDENTITY` (our CAIP-10, e.g. `xrpl:0:r...`) and
|
|
48
|
+
`PROVIDER_KEY_RAW` (32-byte ed25519 seed, hex) on the server to have every
|
|
49
|
+
tool response co-signed with an [H-Seal](https://h-seal.xr-utilities.com)
|
|
50
|
+
provider attestation. The attestation rides on the tool result's
|
|
51
|
+
`_meta.hSeal`, so a caller can anchor a tamper-evident, independently
|
|
52
|
+
verifiable on-chain receipt of the interaction. When either var is unset the
|
|
53
|
+
feature is inert and responses are unchanged. Never hardcode the key — env
|
|
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).
|
|
57
|
+
|
|
45
58
|
## Use it
|
|
46
59
|
|
|
47
60
|
### Locally via Claude Desktop (stdio)
|
package/dist/hSeal.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H-Seal provider co-signing for the MCP surface.
|
|
3
|
+
*
|
|
4
|
+
* After a tool response is produced, the MCP server co-signs the
|
|
5
|
+
* (request, response) pair so the caller can anchor a tamper-evident,
|
|
6
|
+
* independently verifiable H-Seal receipt that carries our attestation that we
|
|
7
|
+
* served it. See https://h-seal.xr-utilities.com and the H-Series white paper.
|
|
8
|
+
*
|
|
9
|
+
* Configured entirely from env — never hardcode a signing key:
|
|
10
|
+
* PROVIDER_IDENTITY our CAIP-10 identity, e.g. "xrpl:0:r..."
|
|
11
|
+
* (or "hedera:mainnet:0.0.x")
|
|
12
|
+
* PROVIDER_KEY_RAW 32-byte ed25519 seed (hex) for that identity
|
|
13
|
+
*
|
|
14
|
+
* When either is unset the module is inert: attest() returns undefined and the
|
|
15
|
+
* response path is untouched. That keeps the live server safe if the key is not
|
|
16
|
+
* provisioned yet, and makes co-signing strictly additive — a paid tool call
|
|
17
|
+
* that succeeds today keeps succeeding whether or not H-Seal is configured.
|
|
18
|
+
*/
|
|
19
|
+
import { HSealProvider, type ProviderAttestation } from "@xr-utilities/h-seal-provider";
|
|
20
|
+
/** True when both PROVIDER_IDENTITY and PROVIDER_KEY_RAW are present. */
|
|
21
|
+
export declare const hSealEnabled: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Co-sign a request/response pair. Returns the provider attestation, or
|
|
24
|
+
* undefined when H-Seal is not configured. Never throws: a receipt-signing
|
|
25
|
+
* failure must not break the paid tool call it decorates.
|
|
26
|
+
*/
|
|
27
|
+
export declare function attest(request: unknown, response: unknown): Promise<ProviderAttestation | undefined>;
|
|
28
|
+
/** The configured provider (null when env is unset). Exposed for smokes/tests. */
|
|
29
|
+
export declare const hSeal: HSealProvider | null;
|
package/dist/hSeal.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H-Seal provider co-signing for the MCP surface.
|
|
3
|
+
*
|
|
4
|
+
* After a tool response is produced, the MCP server co-signs the
|
|
5
|
+
* (request, response) pair so the caller can anchor a tamper-evident,
|
|
6
|
+
* independently verifiable H-Seal receipt that carries our attestation that we
|
|
7
|
+
* served it. See https://h-seal.xr-utilities.com and the H-Series white paper.
|
|
8
|
+
*
|
|
9
|
+
* Configured entirely from env — never hardcode a signing key:
|
|
10
|
+
* PROVIDER_IDENTITY our CAIP-10 identity, e.g. "xrpl:0:r..."
|
|
11
|
+
* (or "hedera:mainnet:0.0.x")
|
|
12
|
+
* PROVIDER_KEY_RAW 32-byte ed25519 seed (hex) for that identity
|
|
13
|
+
*
|
|
14
|
+
* When either is unset the module is inert: attest() returns undefined and the
|
|
15
|
+
* response path is untouched. That keeps the live server safe if the key is not
|
|
16
|
+
* provisioned yet, and makes co-signing strictly additive — a paid tool call
|
|
17
|
+
* that succeeds today keeps succeeding whether or not H-Seal is configured.
|
|
18
|
+
*/
|
|
19
|
+
import { HSealProvider, ed25519Signer, } from "@xr-utilities/h-seal-provider";
|
|
20
|
+
const identity = process.env["PROVIDER_IDENTITY"];
|
|
21
|
+
const keyRaw = process.env["PROVIDER_KEY_RAW"];
|
|
22
|
+
/** True when both PROVIDER_IDENTITY and PROVIDER_KEY_RAW are present. */
|
|
23
|
+
export const hSealEnabled = Boolean(identity && keyRaw);
|
|
24
|
+
const provider = hSealEnabled
|
|
25
|
+
? new HSealProvider({
|
|
26
|
+
identity: identity,
|
|
27
|
+
signer: ed25519Signer(keyRaw),
|
|
28
|
+
network: "mainnet",
|
|
29
|
+
})
|
|
30
|
+
: null;
|
|
31
|
+
/**
|
|
32
|
+
* Co-sign a request/response pair. Returns the provider attestation, or
|
|
33
|
+
* undefined when H-Seal is not configured. Never throws: a receipt-signing
|
|
34
|
+
* failure must not break the paid tool call it decorates.
|
|
35
|
+
*/
|
|
36
|
+
export async function attest(request, response) {
|
|
37
|
+
if (!provider)
|
|
38
|
+
return undefined;
|
|
39
|
+
try {
|
|
40
|
+
return await provider.attest({ request, response });
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
console.error(`[hSeal] attest failed, returning response without attestation: ${err.message}`);
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** The configured provider (null when env is unset). Exposed for smokes/tests. */
|
|
48
|
+
export const hSeal = provider;
|
|
49
|
+
//# sourceMappingURL=hSeal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hSeal.js","sourceRoot":"","sources":["../src/hSeal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,GAEd,MAAM,+BAA+B,CAAC;AAEvC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAE/C,yEAAyE;AACzE,MAAM,CAAC,MAAM,YAAY,GAAY,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;AAEjE,MAAM,QAAQ,GAAyB,YAAY;IACjD,CAAC,CAAC,IAAI,aAAa,CAAC;QAChB,QAAQ,EAAE,QAAkB;QAC5B,MAAM,EAAE,aAAa,CAAC,MAAgB,CAAC;QACvC,OAAO,EAAE,SAAS;KACnB,CAAC;IACJ,CAAC,CAAC,IAAI,CAAC;AAET;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAgB,EAChB,QAAiB;IAEjB,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,kEACG,GAAa,CAAC,OACjB,EAAE,CACH,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC"}
|
|
@@ -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
|
@@ -8,6 +8,8 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
|
8
8
|
import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
9
9
|
import { ALL_TOOLS, SERVICES } from "./services/index.js";
|
|
10
10
|
import { dispatchTool } from "./dispatch.js";
|
|
11
|
+
import { attest } from "./hSeal.js";
|
|
12
|
+
import { buildReceipt } from "./hSealReceipt.js";
|
|
11
13
|
import { SERVER_VERSION } from "./version.js";
|
|
12
14
|
const SERVER_NAME = "xrpl-utilities";
|
|
13
15
|
export function buildServer(opts = {}) {
|
|
@@ -37,14 +39,52 @@ export function buildServer(opts = {}) {
|
|
|
37
39
|
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
38
40
|
const args = (req.params.arguments ?? {});
|
|
39
41
|
try {
|
|
42
|
+
const startedMs = Date.now();
|
|
40
43
|
const result = await dispatchTool(req.params.name, args, opts);
|
|
44
|
+
const endedMs = Date.now();
|
|
45
|
+
// Co-sign the (request, response) pair so the caller can anchor a
|
|
46
|
+
// tamper-evident H-Seal receipt carrying our attestation that we served
|
|
47
|
+
// it. Strip transport-only secrets from the signed request so the
|
|
48
|
+
// attestation stays reproducible and never folds a payment signature or
|
|
49
|
+
// bypass key into the receipt hash. No-op when H-Seal env is unset.
|
|
50
|
+
const signedArgs = { ...args };
|
|
51
|
+
delete signedArgs["payment_signature"];
|
|
52
|
+
delete signedArgs["_bypass_key"];
|
|
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;
|
|
41
80
|
return {
|
|
42
81
|
content: [
|
|
43
82
|
{
|
|
44
83
|
type: "text",
|
|
45
|
-
text: typeof
|
|
84
|
+
text: typeof displayResult === "string" ? displayResult : JSON.stringify(displayResult, null, 2),
|
|
46
85
|
},
|
|
47
86
|
],
|
|
87
|
+
...(Object.keys(meta).length ? { _meta: meta } : {}),
|
|
48
88
|
};
|
|
49
89
|
}
|
|
50
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,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;YAC/D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,OAAO,
|
|
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,6 +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.2.0",
|
|
25
26
|
"express": "^4.21.0"
|
|
26
27
|
},
|
|
27
28
|
"devDependencies": {
|