@kya-os/mcp-i-cloudflare 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +458 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/crypto.d.ts +38 -0
- package/dist/providers/crypto.d.ts.map +1 -0
- package/dist/providers/crypto.js +132 -0
- package/dist/providers/crypto.js.map +1 -0
- package/dist/providers/identity.d.ts +33 -0
- package/dist/providers/identity.d.ts.map +1 -0
- package/dist/providers/identity.js +62 -0
- package/dist/providers/identity.js.map +1 -0
- package/dist/providers/nonce-cache.d.ts +17 -0
- package/dist/providers/nonce-cache.d.ts.map +1 -0
- package/dist/providers/nonce-cache.js +58 -0
- package/dist/providers/nonce-cache.js.map +1 -0
- package/dist/providers/storage.d.ts +62 -0
- package/dist/providers/storage.d.ts.map +1 -0
- package/dist/providers/storage.js +201 -0
- package/dist/providers/storage.js.map +1 -0
- package/dist/runtime/index.d.ts +31 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +72 -0
- package/dist/runtime/index.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Crypto Provider for Cloudflare Workers
|
|
3
|
+
*
|
|
4
|
+
* Implements CryptoProvider using the Web Crypto API available in Workers.
|
|
5
|
+
*/
|
|
6
|
+
import { CryptoProvider } from '@kya-os/mcp-i-core';
|
|
7
|
+
export class WebCryptoProvider extends CryptoProvider {
|
|
8
|
+
/**
|
|
9
|
+
* Sign data using Ed25519
|
|
10
|
+
*/
|
|
11
|
+
async sign(data, privateKeyBase64) {
|
|
12
|
+
const privateKeyBytes = this.base64ToBytes(privateKeyBase64);
|
|
13
|
+
// Convert raw Ed25519 key to PKCS8 format for Web Crypto
|
|
14
|
+
const pkcs8 = this.wrapPrivateKeyPKCS8(privateKeyBytes);
|
|
15
|
+
const cryptoKey = await crypto.subtle.importKey('pkcs8', pkcs8.buffer.slice(pkcs8.byteOffset, pkcs8.byteOffset + pkcs8.byteLength), {
|
|
16
|
+
name: 'Ed25519',
|
|
17
|
+
namedCurve: 'Ed25519'
|
|
18
|
+
}, false, ['sign']);
|
|
19
|
+
const signature = await crypto.subtle.sign('Ed25519', cryptoKey, data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));
|
|
20
|
+
return new Uint8Array(signature);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Verify Ed25519 signature
|
|
24
|
+
*/
|
|
25
|
+
async verify(data, signature, publicKeyBase64) {
|
|
26
|
+
try {
|
|
27
|
+
const publicKeyBytes = this.base64ToBytes(publicKeyBase64);
|
|
28
|
+
// Convert raw Ed25519 key to SubjectPublicKeyInfo format
|
|
29
|
+
const spki = this.wrapPublicKeySPKI(publicKeyBytes);
|
|
30
|
+
const cryptoKey = await crypto.subtle.importKey('spki', spki.buffer.slice(spki.byteOffset, spki.byteOffset + spki.byteLength), {
|
|
31
|
+
name: 'Ed25519',
|
|
32
|
+
namedCurve: 'Ed25519'
|
|
33
|
+
}, false, ['verify']);
|
|
34
|
+
return await crypto.subtle.verify('Ed25519', cryptoKey, signature.buffer.slice(signature.byteOffset, signature.byteOffset + signature.byteLength), data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Generate Ed25519 key pair
|
|
42
|
+
*/
|
|
43
|
+
async generateKeyPair() {
|
|
44
|
+
const keyPair = await crypto.subtle.generateKey({
|
|
45
|
+
name: 'Ed25519',
|
|
46
|
+
namedCurve: 'Ed25519'
|
|
47
|
+
}, true, ['sign', 'verify']);
|
|
48
|
+
// Export private key as PKCS8
|
|
49
|
+
const privateKeyPKCS8 = await crypto.subtle.exportKey('pkcs8', keyPair.privateKey);
|
|
50
|
+
const privateKeyBytes = this.extractRawPrivateKey(new Uint8Array(privateKeyPKCS8));
|
|
51
|
+
// Export public key as SPKI
|
|
52
|
+
const publicKeySPKI = await crypto.subtle.exportKey('spki', keyPair.publicKey);
|
|
53
|
+
const publicKeyBytes = this.extractRawPublicKey(new Uint8Array(publicKeySPKI));
|
|
54
|
+
return {
|
|
55
|
+
privateKey: this.bytesToBase64(privateKeyBytes),
|
|
56
|
+
publicKey: this.bytesToBase64(publicKeyBytes)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate SHA-256 hash
|
|
61
|
+
*/
|
|
62
|
+
async hash(data) {
|
|
63
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));
|
|
64
|
+
return new Uint8Array(hashBuffer);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate random bytes
|
|
68
|
+
*/
|
|
69
|
+
async randomBytes(length) {
|
|
70
|
+
const buffer = new Uint8Array(length);
|
|
71
|
+
crypto.getRandomValues(buffer);
|
|
72
|
+
return buffer;
|
|
73
|
+
}
|
|
74
|
+
// Helper methods for key format conversion
|
|
75
|
+
wrapPrivateKeyPKCS8(rawKey) {
|
|
76
|
+
// PKCS8 wrapper for Ed25519 private key
|
|
77
|
+
const pkcs8Header = new Uint8Array([
|
|
78
|
+
0x30, 0x2e, // SEQUENCE (46 bytes)
|
|
79
|
+
0x02, 0x01, 0x00, // INTEGER version 0
|
|
80
|
+
0x30, 0x05, // SEQUENCE (5 bytes) - Algorithm
|
|
81
|
+
0x06, 0x03, 0x2b, 0x65, 0x70, // OID for Ed25519
|
|
82
|
+
0x04, 0x22, // OCTET STRING (34 bytes)
|
|
83
|
+
0x04, 0x20 // OCTET STRING (32 bytes) - the actual key
|
|
84
|
+
]);
|
|
85
|
+
// Handle both 32-byte and 64-byte keys
|
|
86
|
+
const keyBytes = rawKey.length === 64 ? rawKey.slice(0, 32) : rawKey;
|
|
87
|
+
const result = new Uint8Array(pkcs8Header.length + keyBytes.length);
|
|
88
|
+
result.set(pkcs8Header);
|
|
89
|
+
result.set(keyBytes, pkcs8Header.length);
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
wrapPublicKeySPKI(rawKey) {
|
|
93
|
+
// SubjectPublicKeyInfo wrapper for Ed25519 public key
|
|
94
|
+
const spkiHeader = new Uint8Array([
|
|
95
|
+
0x30, 0x2a, // SEQUENCE (42 bytes)
|
|
96
|
+
0x30, 0x05, // SEQUENCE (5 bytes) - Algorithm
|
|
97
|
+
0x06, 0x03, 0x2b, 0x65, 0x70, // OID for Ed25519
|
|
98
|
+
0x03, 0x21, // BIT STRING (33 bytes)
|
|
99
|
+
0x00 // No unused bits
|
|
100
|
+
]);
|
|
101
|
+
const result = new Uint8Array(spkiHeader.length + rawKey.length);
|
|
102
|
+
result.set(spkiHeader);
|
|
103
|
+
result.set(rawKey, spkiHeader.length);
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
extractRawPrivateKey(pkcs8) {
|
|
107
|
+
// Extract the raw 32-byte key from PKCS8 format
|
|
108
|
+
// The key starts at offset 16 (after headers)
|
|
109
|
+
return pkcs8.slice(16, 48);
|
|
110
|
+
}
|
|
111
|
+
extractRawPublicKey(spki) {
|
|
112
|
+
// Extract the raw 32-byte key from SPKI format
|
|
113
|
+
// The key starts at offset 12 (after headers)
|
|
114
|
+
return spki.slice(12, 44);
|
|
115
|
+
}
|
|
116
|
+
base64ToBytes(base64) {
|
|
117
|
+
const binaryString = atob(base64);
|
|
118
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
119
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
120
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
121
|
+
}
|
|
122
|
+
return bytes;
|
|
123
|
+
}
|
|
124
|
+
bytesToBase64(bytes) {
|
|
125
|
+
let binaryString = '';
|
|
126
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
127
|
+
binaryString += String.fromCharCode(bytes[i]);
|
|
128
|
+
}
|
|
129
|
+
return btoa(binaryString);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/providers/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers identity provider using KV or environment variables
|
|
3
|
+
*/
|
|
4
|
+
import { IdentityProvider } from "@kya-os/mcp-i-core/dist/types/providers";
|
|
5
|
+
import { AgentIdentity } from "@kya-os/contracts/handshake";
|
|
6
|
+
export interface CloudflareEnv {
|
|
7
|
+
MCP_IDENTITY_DID?: string;
|
|
8
|
+
MCP_IDENTITY_KEY_ID?: string;
|
|
9
|
+
MCP_IDENTITY_PRIVATE_KEY?: string;
|
|
10
|
+
MCP_IDENTITY_PUBLIC_KEY?: string;
|
|
11
|
+
IDENTITY_KV?: KVNamespace;
|
|
12
|
+
}
|
|
13
|
+
export declare class WorkerIdentityProvider extends IdentityProvider {
|
|
14
|
+
private env;
|
|
15
|
+
constructor(env: CloudflareEnv);
|
|
16
|
+
/**
|
|
17
|
+
* Load identity from environment variables or KV
|
|
18
|
+
*/
|
|
19
|
+
loadIdentity(): Promise<AgentIdentity | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Store identity in KV (if available)
|
|
22
|
+
*/
|
|
23
|
+
storeIdentity(identity: AgentIdentity): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if identity exists
|
|
26
|
+
*/
|
|
27
|
+
hasIdentity(): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Delete identity from KV
|
|
30
|
+
*/
|
|
31
|
+
deleteIdentity(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/providers/identity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,WAAW,aAAa;IAE5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAGjC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,sBAAuB,SAAQ,gBAAgB;IAC9C,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,aAAa;IAItC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAuBnD;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAKtC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers identity provider using KV or environment variables
|
|
3
|
+
*/
|
|
4
|
+
import { IdentityProvider } from "@kya-os/mcp-i-core/dist/types/providers";
|
|
5
|
+
export class WorkerIdentityProvider extends IdentityProvider {
|
|
6
|
+
env;
|
|
7
|
+
constructor(env) {
|
|
8
|
+
super();
|
|
9
|
+
this.env = env;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Load identity from environment variables or KV
|
|
13
|
+
*/
|
|
14
|
+
async loadIdentity() {
|
|
15
|
+
// First, try environment variables (for production)
|
|
16
|
+
if (this.env.MCP_IDENTITY_DID && this.env.MCP_IDENTITY_PRIVATE_KEY) {
|
|
17
|
+
return {
|
|
18
|
+
did: this.env.MCP_IDENTITY_DID,
|
|
19
|
+
keyId: this.env.MCP_IDENTITY_KEY_ID || `${this.env.MCP_IDENTITY_DID}#key-1`,
|
|
20
|
+
privateKey: this.env.MCP_IDENTITY_PRIVATE_KEY,
|
|
21
|
+
publicKey: this.env.MCP_IDENTITY_PUBLIC_KEY,
|
|
22
|
+
createdAt: new Date().toISOString() // We don't have the original timestamp
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Then try KV storage (for development/dynamic)
|
|
26
|
+
if (this.env.IDENTITY_KV) {
|
|
27
|
+
const identityJson = await this.env.IDENTITY_KV.get('identity');
|
|
28
|
+
if (identityJson) {
|
|
29
|
+
return JSON.parse(identityJson);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Store identity in KV (if available)
|
|
36
|
+
*/
|
|
37
|
+
async storeIdentity(identity) {
|
|
38
|
+
if (this.env.IDENTITY_KV) {
|
|
39
|
+
await this.env.IDENTITY_KV.put('identity', JSON.stringify(identity));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// In production, identities should be set via environment variables
|
|
43
|
+
console.warn('No KV namespace available for identity storage. Set identity via environment variables.');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if identity exists
|
|
48
|
+
*/
|
|
49
|
+
async hasIdentity() {
|
|
50
|
+
const identity = await this.loadIdentity();
|
|
51
|
+
return identity !== null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Delete identity from KV
|
|
55
|
+
*/
|
|
56
|
+
async deleteIdentity() {
|
|
57
|
+
if (this.env.IDENTITY_KV) {
|
|
58
|
+
await this.env.IDENTITY_KV.delete('identity');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/providers/identity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAc3E,MAAM,OAAO,sBAAuB,SAAQ,gBAAgB;IACtC;IAApB,YAAoB,GAAkB;QACpC,KAAK,EAAE,CAAC;QADU,QAAG,GAAH,GAAG,CAAe;IAEtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,oDAAoD;QACpD,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;YACnE,OAAO;gBACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB;gBAC9B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,QAAQ;gBAC3E,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,wBAAwB;gBAC7C,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,uBAAwB;gBAC5C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,uCAAuC;aAC5E,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAChE,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAkB,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAuB;QACzC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,OAAO,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO,QAAQ,KAAK,IAAI,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare KV-based nonce cache provider
|
|
3
|
+
*/
|
|
4
|
+
import { NonceCacheProvider } from "@kya-os/mcp-i-core/dist/types/providers";
|
|
5
|
+
export declare class CloudflareKVNonceCache extends NonceCacheProvider {
|
|
6
|
+
private kv;
|
|
7
|
+
private keyPrefix;
|
|
8
|
+
constructor(kv: KVNamespace, keyPrefix?: string);
|
|
9
|
+
private getKey;
|
|
10
|
+
has(nonce: string): Promise<boolean>;
|
|
11
|
+
add(nonce: string, ttl: number): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Cleanup is handled automatically by KV TTL
|
|
14
|
+
*/
|
|
15
|
+
cleanup(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=nonce-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonce-cache.d.ts","sourceRoot":"","sources":["../../src/providers/nonce-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,qBAAa,sBAAuB,SAAQ,kBAAkB;IAGhD,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,SAAS,CAAS;gBAEN,EAAE,EAAE,WAAW,EAAE,SAAS,SAAW;IAKzD,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBpC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare KV-based nonce cache provider
|
|
3
|
+
*/
|
|
4
|
+
import { NonceCacheProvider } from "@kya-os/mcp-i-core/dist/types/providers";
|
|
5
|
+
export class CloudflareKVNonceCache extends NonceCacheProvider {
|
|
6
|
+
kv;
|
|
7
|
+
keyPrefix;
|
|
8
|
+
constructor(kv, keyPrefix = 'nonce:') {
|
|
9
|
+
super();
|
|
10
|
+
this.kv = kv;
|
|
11
|
+
this.keyPrefix = keyPrefix;
|
|
12
|
+
}
|
|
13
|
+
getKey(nonce) {
|
|
14
|
+
return `${this.keyPrefix}${nonce}`;
|
|
15
|
+
}
|
|
16
|
+
async has(nonce) {
|
|
17
|
+
const key = this.getKey(nonce);
|
|
18
|
+
const value = await this.kv.get(key);
|
|
19
|
+
if (!value) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
// Parse the stored data to check expiry
|
|
23
|
+
try {
|
|
24
|
+
const data = JSON.parse(value);
|
|
25
|
+
if (Date.now() > data.expiresAt) {
|
|
26
|
+
// Clean up expired entry
|
|
27
|
+
await this.kv.delete(key);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// If we can't parse, assume expired and clean up
|
|
34
|
+
await this.kv.delete(key);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async add(nonce, ttl) {
|
|
39
|
+
const key = this.getKey(nonce);
|
|
40
|
+
const expiresAt = Date.now() + ttl * 1000;
|
|
41
|
+
const data = {
|
|
42
|
+
nonce,
|
|
43
|
+
expiresAt,
|
|
44
|
+
createdAt: Date.now()
|
|
45
|
+
};
|
|
46
|
+
// Store with KV TTL for automatic cleanup
|
|
47
|
+
await this.kv.put(key, JSON.stringify(data), {
|
|
48
|
+
expirationTtl: ttl // TTL in seconds
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Cleanup is handled automatically by KV TTL
|
|
53
|
+
*/
|
|
54
|
+
async cleanup() {
|
|
55
|
+
// No-op: Cloudflare KV handles expiration automatically
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=nonce-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonce-cache.js","sourceRoot":"","sources":["../../src/providers/nonce-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,MAAM,OAAO,sBAAuB,SAAQ,kBAAkB;IAGxC;IAFZ,SAAS,CAAS;IAE1B,YAAoB,EAAe,EAAE,SAAS,GAAG,QAAQ;QACvD,KAAK,EAAE,CAAC;QADU,OAAE,GAAF,EAAE,CAAa;QAEjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEO,MAAM,CAAC,KAAa;QAC1B,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAa;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChC,yBAAyB;gBACzB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;YACjD,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,GAAW;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC;QAE1C,MAAM,IAAI,GAAG;YACX,KAAK;YACL,SAAS;YACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,0CAA0C;QAC1C,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACf,GAAG,EACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EACpB;YACE,aAAa,EAAE,GAAG,CAAC,iBAAiB;SACrC,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,wDAAwD;IAC1D,CAAC;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare KV Storage Provider
|
|
3
|
+
*
|
|
4
|
+
* Implements StorageProvider and NonceCacheProvider using Cloudflare KV.
|
|
5
|
+
*/
|
|
6
|
+
import { StorageProvider, NonceCacheProvider, ClockProvider, FetchProvider, IdentityProvider, AgentIdentity } from '@kya-os/mcp-i-core';
|
|
7
|
+
/**
|
|
8
|
+
* KV storage provider for Cloudflare Workers
|
|
9
|
+
*/
|
|
10
|
+
export declare class KVStorageProvider extends StorageProvider {
|
|
11
|
+
private kv;
|
|
12
|
+
constructor(kv: KVNamespace);
|
|
13
|
+
get(key: string): Promise<string | null>;
|
|
14
|
+
set(key: string, value: string): Promise<void>;
|
|
15
|
+
delete(key: string): Promise<void>;
|
|
16
|
+
exists(key: string): Promise<boolean>;
|
|
17
|
+
list(prefix?: string): Promise<string[]>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* KV nonce cache provider for Cloudflare Workers
|
|
21
|
+
*/
|
|
22
|
+
export declare class KVNonceCacheProvider extends NonceCacheProvider {
|
|
23
|
+
private kv;
|
|
24
|
+
constructor(kv: KVNamespace);
|
|
25
|
+
has(nonce: string): Promise<boolean>;
|
|
26
|
+
add(nonce: string, expiresAt: number): Promise<void>;
|
|
27
|
+
cleanup(): Promise<void>;
|
|
28
|
+
destroy(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Workers Clock Provider
|
|
32
|
+
*/
|
|
33
|
+
export declare class WorkersClockProvider extends ClockProvider {
|
|
34
|
+
now(): number;
|
|
35
|
+
isWithinSkew(timestamp: number, skewSeconds: number): boolean;
|
|
36
|
+
hasExpired(expiresAt: number): boolean;
|
|
37
|
+
calculateExpiry(ttlSeconds: number): number;
|
|
38
|
+
format(timestamp: number): string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Workers Fetch Provider
|
|
42
|
+
*/
|
|
43
|
+
export declare class WorkersFetchProvider extends FetchProvider {
|
|
44
|
+
resolveDID(did: string): Promise<any>;
|
|
45
|
+
fetchStatusList(url: string): Promise<any>;
|
|
46
|
+
fetchDelegationChain(id: string): Promise<any[]>;
|
|
47
|
+
fetch(url: string, options?: RequestInit): Promise<Response>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Workers Identity Provider using environment variables
|
|
51
|
+
*/
|
|
52
|
+
export declare class WorkersIdentityProvider extends IdentityProvider {
|
|
53
|
+
private env;
|
|
54
|
+
private cryptoProvider?;
|
|
55
|
+
constructor(env: any, cryptoProvider?: any | undefined);
|
|
56
|
+
getIdentity(): Promise<AgentIdentity>;
|
|
57
|
+
saveIdentity(identity: AgentIdentity): Promise<void>;
|
|
58
|
+
rotateKeys(): Promise<AgentIdentity>;
|
|
59
|
+
deleteIdentity(): Promise<void>;
|
|
60
|
+
private generateDIDFromPublicKey;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/providers/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExI;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;IACxC,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,WAAW;IAI7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAI/C;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC9C,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,WAAW;IAI7B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,GAAG,IAAI,MAAM;IAIb,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAO7D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAI3C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAGlC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;IAC/C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAiCrC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU1C,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAKhD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;CAGnE;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,gBAAgB;IAEzD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,cAAc,CAAC;gBADf,GAAG,EAAE,GAAG,EACR,cAAc,CAAC,EAAE,GAAG,YAAA;IAKxB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;IA+BrC,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAkBpC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,OAAO,CAAC,wBAAwB;CASjC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare KV Storage Provider
|
|
3
|
+
*
|
|
4
|
+
* Implements StorageProvider and NonceCacheProvider using Cloudflare KV.
|
|
5
|
+
*/
|
|
6
|
+
import { StorageProvider, NonceCacheProvider, ClockProvider, FetchProvider, IdentityProvider } from '@kya-os/mcp-i-core';
|
|
7
|
+
/**
|
|
8
|
+
* KV storage provider for Cloudflare Workers
|
|
9
|
+
*/
|
|
10
|
+
export class KVStorageProvider extends StorageProvider {
|
|
11
|
+
kv;
|
|
12
|
+
constructor(kv) {
|
|
13
|
+
super();
|
|
14
|
+
this.kv = kv;
|
|
15
|
+
}
|
|
16
|
+
async get(key) {
|
|
17
|
+
return await this.kv.get(key);
|
|
18
|
+
}
|
|
19
|
+
async set(key, value) {
|
|
20
|
+
await this.kv.put(key, value);
|
|
21
|
+
}
|
|
22
|
+
async delete(key) {
|
|
23
|
+
await this.kv.delete(key);
|
|
24
|
+
}
|
|
25
|
+
async exists(key) {
|
|
26
|
+
const value = await this.kv.get(key);
|
|
27
|
+
return value !== null;
|
|
28
|
+
}
|
|
29
|
+
async list(prefix) {
|
|
30
|
+
const result = await this.kv.list({ prefix });
|
|
31
|
+
return result.keys.map(k => k.name);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* KV nonce cache provider for Cloudflare Workers
|
|
36
|
+
*/
|
|
37
|
+
export class KVNonceCacheProvider extends NonceCacheProvider {
|
|
38
|
+
kv;
|
|
39
|
+
constructor(kv) {
|
|
40
|
+
super();
|
|
41
|
+
this.kv = kv;
|
|
42
|
+
}
|
|
43
|
+
async has(nonce) {
|
|
44
|
+
const value = await this.kv.get(`nonce:${nonce}`);
|
|
45
|
+
return value !== null;
|
|
46
|
+
}
|
|
47
|
+
async add(nonce, expiresAt) {
|
|
48
|
+
const ttl = Math.max(1, Math.floor((expiresAt - Date.now()) / 1000));
|
|
49
|
+
await this.kv.put(`nonce:${nonce}`, '1', {
|
|
50
|
+
expirationTtl: ttl
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async cleanup() {
|
|
54
|
+
// KV handles expiration automatically
|
|
55
|
+
}
|
|
56
|
+
async destroy() {
|
|
57
|
+
// No cleanup needed
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Workers Clock Provider
|
|
62
|
+
*/
|
|
63
|
+
export class WorkersClockProvider extends ClockProvider {
|
|
64
|
+
now() {
|
|
65
|
+
return Date.now();
|
|
66
|
+
}
|
|
67
|
+
isWithinSkew(timestamp, skewSeconds) {
|
|
68
|
+
const now = this.now();
|
|
69
|
+
const skewMs = skewSeconds * 1000;
|
|
70
|
+
const diff = Math.abs(now - timestamp);
|
|
71
|
+
return diff <= skewMs;
|
|
72
|
+
}
|
|
73
|
+
hasExpired(expiresAt) {
|
|
74
|
+
return this.now() > expiresAt;
|
|
75
|
+
}
|
|
76
|
+
calculateExpiry(ttlSeconds) {
|
|
77
|
+
return this.now() + (ttlSeconds * 1000);
|
|
78
|
+
}
|
|
79
|
+
format(timestamp) {
|
|
80
|
+
return new Date(timestamp).toISOString();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Workers Fetch Provider
|
|
85
|
+
*/
|
|
86
|
+
export class WorkersFetchProvider extends FetchProvider {
|
|
87
|
+
async resolveDID(did) {
|
|
88
|
+
if (did.startsWith('did:key:')) {
|
|
89
|
+
// Offline resolution for did:key
|
|
90
|
+
const publicKeyMultibase = did.slice('did:key:'.length);
|
|
91
|
+
return {
|
|
92
|
+
'@context': ['https://www.w3.org/ns/did/v1'],
|
|
93
|
+
id: did,
|
|
94
|
+
verificationMethod: [{
|
|
95
|
+
id: `${did}#key-1`,
|
|
96
|
+
type: 'Ed25519VerificationKey2020',
|
|
97
|
+
controller: did,
|
|
98
|
+
publicKeyMultibase
|
|
99
|
+
}],
|
|
100
|
+
authentication: [`${did}#key-1`],
|
|
101
|
+
assertionMethod: [`${did}#key-1`]
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (did.startsWith('did:web:')) {
|
|
105
|
+
const domain = did.slice('did:web:'.length).replace(/:/g, '/');
|
|
106
|
+
const url = `https://${domain}/.well-known/did.json`;
|
|
107
|
+
const response = await fetch(url);
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
throw new Error(`Failed to resolve ${did}: ${response.statusText}`);
|
|
110
|
+
}
|
|
111
|
+
return await response.json();
|
|
112
|
+
}
|
|
113
|
+
throw new Error(`Unsupported DID method: ${did}`);
|
|
114
|
+
}
|
|
115
|
+
async fetchStatusList(url) {
|
|
116
|
+
const response = await fetch(url);
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
throw new Error(`Failed to fetch status list: ${response.statusText}`);
|
|
119
|
+
}
|
|
120
|
+
return await response.json();
|
|
121
|
+
}
|
|
122
|
+
async fetchDelegationChain(id) {
|
|
123
|
+
// Would fetch from a delegation registry
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
async fetch(url, options) {
|
|
127
|
+
return await fetch(url, options);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Workers Identity Provider using environment variables
|
|
132
|
+
*/
|
|
133
|
+
export class WorkersIdentityProvider extends IdentityProvider {
|
|
134
|
+
env;
|
|
135
|
+
cryptoProvider;
|
|
136
|
+
constructor(env, cryptoProvider) {
|
|
137
|
+
super();
|
|
138
|
+
this.env = env;
|
|
139
|
+
this.cryptoProvider = cryptoProvider;
|
|
140
|
+
}
|
|
141
|
+
async getIdentity() {
|
|
142
|
+
// Check if identity exists in environment variables
|
|
143
|
+
if (this.env.MCP_IDENTITY_PRIVATE_KEY && this.env.MCP_IDENTITY_PUBLIC_KEY && this.env.MCP_IDENTITY_AGENT_DID) {
|
|
144
|
+
return {
|
|
145
|
+
did: this.env.MCP_IDENTITY_AGENT_DID,
|
|
146
|
+
keyId: `${this.env.MCP_IDENTITY_AGENT_DID}#key-1`,
|
|
147
|
+
privateKey: this.env.MCP_IDENTITY_PRIVATE_KEY,
|
|
148
|
+
publicKey: this.env.MCP_IDENTITY_PUBLIC_KEY,
|
|
149
|
+
createdAt: new Date().toISOString(),
|
|
150
|
+
type: 'production'
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// Generate new identity if not found
|
|
154
|
+
if (!this.cryptoProvider) {
|
|
155
|
+
throw new Error('No identity found and crypto provider not available for generation');
|
|
156
|
+
}
|
|
157
|
+
const keyPair = await this.cryptoProvider.generateKeyPair();
|
|
158
|
+
const did = this.generateDIDFromPublicKey(keyPair.publicKey);
|
|
159
|
+
return {
|
|
160
|
+
did,
|
|
161
|
+
keyId: `${did}#key-1`,
|
|
162
|
+
privateKey: keyPair.privateKey,
|
|
163
|
+
publicKey: keyPair.publicKey,
|
|
164
|
+
createdAt: new Date().toISOString(),
|
|
165
|
+
type: 'development'
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
async saveIdentity(identity) {
|
|
169
|
+
// In Workers, identity is managed through environment variables
|
|
170
|
+
// This would typically be set via wrangler secrets
|
|
171
|
+
console.warn('Identity saving not supported in Workers runtime. Use wrangler secrets instead.');
|
|
172
|
+
}
|
|
173
|
+
async rotateKeys() {
|
|
174
|
+
if (!this.cryptoProvider) {
|
|
175
|
+
throw new Error('Crypto provider required for key rotation');
|
|
176
|
+
}
|
|
177
|
+
const keyPair = await this.cryptoProvider.generateKeyPair();
|
|
178
|
+
const did = this.generateDIDFromPublicKey(keyPair.publicKey);
|
|
179
|
+
return {
|
|
180
|
+
did,
|
|
181
|
+
keyId: `${did}#key-1`,
|
|
182
|
+
privateKey: keyPair.privateKey,
|
|
183
|
+
publicKey: keyPair.publicKey,
|
|
184
|
+
createdAt: new Date().toISOString(),
|
|
185
|
+
type: 'production'
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
async deleteIdentity() {
|
|
189
|
+
console.warn('Identity deletion not supported in Workers runtime');
|
|
190
|
+
}
|
|
191
|
+
generateDIDFromPublicKey(publicKey) {
|
|
192
|
+
// Simplified DID generation
|
|
193
|
+
const keyHash = btoa(publicKey)
|
|
194
|
+
.replace(/\+/g, '-')
|
|
195
|
+
.replace(/\//g, '_')
|
|
196
|
+
.replace(/=/g, '')
|
|
197
|
+
.substring(0, 32);
|
|
198
|
+
return `did:key:z${keyHash}`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/providers/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP-I Runtime for Cloudflare Workers
|
|
3
|
+
*/
|
|
4
|
+
import { MCPIRuntimeBase } from "@kya-os/mcp-i-core/dist/runtime/base";
|
|
5
|
+
import { CloudflareEnv } from "../providers/identity";
|
|
6
|
+
/**
|
|
7
|
+
* Cloudflare Workers environment with required bindings
|
|
8
|
+
*/
|
|
9
|
+
export interface MCPICloudflareEnv extends CloudflareEnv {
|
|
10
|
+
NONCE_CACHE: KVNamespace;
|
|
11
|
+
STORAGE_KV?: KVNamespace;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* MCP-I Runtime for Cloudflare Workers
|
|
15
|
+
*/
|
|
16
|
+
export declare class MCPICloudflareRuntime extends MCPIRuntimeBase {
|
|
17
|
+
constructor(env: MCPICloudflareEnv);
|
|
18
|
+
/**
|
|
19
|
+
* Override session ID generation to use Web Crypto
|
|
20
|
+
*/
|
|
21
|
+
protected generateSessionId(): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Override nonce generation to use Web Crypto
|
|
24
|
+
*/
|
|
25
|
+
protected generateNonce(): Promise<string>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create MCP-I server for Cloudflare Workers
|
|
29
|
+
*/
|
|
30
|
+
export declare function createMCPIServer(env: MCPICloudflareEnv): MCPICloudflareRuntime;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAGvE,OAAO,EAA0B,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA8B9E;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IAEtD,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;gBAC5C,GAAG,EAAE,iBAAiB;IAgBlC;;OAEG;cACa,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpD;;OAEG;cACa,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAIjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,yBAEtD"}
|