@tenova/swt3-mcp 0.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.
Files changed (54) hide show
  1. package/README.md +146 -0
  2. package/dist/bin/swt3-mcp.d.ts +15 -0
  3. package/dist/bin/swt3-mcp.d.ts.map +1 -0
  4. package/dist/bin/swt3-mcp.js +31 -0
  5. package/dist/bin/swt3-mcp.js.map +1 -0
  6. package/dist/client.d.ts +70 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +89 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/config.d.ts +19 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +40 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/fingerprint.d.ts +13 -0
  15. package/dist/fingerprint.d.ts.map +1 -0
  16. package/dist/fingerprint.js +37 -0
  17. package/dist/fingerprint.js.map +1 -0
  18. package/dist/index.d.ts +19 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +18 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/resources/health.d.ts +14 -0
  23. package/dist/resources/health.d.ts.map +1 -0
  24. package/dist/resources/health.js +17 -0
  25. package/dist/resources/health.js.map +1 -0
  26. package/dist/resources/registry.d.ts +14 -0
  27. package/dist/resources/registry.d.ts.map +1 -0
  28. package/dist/resources/registry.js +27 -0
  29. package/dist/resources/registry.js.map +1 -0
  30. package/dist/server.d.ts +11 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +163 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/tools/posture.d.ts +9 -0
  35. package/dist/tools/posture.d.ts.map +1 -0
  36. package/dist/tools/posture.js +10 -0
  37. package/dist/tools/posture.js.map +1 -0
  38. package/dist/tools/procedures.d.ts +15 -0
  39. package/dist/tools/procedures.d.ts.map +1 -0
  40. package/dist/tools/procedures.js +52 -0
  41. package/dist/tools/procedures.js.map +1 -0
  42. package/dist/tools/signup.d.ts +12 -0
  43. package/dist/tools/signup.d.ts.map +1 -0
  44. package/dist/tools/signup.js +26 -0
  45. package/dist/tools/signup.js.map +1 -0
  46. package/dist/tools/verify.d.ts +13 -0
  47. package/dist/tools/verify.d.ts.map +1 -0
  48. package/dist/tools/verify.js +26 -0
  49. package/dist/tools/verify.js.map +1 -0
  50. package/dist/tools/witness.d.ts +24 -0
  51. package/dist/tools/witness.d.ts.map +1 -0
  52. package/dist/tools/witness.js +96 -0
  53. package/dist/tools/witness.js.map +1 -0
  54. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAY7C,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAmKzD"}
