monacloud-mcp 0.8.0 → 0.9.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 CHANGED
@@ -4,6 +4,10 @@
4
4
 
5
5
  Human đăng ký MONA Pass một lần, duyệt chi phí, thêm DNS khi cần, quét QR nạp ví do AI tạo và cung cấp OTP/KYC khi bắt buộc. Các bước tạo yêu cầu nạp, 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
+ ## 0.8.1 — luật nạp ví đứng đầu instructions
8
+
9
+ Codex chỉ chắc chắn đọc 512 ký tự đầu của `instructions` MCP, nên luật "ví thiếu → AI tự gọi `cloud_topup`, in QR, không bảo mở console" được đưa lên đầu; mô tả hệ và APP_FLOW đặt sau. Kiểm thử 17/09: Claude Code (sonnet) và Gemini (Antigravity CLI) tự gọi `cloud_topup` và in QR khi người dùng nói "ví hết tiền, nạp 50k"; Codex chạy headless (`codex exec`) mặc định chặn mọi lời gọi MCP theo approval policy; thêm `--approve-for-me` thì Codex cũng tự gọi `cloud_topup` và in QR (kiểm 17/09). Codex tương tác thì duyệt lời gọi tool như bình thường.
10
+
7
11
  ## 0.8.0 — Nạp ví ngay trong terminal
8
12
 
