@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/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * @kya-os/mcp-i - Ultra-light MCP Identity auto-registration
3
+ * @kya-os/mcp-i - Ultra-light MCP Identity auto-registration with challenge-response authentication
4
4
  *
5
5
  * Enable any MCP server to get a verifiable identity with just 2 lines of code:
6
6
  *
@@ -9,7 +9,7 @@
9
9
  * const identity = await MCPIdentity.init();
10
10
  * ```
11
11
  *
12
- * Zero dependencies on other @kya-os packages - completely standalone!
12
+ * Now with full MCP-I Handshake support including cryptographic challenge-response!
13
13
  */
14
14
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
15
  if (k2 === undefined) k2 = k;
@@ -44,6 +44,9 @@ var __importStar = (this && this.__importStar) || (function () {
44
44
  return result;
45
45
  };
46
46
  })();
47
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
48
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
49
+ };
47
50
  var __importDefault = (this && this.__importDefault) || function (mod) {
48
51
  return (mod && mod.__esModule) ? mod : { "default": mod };
49
52
  };
@@ -52,11 +55,21 @@ exports.MCPIdentity = void 0;
52
55
  const axios_1 = __importDefault(require("axios"));
53
56
  const fs = __importStar(require("fs"));
54
57
  const path = __importStar(require("path"));
58
+ const crypto = __importStar(require("./crypto"));
59
+ // Re-export types for convenience
60
+ __exportStar(require("./types"), exports);
55
61
  class MCPIdentity {
56
- constructor(identity) {
62
+ constructor(identity, options = {}) {
63
+ this.usedNonces = new Set();
57
64
  this.did = identity.did;
58
65
  this.publicKey = identity.publicKey;
59
66
  this.privateKey = identity.privateKey;
67
+ this.timestampTolerance = options.timestampTolerance || 60000; // 60 seconds
68
+ this.enableNonceTracking = options.enableNonceTracking !== false;
69
+ // Start nonce cleanup if tracking is enabled
70
+ if (this.enableNonceTracking) {
71
+ this.startNonceCleanup();
72
+ }
60
73
  }
61
74
  /**
62
75
  * Initialize MCP Identity - the main entry point
@@ -88,50 +101,147 @@ class MCPIdentity {
88
101
  agentSlug: response.agent.slug,
89
102
  registeredAt: new Date().toISOString(),
90
103
  };
104
+ // If no private key was provided, generate one
105
+ if (!identity.privateKey) {
106
+ console.log('[MCP-I] Generating cryptographic keys...');
107
+ const keyPair = await crypto.generateKeyPair();
108
+ identity.publicKey = keyPair.publicKey;
109
+ identity.privateKey = keyPair.privateKey;
110
+ }
91
111
  // Save for future use
92
112
  await saveIdentity(identity, options?.persistencePath);
93
113
  console.log('[MCP-I] ✅ Success! Your agent has been registered.');
94
114
  console.log(`[MCP-I] DID: ${response.did}`);
95
115
  console.log(`[MCP-I] Profile: ${response.agent.url}`);
96
116
  }
97
- return new MCPIdentity(identity);
117
+ return new MCPIdentity(identity, options);
98
118
  }
99
119
  /**
100
- * Sign a message with the agent's private key
120
+ * Sign a message with the agent's private key using Ed25519
101
121
  */
102
122
  async sign(message) {
103
- // Simple signature for demo - in production use proper crypto
104
- return Buffer.from(`${this.privateKey}:${message}`).toString('base64');
123
+ return crypto.sign(message, this.privateKey);
105
124
  }
106
125
  /**
107
- * Get MCP-I capabilities
126
+ * Verify a signature against a public key
127
+ */
128
+ async verify(message, signature, publicKey) {
129
+ return crypto.verify(message, signature, publicKey || this.publicKey);
130
+ }
131
+ /**
132
+ * Respond to an MCP-I challenge
133
+ * This is the core of the challenge-response authentication system
134
+ */
135
+ async respondToChallenge(challenge) {
136
+ // Validate timestamp to prevent replay attacks
137
+ const now = Date.now();
138
+ const challengeAge = now - challenge.timestamp;
139
+ if (challengeAge > this.timestampTolerance) {
140
+ throw new Error('Challenge expired');
141
+ }
142
+ if (challengeAge < 0) {
143
+ throw new Error('Challenge timestamp is in the future');
144
+ }
145
+ // Check for nonce reuse if tracking is enabled
146
+ if (this.enableNonceTracking) {
147
+ if (this.usedNonces.has(challenge.nonce)) {
148
+ throw new Error('Nonce already used');
149
+ }
150
+ this.usedNonces.add(challenge.nonce);
151
+ }
152
+ // Create the message to sign
153
+ const messageComponents = [
154
+ challenge.nonce,
155
+ challenge.timestamp.toString(),
156
+ this.did,
157
+ challenge.verifier_did || '',
158
+ (challenge.scope || []).join(',')
159
+ ];
160
+ const message = messageComponents.join(':');
161
+ // Sign the challenge
162
+ const signature = await this.sign(message);
163
+ // Return the response
164
+ return {
165
+ did: this.did,
166
+ signature,
167
+ timestamp: now,
168
+ nonce: challenge.nonce,
169
+ publicKey: this.publicKey
170
+ };
171
+ }
172
+ /**
173
+ * Get MCP-I capabilities for advertisement
108
174
  */
109
175
  getCapabilities() {
110
176
  return {
111
177
  version: '1.0',
112
178
  did: this.did,
113
179
  publicKey: this.publicKey,
114
- conformanceLevel: 1
180
+ conformanceLevel: 2, // Level 2: Full crypto with challenge-response
181
+ handshakeSupported: true,
182
+ handshakeEndpoint: '/_mcp-i/handshake',
183
+ verificationEndpoint: `https://knowthat.ai/api/agents/${this.did}/verify`
115
184
  };