package/dist/server.js ADDED
@@ -0,0 +1,163 @@
1
+ /**
2
+ * SWT3 MCP Server — Server assembly.
3
+ *
4
+ * Creates an MCP Server with tools and resources for the SWT3 AI Witness protocol.
5
+ * Supports three modes: demo (zero config), API key only (auto-resolve tenant),
6
+ * and full config (API key + tenant ID).
7
+ */
8
+ import { z } from "zod";
9
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { AxiomClient } from "./client.js";
11
+ import { handleWitness } from "./tools/witness.js";
12
+ import { handleVerify } from "./tools/verify.js";
13
+ import { handleProcedures } from "./tools/procedures.js";
14
+ import { handlePosture } from "./tools/posture.js";
15
+ import { handleSignup } from "./tools/signup.js";
16
+ import { readRegistry } from "./resources/registry.js";
17
+ import { readHealth } from "./resources/health.js";
18
+ import { REGISTRY_RESOURCE } from "./resources/registry.js";
19
+ import { HEALTH_RESOURCE } from "./resources/health.js";
20
+ export function createServer(config) {
21
+ const client = new AxiomClient(config);
22
+ const server = new McpServer({
23
+ name: "swt3-mcp",
24
+ version: "0.1.0",
25
+ });
26
+ // --- Tools ---
27
+ server.registerTool("witness_inference", {
28
+ description: "Mint a cryptographic SWT3 witness anchor for an AI inference. " +
29
+ "Records model identity, prompt/response hashes, and latency as " +
30
+ "compliance evidence. Raw text is hashed locally and never sent to the server." +
31
+ (config.demo ? " Currently in DEMO mode — anchors are minted locally. Use the signup tool to persist them." : ""),
32
+ inputSchema: {
33
+ model_id: z.string().describe("AI model identifier (e.g., gpt-4o, claude-sonnet-4)"),
34
+ prompt: z.string().optional().describe("Raw prompt text (hashed locally, never sent to server)"),
35
+ prompt_hash: z.string().optional().describe("Pre-computed SHA-256 hash of prompt (16 hex chars)"),
36
+ response: z.string().optional().describe("Raw response text (hashed locally, never sent to server)"),
37
+ response_hash: z.string().optional().describe("Pre-computed SHA-256 hash of response (16 hex chars)"),
38
+ latency_ms: z.number().optional().describe("Inference latency in milliseconds"),
39
+ input_tokens: z.number().optional().describe("Number of input tokens"),
40
+ output_tokens: z.number().optional().describe("Number of output tokens"),
41
+ clearing_level: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3)]).optional()
42
+ .describe("Data clearing level (0=analytics, 1=standard, 2=sensitive, 3=classified)"),
43
+ procedure: z.string().optional().describe("UCT procedure ID (default: AI-INF.1)"),
44
+ provider: z.string().optional().describe("AI provider name (openai, anthropic, bedrock, etc.)"),
45
+ },
46
+ annotations: { readOnlyHint: false },
47
+ }, async (args) => {
48
+ try {
49
+ const text = await handleWitness(args, config, client);
50
+ return { content: [{ type: "text", text }] };
51
+ }
52
+ catch (err) {
53
+ return {
54
+ content: [{ type: "text", text: `Error: ${err.message}` }],
55
+ isError: true,
56
+ };
57
+ }
58
+ });
59
+ server.registerTool("verify_anchor", {
60
+ description: "Verify the cryptographic integrity of an SWT3 witness anchor. " +
61
+ "Checks that the anchor's fingerprint matches the recomputed value " +
62
+ "from the original factors, proving the evidence has not been tampered with.",
63
+ inputSchema: {
64
+ token: z.string().describe("SWT3 anchor token (e.g., SWT3-E-VULTR-AI-AIINF1-PASS-1700000000-96b7d56c0245)"),
65
+ },
66
+ annotations: { readOnlyHint: true },
67
+ }, async (args) => {
68
+ try {
69
+ const text = await handleVerify(args, config, client);
70
+ return { content: [{ type: "text", text }] };
71
+ }
72
+ catch (err) {
73
+ return {
74
+ content: [{ type: "text", text: `Error: ${err.message}` }],
75
+ isError: true,
76
+ };
77
+ }
78
+ });
79
+ server.registerTool("list_procedures", {
80
+ description: "List available UCT (Universal Control Taxonomy) procedures from the SWT3 registry. " +
81
+ "Each procedure maps to a specific compliance control (e.g., AI-INF.1 for inference provenance). " +
82
+ "Optionally filter by namespace (AI, ACC, AUD, CFG, NET, etc.).",
83
+ inputSchema: {
84
+ namespace: z.string().optional().describe("Filter by UCT namespace prefix (e.g., 'AI' for AI procedures)"),
85
+ },
86
+ annotations: { readOnlyHint: true },
87
+ }, async (args) => {
88
+ try {
89
+ const text = await handleProcedures(args, config, client);
90
+ return { content: [{ type: "text", text }] };
91
+ }
92
+ catch (err) {
93
+ return {
94
+ content: [{ type: "text", text: `Error: ${err.message}` }],
95
+ isError: true,
96
+ };
97
+ }
98
+ });
99
+ server.registerTool("check_posture", {
100
+ description: "Check the current AI witness compliance posture for your tenant. " +
101
+ "Returns model activity summary, pass/fail counts, and overall compliance status." +
102
+ (config.demo ? " Requires a live account — use the signup tool first." : ""),
103
+ annotations: { readOnlyHint: true },
104
+ }, async () => {
105
+ if (config.demo) {
106
+ return {
107
+ content: [{ type: "text", text: "Posture requires a live account. Use the signup tool to create a free account." }],
108
+ isError: true,
109
+ };
110
+ }
111
+ try {
112
+ const text = await handlePosture({}, config, client);
113
+ return { content: [{ type: "text", text }] };
114
+ }
115
+ catch (err) {
116
+ return {
117
+ content: [{ type: "text", text: `Error: ${err.message}` }],
118
+ isError: true,
119
+ };
120
+ }
121
+ });
122
+ server.registerTool("signup", {
123
+ description: "Get a signup link to create a free SWT3 account. " +
124
+ "Opens in your browser — no credentials pass through the AI. " +
125
+ "After signup, copy your API key into the MCP config to activate live mode.",
126
+ inputSchema: {
127
+ framework: z.string().optional().describe("Primary compliance framework (default: NIST-800-53). Options: NIST-800-53, CMMC-v2.0, AI-RMF, EU-AI-ACT, SR-11-7, NIST-800-171"),
128
+ },
129
+ annotations: { readOnlyHint: true },
130
+ }, async (args) => {
131
+ try {
132
+ const text = await handleSignup(args, config);
133
+ return { content: [{ type: "text", text }] };
134
+ }
135
+ catch (err) {
136
+ return {
137
+ content: [{ type: "text", text: `Error: ${err.message}` }],
138
+ isError: true,
139
+ };
140
+ }
141
+ });
142
+ // --- Resources ---
143
+ server.registerResource(REGISTRY_RESOURCE.name, REGISTRY_RESOURCE.uri, { mimeType: REGISTRY_RESOURCE.mimeType, description: REGISTRY_RESOURCE.description }, async () => ({
144
+ contents: [
145
+ {
146
+ uri: REGISTRY_RESOURCE.uri,
147
+ mimeType: REGISTRY_RESOURCE.mimeType,
148
+ text: await readRegistry(client),
149
+ },
150
+ ],
151
+ }));
152
+ server.registerResource(HEALTH_RESOURCE.name, HEALTH_RESOURCE.uri, { mimeType: HEALTH_RESOURCE.mimeType, description: HEALTH_RESOURCE.description }, async () => ({
153
+ contents: [
154
+ {
155
+ uri: HEALTH_RESOURCE.uri,
156
+ mimeType: HEALTH_RESOURCE.mimeType,
157
+ text: await readHealth(client),
158
+ },
159
+ ],
160
+ }));
161
+ return server;
162
+ }
163
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,gBAAgB;IAEhB,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE;QACvC,WAAW,EACT,gEAAgE;YAChE,iEAAiE;YACjE,+EAA+E;YAC/E,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,4FAA4F,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACpF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;YAChG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;YACjG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;YACpG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;YACrG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC/E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACtE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACxE,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACzF,QAAQ,CAAC,0EAA0E,CAAC;YACvF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YACjF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;SAChG;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE;KACrC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC9E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;QACnC,WAAW,EACT,gEAAgE;YAChE,oEAAoE;YACpE,6EAA6E;QAC/E,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;SAC5G;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC9E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACrC,WAAW,EACT,qFAAqF;YACrF,kGAAkG;YAClG,gEAAgE;QAClE,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;SAC3G;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC9E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;QACnC,WAAW,EACT,mEAAmE;YACnE,kFAAkF;YAClF,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,uDAAuD,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EAAE,KAAK,IAAI,EAAE;QACZ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gFAAgF,EAAE,CAAC;gBAC5H,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC9E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC5B,WAAW,EACT,mDAAmD;YACnD,8DAA8D;YAC9D,4EAA4E;QAC9E,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gIAAgI,CAAC;SAC5K;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC9E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oBAAoB;IAEpB,MAAM,CAAC,gBAAgB,CACrB,iBAAiB,CAAC,IAAI,EACtB,iBAAiB,CAAC,GAAG,EACrB,EAAE,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,iBAAiB,CAAC,WAAW,EAAE,EACpF,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,iBAAiB,CAAC,GAAG;gBAC1B,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;gBACpC,IAAI,EAAE,MAAM,YAAY,CAAC,MAAM,CAAC;aACjC;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,eAAe,CAAC,IAAI,EACpB,eAAe,CAAC,GAAG,EACnB,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,eAAe,CAAC,WAAW,EAAE,EAChF,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,eAAe,CAAC,GAAG;gBACxB,QAAQ,EAAE,eAAe,CAAC,QAAQ;gBAClC,IAAI,EAAE,MAAM,UAAU,CAAC,MAAM,CAAC;aAC/B;SACF;KACF,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SWT3 MCP Server — check_posture tool.
3
+ *
4
+ * Returns the current AI witness posture for the tenant.
5
+ */
6
+ import type { AxiomClient } from "../client.js";
7
+ import type { McpConfig } from "../config.js";
8
+ export declare function handlePosture(_args: Record<string, never>, _config: McpConfig, client: AxiomClient): Promise<string>;
9
+ //# sourceMappingURL=posture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posture.d.ts","sourceRoot":"","sources":["../../src/tools/posture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC5B,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SWT3 MCP Server — check_posture tool.
3
+ *
4
+ * Returns the current AI witness posture for the tenant.
5
+ */
6
+ export async function handlePosture(_args, _config, client) {
7
+ const posture = await client.getPosture();
8
+ return JSON.stringify(posture, null, 2);
9
+ }
10
+ //# sourceMappingURL=posture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posture.js","sourceRoot":"","sources":["../../src/tools/posture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA4B,EAC5B,OAAkB,EAClB,MAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SWT3 MCP Server — list_procedures tool.
3
+ *
4
+ * Lists available UCT procedures from the registry with optional
5
+ * namespace filtering. Registry is fetched from the endpoint and
6
+ * cached in memory (1 hour TTL).
7
+ */
8
+ import type { AxiomClient } from "../client.js";
9
+ import type { McpConfig } from "../config.js";
10
+ interface ProceduresArgs {
11
+ namespace?: string;
12
+ }
13
+ export declare function handleProcedures(args: ProceduresArgs, _config: McpConfig, client: AxiomClient): Promise<string>;
14
+ export {};
15
+ //# sourceMappingURL=procedures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procedures.d.ts","sourceRoot":"","sources":["../../src/tools/procedures.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+BD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * SWT3 MCP Server — list_procedures tool.
3
+ *
4
+ * Lists available UCT procedures from the registry with optional
5
+ * namespace filtering. Registry is fetched from the endpoint and
6
+ * cached in memory (1 hour TTL).
7
+ */
8
+ let registryCache = null;
9
+ let cacheTimestamp = 0;
10
+ const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
11
+ async function getRegistry(client) {
12
+ const now = Date.now();
13
+ if (registryCache && now - cacheTimestamp < CACHE_TTL_MS) {
14
+ return registryCache;
15
+ }
16
+ const raw = await client.fetchRegistry();
17
+ registryCache = raw;
18
+ cacheTimestamp = now;
19
+ return registryCache;
20
+ }
21
+ export async function handleProcedures(args, _config, client) {
22
+ const registry = await getRegistry(client);
23
+ const entries = Object.values(registry);
24
+ const filtered = args.namespace
25
+ ? entries.filter((e) => e.procedure_id?.toUpperCase().startsWith(args.namespace.toUpperCase()))
26
+ : entries;
27
+ if (filtered.length === 0) {
28
+ return args.namespace
29
+ ? `No procedures found for namespace '${args.namespace}'.`
30
+ : "No procedures found in registry.";
31
+ }
32
+ const lines = filtered.map((e) => {
33
+ const parts = [`${e.procedure_id}: ${e.title || "Untitled"}`];
34
+ if (e.factors) {
35
+ const fa = e.factors.factor_a;
36
+ const fb = e.factors.factor_b;
37
+ const fc = e.factors.factor_c;
38
+ if (fa?.label)
39
+ parts.push(` Factor A: ${fa.label}${fa.description ? ` — ${fa.description}` : ""}`);
40
+ if (fb?.label)
41
+ parts.push(` Factor B: ${fb.label}${fb.description ? ` — ${fb.description}` : ""}`);
42
+ if (fc?.label)
43
+ parts.push(` Factor C: ${fc.label}${fc.description ? ` — ${fc.description}` : ""}`);
44
+ }
45
+ return parts.join("\n");
46
+ });
47
+ const header = args.namespace
48
+ ? `UCT Procedures (${args.namespace.toUpperCase()}): ${filtered.length} found`
49
+ : `UCT Procedures: ${filtered.length} total`;
50
+ return `${header}\n${"─".repeat(50)}\n${lines.join("\n\n")}`;
51
+ }
52
+ //# sourceMappingURL=procedures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procedures.js","sourceRoot":"","sources":["../../src/tools/procedures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * SWT3 MCP Server — signup tool.
3
+ *
4
+ * Directs the developer to the signup page without passing credentials
5
+ * through the LLM context. Returns a URL — the developer completes
6
+ * signup in their browser and copies the API key back.
7
+ */
8
+ import type { McpConfig } from "../config.js";
9
+ export declare function handleSignup(args: {
10
+ framework?: string;
11
+ }, config: McpConfig): Promise<string>;
12
+ //# sourceMappingURL=signup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["../../src/tools/signup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAsB,YAAY,CAChC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5B,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SWT3 MCP Server — signup tool.
3
+ *
4
+ * Directs the developer to the signup page without passing credentials
5
+ * through the LLM context. Returns a URL — the developer completes
6
+ * signup in their browser and copies the API key back.
7
+ */
8
+ export async function handleSignup(args, config) {
9
+ const framework = args.framework || "NIST-800-53";
10
+ const signupUrl = `${config.endpoint}/signup?ref=mcp&framework=${encodeURIComponent(framework)}`;
11
+ return [
12
+ `Open this link to create your free account:`,
13
+ ``,
14
+ ` ${signupUrl}`,
15
+ ``,
16
+ `After signup, you'll see your API key (shown once — copy it).`,
17
+ `Then add it to your MCP config:`,
18
+ ``,
19
+ ` "env": {`,
20
+ ` "SWT3_API_KEY": "axm_open_..."`,
21
+ ` }`,
22
+ ``,
23
+ `Restart your MCP client and the server switches to live mode automatically.`,
24
+ ].join("\n");
25
+ }
26
+ //# sourceMappingURL=signup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/tools/signup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAA4B,EAC5B,MAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC;IAClD,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,QAAQ,6BAA6B,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;IAEjG,OAAO;QACL,6CAA6C;QAC7C,EAAE;QACF,KAAK,SAAS,EAAE;QAChB,EAAE;QACF,+DAA+D;QAC/D,iCAAiC;QACjC,EAAE;QACF,YAAY;QACZ,oCAAoC;QACpC,KAAK;QACL,EAAE;QACF,6EAA6E;KAC9E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * SWT3 MCP Server — verify_anchor tool.
3
+ *
4
+ * Verifies the cryptographic integrity of an existing SWT3 anchor.
5
+ */
6
+ import type { AxiomClient } from "../client.js";
7
+ import type { McpConfig } from "../config.js";
8
+ interface VerifyArgs {
9
+ token: string;
10
+ }
11
+ export declare function handleVerify(args: VerifyArgs, _config: McpConfig, client: AxiomClient): Promise<string>;
12
+ export {};
13
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SWT3 MCP Server — verify_anchor tool.
3
+ *
4
+ * Verifies the cryptographic integrity of an existing SWT3 anchor.
5
+ */
6
+ export async function handleVerify(args, _config, client) {
7
+ if (!args.token.startsWith("SWT3-")) {
8
+ return "Error: Token must start with 'SWT3-'";
9
+ }
10
+ const result = await client.verifyAnchor(args.token);
11
+ const lines = [
12
+ `Verified: ${result.verified ? "YES" : "NO"}`,
13
+ `Status: ${result.status}`,
14
+ ];
15
+ if (result.claimed_fingerprint) {
16
+ lines.push(`Claimed Fingerprint: ${result.claimed_fingerprint}`);
17
+ }
18
+ if (result.recomputed_fingerprint) {
19
+ lines.push(`Recomputed Fingerprint: ${result.recomputed_fingerprint}`);
20
+ }
21
+ if (result.inputs) {
22
+ lines.push(`Inputs: ${JSON.stringify(result.inputs, null, 2)}`);
23
+ }
24
+ return lines.join("\n");
25
+ }
26
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,OAAkB,EAClB,MAAmB;IAEnB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,OAAO,sCAAsC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG;QACZ,aAAa,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QAC7C,WAAW,MAAM,CAAC,MAAM,EAAE;KAC3B,CAAC;IAEF,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * SWT3 MCP Server — witness_inference tool.
3
+ *
4
+ * Mints an SWT3 witness anchor for an AI inference. Accepts raw prompt/response
5
+ * text (hashed locally, never sent to server) or pre-computed hashes.
6
+ */
7
+ import type { McpConfig } from "../config.js";
8
+ import type { AxiomClient } from "../client.js";
9
+ interface WitnessArgs {
10
+ model_id: string;
11
+ prompt?: string;
12
+ prompt_hash?: string;
13
+ response?: string;
14
+ response_hash?: string;
15
+ latency_ms?: number;
16
+ input_tokens?: number;
17
+ output_tokens?: number;
18
+ clearing_level?: 0 | 1 | 2 | 3;
19
+ procedure?: string;
20
+ provider?: string;
21
+ }
22
+ export declare function handleWitness(args: WitnessArgs, config: McpConfig, client: AxiomClient): Promise<string>;
23
+ export {};
24
+ //# sourceMappingURL=witness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../src/tools/witness.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAC;AAQhE,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAsGjB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * SWT3 MCP Server — witness_inference tool.
3
+ *
4
+ * Mints an SWT3 witness anchor for an AI inference. Accepts raw prompt/response
5
+ * text (hashed locally, never sent to server) or pre-computed hashes.
6
+ */
7
+ import { mintFingerprint, sha256Truncated, timestampMs, signPayload, } from "../fingerprint.js";
8
+ export async function handleWitness(args, config, client) {
9
+ const procedureId = args.procedure || "AI-INF.1";
10
+ const clearingLevel = args.clearing_level ?? config.clearingLevel;
11
+ const latencyMs = args.latency_ms ?? 0;
12
+ // Hash raw text locally if provided
13
+ const promptHash = args.prompt_hash || (args.prompt ? sha256Truncated(args.prompt) : sha256Truncated(""));
14
+ const responseHash = args.response_hash || (args.response ? sha256Truncated(args.response) : sha256Truncated(""));
15
+ // Compute factors (AI-INF.1 pattern)
16
+ const factorA = 1;
17
+ const factorB = promptHash && responseHash ? 1 : 0;
18
+ const factorC = 0;
19
+ // Mint fingerprint
20
+ const [ts, epoch] = timestampMs();
21
+ const fp = mintFingerprint(config.tenantId, procedureId, factorA, factorB, factorC, ts);
22
+ // Build payload with clearing applied
23
+ const payload = {
24
+ procedure_id: procedureId,
25
+ factor_a: factorA,
26
+ factor_b: factorB,
27
+ factor_c: factorC,
28
+ clearing_level: clearingLevel,
29
+ anchor_fingerprint: fp,
30
+ anchor_epoch: epoch,
31
+ fingerprint_timestamp_ms: ts,
32
+ };
33
+ // Apply clearing level
34
+ if (clearingLevel <= 2) {
35
+ payload.ai_prompt_hash = promptHash;
36
+ payload.ai_response_hash = responseHash;
37
+ payload.ai_latency_ms = latencyMs;
38
+ if (args.input_tokens !== undefined)
39
+ payload.ai_input_tokens = args.input_tokens;
40
+ if (args.output_tokens !== undefined)
41
+ payload.ai_output_tokens = args.output_tokens;
42
+ }
43
+ if (clearingLevel <= 1) {
44
+ payload.ai_model_id = args.model_id;
45
+ payload.ai_context = {
46
+ provider: args.provider || "unknown",
47
+ };
48
+ }
49
+ else if (clearingLevel === 2) {
50
+ payload.ai_model_id = args.model_id;
51
+ }
52
+ else {
53
+ // Level 3: hash model_id
54
+ payload.ai_model_id = sha256Truncated(args.model_id);
55
+ }
56
+ // Operational metadata (survives all clearing levels)
57
+ if (config.agentId)
58
+ payload.agent_id = config.agentId;
59
+ if (config.signingKey) {
60
+ payload.payload_signature = signPayload(config.signingKey, fp, config.agentId);
61
+ }
62
+ // Demo mode: mint locally, no network call
63
+ if (config.demo) {
64
+ const verdict = factorB >= factorA ? "PASS" : "FAIL";
65
+ const demoAnchor = `SWT3-DEMO-LOCAL-AI-${procedureId.replace(/[.-]/g, "")}-${verdict}-${epoch}-${fp}`;
66
+ return [
67
+ `[DEMO MODE — local only, not persisted]`,
68
+ ``,
69
+ `Verdict: ${verdict}`,
70
+ `Anchor: ${demoAnchor}`,
71
+ `Procedure: ${procedureId}`,
72
+ `Model: ${args.model_id}`,
73
+ `Clearing Level: ${clearingLevel}`,
74
+ `Fingerprint: ${fp}`,
75
+ ``,
76
+ `This anchor was minted locally. To persist anchors to the SWT3 ledger,`,
77
+ `use the signup tool to create a free account, or set SWT3_API_KEY.`,
78
+ ].join("\n");
79
+ }
80
+ // POST to witness endpoint
81
+ const receipt = await client.postWitness(payload);
82
+ // Auto-resolve tenant ID for future calls
83
+ if (receipt.tenant_id && !process.env.SWT3_TENANT_ID) {
84
+ config.tenantId = receipt.tenant_id;
85
+ }
86
+ return [
87
+ `Verdict: ${receipt.verdict}`,
88
+ `Anchor: ${receipt.swt3_anchor}`,
89
+ `Procedure: ${receipt.procedure_id}`,
90
+ `Clearing Level: ${receipt.clearing_level}`,
91
+ `Witnessed: ${receipt.witnessed_at}`,
92
+ `Verify: ${config.endpoint}${receipt.verification_url}`,
93
+ `Fingerprint: ${fp}`,
94
+ ].join("\n");
95
+ }
96
+ //# sourceMappingURL=witness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"witness.js","sourceRoot":"","sources":["../../src/tools/witness.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@tenova/swt3-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for SWT3 AI Witness protocol — witness inferences, verify anchors, browse UCT registry",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "bin": {
15
+ "swt3-mcp": "./dist/bin/swt3-mcp.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "test": "node --experimental-vm-modules node_modules/.bin/vitest run",
24
+ "typecheck": "tsc --noEmit"
25
+ },
26
+ "keywords": [
27
+ "mcp",
28
+ "ai",
29
+ "compliance",
30
+ "witness",
31
+ "swt3",
32
+ "attestation",
33
+ "eu-ai-act",
34
+ "nist-ai-rmf"
35
+ ],
36
+ "author": "TeNova <engineering@tenovaai.com>",
37
+ "license": "Apache-2.0",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/tenova-labs/swt3-ai"
41
+ },
42
+ "homepage": "https://tenova.io",
43
+ "dependencies": {
44
+ "@modelcontextprotocol/sdk": "^1.29.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^22.0.0",
48
+ "typescript": "^5.5.0",
49
+ "vitest": "^4.1.2"
50
+ },
51
+ "engines": {
52
+ "node": ">=18.0.0"
53
+ }
54
+ }