@kya-os/create-mcpi-app 1.7.42-canary.36 ā 1.7.42-canary.37
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/.turbo/turbo-build.log +1 -1
- package/dist/helpers/fetch-cloudflare-mcpi-template.d.ts +10 -2
- package/dist/helpers/fetch-cloudflare-mcpi-template.d.ts.map +1 -1
- package/dist/helpers/fetch-cloudflare-mcpi-template.js +153 -39
- package/dist/helpers/fetch-cloudflare-mcpi-template.js.map +1 -1
- package/package.json +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @kya-os/create-mcpi-app@1.7.42-canary.
|
|
2
|
+
> @kya-os/create-mcpi-app@1.7.42-canary.37 build /Users/dylanhobbs/Documents/@kya-os/xmcp-i/packages/create-mcpi-app
|
|
3
3
|
> tsc && chmod +x dist/index.js
|
|
4
4
|
|
|
@@ -7,8 +7,16 @@ interface CloudflareTemplateOptions {
|
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Fetches the Cloudflare MCP-I template
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
*
|
|
11
|
+
* Generates a robust project structure:
|
|
12
|
+
* - package.json
|
|
13
|
+
* - wrangler.toml (with public keys)
|
|
14
|
+
* - .dev.vars (with private keys)
|
|
15
|
+
* - src/index.ts
|
|
16
|
+
* - src/agent.ts
|
|
17
|
+
* - src/tools/greet.ts
|
|
18
|
+
* - src/mcpi-runtime-config.ts
|
|
19
|
+
* - scripts/setup.js (for key regeneration)
|
|
12
20
|
*/
|
|
13
21
|
export declare function fetchCloudflareMcpiTemplate(targetDir: string, options: CloudflareTemplateOptions | string): Promise<void>;
|
|
14
22
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-cloudflare-mcpi-template.d.ts","sourceRoot":"","sources":["../../src/helpers/fetch-cloudflare-mcpi-template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch-cloudflare-mcpi-template.d.ts","sourceRoot":"","sources":["../../src/helpers/fetch-cloudflare-mcpi-template.ts"],"names":[],"mappings":"AAKA,UAAU,yBAAyB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,yBAAyB,GAAG,MAAM,GAC1C,OAAO,CAAC,IAAI,CAAC,CA4Rf"}
|
|
@@ -1,18 +1,31 @@
|
|
|
1
1
|
import fs from "fs-extra";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
+
import { generateIdentity } from "./generate-identity";
|
|
4
5
|
/**
|
|
5
6
|
* Fetches the Cloudflare MCP-I template
|
|
6
|
-
*
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
|
+
* Generates a robust project structure:
|
|
9
|
+
* - package.json
|
|
10
|
+
* - wrangler.toml (with public keys)
|
|
11
|
+
* - .dev.vars (with private keys)
|
|
12
|
+
* - src/index.ts
|
|
13
|
+
* - src/agent.ts
|
|
14
|
+
* - src/tools/greet.ts
|
|
15
|
+
* - src/mcpi-runtime-config.ts
|
|
16
|
+
* - scripts/setup.js (for key regeneration)
|
|
8
17
|
*/
|
|
9
18
|
export async function fetchCloudflareMcpiTemplate(targetDir, options) {
|
|
10
|
-
// Handle legacy string argument (projectName) for backward compatibility
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
19
|
+
// Handle legacy string argument (projectName) for backward compatibility
|
|
20
|
+
const opts = typeof options === 'string'
|
|
21
|
+
? { packageManager: 'npm', projectName: options }
|
|
22
|
+
: options;
|
|
23
|
+
const { projectName, apikey, projectId } = opts;
|
|
24
|
+
console.log(chalk.blue(`\nšļø Generating Cloudflare MCP-I project: ${projectName}...`));
|
|
14
25
|
// 1. Create directory structure
|
|
15
26
|
await fs.ensureDir(path.join(targetDir, "src"));
|
|
27
|
+
await fs.ensureDir(path.join(targetDir, "src/tools"));
|
|
28
|
+
await fs.ensureDir(path.join(targetDir, "scripts"));
|
|
16
29
|
// 2. Create package.json
|
|
17
30
|
const packageJson = {
|
|
18
31
|
name: projectName,
|
|
@@ -23,7 +36,9 @@ export async function fetchCloudflareMcpiTemplate(targetDir, options) {
|
|
|
23
36
|
dev: "wrangler dev",
|
|
24
37
|
start: "wrangler dev",
|
|
25
38
|
test: "vitest",
|
|
26
|
-
"cf-typegen": "wrangler types"
|
|
39
|
+
"cf-typegen": "wrangler types",
|
|
40
|
+
"kv:create-nonce": "wrangler kv:namespace create NONCE_CACHE",
|
|
41
|
+
"setup": "node scripts/setup.js"
|
|
27
42
|
},
|
|
28
43
|
dependencies: {
|
|
29
44
|
"@kya-os/mcp-i-cloudflare": "^1.5.8-canary.47",
|
|
@@ -42,7 +57,21 @@ export async function fetchCloudflareMcpiTemplate(targetDir, options) {
|
|
|
42
57
|
await fs.writeJson(path.join(targetDir, "package.json"), packageJson, {
|
|
43
58
|
spaces: 2,
|
|
44
59
|
});
|
|
45
|
-
// 3.
|
|
60
|
+
// 3. Generate Identity (Keys & DID)
|
|
61
|
+
console.log(chalk.blue("š Generating cryptographic identity..."));
|
|
62
|
+
const identity = await generateIdentity();
|
|
63
|
+
// 4. Create .dev.vars (Secrets)
|
|
64
|
+
const devVarsContent = `# Secrets for local development
|
|
65
|
+
# Generated by create-mcpi-app
|
|
66
|
+
|
|
67
|
+
# Agent Identity (DO NOT COMMIT THIS FILE)
|
|
68
|
+
MCP_IDENTITY_PRIVATE_KEY="${identity.privateKey}"
|
|
69
|
+
|
|
70
|
+
# AgentShield Configuration
|
|
71
|
+
${apikey ? `AGENTSHIELD_API_KEY="${apikey}"` : '# AGENTSHIELD_API_KEY=""'}
|
|
72
|
+
`;
|
|
73
|
+
await fs.writeFile(path.join(targetDir, ".dev.vars"), devVarsContent);
|
|
74
|
+
// 5. Create wrangler.toml
|
|
46
75
|
const wranglerToml = `#:schema node_modules/wrangler/config-schema.json
|
|
47
76
|
name = "${projectName}"
|
|
48
77
|
main = "src/index.ts"
|
|
@@ -59,20 +88,26 @@ tag = "v1"
|
|
|
59
88
|
new_classes = ["${toPascalCase(projectName)}MCP"]
|
|
60
89
|
|
|
61
90
|
# KV Namespace for nonce cache (replay protection)
|
|
62
|
-
# Run 'npm run kv:create-nonce' to generate ID
|
|
91
|
+
# Run 'npm run kv:create-nonce' to generate ID and uncomment below
|
|
63
92
|
# [[kv_namespaces]]
|
|
64
93
|
# binding = "NONCE_CACHE"
|
|
65
94
|
# id = "TODO_REPLACE_WITH_ID"
|
|
66
95
|
|
|
67
96
|
[vars]
|
|
68
97
|
# Environment variables
|
|
69
|
-
|
|
70
|
-
|
|
98
|
+
AGENTSHIELD_API_URL = "https://kya.vouched.id"
|
|
99
|
+
MCPI_ENV = "development"
|
|
100
|
+
${projectId ? `AGENTSHIELD_PROJECT_ID = "${projectId}"` : '# AGENTSHIELD_PROJECT_ID = "your-project-id"'}
|
|
101
|
+
|
|
102
|
+
# Agent Public Identity (Safe to commit)
|
|
103
|
+
MCP_IDENTITY_AGENT_DID = "${identity.did}"
|
|
104
|
+
MCP_IDENTITY_PUBLIC_KEY = "${identity.publicKey}"
|
|
71
105
|
`;
|
|
72
106
|
await fs.writeFile(path.join(targetDir, "wrangler.toml"), wranglerToml);
|
|
73
|
-
//
|
|
107
|
+
// 6. Create src/index.ts (Entry Point)
|
|
74
108
|
const indexTs = `import { createMCPICloudflareAdapter } from "@kya-os/mcp-i-cloudflare";
|
|
75
109
|
import { ${toPascalCase(projectName)}Agent } from "./agent";
|
|
110
|
+
import config from "./mcpi-runtime-config";
|
|
76
111
|
|
|
77
112
|
// Create the adapter
|
|
78
113
|
const adapter = createMCPICloudflareAdapter({
|
|
@@ -82,6 +117,7 @@ const adapter = createMCPICloudflareAdapter({
|
|
|
82
117
|
name: "${projectName}",
|
|
83
118
|
version: "1.0.0",
|
|
84
119
|
},
|
|
120
|
+
tools: config.tools, // Pass tools from config
|
|
85
121
|
});
|
|
86
122
|
|
|
87
123
|
// Export the fetch handler and Durable Object
|
|
@@ -89,44 +125,33 @@ export default adapter;
|
|
|
89
125
|
export { ${toPascalCase(projectName)}MCP } from "./agent";
|
|
90
126
|
`;
|
|
91
127
|
await fs.writeFile(path.join(targetDir, "src/index.ts"), indexTs);
|
|
92
|
-
//
|
|
128
|
+
// 7. Create src/agent.ts (Agent Class)
|
|
93
129
|
const agentTs = `import { MCPICloudflareAgent } from "@kya-os/mcp-i-cloudflare";
|
|
130
|
+
import config from "./mcpi-runtime-config";
|
|
94
131
|
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
95
132
|
|
|
133
|
+
/**
|
|
134
|
+
* MCP-I Agent Implementation
|
|
135
|
+
*/
|
|
96
136
|
export class ${toPascalCase(projectName)}Agent extends MCPICloudflareAgent {
|
|
97
137
|
/**
|
|
98
|
-
*
|
|
138
|
+
* Get tools definition from runtime config
|
|
99
139
|
*/
|
|
100
140
|
protected getTools(): Tool[] {
|
|
101
|
-
return [
|
|
102
|
-
{
|
|
103
|
-
name: "greet",
|
|
104
|
-
description: "Greet the user",
|
|
105
|
-
inputSchema: {
|
|
106
|
-
type: "object",
|
|
107
|
-
properties: {
|
|
108
|
-
name: { type: "string" },
|
|
109
|
-
},
|
|
110
|
-
required: ["name"],
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
];
|
|
141
|
+
return config.tools || [];
|
|
114
142
|
}
|
|
115
143
|
|
|
116
144
|
/**
|
|
117
|
-
* Handle tool execution
|
|
145
|
+
* Handle tool execution by routing to handlers defined in config
|
|
118
146
|
*/
|
|
119
147
|
protected async executeTool(name: string, args: any): Promise<any> {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
text: \`Hello, \${args.name}!\`,
|
|
126
|
-
},
|
|
127
|
-
],
|
|
128
|
-
};
|
|
148
|
+
// Find the tool handler in our config
|
|
149
|
+
const toolDef = config.tools?.find(t => t.name === name);
|
|
150
|
+
|
|
151
|
+
if (toolDef && (toolDef as any).handler) {
|
|
152
|
+
return (toolDef as any).handler(args);
|
|
129
153
|
}
|
|
154
|
+
|
|
130
155
|
throw new Error(\`Unknown tool: \${name}\`);
|
|
131
156
|
}
|
|
132
157
|
}
|
|
@@ -135,7 +160,93 @@ export class ${toPascalCase(projectName)}Agent extends MCPICloudflareAgent {
|
|
|
135
160
|
export class ${toPascalCase(projectName)}MCP extends ${toPascalCase(projectName)}Agent {}
|
|
136
161
|
`;
|
|
137
162
|
await fs.writeFile(path.join(targetDir, "src/agent.ts"), agentTs);
|
|
138
|
-
//
|
|
163
|
+
// 8. Create src/tools/greet.ts
|
|
164
|
+
const greetToolTs = `import type { ToolDefinition } from "@kya-os/mcp-i-cloudflare";
|
|
165
|
+
|
|
166
|
+
export const greetTool: ToolDefinition = {
|
|
167
|
+
name: "greet",
|
|
168
|
+
description: "Greet the user",
|
|
169
|
+
inputSchema: {
|
|
170
|
+
type: "object",
|
|
171
|
+
properties: {
|
|
172
|
+
name: { type: "string" },
|
|
173
|
+
},
|
|
174
|
+
required: ["name"],
|
|
175
|
+
},
|
|
176
|
+
handler: async (args: { name: string }) => {
|
|
177
|
+
return {
|
|
178
|
+
content: [
|
|
179
|
+
{
|
|
180
|
+
type: "text",
|
|
181
|
+
text: \`Hello, \${args.name}!\`,
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
};
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
`;
|
|
188
|
+
await fs.writeFile(path.join(targetDir, "src/tools/greet.ts"), greetToolTs);
|
|
189
|
+
// 9. Create src/mcpi-runtime-config.ts
|
|
190
|
+
const runtimeConfigTs = `import type { ToolDefinition } from "@kya-os/mcp-i-cloudflare";
|
|
191
|
+
import { greetTool } from "./tools/greet";
|
|
192
|
+
|
|
193
|
+
interface RuntimeConfig {
|
|
194
|
+
tools: ToolDefinition[];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const config: RuntimeConfig = {
|
|
198
|
+
tools: [
|
|
199
|
+
greetTool,
|
|
200
|
+
// Add more tools here
|
|
201
|
+
],
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
export default config;
|
|
205
|
+
`;
|
|
206
|
+
await fs.writeFile(path.join(targetDir, "src/mcpi-runtime-config.ts"), runtimeConfigTs);
|
|
207
|
+
// 10. Create scripts/setup.js (Key Regeneration Script)
|
|
208
|
+
// This allows users to regenerate identity keys if needed
|
|
209
|
+
const setupJs = `
|
|
210
|
+
const fs = require('fs');
|
|
211
|
+
const path = require('path');
|
|
212
|
+
const { generateKeyPairSync } = require('crypto');
|
|
213
|
+
const { promisify } = require('util');
|
|
214
|
+
|
|
215
|
+
// Simple base58 implementation for DID generation (simplified for setup script)
|
|
216
|
+
// In a real app, we use the libraries, but for a standalone script we keep it simple
|
|
217
|
+
// or assume node_modules are installed.
|
|
218
|
+
// Since this runs after install, we can try to use the installed packages if available,
|
|
219
|
+
// or fallback to standard crypto.
|
|
220
|
+
|
|
221
|
+
async function setup() {
|
|
222
|
+
console.log('š Regenerating MCP-I Identity...');
|
|
223
|
+
|
|
224
|
+
// Generate Ed25519 Key Pair
|
|
225
|
+
const { privateKey, publicKey } = generateKeyPairSync('ed25519');
|
|
226
|
+
|
|
227
|
+
// Convert to base64
|
|
228
|
+
const privateKeyBase64 = privateKey.export({ format: 'der', type: 'pkcs8' }).toString('base64');
|
|
229
|
+
const publicKeyBase64 = publicKey.export({ format: 'der', type: 'spki' }).toString('base64');
|
|
230
|
+
|
|
231
|
+
// Note: Proper DID:key generation requires multibase/multicodec.
|
|
232
|
+
// For this simple setup script, we'll use a placeholder or check if we can import helpers.
|
|
233
|
+
// Ideally, users should rely on the initial scaffolded keys.
|
|
234
|
+
|
|
235
|
+
console.log('ā
Keys generated!');
|
|
236
|
+
console.log('Private Key (Base64):', privateKeyBase64);
|
|
237
|
+
console.log('Public Key (Base64):', publicKeyBase64);
|
|
238
|
+
console.log('');
|
|
239
|
+
console.log('š Update your .dev.vars with MCP_IDENTITY_PRIVATE_KEY');
|
|
240
|
+
console.log('š Update your wrangler.toml with MCP_IDENTITY_PUBLIC_KEY');
|
|
241
|
+
console.log('');
|
|
242
|
+
console.log('To generate a full DID:key compliant identifier, please use the CLI:');
|
|
243
|
+
console.log('npx @kya-os/cli identity generate');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
setup().catch(console.error);
|
|
247
|
+
`;
|
|
248
|
+
await fs.writeFile(path.join(targetDir, "scripts/setup.js"), setupJs);
|
|
249
|
+
// 11. Create tsconfig.json
|
|
139
250
|
const tsConfig = {
|
|
140
251
|
compilerOptions: {
|
|
141
252
|
target: "esnext",
|
|
@@ -152,7 +263,7 @@ export class ${toPascalCase(projectName)}MCP extends ${toPascalCase(projectName)
|
|
|
152
263
|
await fs.writeJson(path.join(targetDir, "tsconfig.json"), tsConfig, {
|
|
153
264
|
spaces: 2,
|
|
154
265
|
});
|
|
155
|
-
//
|
|
266
|
+
// 12. Create .gitignore
|
|
156
267
|
const gitignore = `node_modules
|
|
157
268
|
dist
|
|
158
269
|
.wrangler
|
|
@@ -160,6 +271,9 @@ dist
|
|
|
160
271
|
`;
|
|
161
272
|
await fs.writeFile(path.join(targetDir, ".gitignore"), gitignore);
|
|
162
273
|
console.log(chalk.green("ā Created Cloudflare MCP-I template files"));
|
|
274
|
+
console.log(chalk.gray(" - Generated identity keys in .dev.vars"));
|
|
275
|
+
console.log(chalk.gray(" - Configured wrangler.toml"));
|
|
276
|
+
console.log(chalk.gray(" - Created modular tool structure"));
|
|
163
277
|
}
|
|
164
278
|
function toPascalCase(str) {
|
|
165
279
|
return str
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-cloudflare-mcpi-template.js","sourceRoot":"","sources":["../../src/helpers/fetch-cloudflare-mcpi-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-cloudflare-mcpi-template.js","sourceRoot":"","sources":["../../src/helpers/fetch-cloudflare-mcpi-template.ts"],"names":[],"mappings":"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"}
|