@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.
- package/README.md +146 -0
- package/dist/bin/swt3-mcp.d.ts +15 -0
- package/dist/bin/swt3-mcp.d.ts.map +1 -0
- package/dist/bin/swt3-mcp.js +31 -0
- package/dist/bin/swt3-mcp.js.map +1 -0
- package/dist/client.d.ts +70 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +89 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -0
- package/dist/fingerprint.d.ts +13 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +37 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/health.d.ts +14 -0
- package/dist/resources/health.d.ts.map +1 -0
- package/dist/resources/health.js +17 -0
- package/dist/resources/health.js.map +1 -0
- package/dist/resources/registry.d.ts +14 -0
- package/dist/resources/registry.d.ts.map +1 -0
- package/dist/resources/registry.js +27 -0
- package/dist/resources/registry.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +163 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/posture.d.ts +9 -0
- package/dist/tools/posture.d.ts.map +1 -0
- package/dist/tools/posture.js +10 -0
- package/dist/tools/posture.js.map +1 -0
- package/dist/tools/procedures.d.ts +15 -0
- package/dist/tools/procedures.d.ts.map +1 -0
- package/dist/tools/procedures.js +52 -0
- package/dist/tools/procedures.js.map +1 -0
- package/dist/tools/signup.d.ts +12 -0
- package/dist/tools/signup.d.ts.map +1 -0
- package/dist/tools/signup.js +26 -0
- package/dist/tools/signup.js.map +1 -0
- package/dist/tools/verify.d.ts +13 -0
- package/dist/tools/verify.d.ts.map +1 -0
- package/dist/tools/verify.js +26 -0
- package/dist/tools/verify.js.map +1 -0
- package/dist/tools/witness.d.ts +24 -0
- package/dist/tools/witness.d.ts.map +1 -0
- package/dist/tools/witness.js +96 -0
- package/dist/tools/witness.js.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# @tenova/swt3-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for the SWT3 AI Witness protocol. Adds cryptographic compliance attestation to any MCP-compatible AI agent.
|
|
4
|
+
|
|
5
|
+
## Zero-config start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx @tenova/swt3-mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
That's it. No account, no API key, no configuration. The server starts in demo mode and mints local witness anchors immediately.
|
|
12
|
+
|
|
13
|
+
When you're ready to persist anchors to the SWT3 ledger, use the `signup` tool from within your agent conversation -- no need to leave your editor.
|
|
14
|
+
|
|
15
|
+
## Setup
|
|
16
|
+
|
|
17
|
+
### Claude Desktop
|
|
18
|
+
|
|
19
|
+
Add to `claude_desktop_config.json`:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"swt3": {
|
|
25
|
+
"command": "npx",
|
|
26
|
+
"args": ["@tenova/swt3-mcp"]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Cursor
|
|
33
|
+
|
|
34
|
+
Add to `.cursor/mcp.json`:
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"mcpServers": {
|
|
39
|
+
"swt3": {
|
|
40
|
+
"command": "npx",
|
|
41
|
+
"args": ["@tenova/swt3-mcp"]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Claude Code
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
claude mcp add swt3 -- npx @tenova/swt3-mcp
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## How it works
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
1. Add server to your MCP config (one line)
|
|
57
|
+
2. Start using AI tools as normal (zero code changes)
|
|
58
|
+
3. Ask your agent to witness inferences (anchors minted locally)
|
|
59
|
+
4. Use the signup tool when ready (free account, never leave your editor)
|
|
60
|
+
5. Anchors persist to the SWT3 ledger (cryptographic compliance trail)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Three modes
|
|
64
|
+
|
|
65
|
+
| Mode | Config needed | What happens |
|
|
66
|
+
|------|--------------|--------------|
|
|
67
|
+
| **Demo** | Nothing | Local-only anchors, instant start |
|
|
68
|
+
| **API key only** | `SWT3_API_KEY` | Tenant auto-resolved, anchors persisted |
|
|
69
|
+
| **Full config** | `SWT3_API_KEY` + `SWT3_TENANT_ID` | Explicit tenant, anchors persisted |
|
|
70
|
+
|
|
71
|
+
## Tools
|
|
72
|
+
|
|
73
|
+
### witness_inference
|
|
74
|
+
|
|
75
|
+
Mint a cryptographic witness anchor for an AI inference.
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
model_id: "gpt-4o" # required -- everything else is optional
|
|
79
|
+
prompt: "What is 2+2?" # hashed locally, never sent to server
|
|
80
|
+
response: "4" # hashed locally, never sent to server
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Returns verdict (PASS/FAIL), anchor token, and verification URL.
|
|
84
|
+
|
|
85
|
+
### verify_anchor
|
|
86
|
+
|
|
87
|
+
Verify the cryptographic integrity of an existing anchor.
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
token: "SWT3-E-VULTR-AI-AIINF1-PASS-1700000000-96b7d56c0245"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### list_procedures
|
|
94
|
+
|
|
95
|
+
Browse the UCT procedure registry. 151+ compliance controls.
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
namespace: "AI" # optional filter
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### check_posture
|
|
102
|
+
|
|
103
|
+
Check current tenant compliance posture. No arguments.
|
|
104
|
+
|
|
105
|
+
### signup
|
|
106
|
+
|
|
107
|
+
Get a signup link to create a free account. No credentials pass through the AI.
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
framework: "EU-AI-ACT" # optional (default: NIST-800-53)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Returns a browser URL. Complete signup there, copy your API key, add it to your MCP config.
|
|
114
|
+
|
|
115
|
+
## Environment variables (optional)
|
|
116
|
+
|
|
117
|
+
| Variable | Default | Description |
|
|
118
|
+
|----------|---------|-------------|
|
|
119
|
+
| `SWT3_API_KEY` | demo mode | API key (starts with `axm_`) |
|
|
120
|
+
| `SWT3_TENANT_ID` | auto-resolved | Tenant ID (resolved from API key if omitted) |
|
|
121
|
+
| `SWT3_ENDPOINT` | `https://sovereign.tenova.io` | Witness endpoint |
|
|
122
|
+
| `SWT3_CLEARING_LEVEL` | `1` | Data clearing (0=analytics, 1=standard, 2=sensitive, 3=classified) |
|
|
123
|
+
| `SWT3_AGENT_ID` | | Agent identity for AI-ID.1 |
|
|
124
|
+
| `SWT3_SIGNING_KEY` | | HMAC-SHA256 signing key |
|
|
125
|
+
|
|
126
|
+
## Clearing levels
|
|
127
|
+
|
|
128
|
+
| Level | What leaves the wire |
|
|
129
|
+
|-------|---------------------|
|
|
130
|
+
| 0 | All metadata |
|
|
131
|
+
| 1 | Hashes + model ID + context |
|
|
132
|
+
| 2 | Hashes + model ID only |
|
|
133
|
+
| 3 | Factors only, model ID hashed |
|
|
134
|
+
|
|
135
|
+
Raw prompt and response text never leaves your machine at any clearing level.
|
|
136
|
+
|
|
137
|
+
## Resources
|
|
138
|
+
|
|
139
|
+
- `swt3://registry/procedures` -- Full UCT procedure catalog
|
|
140
|
+
- `swt3://health` -- Service health status
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
Apache 2.0. Patent pending.
|
|
145
|
+
|
|
146
|
+
Built by [TeNova](https://tenova.io).
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SWT3 MCP Server — CLI entry point.
|
|
4
|
+
*
|
|
5
|
+
* Zero-config start:
|
|
6
|
+
* npx @tenova/swt3-mcp
|
|
7
|
+
*
|
|
8
|
+
* With API key (tenant auto-resolved):
|
|
9
|
+
* SWT3_API_KEY=axm_live_... npx @tenova/swt3-mcp
|
|
10
|
+
*
|
|
11
|
+
* Full config:
|
|
12
|
+
* SWT3_API_KEY=axm_live_... SWT3_TENANT_ID=MY_ENCLAVE npx @tenova/swt3-mcp
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=swt3-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swt3-mcp.d.ts","sourceRoot":"","sources":["../../src/bin/swt3-mcp.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SWT3 MCP Server — CLI entry point.
|
|
4
|
+
*
|
|
5
|
+
* Zero-config start:
|
|
6
|
+
* npx @tenova/swt3-mcp
|
|
7
|
+
*
|
|
8
|
+
* With API key (tenant auto-resolved):
|
|
9
|
+
* SWT3_API_KEY=axm_live_... npx @tenova/swt3-mcp
|
|
10
|
+
*
|
|
11
|
+
* Full config:
|
|
12
|
+
* SWT3_API_KEY=axm_live_... SWT3_TENANT_ID=MY_ENCLAVE npx @tenova/swt3-mcp
|
|
13
|
+
*/
|
|
14
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
15
|
+
import { loadConfig } from "../config.js";
|
|
16
|
+
import { createServer } from "../server.js";
|
|
17
|
+
try {
|
|
18
|
+
const config = loadConfig();
|
|
19
|
+
const server = createServer(config);
|
|
20
|
+
const transport = new StdioServerTransport();
|
|
21
|
+
if (config.demo) {
|
|
22
|
+
process.stderr.write("swt3-mcp: running in demo mode (local-only anchors)\n" +
|
|
23
|
+
"swt3-mcp: use the signup tool to create a free account\n");
|
|
24
|
+
}
|
|
25
|
+
await server.connect(transport);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
process.stderr.write(`swt3-mcp: ${err.message}\n`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=swt3-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swt3-mcp.js","sourceRoot":"","sources":["../../src/bin/swt3-mcp.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uDAAuD;YACvD,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAc,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — HTTP client for Axiom APIs.
|
|
3
|
+
*
|
|
4
|
+
* Uses native fetch (Node 18+). Zero dependencies.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpConfig } from "./config.js";
|
|
7
|
+
export interface WitnessPayload {
|
|
8
|
+
procedure_id: string;
|
|
9
|
+
factor_a: number;
|
|
10
|
+
factor_b: number;
|
|
11
|
+
factor_c: number;
|
|
12
|
+
clearing_level: number;
|
|
13
|
+
anchor_fingerprint: string;
|
|
14
|
+
anchor_epoch: number;
|
|
15
|
+
fingerprint_timestamp_ms: number;
|
|
16
|
+
ai_model_id?: string;
|
|
17
|
+
ai_prompt_hash?: string;
|
|
18
|
+
ai_response_hash?: string;
|
|
19
|
+
ai_system_prompt_hash?: string;
|
|
20
|
+
ai_latency_ms?: number;
|
|
21
|
+
ai_input_tokens?: number;
|
|
22
|
+
ai_output_tokens?: number;
|
|
23
|
+
ai_context?: Record<string, unknown>;
|
|
24
|
+
agent_id?: string;
|
|
25
|
+
cycle_id?: string;
|
|
26
|
+
payload_signature?: string;
|
|
27
|
+
policy_version_hash?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface WitnessReceipt {
|
|
30
|
+
ok: boolean;
|
|
31
|
+
tenant_id: string;
|
|
32
|
+
procedure_id: string;
|
|
33
|
+
verdict: string;
|
|
34
|
+
swt3_anchor: string;
|
|
35
|
+
clearing_level: number;
|
|
36
|
+
witnessed_at: string;
|
|
37
|
+
verification_url: string;
|
|
38
|
+
error?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface VerifyResponse {
|
|
41
|
+
verified: boolean;
|
|
42
|
+
status: string;
|
|
43
|
+
claimed_fingerprint?: string;
|
|
44
|
+
recomputed_fingerprint?: string;
|
|
45
|
+
inputs?: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
export interface HealthResponse {
|
|
48
|
+
status: string;
|
|
49
|
+
version: string;
|
|
50
|
+
uptime: number;
|
|
51
|
+
checks: Record<string, string>;
|
|
52
|
+
}
|
|
53
|
+
export declare class AxiomClient {
|
|
54
|
+
private baseUrl;
|
|
55
|
+
private apiKey;
|
|
56
|
+
private timeout;
|
|
57
|
+
private resolvedTenantId;
|
|
58
|
+
constructor(config: McpConfig, timeout?: number);
|
|
59
|
+
/**
|
|
60
|
+
* Returns the tenant ID resolved from a prior API call, if available.
|
|
61
|
+
*/
|
|
62
|
+
getResolvedTenantId(): string | null;
|
|
63
|
+
private request;
|
|
64
|
+
postWitness(payload: WitnessPayload): Promise<WitnessReceipt>;
|
|
65
|
+
verifyAnchor(token: string): Promise<VerifyResponse>;
|
|
66
|
+
getHealth(): Promise<HealthResponse>;
|
|
67
|
+
getPosture(): Promise<Record<string, unknown>>;
|
|
68
|
+
fetchRegistry(): Promise<Record<string, unknown>>;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE,MAAc;IAMtD;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;YAItB,OAAO;IAqCf,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAO7D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAOpD,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAapC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAI9C,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAaxD"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — HTTP client for Axiom APIs.
|
|
3
|
+
*
|
|
4
|
+
* Uses native fetch (Node 18+). Zero dependencies.
|
|
5
|
+
*/
|
|
6
|
+
export class AxiomClient {
|
|
7
|
+
baseUrl;
|
|
8
|
+
apiKey;
|
|
9
|
+
timeout;
|
|
10
|
+
resolvedTenantId = null;
|
|
11
|
+
constructor(config, timeout = 10000) {
|
|
12
|
+
this.baseUrl = config.endpoint;
|
|
13
|
+
this.apiKey = config.apiKey;
|
|
14
|
+
this.timeout = timeout;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Returns the tenant ID resolved from a prior API call, if available.
|
|
18
|
+
*/
|
|
19
|
+
getResolvedTenantId() {
|
|
20
|
+
return this.resolvedTenantId;
|
|
21
|
+
}
|
|
22
|
+
async request(path, options = {}) {
|
|
23
|
+
const url = `${this.baseUrl}${path}`;
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
26
|
+
try {
|
|
27
|
+
const response = await fetch(url, {
|
|
28
|
+
...options,
|
|
29
|
+
signal: controller.signal,
|
|
30
|
+
headers: {
|
|
31
|
+
"Content-Type": "application/json",
|
|
32
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
33
|
+
...options.headers,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const body = await response.json();
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
const msg = body?.error || response.statusText;
|
|
39
|
+
throw new Error(`${response.status}: ${msg}`);
|
|
40
|
+
}
|
|
41
|
+
// Auto-resolve tenant ID from any response that includes it
|
|
42
|
+
if (body?.tenant_id && typeof body.tenant_id === "string") {
|
|
43
|
+
this.resolvedTenantId = body.tenant_id;
|
|
44
|
+
}
|
|
45
|
+
return body;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async postWitness(payload) {
|
|
52
|
+
return this.request("/api/v1/witness", {
|
|
53
|
+
method: "POST",
|
|
54
|
+
body: JSON.stringify(payload),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async verifyAnchor(token) {
|
|
58
|
+
const encoded = encodeURIComponent(token);
|
|
59
|
+
return this.request(`/api/v1/attest/verify?token=${encoded}`);
|
|
60
|
+
}
|
|
61
|
+
async getHealth() {
|
|
62
|
+
const url = `${this.baseUrl}/api/v1/health`;
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
65
|
+
try {
|
|
66
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
67
|
+
return (await response.json());
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async getPosture() {
|
|
74
|
+
return this.request("/api/v1/ai-witness");
|
|
75
|
+
}
|
|
76
|
+
async fetchRegistry() {
|
|
77
|
+
const url = `${this.baseUrl}/registry/uct-registry.json`;
|
|
78
|
+
const controller = new AbortController();
|
|
79
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
80
|
+
try {
|
|
81
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
82
|
+
return (await response.json());
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — Configuration from environment variables.
|
|
3
|
+
*
|
|
4
|
+
* Three modes:
|
|
5
|
+
* 1. Demo mode (no env vars) — local-only anchors, no account needed
|
|
6
|
+
* 2. API key only — tenant auto-resolved from first API call
|
|
7
|
+
* 3. Full config — API key + explicit tenant ID
|
|
8
|
+
*/
|
|
9
|
+
export interface McpConfig {
|
|
10
|
+
endpoint: string;
|
|
11
|
+
apiKey: string;
|
|
12
|
+
tenantId: string;
|
|
13
|
+
clearingLevel: 0 | 1 | 2 | 3;
|
|
14
|
+
agentId?: string;
|
|
15
|
+
signingKey?: string;
|
|
16
|
+
demo: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function loadConfig(): McpConfig;
|
|
19
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,UAAU,IAAI,SAAS,CAkCtC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — Configuration from environment variables.
|
|
3
|
+
*
|
|
4
|
+
* Three modes:
|
|
5
|
+
* 1. Demo mode (no env vars) — local-only anchors, no account needed
|
|
6
|
+
* 2. API key only — tenant auto-resolved from first API call
|
|
7
|
+
* 3. Full config — API key + explicit tenant ID
|
|
8
|
+
*/
|
|
9
|
+
export function loadConfig() {
|
|
10
|
+
const endpoint = process.env.SWT3_ENDPOINT || "https://sovereign.tenova.io";
|
|
11
|
+
const apiKey = process.env.SWT3_API_KEY || "";
|
|
12
|
+
const tenantId = process.env.SWT3_TENANT_ID || "";
|
|
13
|
+
const rawLevel = process.env.SWT3_CLEARING_LEVEL;
|
|
14
|
+
const agentId = process.env.SWT3_AGENT_ID || undefined;
|
|
15
|
+
const signingKey = process.env.SWT3_SIGNING_KEY || undefined;
|
|
16
|
+
// Demo mode: no API key set
|
|
17
|
+
const demo = !apiKey;
|
|
18
|
+
// Validate API key format if provided
|
|
19
|
+
if (apiKey && !apiKey.startsWith("axm_")) {
|
|
20
|
+
throw new Error("SWT3_API_KEY must start with 'axm_'");
|
|
21
|
+
}
|
|
22
|
+
let clearingLevel = 1;
|
|
23
|
+
if (rawLevel !== undefined) {
|
|
24
|
+
const parsed = parseInt(rawLevel, 10);
|
|
25
|
+
if (![0, 1, 2, 3].includes(parsed)) {
|
|
26
|
+
throw new Error("SWT3_CLEARING_LEVEL must be 0, 1, 2, or 3");
|
|
27
|
+
}
|
|
28
|
+
clearingLevel = parsed;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
endpoint: endpoint.replace(/\/+$/, ""),
|
|
32
|
+
apiKey: demo ? "axm_demo_local" : apiKey,
|
|
33
|
+
tenantId: demo ? "DEMO_LOCAL" : tenantId,
|
|
34
|
+
clearingLevel,
|
|
35
|
+
agentId,
|
|
36
|
+
signingKey,
|
|
37
|
+
demo,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,6BAA6B,CAAC;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS,CAAC;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,SAAS,CAAC;IAE7D,4BAA4B;IAC5B,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;IAErB,sCAAsC;IACtC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,aAAa,GAAkB,CAAC,CAAC;IACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,aAAa,GAAG,MAAuB,CAAC;IAC1C,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM;QACxC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ;QACxC,aAAa;QACb,OAAO;QACP,UAAU;QACV,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — Fingerprint minting and SHA-256 utilities.
|
|
3
|
+
*
|
|
4
|
+
* Inlined from @tenova/swt3-ai to keep this package self-contained.
|
|
5
|
+
* The fingerprint formula is LOCKED:
|
|
6
|
+
* SHA256("WITNESS:{tenant}:{proc}:{fa}:{fb}:{fc}:{ts_ms}").hex().slice(0, 12)
|
|
7
|
+
*/
|
|
8
|
+
export declare function sha256Hex(data: string, length?: number): string;
|
|
9
|
+
export declare function sha256Truncated(data: string, length?: number): string;
|
|
10
|
+
export declare function mintFingerprint(tenantId: string, procedureId: string, factorA: number, factorB: number, factorC: number, timestampMs: number): string;
|
|
11
|
+
export declare function timestampMs(): [number, number];
|
|
12
|
+
export declare function signPayload(signingKey: string, anchorFingerprint: string, agentId?: string): string;
|
|
13
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAEnE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAEzE;AAMD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,MAAM,CAMR;AAED,wBAAgB,WAAW,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAI9C;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAOR"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — Fingerprint minting and SHA-256 utilities.
|
|
3
|
+
*
|
|
4
|
+
* Inlined from @tenova/swt3-ai to keep this package self-contained.
|
|
5
|
+
* The fingerprint formula is LOCKED:
|
|
6
|
+
* SHA256("WITNESS:{tenant}:{proc}:{fa}:{fb}:{fc}:{ts_ms}").hex().slice(0, 12)
|
|
7
|
+
*/
|
|
8
|
+
import { createHash, createHmac } from "crypto";
|
|
9
|
+
export function sha256Hex(data, length = 64) {
|
|
10
|
+
return createHash("sha256").update(data, "utf-8").digest("hex").slice(0, length);
|
|
11
|
+
}
|
|
12
|
+
export function sha256Truncated(data, length = 16) {
|
|
13
|
+
return sha256Hex(data, length);
|
|
14
|
+
}
|
|
15
|
+
function numStr(v) {
|
|
16
|
+
return String(v);
|
|
17
|
+
}
|
|
18
|
+
export function mintFingerprint(tenantId, procedureId, factorA, factorB, factorC, timestampMs) {
|
|
19
|
+
const fpInput = `WITNESS:${tenantId}:${procedureId}` +
|
|
20
|
+
`:${numStr(factorA)}:${numStr(factorB)}:${numStr(factorC)}` +
|
|
21
|
+
`:${timestampMs}`;
|
|
22
|
+
return createHash("sha256").update(fpInput, "utf-8").digest("hex").slice(0, 12);
|
|
23
|
+
}
|
|
24
|
+
export function timestampMs() {
|
|
25
|
+
const ts = Date.now();
|
|
26
|
+
const epoch = Math.floor(ts / 1000);
|
|
27
|
+
return [ts, epoch];
|
|
28
|
+
}
|
|
29
|
+
export function signPayload(signingKey, anchorFingerprint, agentId) {
|
|
30
|
+
const message = agentId
|
|
31
|
+
? `${anchorFingerprint}:${agentId}`
|
|
32
|
+
: anchorFingerprint;
|
|
33
|
+
return createHmac("sha256", signingKey)
|
|
34
|
+
.update(message, "utf-8")
|
|
35
|
+
.digest("hex");
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEhD,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,SAAiB,EAAE;IACzD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB,EAAE;IAC/D,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,WAAmB,EACnB,OAAe,EACf,OAAe,EACf,OAAe,EACf,WAAmB;IAEnB,MAAM,OAAO,GACX,WAAW,QAAQ,IAAI,WAAW,EAAE;QACpC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE;QAC3D,IAAI,WAAW,EAAE,CAAC;IACpB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,UAAkB,EAClB,iBAAyB,EACzB,OAAgB;IAEhB,MAAM,OAAO,GAAG,OAAO;QACrB,CAAC,CAAC,GAAG,iBAAiB,IAAI,OAAO,EAAE;QACnC,CAAC,CAAC,iBAAiB,CAAC;IACtB,OAAO,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC;SACpC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;SACxB,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tenova/swt3-mcp — MCP Server for SWT3 AI Witness Protocol
|
|
3
|
+
*
|
|
4
|
+
* Provides tools for witnessing AI inferences, verifying anchors,
|
|
5
|
+
* and browsing the UCT procedure registry via the Model Context Protocol.
|
|
6
|
+
*
|
|
7
|
+
* Usage (programmatic):
|
|
8
|
+
* import { createServer, loadConfig } from "@tenova/swt3-mcp";
|
|
9
|
+
* const server = createServer(loadConfig());
|
|
10
|
+
*
|
|
11
|
+
* Usage (CLI):
|
|
12
|
+
* SWT3_API_KEY=axm_live_... SWT3_TENANT_ID=MY_ENCLAVE npx @tenova/swt3-mcp
|
|
13
|
+
*
|
|
14
|
+
* Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
|
|
15
|
+
*/
|
|
16
|
+
export { createServer } from "./server.js";
|
|
17
|
+
export { loadConfig } from "./config.js";
|
|
18
|
+
export type { McpConfig } from "./config.js";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tenova/swt3-mcp — MCP Server for SWT3 AI Witness Protocol
|
|
3
|
+
*
|
|
4
|
+
* Provides tools for witnessing AI inferences, verifying anchors,
|
|
5
|
+
* and browsing the UCT procedure registry via the Model Context Protocol.
|
|
6
|
+
*
|
|
7
|
+
* Usage (programmatic):
|
|
8
|
+
* import { createServer, loadConfig } from "@tenova/swt3-mcp";
|
|
9
|
+
* const server = createServer(loadConfig());
|
|
10
|
+
*
|
|
11
|
+
* Usage (CLI):
|
|
12
|
+
* SWT3_API_KEY=axm_live_... SWT3_TENANT_ID=MY_ENCLAVE npx @tenova/swt3-mcp
|
|
13
|
+
*
|
|
14
|
+
* Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
|
|
15
|
+
*/
|
|
16
|
+
export { createServer } from "./server.js";
|
|
17
|
+
export { loadConfig } from "./config.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — swt3://health resource.
|
|
3
|
+
*
|
|
4
|
+
* Read-only resource providing service health status.
|
|
5
|
+
*/
|
|
6
|
+
import type { AxiomClient } from "../client.js";
|
|
7
|
+
export declare const HEALTH_RESOURCE: {
|
|
8
|
+
uri: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
mimeType: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function readHealth(client: AxiomClient): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/resources/health.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,eAAe;;;;;CAO3B,CAAC;AAEF,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAGrE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — swt3://health resource.
|
|
3
|
+
*
|
|
4
|
+
* Read-only resource providing service health status.
|
|
5
|
+
*/
|
|
6
|
+
export const HEALTH_RESOURCE = {
|
|
7
|
+
uri: "swt3://health",
|
|
8
|
+
name: "Service Health",
|
|
9
|
+
description: "Current health status of the SWT3 witness endpoint including " +
|
|
10
|
+
"uptime, database connectivity, and service version.",
|
|
11
|
+
mimeType: "application/json",
|
|
12
|
+
};
|
|
13
|
+
export async function readHealth(client) {
|
|
14
|
+
const health = await client.getHealth();
|
|
15
|
+
return JSON.stringify(health, null, 2);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/resources/health.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,GAAG,EAAE,eAAe;IACpB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,+DAA+D;QAC/D,qDAAqD;IACvD,QAAQ,EAAE,kBAAkB;CAC7B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAmB;IAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IACxC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — swt3://registry/procedures resource.
|
|
3
|
+
*
|
|
4
|
+
* Read-only resource providing the full UCT procedure catalog.
|
|
5
|
+
*/
|
|
6
|
+
import type { AxiomClient } from "../client.js";
|
|
7
|
+
export declare const REGISTRY_RESOURCE: {
|
|
8
|
+
uri: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
mimeType: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function readRegistry(client: AxiomClient): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,eAAO,MAAM,iBAAiB;;;;;CAQ7B,CAAC;AAEF,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAUvE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server — swt3://registry/procedures resource.
|
|
3
|
+
*
|
|
4
|
+
* Read-only resource providing the full UCT procedure catalog.
|
|
5
|
+
*/
|
|
6
|
+
let registryCache = null;
|
|
7
|
+
let cacheTimestamp = 0;
|
|
8
|
+
const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
9
|
+
export const REGISTRY_RESOURCE = {
|
|
10
|
+
uri: "swt3://registry/procedures",
|
|
11
|
+
name: "UCT Procedure Registry",
|
|
12
|
+
description: "Full catalog of Universal Control Taxonomy (UCT) procedures. " +
|
|
13
|
+
"Each procedure defines a compliance control with factor schemas, " +
|
|
14
|
+
"evaluation logic, and framework mappings.",
|
|
15
|
+
mimeType: "application/json",
|
|
16
|
+
};
|
|
17
|
+
export async function readRegistry(client) {
|
|
18
|
+
const now = Date.now();
|
|
19
|
+
if (registryCache && now - cacheTimestamp < CACHE_TTL_MS) {
|
|
20
|
+
return registryCache;
|
|
21
|
+
}
|
|
22
|
+
const registry = await client.fetchRegistry();
|
|
23
|
+
registryCache = JSON.stringify(registry, null, 2);
|
|
24
|
+
cacheTimestamp = now;
|
|
25
|
+
return registryCache;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,IAAI,aAAa,GAAkB,IAAI,CAAC;AACxC,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAE9C,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG,EAAE,4BAA4B;IACjC,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,+DAA+D;QAC/D,mEAAmE;QACnE,2CAA2C;IAC7C,QAAQ,EAAE,kBAAkB;CAC7B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAmB;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,aAAa,IAAI,GAAG,GAAG,cAAc,GAAG,YAAY,EAAE,CAAC;QACzD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IAC9C,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,cAAc,GAAG,GAAG,CAAC;IACrB,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
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 { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
import type { McpConfig } from "./config.js";
|
|
10
|
+
export declare function createServer(config: McpConfig): McpServer;
|
|
11
|
+
//# sourceMappingURL=server.d.ts.map
|