@kya-os/mcp-i 0.1.0-alpha.1.0 → 0.1.0-alpha.2.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 +158 -62
- package/dist/__tests__/challenge-response.test.d.ts +5 -0
- package/dist/__tests__/challenge-response.test.d.ts.map +1 -0
- package/dist/__tests__/challenge-response.test.js +217 -0
- package/dist/__tests__/challenge-response.test.js.map +1 -0
- package/dist/__tests__/crypto.test.d.ts +5 -0
- package/dist/__tests__/crypto.test.d.ts.map +1 -0
- package/dist/__tests__/crypto.test.js +153 -0
- package/dist/__tests__/crypto.test.js.map +1 -0
- package/dist/crypto.d.ts +32 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +117 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +35 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +139 -21
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for cryptographic utilities
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const vitest_1 = require("vitest");
|
|
40
|
+
const crypto = __importStar(require("../crypto"));
|
|
41
|
+
(0, vitest_1.describe)('Cryptographic Utilities', () => {
|
|
42
|
+
(0, vitest_1.describe)('generateKeyPair', () => {
|
|
43
|
+
(0, vitest_1.it)('should generate a valid Ed25519 key pair', async () => {
|
|
44
|
+
const keyPair = await crypto.generateKeyPair();
|
|
45
|
+
(0, vitest_1.expect)(keyPair.publicKey).toBeDefined();
|
|
46
|
+
(0, vitest_1.expect)(keyPair.privateKey).toBeDefined();
|
|
47
|
+
(0, vitest_1.expect)(Buffer.from(keyPair.publicKey, 'base64')).toHaveLength(32);
|
|
48
|
+
(0, vitest_1.expect)(Buffer.from(keyPair.privateKey, 'base64')).toHaveLength(32);
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)('should generate different key pairs each time', async () => {
|
|
51
|
+
const keyPair1 = await crypto.generateKeyPair();
|
|
52
|
+
const keyPair2 = await crypto.generateKeyPair();
|
|
53
|
+
(0, vitest_1.expect)(keyPair1.publicKey).not.toEqual(keyPair2.publicKey);
|
|
54
|
+
(0, vitest_1.expect)(keyPair1.privateKey).not.toEqual(keyPair2.privateKey);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.describe)('sign and verify', () => {
|
|
58
|
+
let keyPair;
|
|
59
|
+
(0, vitest_1.beforeEach)(async () => {
|
|
60
|
+
keyPair = await crypto.generateKeyPair();
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)('should sign and verify a string message', async () => {
|
|
63
|
+
const message = 'Hello, MCP-I!';
|
|
64
|
+
const signature = await crypto.sign(message, keyPair.privateKey);
|
|
65
|
+
(0, vitest_1.expect)(signature).toBeDefined();
|
|
66
|
+
(0, vitest_1.expect)(typeof signature).toBe('string');
|
|
67
|
+
const isValid = await crypto.verify(message, signature, keyPair.publicKey);
|
|
68
|
+
(0, vitest_1.expect)(isValid).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.it)('should sign and verify a buffer message', async () => {
|
|
71
|
+
const message = Buffer.from('Binary data test');
|
|
72
|
+
const signature = await crypto.sign(message, keyPair.privateKey);
|
|
73
|
+
const isValid = await crypto.verify(message, signature, keyPair.publicKey);
|
|
74
|
+
(0, vitest_1.expect)(isValid).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)('should fail verification with wrong message', async () => {
|
|
77
|
+
const message = 'Original message';
|
|
78
|
+
const signature = await crypto.sign(message, keyPair.privateKey);
|
|
79
|
+
const isValid = await crypto.verify('Different message', signature, keyPair.publicKey);
|
|
80
|
+
(0, vitest_1.expect)(isValid).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)('should fail verification with wrong public key', async () => {
|
|
83
|
+
const message = 'Test message';
|
|
84
|
+
const signature = await crypto.sign(message, keyPair.privateKey);
|
|
85
|
+
const otherKeyPair = await crypto.generateKeyPair();
|
|
86
|
+
const isValid = await crypto.verify(message, signature, otherKeyPair.publicKey);
|
|
87
|
+
(0, vitest_1.expect)(isValid).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
(0, vitest_1.it)('should fail verification with invalid signature', async () => {
|
|
90
|
+
const message = 'Test message';
|
|
91
|
+
const invalidSignature = 'invalid-base64-signature';
|
|
92
|
+
const isValid = await crypto.verify(message, invalidSignature, keyPair.publicKey);
|
|
93
|
+
(0, vitest_1.expect)(isValid).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
(0, vitest_1.describe)('generateNonce', () => {
|
|
97
|
+
(0, vitest_1.it)('should generate a nonce of default length', () => {
|
|
98
|
+
const nonce = crypto.generateNonce();
|
|
99
|
+
(0, vitest_1.expect)(nonce).toBeDefined();
|
|
100
|
+
(0, vitest_1.expect)(nonce).toHaveLength(64); // 32 bytes = 64 hex chars
|
|
101
|
+
});
|
|
102
|
+
(0, vitest_1.it)('should generate a nonce of specified length', () => {
|
|
103
|
+
const nonce = crypto.generateNonce(16);
|
|
104
|
+
(0, vitest_1.expect)(nonce).toHaveLength(32); // 16 bytes = 32 hex chars
|
|
105
|
+
});
|
|
106
|
+
(0, vitest_1.it)('should generate different nonces each time', () => {
|
|
107
|
+
const nonce1 = crypto.generateNonce();
|
|
108
|
+
const nonce2 = crypto.generateNonce();
|
|
109
|
+
(0, vitest_1.expect)(nonce1).not.toEqual(nonce2);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.describe)('constantTimeEqual', () => {
|
|
113
|
+
(0, vitest_1.it)('should return true for equal strings', () => {
|
|
114
|
+
const result = crypto.constantTimeEqual('hello', 'hello');
|
|
115
|
+
(0, vitest_1.expect)(result).toBe(true);
|
|
116
|
+
});
|
|
117
|
+
(0, vitest_1.it)('should return false for different strings', () => {
|
|
118
|
+
const result = crypto.constantTimeEqual('hello', 'world');
|
|
119
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
120
|
+
});
|
|
121
|
+
(0, vitest_1.it)('should return false for different length strings', () => {
|
|
122
|
+
const result = crypto.constantTimeEqual('hello', 'hello world');
|
|
123
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
124
|
+
});
|
|
125
|
+
(0, vitest_1.it)('should handle empty strings', () => {
|
|
126
|
+
const result = crypto.constantTimeEqual('', '');
|
|
127
|
+
(0, vitest_1.expect)(result).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
(0, vitest_1.describe)('publicKeyToDid', () => {
|
|
131
|
+
(0, vitest_1.it)('should convert Ed25519 public key to did:key format', async () => {
|
|
132
|
+
const keyPair = await crypto.generateKeyPair();
|
|
133
|
+
const did = crypto.publicKeyToDid(keyPair.publicKey);
|
|
134
|
+
// Our simplified implementation uses base64url-like encoding
|
|
135
|
+
(0, vitest_1.expect)(did).toMatch(/^did:key:z[A-Za-z0-9_-]+$/);
|
|
136
|
+
(0, vitest_1.expect)(did).toContain('did:key:z');
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)('should generate consistent DIDs for the same public key', async () => {
|
|
139
|
+
const keyPair = await crypto.generateKeyPair();
|
|
140
|
+
const did1 = crypto.publicKeyToDid(keyPair.publicKey);
|
|
141
|
+
const did2 = crypto.publicKeyToDid(keyPair.publicKey);
|
|
142
|
+
(0, vitest_1.expect)(did1).toEqual(did2);
|
|
143
|
+
});
|
|
144
|
+
(0, vitest_1.it)('should generate different DIDs for different public keys', async () => {
|
|
145
|
+
const keyPair1 = await crypto.generateKeyPair();
|
|
146
|
+
const keyPair2 = await crypto.generateKeyPair();
|
|
147
|
+
const did1 = crypto.publicKeyToDid(keyPair1.publicKey);
|
|
148
|
+
const did2 = crypto.publicKeyToDid(keyPair2.publicKey);
|
|
149
|
+
(0, vitest_1.expect)(did1).not.toEqual(did2);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=crypto.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.test.js","sourceRoot":"","sources":["../../src/__tests__/crypto.test.ts"],"names":[],"mappings":"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"}
|
package/dist/crypto.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cryptographic utilities for MCP-I
|
|
3
|
+
* Implements Ed25519 signing and verification for challenge-response authentication
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generate a new Ed25519 key pair
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateKeyPair(): Promise<{
|
|
9
|
+
publicKey: string;
|
|
10
|
+
privateKey: string;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Sign a message with Ed25519
|
|
14
|
+
*/
|
|
15
|
+
export declare function sign(message: string | Buffer, privateKeyBase64: string): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Verify an Ed25519 signature
|
|
18
|
+
*/
|
|
19
|
+
export declare function verify(message: string | Buffer, signatureBase64: string, publicKeyBase64: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Generate a cryptographically secure nonce
|
|
22
|
+
*/
|
|
23
|
+
export declare function generateNonce(length?: number): string;
|
|
24
|
+
/**
|
|
25
|
+
* Constant-time string comparison to prevent timing attacks
|
|
26
|
+
*/
|
|
27
|
+
export declare function constantTimeEqual(a: string, b: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Convert Ed25519 public key to did:key format
|
|
30
|
+
*/
|
|
31
|
+
export declare function publicKeyToDid(publicKeyBase64: string): string;
|
|
32
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAQD;AAED;;GAEG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAW/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAS9D"}
|
package/dist/crypto.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cryptographic utilities for MCP-I
|
|
4
|
+
* Implements Ed25519 signing and verification for challenge-response authentication
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.generateKeyPair = generateKeyPair;
|
|
41
|
+
exports.sign = sign;
|
|
42
|
+
exports.verify = verify;
|
|
43
|
+
exports.generateNonce = generateNonce;
|
|
44
|
+
exports.constantTimeEqual = constantTimeEqual;
|
|
45
|
+
exports.publicKeyToDid = publicKeyToDid;
|
|
46
|
+
const ed25519 = __importStar(require("@noble/ed25519"));
|
|
47
|
+
const crypto_1 = require("crypto");
|
|
48
|
+
/**
|
|
49
|
+
* Generate a new Ed25519 key pair
|
|
50
|
+
*/
|
|
51
|
+
async function generateKeyPair() {
|
|
52
|
+
const privateKey = ed25519.utils.randomPrivateKey();
|
|
53
|
+
const publicKey = await ed25519.getPublicKeyAsync(privateKey);
|
|
54
|
+
return {
|
|
55
|
+
publicKey: Buffer.from(publicKey).toString('base64'),
|
|
56
|
+
privateKey: Buffer.from(privateKey).toString('base64')
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Sign a message with Ed25519
|
|
61
|
+
*/
|
|
62
|
+
async function sign(message, privateKeyBase64) {
|
|
63
|
+
const messageBuffer = typeof message === 'string'
|
|
64
|
+
? Buffer.from(message, 'utf-8')
|
|
65
|
+
: message;
|
|
66
|
+
const privateKey = Buffer.from(privateKeyBase64, 'base64');
|
|
67
|
+
const signature = await ed25519.signAsync(messageBuffer, privateKey);
|
|
68
|
+
return Buffer.from(signature).toString('base64');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Verify an Ed25519 signature
|
|
72
|
+
*/
|
|
73
|
+
async function verify(message, signatureBase64, publicKeyBase64) {
|
|
74
|
+
try {
|
|
75
|
+
const messageBuffer = typeof message === 'string'
|
|
76
|
+
? Buffer.from(message, 'utf-8')
|
|
77
|
+
: message;
|
|
78
|
+
const signature = Buffer.from(signatureBase64, 'base64');
|
|
79
|
+
const publicKey = Buffer.from(publicKeyBase64, 'base64');
|
|
80
|
+
return await ed25519.verifyAsync(signature, messageBuffer, publicKey);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Generate a cryptographically secure nonce
|
|
88
|
+
*/
|
|
89
|
+
function generateNonce(length = 32) {
|
|
90
|
+
return (0, crypto_1.randomBytes)(length).toString('hex');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Constant-time string comparison to prevent timing attacks
|
|
94
|
+
*/
|
|
95
|
+
function constantTimeEqual(a, b) {
|
|
96
|
+
if (a.length !== b.length) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
let result = 0;
|
|
100
|
+
for (let i = 0; i < a.length; i++) {
|
|
101
|
+
result |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
102
|
+
}
|
|
103
|
+
return result === 0;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Convert Ed25519 public key to did:key format
|
|
107
|
+
*/
|
|
108
|
+
function publicKeyToDid(publicKeyBase64) {
|
|
109
|
+
const publicKey = Buffer.from(publicKeyBase64, 'base64');
|
|
110
|
+
// Multicodec ed25519-pub header (0xed 0x01)
|
|
111
|
+
const multicodec = Buffer.from([0xed, 0x01]);
|
|
112
|
+
const multikey = Buffer.concat([multicodec, publicKey]);
|
|
113
|
+
// Base58 encode (simplified - in production use a proper base58 library)
|
|
114
|
+
// For now, just return a placeholder
|
|
115
|
+
return `did:key:z${multikey.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '')}`;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @kya-os/mcp-i - Ultra-light MCP Identity auto-registration
|
|
2
|
+
* @kya-os/mcp-i - Ultra-light MCP Identity auto-registration with challenge-response authentication
|
|
3
3
|
*
|
|
4
4
|
* Enable any MCP server to get a verifiable identity with just 2 lines of code:
|
|
5
5
|
*
|
|
@@ -8,19 +8,18 @@
|
|
|
8
8
|
* const identity = await MCPIdentity.init();
|
|
9
9
|
* ```
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* Now with full MCP-I Handshake support including cryptographic challenge-response!
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
description?: string;
|
|
16
|
-
repository?: string;
|
|
17
|
-
apiEndpoint?: string;
|
|
18
|
-
persistencePath?: string;
|
|
19
|
-
}
|
|
13
|
+
import { MCPIdentityOptions, Challenge, ChallengeResponse, MCPICapabilities, SignedResponse } from './types';
|
|
14
|
+
export * from './types';
|
|
20
15
|
export declare class MCPIdentity {
|
|
21
16
|
readonly did: string;
|
|
22
17
|
readonly publicKey: string;
|
|
23
18
|
private privateKey;
|
|
19
|
+
private timestampTolerance;
|
|
20
|
+
private enableNonceTracking;
|
|
21
|
+
private usedNonces;
|
|
22
|
+
private nonceCleanupInterval?;
|
|
24
23
|
private constructor();
|
|
25
24
|
/**
|
|
26
25
|
* Initialize MCP Identity - the main entry point
|
|
@@ -33,22 +32,37 @@ export declare class MCPIdentity {
|
|
|
33
32
|
*/
|
|
34
33
|
static init(options?: MCPIdentityOptions): Promise<MCPIdentity>;
|
|
35
34
|
/**
|
|
36
|
-
* Sign a message with the agent's private key
|
|
35
|
+
* Sign a message with the agent's private key using Ed25519
|
|
36
|
+
*/
|
|
37
|
+
sign(message: string | Buffer): Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Verify a signature against a public key
|
|
40
|
+
*/
|
|
41
|
+
verify(message: string | Buffer, signature: string, publicKey?: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Respond to an MCP-I challenge
|
|
44
|
+
* This is the core of the challenge-response authentication system
|
|
45
|
+
*/
|
|
46
|
+
respondToChallenge(challenge: Challenge): Promise<ChallengeResponse>;
|
|
47
|
+
/**
|
|
48
|
+
* Get MCP-I capabilities for advertisement
|
|
49
|
+
*/
|
|
50
|
+
getCapabilities(): MCPICapabilities;
|
|
51
|
+
/**
|
|
52
|
+
* Sign an MCP response with identity metadata
|
|
53
|
+
*/
|
|
54
|
+
signResponse<T = any>(response: T): Promise<SignedResponse<T>>;
|
|
55
|
+
/**
|
|
56
|
+
* Generate a new nonce for challenges
|
|
37
57
|
*/
|
|
38
|
-
|
|
58
|
+
static generateNonce(): string;
|
|
39
59
|
/**
|
|
40
|
-
*
|
|
60
|
+
* Clean up old nonces periodically to prevent memory leaks
|
|
41
61
|
*/
|
|
42
|
-
|
|
43
|
-
version: string;
|
|
44
|
-
did: string;
|
|
45
|
-
publicKey: string;
|
|
46
|
-
conformanceLevel: number;
|
|
47
|
-
};
|
|
62
|
+
private startNonceCleanup;
|
|
48
63
|
/**
|
|
49
|
-
*
|
|
64
|
+
* Clean up resources
|
|
50
65
|
*/
|
|
51
|
-
|
|
66
|
+
destroy(): void;
|
|
52
67
|
}
|
|
53
|
-
export {};
|
|
54
68
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EACL,kBAAkB,EAGlB,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAGjB,cAAc,SAAS,CAAC;AAExB,qBAAa,WAAW;IACtB,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,mBAAmB,CAAU;IACrC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAE9C,OAAO;IAgBP;;;;;;;;OAQG;WACU,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CrE;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD;;OAEG;IACG,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAQnB;;;OAGG;IACG,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4C1E;;OAEG;IACH,eAAe,IAAI,gBAAgB;IAYnC;;OAEG;IACG,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IA2BpE;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM;IAI9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO;CAMR"}
|