背景
PromptX 需要全面上云,主要目标:
- 支持云端部署(Cloudflare)
- 多租户支持
- 文件系统抽象,适配云存储
讨论结论
1. 认证方案:API Key
选择 API Key 而非 OAuth,原因:
- 实现简单,用户配置方便
- 主要面向开发者用户
- 参考 Context7 的做法
{
"mcpServers": {
"promptx": {
"url": "https://your-server.com/mcp",
"headers": {
"X-API-Key": "pk_xxx_your_api_key"
}
}
}
}
2. 部署架构:Cloudflare 全家桶
┌─────────────────────────────────────────────────────────────┐
│ Cloudflare Workers Cloudflare Containers │
│ ───────────────── ───────────────────── │
│ • MCP Server 入口 • ToolX 执行沙箱 │
│ • API Key 认证 • npm/bun 包安装 │
│ • 路由分发 • 复杂工具运行 │
│ • 简单工具执行 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Cloudflare D1 Cloudflare KV Cloudflare R2 │
│ ──────────── ───────────── ───────────── │
│ • Memory • ToolStorage • 资源文件 │
│ • 记忆存储 • Network • 用户上传 │
│ • Anchor │
└─────────────────────────────────────────────────────────────┘
3. 文件系统改造映射
| 当前实现 |
Cloudflare 替代 |
改造工作量 |
better-sqlite3 (Memory.js) |
D1 |
中 |
fs.writeFile JSON (ToolStorage, Network, Anchor) |
KV |
小 |
fs.readFile 资源文件 (各 Protocol) |
R2 |
中 |
fs.readdir 目录扫描 (Discovery) |
R2 + 元数据索引 |
大 |
npm install (PackageInstaller) |
移至 Containers |
- |
4. ToolX 独立项目
决定将 ToolX 拆分为独立项目,理由:
- 关注点分离,工具执行是独立领域
- 独立部署到 Cloudflare Containers
- 可被其他项目复用
- 使用 Bun 开发,更快更现代
项目结构
@aspect/toolx/
├── src/
│ ├── sandbox/ # 沙箱隔离
│ │ ├── Sandbox.ts
│ │ ├── IsolationManager.ts
│ │ └── SecurityPolicy.ts
│ ├── runtime/ # 运行时
│ │ ├── PackageManager.ts # bun install
│ │ ├── ModuleLoader.ts
│ │ └── DirectoryManager.ts
│ ├── api/ # 注入到沙箱的 API
│ │ ├── Storage.ts
│ │ ├── Logger.ts
│ │ └── Bridge.ts
│ └── server/ # HTTP 服务
│ ├── HttpServer.ts
│ └── routes/
├── Dockerfile
├── package.json
└── tsconfig.json
核心 API
// POST /execute
interface ExecuteRequest {
toolId: string;
toolCode?: string;
params: Record<string, any>;
context?: {
tenantId?: string;
timeout?: number;
permissions?: string[];
};
}
5. PackageInstaller 改造
从 @npmcli/arborist 迁移到 bun install
优势:
- 安装速度提升 10-20x(~10s → ~1s)
- 代码量减少(~100行 → ~20行)
- 零额外依赖(Bun 内置)
// 新的实现
const proc = Bun.spawn({
cmd: ['bun', 'install', '--no-save'],
cwd: workingDir,
env: { BUN_CONFIG_REGISTRY: registry },
});
await proc.exited;
任务拆分
参考资料
背景
PromptX 需要全面上云,主要目标:
讨论结论
1. 认证方案:API Key
选择 API Key 而非 OAuth,原因:
{ "mcpServers": { "promptx": { "url": "https://your-server.com/mcp", "headers": { "X-API-Key": "pk_xxx_your_api_key" } } } }2. 部署架构:Cloudflare 全家桶
3. 文件系统改造映射
better-sqlite3(Memory.js)fs.writeFileJSON (ToolStorage, Network, Anchor)fs.readFile资源文件 (各 Protocol)fs.readdir目录扫描 (Discovery)npm install(PackageInstaller)4. ToolX 独立项目
决定将 ToolX 拆分为独立项目,理由:
项目结构
核心 API
5. PackageInstaller 改造
从
@npmcli/arborist迁移到bun install优势:
任务拆分
Phase 1: ToolX 独立项目
Phase 2: 存储层抽象
Phase 3: MCP Server 云化
Phase 4: 多租户支持
参考资料