zion-mcp 1.0.3 → 1.0.7
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 +89 -0
- package/dist/auth/credential-store.d.ts +7 -9
- package/dist/auth/credential-store.d.ts.map +1 -1
- package/dist/auth/credential-store.js +57 -26
- package/dist/auth/credential-store.js.map +1 -1
- package/dist/auth/jwt-auth.d.ts.map +1 -1
- package/dist/auth/jwt-auth.js +0 -11
- package/dist/auth/jwt-auth.js.map +1 -1
- package/dist/auth/oauth-flow.d.ts +11 -0
- package/dist/auth/oauth-flow.d.ts.map +1 -0
- package/dist/auth/oauth-flow.js +239 -0
- package/dist/auth/oauth-flow.js.map +1 -0
- package/dist/auth/token-manager.d.ts +1 -2
- package/dist/auth/token-manager.d.ts.map +1 -1
- package/dist/auth/token-manager.js +22 -4
- package/dist/auth/token-manager.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -8
- package/dist/config.js.map +1 -1
- package/dist/const.d.ts +2 -1
- package/dist/const.d.ts.map +1 -1
- package/dist/const.js +2 -1
- package/dist/const.js.map +1 -1
- package/dist/mock-data/converter.d.ts +3 -0
- package/dist/mock-data/converter.d.ts.map +1 -0
- package/dist/mock-data/converter.js +33 -0
- package/dist/mock-data/converter.js.map +1 -0
- package/dist/mock-data/generator.d.ts +17 -0
- package/dist/mock-data/generator.d.ts.map +1 -0
- package/dist/mock-data/generator.js +225 -0
- package/dist/mock-data/generator.js.map +1 -0
- package/dist/mock-data/image-generator.d.ts +7 -0
- package/dist/mock-data/image-generator.d.ts.map +1 -0
- package/dist/mock-data/image-generator.js +175 -0
- package/dist/mock-data/image-generator.js.map +1 -0
- package/dist/mock-data/index.d.ts +10 -0
- package/dist/mock-data/index.d.ts.map +1 -0
- package/dist/mock-data/index.js +9 -0
- package/dist/mock-data/index.js.map +1 -0
- package/dist/mock-data/inserter.d.ts +12 -0
- package/dist/mock-data/inserter.d.ts.map +1 -0
- package/dist/mock-data/inserter.js +57 -0
- package/dist/mock-data/inserter.js.map +1 -0
- package/dist/mock-data/recursive-generator.d.ts +4 -0
- package/dist/mock-data/recursive-generator.d.ts.map +1 -0
- package/dist/mock-data/recursive-generator.js +226 -0
- package/dist/mock-data/recursive-generator.js.map +1 -0
- package/dist/mock-data/related-ids-fetcher.d.ts +6 -0
- package/dist/mock-data/related-ids-fetcher.d.ts.map +1 -0
- package/dist/mock-data/related-ids-fetcher.js +60 -0
- package/dist/mock-data/related-ids-fetcher.js.map +1 -0
- package/dist/mock-data/schema-parser.d.ts +12 -0
- package/dist/mock-data/schema-parser.d.ts.map +1 -0
- package/dist/mock-data/schema-parser.js +73 -0
- package/dist/mock-data/schema-parser.js.map +1 -0
- package/dist/mock-data/types.d.ts +161 -0
- package/dist/mock-data/types.d.ts.map +1 -0
- package/dist/mock-data/types.js +2 -0
- package/dist/mock-data/types.js.map +1 -0
- package/dist/mock-data/utils.d.ts +7 -0
- package/dist/mock-data/utils.d.ts.map +1 -0
- package/dist/mock-data/utils.js +102 -0
- package/dist/mock-data/utils.js.map +1 -0
- package/dist/mock-data-gen.d.ts +227 -0
- package/dist/mock-data-gen.d.ts.map +1 -0
- package/dist/mock-data-gen.js +513 -0
- package/dist/mock-data-gen.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -45
- package/dist/server.js.map +1 -1
- package/dist/tools/get-projects.d.ts +5 -0
- package/dist/tools/get-projects.d.ts.map +1 -0
- package/dist/tools/get-projects.js +42 -0
- package/dist/tools/get-projects.js.map +1 -0
- package/dist/tools/get-schema.d.ts +6 -0
- package/dist/tools/get-schema.d.ts.map +1 -0
- package/dist/tools/get-schema.js +67 -0
- package/dist/tools/get-schema.js.map +1 -0
- package/dist/tools/index.d.ts +1 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +242 -21
- package/dist/tools/index.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
package/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Zion MCP Server
|
|
2
|
+
|
|
3
|
+
Zion MCP Server 是 [FunctorZ (Zion)](https://functorz.com) 提供的官方 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 服务端。它允许 Cursor、Claude Desktop 等 AI 助手直接连接到您的 Zion 项目,读取项目结构、数据模型和业务逻辑,从而提供更精准的 AI 辅助开发体验。
|
|
4
|
+
|
|
5
|
+
## ✨ 功能特性
|
|
6
|
+
|
|
7
|
+
- **项目深度集成**: 获取 Zion 项目的完整 Schema,包括数据模型 (Data Model)、行为流 (Action Flows)、API 定义等。
|
|
8
|
+
- **智能项目管理**: 支持模糊搜索项目,快速切换当前上下文。
|
|
9
|
+
- **安全认证**: 基于 OAuth 的安全认证机制,确保您的数据安全。
|
|
10
|
+
- **上下文感知**: 自动维护项目上下文,无需在每次请求时重复指定项目 ID。
|
|
11
|
+
|
|
12
|
+
## 🚀 快速开始
|
|
13
|
+
|
|
14
|
+
### 在 Cursor 中使用
|
|
15
|
+
|
|
16
|
+
1. 打开 Cursor 设置面板 (`Cmd + ,` 或 `Ctrl + ,`)。
|
|
17
|
+
2. 进入 **Features** -> **MCP**。
|
|
18
|
+
3. 点击 **Add New MCP Server**。
|
|
19
|
+
4. 填写以下信息:
|
|
20
|
+
- **Name**: Zion MCP
|
|
21
|
+
- **Type**: command
|
|
22
|
+
- **Command**: `npx -y zion-mcp`
|
|
23
|
+
5. 保存并重启 Cursor (如果需要)。
|
|
24
|
+
|
|
25
|
+
### 在 Claude Desktop 中使用
|
|
26
|
+
|
|
27
|
+
在您的 Claude Desktop 配置文件(通常位于 `~/Library/Application Support/Claude/claude_desktop_config.json`)中添加:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"zion": {
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["-y", "zion-mcp"]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 🛠️ 可用工具 (Tools)
|
|
41
|
+
|
|
42
|
+
连接成功后,AI 助手将获得以下能力:
|
|
43
|
+
|
|
44
|
+
- **`set_current_working_directory`**: 设置当前工作目录(通常自动处理)。
|
|
45
|
+
- **`get_projects`**: 搜索您的 Zion 项目列表。支持模糊搜索和分页。
|
|
46
|
+
- **`set_current_project`**: 设置当前操作的项目上下文。
|
|
47
|
+
- **`get_project_schema`**: 获取指定项目的详细 Schema 信息,帮助 AI 理解项目结构。
|
|
48
|
+
- **`reauth`**: 当 Token 过期时触发重新认证。
|
|
49
|
+
|
|
50
|
+
## 🔒 安全说明
|
|
51
|
+
|
|
52
|
+
首次使用时,MCP Server 会启动浏览器进行 OAuth 认证。认证 Token 会安全地存储在您的本地系统中。
|
|
53
|
+
|
|
54
|
+
## 🏗️ 什么是 Zion?
|
|
55
|
+
|
|
56
|
+
[Zion](https://functorz.com) 是新一代的**全栈无代码平台**,拥有专为 Headless 使用场景设计的强大后端。Zion 不仅提供可视化的全栈应用构建能力,其后端也可作为独立的 **Backend-as-a-Service (BaaS)** 使用,完美适配自定义前端开发。
|
|
57
|
+
|
|
58
|
+
### 为什么选择 Zion 作为 BaaS?
|
|
59
|
+
|
|
60
|
+
✅ **企业级 PostgreSQL** - 强大且符合 ACID 标准的关系型数据库
|
|
61
|
+
✅ **自动生成 GraphQL API** - 数据模型自动转化为类型安全的 GraphQL Schema
|
|
62
|
+
✅ **内置后端逻辑** - 通过行为流 (Actionflows) 可视化编排复杂业务逻辑,无需编写代码
|
|
63
|
+
✅ **原生 AI 集成** - 内置 AI Agent 支持,包含 RAG、工具调用及结构化输出能力
|
|
64
|
+
✅ **第三方 API 转发** - 支持导入 OpenAPI 规范,作为带认证的后端中继使用
|
|
65
|
+
✅ **微信/支付宝支付集成** - 原生支持主流支付渠道,轻松处理订阅与一次性支付
|
|
66
|
+
✅ **文件存储** - 图片及二进制文件管理,自带 CDN 加速
|
|
67
|
+
✅ **身份认证** - 内置基于 JWT 的用户管理体系
|
|
68
|
+
✅ **实时订阅** - 通过 GraphQL Subscriptions 支持 WebSocket 实时推送
|
|
69
|
+
✅ **可预测的定价** - 基于项目的定价模式,无单次请求计费烦恼
|
|
70
|
+
|
|
71
|
+
## 🔗 相关链接
|
|
72
|
+
|
|
73
|
+
- [Zion 官网](https://functorz.com)
|
|
74
|
+
- [Model Context Protocol](https://modelcontextprotocol.io/)
|
|
75
|
+
|
|
76
|
+
## 📖 更多资源
|
|
77
|
+
|
|
78
|
+
### Zion 文档
|
|
79
|
+
|
|
80
|
+
- [Zion 官方文档](https://docs.functorz.com/)
|
|
81
|
+
- [快速开始](https://docs.functorz.com/starts/)
|
|
82
|
+
- [数据库配置](https://docs.functorz.com/data/database/configuration/)
|
|
83
|
+
- [行为流 (Actionflow) 指南](https://docs.functorz.com/actions/actionflow/)
|
|
84
|
+
- [AI Agent 教程](https://docs.functorz.com/actions/zai/)
|
|
85
|
+
- [支付集成](https://docs.functorz.com/actions/payment/)
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
_注意:本工具仅供 Zion 用户辅助开发使用。_
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
import type { StoredCredentials, OAuthTokens, ProjectContext, MCPConfig } from "../types.js";
|
|
1
|
+
import type { StoredCredentials, OAuthTokens, ProjectContext, MCPConfig, DataVisualizerInfo } from "../types.js";
|
|
2
2
|
export declare class CredentialStore {
|
|
3
3
|
private workspaceRoot;
|
|
4
4
|
private mcpConfigDir;
|
|
5
5
|
private credentialsPath;
|
|
6
6
|
private configPath;
|
|
7
7
|
private projectContextPath;
|
|
8
|
+
private dataVisualizerPath;
|
|
8
9
|
constructor(workspaceRoot: string);
|
|
9
|
-
|
|
10
|
+
setWorkspaceRoot(workspaceRoot: string): void;
|
|
11
|
+
private ensureInitialized;
|
|
10
12
|
saveCredentials(credentials: OAuthTokens): Promise<void>;
|
|
11
13
|
loadCredentials(): Promise<StoredCredentials | null>;
|
|
12
|
-
/**
|
|
13
|
-
* Validate credentials including JWT token expiration
|
|
14
|
-
*/
|
|
15
14
|
private validateCredentials;
|
|
16
15
|
deleteCredentials(): Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* Check if current stored credentials are valid
|
|
19
|
-
* @returns true if credentials exist and are valid, false otherwise
|
|
20
|
-
*/
|
|
21
16
|
areCredentialsValid(): Promise<boolean>;
|
|
22
17
|
saveConfig(config: MCPConfig): Promise<void>;
|
|
23
18
|
loadConfig(): Promise<MCPConfig | null>;
|
|
@@ -26,5 +21,8 @@ export declare class CredentialStore {
|
|
|
26
21
|
deleteProjectContext(): Promise<void>;
|
|
27
22
|
getWorkspaceRoot(): string;
|
|
28
23
|
getMcpConfigDir(): string;
|
|
24
|
+
saveDataVisualizerInfo(projectExId: string, runtimeBackendAdminToken: string): Promise<void>;
|
|
25
|
+
loadDataVisualizerInfo(): Promise<DataVisualizerInfo | null>;
|
|
26
|
+
deleteDataVisualizerInfo(): Promise<void>;
|
|
29
27
|
}
|
|
30
28
|
//# sourceMappingURL=credential-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,SAAS,EACT,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAGrB,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,aAAa,EAAE,MAAM;IAejC,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;YAe/B,iBAAiB;IAezB,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BxD,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAqB1D,OAAO,CAAC,mBAAmB;IA8DrB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWlC,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAKvC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,UAAU,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAYvC,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtD,kBAAkB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAYpD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3C,gBAAgB,IAAI,MAAM;IAI1B,eAAe,IAAI,MAAM;IAInB,sBAAsB,CAC1B,WAAW,EAAE,MAAM,EACnB,wBAAwB,EAAE,MAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;IAmBV,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAY5D,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;CAUhD"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// src/auth/credential-store.ts
|
|
2
1
|
import { promises as fs } from "fs";
|
|
3
2
|
import path from "path";
|
|
4
3
|
import jwt from "jsonwebtoken";
|
|
@@ -9,14 +8,24 @@ export class CredentialStore {
|
|
|
9
8
|
credentialsPath;
|
|
10
9
|
configPath;
|
|
11
10
|
projectContextPath;
|
|
11
|
+
dataVisualizerPath;
|
|
12
12
|
constructor(workspaceRoot) {
|
|
13
13
|
this.workspaceRoot = workspaceRoot;
|
|
14
14
|
this.mcpConfigDir = path.join(workspaceRoot, `.${SERVER_NAME}`);
|
|
15
15
|
this.credentialsPath = path.join(this.mcpConfigDir, "credentials.json");
|
|
16
16
|
this.configPath = path.join(this.mcpConfigDir, "config.json");
|
|
17
17
|
this.projectContextPath = path.join(this.mcpConfigDir, "project-context.json");
|
|
18
|
+
this.dataVisualizerPath = path.join(this.mcpConfigDir, "data-visualizer.json");
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
+
setWorkspaceRoot(workspaceRoot) {
|
|
21
|
+
this.workspaceRoot = workspaceRoot;
|
|
22
|
+
this.mcpConfigDir = path.join(workspaceRoot, `.${SERVER_NAME}`);
|
|
23
|
+
this.credentialsPath = path.join(this.mcpConfigDir, "credentials.json");
|
|
24
|
+
this.configPath = path.join(this.mcpConfigDir, "config.json");
|
|
25
|
+
this.projectContextPath = path.join(this.mcpConfigDir, "project-context.json");
|
|
26
|
+
this.dataVisualizerPath = path.join(this.mcpConfigDir, "data-visualizer.json");
|
|
27
|
+
}
|
|
28
|
+
async ensureInitialized() {
|
|
20
29
|
await fs.mkdir(this.mcpConfigDir, { recursive: true });
|
|
21
30
|
const gitignorePath = path.join(this.mcpConfigDir, ".gitignore");
|
|
22
31
|
const gitignoreContent = "*";
|
|
@@ -24,14 +33,13 @@ export class CredentialStore {
|
|
|
24
33
|
await fs.writeFile(gitignorePath, gitignoreContent, { flag: "wx" });
|
|
25
34
|
}
|
|
26
35
|
catch (error) {
|
|
27
|
-
// Ignore if exists
|
|
28
36
|
if (error.code !== "EEXIST") {
|
|
29
37
|
throw error;
|
|
30
38
|
}
|
|
31
39
|
}
|
|
32
40
|
}
|
|
33
41
|
async saveCredentials(credentials) {
|
|
34
|
-
|
|
42
|
+
await this.ensureInitialized();
|
|
35
43
|
if (!credentials.access_token || credentials.access_token.trim() === "") {
|
|
36
44
|
throw new Error("Invalid credentials: access_token is required");
|
|
37
45
|
}
|
|
@@ -40,13 +48,11 @@ export class CredentialStore {
|
|
|
40
48
|
token_type: credentials.token_type || "Bearer",
|
|
41
49
|
savedAt: new Date().toISOString(),
|
|
42
50
|
};
|
|
43
|
-
// Validate the credentials object
|
|
44
51
|
if (!this.validateCredentials(data)) {
|
|
45
52
|
throw new Error("Invalid credentials: JWT token validation failed");
|
|
46
53
|
}
|
|
47
54
|
const tempPath = `${this.credentialsPath}.tmp`;
|
|
48
|
-
await fs.writeFile(tempPath, JSON.stringify(data, null, 2), { mode: 0o600 }
|
|
49
|
-
);
|
|
55
|
+
await fs.writeFile(tempPath, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
50
56
|
await fs.rename(tempPath, this.credentialsPath);
|
|
51
57
|
console.error("[CredentialStore] Credentials saved successfully");
|
|
52
58
|
}
|
|
@@ -54,7 +60,6 @@ export class CredentialStore {
|
|
|
54
60
|
try {
|
|
55
61
|
const data = await fs.readFile(this.credentialsPath, "utf8");
|
|
56
62
|
const credentials = JSON.parse(data);
|
|
57
|
-
// Validate credentials before returning
|
|
58
63
|
if (!this.validateCredentials(credentials)) {
|
|
59
64
|
console.error("[CredentialStore] Stored credentials are invalid or expired");
|
|
60
65
|
return null;
|
|
@@ -63,49 +68,40 @@ export class CredentialStore {
|
|
|
63
68
|
}
|
|
64
69
|
catch (error) {
|
|
65
70
|
if (error.code === "ENOENT") {
|
|
66
|
-
return null;
|
|
71
|
+
return null;
|
|
67
72
|
}
|
|
68
73
|
throw error;
|
|
69
74
|
}
|
|
70
75
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Validate credentials including JWT token expiration
|
|
73
|
-
*/
|
|
74
76
|
validateCredentials(credentials) {
|
|
75
|
-
// Check if credentials object is valid
|
|
76
77
|
if (!credentials || !credentials.access_token) {
|
|
77
78
|
console.error("[CredentialStore] Missing access token");
|
|
78
79
|
return false;
|
|
79
80
|
}
|
|
80
|
-
// Check token type
|
|
81
81
|
if (credentials.token_type !== "Bearer") {
|
|
82
82
|
console.error("[CredentialStore] Invalid token type:", credentials.token_type);
|
|
83
83
|
return false;
|
|
84
84
|
}
|
|
85
|
-
// Decode and validate JWT token
|
|
86
85
|
try {
|
|
87
86
|
const decoded = jwt.decode(credentials.access_token, { complete: true });
|
|
88
87
|
if (!decoded || typeof decoded === "string") {
|
|
89
88
|
console.error("[CredentialStore] Failed to decode JWT token");
|
|
90
89
|
return false;
|
|
91
90
|
}
|
|
92
|
-
// Check if token has expired
|
|
93
91
|
const payload = decoded.payload;
|
|
94
92
|
if (payload.exp) {
|
|
95
|
-
const expirationTime = payload.exp * 1000;
|
|
93
|
+
const expirationTime = payload.exp * 1000;
|
|
96
94
|
const currentTime = Date.now();
|
|
97
95
|
if (currentTime >= expirationTime) {
|
|
98
96
|
console.error("[CredentialStore] JWT token has expired");
|
|
99
97
|
return false;
|
|
100
98
|
}
|
|
101
|
-
|
|
102
|
-
const timeUntilExpiry = Math.floor((expirationTime - currentTime) / 1000 / 60); // minutes
|
|
99
|
+
const timeUntilExpiry = Math.floor((expirationTime - currentTime) / 1000 / 60);
|
|
103
100
|
console.error(`[CredentialStore] Token valid for ${timeUntilExpiry} more minutes`);
|
|
104
101
|
}
|
|
105
102
|
else {
|
|
106
103
|
console.warn("[CredentialStore] JWT token does not have expiration field");
|
|
107
104
|
}
|
|
108
|
-
// Optionally validate other JWT claims
|
|
109
105
|
if (payload.iss) {
|
|
110
106
|
console.error(`[CredentialStore] Token issued by: ${payload.iss}`);
|
|
111
107
|
}
|
|
@@ -130,15 +126,12 @@ export class CredentialStore {
|
|
|
130
126
|
}
|
|
131
127
|
}
|
|
132
128
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Check if current stored credentials are valid
|
|
135
|
-
* @returns true if credentials exist and are valid, false otherwise
|
|
136
|
-
*/
|
|
137
129
|
async areCredentialsValid() {
|
|
138
130
|
const credentials = await this.loadCredentials();
|
|
139
131
|
return credentials !== null;
|
|
140
132
|
}
|
|
141
133
|
async saveConfig(config) {
|
|
134
|
+
await this.ensureInitialized();
|
|
142
135
|
await fs.writeFile(this.configPath, JSON.stringify(config, null, 2));
|
|
143
136
|
}
|
|
144
137
|
async loadConfig() {
|
|
@@ -148,12 +141,13 @@ export class CredentialStore {
|
|
|
148
141
|
}
|
|
149
142
|
catch (error) {
|
|
150
143
|
if (error.code === "ENOENT") {
|
|
151
|
-
return null;
|
|
144
|
+
return null;
|
|
152
145
|
}
|
|
153
146
|
throw error;
|
|
154
147
|
}
|
|
155
148
|
}
|
|
156
149
|
async saveProjectContext(projectExId) {
|
|
150
|
+
await this.ensureInitialized();
|
|
157
151
|
const context = {
|
|
158
152
|
projectExId,
|
|
159
153
|
lastUsed: new Date().toISOString(),
|
|
@@ -169,7 +163,7 @@ export class CredentialStore {
|
|
|
169
163
|
}
|
|
170
164
|
catch (error) {
|
|
171
165
|
if (error.code === "ENOENT") {
|
|
172
|
-
return null;
|
|
166
|
+
return null;
|
|
173
167
|
}
|
|
174
168
|
throw error;
|
|
175
169
|
}
|
|
@@ -190,5 +184,42 @@ export class CredentialStore {
|
|
|
190
184
|
getMcpConfigDir() {
|
|
191
185
|
return this.mcpConfigDir;
|
|
192
186
|
}
|
|
187
|
+
async saveDataVisualizerInfo(projectExId, runtimeBackendAdminToken) {
|
|
188
|
+
await this.ensureInitialized();
|
|
189
|
+
const info = {
|
|
190
|
+
projectExId,
|
|
191
|
+
runtimeBackendAdminToken,
|
|
192
|
+
savedAt: new Date().toISOString(),
|
|
193
|
+
};
|
|
194
|
+
const tempPath = `${this.dataVisualizerPath}.tmp`;
|
|
195
|
+
await fs.writeFile(tempPath, JSON.stringify(info, null, 2), {
|
|
196
|
+
mode: 0o600,
|
|
197
|
+
});
|
|
198
|
+
await fs.rename(tempPath, this.dataVisualizerPath);
|
|
199
|
+
console.error("[CredentialStore] Runtime backend admin token saved successfully for project:", projectExId);
|
|
200
|
+
}
|
|
201
|
+
async loadDataVisualizerInfo() {
|
|
202
|
+
try {
|
|
203
|
+
const data = await fs.readFile(this.dataVisualizerPath, "utf8");
|
|
204
|
+
return JSON.parse(data);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (error.code === "ENOENT") {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async deleteDataVisualizerInfo() {
|
|
214
|
+
try {
|
|
215
|
+
await fs.unlink(this.dataVisualizerPath);
|
|
216
|
+
console.error("[CredentialStore] Data visualizer info deleted");
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (error.code !== "ENOENT") {
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
193
224
|
}
|
|
194
225
|
//# sourceMappingURL=credential-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-auth.d.ts","sourceRoot":"","sources":["../../src/auth/jwt-auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jwt-auth.d.ts","sourceRoot":"","sources":["../../src/auth/jwt-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1D,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAIvB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBtD,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IA4F1C,WAAW,IAAI,MAAM;IAyDrB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAmDnC"}
|
package/dist/auth/jwt-auth.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// src/auth/jwt-auth.ts
|
|
2
1
|
import { createServer } from "http";
|
|
3
2
|
import open from "open";
|
|
4
3
|
export class JwtAuth {
|
|
@@ -12,7 +11,6 @@ export class JwtAuth {
|
|
|
12
11
|
const server = createServer();
|
|
13
12
|
server.on("error", (err) => {
|
|
14
13
|
if (err.code === "EADDRINUSE") {
|
|
15
|
-
// Try next port
|
|
16
14
|
resolve(this.findAvailablePort(port + 1));
|
|
17
15
|
}
|
|
18
16
|
else {
|
|
@@ -27,12 +25,10 @@ export class JwtAuth {
|
|
|
27
25
|
});
|
|
28
26
|
}
|
|
29
27
|
async authenticate() {
|
|
30
|
-
// Find available port
|
|
31
28
|
const callbackPort = await this.findAvailablePort();
|
|
32
29
|
const redirectUri = `http://localhost:${callbackPort}/callback`;
|
|
33
30
|
console.error(`[JwtAuth] Using callback URL: ${redirectUri}`);
|
|
34
31
|
console.error(`[JwtAuth] Opening browser for authentication...`);
|
|
35
|
-
// Start callback server and wait for JWT token
|
|
36
32
|
const jwtToken = await new Promise((resolve, reject) => {
|
|
37
33
|
const server = createServer(async (req, res) => {
|
|
38
34
|
if (!req.url) {
|
|
@@ -40,9 +36,7 @@ export class JwtAuth {
|
|
|
40
36
|
}
|
|
41
37
|
const url = new URL(req.url, `http://localhost:${callbackPort}`);
|
|
42
38
|
if (url.pathname === "/callback") {
|
|
43
|
-
// Log the full callback URL for debugging
|
|
44
39
|
console.error(`[JwtAuth] Callback received: ${req.url}`);
|
|
45
|
-
// Extract token parameter (the JWT token)
|
|
46
40
|
const token = url.searchParams.get("token");
|
|
47
41
|
if (!token || token.trim() === "") {
|
|
48
42
|
console.error("[JwtAuth] No token parameter found in callback URL");
|
|
@@ -58,7 +52,6 @@ export class JwtAuth {
|
|
|
58
52
|
const html = this.successPage();
|
|
59
53
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
60
54
|
res.end(html);
|
|
61
|
-
// Close server after short delay to ensure response is sent
|
|
62
55
|
setTimeout(() => {
|
|
63
56
|
server.close();
|
|
64
57
|
resolve(token);
|
|
@@ -67,11 +60,9 @@ export class JwtAuth {
|
|
|
67
60
|
});
|
|
68
61
|
server.on("error", reject);
|
|
69
62
|
server.listen(callbackPort, async () => {
|
|
70
|
-
// Build authentication URL with redirect_uri parameter
|
|
71
63
|
const authUrl = new URL(this.config.authEndpoint);
|
|
72
64
|
authUrl.searchParams.set("redirect_uri", redirectUri);
|
|
73
65
|
console.error(`[JwtAuth] Opening: ${authUrl.toString()}`);
|
|
74
|
-
// Open browser
|
|
75
66
|
try {
|
|
76
67
|
await open(authUrl.toString());
|
|
77
68
|
}
|
|
@@ -81,14 +72,12 @@ export class JwtAuth {
|
|
|
81
72
|
console.error(authUrl.toString());
|
|
82
73
|
}
|
|
83
74
|
});
|
|
84
|
-
// Timeout after 5 minutes
|
|
85
75
|
setTimeout(() => {
|
|
86
76
|
server.close();
|
|
87
77
|
reject(new Error("Authentication timeout - no response after 5 minutes"));
|
|
88
78
|
}, 300000);
|
|
89
79
|
});
|
|
90
80
|
console.error("[JwtAuth] JWT token received successfully");
|
|
91
|
-
// Return the JWT token directly as the access token
|
|
92
81
|
return {
|
|
93
82
|
access_token: jwtToken,
|
|
94
83
|
token_type: "Bearer",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-auth.js","sourceRoot":"","sources":["../../src/auth/jwt-auth.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"jwt-auth.js","sourceRoot":"","sources":["../../src/auth/jwt-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MCPConfig, OAuthTokens } from '../types.js';
|
|
2
|
+
export declare class OAuthFlow {
|
|
3
|
+
private config;
|
|
4
|
+
constructor(config: MCPConfig);
|
|
5
|
+
findAvailablePort(startPort?: number): Promise<number>;
|
|
6
|
+
authenticate(): Promise<OAuthTokens>;
|
|
7
|
+
successPage(): string;
|
|
8
|
+
errorPage(message: string): string;
|
|
9
|
+
private escapeHtml;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=oauth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1D,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAIvB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBtD,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IA0F1C,WAAW,IAAI,MAAM;IAkFrB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IA4ClC,OAAO,CAAC,UAAU;CAUnB"}
|