impreza-mcp 0.48.1 → 0.50.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/README.md CHANGED
@@ -20,6 +20,43 @@ Set `IMPREZA_BASE_URL` before pairing for a different API endpoint. HTTPS is req
20
20
 
21
21
  An existing credential file is never overwritten. Revoke an old paired key in clientarea before removing its file and pairing again. If an exchange or disk write fails, the code may already have been consumed: check and revoke the new key in clientarea before generating another code. Restart the AI client after pairing.
22
22
 
23
+ ## Protect an app, safer deployment IDs and bare VPS orders (0.50.0)
24
+
25
+ - **Protect an app, as a guided prompt.** `prompts/list` adds `impreza_protect_app`. Starting from one of your
26
+ running apps, it walks the assistant through a cold standby on a server you own in another country: choose the
27
+ target with the human, create the standby (`impreza_deploy_catalog_app` with `standby: true`), pair it and run the
28
+ first restore drill, each step behind its own explicit human confirmation. After a verified drill it reports the
29
+ measured copy age and drill duration; these are measurements, not a guaranteed RPO or RTO. It never buys a server,
30
+ promotes the standby, switches traffic or changes DNS, and it covers the reviewed failover apps (Memos 0.31.0 and
31
+ Uptime Kuma 2.5.5). Like every prompt, it grants no authority.
32
+ - **Server locations:** `impreza_list_servers` returns each server's `failover_location` in its structured output:
33
+ `country_code`, `country_basis` (`verified`, `operator_verified` or `declared`; a country you declared for an
34
+ external server is not verified by Impreza) and `country_notice`.
35
+ - **Deployment IDs cannot add path segments.** A `deployment_id` that would add or change path segments in an API
36
+ URL (`.`, `..`, `/`, `\`, `%`, whitespace or control characters) is refused before any request leaves the process.
37
+ Valid IDs are sent exactly as before.
38
+ - **A VPS ordered through the API is bare by default.** `impreza_order_vps` and `impreza_vps_offer` now describe what
39
+ the API does: without `app`, the VPS is born with `app: "none"` (bare OS, no agent). Pass `app: "@agent"` explicitly
40
+ when the customer wants it deployable, or offer `impreza_install_agent` later with the customer's confirmation.
41
+ After ordering, poll `impreza_list_services`; `impreza_list_servers` lists only servers with an installed agent.
42
+ - **Exact direct dependencies.** The package pins its direct runtime dependencies to the exact versions it was tested
43
+ with (see [Dependency versions](#dependency-versions)).
44
+
45
+ ## Install the agent, enter secrets outside the chat, and protect custom apps (0.49.0)
46
+
47
+ - **`impreza_install_agent`** offers the Impreza agent on a managed VPS that does not have it yet, only with the
48
+ customer's explicit agreement: the first call installs nothing and returns a short-lived `confirm_token`; the second
49
+ call, with the same arguments plus that token, starts the install. **`impreza_get_agent_install`** says whether a VPS
50
+ can take it and follows the install until the agent is online.
51
+ - **Secrets never pass through the chat.** `impreza_prepare_secret_entry` returns a ten-minute, single-use portal link
52
+ for a secret variable of an existing app or variable group; the account owner opens it, signs in and types the value
53
+ there. `impreza_get_secret_entry` reports only `pending`, `stored`, `expired` or `cancelled` — never the value or a
54
+ hash of it. Tools now refuse secret values (passwords, Git tokens, onion private keys, build secrets) in their
55
+ arguments and point to the portal instead; the REST API is unchanged.
56
+ - **Jurisdiction failover for custom projects:** `impreza_deploy_custom` accepts `standby: true` to create a cold
57
+ standby on another server, from the **same pinned source** (image digest, exact git commit, or the frozen Compose
58
+ upload). The project must declare every persistent volume, and a custom pair cuts over only after a verified drill.
59
+
23
60
  ## Deployment progress and agent restarts
24
61
 
25
62
  Compose review and deployment accept
@@ -278,7 +315,7 @@ Static npm sites: choose build_strategy=node_npm_static with a Git/context sourc
278
315
 
279
316
  ## Status
280
317
 
281
- **Package version: 0.48.1.** The tool catalog covers app deployment plus account +
318
+ **Package version: 0.50.0.** The tool catalog covers app deployment plus account +
282
319
  crypto balance, catalog + ordering, domains/DNS + registration, invoices, VPS
283
320
  lifecycle with snapshots and backups, dedicated / bare-metal servers, plan
284
321
  upgrades, and Titan / Google Workspace mailboxes — with a setup wizard that
@@ -290,7 +327,7 @@ output kept, outbound webhooks so you stop polling, reading the app's own
290
327
  files, and running the app's own command line.
291
328
 
292
329
  The local (`npx`) server and the hosted OAuth connector expose the **same tool
293
- catalog — 212 tools in the local package**. Declared, one-direction gaps remain:
330
+ catalog — 216 tools in the local package**. Declared, one-direction gaps remain:
294
331
  `impreza_get_log_request` stays hosted-only (only the control plane resolves a
295
332
  bare `request_id`; locally, call `impreza_tail_logs` again on the application —
296
333
  requests dedupe); `impreza_list_approvals`, `impreza_get_approval` and
@@ -465,7 +502,7 @@ and `impreza_api_search` finds anything not named here.
465
502
  | **Catalog & ordering** | |
466
503
  | `impreza_list_products` | `GET /v1/products` — products + pricing; the VPS is listed at its smallest size (`configurable: true`) |
467
504
  | `impreza_vps_offer` | `GET /v1/products/vps` — VPS locations, operating systems, CPU / memory / disk ranges and prices; with a whole configuration, `GET /v1/products/vps/quote` — its exact price |
468
- | `impreza_order_vps` | `POST /v1/orders` — a VPS by location, OS and size (or a fixed plan by `product_id`); paid from balance; born deployable (`@agent`); 202 + poll `impreza_list_servers` |
505
+ | `impreza_order_vps` | `POST /v1/orders` — a VPS by location, OS and size (or a fixed plan by `product_id`); paid from balance; bare OS by default (`app: "none"`); explicitly request `app: "@agent"` for deployment, or use `impreza_install_agent` later with customer confirmation; 202 + poll `impreza_list_services` |
469
506
  | **Domains & DNS** | |
470
507
  | `impreza_domain_check` | `GET /v1/domains/check` |
471
508
  | `impreza_domain_details` | `GET /v1/domains/{domain}` |
@@ -909,3 +946,9 @@ uninstalled application does not delete key material.
909
946
  See the [onion guide](https://docs.imprezahost.com/onion-services.html)
910
947
  for permissions, customer update steps and supported limitations.
911
948
 
949
+ ## Dependency versions
950
+
951
+ The package manifest pins each direct runtime dependency to an exact version: `@modelcontextprotocol/sdk` 1.29.0,
952
+ `tar` 7.5.22 and `zod` 3.25.76. Source builds use `package-lock.json` for the tested dependency tree. Transitive
953
+ dependencies may still change during a fresh consumer installation; dependency updates require a rebuilt package, a
954
+ clean installation test and a review of the installed tree before release.
@@ -4228,6 +4228,48 @@ export const OUTPUT_SCHEMAS = {
4228
4228
  }
4229
4229
  }
4230
4230
  },
4231
+ "agentless_servers": {
4232
+ "type": "array",
4233
+ "$comment": "Only with an unrestricted credential; never present for a confined one.",
4234
+ "items": {
4235
+ "type": "object",
4236
+ "additionalProperties": false,
4237
+ "required": [
4238
+ "service_id",
4239
+ "hostname",
4240
+ "product",
4241
+ "agent_installable",
4242
+ "reason",
4243
+ "detail"
4244
+ ],
4245
+ "properties": {
4246
+ "service_id": {
4247
+ "type": "integer"
4248
+ },
4249
+ "hostname": {
4250
+ "type": "string"
4251
+ },
4252
+ "product": {
4253
+ "type": "string"
4254
+ },
4255
+ "agent_installable": {
4256
+ "type": [
4257
+ "boolean",
4258
+ "null"
4259
+ ]
4260
+ },
4261
+ "reason": {
4262
+ "type": [
4263
+ "string",
4264
+ "null"
4265
+ ]
4266
+ },
4267
+ "detail": {
4268
+ "type": "string"
4269
+ }
4270
+ }
4271
+ }
4272
+ },
4231
4273
  "generated_at": {
4232
4274
  "type": "string"
4233
4275
  }
@@ -4295,6 +4337,192 @@ export const OUTPUT_SCHEMAS = {
4295
4337
  }
4296
4338
  ]
4297
4339
  },
4340
+ "impreza_get_agent_install": {
4341
+ "type": "object",
4342
+ "anyOf": [
4343
+ {
4344
+ "type": "object",
4345
+ "additionalProperties": false,
4346
+ "required": [
4347
+ "service_id",
4348
+ "hostname",
4349
+ "product",
4350
+ "agent_installable",
4351
+ "reason",
4352
+ "detail",
4353
+ "about",
4354
+ "script_sha256",
4355
+ "state",
4356
+ "job",
4357
+ "agent"
4358
+ ],
4359
+ "properties": {
4360
+ "service_id": {
4361
+ "type": "integer"
4362
+ },
4363
+ "hostname": {
4364
+ "type": "string"
4365
+ },
4366
+ "product": {
4367
+ "type": "string"
4368
+ },
4369
+ "agent_installable": {
4370
+ "type": [
4371
+ "boolean",
4372
+ "null"
4373
+ ]
4374
+ },
4375
+ "reason": {
4376
+ "type": [
4377
+ "string",
4378
+ "null"
4379
+ ],
4380
+ "enum": [
4381
+ "server_stopped",
4382
+ "guest_agent_unavailable",
4383
+ "os_rhel_family",
4384
+ "os_unsupported",
4385
+ "os_unknown",
4386
+ "service_not_active",
4387
+ "not_provisioned",
4388
+ "control_panel_server",
4389
+ "install_in_progress",
4390
+ "agent_present",
4391
+ "platform_unavailable",
4392
+ "not_checked",
4393
+ null
4394
+ ]
4395
+ },
4396
+ "detail": {
4397
+ "type": "string"
4398
+ },
4399
+ "about": {
4400
+ "type": "string"
4401
+ },
4402
+ "script_sha256": {
4403
+ "type": "string"
4404
+ },
4405
+ "state": {
4406
+ "type": "string",
4407
+ "enum": [
4408
+ "not_started",
4409
+ "installing",
4410
+ "registering",
4411
+ "registered",
4412
+ "online",
4413
+ "failed"
4414
+ ]
4415
+ },
4416
+ "job": {
4417
+ "type": [
4418
+ "object",
4419
+ "null"
4420
+ ],
4421
+ "additionalProperties": false,
4422
+ "required": [
4423
+ "status",
4424
+ "attempts",
4425
+ "created_at",
4426
+ "last_error"
4427
+ ],
4428
+ "properties": {
4429
+ "status": {
4430
+ "type": "string"
4431
+ },
4432
+ "attempts": {
4433
+ "type": "integer"
4434
+ },
4435
+ "created_at": {
4436
+ "type": "string"
4437
+ },
4438
+ "last_error": {
4439
+ "type": "string"
4440
+ }
4441
+ }
4442
+ },
4443
+ "agent": {
4444
+ "type": [
4445
+ "object",
4446
+ "null"
4447
+ ],
4448
+ "additionalProperties": false,
4449
+ "required": [
4450
+ "status",
4451
+ "version"
4452
+ ],
4453
+ "properties": {
4454
+ "status": {
4455
+ "type": "string"
4456
+ },
4457
+ "version": {
4458
+ "type": "string"
4459
+ }
4460
+ }
4461
+ }
4462
+ }
4463
+ },
4464
+ {
4465
+ "type": "object",
4466
+ "additionalProperties": false,
4467
+ "required": [
4468
+ "error"
4469
+ ],
4470
+ "properties": {
4471
+ "error": {
4472
+ "type": "object",
4473
+ "additionalProperties": false,
4474
+ "required": [
4475
+ "code",
4476
+ "message",
4477
+ "next_steps"
4478
+ ],
4479
+ "properties": {
4480
+ "code": {
4481
+ "type": "string",
4482
+ "pattern": "^[A-Z][A-Z_0-9]{1,63}$"
4483
+ },
4484
+ "message": {
4485
+ "type": "string"
4486
+ },
4487
+ "next_steps": {
4488
+ "type": "array",
4489
+ "minItems": 1,
4490
+ "items": {
4491
+ "type": "object",
4492
+ "additionalProperties": false,
4493
+ "required": [
4494
+ "action",
4495
+ "doc"
4496
+ ],
4497
+ "properties": {
4498
+ "action": {
4499
+ "type": "string"
4500
+ },
4501
+ "tool": {
4502
+ "type": "string"
4503
+ },
4504
+ "missing": {
4505
+ "type": "array",
4506
+ "items": {
4507
+ "type": "string"
4508
+ }
4509
+ },
4510
+ "doc": {
4511
+ "type": "string",
4512
+ "pattern": "^https://docs[.]imprezahost[.]com/"
4513
+ },
4514
+ "requires": {
4515
+ "type": "string"
4516
+ }
4517
+ }
4518
+ }
4519
+ }
4520
+ }
4521
+ }
4522
+ }
4523
+ }
4524
+ ]
4525
+ },
4298
4526
  "impreza_get_app_read": {
4299
4527
  "type": "object",
4300
4528
  "anyOf": [
@@ -7838,6 +8066,98 @@ export const OUTPUT_SCHEMAS = {
7838
8066
  }
7839
8067
  ]
7840
8068
  },
8069
+ "impreza_get_secret_entry": {
8070
+ "type": "object",
8071
+ "anyOf": [
8072
+ {
8073
+ "type": "object",
8074
+ "additionalProperties": false,
8075
+ "properties": {
8076
+ "session_id": {
8077
+ "type": "string",
8078
+ "pattern": "^sen_[a-f0-9]{32}$"
8079
+ },
8080
+ "variable_name": {
8081
+ "type": "string"
8082
+ },
8083
+ "status": {
8084
+ "type": "string",
8085
+ "enum": [
8086
+ "pending",
8087
+ "stored",
8088
+ "expired",
8089
+ "cancelled"
8090
+ ]
8091
+ }
8092
+ },
8093
+ "required": [
8094
+ "session_id",
8095
+ "variable_name",
8096
+ "status"
8097
+ ]
8098
+ },
8099
+ {
8100
+ "type": "object",
8101
+ "additionalProperties": false,
8102
+ "required": [
8103
+ "error"
8104
+ ],
8105
+ "properties": {
8106
+ "error": {
8107
+ "type": "object",
8108
+ "additionalProperties": false,
8109
+ "required": [
8110
+ "code",
8111
+ "message",
8112
+ "next_steps"
8113
+ ],
8114
+ "properties": {
8115
+ "code": {
8116
+ "type": "string",
8117
+ "pattern": "^[A-Z][A-Z_0-9]{1,63}$"
8118
+ },
8119
+ "message": {
8120
+ "type": "string"
8121
+ },
8122
+ "next_steps": {
8123
+ "type": "array",
8124
+ "minItems": 1,
8125
+ "items": {
8126
+ "type": "object",
8127
+ "additionalProperties": false,
8128
+ "required": [
8129
+ "action",
8130
+ "doc"
8131
+ ],
8132
+ "properties": {
8133
+ "action": {
8134
+ "type": "string"
8135
+ },
8136
+ "tool": {
8137
+ "type": "string"
8138
+ },
8139
+ "missing": {
8140
+ "type": "array",
8141
+ "items": {
8142
+ "type": "string"
8143
+ }
8144
+ },
8145
+ "doc": {
8146
+ "type": "string",
8147
+ "pattern": "^https://docs[.]imprezahost[.]com/"
8148
+ },
8149
+ "requires": {
8150
+ "type": "string"
8151
+ }
8152
+ }
8153
+ }
8154
+ }
8155
+ }
8156
+ }
8157
+ }
8158
+ }
8159
+ ]
8160
+ },
7841
8161
  "impreza_get_service_binding_plan": {
7842
8162
  "type": "object",
7843
8163
  "anyOf": [
@@ -11594,6 +11914,42 @@ export const OUTPUT_SCHEMAS = {
11594
11914
  "object",
11595
11915
  "null"
11596
11916
  ]
11917
+ },
11918
+ "failover_location": {
11919
+ "oneOf": [
11920
+ {
11921
+ "type": "null"
11922
+ },
11923
+ {
11924
+ "type": "object",
11925
+ "additionalProperties": false,
11926
+ "required": [
11927
+ "country_code",
11928
+ "country_basis",
11929
+ "country_notice"
11930
+ ],
11931
+ "properties": {
11932
+ "country_code": {
11933
+ "type": "string",
11934
+ "pattern": "^[A-Z]{2}$"
11935
+ },
11936
+ "country_basis": {
11937
+ "type": "string",
11938
+ "enum": [
11939
+ "verified",
11940
+ "operator_verified",
11941
+ "declared"
11942
+ ]
11943
+ },
11944
+ "country_notice": {
11945
+ "type": [
11946
+ "string",
11947
+ "null"
11948
+ ]
11949
+ }
11950
+ }
11951
+ }
11952
+ ]
11597
11953
  }
11598
11954
  }
11599
11955
  }
@@ -14201,6 +14557,114 @@ export const OUTPUT_SCHEMAS = {
14201
14557
  }
14202
14558
  ]
14203
14559
  },
14560
+ "impreza_prepare_secret_entry": {
14561
+ "type": "object",
14562
+ "anyOf": [
14563
+ {
14564
+ "type": "object",
14565
+ "additionalProperties": false,
14566
+ "properties": {
14567
+ "session_id": {
14568
+ "type": "string",
14569
+ "pattern": "^sen_[a-f0-9]{32}$"
14570
+ },
14571
+ "variable_name": {
14572
+ "type": "string"
14573
+ },
14574
+ "status": {
14575
+ "type": "string",
14576
+ "enum": [
14577
+ "pending",
14578
+ "stored",
14579
+ "expired",
14580
+ "cancelled"
14581
+ ]
14582
+ },
14583
+ "expires_at": {
14584
+ "type": "string"
14585
+ },
14586
+ "url": {
14587
+ "type": "string"
14588
+ },
14589
+ "onion_url": {
14590
+ "type": "string"
14591
+ },
14592
+ "note": {
14593
+ "type": "string"
14594
+ }
14595
+ },
14596
+ "required": [
14597
+ "session_id",
14598
+ "variable_name",
14599
+ "status",
14600
+ "expires_at",
14601
+ "url",
14602
+ "onion_url",
14603
+ "note"
14604
+ ]
14605
+ },
14606
+ {
14607
+ "type": "object",
14608
+ "additionalProperties": false,
14609
+ "required": [
14610
+ "error"
14611
+ ],
14612
+ "properties": {
14613
+ "error": {
14614
+ "type": "object",
14615
+ "additionalProperties": false,
14616
+ "required": [
14617
+ "code",
14618
+ "message",
14619
+ "next_steps"
14620
+ ],
14621
+ "properties": {
14622
+ "code": {
14623
+ "type": "string",
14624
+ "pattern": "^[A-Z][A-Z_0-9]{1,63}$"
14625
+ },
14626
+ "message": {
14627
+ "type": "string"
14628
+ },
14629
+ "next_steps": {
14630
+ "type": "array",
14631
+ "minItems": 1,
14632
+ "items": {
14633
+ "type": "object",
14634
+ "additionalProperties": false,
14635
+ "required": [
14636
+ "action",
14637
+ "doc"
14638
+ ],
14639
+ "properties": {
14640
+ "action": {
14641
+ "type": "string"
14642
+ },
14643
+ "tool": {
14644
+ "type": "string"
14645
+ },
14646
+ "missing": {
14647
+ "type": "array",
14648
+ "items": {
14649
+ "type": "string"
14650
+ }
14651
+ },
14652
+ "doc": {
14653
+ "type": "string",
14654
+ "pattern": "^https://docs[.]imprezahost[.]com/"
14655
+ },
14656
+ "requires": {
14657
+ "type": "string"
14658
+ }
14659
+ }
14660
+ }
14661
+ }
14662
+ }
14663
+ }
14664
+ }
14665
+ }
14666
+ ]
14667
+ },
14204
14668
  "impreza_prepare_service_binding": {
14205
14669
  "type": "object",
14206
14670
  "anyOf": [