116
185
  }
117
186
  /**
118
- * Sign an MCP response
187
+ * Sign an MCP response with identity metadata
119
188
  */
120
- signResponse(response) {
121
- return {
189
+ async signResponse(response) {
190
+ const timestamp = new Date().toISOString();
191
+ const responseWithIdentity = {
122
192
  ...response,
123
193
  _mcp_identity: {
124
194
  did: this.did,
125
- signature: this.sign(JSON.stringify(response)),
126
- timestamp: new Date().toISOString()
195
+ signature: '', // Will be filled below
196
+ timestamp,
197
+ conformanceLevel: 2
127
198
  }
128
199
  };
200
+ // Sign the response content (excluding the signature field)
201
+ const contentToSign = JSON.stringify({
202
+ ...response,
203
+ _mcp_identity: {
204
+ did: this.did,
205
+ timestamp,
206
+ conformanceLevel: 2
207
+ }
208
+ });
209
+ responseWithIdentity._mcp_identity.signature = await this.sign(contentToSign);
210
+ return responseWithIdentity;
211
+ }
212
+ /**
213
+ * Generate a new nonce for challenges
214
+ */
215
+ static generateNonce() {
216
+ return crypto.generateNonce();
217
+ }
218
+ /**
219
+ * Clean up old nonces periodically to prevent memory leaks
220
+ */
221
+ startNonceCleanup() {
222
+ // Clean up nonces older than 2x the timestamp tolerance
223
+ this.nonceCleanupInterval = setInterval(() => {
224
+ // In a production system, you'd track nonce timestamps
225
+ // For now, we'll clear all nonces periodically
226
+ if (this.usedNonces.size > 10000) {
227
+ this.usedNonces.clear();
228
+ }
229
+ }, this.timestampTolerance * 2);
230
+ }
231
+ /**
232
+ * Clean up resources
233
+ */
234
+ destroy() {
235
+ if (this.nonceCleanupInterval) {
236
+ clearInterval(this.nonceCleanupInterval);
237
+ }
238
+ this.usedNonces.clear();
129
239
  }
130
240
  }
131
241
  exports.MCPIdentity = MCPIdentity;
132
242
  // Helper functions (inline to keep package standalone)
133
243
  async function loadIdentity(customPath) {
134
- // Check environment variables first
244
+ // Check environment variables first (already loaded by process)
135
245
  if (process.env.AGENT_DID && process.env.AGENT_PUBLIC_KEY && process.env.AGENT_PRIVATE_KEY) {
136
246
  return {
137
247
  did: process.env.AGENT_DID,
@@ -142,7 +252,7 @@ async function loadIdentity(customPath) {
142
252
  registeredAt: new Date().toISOString()
143
253
  };
144
254
  }
145
- // Check file
255
+ // Check JSON file (most reliable for programmatic access)
146
256
  const filePath = customPath || path.join(process.cwd(), '.mcp-identity.json');
147
257
  try {
148
258
  if (fs.existsSync(filePath)) {
@@ -153,10 +263,13 @@ async function loadIdentity(customPath) {
153
263
  catch {
154
264
  // Ignore errors
155
265
  }
266
+ // Note: We don't manually load .env or .env.local files here
267
+ // because that should be handled by the application's environment
268
+ // loading strategy (dotenv, framework, etc.)
156
269
  return null;
157
270
  }
158
271
  async function saveIdentity(identity, customPath) {
159
- // Save to .env.local
272
+ // Save to .env (standard) and .env.local (for frameworks)
160
273
  const envContent = `
161
274
  # MCP-I Identity (auto-generated)
162
275
  AGENT_DID="${identity.did}"
@@ -165,11 +278,16 @@ AGENT_PRIVATE_KEY="${identity.privateKey}"
165
278
  AGENT_ID="${identity.agentId}"
166
279
  AGENT_SLUG="${identity.agentSlug}"
167
280
  `;
168
- const envPath = path.join(process.cwd(), '.env.local');
281
+ // Save to .env for standard Node.js compatibility
282
+ const envPath = path.join(process.cwd(), '.env');
169
283
  fs.writeFileSync(envPath, envContent.trim());
170
- // Also save as JSON
284
+ // Also save to .env.local for framework compatibility (Next.js, Vite, etc.)
285
+ const envLocalPath = path.join(process.cwd(), '.env.local');
286
+ fs.writeFileSync(envLocalPath, envContent.trim());
287
+ // Also save as JSON for programmatic access
171
288
  const filePath = customPath || path.join(process.cwd(), '.mcp-identity.json');
172
289
  fs.writeFileSync(filePath, JSON.stringify(identity, null, 2));
290
+ console.log('[MCP-I] Identity saved to .env, .env.local, and .mcp-identity.json');
173
291
  }
174
292
  async function autoRegister(options) {
175
293
  try {
@@ -181,7 +299,7 @@ async function autoRegister(options) {
181
299
  version: '1.0.0'
182
300
  },
183
301
  clientInfo: {
184
- sdkVersion: '0.1.0',
302
+ sdkVersion: '0.2.0', // Updated version
185
303
  language: 'typescript',
186
304
  platform: 'node' // Always node for MCP servers
187
305
  }
@@ -189,7 +307,7 @@ async function autoRegister(options) {
189
307
  timeout: 30000,
190
308
  headers: {
191
309
  'Content-Type': 'application/json',
192
- 'User-Agent': '@kya-os/mcp-i/0.1.0'
310
+ 'User-Agent': '@kya-os/mcp-i/0.2.0'
193
311
  }
194
312
  });
195
313
  return response.data;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Type definitions for MCP-I challenge-response authentication
3
+ */
4
+ export interface MCPIdentityOptions {
5
+ name?: string;
6
+ description?: string;
7
+ repository?: string;
8
+ apiEndpoint?: string;
9
+ persistencePath?: string;
10
+ timestampTolerance?: number;
11
+ enableNonceTracking?: boolean;
12
+ }
13
+ export interface AutoRegisterResponse {
14
+ success: boolean;
15
+ did: string;
16
+ agent: {
17
+ id: string;
18
+ slug: string;
19
+ name: string;
20
+ url: string;
21
+ };
22
+ keys: {
23
+ publicKey: string;
24
+ privateKey?: string;
25
+ };
26
+ }
27
+ export interface PersistedIdentity {
28
+ did: string;
29
+ publicKey: string;
30
+ privateKey: string;
31
+ agentId: string;
32
+ agentSlug: string;
33
+ registeredAt: string;
34
+ }
35
+ /**
36
+ * MCP-I Challenge structure
37
+ */
38
+ export interface Challenge {
39
+ nonce: string;
40
+ timestamp: number;
41
+ verifier_did?: string;
42
+ scope?: string[];
43
+ }
44
+ /**
45
+ * MCP-I Challenge Response structure
46
+ */
47
+ export interface ChallengeResponse {
48
+ did: string;
49
+ signature: string;
50
+ timestamp: number;
51
+ nonce: string;
52
+ publicKey?: string;
53
+ }
54
+ /**
55
+ * MCP-I Capabilities advertisement
56
+ */
57
+ export interface MCPICapabilities {
58
+ version: string;
59
+ did: string;
60
+ publicKey: string;
61
+ conformanceLevel: number;
62
+ handshakeSupported: boolean;
63
+ handshakeEndpoint?: string;
64
+ verificationEndpoint?: string;
65
+ }
66
+ /**
67
+ * Response with MCP-I identity attached
68
+ */
69
+ export interface SignedResponse<T = any> {
70
+ [key: string]: any;
71
+ _mcp_identity: {
72
+ did: string;
73
+ signature: string;
74
+ timestamp: string;
75
+ conformanceLevel?: number;
76
+ };
77
+ }
78
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,GAAG;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,aAAa,EAAE;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for MCP-I challenge-response authentication
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kya-os/mcp-i",
3
- "version": "0.1.0-alpha.1.0",
3
+ "version": "0.1.0-alpha.2.0",
4
4
  "description": "Ultra-light MCP Identity auto-registration - 2 lines to agent identity",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -11,7 +11,9 @@
11
11
  ],
12
12
  "scripts": {
13
13
  "build": "tsc",
14
- "test": "jest",
14
+ "test": "vitest",
15
+ "test:watch": "vitest watch",
16
+ "test:coverage": "vitest run --coverage",
15
17
  "prepublishOnly": "npm run build"
16
18
  },
17
19
  "keywords": [
@@ -25,13 +27,14 @@
25
27
  "author": "Dylan Hobbs <dylan@vouched.id>",
26
28
  "license": "MIT",
27
29
  "dependencies": {
30
+ "@noble/ed25519": "^2.1.0",
28
31
  "axios": "^1.6.7"
29
32
  },
30
33
  "devDependencies": {
31
34
  "@types/node": "^20.0.0",
35
+ "@vitest/coverage-v8": "^2.0.0",
32
36
  "typescript": "^5.0.0",
33
- "jest": "^29.0.0",
34
- "@types/jest": "^29.0.0"
37
+ "vitest": "^2.0.0"
35
38
  },
36
39
  "engines": {
37
40
  "node": ">=14.0.0"