monacloud-mcp 0.1.0 → 0.1.2
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 +11 -11
- package/STATUS.md +3 -2
- package/dist/auth.js +6 -6
- package/dist/clients.js +4 -4
- package/dist/config.js +1 -1
- package/dist/monapay.js +1 -1
- package/dist/server.js +7 -7
- package/docs/ai-agent.md +4 -4
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# monacloud-mcp
|
|
2
2
|
|
|
3
|
-
`monacloud-mcp` là MCP hợp nhất của MONA Cloud: cài một lần, đăng nhập một MONA
|
|
3
|
+
`monacloud-mcp` là MCP hợp nhất của MONA Cloud: cài một lần, đăng nhập một MONA Pass và dùng chung ví VND để quản lý MONA Cloud, provision VibeCloud, tích hợp MONA Pay và đọc catalog MONA Agent ngay trong Claude Code, Codex hoặc Cursor.
|
|
4
4
|
|
|
5
5
|
Human chỉ cần đăng ký, nạp tiền và cung cấp OTP/KYC khi bắt buộc. Các bước tạo tài nguyên, đọc trạng thái, cấu hình webhook, test và deploy được thiết kế để AI agent làm qua MCP.
|
|
6
6
|
|
|
7
7
|
## Yêu cầu
|
|
8
8
|
|
|
9
9
|
- Node.js 20 trở lên.
|
|
10
|
-
- Một MONA
|
|
11
|
-
- MONA
|
|
10
|
+
- Một MONA Pass có quyền dùng client `monacloud-mcp`.
|
|
11
|
+
- MONA Pass, Billing, VibeCloud và MONA Pay đã được cấu hình theo môi trường triển khai.
|
|
12
12
|
|
|
13
13
|
## Cài và đăng nhập
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ Human chỉ cần đăng ký, nạp tiền và cung cấp OTP/KYC khi bắt bu
|
|
|
18
18
|
npx -y monacloud-mcp login
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
Lệnh in URL tại `
|
|
21
|
+
Lệnh in URL tại `pass.monacloud.vn` và mã thiết bị. Sau khi xác nhận, offline refresh token được lưu tại `~/.config/monacloud/token.json`; thư mục có mode `0700`, file có mode `0600`. Server tự refresh access token và không in token ra log.
|
|
22
22
|
|
|
23
23
|
Kiểm tra hoặc đăng xuất:
|
|
24
24
|
|
|
@@ -64,7 +64,7 @@ Tên tool dùng `snake_case` để giữ tương thích với prompt MONA Pay c
|
|
|
64
64
|
|
|
65
65
|
| Tool | Công dụng |
|
|
66
66
|
|---|---|
|
|
67
|
-
| `cloud_whoami` | Hồ sơ MONA
|
|
67
|
+
| `cloud_whoami` | Hồ sơ MONA Pass hiện tại |
|
|
68
68
|
| `cloud_balance` | Số dư ví VND chung |
|
|
69
69
|
| `cloud_ledger` | Ledger nạp/trừ/hoàn tiền có cursor |
|
|
70
70
|
| `cloud_topup(amount)` | Tạo yêu cầu nạp, trả `qr_data_url` và hướng dẫn VietQR |
|
|
@@ -84,13 +84,13 @@ Tên tool dùng `snake_case` để giữ tương thích với prompt MONA Pay c
|
|
|
84
84
|
- email notification, verification, suppression và log;
|
|
85
85
|
- xoay key, kiểm chữ ký HMAC và sinh code mẫu webhook.
|
|
86
86
|
|
|
87
|
-
Các tên cũ như `monapay_create_qr`, `monapay_link_bank_start`, `monapay_create_webhook` được giữ nguyên. `monapay_link` là adapter chuyển tiếp: đổi MONA
|
|
87
|
+
Các tên cũ như `monapay_create_qr`, `monapay_link_bank_start`, `monapay_create_webhook` được giữ nguyên. `monapay_link` là adapter chuyển tiếp: đổi MONA Pass thành `client_id/client_secret` rồi cache kín ở `~/.config/monacloud/links.json`. Adapter này sẽ được bỏ khi MONA Pay nhận JWT MONA Pass trực tiếp.
|
|
88
88
|
|
|
89
89
|
### VibeCloud
|
|
90
90
|
|
|
91
91
|
| Tool | Công dụng |
|
|
92
92
|
|---|---|
|
|
93
|
-
| `vibecloud_link` | Xác nhận direct MONA
|
|
93
|
+
| `vibecloud_link` | Xác nhận direct MONA Pass; chỉ đổi sang `vc_live_*` nếu upstream còn ở chế độ cũ |
|
|
94
94
|
| `vibecloud_create_vps` | Tạo LXC theo `package_slug` hoặc CPU/RAM/đĩa |
|
|
95
95
|
| `vibecloud_create_database` | Tạo MongoDB, PostgreSQL hoặc MySQL |
|
|
96
96
|
| `vibecloud_job_status` | Poll job tới trạng thái cuối, có timeout |
|
|
@@ -110,7 +110,7 @@ Các tên cũ như `monapay_create_qr`, `monapay_link_bank_start`, `monapay_crea
|
|
|
110
110
|
## Resource và prompt
|
|
111
111
|
|
|
112
112
|
- `monacloud://llms`: mô tả máy đọc của toàn stack MONA Cloud.
|
|
113
|
-
- `monacloud://status`: health tổng hợp MONA
|
|
113
|
+
- `monacloud://status`: health tổng hợp MONA Pass, Billing, VibeCloud và MONA Pay.
|
|
114
114
|
- Prompt `dung-app-ban-hang-monacloud`: chuỗi VPS → database → VA/QR → webhook → deploy, chỉ dừng để hỏi nạp tiền hoặc OTP bắt buộc.
|
|
115
115
|
|
|
116
116
|
## Spend guard và lỗi cho AI
|
|
@@ -150,7 +150,7 @@ Chi tiết dành riêng cho agent: [`docs/ai-agent.md`](docs/ai-agent.md).
|
|
|
150
150
|
|
|
151
151
|
| Biến | Mặc định | Ý nghĩa |
|
|
152
152
|
|---|---|---|
|
|
153
|
-
| `MONACLOUD_ISSUER` | `https://
|
|
153
|
+
| `MONACLOUD_ISSUER` | `https://pass.monacloud.vn/realms/mona` | OIDC issuer |
|
|
154
154
|
| `MONACLOUD_BILLING_URL` | `https://billing.monacloud.vn` | Billing/ví API |
|
|
155
155
|
| `MONAPAY_API` | `https://api.monapay.vn` | MONA Pay API |
|
|
156
156
|
| `VIBECLOUD_API` | `https://api.vibecloud.vn` | VibeCloud API |
|
|
@@ -160,9 +160,9 @@ Chi tiết dành riêng cho agent: [`docs/ai-agent.md`](docs/ai-agent.md).
|
|
|
160
160
|
| `MONACLOUD_TEMPLATES_DIR` | `~/monacloud/templates` | Catalog agent local |
|
|
161
161
|
| `MONACLOUD_TEMPLATES_URL` | — | Catalog JSON từ xa, chỉ dùng khi local không có |
|
|
162
162
|
| `MONAPAY_LINK_PATH` | `/api/v1/client/oauth/mona-id/link` | Endpoint adapter chuyển tiếp |
|
|
163
|
-
| `VIBECLOUD_LINK_PATH` | `/api/auth/monaid/link` | Endpoint adapter cũ, chỉ gọi khi direct MONA
|
|
163
|
+
| `VIBECLOUD_LINK_PATH` | `/api/auth/monaid/link` | Endpoint adapter cũ, chỉ gọi khi direct MONA Pass bị từ chối |
|
|
164
164
|
|
|
165
|
-
`MONAPAY_CLIENT_ID` + `MONAPAY_CLIENT_SECRET` và `VIBECLOUD_API_TOKEN` chỉ là đường tương thích trong giai đoạn migrate. `logout` xoá cả token store lẫn linked credential cache; luồng đích là một MONA
|
|
165
|
+
`MONAPAY_CLIENT_ID` + `MONAPAY_CLIENT_SECRET` và `VIBECLOUD_API_TOKEN` chỉ là đường tương thích trong giai đoạn migrate. `logout` xoá cả token store lẫn linked credential cache; luồng đích là một MONA Pass.
|
|
166
166
|
|
|
167
167
|
## Phát triển offline
|
|
168
168
|
|
package/STATUS.md
CHANGED
|
@@ -35,7 +35,7 @@ Không chạy `npm install`; toàn bộ build/test dùng `node_modules` có sẵ
|
|
|
35
35
|
## Boundary chuyển tiếp đã ghi rõ
|
|
36
36
|
|
|
37
37
|
- `monapay_link` mặc định gọi `/api/v1/client/oauth/mona-id/link`; đổi bằng `MONAPAY_LINK_PATH` nếu upstream chốt path khác. Adapter cache client credential và sẽ bị bỏ khi MONA Pay nhận JWT trực tiếp.
|
|
38
|
-
- `vibecloud_link` thử Bearer MONA
|
|
38
|
+
- `vibecloud_link` thử Bearer MONA Pass trực tiếp trước; chỉ khi upstream trả 401/403 mới gọi adapter `/api/auth/monaid/link` (đổi bằng `VIBECLOUD_LINK_PATH`). Tool nghiệp vụ luôn giữ nguyên tên.
|
|
39
39
|
- `vibecloud_agent_deploy` và `agent_deploy` là stub được brief yêu cầu tới khi runtime MONA Agent được phát hành; response không báo thành công giả.
|
|
40
40
|
- Chưa chạy smoke production vì phiên này offline và không được cấp token/endpoint production. Unit/integration local đã phủ wire contract chính.
|
|
41
41
|
|
|
@@ -43,6 +43,7 @@ CODEX DONE
|
|
|
43
43
|
|
|
44
44
|
## QC Claude (03/09 tối) — ZERO-DASHBOARD TEST LOCAL: PASS
|
|
45
45
|
- Build tsc sạch · `node --test` 7/7 · stdio thật: **72 tool** (cloud 10 · monapay 48 · vibecloud 11 · agent 3), 2 resource, 1 prompt.
|
|
46
|
-
- E2E thật với Keycloak local (`MONACLOUD_ISSUER=http://127.0.0.1:8180/realms/mona`) + billing (`MONACLOUD_BILLING_URL=http://127.0.0.1:8191`): `monacloud-mcp login` → mã thiết bị → đăng nhập + màn "Cấp quyền" của MONA ID → `token.json` 0600 → `cloud_whoami` (userinfo thật) → `cloud_balance` 0đ (ví JIT) → `cloud_ledger` → `cloud_budget_get`. **Một token, không chạm dashboard.**
|
|
46
|
+
- E2E thật với Keycloak local (`MONACLOUD_ISSUER=http://127.0.0.1:8180/realms/mona`) + billing (`MONACLOUD_BILLING_URL=http://127.0.0.1:8191`): `monacloud-mcp login` → mã thiết bị → đăng nhập + màn "Cấp quyền" của MONA ID → `token.json` 0600 → `cloud_whoami` (userinfo thật) → `cloud_balance` 0đ (ví JIT) → `cloud_ledger` → `cloud_budget_get`. **Một token, không chạm dashboard.** *(Log 03/09 giữ tên cũ; tên hiện tại: MONA Pass.)*
|
|
47
47
|
- Lưu ý test tự động: trang consent Keycloak có form action TƯƠNG ĐỐI (`/realms/mona/login-actions/consent?...`) → script phải ghép host; urllib Python rớt cookie ở hop 302 → dùng curl cookie jar.
|
|
48
48
|
- Chưa: publish npm (`npm publish` — Claude làm khi deploy), `monapay_link`/`vibecloud_link` chờ endpoint link phía sản phẩm (gói E monapay, brief VIBECLOUD-MONAID đã có `/api/auth/monaid/link`).
|
|
49
|
+
- 04/09: publish npm `monacloud-mcp` 0.1.0 rồi 0.1.1 (sửa dep monapay-mcp ^0.3.0 → ^0.5.5 vì 0.5.x không khớp ^0.3).
|
package/dist/auth.js
CHANGED
|
@@ -26,7 +26,7 @@ async function writePrivateJson(path, directory, value) {
|
|
|
26
26
|
function tokenFromResponse(value, previousRefreshToken) {
|
|
27
27
|
const body = asObject(value);
|
|
28
28
|
if (typeof body.access_token !== 'string' || !body.access_token) {
|
|
29
|
-
throw new CloudError('invalid_token_response', 'MONA
|
|
29
|
+
throw new CloudError('invalid_token_response', 'MONA Pass không trả access_token.', 'Kiểm tra cấu hình client `monacloud-mcp` trên MONA Pass rồi đăng nhập lại.');
|
|
30
30
|
}
|
|
31
31
|
const expiresIn = typeof body.expires_in === 'number' ? body.expires_in : 300;
|
|
32
32
|
return {
|
|
@@ -51,7 +51,7 @@ async function postForm(url, form, fetchImpl) {
|
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
catch (error) {
|
|
54
|
-
throw new CloudError('network_error', `Không kết nối được MONA
|
|
54
|
+
throw new CloudError('network_error', `Không kết nối được MONA Pass: ${error instanceof Error ? error.message : String(error)}`, 'Kiểm tra MONACLOUD_ISSUER và kết nối mạng rồi thử lại.');
|
|
55
55
|
}
|
|
56
56
|
const body = asObject(await response.json().catch(() => ({})));
|
|
57
57
|
return { response, body };
|
|
@@ -108,7 +108,7 @@ export class AuthManager {
|
|
|
108
108
|
refresh_token: token.refresh_token,
|
|
109
109
|
}, this.fetchImpl);
|
|
110
110
|
if (!response.ok) {
|
|
111
|
-
throw new CloudError('refresh_failed', typeof body.error_description === 'string' ? body.error_description : 'Không refresh được token MONA
|
|
111
|
+
throw new CloudError('refresh_failed', typeof body.error_description === 'string' ? body.error_description : 'Không refresh được token MONA Pass.', 'Chạy `monacloud-mcp login` để đăng nhập lại.', { status: response.status });
|
|
112
112
|
}
|
|
113
113
|
const refreshed = tokenFromResponse(body, token.refresh_token);
|
|
114
114
|
await this.saveToken(refreshed);
|
|
@@ -119,7 +119,7 @@ export class AuthManager {
|
|
|
119
119
|
return this.env.MONACLOUD_TOKEN;
|
|
120
120
|
const stored = await this.loadToken();
|
|
121
121
|
if (!stored) {
|
|
122
|
-
throw new CloudError('login_required', 'Chưa có token MONA
|
|
122
|
+
throw new CloudError('login_required', 'Chưa có token MONA Pass trên máy.', 'Chạy `monacloud-mcp login`, hoàn tất mã thiết bị rồi gọi lại tool.');
|
|
123
123
|
}
|
|
124
124
|
if (stored.expires_at > Date.now() + 30_000)
|
|
125
125
|
return stored.access_token;
|
|
@@ -147,11 +147,11 @@ export class AuthManager {
|
|
|
147
147
|
if (!started.response.ok) {
|
|
148
148
|
throw new CloudError('device_flow_unavailable', typeof started.body.error_description === 'string'
|
|
149
149
|
? started.body.error_description
|
|
150
|
-
: 'MONA
|
|
150
|
+
: 'MONA Pass không khởi tạo được device flow.', 'Kiểm tra client `monacloud-mcp` đã bật OAuth 2.0 Device Authorization Grant.', { status: started.response.status });
|
|
151
151
|
}
|
|
152
152
|
const device = started.body;
|
|
153
153
|
if (!device.device_code || !device.user_code || !device.verification_uri) {
|
|
154
|
-
throw new CloudError('invalid_device_response', 'MONA
|
|
154
|
+
throw new CloudError('invalid_device_response', 'MONA Pass trả device-flow response không hợp lệ.', 'Kiểm tra cấu hình MONA Pass rồi thử lại.');
|
|
155
155
|
}
|
|
156
156
|
output('Đăng nhập MONA Cloud');
|
|
157
157
|
output(`Mở: ${device.verification_uri_complete || device.verification_uri}`);
|
package/dist/clients.js
CHANGED
|
@@ -100,7 +100,7 @@ export class CloudClients {
|
|
|
100
100
|
linked: true,
|
|
101
101
|
product: 'vibecloud',
|
|
102
102
|
mode: 'direct_mona_id',
|
|
103
|
-
next_step: 'VibeCloud đã nhận MONA
|
|
103
|
+
next_step: 'VibeCloud đã nhận MONA Pass trực tiếp; không cần cache vc_live token.',
|
|
104
104
|
};
|
|
105
105
|
}
|
|
106
106
|
catch (error) {
|
|
@@ -117,7 +117,7 @@ export class CloudClients {
|
|
|
117
117
|
const data = asObject(unwrapData(value));
|
|
118
118
|
const token = pickString([data, root], ['api_token', 'access_token', 'token', 'vibecloud_token']);
|
|
119
119
|
if (!token) {
|
|
120
|
-
throw new CloudError('invalid_link_response', 'VibeCloud không trả automation token sau khi liên kết.', 'Kiểm tra endpoint chuyển tiếp MONA
|
|
120
|
+
throw new CloudError('invalid_link_response', 'VibeCloud không trả automation token sau khi liên kết.', 'Kiểm tra endpoint chuyển tiếp MONA Pass của VibeCloud rồi gọi lại vibecloud_link.');
|
|
121
121
|
}
|
|
122
122
|
const expiresIn = Number(data.expires_in ?? root.expires_in);
|
|
123
123
|
const links = await readLinks(this.config);
|
|
@@ -127,7 +127,7 @@ export class CloudClients {
|
|
|
127
127
|
linked_at: new Date().toISOString(),
|
|
128
128
|
};
|
|
129
129
|
await writeLinks(this.config, links);
|
|
130
|
-
return { linked: true, product: 'vibecloud', next_step: 'Dùng các tool vibecloud_* bằng cùng MONA
|
|
130
|
+
return { linked: true, product: 'vibecloud', next_step: 'Dùng các tool vibecloud_* bằng cùng MONA Pass.' };
|
|
131
131
|
}
|
|
132
132
|
async monapayLink() {
|
|
133
133
|
const value = await requestJson(`${this.config.monapayApi}${this.config.monapayLinkPath}`, {
|
|
@@ -146,7 +146,7 @@ export class CloudClients {
|
|
|
146
146
|
const links = await readLinks(this.config);
|
|
147
147
|
links.monapay = { client_id: clientId, client_secret: clientSecret, linked_at: new Date().toISOString() };
|
|
148
148
|
await writeLinks(this.config, links);
|
|
149
|
-
return { linked: true, product: 'monapay', next_step: 'Dùng các tool monapay_* bằng cùng MONA
|
|
149
|
+
return { linked: true, product: 'monapay', next_step: 'Dùng các tool monapay_* bằng cùng MONA Pass.' };
|
|
150
150
|
}
|
|
151
151
|
prices() {
|
|
152
152
|
return requestJson(`${this.config.vibecloudApi}/api/prices`, { fetchImpl: this.fetchImpl });
|
package/dist/config.js
CHANGED
|
@@ -5,7 +5,7 @@ export function readConfig(env = process.env) {
|
|
|
5
5
|
const configDir = env.MONACLOUD_CONFIG_DIR
|
|
6
6
|
|| join(env.XDG_CONFIG_HOME || join(homedir(), '.config'), 'monacloud');
|
|
7
7
|
return {
|
|
8
|
-
issuer: cleanBaseUrl(env.MONACLOUD_ISSUER || 'https://
|
|
8
|
+
issuer: cleanBaseUrl(env.MONACLOUD_ISSUER || 'https://pass.monacloud.vn/realms/mona'),
|
|
9
9
|
billingUrl: cleanBaseUrl(env.MONACLOUD_BILLING_URL || 'https://billing.monacloud.vn'),
|
|
10
10
|
monapayApi: cleanBaseUrl(env.MONAPAY_API || env.MONAPAY_BASE_URL || 'https://api.monapay.vn'),
|
|
11
11
|
vibecloudApi: cleanBaseUrl(env.VIBECLOUD_API || env.VIBECLOUD_API_URL || 'https://api.vibecloud.vn'),
|
package/dist/monapay.js
CHANGED
|
@@ -31,7 +31,7 @@ export function createMonaPayClient(config, env = process.env, fetchImpl = fetch
|
|
|
31
31
|
fetchImpl,
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
|
-
throw new CloudError('monapay_link_required', 'MONA Pay đang ở giai đoạn chuyển tiếp và chưa được liên kết với MONA
|
|
34
|
+
throw new CloudError('monapay_link_required', 'MONA Pay đang ở giai đoạn chuyển tiếp và chưa được liên kết với MONA Pass này.', 'Gọi monapay_link một lần; nếu hệ thống yêu cầu OTP thì hoàn tất OTP rồi thử lại.');
|
|
35
35
|
}
|
|
36
36
|
export function importedMonaPayTools(config, env = process.env, fetchImpl = fetch) {
|
|
37
37
|
const imported = createMonaPayServer(() => createMonaPayClient(config, env, fetchImpl));
|
package/dist/server.js
CHANGED
|
@@ -8,7 +8,7 @@ import { errorResult, runTool, textResult, toAgentError } from './errors.js';
|
|
|
8
8
|
import { requestJson, unwrapData } from './http.js';
|
|
9
9
|
import { createMonaPayClient, importedMonaPayTools, normalizeImportedResult } from './monapay.js';
|
|
10
10
|
import { TemplateCatalog } from './templates.js';
|
|
11
|
-
const ENTITY = 'MONA Cloud là hệ công cụ cho vibecoder Việt Nam: một MONA
|
|
11
|
+
const ENTITY = 'MONA Cloud là hệ công cụ cho vibecoder Việt Nam: một MONA Pass, một ví VND và một MCP để deploy VibeCloud, thu tiền MONA Pay và chạy các sản phẩm MONA.';
|
|
12
12
|
const TERMINAL_JOBS = new Set(['succeeded', 'failed', 'cancelled']);
|
|
13
13
|
const asObject = (value) => (value && typeof value === 'object' ? value : {});
|
|
14
14
|
function collection(value) {
|
|
@@ -84,7 +84,7 @@ export function createServer(dependencies = {}) {
|
|
|
84
84
|
const server = new McpServer({ name: 'monacloud-mcp', version: '0.1.0' }, { instructions: `${ENTITY}\nDùng cloud_* cho tài khoản/ví, vibecloud_* cho hạ tầng, monapay_* cho thu tiền và agent_* cho catalog. Không bao giờ yêu cầu mật khẩu sản phẩm. Chỉ dừng hỏi người dùng khi cần nạp tiền, OTP ngân hàng hoặc KYC bắt buộc.` });
|
|
85
85
|
server.registerTool('cloud_whoami', {
|
|
86
86
|
title: 'Tài khoản MONA Cloud',
|
|
87
|
-
description: 'Xác minh MONA
|
|
87
|
+
description: 'Xác minh MONA Pass hiện tại. / Return the current MONA Pass profile.',
|
|
88
88
|
}, () => runTool(async () => ({ ...(await auth.userinfo()), console_url: config.consoleUrl })));
|
|
89
89
|
server.registerTool('cloud_balance', {
|
|
90
90
|
title: 'Số dư ví MONA Cloud',
|
|
@@ -175,11 +175,11 @@ export function createServer(dependencies = {}) {
|
|
|
175
175
|
}, () => textResult({ url: config.consoleUrl, next_step: `Mở ${config.consoleUrl} trong trình duyệt.` }));
|
|
176
176
|
server.registerTool('monapay_link', {
|
|
177
177
|
title: 'Liên kết MONA Pay chuyển tiếp',
|
|
178
|
-
description: 'Tạm đổi MONA
|
|
178
|
+
description: 'Tạm đổi MONA Pass thành client credential MONA Pay và cache cục bộ; bỏ khi MONA Pay nhận JWT trực tiếp.',
|
|
179
179
|
}, () => runTool(() => clients.monapayLink()));
|
|
180
180
|
server.registerTool('vibecloud_link', {
|
|
181
181
|
title: 'Liên kết VibeCloud chuyển tiếp',
|
|
182
|
-
description: 'Xác nhận VibeCloud nhận MONA
|
|
182
|
+
description: 'Xác nhận VibeCloud nhận MONA Pass trực tiếp; chỉ đổi thành vc_live token khi upstream còn ở chế độ cũ.',
|
|
183
183
|
}, () => runTool(() => clients.vibecloudLink()));
|
|
184
184
|
server.registerTool('vibecloud_create_vps', {
|
|
185
185
|
title: 'Tạo VPS VibeCloud',
|
|
@@ -209,7 +209,7 @@ export function createServer(dependencies = {}) {
|
|
|
209
209
|
}, ({ job_id, wait, interval_sec, timeout_sec }) => runTool(() => pollJob(clients, job_id, wait, interval_sec, timeout_sec)));
|
|
210
210
|
server.registerTool('vibecloud_list_services', {
|
|
211
211
|
title: 'Danh sách service VibeCloud',
|
|
212
|
-
description: 'Liệt kê VPS và database của MONA
|
|
212
|
+
description: 'Liệt kê VPS và database của MONA Pass hiện tại.',
|
|
213
213
|
}, () => runTool(() => clients.vibecloud('/api/services')));
|
|
214
214
|
for (const action of ['start', 'stop', 'rebuild']) {
|
|
215
215
|
server.registerTool(`vibecloud_${action}`, {
|
|
@@ -279,11 +279,11 @@ export function createServer(dependencies = {}) {
|
|
|
279
279
|
}, async (uri) => ({ contents: [{
|
|
280
280
|
uri: uri.href,
|
|
281
281
|
mimeType: 'text/plain',
|
|
282
|
-
text: `${ENTITY}\n\nHuman chỉ đăng ký MONA
|
|
282
|
+
text: `${ENTITY}\n\nHuman chỉ đăng ký MONA Pass, nạp tiền và cung cấp OTP/KYC bắt buộc. AI dùng MCP làm phần còn lại.\n\n- cloud_*: tài khoản, ví, ledger, usage, budget, dịch vụ.\n- vibecloud_*: VPS, database, job, start/stop/rebuild, giá/gói.\n- monapay_*: nối ngân hàng, checkout/QR, giao dịch, webhook và email.\n- agent_*: catalog và deploy template.\n\nConsole: ${config.consoleUrl}\nVibeCloud: https://vibecloud.vn\nMONA Pay: https://monapay.vn\n`,
|
|
283
283
|
}] }));
|
|
284
284
|
server.registerResource('monacloud-status', 'monacloud://status', {
|
|
285
285
|
title: 'Trạng thái hệ MONA Cloud',
|
|
286
|
-
description: 'Health tổng hợp của MONA
|
|
286
|
+
description: 'Health tổng hợp của MONA Pass, billing, VibeCloud và MONA Pay.',
|
|
287
287
|
mimeType: 'application/json',
|
|
288
288
|
}, async (uri) => {
|
|
289
289
|
const members = await Promise.all([
|
package/docs/ai-agent.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# MONA Cloud MCP — hướng dẫn cho AI agent
|
|
2
2
|
|
|
3
|
-
Tài liệu này dành cho Claude, Codex, Cursor và agent dùng Model Context Protocol. Mục tiêu là hoàn thành tích hợp end-to-end mà không yêu cầu người dùng mở dashboard, trừ ba việc hợp lệ: đăng ký MONA
|
|
3
|
+
Tài liệu này dành cho Claude, Codex, Cursor và agent dùng Model Context Protocol. Mục tiêu là hoàn thành tích hợp end-to-end mà không yêu cầu người dùng mở dashboard, trừ ba việc hợp lệ: đăng ký MONA Pass, nạp tiền và OTP/KYC bắt buộc.
|
|
4
4
|
|
|
5
5
|
## Quy tắc vận hành
|
|
6
6
|
|
|
@@ -22,14 +22,14 @@ openid profile email product billing-api offline_access
|
|
|
22
22
|
|
|
23
23
|
Token store mặc định là `~/.config/monacloud/token.json`, mode `0600`. Access token tự refresh bằng offline refresh token. Trong CI, `MONACLOUD_TOKEN` có thể cung cấp PAT trực tiếp.
|
|
24
24
|
|
|
25
|
-
Không in hoặc copy token vào source, issue, log, output tool hay nội dung webhook. Sản phẩm đích xác minh JWT MONA
|
|
25
|
+
Không in hoặc copy token vào source, issue, log, output tool hay nội dung webhook. Sản phẩm đích xác minh JWT MONA Pass và audience tương ứng.
|
|
26
26
|
|
|
27
27
|
### Adapter chuyển tiếp
|
|
28
28
|
|
|
29
|
-
MONA Pay và VibeCloud có thể chưa nhận JWT MONA
|
|
29
|
+
MONA Pay và VibeCloud có thể chưa nhận JWT MONA Pass trực tiếp tại thời điểm wave 1:
|
|
30
30
|
|
|
31
31
|
- gọi `monapay_link` một lần để nhận/cache `client_id/client_secret` MONA Pay;
|
|
32
|
-
- gọi `vibecloud_link` để xác nhận direct MONA
|
|
32
|
+
- gọi `vibecloud_link` để xác nhận direct MONA Pass; tool chỉ nhận/cache `vc_live_*` khi upstream từ chối JWT và còn bật adapter cũ;
|
|
33
33
|
- linked credential nằm ở `~/.config/monacloud/links.json`, mode `0600`;
|
|
34
34
|
- không gọi link lại ở mỗi request;
|
|
35
35
|
- khi upstream nhận JWT trực tiếp, bỏ adapter mà không đổi tên tool nghiệp vụ.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "monacloud-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Unified MCP server for MONA Cloud, MONA Pay, VibeCloud and MONA Agent.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
29
|
-
"monapay-mcp": "^0.
|
|
29
|
+
"monapay-mcp": "^0.5.5",
|
|
30
30
|
"zod": "^4.4.3"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|