neozip-mcp 0.1.0-beta

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.
Files changed (113) hide show
  1. package/.cursor/mcp.json.global.example +10 -0
  2. package/CHANGELOG.md +16 -0
  3. package/DOCUMENTATION.md +40 -0
  4. package/LICENSE +16 -0
  5. package/README.md +223 -0
  6. package/SECURITY.md +37 -0
  7. package/dist/account/account-state.js +86 -0
  8. package/dist/account/format-account-status.js +37 -0
  9. package/dist/account/identity-provision.js +75 -0
  10. package/dist/account/identity-wrap.js +69 -0
  11. package/dist/account/profile-crypto.js +47 -0
  12. package/dist/account/profile-store.js +108 -0
  13. package/dist/account/require-account.js +29 -0
  14. package/dist/account/token-service-identity.js +395 -0
  15. package/dist/account/types.js +2 -0
  16. package/dist/account/wallet-evm.js +39 -0
  17. package/dist/archive/blockchain-status.js +303 -0
  18. package/dist/archive/crypto-self.js +114 -0
  19. package/dist/archive/detect-text.js +56 -0
  20. package/dist/archive/embed-metadata.js +283 -0
  21. package/dist/archive/encryption.js +166 -0
  22. package/dist/archive/extract-entry-buffer.js +18 -0
  23. package/dist/archive/find-entry.js +21 -0
  24. package/dist/archive/grep-content.js +141 -0
  25. package/dist/archive/identity-key.js +176 -0
  26. package/dist/archive/manifest.js +55 -0
  27. package/dist/archive/merkle.js +31 -0
  28. package/dist/archive/metadata-paths.js +14 -0
  29. package/dist/archive/mint-archive.js +61 -0
  30. package/dist/archive/open-archive.js +23 -0
  31. package/dist/archive/read-entry-buffer.js +11 -0
  32. package/dist/archive/read-entry-content.js +51 -0
  33. package/dist/archive/recipient-access.js +26 -0
  34. package/dist/archive/recipient-decrypt.js +21 -0
  35. package/dist/archive/recipient-lookup.js +55 -0
  36. package/dist/archive/timestamp-network.js +54 -0
  37. package/dist/config/capabilities.js +37 -0
  38. package/dist/config/index.js +74 -0
  39. package/dist/connect-cli.js +312 -0
  40. package/dist/connection/coordinator.js +74 -0
  41. package/dist/connection/credentials.js +29 -0
  42. package/dist/connection/crypto.js +56 -0
  43. package/dist/connection/dump.js +79 -0
  44. package/dist/connection/incomplete-setup.js +81 -0
  45. package/dist/connection/interactive.js +814 -0
  46. package/dist/connection/legacy-profile-reader.js +47 -0
  47. package/dist/connection/magic-link.js +138 -0
  48. package/dist/connection/migrate.js +76 -0
  49. package/dist/connection/onboarding.js +524 -0
  50. package/dist/connection/origin.js +63 -0
  51. package/dist/connection/phase.js +93 -0
  52. package/dist/connection/phone.js +20 -0
  53. package/dist/connection/promote-active.js +53 -0
  54. package/dist/connection/reset.js +20 -0
  55. package/dist/connection/setup-guidance.js +154 -0
  56. package/dist/connection/status-report.js +40 -0
  57. package/dist/connection/store.js +352 -0
  58. package/dist/connection/token-auth.js +42 -0
  59. package/dist/connection/types.js +2 -0
  60. package/dist/connection/wallet-setup.js +70 -0
  61. package/dist/constants/wallet-identity.js +11 -0
  62. package/dist/index.js +47 -0
  63. package/dist/load-env.js +16 -0
  64. package/dist/neozipkit-node.js +11 -0
  65. package/dist/register/resources.js +14 -0
  66. package/dist/register/tools.js +77 -0
  67. package/dist/resources/zip-resource.js +40 -0
  68. package/dist/resources/zip-uri.js +23 -0
  69. package/dist/security/auth.js +28 -0
  70. package/dist/security/capabilities.js +85 -0
  71. package/dist/security/rate-limiter.js +43 -0
  72. package/dist/security/resource-limiter.js +44 -0
  73. package/dist/security/sandbox.js +61 -0
  74. package/dist/server.js +32 -0
  75. package/dist/startup-account-gate.js +101 -0
  76. package/dist/startup-summary.js +40 -0
  77. package/dist/token-service/require-configured.js +23 -0
  78. package/dist/tools/account.js +504 -0
  79. package/dist/tools/compress.js +237 -0
  80. package/dist/tools/connect-status.js +143 -0
  81. package/dist/tools/extract.js +62 -0
  82. package/dist/tools/grep-entries.js +42 -0
  83. package/dist/tools/identity-status.js +157 -0
  84. package/dist/tools/info.js +147 -0
  85. package/dist/tools/list.js +118 -0
  86. package/dist/tools/lookup-recipient.js +37 -0
  87. package/dist/tools/mint.js +41 -0
  88. package/dist/tools/read-entry.js +35 -0
  89. package/dist/tools/search-entries.js +71 -0
  90. package/dist/tools/stamp.js +60 -0
  91. package/dist/tools/test.js +90 -0
  92. package/dist/tools/token-service-account.js +143 -0
  93. package/dist/tools/upgrade.js +60 -0
  94. package/dist/tools/verify.js +75 -0
  95. package/dist/tools/wallet-config-status.js +119 -0
  96. package/dist/tools/wallet-info.js +64 -0
  97. package/dist/translators/index.js +106 -0
  98. package/dist/types/index.js +7 -0
  99. package/dist/util/mask.js +30 -0
  100. package/dist/util/token-service-fetch.js +23 -0
  101. package/dist/vendor/neozipkit-pro.js +3 -0
  102. package/docs/NEOZIP_CONNECTION_STORE.md +238 -0
  103. package/docs/NEOZIP_CONNECT_CLI.md +185 -0
  104. package/docs/OPERATIONS.md +992 -0
  105. package/docs/examples/CLAUDE.md.example +22 -0
  106. package/docs/examples/claude/skills/neozip-mcp/SKILL.md +54 -0
  107. package/docs/examples/claude/skills/neozip-notarization/SKILL.md +75 -0
  108. package/docs/examples/mcp.json.claude.example +11 -0
  109. package/docs/examples/neozip-mcp-cursor-rule.mdc +31 -0
  110. package/docs/installation-guides/INSTALL_CLAUDE_CODE.md +286 -0
  111. package/docs/installation-guides/INSTALL_CLAUDE_WORKSPACE.md +301 -0
  112. package/docs/installation-guides/README.md +76 -0
  113. package/package.json +99 -0
