@suzko/mcp-server 0.1.0

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/GUIDE.md ADDED
@@ -0,0 +1,952 @@
1
+ # Suzko MCP Server — Usage Guide
2
+
3
+ Complete guide for using the Suzko MCP Server with VS Code Copilot, Claude Desktop, Claude Code, Cursor, and other MCP-compatible AI clients.
4
+
5
+ ---
6
+
7
+ ## Table of Contents
8
+
9
+ - [What is MCP?](#what-is-mcp)
10
+ - [Installation](#installation)
11
+ - [Authentication](#authentication)
12
+ - [IDE Setup](#ide-setup)
13
+ - [VS Code (GitHub Copilot)](#vs-code-github-copilot)
14
+ - [Claude Desktop](#claude-desktop)
15
+ - [Claude Code CLI](#claude-code-cli)
16
+ - [Cursor](#cursor)
17
+ - [Windsurf](#windsurf)
18
+ - [Tool Categories](#tool-categories)
19
+ - [Deploy Tools](#deploy-tools)
20
+ - [Domain Tools](#domain-tools)
21
+ - [DNS Tools](#dns-tools)
22
+ - [Account & Billing Tools](#account--billing-tools)
23
+ - [Service Tools](#service-tools)
24
+ - [Support Tools](#support-tools)
25
+ - [Server Admin (BYOS) Tools](#server-admin-byos-tools)
26
+ - [Resources](#resources)
27
+ - [Prompts (Workflow Templates)](#prompts-workflow-templates)
28
+ - [Human-in-the-Loop Confirmation](#human-in-the-loop-confirmation)
29
+ - [Example Conversations](#example-conversations)
30
+ - [Configuration](#configuration)
31
+ - [Troubleshooting](#troubleshooting)
32
+
33
+ ---
34
+
35
+ ## What is MCP?
36
+
37
+ The [Model Context Protocol](https://modelcontextprotocol.io) (MCP) is an open standard that lets AI assistants call tools, access data, and perform actions on your behalf. The Suzko MCP Server exposes 57 tools across 7 categories, giving your AI assistant the ability to manage your entire hosting infrastructure through natural language.
38
+
39
+ **What you can do:**
40
+
41
+ - Deploy apps and databases in seconds
42
+ - Search, register, and manage domains
43
+ - Configure DNS records
44
+ - Manage hosting services and billing
45
+ - Open and manage support tickets
46
+ - Administer your own servers via SSH
47
+ - All from a chat conversation with your AI assistant
48
+
49
+ ---
50
+
51
+ ## Installation
52
+
53
+ The MCP server runs as a local process that communicates with your IDE via stdio. No global install is needed — your IDE launches it automatically.
54
+
55
+ **Prerequisites:**
56
+
57
+ - Node.js 18 or later
58
+ - A Suzko account (free tier works)
59
+
60
+ **Optional (for BYOS server admin):**
61
+
62
+ - SSH key pair (`~/.ssh/id_ed25519` by default)
63
+ - Servers you want to manage
64
+
65
+ ---
66
+
67
+ ## Authentication
68
+
69
+ Before using the MCP server, you need to log in once. This stores credentials locally at `~/.suzko/mcp-credentials.json`.
70
+
71
+ ### Login
72
+
73
+ ```bash
74
+ npx @suzko/mcp-server auth login
75
+ ```
76
+
77
+ This prints a URL — open it in your browser, log in to your Suzko account, copy the auth code, and paste it back in the terminal.
78
+
79
+ ### Check Status
80
+
81
+ ```bash
82
+ npx @suzko/mcp-server auth status
83
+ ```
84
+
85
+ Output:
86
+
87
+ ```
88
+ ✓ Logged in
89
+ API: https://www.suzko.com
90
+ Token: Valid (expires 4/16/2026, 3:00:00 PM)
91
+ ```
92
+
93
+ ### Logout
94
+
95
+ ```bash
96
+ npx @suzko/mcp-server auth logout
97
+ ```
98
+
99
+ ### How Auth Works
100
+
101
+ - Uses the same device token flow as the desktop and mobile apps
102
+ - Access tokens auto-refresh when they're within 1 hour of expiring
103
+ - Credentials are stored with restricted file permissions (0600 on Unix)
104
+ - The `~/.suzko/` directory is created automatically on first login
105
+
106
+ ---
107
+
108
+ ## IDE Setup
109
+
110
+ ### VS Code (GitHub Copilot)
111
+
112
+ Add to your **User** or **Workspace** `settings.json`:
113
+
114
+ ```json
115
+ {
116
+ "mcp": {
117
+ "servers": {
118
+ "suzko": {
119
+ "command": "npx",
120
+ "args": ["-y", "@suzko/mcp-server"]
121
+ }
122
+ }
123
+ }
124
+ }
125
+ ```
126
+
127
+ Then in Copilot Chat (agent mode), tools appear automatically. Try:
128
+
129
+ > Deploy a PostgreSQL database for my project
130
+
131
+ ### Claude Desktop
132
+
133
+ Edit `claude_desktop_config.json`:
134
+
135
+ - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
136
+ - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
137
+
138
+ ```json
139
+ {
140
+ "mcpServers": {
141
+ "suzko": {
142
+ "command": "npx",
143
+ "args": ["-y", "@suzko/mcp-server"]
144
+ }
145
+ }
146
+ }
147
+ ```
148
+
149
+ Restart Claude Desktop. You'll see a hammer icon (🔨) indicating tools are available.
150
+
151
+ ### Claude Code CLI
152
+
153
+ ```bash
154
+ claude mcp add suzko -- npx -y @suzko/mcp-server
155
+ ```
156
+
157
+ This adds it to your project's `.mcp.json`. To add globally:
158
+
159
+ ```bash
160
+ claude mcp add --scope user suzko -- npx -y @suzko/mcp-server
161
+ ```
162
+
163
+ ### Cursor
164
+
165
+ Add to `.cursor/mcp.json` in your project root:
166
+
167
+ ```json
168
+ {
169
+ "mcpServers": {
170
+ "suzko": {
171
+ "command": "npx",
172
+ "args": ["-y", "@suzko/mcp-server"]
173
+ }
174
+ }
175
+ }
176
+ ```
177
+
178
+ ### Windsurf
179
+
180
+ Add to `~/.codeium/windsurf/mcp_config.json`:
181
+
182
+ ```json
183
+ {
184
+ "mcpServers": {
185
+ "suzko": {
186
+ "command": "npx",
187
+ "args": ["-y", "@suzko/mcp-server"]
188
+ }
189
+ }
190
+ }
191
+ ```
192
+
193
+ ---
194
+
195
+ ## Tool Categories
196
+
197
+ ### Deploy Tools
198
+
199
+ Create and manage cloud deployments — containers, databases, and full application stacks.
200
+
201
+ #### `list_deploy_templates`
202
+
203
+ Browse available templates (PostgreSQL, MySQL, Redis, Node.js, etc.).
204
+
205
+ | Parameter | Required | Description |
206
+ |-----------|----------|-------------|
207
+ | `category` | No | Filter by category (e.g., "database", "runtime") |
208
+
209
+ **Example prompt:** *"What databases can I deploy?"*
210
+
211
+ #### `create_deploy_project`
212
+
213
+ Create a new deployment. Returns a cost preview and confirmation token.
214
+
215
+ | Parameter | Required | Description |
216
+ |-----------|----------|-------------|
217
+ | `name` | Yes | Project name (lowercase, alphanumeric, hyphens) |
218
+ | `templateId` | Yes | Template to deploy (from `list_deploy_templates`) |
219
+ | `tier` | Yes | Resource tier: `nano` (256MB), `micro` (512MB), `small` (1GB), `medium` (2GB), `large` (4GB), `xlarge` (8GB) |
220
+ | `stackId` | No | Pre-configured stack (e.g., "nextjs-postgres") |
221
+ | `subdomain` | No | Custom subdomain (auto-generated if omitted) |
222
+ | `envVars` | No | Environment variables as key-value pairs |
223
+
224
+ **Example prompt:** *"Deploy a PostgreSQL database called my-app-db on the small tier"*
225
+
226
+ #### `confirm_deploy_project`
227
+
228
+ Execute a pending project creation after reviewing the cost preview.
229
+
230
+ | Parameter | Required | Description |
231
+ |-----------|----------|-------------|
232
+ | `confirmationId` | Yes | Token from `create_deploy_project` (valid for 5 minutes) |
233
+
234
+ #### `get_deploy_project`
235
+
236
+ Get full project details — status, URL, services, domains, resource usage.
237
+
238
+ | Parameter | Required | Description |
239
+ |-----------|----------|-------------|
240
+ | `projectId` | Yes | Project ID |
241
+
242
+ #### `control_deploy_project`
243
+
244
+ Start, stop, restart, or delete a project.
245
+
246
+ | Parameter | Required | Description |
247
+ |-----------|----------|-------------|
248
+ | `projectId` | Yes | Project ID |
249
+ | `action` | Yes | One of: `start`, `stop`, `restart`, `delete` |
250
+
251
+ **Example prompt:** *"Restart my-app-db"*
252
+
253
+ #### `get_deploy_logs`
254
+
255
+ Read runtime container logs.
256
+
257
+ | Parameter | Required | Description |
258
+ |-----------|----------|-------------|
259
+ | `projectId` | Yes | Project ID |
260
+ | `tail` | No | Number of lines (default: 100) |
261
+ | `since` | No | ISO 8601 timestamp to start from |
262
+
263
+ **Example prompt:** *"Show me the last 50 lines of logs for my-app-db"*
264
+
265
+ #### `get_deploy_build_logs`
266
+
267
+ Read build output from the last deployment.
268
+
269
+ | Parameter | Required | Description |
270
+ |-----------|----------|-------------|
271
+ | `projectId` | Yes | Project ID |
272
+
273
+ #### `redeploy_project`
274
+
275
+ Trigger a full rebuild and restart.
276
+
277
+ | Parameter | Required | Description |
278
+ |-----------|----------|-------------|
279
+ | `projectId` | Yes | Project ID |
280
+
281
+ #### `set_deploy_env`
282
+
283
+ Set environment variables on a project. Overwrites existing keys; unmentioned keys are preserved.
284
+
285
+ | Parameter | Required | Description |
286
+ |-----------|----------|-------------|
287
+ | `projectId` | Yes | Project ID |
288
+ | `envVars` | Yes | Key-value pairs to set |
289
+
290
+ **Example prompt:** *"Set DATABASE_URL on my-web-app to the connection string from my-app-db"*
291
+
292
+ #### `check_subdomain`
293
+
294
+ Check if a subdomain is available.
295
+
296
+ | Parameter | Required | Description |
297
+ |-----------|----------|-------------|
298
+ | `subdomain` | Yes | Subdomain to check (e.g., "my-app") |
299
+
300
+ #### `get_deploy_usage`
301
+
302
+ Get deploy usage statistics, project counts, and plan limits.
303
+
304
+ No parameters required.
305
+
306
+ ---
307
+
308
+ ### Domain Tools
309
+
310
+ Search, register, transfer, and manage domain names.
311
+
312
+ #### `search_domains`
313
+
314
+ Batch check availability and pricing for up to 20 domains at once.
315
+
316
+ | Parameter | Required | Description |
317
+ |-----------|----------|-------------|
318
+ | `domains` | Yes | Array of domain names to check (1–20) |
319
+
320
+ **Example prompt:** *"Check if example.com, example.io, and example.dev are available"*
321
+
322
+ #### `get_tld_pricing`
323
+
324
+ Get pricing for all supported TLDs — registration, renewal, and transfer costs.
325
+
326
+ No parameters required.
327
+
328
+ #### `suggest_domain_names`
329
+
330
+ AI-powered creative domain name suggestions based on keywords.
331
+
332
+ | Parameter | Required | Description |
333
+ |-----------|----------|-------------|
334
+ | `keywords` | Yes | Descriptive keywords (e.g., "fast cloud hosting") |
335
+ | `tld` | No | Preferred TLD (e.g., ".com", ".dev") |
336
+
337
+ **Example prompt:** *"Suggest domain names for my AI startup that does image generation"*
338
+
339
+ #### `register_domain`
340
+
341
+ Register a domain. Returns a cost preview and confirmation token.
342
+
343
+ | Parameter | Required | Description |
344
+ |-----------|----------|-------------|
345
+ | `domain` | Yes | Full domain name (e.g., "example.com") |
346
+ | `period` | Yes | Registration period in years (1–10) |
347
+ | `nameservers` | No | Custom nameservers (array of 2–5) |
348
+
349
+ #### `confirm_domain_registration`
350
+
351
+ Execute a pending domain registration.
352
+
353
+ | Parameter | Required | Description |
354
+ |-----------|----------|-------------|
355
+ | `confirmationId` | Yes | Token from `register_domain` |
356
+
357
+ #### `transfer_domain` / `confirm_domain_transfer`
358
+
359
+ Transfer a domain from another registrar. Same two-step confirmation flow.
360
+
361
+ | Parameter | Required | Description |
362
+ |-----------|----------|-------------|
363
+ | `domain` | Yes | Domain to transfer |
364
+ | `eppCode` | Yes | Authorization/EPP code from current registrar |
365
+
366
+ #### `list_domains`
367
+
368
+ List all your domains with status, expiry dates, and auto-renew settings.
369
+
370
+ #### `get_domain_details`
371
+
372
+ Get full domain info — nameservers, dates, lock status, DNS/email/ID protection.
373
+
374
+ | Parameter | Required | Description |
375
+ |-----------|----------|-------------|
376
+ | `domainId` | Yes | Domain ID (number) |
377
+
378
+ #### `update_domain_nameservers`
379
+
380
+ Change nameservers for a domain.
381
+
382
+ | Parameter | Required | Description |
383
+ |-----------|----------|-------------|
384
+ | `domainId` | Yes | Domain ID |
385
+ | `nameservers` | Yes | Array of 2–5 nameserver hostnames |
386
+
387
+ #### `get_domain_lock_status` / `toggle_domain_lock`
388
+
389
+ Check or toggle the registrar transfer lock on a domain.
390
+
391
+ ---
392
+
393
+ ### DNS Tools
394
+
395
+ Manage DNS records for your domains.
396
+
397
+ > **Note:** You must enable DNS management on a domain before creating records.
398
+
399
+ #### `enable_dns_management`
400
+
401
+ Enable DNS management for a domain (one-time setup).
402
+
403
+ | Parameter | Required | Description |
404
+ |-----------|----------|-------------|
405
+ | `domainId` | Yes | Domain ID |
406
+
407
+ #### `list_dns_records`
408
+
409
+ List all DNS records for a domain.
410
+
411
+ | Parameter | Required | Description |
412
+ |-----------|----------|-------------|
413
+ | `domainId` | Yes | Domain ID |
414
+
415
+ #### `create_dns_record`
416
+
417
+ Create a DNS record.
418
+
419
+ | Parameter | Required | Description |
420
+ |-----------|----------|-------------|
421
+ | `domainId` | Yes | Domain ID |
422
+ | `type` | Yes | Record type: `A`, `AAAA`, `CNAME`, `TXT`, `MX`, `NS`, `SRV`, `CAA` |
423
+ | `name` | Yes | Record name (e.g., "@", "www", "api") |
424
+ | `content` | Yes | Record value (IP, hostname, text) |
425
+ | `ttl` | No | Time-to-live in seconds (min: 60) |
426
+ | `priority` | No | Priority (required for MX, SRV) |
427
+
428
+ **Example prompt:** *"Add an A record pointing api.example.com to 203.0.113.50"*
429
+
430
+ #### `update_dns_record`
431
+
432
+ Update an existing DNS record. At least one field must change.
433
+
434
+ | Parameter | Required | Description |
435
+ |-----------|----------|-------------|
436
+ | `domainId` | Yes | Domain ID |
437
+ | `recordId` | Yes | Record ID (from `list_dns_records`) |
438
+ | `type` | No | New record type |
439
+ | `name` | No | New name |
440
+ | `content` | No | New value |
441
+ | `ttl` | No | New TTL |
442
+ | `priority` | No | New priority |
443
+
444
+ #### `delete_dns_record`
445
+
446
+ Delete a DNS record. This is irreversible.
447
+
448
+ | Parameter | Required | Description |
449
+ |-----------|----------|-------------|
450
+ | `domainId` | Yes | Domain ID |
451
+ | `recordId` | Yes | Record ID |
452
+
453
+ ---
454
+
455
+ ### Account & Billing Tools
456
+
457
+ View your profile, invoices, subscriptions, and billing information.
458
+
459
+ #### `get_account_info`
460
+
461
+ Get your profile — name, email, company, client ID, currency, and credit balance.
462
+
463
+ #### `list_invoices`
464
+
465
+ List invoices with optional status filter.
466
+
467
+ | Parameter | Required | Description |
468
+ |-----------|----------|-------------|
469
+ | `status` | No | Filter: `Paid`, `Unpaid`, `Cancelled`, `Refunded` |
470
+ | `page` | No | Page number for pagination |
471
+
472
+ #### `get_invoice`
473
+
474
+ Get invoice details including line items, totals, and payment info.
475
+
476
+ | Parameter | Required | Description |
477
+ |-----------|----------|-------------|
478
+ | `invoiceId` | Yes | Invoice ID (number) |
479
+
480
+ #### `list_subscriptions`
481
+
482
+ List your active local subscriptions (AI Studio, Deploy, VoIP, etc.).
483
+
484
+ #### `check_perks`
485
+
486
+ Check which subscription perks are active on your account (e.g., `deploy_hobby`, `studio_pro`, `voip_basic`).
487
+
488
+ #### `list_orders`
489
+
490
+ List recent orders.
491
+
492
+ | Parameter | Required | Description |
493
+ |-----------|----------|-------------|
494
+ | `page` | No | Page number |
495
+
496
+ #### `get_account_balance`
497
+
498
+ Get your account credit balance.
499
+
500
+ ---
501
+
502
+ ### Service Tools
503
+
504
+ Manage WHMCS hosting and server services.
505
+
506
+ #### `list_services`
507
+
508
+ List all your hosting services with status, domain, IP, and billing info.
509
+
510
+ | Parameter | Required | Description |
511
+ |-----------|----------|-------------|
512
+ | `page` | No | Page number |
513
+
514
+ #### `get_service_details`
515
+
516
+ Get full service details — configuration options, server info, custom fields.
517
+
518
+ | Parameter | Required | Description |
519
+ |-----------|----------|-------------|
520
+ | `serviceId` | Yes | Service ID (number) |
521
+
522
+ #### `get_service_sso_url`
523
+
524
+ Get a single sign-on URL to access your service's control panel (Plesk, Pterodactyl, etc.) without logging in separately.
525
+
526
+ | Parameter | Required | Description |
527
+ |-----------|----------|-------------|
528
+ | `serviceId` | Yes | Service ID |
529
+
530
+ **Example prompt:** *"Give me a login link for my game server"*
531
+
532
+ #### `upgrade_service`
533
+
534
+ Get upgrade/downgrade options and a link to manage the service.
535
+
536
+ | Parameter | Required | Description |
537
+ |-----------|----------|-------------|
538
+ | `serviceId` | Yes | Service ID |
539
+
540
+ ---
541
+
542
+ ### Support Tools
543
+
544
+ Create and manage support tickets.
545
+
546
+ #### `list_tickets`
547
+
548
+ List support tickets with optional status filter.
549
+
550
+ | Parameter | Required | Description |
551
+ |-----------|----------|-------------|
552
+ | `status` | No | `Open`, `Answered`, `Customer-Reply`, `Closed`, `On Hold` |
553
+ | `page` | No | Page number |
554
+
555
+ #### `get_ticket`
556
+
557
+ Get full ticket details including all replies.
558
+
559
+ | Parameter | Required | Description |
560
+ |-----------|----------|-------------|
561
+ | `ticketId` | Yes | Ticket ID (number) |
562
+
563
+ #### `open_support_ticket`
564
+
565
+ Open a new support ticket.
566
+
567
+ | Parameter | Required | Description |
568
+ |-----------|----------|-------------|
569
+ | `deptid` | Yes | Department ID (number) |
570
+ | `subject` | Yes | Ticket subject |
571
+ | `message` | Yes | Ticket body |
572
+ | `priority` | No | `Low`, `Medium`, `High` |
573
+ | `serviceId` | No | Related service ID |
574
+
575
+ **Example prompt:** *"Open a support ticket about my web hosting service being slow"*
576
+
577
+ #### `reply_to_ticket`
578
+
579
+ Add a reply to an existing ticket.
580
+
581
+ | Parameter | Required | Description |
582
+ |-----------|----------|-------------|
583
+ | `ticketId` | Yes | Ticket ID |
584
+ | `message` | Yes | Reply text |
585
+
586
+ #### `close_ticket`
587
+
588
+ Close a ticket with an optional closing message.
589
+
590
+ | Parameter | Required | Description |
591
+ |-----------|----------|-------------|
592
+ | `ticketId` | Yes | Ticket ID |
593
+ | `message` | No | Closing message |
594
+
595
+ ---
596
+
597
+ ### Server Admin (BYOS) Tools
598
+
599
+ Manage your own servers via SSH. These tools work entirely locally — no Suzko account is needed for server admin. Server connections are stored in `~/.suzko/servers.json`.
600
+
601
+ > **Security:** Dangerous commands (like `rm -rf /`, `dd`, `mkfs`, fork bombs) are blocked automatically.
602
+
603
+ #### `connect_server`
604
+
605
+ Register a server and test the SSH connection.
606
+
607
+ | Parameter | Required | Description |
608
+ |-----------|----------|-------------|
609
+ | `alias` | Yes | Friendly name for the server (e.g., "prod-web") |
610
+ | `host` | Yes | IP address or hostname |
611
+ | `user` | No | SSH username (default: `root`) |
612
+ | `port` | No | SSH port (default: `22`) |
613
+ | `keyPath` | No | Path to SSH key (default: `~/.ssh/id_ed25519`) |
614
+
615
+ **Example prompt:** *"Connect to my server at 203.0.113.10 as root and call it prod-web"*
616
+
617
+ #### `list_servers`
618
+
619
+ List all registered servers from the local registry.
620
+
621
+ #### `inspect_server`
622
+
623
+ Run diagnostics — OS, uptime, CPU, memory, disk, Docker status, network.
624
+
625
+ | Parameter | Required | Description |
626
+ |-----------|----------|-------------|
627
+ | `alias` | Yes | Server alias |
628
+
629
+ **Example prompt:** *"What's the status of my prod-web server?"*
630
+
631
+ #### `run_server_command`
632
+
633
+ Execute a shell command on a server via SSH.
634
+
635
+ | Parameter | Required | Description |
636
+ |-----------|----------|-------------|
637
+ | `alias` | Yes | Server alias |
638
+ | `command` | Yes | Shell command to run |
639
+ | `timeout` | No | Timeout in ms (default: 60000) |
640
+
641
+ **Example prompt:** *"Run 'nginx -t' on prod-web to check the config"*
642
+
643
+ #### `install_docker`
644
+
645
+ Install Docker and the compose plugin via the official install script.
646
+
647
+ | Parameter | Required | Description |
648
+ |-----------|----------|-------------|
649
+ | `alias` | Yes | Server alias |
650
+
651
+ #### `deploy_to_server`
652
+
653
+ Upload a local directory via SCP and run `docker compose up -d`.
654
+
655
+ | Parameter | Required | Description |
656
+ |-----------|----------|-------------|
657
+ | `alias` | Yes | Server alias |
658
+ | `localPath` | Yes | Local directory to upload |
659
+ | `remotePath` | No | Remote destination (default: `/opt/deploy`) |
660
+
661
+ **Example prompt:** *"Deploy my project at ./my-app to prod-web"*
662
+
663
+ #### `list_server_containers`
664
+
665
+ List Docker containers on a server.
666
+
667
+ | Parameter | Required | Description |
668
+ |-----------|----------|-------------|
669
+ | `alias` | Yes | Server alias |
670
+ | `all` | No | Include stopped containers (default: `true`) |
671
+
672
+ #### `manage_server_container`
673
+
674
+ Start, stop, restart, or remove a Docker container.
675
+
676
+ | Parameter | Required | Description |
677
+ |-----------|----------|-------------|
678
+ | `alias` | Yes | Server alias |
679
+ | `container` | Yes | Container name or ID |
680
+ | `action` | Yes | `start`, `stop`, `restart`, or `remove` |
681
+
682
+ #### `setup_ssl`
683
+
684
+ Install Certbot and obtain a Let's Encrypt SSL certificate.
685
+
686
+ | Parameter | Required | Description |
687
+ |-----------|----------|-------------|
688
+ | `alias` | Yes | Server alias |
689
+ | `domain` | Yes | Domain for the certificate |
690
+ | `email` | No | Email for renewal notifications |
691
+ | `mode` | No | `nginx` or `standalone` (default: `standalone`) |
692
+
693
+ #### `get_server_status`
694
+
695
+ Get live system status — CPU, memory, disk, load average, top processes, network connections.
696
+
697
+ | Parameter | Required | Description |
698
+ |-----------|----------|-------------|
699
+ | `alias` | Yes | Server alias |
700
+
701
+ #### `get_server_logs`
702
+
703
+ Read logs from various sources.
704
+
705
+ | Parameter | Required | Description |
706
+ |-----------|----------|-------------|
707
+ | `alias` | Yes | Server alias |
708
+ | `source` | Yes | `journalctl`, `docker`, or `file` |
709
+ | `target` | No | Container name (for docker) or file path (for file) |
710
+ | `lines` | No | Number of lines (default: 50) |
711
+
712
+ **Example prompt:** *"Show me nginx logs on prod-web"*
713
+
714
+ #### `manage_env_file`
715
+
716
+ Read or write `.env` files on a server. In `set` mode, merges with existing keys.
717
+
718
+ | Parameter | Required | Description |
719
+ |-----------|----------|-------------|
720
+ | `alias` | Yes | Server alias |
721
+ | `remotePath` | Yes | Path to `.env` file |
722
+ | `mode` | Yes | `get` (read) or `set` (write) |
723
+ | `values` | No | Key-value pairs to set (required for `set` mode) |
724
+
725
+ ---
726
+
727
+ ## Resources
728
+
729
+ Resources are read-only data that your AI can reference during a conversation. They're loaded on demand via `suzko://` URIs.
730
+
731
+ | URI | Description |
732
+ |-----|-------------|
733
+ | `suzko://services` | Your active hosting services |
734
+ | `suzko://deploy/projects` | Your deployed projects and containers |
735
+ | `suzko://domains` | Your registered domains |
736
+ | `suzko://invoices` | Billing history and outstanding invoices |
737
+ | `suzko://perks` | Your active subscription perks |
738
+
739
+ In Claude Desktop, you can attach resources by clicking the 📎 icon and selecting from the `suzko://` list.
740
+
741
+ ---
742
+
743
+ ## Prompts (Workflow Templates)
744
+
745
+ Prompts are pre-built conversation starters for common workflows. They set up the right context so your AI knows which tools to use.
746
+
747
+ ### `deploy-app`
748
+
749
+ Deploy an application end-to-end.
750
+
751
+ | Parameter | Description |
752
+ |-----------|-------------|
753
+ | `appType` | Type of app: "next.js", "express", "static", "docker" |
754
+ | `database` | Database needed: "postgres", "mysql", "mongodb", "none" |
755
+
756
+ **What it does:** Lists templates → creates project → sets up database → configures env vars → verifies everything runs.
757
+
758
+ ### `find-domain`
759
+
760
+ Search and register a domain name.
761
+
762
+ | Parameter | Description |
763
+ |-----------|-------------|
764
+ | `keywords` | Keywords for the domain (e.g., "my startup", "tech blog") |
765
+ | `tld` | Preferred TLD (e.g., ".com", ".dev") |
766
+
767
+ **What it does:** Searches availability → suggests alternatives → shows pricing → handles registration.
768
+
769
+ ### `troubleshoot-service`
770
+
771
+ Diagnose issues with a deployed service.
772
+
773
+ | Parameter | Description |
774
+ |-----------|-------------|
775
+ | `projectId` | Project ID or name |
776
+ | `issue` | Description of the problem |
777
+
778
+ **What it does:** Finds the project → checks status → reads logs → reads build logs → suggests fixes.
779
+
780
+ ### `setup-server`
781
+
782
+ Set up a new BYOS server.
783
+
784
+ | Parameter | Description |
785
+ |-----------|-------------|
786
+ | `host` | Server IP or hostname |
787
+ | `user` | SSH username (default: root) |
788
+ | `purpose` | What the server is for |
789
+
790
+ **What it does:** Connects via SSH → inspects system → installs Docker → sets up services → configures SSL → hardens security.
791
+
792
+ ---
793
+
794
+ ## Human-in-the-Loop Confirmation
795
+
796
+ Operations that cost money or create resources use a **two-step confirmation** flow to prevent accidental charges:
797
+
798
+ 1. You ask the AI to do something (e.g., "Register example.com")
799
+ 2. The tool returns a **cost preview** with a confirmation token
800
+ 3. The AI presents the cost to you: *"example.com costs $12.99/yr. Shall I proceed?"*
801
+ 4. You confirm → the AI calls the confirm tool with the token
802
+ 5. The action is executed
803
+
804
+ **Confirmation tokens:**
805
+ - Valid for **5 minutes** from creation
806
+ - **Single-use** — each token can only be used once
807
+ - Stored in memory on the MCP server process (not persisted)
808
+
809
+ **Operations that require confirmation:**
810
+ - `create_deploy_project` → `confirm_deploy_project`
811
+ - `register_domain` → `confirm_domain_registration`
812
+ - `transfer_domain` → `confirm_domain_transfer`
813
+
814
+ ---
815
+
816
+ ## Example Conversations
817
+
818
+ ### Deploy a Full-Stack App
819
+
820
+ > **You:** I need to deploy a Next.js app with a PostgreSQL database
821
+ >
822
+ > **AI:** Let me check what's available...
823
+ > *(calls `list_deploy_templates`)*
824
+ >
825
+ > I see PostgreSQL and Node.js templates. Let me set up the database first.
826
+ > *(calls `create_deploy_project` with name="my-app-db", templateId="postgres", tier="small")*
827
+ >
828
+ > Here's the cost: **PostgreSQL on small tier (1GB RAM, shared CPU) — $0/mo** (included in your Deploy Pro plan). Want me to proceed?
829
+ >
830
+ > **You:** Yes, go ahead
831
+ >
832
+ > **AI:** *(calls `confirm_deploy_project`)*
833
+ >
834
+ > Database is running! Connection: `postgres://postgres:abc123@my-app-db.suzko.io:5432/postgres`
835
+ >
836
+ > Now let me set up your Next.js app...
837
+ > *(calls `create_deploy_project` with templateId="nodejs", envVars={"DATABASE_URL": "..."})*
838
+
839
+ ### Register a Domain + Configure DNS
840
+
841
+ > **You:** Find me a cool domain for my AI coding tool
842
+ >
843
+ > **AI:** *(calls `suggest_domain_names` with keywords="AI coding tool")*
844
+ >
845
+ > Here are some suggestions:
846
+ > - codesmith.dev — $12.99/yr ✅ Available
847
+ > - aicodecraft.io — $39.99/yr ✅ Available
848
+ > - codecopilot.com — ❌ Taken
849
+ >
850
+ > **You:** Register codesmith.dev for 2 years
851
+ >
852
+ > **AI:** *(calls `register_domain`)*
853
+ >
854
+ > Cost: **codesmith.dev — $25.98** (2 years). Confirm?
855
+ >
856
+ > **You:** Yes
857
+ >
858
+ > **AI:** *(calls `confirm_domain_registration`)*
859
+ >
860
+ > Done! Now let me point it to your deploy project...
861
+ > *(calls `enable_dns_management`, then `create_dns_record` with CNAME)*
862
+
863
+ ### Manage Your Own Server
864
+
865
+ > **You:** I just got a VPS at 198.51.100.25, set it up for Docker hosting
866
+ >
867
+ > **AI:** *(calls `connect_server` with alias="my-vps", host="198.51.100.25")*
868
+ >
869
+ > Connected! Let me check what's installed...
870
+ > *(calls `inspect_server`)*
871
+ >
872
+ > Ubuntu 22.04, no Docker yet. Installing...
873
+ > *(calls `install_docker`)*
874
+ >
875
+ > Docker installed! Now let me deploy your project...
876
+ > *(calls `deploy_to_server` with localPath="./my-app")*
877
+
878
+ ### Troubleshoot a Deployment
879
+
880
+ > **You:** My web app is returning 502 errors
881
+ >
882
+ > **AI:** Let me check your projects...
883
+ > *(calls `list_deploy_projects`)*
884
+ > *(calls `get_deploy_logs` with tail=50)*
885
+ >
886
+ > I see the issue — your app is crashing on startup because `DATABASE_URL` is not set. Let me fix that...
887
+ > *(calls `set_deploy_env` with envVars={"DATABASE_URL": "..."})*
888
+ > *(calls `control_deploy_project` with action="restart")*
889
+ >
890
+ > Restarted! Checking logs... it's running now. ✅
891
+
892
+ ---
893
+
894
+ ## Configuration
895
+
896
+ ### Environment Variables
897
+
898
+ | Variable | Default | Description |
899
+ |----------|---------|-------------|
900
+ | `SUZKO_API_BASE` | `https://www.suzko.com` | API base URL. Change for development. |
901
+
902
+ ### File Locations
903
+
904
+ | File | Purpose |
905
+ |------|---------|
906
+ | `~/.suzko/mcp-credentials.json` | Auth tokens (auto-managed) |
907
+ | `~/.suzko/servers.json` | BYOS server registry (managed by server admin tools) |
908
+
909
+ ---
910
+
911
+ ## Troubleshooting
912
+
913
+ ### "Not authenticated" errors
914
+
915
+ Run `npx @suzko/mcp-server auth login` to log in, or `auth status` to check your token.
916
+
917
+ ### Tools not appearing in IDE
918
+
919
+ 1. Verify the MCP config is valid JSON
920
+ 2. Restart your IDE after changing MCP config
921
+ 3. Check the MCP server logs in your IDE's output panel
922
+ 4. Run `npx @suzko/mcp-server --help` to verify the package works
923
+
924
+ ### "API error 401"
925
+
926
+ Your token may have expired and auto-refresh failed. Run `auth login` again.
927
+
928
+ ### "API error 403" on deploy tools
929
+
930
+ You may need a Deploy subscription. Check with `check_perks` — you need at least `deploy_hobby`.
931
+
932
+ ### Server admin SSH failures
933
+
934
+ - Verify your SSH key exists at the configured path
935
+ - Check the server accepts key-based authentication
936
+ - Try connecting manually: `ssh -i ~/.ssh/id_ed25519 root@your-server`
937
+ - Ensure the server's SSH port is reachable (not blocked by firewall)
938
+
939
+ ### Slow tool responses
940
+
941
+ The MCP server calls the Suzko API over HTTPS. If responses are slow:
942
+ - Check your internet connection
943
+ - The first call may be slower (token refresh)
944
+ - Deploy operations (create, build) are async and may take 10–30 seconds
945
+
946
+ ### IDE-specific issues
947
+
948
+ **VS Code:** Make sure you're in **agent mode** (not ask/edit mode) for tool execution.
949
+
950
+ **Claude Desktop:** After editing config, fully quit and reopen (not just close the window).
951
+
952
+ **Cursor:** MCP tools appear in Composer, not regular chat.