@kya-os/create-mcpi-app 1.2.20 ā 1.2.22
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/.tsbuildinfo +1 -1
- package/dist/helpers/create.d.ts +2 -0
- package/dist/helpers/create.d.ts.map +1 -1
- package/dist/helpers/create.js +22 -10
- package/dist/helpers/create.js.map +1 -1
- package/dist/helpers/fetch-cloudflare-mcpi-template.d.ts +12 -0
- package/dist/helpers/fetch-cloudflare-mcpi-template.d.ts.map +1 -0
- package/dist/helpers/fetch-cloudflare-mcpi-template.js +407 -0
- package/dist/helpers/fetch-cloudflare-mcpi-template.js.map +1 -0
- package/dist/index.js +39 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/helpers/create.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/helpers/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/helpers/create.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA4CrD,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AASD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA4I3B"}
|
package/dist/helpers/create.js
CHANGED
|
@@ -3,6 +3,7 @@ import fs from "fs-extra";
|
|
|
3
3
|
import { fileURLToPath } from "url";
|
|
4
4
|
import { fetchMCPITemplate } from "./fetch-mcpi-template.js";
|
|
5
5
|
import { fetchCloudflareTemplate } from "./fetch-cloudflare-template.js";
|
|
6
|
+
import { fetchCloudflareMcpiTemplate } from "./fetch-cloudflare-mcpi-template.js";
|
|
6
7
|
import { renameFiles } from "./rename.js";
|
|
7
8
|
import { install } from "./install.js";
|
|
8
9
|
import { validateProjectStructure, ensureLockfile, } from "./validate-project-structure.js";
|
|
@@ -51,27 +52,37 @@ function createProjectDirectories(projectPath) {
|
|
|
51
52
|
* Create a new MCP-I project with identity features
|
|
52
53
|
*/
|
|
53
54
|
export async function createProject(options) {
|
|
54
|
-
const { projectPath, projectName, packageManager, transports, packageVersion, useLocalXmcp, mcpiVersion, deployToVercel, skipInstall, agentName = projectName, agentDescription = "MCP-I server with identity features", agentRepository = "", skipIdentity = false, skipAnimation = false, fastAnimation = false, template = "default", } = options;
|
|
55
|
+
const { projectPath, projectName, packageManager, transports, packageVersion, useLocalXmcp, mcpiVersion, deployToVercel, skipInstall, agentName = projectName, agentDescription = "MCP-I server with identity features", agentRepository = "", skipIdentity = false, skipAnimation = false, fastAnimation = false, platform = "node", mode = "mcp-i", template = "default", } = options;
|
|
55
56
|
const warnings = [];
|
|
56
57
|
let resolvedMcpiVersion = mcpiVersion;
|
|
57
58
|
try {
|
|
58
59
|
// Ensure the project directory exists
|
|
59
60
|
fs.ensureDirSync(projectPath);
|
|
60
|
-
// Scaffold project based on
|
|
61
|
+
// Scaffold project based on platform/mode
|
|
61
62
|
console.log(chalk.blue("\nš Scaffolding project..."));
|
|
62
|
-
if (
|
|
63
|
-
// Cloudflare Worker verifier template
|
|
63
|
+
if (platform === "cloudflare" && mode === "verifier") {
|
|
64
|
+
// Cloudflare Worker verifier template (standalone verifier)
|
|
64
65
|
await fetchCloudflareTemplate(projectPath, {
|
|
65
66
|
packageManager,
|
|
66
67
|
});
|
|
67
68
|
}
|
|
68
|
-
else {
|
|
69
|
-
//
|
|
69
|
+
else if (platform === "cloudflare" && mode === "mcp-i") {
|
|
70
|
+
// Cloudflare Worker MCP-I server template (NEW)
|
|
71
|
+
await fetchCloudflareMcpiTemplate(projectPath, {
|
|
72
|
+
packageManager,
|
|
73
|
+
projectName,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (platform === "node" && mode === "mcp-i") {
|
|
77
|
+
// Node.js MCP-I server template (default)
|
|
70
78
|
await fetchMCPITemplate(projectPath, {
|
|
71
79
|
mcpiVersion,
|
|
72
80
|
packageManager,
|
|
73
81
|
});
|
|
74
82
|
}
|
|
83
|
+
else {
|
|
84
|
+
throw new Error(`Unsupported platform/mode combination: ${platform}/${mode}`);
|
|
85
|
+
}
|
|
75
86
|
// Capture the resolved version for the result
|
|
76
87
|
const packageJsonPath = path.join(projectPath, "package.json");
|
|
77
88
|
if (fs.existsSync(packageJsonPath)) {
|
|
@@ -102,8 +113,9 @@ export async function createProject(options) {
|
|
|
102
113
|
spaces: 2,
|
|
103
114
|
});
|
|
104
115
|
}
|
|
105
|
-
// Create necessary project directories (skip for cloudflare
|
|
106
|
-
|
|
116
|
+
// Create necessary project directories (skip for cloudflare templates)
|
|
117
|
+
const isCloudflare = platform === "cloudflare";
|
|
118
|
+
if (!isCloudflare) {
|
|
107
119
|
createProjectDirectories(projectPath);
|
|
108
120
|
}
|
|
109
121
|
// Install project dependencies
|
|
@@ -113,7 +125,7 @@ export async function createProject(options) {
|
|
|
113
125
|
ensureLockfile(projectPath, packageManager);
|
|
114
126
|
}
|
|
115
127
|
// Validate project structure meets requirements (skip for cloudflare)
|
|
116
|
-
if (
|
|
128
|
+
if (!isCloudflare) {
|
|
117
129
|
const validation = validateProjectStructure(projectPath, !skipIdentity);
|
|
118
130
|
if (!validation.valid) {
|
|
119
131
|
console.warn(chalk.yellow("ā ļø Project structure validation issues:"));
|
|
@@ -124,7 +136,7 @@ export async function createProject(options) {
|
|
|
124
136
|
}
|
|
125
137
|
}
|
|
126
138
|
// Identity setup is now handled by the CLI after scaffolding (not for cloudflare)
|
|
127
|
-
if (!skipIdentity &&
|
|
139
|
+
if (!skipIdentity && !isCloudflare) {
|
|
128
140
|
console.log(chalk.blue("\nš Identity setup will be handled by the CLI"));
|
|
129
141
|
console.log(chalk.gray(" Run 'mcpi init' after scaffolding to set up identity"));
|
|
130
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/helpers/create.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,wBAAwB,EACxB,cAAc,GACf,MAAM,iCAAiC,CAAC;AAEzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,iCAAiC;AACjC,SAAS,gBAAgB,CAAC,GAAW,EAAE,gBAAwB;IAC7D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;QAEtC,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACjE,MAAM,eAAe,GACnB,gBAAgB,CAAC,MAAM,KAAK,EAAE;YAC5B,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;YAClC,CAAC,CAAC,gBAAgB,CAAC;QAEvB,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACzC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC;gBACtD,eAAe;aAChB,CAAC;YACF,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;QACtE,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,GAAG,EAAE,GAAG;YACR,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;YAC/B,SAAS,EAAE,eAAe;SAC3B,CAAC,CAAC;QAEH,OAAO,oCAAoC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/helpers/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface CloudflareMcpiTemplateOptions {
|
|
2
|
+
packageManager?: string;
|
|
3
|
+
projectName?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Scaffold Cloudflare Worker MCP-I server
|
|
7
|
+
* Combines MCP server (Durable Objects) + verification endpoint (KV cache)
|
|
8
|
+
* Uses agents/mcp for MCP session management and @kya-os/verifier for proofs
|
|
9
|
+
*/
|
|
10
|
+
export declare function fetchCloudflareMcpiTemplate(projectPath: string, options?: CloudflareMcpiTemplateOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=fetch-cloudflare-mcpi-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-cloudflare-mcpi-template.d.ts","sourceRoot":"","sources":["../../src/helpers/fetch-cloudflare-mcpi-template.ts"],"names":[],"mappings":"AAIA,UAAU,6BAA6B;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAwZf"}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
/**
|
|
5
|
+
* Scaffold Cloudflare Worker MCP-I server
|
|
6
|
+
* Combines MCP server (Durable Objects) + verification endpoint (KV cache)
|
|
7
|
+
* Uses agents/mcp for MCP session management and @kya-os/verifier for proofs
|
|
8
|
+
*/
|
|
9
|
+
export async function fetchCloudflareMcpiTemplate(projectPath, options = {}) {
|
|
10
|
+
const { packageManager = "npm", projectName = path.basename(projectPath) } = options;
|
|
11
|
+
// Sanitize project name for class names (remove special chars)
|
|
12
|
+
const className = projectName.replace(/[^a-zA-Z0-9]/g, "");
|
|
13
|
+
try {
|
|
14
|
+
console.log(chalk.blue("š¦ Setting up Cloudflare Worker MCP-I server..."));
|
|
15
|
+
// Create package.json
|
|
16
|
+
const packageJson = {
|
|
17
|
+
name: projectName,
|
|
18
|
+
version: "0.1.0",
|
|
19
|
+
private: true,
|
|
20
|
+
scripts: {
|
|
21
|
+
deploy: "wrangler deploy",
|
|
22
|
+
dev: "wrangler dev",
|
|
23
|
+
start: "wrangler dev",
|
|
24
|
+
"kv:create": "wrangler kv:namespace create NONCE_CACHE",
|
|
25
|
+
"kv:create:preview": "wrangler kv:namespace create NONCE_CACHE --preview",
|
|
26
|
+
"cf-typegen": "wrangler types",
|
|
27
|
+
"type-check": "tsc --noEmit",
|
|
28
|
+
},
|
|
29
|
+
dependencies: {
|
|
30
|
+
"@modelcontextprotocol/sdk": "^1.19.1",
|
|
31
|
+
"@kya-os/verifier": "^1.3.0",
|
|
32
|
+
"agents": "^0.2.8",
|
|
33
|
+
"hono": "^4.9.10",
|
|
34
|
+
"zod": "^4.1.12",
|
|
35
|
+
},
|
|
36
|
+
devDependencies: {
|
|
37
|
+
"@cloudflare/workers-types": "^4.20240925.0",
|
|
38
|
+
"typescript": "^5.6.2",
|
|
39
|
+
"wrangler": "^4.42.2",
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
fs.ensureDirSync(projectPath);
|
|
43
|
+
fs.writeJsonSync(path.join(projectPath, "package.json"), packageJson, { spaces: 2 });
|
|
44
|
+
// Create src directory and tools
|
|
45
|
+
const srcDir = path.join(projectPath, "src");
|
|
46
|
+
const toolsDir = path.join(srcDir, "tools");
|
|
47
|
+
fs.ensureDirSync(toolsDir);
|
|
48
|
+
// Create greet tool (matches Node template structure)
|
|
49
|
+
const greetToolContent = `import { z } from "zod";
|
|
50
|
+
|
|
51
|
+
export const greetTool = {
|
|
52
|
+
name: "greet",
|
|
53
|
+
description: "Greet a user by name",
|
|
54
|
+
inputSchema: z.object({
|
|
55
|
+
name: z.string().describe("The name of the user to greet"),
|
|
56
|
+
}),
|
|
57
|
+
handler: async ({ name }: { name: string }) => {
|
|
58
|
+
return {
|
|
59
|
+
content: [
|
|
60
|
+
{
|
|
61
|
+
type: "text" as const,
|
|
62
|
+
text: \`Hello, \${name}! Welcome to your Cloudflare MCP-I server.\`,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
`;
|
|
69
|
+
fs.writeFileSync(path.join(toolsDir, "greet.ts"), greetToolContent);
|
|
70
|
+
// Create main index.ts (McpAgent Durable Object + Hono routing)
|
|
71
|
+
const indexContent = `import { McpAgent } from "agents/mcp";
|
|
72
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
73
|
+
import { Hono } from "hono";
|
|
74
|
+
import { cors } from "hono/cors";
|
|
75
|
+
import {
|
|
76
|
+
verifyWorker,
|
|
77
|
+
applyVerificationToResponse,
|
|
78
|
+
createConfigFromEnv,
|
|
79
|
+
type WorkerEnv,
|
|
80
|
+
} from "@kya-os/verifier/worker";
|
|
81
|
+
import { greetTool } from "./tools/greet";
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* MCP Durable Object
|
|
85
|
+
* Handles stateful MCP sessions with persistent tool state
|
|
86
|
+
*/
|
|
87
|
+
export class ${className}MCP extends McpAgent {
|
|
88
|
+
server = new McpServer({
|
|
89
|
+
name: "${projectName}",
|
|
90
|
+
version: "1.0.0"
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
constructor(state: DurableObjectState, env: WorkerEnv) {
|
|
94
|
+
super(state, env);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async init() {
|
|
98
|
+
// Register tools using same structure as Node template
|
|
99
|
+
this.server.tool(
|
|
100
|
+
greetTool.name,
|
|
101
|
+
greetTool.description,
|
|
102
|
+
greetTool.inputSchema,
|
|
103
|
+
greetTool.handler
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Hono Router
|
|
110
|
+
* Routes MCP and verification endpoints
|
|
111
|
+
*/
|
|
112
|
+
const app = new Hono<{ Bindings: WorkerEnv }>();
|
|
113
|
+
|
|
114
|
+
// Enable CORS for MCP client access
|
|
115
|
+
app.use("/*", cors({
|
|
116
|
+
origin: "*",
|
|
117
|
+
allowMethods: ["GET", "POST", "OPTIONS"],
|
|
118
|
+
allowHeaders: ["Content-Type", "Authorization", "mcp-session-id", "mcp-protocol-version"],
|
|
119
|
+
exposeHeaders: ["mcp-session-id"],
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
// Health check endpoint
|
|
123
|
+
app.get("/health", (c) => {
|
|
124
|
+
return c.json({
|
|
125
|
+
status: "healthy",
|
|
126
|
+
timestamp: new Date().toISOString(),
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// MCP endpoint (uses Durable Object for session state)
|
|
131
|
+
app.all("/mcp", (c) => {
|
|
132
|
+
return ${className}MCP.serve("/mcp").fetch(c.req.raw, c.env, c.executionCtx);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// MCP SSE endpoint (for streaming responses)
|
|
136
|
+
app.all("/sse/*", (c) => {
|
|
137
|
+
return ${className}MCP.serveSSE("/sse").fetch(c.req.raw, c.env, c.executionCtx);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// Verification endpoint (uses KV for nonce cache)
|
|
141
|
+
app.post("/verify", async (c) => {
|
|
142
|
+
const config = createConfigFromEnv(c.env, {
|
|
143
|
+
allowMockData: false,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const result = await verifyWorker(c.req.raw, config);
|
|
147
|
+
|
|
148
|
+
if (!result.success) {
|
|
149
|
+
return applyVerificationToResponse(result);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const agent = result.agentContext;
|
|
153
|
+
|
|
154
|
+
return c.json({
|
|
155
|
+
verified: true,
|
|
156
|
+
agent: {
|
|
157
|
+
did: agent?.did,
|
|
158
|
+
keyId: agent?.keyId,
|
|
159
|
+
scopes: agent?.scopes,
|
|
160
|
+
session: agent?.session,
|
|
161
|
+
},
|
|
162
|
+
timestamp: new Date().toISOString(),
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
export default app;
|
|
167
|
+
`;
|
|
168
|
+
fs.writeFileSync(path.join(srcDir, "index.ts"), indexContent);
|
|
169
|
+
// Create wrangler.toml (Durable Objects for MCP, KV for nonce cache)
|
|
170
|
+
const wranglerContent = `#:schema node_modules/wrangler/config-schema.json
|
|
171
|
+
name = "${projectName}"
|
|
172
|
+
main = "src/index.ts"
|
|
173
|
+
compatibility_date = "2025-06-18"
|
|
174
|
+
compatibility_flags = ["nodejs_compat"]
|
|
175
|
+
|
|
176
|
+
# KV Namespace for nonce cache
|
|
177
|
+
# Run: wrangler kv:namespace create NONCE_CACHE
|
|
178
|
+
# Then replace the id below with the output
|
|
179
|
+
[[kv_namespaces]]
|
|
180
|
+
binding = "NONCE_CACHE"
|
|
181
|
+
id = "your-kv-namespace-id"
|
|
182
|
+
|
|
183
|
+
# Environment variables (non-sensitive)
|
|
184
|
+
[vars]
|
|
185
|
+
KYA_API_URL = "https://knowthat.ai"
|
|
186
|
+
XMCP_I_TS_SKEW_SEC = "120"
|
|
187
|
+
XMCP_I_SESSION_TTL = "1800"
|
|
188
|
+
|
|
189
|
+
# Durable Object binding for MCP sessions
|
|
190
|
+
[[durable_objects.bindings]]
|
|
191
|
+
name = "MCP_OBJECT"
|
|
192
|
+
class_name = "${className}MCP"
|
|
193
|
+
|
|
194
|
+
# Durable Object migrations
|
|
195
|
+
[[migrations]]
|
|
196
|
+
tag = "v1"
|
|
197
|
+
new_sqlite_classes = ["${className}MCP"]
|
|
198
|
+
|
|
199
|
+
# Production environment
|
|
200
|
+
[env.production]
|
|
201
|
+
name = "${projectName}-production"
|
|
202
|
+
vars = { KYA_API_URL = "https://knowthat.ai", XMCP_I_TS_SKEW_SEC = "60" }
|
|
203
|
+
|
|
204
|
+
[[env.production.kv_namespaces]]
|
|
205
|
+
binding = "NONCE_CACHE"
|
|
206
|
+
id = "your-production-kv-namespace-id"
|
|
207
|
+
`;
|
|
208
|
+
fs.writeFileSync(path.join(projectPath, "wrangler.toml"), wranglerContent);
|
|
209
|
+
// Create tsconfig.json
|
|
210
|
+
const tsconfigContent = {
|
|
211
|
+
compilerOptions: {
|
|
212
|
+
target: "ES2022",
|
|
213
|
+
module: "ES2022",
|
|
214
|
+
lib: ["ES2022"],
|
|
215
|
+
types: ["@cloudflare/workers-types"],
|
|
216
|
+
moduleResolution: "bundler",
|
|
217
|
+
resolveJsonModule: true,
|
|
218
|
+
allowSyntheticDefaultImports: true,
|
|
219
|
+
esModuleInterop: true,
|
|
220
|
+
strict: true,
|
|
221
|
+
skipLibCheck: true,
|
|
222
|
+
forceConsistentCasingInFileNames: true,
|
|
223
|
+
},
|
|
224
|
+
include: ["src/**/*"],
|
|
225
|
+
};
|
|
226
|
+
fs.writeJsonSync(path.join(projectPath, "tsconfig.json"), tsconfigContent, { spaces: 2 });
|
|
227
|
+
// Create .gitignore
|
|
228
|
+
const gitignoreContent = `node_modules/
|
|
229
|
+
dist/
|
|
230
|
+
.wrangler/
|
|
231
|
+
.dev.vars
|
|
232
|
+
.env
|
|
233
|
+
.env.local
|
|
234
|
+
*.log
|
|
235
|
+
`;
|
|
236
|
+
fs.writeFileSync(path.join(projectPath, ".gitignore"), gitignoreContent);
|
|
237
|
+
// Create README.md
|
|
238
|
+
const readmeContent = `# ${projectName}
|
|
239
|
+
|
|
240
|
+
MCP-I server running on Cloudflare Workers with identity verification.
|
|
241
|
+
|
|
242
|
+
## Quick Start
|
|
243
|
+
|
|
244
|
+
### 1. Install Dependencies
|
|
245
|
+
|
|
246
|
+
\`\`\`bash
|
|
247
|
+
${packageManager} install
|
|
248
|
+
\`\`\`
|
|
249
|
+
|
|
250
|
+
### 2. Create KV Namespace
|
|
251
|
+
|
|
252
|
+
\`\`\`bash
|
|
253
|
+
${packageManager === "npm" ? "npm run" : packageManager} kv:create
|
|
254
|
+
\`\`\`
|
|
255
|
+
|
|
256
|
+
Copy the \`id\` from the output and update \`wrangler.toml\`:
|
|
257
|
+
|
|
258
|
+
\`\`\`toml
|
|
259
|
+
[[kv_namespaces]]
|
|
260
|
+
binding = "NONCE_CACHE"
|
|
261
|
+
id = "your-actual-kv-id-here" # ā Update this
|
|
262
|
+
\`\`\`
|
|
263
|
+
|
|
264
|
+
### 3. Test Locally
|
|
265
|
+
|
|
266
|
+
\`\`\`bash
|
|
267
|
+
${packageManager === "npm" ? "npm run" : packageManager} dev
|
|
268
|
+
\`\`\`
|
|
269
|
+
|
|
270
|
+
**Endpoints:**
|
|
271
|
+
- MCP: http://localhost:8787/mcp
|
|
272
|
+
- Verify: http://localhost:8787/verify
|
|
273
|
+
- Health: http://localhost:8787/health
|
|
274
|
+
|
|
275
|
+
### 4. Deploy to Cloudflare
|
|
276
|
+
|
|
277
|
+
\`\`\`bash
|
|
278
|
+
# Login to Cloudflare (first time only)
|
|
279
|
+
npx wrangler login
|
|
280
|
+
|
|
281
|
+
# Deploy to development
|
|
282
|
+
${packageManager === "npm" ? "npm run" : packageManager} deploy
|
|
283
|
+
|
|
284
|
+
# Deploy to production
|
|
285
|
+
${packageManager === "npm" ? "npm run" : packageManager} deploy --env production
|
|
286
|
+
\`\`\`
|
|
287
|
+
|
|
288
|
+
## Connect with Claude Desktop
|
|
289
|
+
|
|
290
|
+
Add to your \`claude_desktop_config.json\`:
|
|
291
|
+
|
|
292
|
+
\`\`\`json
|
|
293
|
+
{
|
|
294
|
+
"mcpServers": {
|
|
295
|
+
"${projectName}": {
|
|
296
|
+
"command": "npx",
|
|
297
|
+
"args": [
|
|
298
|
+
"mcp-remote",
|
|
299
|
+
"https://your-worker.workers.dev/mcp"
|
|
300
|
+
]
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
\`\`\`
|
|
305
|
+
|
|
306
|
+
## Adding Tools
|
|
307
|
+
|
|
308
|
+
Create new tools in \`src/tools/\`:
|
|
309
|
+
|
|
310
|
+
\`\`\`typescript
|
|
311
|
+
// src/tools/example.ts
|
|
312
|
+
import { z } from "zod";
|
|
313
|
+
|
|
314
|
+
export const exampleTool = {
|
|
315
|
+
name: "example",
|
|
316
|
+
description: "Example tool description",
|
|
317
|
+
inputSchema: z.object({
|
|
318
|
+
input: z.string().describe("Input parameter"),
|
|
319
|
+
}),
|
|
320
|
+
handler: async ({ input }: { input: string }) => {
|
|
321
|
+
return {
|
|
322
|
+
content: [
|
|
323
|
+
{
|
|
324
|
+
type: "text" as const,
|
|
325
|
+
text: \`Result: \${input}\`
|
|
326
|
+
}
|
|
327
|
+
],
|
|
328
|
+
};
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
\`\`\`
|
|
332
|
+
|
|
333
|
+
Register in \`src/index.ts\`:
|
|
334
|
+
|
|
335
|
+
\`\`\`typescript
|
|
336
|
+
import { exampleTool } from "./tools/example";
|
|
337
|
+
|
|
338
|
+
async init() {
|
|
339
|
+
this.server.tool(
|
|
340
|
+
exampleTool.name,
|
|
341
|
+
exampleTool.description,
|
|
342
|
+
exampleTool.inputSchema,
|
|
343
|
+
exampleTool.handler
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
\`\`\`
|
|
347
|
+
|
|
348
|
+
## API Endpoints
|
|
349
|
+
|
|
350
|
+
### \`GET /health\`
|
|
351
|
+
Health check endpoint.
|
|
352
|
+
|
|
353
|
+
**Response:**
|
|
354
|
+
\`\`\`json
|
|
355
|
+
{
|
|
356
|
+
"status": "healthy",
|
|
357
|
+
"timestamp": "2024-10-10T12:00:00.000Z"
|
|
358
|
+
}
|
|
359
|
+
\`\`\`
|
|
360
|
+
|
|
361
|
+
### \`POST /mcp\`
|
|
362
|
+
MCP protocol endpoint for tool calls.
|
|
363
|
+
|
|
364
|
+
### \`POST /verify\`
|
|
365
|
+
Verify MCP-I cryptographic proofs.
|
|
366
|
+
|
|
367
|
+
**Request:**
|
|
368
|
+
\`\`\`json
|
|
369
|
+
{
|
|
370
|
+
"proof": {
|
|
371
|
+
"agentDid": "did:web:example.com",
|
|
372
|
+
"timestamp": 1234567890,
|
|
373
|
+
"nonce": "abc123",
|
|
374
|
+
"signature": "...",
|
|
375
|
+
"publicKey": "..."
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
\`\`\`
|
|
379
|
+
|
|
380
|
+
**Response:**
|
|
381
|
+
\`\`\`json
|
|
382
|
+
{
|
|
383
|
+
"verified": true,
|
|
384
|
+
"agent": {
|
|
385
|
+
"did": "did:web:example.com",
|
|
386
|
+
"keyId": "key-123",
|
|
387
|
+
"scopes": ["read", "write"],
|
|
388
|
+
"session": "session-456"
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
\`\`\`
|
|
392
|
+
|
|
393
|
+
## Learn More
|
|
394
|
+
|
|
395
|
+
- [MCP-I Documentation](https://github.com/kya-os/xmcp-i)
|
|
396
|
+
- [Cloudflare Workers](https://developers.cloudflare.com/workers/)
|
|
397
|
+
- [agents/mcp](https://www.npmjs.com/package/agents)
|
|
398
|
+
`;
|
|
399
|
+
fs.writeFileSync(path.join(projectPath, "README.md"), readmeContent);
|
|
400
|
+
console.log(chalk.green("ā
Cloudflare Worker MCP-I server structure created"));
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
console.error(chalk.red("Failed to set up Cloudflare Worker MCP-I server:"), error);
|
|
404
|
+
throw error;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=fetch-cloudflare-mcpi-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-cloudflare-mcpi-template.js","sourceRoot":"","sources":["../../src/helpers/fetch-cloudflare-mcpi-template.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -35,7 +35,9 @@ const program = new Command()
|
|
|
35
35
|
.option("--mcpi-version <version>", "Specify MCP-I version (e.g., ^1.2.7)")
|
|
36
36
|
.option("--no-animation", "Skip the black hole animation", false)
|
|
37
37
|
.option("--fast", "Use shorter animation duration", false)
|
|
38
|
-
.option("--
|
|
38
|
+
.option("--platform <name>", "Deployment platform: node (default), cloudflare", "node")
|
|
39
|
+
.option("--mode <name>", "Server mode: mcp-i (default), verifier", "mcp-i")
|
|
40
|
+
.option("--template <name>", "[DEPRECATED] Use --platform and --mode instead")
|
|
39
41
|
.action(async (projectDir, options) => {
|
|
40
42
|
console.log(chalk.bold(`\ncreate-mcpi-app@${packageJson.version}`));
|
|
41
43
|
// Show KYA-OS banner
|
|
@@ -85,6 +87,36 @@ const program = new Command()
|
|
|
85
87
|
let agentName = projectName;
|
|
86
88
|
let agentDescription = "MCP-I server with identity features";
|
|
87
89
|
let agentRepository = "";
|
|
90
|
+
// Handle platform and mode flags (with backward compatibility for --template)
|
|
91
|
+
let platform = options.platform || "node";
|
|
92
|
+
let mode = options.mode || "mcp-i";
|
|
93
|
+
// Backward compatibility: map --template to --platform/--mode
|
|
94
|
+
if (options.template) {
|
|
95
|
+
console.log(chalk.yellow("ā ļø --template is deprecated. Use --platform and --mode instead."));
|
|
96
|
+
if (options.template === "cloudflare") {
|
|
97
|
+
platform = "cloudflare";
|
|
98
|
+
mode = "verifier";
|
|
99
|
+
}
|
|
100
|
+
else if (options.template === "default") {
|
|
101
|
+
platform = "node";
|
|
102
|
+
mode = "mcp-i";
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Validate platform and mode combinations
|
|
106
|
+
const validCombinations = [
|
|
107
|
+
{ platform: "node", mode: "mcp-i" },
|
|
108
|
+
{ platform: "cloudflare", mode: "mcp-i" },
|
|
109
|
+
{ platform: "cloudflare", mode: "verifier" },
|
|
110
|
+
];
|
|
111
|
+
const isValid = validCombinations.some((combo) => combo.platform === platform && combo.mode === mode);
|
|
112
|
+
if (!isValid) {
|
|
113
|
+
console.error(chalk.red(`\nā Invalid platform/mode combination: ${platform}/${mode}`));
|
|
114
|
+
console.log(chalk.yellow("\nSupported combinations:"));
|
|
115
|
+
console.log(chalk.cyan(" - node + mcp-i (default)"));
|
|
116
|
+
console.log(chalk.cyan(" - cloudflare + mcp-i"));
|
|
117
|
+
console.log(chalk.cyan(" - cloudflare + verifier"));
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
88
120
|
// Handle transport selection from CLI options
|
|
89
121
|
if (options.http || options.stdio) {
|
|
90
122
|
transports = [];
|
|
@@ -225,7 +257,9 @@ const program = new Command()
|
|
|
225
257
|
skipAnimation: options.noAnimation === false ? true : false, // Handle --no-animation flag
|
|
226
258
|
fastAnimation: options.fast,
|
|
227
259
|
spinner, // Pass spinner to stop it before animation
|
|
228
|
-
|
|
260
|
+
platform, // Pass platform (node, cloudflare)
|
|
261
|
+
mode, // Pass mode (mcp-i, verifier)
|
|
262
|
+
template: options.template || "default", // Keep for backward compatibility
|
|
229
263
|
});
|
|
230
264
|
if (!result.success) {
|
|
231
265
|
spinner.fail(chalk.red("Failed to create the project."));
|
|
@@ -247,9 +281,9 @@ const program = new Command()
|
|
|
247
281
|
}
|
|
248
282
|
console.log();
|
|
249
283
|
console.log("Next Steps:");
|
|
250
|
-
// Show different instructions based on
|
|
251
|
-
if (
|
|
252
|
-
// Cloudflare Worker verifier
|
|
284
|
+
// Show different instructions based on platform/mode
|
|
285
|
+
if (platform === "cloudflare") {
|
|
286
|
+
// Cloudflare Worker instructions (both verifier and mcp-i)
|
|
253
287
|
console.log("1. Install dependencies:");
|
|
254
288
|
if (resolvedProjectPath !== process.cwd()) {
|
|
255
289
|
console.log(` cd ${chalk.cyan(projectDir)}`);
|