@@ -0,0 +1,992 @@
1
+ # NeoZip MCP Operations Reference
2
+
3
+ > **Beta:** This package is in beta (`neozip-mcp@beta`). Tool names, parameters, and behavior may change before a stable release.
4
+
5
+ This document describes every MCP tool exposed by **neozip-mcp**, including parameters, options, requirements, and typical output.
6
+
7
+ Tools are enabled via capability groups (`NEOZIP_MCP_CAPABILITIES`, default **`auto`**):
8
+
9
+ | Group | Tools |
10
+ |-------|-------|
11
+ | `zip` | `compress`, `extract`, `list`, `info`, `test`, `read_entry`, `search_entries`, `grep_entries`, `upgrade_timestamped`, `token_service_status`, `lookup_recipient`, `wallet_config_status`, `identity_status`, **`connect_status`** |
12
+ | `blockchain` | `mint`, `verify`, `stamp`, `upgrade_timestamped`, `wallet_info`, `wallet_config_status`, `identity_status`, `token_service_status`, `token_service_register`, `token_service_verify`, `lookup_recipient`, **`connect_status`** |
13
+ | `readonly` | `list`, `info`, `test`, `verify`, `wallet_info`, `wallet_config_status`, `identity_status`, `read_entry`, `search_entries`, `grep_entries`, `upgrade_timestamped`, `token_service_status`, `lookup_recipient`, **`connect_status`** |
14
+ | `account` | `account_status`, `account_list`, `account_create`, `account_select`, `account_register_email`, `account_verify_email`, `account_create_wallet`, `account_import_wallet`, `account_link_wallet`, `account_provision_identity`, `account_remove`, `account_logout`, `account_initialize`, `wallet_config_status`, `identity_status`, **`connect_status`** |
15
+
16
+ ### `auto` capabilities (default)
17
+
18
+ When unset or set to `auto`, the server resolves capabilities at startup from the NeoZip connection store:
19
+
20
+ | Connect state | Resolved groups |
21
+ |---------------|-----------------|
22
+ | `phase: ready` and access token valid | `zip`, `blockchain`, `readonly` |
23
+ | Otherwise (no profile, incomplete setup, expired token) | `zip`, `readonly` |
24
+
25
+ After `neozip-connect` finishes, reload MCP in your host (Cursor Settings, `claude mcp list`, etc.) so blockchain tools appear. Use an explicit comma list (e.g. `zip,readonly` or `zip`) to pin behavior regardless of connect state.
26
+
27
+ ### Installed stdio: startup vs Token Service tools
28
+
29
+ The MCP server **starts by default** without requiring Token Service setup. With **`auto`** capabilities (default), blockchain tools are exposed only after `neozip-connect` reaches `phase: ready`. Tools that need the service (`stamp`, `compress` with `timestamp`/`tokenize`/`recipientEmails`, etc.) return a setup message at runtime when connect is incomplete.
30
+
31
+ Optional **startup gate** (server exits until `phase: ready`):
32
+
33
+ - Resolved capabilities include `blockchain` or `account` (happens automatically when `auto` and connect is ready)
34
+ - `NEOZIP_MCP_REQUIRE_ACCOUNT=true`
35
+
36
+ For strict stdio installs: run `neozip-connect`, then reload MCP.
37
+
38
+ **Host setup:** [installation-guides/INSTALL_CLAUDE_CODE.md](./installation-guides/INSTALL_CLAUDE_CODE.md), [installation-guides/INSTALL_CLAUDE_WORKSPACE.md](./installation-guides/INSTALL_CLAUDE_WORKSPACE.md), Cursor — package README and [`.cursor/mcp.json.global.example`](../.cursor/mcp.json.global.example).
39
+
40
+ All file paths must fall within the configured sandbox (`NEOZIP_MCP_SANDBOX_PATHS`, default: current working directory and home directory). Operations that read or write files validate paths before execution.
41
+
42
+ All tools return MCP text content. Errors are returned as `Error: <message>` rather than thrown.
43
+
44
+ ---
45
+
46
+ ## ZIP Operations
47
+
48
+ ### `compress`
49
+
50
+ Create a ZIP archive from one or more files or directories.
51
+
52
+ **Parameters**
53
+
54
+ | Name | Type | Required | Description |
55
+ |------|------|----------|-------------|
56
+ | `input` | `string` or `string[]` | Yes | File or directory path(s) to include in the archive. Directories are expanded recursively. |
57
+ | `output` | `string` | Yes | Output archive path (`.zip` or `.nzip`). Parent directories are created if needed. |
58
+ | `options` | `object` | No | Compression and metadata options (see below). |
59
+
60
+ **Options**
61
+
62
+ | Name | Type | Default | Description |
63
+ |------|------|---------|-------------|
64
+ | `level` | `number` (0–9) | `6` | Compression level. Higher values generally produce smaller files at the cost of speed. |
65
+ | `method` | `"deflate"` \| `"zstd"` \| `"store"` | `"zstd"` | Compression method. Default is Zstandard; use `deflate` or `store` to override. |
66
+ | `password` | `string` | — | Password for encrypted archives. When set, entries are encrypted (default method: **NeoZip AES-256**). |
67
+ | `encryptionMethod` | `"zipcrypto"` \| `"aes256"` \| `"neo-aes256"` | `"neo-aes256"` (when `password` set) | PKZIP ZipCrypto, WinZip AES-256, or NeoZip AES-256. |
68
+ | `encryptionStrength` | `1` \| `2` \| `3` | — | **Deprecated.** Maps to `encryptionMethod`: `1` → zipcrypto, `2` → aes256, `3` → neo-aes256. Ignored when `encryptionMethod` is set. |
69
+ | `useSHA256` | `boolean` | `false` | Per-entry SHA-256 hashes and merkle root. **Auto-enabled** when `timestamp` or `tokenize` is `true`. Only needed for plain archives when you want merkle metadata without Token Service or on-chain steps. |
70
+ | `timestamp` | `boolean` | `false` | After compression, submit the merkle root to the **NeoZip Token Service** and embed `META-INF/TS-SUBMIT.NZIP`. Requires verified email via **neozip-connect** (or `options.recipientEmail`). Implies `useSHA256`. Mutually exclusive with `tokenize`. |
71
+ | `tokenize` | `boolean` | `false` | After compression, mint the merkle root on-chain and embed `META-INF/TOKEN.NZIP`. Requires wallet from **neozip-connect** (`finish`). Implies `useSHA256`. Mutually exclusive with `timestamp` — use this when a wallet is available; tokenized archives provide on-chain proof and supersede the timestamp-only path. |
72
+ | `recipientEmail` | `string` | connect profile email | Verified email for Token Service timestamp submission (used when `timestamp: true`). Also used as sender when `includeSenderAsRecipient` is true. |
73
+ | `recipientEmails` | `string[]` | — | Token Service emails for **recipient encryption** (`META-INF/ACCESS.NZIP`). Mutually exclusive with `password`, `timestamp`, and `tokenize`. |
74
+ | `includeSenderAsRecipient` | `boolean` | `true` | When `recipientEmails` is set, also encrypt for the neozip-connect profile email if that account has a provisioned public key. |
75
+ | `serverUrl` | `string` | connect profile URL | NeoZip Token Service base URL. |
76
+ | `network` | `string` | `NEOZIP_NETWORK` | Blockchain network for `tokenize` (e.g. `base-sepolia`). |
77
+ | `comment` | `string` | — | Archive comment stored in ZIP metadata. |
78
+ | `overwrite` | `boolean` | `false` | Overwrite `output` if it already exists. When `false`, the operation fails if the file exists. |
79
+
80
+ **Archive types**
81
+
82
+ | Goal | Options |
83
+ |------|---------|
84
+ | Plain archive (default) | Omit `useSHA256`, `timestamp`, and `tokenize` |
85
+ | SHA-256 archive only | `useSHA256: true` |
86
+ | Timestamped `.nzip` | `timestamp: true` (+ verified recipient email) |
87
+ | Tokenized `.nzip` | `tokenize: true` (+ wallet on supported network) |
88
+ | Password-protected | `password` (+ optional `encryptionMethod`) |
89
+ | Recipient-encrypted | `recipientEmails` (public keys from Token Service) |
90
+
91
+ **Recipient encryption (public-key)**
92
+
93
+ - Uses `@neowareinc/neozipkit-pro`: inner NeoZip AES-256 payload + ECIES-wrapped keys in `META-INF/ACCESS.NZIP`.
94
+ - Recipients must have provisioned X25519 keys on the Token Service (`GET /crypto/public?email=`). Use **`lookup_recipient`** before compress to verify an email.
95
+ - **Opening** archives: configure identity private key in MCP env only — `NEOZIP_IDENTITY_PRIVATE_KEY_HEX`, or `NEOZIP_TOKEN_SERVICE_ACCESS_TOKEN` + `NEOZIP_WALLET_PASSKEY` (wallet unwrap). Not supported via tool arguments.
96
+ - Cannot combine with `password`, `timestamp`, or `tokenize` in one `compress` call.
97
+
98
+ **Example — recipient-encrypted archive**
99
+
100
+ ```json
101
+ {
102
+ "input": ["test/fixtures/calgary/bib"],
103
+ "output": "test/output/sample-recipient.nzip",
104
+ "options": {
105
+ "recipientEmails": ["colleague@example.com"],
106
+ "includeSenderAsRecipient": true,
107
+ "overwrite": true
108
+ }
109
+ }
110
+ ```
111
+
112
+ **Password encryption**
113
+
114
+ - Supported via neozipkit: legacy **ZipCrypto** (`zipcrypto`), **WinZip AES-256** (`aes256`), and **NeoZip AES-256** (`neo-aes256`, default when only `password` is provided).
115
+ - When `password` is set, compression uses **deflate** instead of zstd (neozipkit encrypted path).
116
+ - **Security:** passwords appear in MCP tool-call JSON (visible to the model). Prefer env-driven fixture scripts (`NEOZIP_FIXTURE_PASSWORD`) for automation, not chat-inline secrets for production archives.
117
+ - **Blockchain:** `useSHA256`, `timestamp`, and `tokenize` operate on encrypted payloads; verification tools still need `options.password` to decrypt entries first.
118
+
119
+ **Example — encrypted archive**
120
+
121
+ ```json
122
+ {
123
+ "input": ["docs/OPERATIONS.md"],
124
+ "output": "test/output/encrypted.nzip",
125
+ "options": {
126
+ "password": "your-secret",
127
+ "encryptionMethod": "neo-aes256",
128
+ "overwrite": true
129
+ }
130
+ }
131
+ ```
132
+
133
+ **Example — plain archive**
134
+
135
+ ```json
136
+ {
137
+ "input": ["test/fixtures/calgary"],
138
+ "output": "test/output/sample.nzip",
139
+ "options": {
140
+ "overwrite": true
141
+ }
142
+ }
143
+ ```
144
+
145
+ **Example — timestamped archive**
146
+
147
+ ```json
148
+ {
149
+ "input": ["test/fixtures/calgary"],
150
+ "output": "test/output/sample-timestamped.nzip",
151
+ "options": {
152
+ "timestamp": true,
153
+ "overwrite": true
154
+ }
155
+ }
156
+ ```
157
+
158
+ **Example — tokenized archive**
159
+
160
+ ```json
161
+ {
162
+ "input": ["test/fixtures/calgary"],
163
+ "output": "test/output/sample-tokenized.nzip",
164
+ "options": {
165
+ "tokenize": true,
166
+ "overwrite": true
167
+ }
168
+ }
169
+ ```
170
+
171
+ **Legacy example — explicit SHA-256 only**
172
+
173
+ ```json
174
+ {
175
+ "input": ["/home/user/documents/report.pdf", "/home/user/documents/data/"],
176
+ "output": "/home/user/archives/report.nzip",
177
+ "options": {
178
+ "method": "zstd",
179
+ "level": 9,
180
+ "useSHA256": true,
181
+ "overwrite": true
182
+ }
183
+ }
184
+ ```
185
+
186
+ **Output**
187
+
188
+ Summary including output path, file count, archive size, and when applicable merkle root / Token Service batch ID / on-chain token ID.
189
+
190
+ ---
191
+
192
+ ### `extract`
193
+
194
+ Extract a ZIP archive to a directory.
195
+
196
+ **Parameters**
197
+
198
+ | Name | Type | Required | Description |
199
+ |------|------|----------|-------------|
200
+ | `input` | `string` | Yes | Path to the ZIP archive. |
201
+ | `output` | `string` | Yes | Destination directory for extracted files. |
202
+ | `options` | `object` | No | Extraction behavior (see below). |
203
+
204
+ **Options**
205
+
206
+ | Name | Type | Default | Description |
207
+ |------|------|---------|-------------|
208
+ | `password` | `string` | — | Password for encrypted archives. |
209
+ | `overwrite` | `boolean` | `false` | Overwrite existing files at the destination. When `false`, existing files are skipped. |
210
+ | `createDirectories` | `boolean` | `true` | Create the output directory (and parent paths) if it does not exist. |
211
+ | `preserveTimestamps` | `boolean` | `false` | Preserve original file modification times from the archive. |
212
+
213
+ **Example**
214
+
215
+ ```json
216
+ {
217
+ "input": "/home/user/archives/report.nzip",
218
+ "output": "/home/user/extracted/report",
219
+ "options": {
220
+ "overwrite": true,
221
+ "preserveTimestamps": true
222
+ }
223
+ }
224
+ ```
225
+
226
+ **Output**
227
+
228
+ Summary with extracted file count, output path, and skipped file count (if any).
229
+
230
+ ---
231
+
232
+ ### `list`
233
+
234
+ List the contents of a ZIP archive.
235
+
236
+ **Parameters**
237
+
238
+ | Name | Type | Required | Description |
239
+ |------|------|----------|-------------|
240
+ | `input` | `string` | Yes | Path to the ZIP archive. |
241
+ | `options` | `object` | No | Listing format options (see below). |
242
+
243
+ **Options**
244
+
245
+ | Name | Type | Default | Description |
246
+ |------|------|---------|-------------|
247
+ | `password` | `string` | — | Password for encrypted archives. |
248
+ | `verbose` | `boolean` | `false` | Include compressed size, compression method, and modification date per entry. |
249
+ | `format` | `"text"` \| `"json"` | `"text"` | Return terminal-style text or a structured JSON manifest with `isTextSafe` per entry. |
250
+
251
+ **Example**
252
+
253
+ ```json
254
+ {
255
+ "input": "/home/user/archives/report.nzip",
256
+ "options": { "verbose": true }
257
+ }
258
+ ```
259
+
260
+ **Output**
261
+
262
+ Formatted listing with entry names, sizes, optional compression details, and archive totals (uncompressed size, compressed size, compression ratio).
263
+
264
+ ---
265
+
266
+ ### `info`
267
+
268
+ Get detailed metadata about a ZIP archive.
269
+
270
+ **Parameters**
271
+
272
+ | Name | Type | Required | Description |
273
+ |------|------|----------|-------------|
274
+ | `input` | `string` | Yes | Path to the ZIP archive. |
275
+ | `options` | `object` | No | Archive access options (see below). |
276
+
277
+ **Options**
278
+
279
+ | Name | Type | Default | Description |
280
+ |------|------|---------|-------------|
281
+ | `password` | `string` | — | Password for encrypted archives. |
282
+ | `format` | `"text"` \| `"json"` | `"text"` | Return terminal-style text or a structured JSON manifest with entry summaries and merkle root. |
283
+
284
+ **Example**
285
+
286
+ ```json
287
+ {
288
+ "input": "/home/user/archives/report.nzip"
289
+ }
290
+ ```
291
+
292
+ **Output**
293
+
294
+ Archive path, file size on disk, entry count, uncompressed/compressed totals, compression ratio, compression methods used, encrypted entry count and **encryption schemes** (if any), per-entry `encryptionScheme` in JSON manifests, archive comment (if present), **merkle root** (when entries contain SHA-256 hashes), **archiveKind** (`plain`, `timestamped-pending`, `timestamped-confirmed`, `tokenized`), and **blockchain** verification object when timestamp/token metadata is present (JSON format).
295
+
296
+ ---
297
+
298
+ ### `test`
299
+
300
+ Test the integrity of a ZIP archive by verifying each file entry.
301
+
302
+ **Parameters**
303
+
304
+ | Name | Type | Required | Description |
305
+ |------|------|----------|-------------|
306
+ | `input` | `string` | Yes | Path to the ZIP archive. |
307
+ | `options` | `object` | No | Verification options (see below). |
308
+
309
+ **Options**
310
+
311
+ | Name | Type | Default | Description |
312
+ |------|------|---------|-------------|
313
+ | `password` | `string` | — | Password for encrypted archives. |
314
+ | `verifyPassword` | `boolean` | `false` | Decrypt encrypted payload entries with `password` and confirm a wrong password does not yield the same plaintext. Requires `password`. |
315
+ | `skipHashCheck` | `boolean` | `false` | Skip SHA-256 / merkle hash verification during entry tests. |
316
+ | `skipBlockchainCheck` | `boolean` | `false` | Skip Token Service / on-chain verification for timestamped or tokenized archives. |
317
+
318
+ For archives with `META-INF/TS-SUBMIT.NZIP`, `META-INF/TIMESTAMP.NZIP`, or `META-INF/TOKEN.NZIP`, **test** also reports blockchain verification status (`VERIFIED`, `PENDING`, or `FAILED`) without failing payload integrity when the timestamp is still pending confirmation. When on-chain status is **PENDING**, output explains that the digest is queued at the Token Service until the batch is submitted to the blockchain. Archives that still contain `META-INF/TS-SUBMIT.NZIP` after the batch is confirmed emit a **WARNING**: on-chain checks go through the Token Service and cannot be verified independently until **upgrade** replaces submission metadata with `META-INF/TIMESTAMP.NZIP`.
319
+
320
+ **Example**
321
+
322
+ ```json
323
+ {
324
+ "input": "/home/user/archives/report.nzip",
325
+ "options": { "skipHashCheck": false }
326
+ }
327
+ ```
328
+
329
+ **Example — verify password on encrypted archive**
330
+
331
+ ```json
332
+ {
333
+ "input": "test/output/sample-encrypted.nzip",
334
+ "options": {
335
+ "password": "test-password",
336
+ "verifyPassword": true
337
+ }
338
+ }
339
+ ```
340
+
341
+ Fixture and cursor scenarios use the standard test password **`test-password`** (see `FIXTURE_TEST_PASSWORD` in `src/archive/encryption.ts`).
342
+
343
+ **Output**
344
+
345
+ Per-entry pass/fail status, overall integrity summary (`PASSED` or `FAILED`), optional **Password decrypt verification** when `verifyPassword` is true, and when metadata is present, blockchain verification status for timestamped or tokenized archives.
346
+
347
+ ---
348
+
349
+ ### `read_entry`
350
+
351
+ Read the text contents of a specific file inside a ZIP archive **without extracting the entire package**. Supports pagination to protect LLM context limits.
352
+
353
+ **Parameters**
354
+
355
+ | Name | Type | Required | Description |
356
+ |------|------|----------|-------------|
357
+ | `input` | `string` | Yes | Path to the ZIP archive. |
358
+ | `entryPath` | `string` | Yes | Relative path of the file inside the archive. |
359
+ | `options` | `object` | No | Archive access options (see below). |
360
+ | `offset` | `number` | No | Character offset to start reading from (default `0`). |
361
+ | `maxChars` | `number` | No | Maximum characters to return (default from `NEOZIP_MCP_DEFAULT_MAX_CHARS`, capped by `NEOZIP_MCP_MAX_READ_CHARS`). |
362
+ | `translate` | `boolean` | No | Apply content translators for JSON/CSV (default `true`). |
363
+
364
+ **Options (`options`)**
365
+
366
+ | Name | Type | Default | Description |
367
+ |------|------|---------|-------------|
368
+ | `password` | `string` | — | Password when the target entry (or archive) is encrypted. |
369
+
370
+ **Example**
371
+
372
+ ```json
373
+ {
374
+ "input": "/home/user/archives/project.nzip",
375
+ "entryPath": "src/index.ts",
376
+ "offset": 0,
377
+ "maxChars": 8000
378
+ }
379
+ ```
380
+
381
+ **Output (JSON)**
382
+
383
+ ```json
384
+ {
385
+ "file_path": "src/index.ts",
386
+ "total_characters": 45000,
387
+ "has_more": true,
388
+ "next_offset": 8000,
389
+ "content": "/* file contents... */"
390
+ }
391
+ ```
392
+
393
+ Content translators (Phase 1): plain text passthrough, JSON pretty-print/summarize, CSV to Markdown table. PDF, DOCX, XLSX, and XML are deferred.
394
+
395
+ ---
396
+
397
+ ### `search_entries`
398
+
399
+ Search file names inside a ZIP archive by keyword or regex without reading file contents.
400
+
401
+ **Parameters**
402
+
403
+ | Name | Type | Required | Description |
404
+ |------|------|----------|-------------|
405
+ | `input` | `string` | Yes | Path to the ZIP archive. |
406
+ | `query` | `string` | Yes | Keyword, glob pattern (`*`, `?`), or regex pattern. |
407
+ | `options` | `object` | No | Search options (see below). |
408
+
409
+ **Options**
410
+
411
+ | Name | Type | Default | Description |
412
+ |------|------|---------|-------------|
413
+ | `mode` | `"keyword"` \| `"regex"` | `"keyword"` | Match mode for the query. |
414
+ | `caseSensitive` | `boolean` | `false` | Case-sensitive matching. |
415
+ | `password` | `string` | — | Password for encrypted archives (required to read encrypted entry metadata). |
416
+
417
+ **Example**
418
+
419
+ ```json
420
+ {
421
+ "input": "/home/user/archives/project.nzip",
422
+ "query": "src/**/*.ts",
423
+ "options": { "mode": "keyword" }
424
+ }
425
+ ```
426
+
427
+ **Output**
428
+
429
+ JSON object with `matchCount` and `matches[]` including `path`, `uncompressedSize`, `isTextSafe`, and `contentType`.
430
+
431
+ ---
432
+
433
+ ### `grep_entries`
434
+
435
+ Search for text strings or regex matches **inside file contents** within a ZIP archive without extracting files to disk. Only scans `isTextSafe` entries.
436
+
437
+ **Parameters**
438
+
439
+ | Name | Type | Required | Description |
440
+ |------|------|----------|-------------|
441
+ | `input` | `string` | Yes | Path to the ZIP archive. |
442
+ | `pattern` | `string` | Yes | Text or regex pattern to search for in file contents. |
443
+ | `options` | `object` | No | Grep options (see below). |
444
+
445
+ **Options**
446
+
447
+ | Name | Type | Default | Description |
448
+ |------|------|---------|-------------|
449
+ | `mode` | `"keyword"` \| `"regex"` | `"keyword"` | Match mode for the pattern. |
450
+ | `caseSensitive` | `boolean` | `false` | Case-sensitive matching. |
451
+ | `pathFilter` | `string` | — | Optional glob or path prefix to limit scanned entries (e.g. `src/**/*.ts`). |
452
+ | `maxMatches` | `number` | `NEOZIP_MCP_GREP_MAX_MATCHES` | Cap total matches returned. |
453
+ | `contextLines` | `number` | `0` | Lines of context before/after each match. |
454
+ | `maxSnippetChars` | `number` | `NEOZIP_MCP_GREP_MAX_SNIPPET_CHARS` | Max characters per match snippet. |
455
+ | `password` | `string` | — | Password for encrypted archives (required to decrypt and scan entry bodies). |
456
+
457
+ **Example**
458
+
459
+ ```json
460
+ {
461
+ "input": "/home/user/archives/project.nzip",
462
+ "pattern": "function handleError",
463
+ "options": {
464
+ "mode": "keyword",
465
+ "pathFilter": "src/**/*.js",
466
+ "contextLines": 1
467
+ }
468
+ }
469
+ ```
470
+
471
+ **Output (JSON)**
472
+
473
+ ```json
474
+ {
475
+ "archive": "/home/user/archives/project.nzip",
476
+ "pattern": "function handleError",
477
+ "mode": "keyword",
478
+ "filesScanned": 12,
479
+ "filesSkipped": 3,
480
+ "matchCount": 1,
481
+ "truncated": false,
482
+ "matches": [
483
+ {
484
+ "path": "src/utils.js",
485
+ "line": 87,
486
+ "column": 10,
487
+ "snippet": "export function handleError(err) {",
488
+ "contextBefore": ["..."],
489
+ "contextAfter": ["..."]
490
+ }
491
+ ]
492
+ }
493
+ ```
494
+
495
+ Entries larger than `NEOZIP_MCP_GREP_MAX_FILE_BYTES` (default 1 MB) are skipped. Binary or non-text-safe files are skipped without error.
496
+
497
+ ---
498
+
499
+ ## MCP Resources (`zip://`)
500
+
501
+ When ZIP read tools are enabled, the server exposes a resource template for direct archive entry access:
502
+
503
+ | URI pattern | Description |
504
+ |-------------|-------------|
505
+ | `zip://{archivePath}` | JSON manifest of archive entries |
506
+ | `zip://{archivePath}/{entryPath}` | Translated text content of a single entry |
507
+
508
+ Example: `zip:///home/user/archives/project.nzip/src/index.ts`
509
+
510
+ Pass optional resource argument **`password`** when reading encrypted entries (same as `read_entry` / `grep_entries`).
511
+
512
+ Resources reuse the same sandbox validation, in-memory extraction, and translators as `read_entry`.
513
+
514
+ ---
515
+
516
+ ## Blockchain Operations
517
+
518
+ Blockchain tools use [neozip-blockchain](https://www.npmjs.com/package/neozip-blockchain). Wallet-backed operations require a wallet configured via **neozip-connect** (`~/.neozip/connection/`).
519
+
520
+ Default network: `base-sepolia` (`NEOZIP_NETWORK`).
521
+
522
+ ---
523
+
524
+ ### `mint`
525
+
526
+ Mint a ZIP merkle root as an NFT on the blockchain (Base network).
527
+
528
+ **Requirements**
529
+
530
+ - Wallet private key configured
531
+ - Valid 64-character hex merkle root (typically from a SHA-256-enabled archive)
532
+
533
+ **Parameters**
534
+
535
+ | Name | Type | Required | Description |
536
+ |------|------|----------|-------------|
537
+ | `merkleRoot` | `string` | Yes | 64-character hex SHA-256 merkle root to mint. |
538
+ | `options` | `object` | No | Minting options (see below). |
539
+
540
+ **Options**
541
+
542
+ | Name | Type | Default | Description |
543
+ |------|------|---------|-------------|
544
+ | `network` | `string` | `NEOZIP_NETWORK` | Target blockchain network (e.g. `base-sepolia`, `base`). |
545
+
546
+ **Example**
547
+
548
+ ```json
549
+ {
550
+ "merkleRoot": "a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456",
551
+ "options": {
552
+ "network": "base-sepolia"
553
+ }
554
+ }
555
+ ```
556
+
557
+ **Output**
558
+
559
+ Token ID, transaction hash, network, and merkle root on success.
560
+
561
+ ---
562
+
563
+ ### `verify`
564
+
565
+ Verify a tokenized ZIP file by checking `META-INF/TOKEN.NZIP` metadata against the blockchain.
566
+
567
+ **Parameters**
568
+
569
+ | Name | Type | Required | Description |
570
+ |------|------|----------|-------------|
571
+ | `input` | `string` | Yes | Path to the tokenized ZIP archive. |
572
+ | `options` | `object` | No | Verification options (see below). |
573
+
574
+ **Options**
575
+
576
+ | Name | Type | Default | Description |
577
+ |------|------|---------|-------------|
578
+ | `password` | `string` | — | Password when payload entries are encrypted. |
579
+ | `network` | `string` | — | Network hint for verification (passed through to verifier when supported). |
580
+ | `skipHash` | `boolean` | `false` | Skip local merkle root / hash comparison during verification. |
581
+
582
+ **Example**
583
+
584
+ ```json
585
+ {
586
+ "input": "/home/user/archives/tokenized.nzip",
587
+ "options": { "skipHash": false }
588
+ }
589
+ ```
590
+
591
+ **Output**
592
+
593
+ Verification status (`VERIFIED` or `FAILED`), token ID, network, calculated merkle root, and any verifier message.
594
+
595
+ ---
596
+
597
+ ### `stamp`
598
+
599
+ Submit a ZIP archive's merkle root to the **NeoZip Token Service** for blockchain timestamping.
600
+
601
+ The archive must contain per-entry SHA-256 hashes (create with `compress` and `options.timestamp: true`, or `useSHA256: true`). Stamping requires a verified recipient email on the Token Service. Metadata is embedded as `META-INF/TS-SUBMIT.NZIP`.
602
+
603
+ **Parameters**
604
+
605
+ | Name | Type | Required | Description |
606
+ |------|------|----------|-------------|
607
+ | `input` | `string` | Yes | Path to the SHA-256-enabled ZIP archive. |
608
+ | `options` | `object` | No | Token Service options (see below). |
609
+
610
+ **Options**
611
+
612
+ | Name | Type | Default | Description |
613
+ |------|------|---------|-------------|
614
+ | `recipientEmail` | `string` | connect profile email | Verified email address for Token Service authentication. |
615
+ | `serverUrl` | `string` | connect profile URL or library default | NeoZip Token Service base URL. |
616
+
617
+ **Configuration source**
618
+
619
+ | Source | Setting |
620
+ |--------|---------|
621
+ | `neozip-connect` (`~/.neozip/connection/`) | Verified email, access token, wallet key, Token Service URL |
622
+
623
+ **Example**
624
+
625
+ ```json
626
+ {
627
+ "input": "/home/user/archives/report.nzip",
628
+ "options": {
629
+ "recipientEmail": "user@example.com",
630
+ "serverUrl": "https://testnet.token-service.neozip.io"
631
+ }
632
+ }
633
+ ```
634
+
635
+ **Output**
636
+
637
+ Submission confirmation with merkle root, server URL, digest, status, and batch ID (when returned by the service).
638
+
639
+ ---
640
+
641
+ ### `upgrade_timestamped`
642
+
643
+ Upgrade Timestamped archive: replace pending submission metadata with confirmed timestamp metadata once the batch is on-chain.
644
+
645
+ Looks for timestamp metadata entries:
646
+
647
+ - Pending: `META-INF/TS-SUBMIT.NZIP`
648
+ - Confirmed: `META-INF/TIMESTAMP.NZIP`
649
+
650
+ **Parameters**
651
+
652
+ | Name | Type | Required | Description |
653
+ |------|------|----------|-------------|
654
+ | `input` | `string` | Yes | Path to the timestamped ZIP archive. |
655
+ | `output` | `string` | No | Output path for the upgraded archive. Defaults to `<input>-upgraded.<ext>`. |
656
+ | `options` | `object` | No | Token Service options (see below). |
657
+
658
+ **Options**
659
+
660
+ | Name | Type | Default | Description |
661
+ |------|------|---------|-------------|
662
+ | `serverUrl` | `string` | `TOKEN_SERVICE_URL` or library default | NeoZip Token Service base URL. |
663
+ | `wait` | `boolean` | `true` | Poll Token Service until the batch is confirmed (5-minute timeout, 5-second interval). Set `false` for a single verify check. |
664
+ | `overwrite` | `boolean` | `false` | Overwrite `output` if it already exists. |
665
+
666
+ **Example**
667
+
668
+ ```json
669
+ {
670
+ "input": "/home/user/archives/pending.nzip",
671
+ "output": "/home/user/archives/confirmed.nzip",
672
+ "options": {
673
+ "serverUrl": "https://testnet.token-service.neozip.io",
674
+ "overwrite": true
675
+ }
676
+ }
677
+ ```
678
+
679
+ **Output**
680
+
681
+ Upgrade status, input/output paths, merkle root, and transaction hash when the batch is confirmed. Returns an informational message if the timestamp is already confirmed or not yet ready.
682
+
683
+ *(Legacy tool name `upgrade` was renamed to `upgrade_timestamped`.)*
684
+
685
+ ---
686
+
687
+ ### `wallet_info`
688
+
689
+ Display wallet and network status. Does not require a wallet key to run, but balance and address details are only shown when a key is configured.
690
+
691
+ **Parameters**
692
+
693
+ | Name | Type | Required | Description |
694
+ |------|------|----------|-------------|
695
+ | `options` | `object` | No | Network selection (see below). |
696
+
697
+ **Options**
698
+
699
+ | Name | Type | Default | Description |
700
+ |------|------|---------|-------------|
701
+ | `network` | `string` | `NEOZIP_NETWORK` | Network to query for chain ID, contract address, and balance. |
702
+
703
+ **Example**
704
+
705
+ ```json
706
+ {
707
+ "options": { "network": "base-sepolia" }
708
+ }
709
+ ```
710
+
711
+ **Output**
712
+
713
+ Network name, chain ID, contract address, masked wallet key, wallet address, ETH balance (when RPC is available), and list of supported networks.
714
+
715
+ ---
716
+
717
+ ## NeoZip Token Service
718
+
719
+ NeoZip Token Service tools manage the **account, identity, and recipient keys** used for timestamping and recipient encryption. They talk to the Token Service API (or report local neozip-connect readiness) and are configured via **neozip-connect** (`~/.neozip/connection/`) — they do **not** operate on ZIP archives directly.
720
+
721
+ The default service URL comes from the neozip-connect profile; override per call with `options.serverUrl` where supported.
722
+
723
+ ---
724
+
725
+ ### `lookup_recipient`
726
+
727
+ Look up a recipient's Token Service X25519 public key by verified email (unauthenticated `GET /crypto/public`). Does not return private keys. Use before `compress` with `options.recipientEmails` to confirm an email is provisioned.
728
+
729
+ **Parameters**
730
+
731
+ | Name | Type | Required | Description |
732
+ |------|------|----------|-------------|
733
+ | `email` | `string` | Yes | Verified recipient email on the Token Service. |
734
+ | `options` | `object` | No | Optional `serverUrl` override. |
735
+
736
+ **Example**
737
+
738
+ ```json
739
+ {
740
+ "email": "colleague@example.com"
741
+ }
742
+ ```
743
+
744
+ **Output (JSON)**
745
+
746
+ Success object with `identity`, `identityType` (`zipstamp`), `evmAddress`, `recipientSuites`, and `cryptoProvisionedAt` when available.
747
+
748
+ ---
749
+
750
+ ### `token_service_status`
751
+
752
+ Check whether an email is registered and verified on the NeoZip Token Service (required before timestamping).
753
+
754
+ **Parameters**
755
+
756
+ | Name | Type | Required | Description |
757
+ |------|------|----------|-------------|
758
+ | `email` | `string` | No | Email to check. Defaults to neozip-connect profile email when configured. |
759
+ | `options` | `object` | No | Token Service options (see below). |
760
+
761
+ **Options**
762
+
763
+ | Name | Type | Default | Description |
764
+ |------|------|---------|-------------|
765
+ | `serverUrl` | `string` | `TOKEN_SERVICE_URL` or library default | NeoZip Token Service base URL. |
766
+
767
+ **Example**
768
+
769
+ ```json
770
+ {
771
+ "email": "user@example.com"
772
+ }
773
+ ```
774
+
775
+ **Output**
776
+
777
+ Service URL, masked email, verified yes/no, and next-step hints.
778
+
779
+ ---
780
+
781
+ ### `token_service_register`
782
+
783
+ Register an email and send a 6-digit verification code. Requires `blockchain` capability.
784
+
785
+ **Parameters**
786
+
787
+ | Name | Type | Required | Description |
788
+ |------|------|----------|-------------|
789
+ | `email` | `string` | Yes | Email address to register or re-send verification for. |
790
+ | `options` | `object` | No | Token Service options (see below). |
791
+
792
+ **Options**
793
+
794
+ | Name | Type | Default | Description |
795
+ |------|------|---------|-------------|
796
+ | `serverUrl` | `string` | `TOKEN_SERVICE_URL` or library default | NeoZip Token Service base URL. |
797
+
798
+ **Example**
799
+
800
+ ```json
801
+ {
802
+ "email": "user@example.com"
803
+ }
804
+ ```
805
+
806
+ **Output**
807
+
808
+ Confirmation that a verification email was sent; instructs user to call `token_service_verify` with the code.
809
+
810
+ ---
811
+
812
+ ### `token_service_verify`
813
+
814
+ Complete email verification with the 6-digit code from the registration email. Requires `blockchain` capability.
815
+
816
+ **Parameters**
817
+
818
+ | Name | Type | Required | Description |
819
+ |------|------|----------|-------------|
820
+ | `email` | `string` | Yes | Email address being verified. |
821
+ | `code` | `string` | Yes | 6-digit verification code from email. |
822
+ | `options` | `object` | No | Token Service options (see below). |
823
+
824
+ **Options**
825
+
826
+ | Name | Type | Default | Description |
827
+ |------|------|---------|-------------|
828
+ | `serverUrl` | `string` | `TOKEN_SERVICE_URL` or library default | NeoZip Token Service base URL. |
829
+
830
+ **Example**
831
+
832
+ ```json
833
+ {
834
+ "email": "user@example.com",
835
+ "code": "123456"
836
+ }
837
+ ```
838
+
839
+ **Output**
840
+
841
+ Verification success and reminder to run `neozip-connect verify` to store credentials, then reload MCP. Does not return or store Bearer session tokens in MCP env.
842
+
843
+ ---
844
+
845
+ ### `connect_status`
846
+
847
+ Fast **neozip-connect readiness** check for agents and users. No network calls; no secret values.
848
+
849
+ Call this **before** `compress` with `options.timestamp`, `options.tokenize`, or `options.recipientEmails`, or when setup errors mention neozip-connect.
850
+
851
+ **Parameters**
852
+
853
+ | Name | Type | Required | Description |
854
+ |------|------|----------|-------------|
855
+ | `options` | `object` | No | Output format (see below). |
856
+
857
+ **Options**
858
+
859
+ | Name | Type | Default | Description |
860
+ |------|------|---------|-------------|
861
+ | `format` | `"text"` \| `"json"` | `"text"` | Structured JSON for agents. |
862
+
863
+ **Example**
864
+
865
+ ```json
866
+ {
867
+ "options": { "format": "json" }
868
+ }
869
+ ```
870
+
871
+ **Output**
872
+
873
+ - **Phase** — `no_profile`, `email_unverified`, `no_wallet`, `ready`, etc.
874
+ - **Store** — path, connection counts, readable vs locked accounts
875
+ - **Store health** — `ok` or `unrecoverable` (corrupt / wrong-machine credentials; reset via `neozip-connect`)
876
+ - **compress options** — readiness for `timestamp`, `tokenize`, `recipientEmails`
877
+ - **Tool readiness** — `stamp`, `mint`, `tokenize`
878
+ - **Next commands** — interactive wizard (`neozip-connect`) and scriptable CLI step when different
879
+ - **Token expiry** — flag and re-auth guidance when the access token is expired
880
+
881
+ **Related:** `wallet_config_status` (credential sources), `identity_status` (Token Service `/crypto/self`).
882
+
883
+ ---
884
+
885
+ ### `wallet_config_status`
886
+
887
+ Report how MCP credentials are configured: capability groups, **neozip-connect** profile phase and store path, boolean flags for optional secret env vars (never values), and **readiness** for mint, tokenize, timestamp, and recipient decrypt. No network calls.
888
+
889
+ **Parameters**
890
+
891
+ | Name | Type | Required | Description |
892
+ |------|------|----------|-------------|
893
+ | `options` | `object` | No | Output format (see below). |
894
+
895
+ **Options**
896
+
897
+ | Name | Type | Default | Description |
898
+ |------|------|---------|-------------|
899
+ | `format` | `"text"` \| `"json"` | `"text"` | Structured JSON for agents. |
900
+
901
+ **Example**
902
+
903
+ ```json
904
+ {
905
+ "options": { "format": "json" }
906
+ }
907
+ ```
908
+
909
+ **Output**
910
+
911
+ Capabilities, wallet key source, network source, masked recipient email, Token Service URL, connection phase, secret flags, readiness (`mintReady`, `tokenizeReady`, `timestampReady`, `recipientDecryptConfigured`, `recipientDecryptUnwrapPath`), and pointers to `wallet_info` / `identity_status`.
912
+
913
+ ---
914
+
915
+ ### `identity_status`
916
+
917
+ Query Token Service `GET /crypto/self` with the neozip-connect access token (Bearer). Reports provisioned X25519 identity (`walletId`, `identityKeyId`, masked public key fingerprint, `recipientSuites`) and whether recipient-encrypted archives can be opened. Does **not** unwrap or return private keys.
918
+
919
+ **Parameters**
920
+
921
+ | Name | Type | Required | Description |
922
+ |------|------|----------|-------------|
923
+ | `options` | `object` | No | Server URL and output format. |
924
+
925
+ **Options**
926
+
927
+ | Name | Type | Default | Description |
928
+ |------|------|---------|-------------|
929
+ | `serverUrl` | `string` | `TOKEN_SERVICE_URL` / library default | Token Service base URL. |
930
+ | `format` | `"text"` \| `"json"` | `"text"` | Structured JSON for agents. |
931
+
932
+ **Requirements**
933
+
934
+ - neozip-connect access token; optional `NEOZIP_IDENTITY_PRIVATE_KEY_HEX` for decrypt readiness without calling `/crypto/self`.
935
+ - neozip-connect wallet required for the wallet+token unwrap path when env hex is not set.
936
+
937
+ **Output**
938
+
939
+ Access token configured, `/crypto/self` result (or error/hint on 404), `recipientDecryptReady`, optional warning if the connect profile email does not match the Token Service account email.
940
+
941
+ ---
942
+
943
+ ## Global Limits and Configuration
944
+
945
+ These settings apply across operations (not per-tool parameters):
946
+
947
+ | Variable | Default | Effect |
948
+ |----------|---------|--------|
949
+ | `NEOZIP_MCP_SANDBOX_PATHS` | cwd, home | Allowed directories for file paths |
950
+ | `NEOZIP_MCP_RATE_LIMIT` | `60` | ZIP tool requests per minute |
951
+ | `NEOZIP_MCP_BLOCKCHAIN_RATE_LIMIT` | `10` | Blockchain tool requests per minute |
952
+ | `NEOZIP_MCP_MAX_FILE_SIZE` | `524288000` (500 MB) | Maximum input file size |
953
+ | `NEOZIP_MCP_MAX_ENTRIES` | `10000` | Maximum ZIP entries per archive |
954
+ | `NEOZIP_MCP_TIMEOUT` | `300` | Operation timeout in seconds |
955
+ | `NEOZIP_MCP_DEFAULT_MAX_CHARS` | `10000` | Default `maxChars` for `read_entry` |
956
+ | `NEOZIP_MCP_MAX_READ_CHARS` | `100000` | Hard cap on characters returned by `read_entry` |
957
+ | `NEOZIP_MCP_GREP_MAX_MATCHES` | `100` | Default max matches for `grep_entries` |
958
+ | `NEOZIP_MCP_GREP_MAX_SNIPPET_CHARS` | `200` | Max snippet length per grep match |
959
+ | `NEOZIP_MCP_GREP_MAX_FILE_BYTES` | `1048576` (1 MB) | Skip grepping individual entries larger than this |
960
+ | `NEOZIP_NETWORK` | `base-sepolia` | Default blockchain network |
961
+ | `NEOZIP_TOKEN_SERVICE_INFO_URL` | `{profile URL}/info` | Setup docs link in Token Service error messages |
962
+
963
+ Token Service email, access token, wallet key, and service URL are loaded from **neozip-connect** only (`~/.neozip/connection/`).
964
+
965
+ ---
966
+
967
+ ## Typical Workflows
968
+
969
+ ### Timestamp a ZIP
970
+
971
+ 1. **compress** with `options.timestamp: true` (or `useSHA256: true` then **stamp**)
972
+ 2. **stamp** with a verified `recipientEmail`
973
+ 3. **upgrade_timestamped** after the batch is confirmed on-chain
974
+
975
+ ### Tokenize and verify
976
+
977
+ 1. **compress** with `options.timestamp: true` (or `useSHA256: true` then **stamp**)
978
+ 2. **mint** with the merkle root from **info**
979
+ 3. **verify** on the tokenized archive
980
+
981
+ ### Integrity check
982
+
983
+ 1. **list** or **info** for a quick overview
984
+ 2. **test** for full per-entry integrity verification
985
+
986
+ ### AI archive inspection (no full extraction)
987
+
988
+ 1. **info** or **list** with `options.format: "json"` for a token-aware manifest (`isTextSafe` per entry)
989
+ 2. **search_entries** to locate files by name or pattern
990
+ 3. **grep_entries** to find matching lines across file contents
991
+ 4. **read_entry** with `offset` / `maxChars` for paginated in-archive reading
992
+ 5. Optionally fetch `zip://{archive}/{entry}` MCP resources for direct client binding