9
13
  Ví thiếu tiền thì AI gọi `cloud_topup(amount)`; MCP trả **`qr_ascii`** (QR VietQR chuẩn EMVCo/NAPAS in bằng khối đầy `██`, Claude Code/Codex/Gemini CLI hiện được ngay; terminal nền sáng dùng `qr_ascii_light`, bản gọn `qr_ascii_small`; đã giải mã được bằng ZBar và OpenCV ở cả hai nền), `qr_file` (PNG tại `~/.config/monacloud/`), `qr_url` (ảnh VietQR) cùng ngân hàng, số tài khoản, số tiền, nội dung chuyển khoản. Người dùng mở app ngân hàng quét màn hình, tiền vào tự cộng ví; AI gọi `cloud_topup_status(topup_id)` tới khi `paid` rồi làm tiếp. Không còn bảo người dùng mở console để nạp; base64 không còn nằm trong text (tiết kiệm 15–25k token mỗi lần). Khi ví chung (`billing`) chưa nhận token hoặc merchant MONA Pay chưa cấu hình, `cloud_topup` tự chuyển sang đường compute `/api/payments/vietqr` (ví local, prefix VIBECLOUD, báo có tự cộng).
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CloudClients } from './clients.js';
3
+ export declare function registerDomainTools(server: McpServer, clients: CloudClients): void;
@@ -0,0 +1,215 @@
1
+ import { z } from 'zod';
2
+ import { runTool } from './errors.js';
3
+ const domainName = z.string().trim().toLowerCase()
4
+ .min(3).max(253)
5
+ .describe('Tên miền đầy đủ (vd: example.vn) hoặc chỉ tên chưa có đuôi (vd: example).');
6
+ const objectId = z.string().regex(/^[a-f0-9]{24}$/i, 'Cần ID 24 ký tự hex.');
7
+ const registrantSchema = z.object({
8
+ owner_type: z.enum(['individual', 'organization']).optional()
9
+ .describe('individual = cá nhân (mặc định), organization = tổ chức/doanh nghiệp.'),
10
+ fullname: z.string().min(2).max(200).describe('Họ và tên đầy đủ (hoặc tên doanh nghiệp nếu organization).'),
11
+ email: z.string().email().describe('Email liên hệ.'),
12
+ phone: z.string().min(8).max(20).describe('Số điện thoại.'),
13
+ address: z.string().min(5).max(500).describe('Địa chỉ liên hệ.'),
14
+ province: z.string().max(100).optional().describe('Tỉnh/thành phố.'),
15
+ ward: z.string().max(100).optional().describe('Phường/xã.'),
16
+ country: z.string().max(10).optional().describe('Mã quốc gia, mặc định VN.'),
17
+ cccd: z.string().min(12).max(12).optional()
18
+ .describe('Số CCCD (12 số) — bắt buộc khi đăng ký tên miền .vn cá nhân.'),
19
+ dob: z.string().max(20).optional().describe('Ngày sinh định dạng DD/MM/YYYY — cá nhân .vn.'),
20
+ gender: z.enum(['male', 'female', '']).optional().describe('Giới tính — cá nhân .vn.'),
21
+ org_name: z.string().max(300).optional().describe('Tên tổ chức/doanh nghiệp — bắt buộc khi organization.'),
22
+ tax_code: z.string().max(20).optional().describe('Mã số thuế — bắt buộc khi organization.'),
23
+ representative: z.string().max(200).optional().describe('Họ tên người đại diện — bắt buộc khi organization.'),
24
+ }).strict();
25
+ export function registerDomainTools(server, clients) {
26
+ server.registerTool('cloud_domain_search', {
27
+ title: 'Tìm kiếm + báo giá tên miền',
28
+ description: 'Kiểm tra tên miền còn trống và xem giá mua. Dùng trước khi mua để AI biết available/price.',
29
+ inputSchema: z.object({
30
+ q: z.string().min(1).max(253).describe('Tên miền hoặc từ khoá (vd: "myapp" hoặc "myapp.vn").'),
31
+ tlds: z.string().max(200).optional().describe('Đuôi muốn tìm, phân cách phẩy (vd: "vn,com"). Mặc định: vn,com.'),
32
+ years: z.number().int().min(1).max(10).optional().describe('Số năm đăng ký. Mặc định 1.'),
33
+ }).strict(),
34
+ }, ({ q, tlds, years }) => runTool(async () => {
35
+ const params = new URLSearchParams({ q });
36
+ if (tlds)
37
+ params.set('tlds', tlds);
38
+ if (years)
39
+ params.set('years', String(years));
40
+ return clients.vibecloud(`/api/domains/search?${params}`);
41
+ }));
42
+ server.registerTool('cloud_domain_registrant_get', {
43
+ title: 'Xem thông tin chủ thể đăng ký tên miền',
44
+ description: 'Lấy thông tin chủ thể (registrant) đã lưu. Cần dữ liệu này để mua tên miền.',
45
+ inputSchema: z.object({}).strict(),
46
+ }, () => runTool(() => clients.vibecloud('/api/domains/registrant')));
47
+ server.registerTool('cloud_domain_registrant_set', {
48
+ title: 'Cập nhật thông tin chủ thể đăng ký tên miền',
49
+ description: 'Lưu thông tin chủ thể để đăng ký tên miền. HỎI NGƯỜI DÙNG cung cấp NGAY TRONG PHIÊN: họ tên, email, điện thoại, địa chỉ. Tên miền .vn cá nhân cần thêm CCCD 12 số + ngày sinh (DD/MM/YYYY) + giới tính; .vn tổ chức cần org_name + tax_code (MST) + representative. Lưu 1 lần, tái dùng cho các domain sau. Không tự bịa dữ liệu — thiếu trường nào thì hỏi đúng trường đó.',
50
+ inputSchema: registrantSchema,
51
+ }, (args) => runTool(() => clients.vibecloud('/api/domains/registrant', {
52
+ method: 'PUT',
53
+ body: args,
54
+ })));
55
+ server.registerTool('cloud_domain_buy', {
56
+ title: 'Mua tên miền',
57
+ description: [
58
+ 'Mua tên miền và trừ ví VND — làm trọn trong phiên, không bảo người dùng mở web. Trước khi gọi:',
59
+ '1. cloud_domain_search để xem giá + còn trống.',
60
+ '2. Hỏi người dùng xác nhận chính tả tên miền (vd: "Đăng ký example.vn nhé?") → spelling_confirmed. WHOIS không sửa được sau khi mua.',
61
+ '3. Hỏi duyệt chi phí (giá từ search).',
62
+ '4. cloud_domain_registrant_set để lưu thông tin chủ thể (hỏi người dùng ngay trong phiên); .vn cần CCCD/MST.',
63
+ 'Khi gọi mà trả 402 insufficient_balance → gọi cloud_topup, IN NGUYÊN KHỐI qr_ascii (QR VietQR) cho người dùng quét bằng app ngân hàng NGAY trong terminal, chờ cloud_topup_status=paid rồi gọi lại cloud_domain_buy. Không bảo người dùng mở console để nạp.',
64
+ 'Kết quả có suggested_next → gợi ý người dùng deploy app lên MONA Cloud (cloud_app_create) và gắn domain (cloud_domain_attach).',
65
+ '.vn sau khi mua ở trạng thái pending_verification → dùng cloud_domain_verify_start (link eKYC/bản khai) rồi cloud_domain_wait.',
66
+ 'sandbox=true: giả lập 0đ, không mua thật.',
67
+ ].join(' '),
68
+ inputSchema: z.object({
69
+ name: domainName,
70
+ years: z.number().int().min(1).max(10).optional().describe('Số năm đăng ký. Mặc định 1.'),
71
+ spelling_confirmed: z.boolean()
72
+ .describe('true = người dùng đã xác nhận chính tả tên miền; false = chặn, không mua.'),
73
+ registrant_id: objectId.optional().describe('ID registrant (lấy từ cloud_domain_registrant_get). Để trống → dùng registrant mặc định.'),
74
+ sandbox: z.boolean().optional().describe('sandbox=true: mô phỏng 0đ, không gọi MONA Host.'),
75
+ }).strict(),
76
+ }, ({ name, years, spelling_confirmed, registrant_id, sandbox }) => runTool(async () => {
77
+ const body = { name, spelling_confirmed };
78
+ if (years)
79
+ body.years = years;
80
+ if (registrant_id)
81
+ body.registrant_id = registrant_id;
82
+ return clients.guardedVibecloud('/api/domains', { method: 'POST', body }, sandbox === true);
83
+ }));
84
+ server.registerTool('cloud_domain_list', {
85
+ title: 'Danh sách tên miền đã import/mua',
86
+ description: 'Liệt kê tên miền đã đưa vào MONA Cloud (import + mua). sandbox=true → xem domain sandbox.',
87
+ inputSchema: z.object({
88
+ sandbox: z.boolean().optional().describe('true → hiện domain sandbox.'),
89
+ }).strict(),
90
+ }, ({ sandbox }) => runTool(async () => {
91
+ const headers = sandbox ? { 'X-Vibecloud-Sandbox': '1' } : undefined;
92
+ return clients.vibecloud('/api/domains', { headers });
93
+ }));
94
+ server.registerTool('cloud_domain_verify_start', {
95
+ title: 'Bắt đầu nộp hồ sơ .vn',
96
+ description: 'Sinh bản khai đã điền sẵn và link upload hồ sơ .vn. Dùng sau khi mua tên miền .vn (status=pending_verification).',
97
+ inputSchema: z.object({
98
+ id: objectId.describe('Order ID trả về khi cloud_domain_buy.'),
99
+ }).strict(),
100
+ }, ({ id }) => runTool(() => clients.vibecloud(`/api/domains/${encodeURIComponent(id)}/verify`, {
101
+ method: 'POST',
102
+ })));
103
+ server.registerTool('cloud_domain_verify_status', {
104
+ title: 'Trạng thái hồ sơ .vn',
105
+ description: 'Kiểm tra trạng thái duyệt hồ sơ đăng ký .vn (profile_status từ MONA Host).',
106
+ inputSchema: z.object({
107
+ id: objectId.describe('Order ID của tên miền .vn.'),
108
+ }).strict(),
109
+ }, ({ id }) => runTool(() => clients.vibecloud(`/api/domains/${encodeURIComponent(id)}/verify`)));
110
+ server.registerTool('cloud_domain_health', {
111
+ title: 'Kiểm tra sức khoẻ tên miền',
112
+ description: 'Kiểm tra hạn đăng ký, trạng thái hồ sơ, NS, SSL và cảnh báo tên miền đã mua.',
113
+ inputSchema: z.object({
114
+ id: objectId.describe('Order ID tên miền cần kiểm tra.'),
115
+ }).strict(),
116
+ }, ({ id }) => runTool(() => clients.vibecloud(`/api/domains/${encodeURIComponent(id)}/health`)));
117
+ server.registerTool('cloud_domain_wait', {
118
+ title: 'Chờ tên miền active',
119
+ description: 'Long-poll cho đến khi tên miền chuyển sang active/failed (mặc định timeout=60s). Dùng sau cloud_domain_buy để chờ MONA Host xử lý.',
120
+ inputSchema: z.object({
121
+ id: objectId.describe('Order ID cần chờ.'),
122
+ timeout: z.number().int().min(5).max(300).optional().describe('Timeout giây. Mặc định 60.'),
123
+ }).strict(),
124
+ }, ({ id, timeout }) => runTool(async () => {
125
+ const params = timeout ? `?timeout=${timeout}` : '';
126
+ return clients.vibecloud(`/api/domains/${encodeURIComponent(id)}/wait${params}`);
127
+ }));
128
+ server.registerTool('cloud_domain_webhook_set', {
129
+ title: 'Đăng ký webhook tên miền',
130
+ description: 'Đăng ký URL nhận sự kiện domain.status_changed (ký HMAC). Mỗi user 1 webhook; gọi lại để cập nhật.',
131
+ inputSchema: z.object({
132
+ url: z.string().url().refine((v) => v.startsWith('https://'), 'Cần URL HTTPS.'),
133
+ secret: z.string().min(8).max(256).describe('Chuỗi bí mật để xác minh chữ ký HMAC.'),
134
+ }).strict(),
135
+ }, ({ url, secret }) => runTool(() => clients.vibecloud('/api/domains/webhook', {
136
+ method: 'PUT',
137
+ body: { url, secret },
138
+ })));
139
+ server.registerTool('cloud_domain_attach', {
140
+ title: 'Gắn tên miền vào ứng dụng',
141
+ description: [
142
+ 'Gắn tên miền vào app đã deploy. Tên miền .vn chưa active vẫn gọi được — attach đặt trước, server tự hoàn tất sau khi hồ sơ được duyệt và gửi webhook domain.status_changed.',
143
+ 'Dùng cloud_app_list để lấy app_id; domain_id là ID của domain row (từ cloud_domain_list).',
144
+ ].join(' '),
145
+ inputSchema: z.object({
146
+ domain_id: objectId.describe('Domain ID (từ cloud_domain_list).'),
147
+ app_id: objectId.describe('App ID cần gắn vào.'),
148
+ sandbox: z.boolean().optional(),
149
+ }).strict(),
150
+ }, ({ domain_id, app_id, sandbox }) => runTool(async () => {
151
+ const headers = sandbox ? { 'X-Vibecloud-Sandbox': '1' } : undefined;
152
+ return clients.vibecloud(`/api/domains/${encodeURIComponent(domain_id)}/attach`, {
153
+ method: 'POST',
154
+ body: { app_id },
155
+ headers,
156
+ });
157
+ }));
158
+ const recordSchema = {
159
+ type: z.enum(['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'SRV', 'NS']).describe('Loại bản ghi.'),
160
+ name: z.string().min(1).max(253).describe('Tên bản ghi ("@" cho gốc, "www", "api"...).'),
161
+ data: z.string().min(1).max(2048).describe('Giá trị (IP cho A, hostname cho CNAME, nội dung cho TXT...).'),
162
+ ttl: z.number().int().min(60).max(86400).optional().describe('TTL giây (mặc định để trống).'),
163
+ priority: z.number().int().min(0).max(65535).optional().describe('Ưu tiên (MX/SRV).'),
164
+ };
165
+ server.registerTool('cloud_domain_dns_list', {
166
+ title: 'Xem bản ghi DNS của tên miền',
167
+ description: 'Liệt kê bản ghi DNS (A/CNAME/MX/TXT...) của tên miền đăng ký tại MONA Cloud. domain_id lấy từ cloud_domain_list.',
168
+ inputSchema: z.object({ domain_id: objectId }).strict(),
169
+ }, ({ domain_id }) => runTool(() => clients.vibecloud(`/api/domains/${encodeURIComponent(domain_id)}/records`)));
170
+ server.registerTool('cloud_domain_dns_add', {
171
+ title: 'Thêm bản ghi DNS',
172
+ description: 'Thêm 1 bản ghi DNS. Vd trỏ web: type=A, name=@, data=<IP>. Trỏ www: type=CNAME, name=www, data=<domain>. AI làm trọn, không cần mở dashboard.',
173
+ inputSchema: z.object({ domain_id: objectId, ...recordSchema }).strict(),
174
+ }, ({ domain_id, ...record }) => runTool(() => clients.vibecloud(`/api/domains/${encodeURIComponent(domain_id)}/records`, { method: 'POST', body: record })));
175
+ server.registerTool('cloud_domain_dns_update', {
176
+ title: 'Sửa bản ghi DNS',
177
+ description: 'Sửa 1 bản ghi DNS theo record_id (lấy từ cloud_domain_dns_list).',
178
+ inputSchema: z.object({ domain_id: objectId, record_id: z.string().min(1).max(128), ...recordSchema }).strict(),
179
+ }, ({ domain_id, record_id, ...record }) => runTool(() => clients.vibecloud(`/api/domains/${encodeURIComponent(domain_id)}/records/${encodeURIComponent(record_id)}`, { method: 'PUT', body: record })));
180
+ server.registerTool('cloud_domain_dns_delete', {
181
+ title: 'Xoá bản ghi DNS',
182
+ description: 'Xoá 1 bản ghi DNS theo record_id.',
183
+ inputSchema: z.object({ domain_id: objectId, record_id: z.string().min(1).max(128) }).strict(),
184
+ }, ({ domain_id, record_id }) => runTool(() => clients.vibecloud(`/api/domains/${encodeURIComponent(domain_id)}/records/${encodeURIComponent(record_id)}`, { method: 'DELETE' })));
185
+ server.registerTool('cloud_domain_ns_set', {
186
+ title: 'Đổi nameserver (NS) của tên miền',
187
+ description: 'Đổi NS cho tên miền (≥2). Vd giữ DNS ở MONA: ns1.mona.host, ns2.mona.host. Hoặc chuyển sang Cloudflare/nhà khác. AI làm hoàn toàn.',
188
+ inputSchema: z.object({
189
+ domain_id: objectId,
190
+ ns_list: z.array(z.string().min(3).max(253)).min(2).max(6).describe('Danh sách hostname NS, tối thiểu 2.'),
191
+ }).strict(),
192
+ }, ({ domain_id, ns_list }) => runTool(() => clients.vibecloud(`/api/domains/${encodeURIComponent(domain_id)}/ns`, { method: 'PATCH', body: { ns_list } })));
193
+ server.registerPrompt('mua-ten-mien-monacloud', {
194
+ title: 'Mua tên miền cho app — làm trọn trong phiên (gợi ý, hỏi info, bắn QR, mua)',
195
+ description: 'AI tự tra + báo giá + hỏi thông tin chủ thể + nạp ví bằng QR trong terminal + mua + xác thực .vn, không bảo người dùng mở web.',
196
+ argsSchema: {
197
+ keyword: z.string().optional(),
198
+ app_id: z.string().optional(),
199
+ },
200
+ }, ({ keyword, app_id }) => ({ messages: [{
201
+ role: 'user',
202
+ content: {
203
+ type: 'text',
204
+ text: `Mua giúp tôi tên miền${keyword ? ` quanh "${keyword}"` : ''} bằng MONA Cloud, làm trọn ngay trong phiên này, đừng bảo tôi mở web:
205
+ 1. cloud_domain_search để tìm tên còn trống + báo giá VND (ưu tiên .vn và .com; nói rõ giá đã gồm VAT).
206
+ 2. Hỏi tôi chọn tên nào và XÁC NHẬN CHÍNH TẢ (WHOIS không sửa được sau khi mua).
207
+ 3. cloud_domain_registrant_set: HỎI TÔI thông tin chủ thể ngay trong phiên — họ tên, email, điện thoại, địa chỉ; nếu là .vn cá nhân hỏi thêm CCCD 12 số + ngày sinh + giới tính (tổ chức: tên công ty + MST + người đại diện). Đừng tự bịa.
208
+ 4. Kiểm ví bằng cloud_balance. Nếu thiếu tiền, gọi cloud_topup rồi IN NGUYÊN KHỐI qr_ascii (QR VietQR) cho tôi quét bằng app ngân hàng ngay trong terminal; chờ cloud_topup_status=paid.
209
+ 5. cloud_domain_buy (spelling_confirmed=true) — trừ ví, mua thật.
210
+ 6. Nếu là .vn: cloud_domain_verify_start đưa tôi link eKYC/bản khai (chụp CCCD + chân dung / ký), rồi cloud_domain_wait tới khi active.
211
+ 7. ${app_id ? `Gắn vào app ${app_id} bằng cloud_domain_attach` : 'Gợi ý tôi deploy app lên MONA Cloud (cloud_app_create) rồi gắn domain bằng cloud_domain_attach'} — trỏ DNS + SSL tự động.
212
+ Trả VND, không cần thẻ quốc tế, không mở dashboard.`,
213
+ },
214
+ }] }));
215
+ }
package/dist/server.js CHANGED
@@ -11,6 +11,7 @@ import { registerMailTools } from './mail.js';
11
11
  import { APP_FLOW, createVps, registerComputeTools } from './compute.js';
12
12
  import { pollJob } from './jobs.js';
13
13
  import { registerBaseTools } from './base.js';
14
+ import { registerDomainTools } from './domains.js';
14
15
  import { presentTopup } from './qr.js';
15
16
  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 để chạy app/VPS, thu tiền MONA Pay và dùng các sản phẩm MONA. Base beta thay Supabase bằng cloud_base_*, chung account/ví MONA Cloud và khớp app deploy. Dùng mail_* để gửi email giao dịch (MONA Mail). MONA Mail là dịch vụ gửi email giao dịch cho phần mềm và AI agent của người Việt: một API, trả VND, không cần thẻ, thuộc nhóm MONA Cloud của The MONA Group.';
16
17
  const SANDBOX_DESCRIPTION = 'sandbox=true: thử 0đ, không cần ví';
@@ -92,7 +93,9 @@ export function createServer(dependencies = {}) {
92
93
  const auth = new AuthManager(config, env, fetchImpl);
93
94
  const clients = new CloudClients(config, auth, fetchImpl);
94
95
  const catalog = new TemplateCatalog(config, fetchImpl);
95
- const server = new McpServer({ name: 'monacloud-mcp', version: '0.8.0' }, { instructions: `${ENTITY}\nDùng cloud_* cho tài khoản, ví và hạ tầng; monapay_* cho thu tiền; mail_* để gửi email giao dịch (MONA Mail); agent_* cho catalog. Không bao giờ yêu cầu mật khẩu sản phẩm. Đọc → ước tính → hỏi duyệt nếu chưa được duyệt → làm. Ví thiếu tiền: AI tự gọi cloud_topup, in nguyên khối qr_ascii (QR VietQR) cho người dùng quét bằng app ngân hàng ngay trong terminal, rồi cloud_topup_status tới khi paid; không bảo người dùng mở console để nạp. Dừng chờ người dùng ở: quét QR nạp, duyệt chi phí, thêm DNS, OTP hoặc KYC. ${APP_FLOW}` });
96
+ const server = new McpServer({ name: 'monacloud-mcp', version: '0.8.1' },
97
+ // Codex chỉ chắc chắn đọc 512 ký tự đầu của instructions → luật quan trọng nhất đặt trước, mô tả hệ đặt sau.
98
+ { instructions: `Ví thiếu tiền: AI tự gọi cloud_topup, in nguyên khối qr_ascii (QR VietQR) cho người dùng quét bằng app ngân hàng ngay trong terminal, rồi cloud_topup_status tới khi paid; không bảo người dùng mở console để nạp. Dùng cloud_* cho tài khoản, ví và hạ tầng; monapay_* cho thu tiền; mail_* để gửi email giao dịch (MONA Mail); agent_* cho catalog. Không bao giờ yêu cầu mật khẩu sản phẩm. Đọc → ước tính → hỏi duyệt nếu chưa được duyệt → làm. Dừng chờ người dùng ở: quét QR nạp, duyệt chi phí, thêm DNS, OTP hoặc KYC.\n${ENTITY}\n${APP_FLOW}` });
96
99
  server.registerTool('cloud_whoami', {
97
100
  title: 'Tài khoản MONA Cloud',
98
101
  description: 'Xác minh MONA Pass hiện tại. / Return the current MONA Pass profile.',
@@ -315,6 +318,7 @@ export function createServer(dependencies = {}) {
315
318
  registerComputeTools(server, clients);
316
319
  registerBaseTools(server, clients);
317
320
  registerMailTools(server, clients, config);
321
+ registerDomainTools(server, clients);
318
322
  server.registerTool('agent_templates_list', {
319
323
  title: 'Catalog MONA Agent',
320
324
  description: 'Đọc template từ thư mục local, URL catalog hoặc catalog wave 1 tích hợp. Deploy dự án: cloud_app_detect rồi cloud_app_create(local_dir), sandbox trước nếu chưa có host.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacloud-mcp",
3
- "version": "0.8.0",
3
+ "version": "0.9.2",
4
4
  "description": "MCP server for MONA Cloud — deploy apps (Vercel alternative), Supabase-compatible Postgres/Auth/Storage bases (Supabase alternative), VND wallet, MONA Pay & Mail — for AI agents (Claude, Cursor, Codex) in Vietnam.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://monacloud.vn",