zipnative MCP — ZIP creation, inspection, secure extraction & verification
NPM · ZIPNATIVE-MCP · SCANNED SEP 21
ZIP MCP server: create, inspect, verify, extract securely, modify without recompression. 13 tools
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 0 of 4 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Nizoka/zipnative-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 13 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 9238 tokens (~710/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management47
- Stability observed for 14 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the zipnative MCP — ZIP creation, inspection, secure… server?
zipnative MCP — ZIP creation, inspection, secure… runs locally as an npm package, launched with npx -y zipnative-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · zipnative-mcp
claude mcp add nizoka-zipnative-mcp -- npx -y zipnative-mcp
{
"mcpServers": {
"nizoka-zipnative-mcp": {
"command": "npx",
"args": [
"-y",
"zipnative-mcp"
]
}
}
} {
"servers": {
"nizoka-zipnative-mcp": {
"command": "npx",
"args": [
"-y",
"zipnative-mcp"
]
}
}
} codex mcp add nizoka-zipnative-mcp -- npx -y zipnative-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"nizoka-zipnative-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"zipnative-mcp"
],
"enabled": true
}
}
} openclaw mcp add nizoka-zipnative-mcp --command npx --arg -y --arg zipnative-mcp
mcp_servers:
nizoka-zipnative-mcp:
command: "npx"
args: ["-y", "zipnative-mcp"] {
"McpServers": {
"nizoka-zipnative-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"zipnative-mcp"
]
}
}
} assistant mcp add nizoka-zipnative-mcp -t stdio -c npx -a -y zipnative-mcp
{
"mcpServers": {
"nizoka-zipnative-mcp": {
"command": "npx",
"args": [
"-y",
"zipnative-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +3
- Stability: unverified → 0.27 ▲ functional
- 7 Sept 26 82
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed npm/zipnative-mcp@1.0.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Nizoka/zipnative-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Nizoka/zipnative-mcp/.github/workflows/publish.yml@refs/tags/v1.0.0 |
| Rekor log index | 2752935824 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:6d877bf19a0f353c924ed440438f102298b6981d856e7781d343ddf5df93111bc6481608d0ff71ac0c97d35b47f97ddd3c8ba898cfeaf29340b085583 |
Background: How many MCP packages publish verified provenance →
Dependencies 4 packages
| Packages resolved | 4 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
compute_crc32 Compute CRC-32 ~222
The ZIP checksum (IEEE 802.3 CRC-32, the engine's slice-by-8 implementation) of inline bytes / text or a sandbox file (streamed in 1 MiB chunks). `seed` continues a running CRC across consecutive chunks; `expect` compares against a known value (`matches`). Use it to cross-check an entry's crc32 from list_zip_entries against a file on disk.
| Name | Type | Req | Description |
|---|---|---|---|
| dataBase64 | string | – | Bytes as base64. Exclusive with text / sourcePath. |
| expect | string | – | Optional expected CRC (1–8 hex digits, optional 0x prefix, e.g. '4e08bfb4'); the result carries `matches`. |
| seed | integer | – | Running CRC to continue from (chain calls over consecutive chunks). |
| sourcePath | string | – | Relative path of a file inside the sandbox (streamed, ≤ 1 GiB). Exclusive with dataBase64 / text. |
| text | string | – | UTF-8 text. Exclusive with dataBase64 / sourcePath. |
| Name | Type | Req | Description |
|---|---|---|---|
| byteLength | integer | yes | – |
| crc32 | integer | yes | Unsigned 32-bit CRC. |
| hex | string | yes | 8 lowercase hex digits. |
| matches | boolean | – | Present when `expect` was given. |
| seed | integer | yes | – |
No examples provided.
create_zip Create archive (reproducible; deterministic:true for cross-runtime identical bytes) ~960
Write a ZIP from inline entries (`dataBase64` | `text` | `sourcePath` in the sandbox, or `directory:true`). Reproducible by default: canonical order (raw UTF-8 name bytes), DOS-epoch timestamps, UTF-8 names, constant attributes — `defaultDate:'now'` or per-entry `date` opts out (ZIP_TIMESTAMP_NOT_PINNED diagnostic). `compression` {method store|deflate, level 0–9, deterministic:true = pinned pure-TS encoder ⇒ identical bytes on every runtime} at archive or entry level; `order:'insertion'` for EPUB / JAR (mimetype first, stored); `comment`, per-entry comment / unixMode / externalAttributes / raw extraFields. `stream:true` on a sourcePath feeds the file through addStream (data-descriptor layout, bounded memory). `parallel` compresses with the worker pool — byte-identical output. Zip64 is emitted exactly when a field overflows. Output base64 (≤ 50 MiB) or a sandbox file (streamed, never overwritten); `summary.deterministic` is true ONLY with compression.deterministic:true (cross-runtime identity); a default call is reproducible on the same runtime (`deflateTier` 'node-zlib') and reports false; `sha256` (includeSha256, base64 and file modes) is the proof. Every archive it writes is ISO/IEC 21320-1 conformant (CI-validated).
| Name | Type | Req | Description |
|---|---|---|---|
| chunkSize | integer | – | file mode: output chunk size for the streaming assembler (default 64 KiB). Never changes the bytes. |
| comment | string | – | Archive comment (UTF-8, ≤ 65535 bytes). |
| compression | object | – | Compression settings. `method` 'deflate' (default) or 'store'; `level` 0–9 (default 6); `deterministic: true` pins the pure-TS encoder so the bytes are identical on every runtime (slower). |
| defaultDate | string | – | Timestamp for entries that set no `date`: an ISO-8601 instant (1980-01-01 … 2107-12-31, 2-second DOS granularity) or 'now' (wall clock — emits the ZIP_TIMESTAMP_NOT_PINNED diagnostic and makes the by… |
| entries | array | yes | The entries to write (0–100000; an empty array writes a valid empty archive). Each takes exactly one of dataBase64 / text / sourcePath, or directory: true. |
| includeSha256 | boolean | – | Add `summary.sha256` of the produced bytes (determinism proofs). |
| limits | object | – | Override zipnative's named security bounds for this call (CWE-400 / CWE-409 guards). Every key is optional; absent keys keep the engine defaults (maxEntries 100000, maxEntryUncompressedSize 1 GiB, ma… |
| order | string | – | 'canonical' (default): entries sorted by raw UTF-8 name bytes (reproducible). 'insertion': call order preserved (EPUB / JAR mimetype-first layouts). |
| outputMode | string | – | 'base64' (default) returns the bytes inline as an embedded resource (≤ 50 MiB). 'file' writes them inside ZIPNATIVE_MCP_OUTPUT_DIR (never overwrites; ≤ 4 GiB, streamed) and returns a resource_link. |
| outputPath | string | – | Relative path inside the sandbox (only when outputMode='file'); must end in a container extension (.zip recommended). |
| parallel | object | – | Compress with the worker pool (zipnative/worker). Byte-identical to the sequential writer; only worth it for many large entries. `workers` 0 keeps everything on the calling thread. |
| strict | boolean | – | Escalate the first engine diagnostic (prepended data, duplicate name, name mismatch, …) to a ZIP_STRICT_DIAGNOSTIC error instead of reporting it. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnosticCounts | object | – | Number of diagnostics received per code (counts every occurrence, including de-duplicated ones). |
| diagnostics | array | yes | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| diagnosticsTruncated | boolean | – | Present (true) when more than 200 distinct diagnostics were dropped from `diagnostics`. |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | yes | create_zip summary. |
No examples provided.
describe_engine Describe engine & server capabilities ~234
Offline preflight (no archive needed): server / engine / tool-API versions, the deflate tier in use and the pinned deterministic tier, runtime codecs (node:zlib, CompressionStream, DecompressionStream) and worker threads, the codec registry, the engine's default `limits`, the operator ceilings (ZIPNATIVE_MCP_MAX_UNCOMPRESSED_BYTES, ZIPNATIVE_MCP_MAX_ENTRIES, ZIPNATIVE_MCP_WORKERS), every server cap, whether the sandbox and the cache are enabled, the 39 frozen ZIP_* error codes and 11 diagnostic codes, and the engine exports this server deliberately does not expose (with why). `network` is always 'none'. Call it first in a session, or whenever a cap / ceiling refusal needs interpreting.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | – | Dot-path projection applied after verbosity (e.g. ['entryCount', 'entries.name']); array segments map over elements; unmatched paths are reported in _meta.unmatchedFields. |
| verbosity | string | – | 'summary' returns only the scalar verdict fields (drops arrays and payloads) — the token-frugal form. |
| Name | Type | Req | Description |
|---|---|---|---|
| capabilities | object | – | – |
| caps | object | – | – |
| ceilings | object | – | – |
| codecs | array | – | – |
| defaultLimits | object | – | – |
| diagnosticCodes | array | – | – |
| engine | object | – | – |
| errorCodes | array | – | – |
| network | string | – | – |
| sandbox | object | – | – |
| server | object | – | – |
| unexposed | array | – | – |
No examples provided.
draft_governance_issue Draft a governance-compliant GitHub issue (HITL) ~497
Produce a LOCAL GitHub issue draft + compliance report for zipnative / zipnative-mcp and NEVER submit it — the agent drafts, a human reviews and files it under their own identity (Human-In-The-Loop contract, .github/AGENT_RULES.md). No GitHub write path and no network path exist in this server. The draft is checked against the zero-dependency + reproduction policy; a violation (new runtime dependency, missing reproduction, duplicateSearchPerformed:false) throws GOVERNANCE_VIOLATION. targetRepo 'zipnative' for engine behaviour (parsing, writing, limits, codecs), 'zipnative-mcp' for wrapper behaviour (schemas, sandbox, transport). Returns markdown inline (outputMode:'file' also writes a .md inside the sandbox). Use it only after reproducing a defect — for questions read describe_engine / AGENTS.md instead. Present the draft AND the report to the user, then STOP.
| Name | Type | Req | Description |
|---|---|---|---|
| actualBehavior | string | – | What actually happened (defaults to the reproduction result when omitted). |
| affectedPackages | array | – | Packages impacted by this issue (e.g. ["zipnative-mcp"], ["zipnative"]). |
| duplicateSearchPerformed | boolean | yes | MUST be true: confirms you searched open AND closed issues/PRs for duplicates before drafting. |
| expectedBehavior | string | yes | What you expected to happen instead. |
| issueType | string | yes | Issue category: 'bug' | 'feature' | 'security' | 'docs' | 'performance'. |
| outputMode | string | – | 'inline' (default) returns the draft markdown in the response. 'file' additionally writes it to the sandbox (requires ZIPNATIVE_MCP_OUTPUT_DIR); outputPath must be a relative .md path. |
| outputPath | string | – | Relative .md path inside the sandbox (only when outputMode='file'). |
| reproduction | object | yes | The minimal, locally-executed reproduction that justifies this issue. |
| summary | string | yes | One or two paragraphs describing the problem or proposal. |
| targetRepo | string | – | Destination repository label for the draft (documentation only — the server never contacts it). 'zipnative-mcp' (wrapper: schemas, sandbox, transport) or 'zipnative' (engine: parser, writer, limits,… |
| title | string | yes | Concise issue title (imperative, no trailing period). |
| Name | Type | Req | Description |
|---|---|---|---|
| compliance | object | yes | – |
| draftMarkdown | string | yes | The full draft, ready for a human to review and submit. |
| filePath | string | – | Sandboxed absolute path (when outputMode='file'). |
| issueType | string | yes | – |
| outputMode | string | yes | – |
| sizeBytes | integer | yes | – |
| targetRepo | string | yes | – |
| title | string | yes | – |
| warnings | array | yes | – |
No examples provided.
extract_zip Extract (secure by default) ~1,037
Extract with every engine guard ON unless you name the relaxation: zip-slip / absolute / drive / UNC / NUL / ADS / Windows-device names → ZIP_PATH_TRAVERSAL (rejectTraversal:false SKIPS them, listed in `skipped`; an unsafe path is never emitted); symlinks → ZIP_SYMLINK_REJECTED (rejectSymlinks:false extracts the target text as data, never a link); duplicate sanitized paths → ZIP_EXTRACT_DUPLICATE_PATH (onDuplicate 'first' | 'last'); declared sizes / ratios beyond `limits` → ZIP_LIMIT_EXCEEDED; overlapping entries and central/local divergence are always refused. `filter` keeps a subset. outputMode 'base64' (default) returns files inline (≤ 16 MiB each, ≤ 32 MiB total; includeData:false = dry run of the plan); 'file' streams into a relative `outputDir` inside ZIPNATIVE_MCP_OUTPUT_DIR (never overwrites) and returns resource links. Directories are implied by paths (emptyDirectories:true creates the explicit ones). The dry run opens eagerly: an overlapping, offset-into-CD or Zip64-spoofed archive is refused before any plan is returned. Prefer read_zip_entry for a single file.
| Name | Type | Req | Description |
|---|---|---|---|
| emptyDirectories | boolean | – | file mode: also create explicit directory entries (with a safe name) that hold no file. |
| fields | array | – | Dot-path projection applied after verbosity (e.g. ['entryCount', 'entries.name']); array segments map over elements; unmatched paths are reported in _meta.unmatchedFields. |
| filter | object | – | Select entries by name. `names` (exact, case-sensitive), `prefix` (path prefix) and `glob` (patterns: `*` within a segment, `**` across segments, `?` one character; a pattern without `/` matches at a… |
| includeData | boolean | – | base64 mode: false = dry run — list what WOULD be extracted (paths, sizes) without decompressing or returning bytes. |
| limits | object | – | Override zipnative's named security bounds for this call (CWE-400 / CWE-409 guards). Every key is optional; absent keys keep the engine defaults (maxEntries 100000, maxEntryUncompressedSize 1 GiB, ma… |
| onDuplicate | string | – | Two entries mapping to the same sanitized path: 'error' (default, ZIP_EXTRACT_DUPLICATE_PATH), keep the 'first', or keep the 'last'. |
| outputDir | string | – | Relative directory inside the sandbox to extract into (file mode; created if absent; no absolute paths, no '..'). |
| outputMode | string | – | 'base64' (default): files inline (≤ 16777216 bytes each, ≤ 33554432 bytes total). 'file': stream every file under outputDir inside ZIPNATIVE_MCP_OUTPUT_DIR (never overwrites) and return resource link… |
| rejectSymlinks | boolean | – | true (default): a symlink entry fails the call with ZIP_SYMLINK_REJECTED. false: its target text is extracted as ordinary data (never materialised as a link). |
| rejectTraversal | boolean | – | true (default): an entry whose name escapes the root (zip-slip, absolute, drive/UNC, NUL, ADS, Windows device name) fails the call with ZIP_PATH_TRAVERSAL. false: such entries are SKIPPED and listed… |
| strict | boolean | – | Escalate the first engine diagnostic (prepended data, duplicate name, name mismatch, …) to a ZIP_STRICT_DIAGNOSTIC error instead of reporting it. |
| verbosity | string | – | 'summary' returns only the scalar verdict fields (drops arrays and payloads) — the token-frugal form. |
| zipBase64 | string | – | The archive bytes as base64 (exactly once; a data: URI prefix is tolerated). Exclusive with zipPath. Decoded size ≤ 128 MiB. |
| zipPath | string | – | Relative path of an archive inside the ZIPNATIVE_MCP_OUTPUT_DIR sandbox (no absolute paths, no '..'; container extensions only: .zip .jar .docx .epub …). Exclusive with zipBase64. Lets a create/modif… |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnosticCount | integer | – | summary only: number of distinct diagnostics. |
| diagnosticCounts | object | – | Number of diagnostics received per code (counts every occurrence, including de-duplicated ones). |
| diagnostics | array | – | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| diagnosticsTruncated | boolean | – | Present (true) when more than 200 distinct diagnostics were dropped from `diagnostics`. |
| directoriesCreated | integer | – | – |
| dryRun | boolean | – | true when includeData was false: nothing was decompressed. |
| entries | array | – | One row per extracted file, in central-directory order. base64 mode carries dataBase64 (unless dryRun); file mode carries filePath. |
| fileCount | integer | – | – |
| mode | string | – | – |
| outputDir | string | – | Absolute sandbox directory (file mode). |
| paths | array | – | summary only: the extracted paths. |
| skipped | array | – | Entries skipped because their name is unsafe (only with rejectTraversal:false). |
| skippedCount | integer | – | summary only: number of skipped (unsafe-path) entries. |
| totalBytes | integer | – | Sum of the extracted (or planned) uncompressed sizes. |
No examples provided.
inflate_raw Inflate raw DEFLATE (bounded) ~434
Decompress a raw DEFLATE (RFC 1951) stream — e.g. the payload from read_zip_entry mode:'raw' — with a MANDATORY `maxOutput` bound through zipnative's resumable inflater (constant memory, exact `bytesConsumed`, trailing bytes reported as `leftover`; ZIP_INFLATE_OUTPUT_OVERFLOW past the bound). method 'store' is a bounded pass-through; a numeric method id selects a registered codec (none beyond 0 / 8 in this server → ZIP_UNSUPPORTED_METHOD). Output base64 (≤ 50 MiB) or a sandbox file. Use it only for a raw payload or a bare deflate stream; to read an entry's content prefer read_zip_entry mode:'data'.
| Name | Type | Req | Description |
|---|---|---|---|
| allowTrailing | boolean | – | Accept bytes after the end of the deflate stream silently (they are always reported as `leftover`). |
| dataBase64 | string | – | The compressed stream as base64 (e.g. the payload from read_zip_entry mode:"raw"). Exclusive with sourcePath. |
| maxOutput | integer | yes | Mandatory output bound in bytes: decompression stops with ZIP_INFLATE_OUTPUT_OVERFLOW beyond it (zip-bomb guard). Inline results are further capped at 52428800 bytes, file results at 4294967296. |
| method | string | – | 'deflate' (default, method 8), 'store' (method 0, bounded pass-through) or a numeric method id for a registered codec. |
| outputMode | string | – | 'base64' (default) returns the bytes inline as an embedded resource (≤ 50 MiB). 'file' writes them inside ZIPNATIVE_MCP_OUTPUT_DIR (never overwrites; ≤ 4 GiB, streamed) and returns a resource_link. |
| outputPath | string | – | Relative path inside the sandbox (only when outputMode='file'); must end in a container extension (.zip recommended). |
| sourcePath | string | – | Relative path of a file inside the sandbox holding the compressed stream (streamed). Exclusive with dataBase64. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnosticCounts | object | – | Number of diagnostics received per code (counts every occurrence, including de-duplicated ones). |
| diagnostics | array | yes | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| diagnosticsTruncated | boolean | – | Present (true) when more than 200 distinct diagnostics were dropped from `diagnostics`. |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | yes | inflate_raw summary (the produced bytes are application/octet-stream, not an archive). |
No examples provided.
inspect_zip Inspect archive (facts, determinism verdict, CI checks) ~754
Read-only archive report in ONE call: size, entry / file / directory counts, Zip64, comment, compressed vs uncompressed totals, per-method counts, encrypted / symlink / data-descriptor / Zip64 / cp437 / duplicate / unsafe-name counts, date range, a `determinism` verdict (epoch timestamps + canonical order + UTF-8 flags ⇒ reproducible; `canonicalLayout` = no data descriptors) and every engine diagnostic (prepended SFX data, name mismatches, …). Opens EAGERLY by default: every entry's real extent is checked up front — overlapping entries, entries reaching into the central directory or past EOF, and Zip64 spoofing — and refused with their ZIP_* code rather than summarised (a method / CRC / size divergence between central and local headers is caught by verify_zip and on read, not here). `check:[…]` / `assert:{…}` turn it into a CI gate → `checks[]` + `checksPassed`. Token-frugal: verbosity:'summary', fields:[…]. Input: zipBase64 or zipPath (sandbox).
| Name | Type | Req | Description |
|---|---|---|---|
| assert | object | – | Parametrised assertions (each becomes a `checks[]` row). |
| check | array | – | CI assertions evaluated over the report: deterministic, epoch-timestamps, canonical-order, utf8-names, no-data-descriptor, canonical-layout, no-zip64, zip64, no-encryption, no-symlinks, safe-names, n… |
| fields | array | – | Dot-path projection applied after verbosity (e.g. ['entryCount', 'entries.name']); array segments map over elements; unmatched paths are reported in _meta.unmatchedFields. |
| limits | object | – | Override zipnative's named security bounds for this call (CWE-400 / CWE-409 guards). Every key is optional; absent keys keep the engine defaults (maxEntries 100000, maxEntryUncompressedSize 1 GiB, ma… |
| strict | boolean | – | Escalate the first engine diagnostic (prepended data, duplicate name, name mismatch, …) to a ZIP_STRICT_DIAGNOSTIC error instead of reporting it. |
| validate | string | – | 'eager' (default) cross-checks every local header and the overlap table up front — hostile shapes are refused here; 'lazy' defers to first read (cheaper on huge archives). |
| verbosity | string | – | 'summary' returns only the scalar verdict fields (drops arrays and payloads) — the token-frugal form. |
| zipBase64 | string | – | The archive bytes as base64 (exactly once; a data: URI prefix is tolerated). Exclusive with zipPath. Decoded size ≤ 128 MiB. |
| zipPath | string | – | Relative path of an archive inside the ZIPNATIVE_MCP_OUTPUT_DIR sandbox (no absolute paths, no '..'; container extensions only: .zip .jar .docx .epub …). Exclusive with zipBase64. Lets a create/modif… |
| Name | Type | Req | Description |
|---|---|---|---|
| archiveBytes | integer | – | – |
| canonicalLayout | boolean | – | summary only: buffered (no data descriptor) layout. |
| checks | array | – | – |
| checksPassed | boolean | – | Present when check / assert was supplied: true when every assertion holds. |
| comment | string | – | Archive comment (UTF-8, lossy). |
| commentBytes | integer | – | – |
| commentHex | string | – | – |
| compressedBytes | integer | – | – |
| cp437NameCount | integer | – | – |
| dataDescriptorCount | integer | – | – |
| determinism | object | – | `deterministic` = reproducible (epoch timestamps + canonical order + UTF-8 flags); `canonicalLayout` = the buffered layout (no data descriptors) — a streamed archive is reproducible but not canonical. |
| deterministic | boolean | – | summary only: the determinism verdict. |
| diagnosticCount | integer | – | summary only: number of distinct diagnostics. |
| diagnosticCounts | object | – | Number of diagnostics received per code (counts every occurrence, including de-duplicated ones). |
| diagnostics | array | – | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| diagnosticsTruncated | boolean | – | Present (true) when more than 200 distinct diagnostics were dropped from `diagnostics`. |
| directoryCount | integer | – | – |
| duplicateNameCount | integer | – | – |
| earliestDate | string|null | – | – |
| encryptedCount | integer | – | – |
| entryCount | integer | – | – |
| fileCount | integer | – | – |
| isZip64 | boolean | – | A Zip64 end-of-central-directory record is present. |
| latestDate | string|null | – | – |
| methods | array | – | – |
| multipleEocd | boolean | – | – |
| prependedData | boolean | – | SFX-style prefix before the first local header (offsets shifted). |
| ratio | string | – | – |
| symlinkCount | integer | – | – |
| uncompressedBytes | integer | – | – |
| unsafeNameCount | integer | – | Names sanitizeEntryPath() refuses (traversal, absolute, drive/UNC, NUL, ADS, device names). |
| utf8NameCount | integer | – | – |
| zip64EntryCount | integer | – | – |
No examples provided.
list_zip_entries List entries (paged inventory) ~716
Read-only central-directory inventory without decompressing anything: every entry (duplicates included) in directory order as a full row — name + encoding, sizes, ratio, CRC-32, method, timestamp, decoded flags, Unix mode, symlink, Zip64, data descriptor, host system, offsets, named extra fields, the sanitized path an extraction would use (null = unsafe name), comment. `filter` selects by exact names / prefix / globs; `offset` + `limit` page (default 200, max 2000, `hasMore`). Prefer inspect_zip for a one-shot summary and read_zip_entry / extract_zip for content. Token-frugal: verbosity:'summary' → names only; fields:[…].
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | – | Dot-path projection applied after verbosity (e.g. ['entryCount', 'entries.name']); array segments map over elements; unmatched paths are reported in _meta.unmatchedFields. |
| filter | object | – | Select entries by name. `names` (exact, case-sensitive), `prefix` (path prefix) and `glob` (patterns: `*` within a segment, `**` across segments, `?` one character; a pattern without `/` matches at a… |
| includeExtraData | boolean | – | Include each extra field payload as base64 (forensics). |
| limit | integer | – | Return at most this many entries (default 200, max 2000); `hasMore` tells you to page. |
| limits | object | – | Override zipnative's named security bounds for this call (CWE-400 / CWE-409 guards). Every key is optional; absent keys keep the engine defaults (maxEntries 100000, maxEntryUncompressedSize 1 GiB, ma… |
| offset | integer | – | Skip this many matching entries (paging). |
| strict | boolean | – | Escalate the first engine diagnostic (prepended data, duplicate name, name mismatch, …) to a ZIP_STRICT_DIAGNOSTIC error instead of reporting it. |
| validate | string | – | 'lazy' (default) parses the central directory only; 'eager' also cross-checks every local header up front. |
| verbosity | string | – | 'summary' returns only the scalar verdict fields (drops arrays and payloads) — the token-frugal form. |
| zipBase64 | string | – | The archive bytes as base64 (exactly once; a data: URI prefix is tolerated). Exclusive with zipPath. Decoded size ≤ 128 MiB. |
| zipPath | string | – | Relative path of an archive inside the ZIPNATIVE_MCP_OUTPUT_DIR sandbox (no absolute paths, no '..'; container extensions only: .zip .jar .docx .epub …). Exclusive with zipBase64. Lets a create/modif… |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnosticCount | integer | – | summary only: number of distinct diagnostics. |
| diagnosticCounts | object | – | Number of diagnostics received per code (counts every occurrence, including de-duplicated ones). |
| diagnostics | array | – | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| diagnosticsTruncated | boolean | – | Present (true) when more than 200 distinct diagnostics were dropped from `diagnostics`. |
| entries | array | – | – |
| entryCount | integer | – | Entries in the central directory (before filtering). |
| hasMore | boolean | – | – |
| isZip64 | boolean | – | – |
| limit | integer | – | – |
| matchedCount | integer | – | Entries kept by the filter (before paging). |
| names | array | – | summary only: the names on this page. |
| offset | integer | – | – |
| returnedCount | integer | – | – |
No examples provided.
modify_zip Modify archive (incremental, no recompression) ~864
Edit an existing archive without recompressing anything: operations add / replace / remove / rename / setComment applied in order. mode 'append' (default) = save(): the original bytes stay verbatim and edits are appended — fast and byte-preserving, BUT removed or replaced payloads REMAIN in the file (data remanence: recoverable by anyone; a ZIP_DEAD_BYTES_RATIO diagnostic fires past 50 % dead bytes, and 7-Zip is known to read the stale payload). mode 'compact' = saveCompact(): canonical rewrite, still no recompression, removed data truly gone, SFX prefix dropped. No edits and an unchanged comment return the same bytes (`summary.noOp`). Archives with duplicate entry names are refused — prefer create_zip for a full rebuild or when the source has duplicate names. Output base64 or a sandbox file.
| Name | Type | Req | Description |
|---|---|---|---|
| compression | object | – | Compression settings. `method` 'deflate' (default) or 'store'; `level` 0–9 (default 6); `deterministic: true` pins the pure-TS encoder so the bytes are identical on every runtime (slower). |
| defaultDate | string | – | Timestamp for entries that set no `date`: an ISO-8601 instant (1980-01-01 … 2107-12-31, 2-second DOS granularity) or 'now' (wall clock — emits the ZIP_TIMESTAMP_NOT_PINNED diagnostic and makes the by… |
| includeSha256 | boolean | – | Add `summary.sha256` of the produced bytes. |
| limits | object | – | Override zipnative's named security bounds for this call (CWE-400 / CWE-409 guards). Every key is optional; absent keys keep the engine defaults (maxEntries 100000, maxEntryUncompressedSize 1 GiB, ma… |
| mode | string | – | 'append' (default): save() — original bytes verbatim + appended entries + new central directory; removed/replaced payloads REMAIN in the file (data remanence). 'compact': saveCompact() — canonical re… |
| operations | array | yes | Edits applied in order. add: new entry (ZIP_ENTRY_EXISTS if present); replace: existing entry (ZIP_ENTRY_NOT_FOUND otherwise); remove; rename (never overwrites: remove the target first); setComment. |
| outputMode | string | – | 'base64' (default) returns the bytes inline as an embedded resource (≤ 50 MiB). 'file' writes them inside ZIPNATIVE_MCP_OUTPUT_DIR (never overwrites; ≤ 4 GiB, streamed) and returns a resource_link. |
| outputPath | string | – | Relative path inside the sandbox (only when outputMode='file'); must end in a container extension (.zip recommended). |
| strict | boolean | – | Escalate the first engine diagnostic (prepended data, duplicate name, name mismatch, …) to a ZIP_STRICT_DIAGNOSTIC error instead of reporting it. |
| zipBase64 | string | – | The archive bytes as base64 (exactly once; a data: URI prefix is tolerated). Exclusive with zipPath. Decoded size ≤ 128 MiB. |
| zipPath | string | – | Relative path of an archive inside the ZIPNATIVE_MCP_OUTPUT_DIR sandbox (no absolute paths, no '..'; container extensions only: .zip .jar .docx .epub …). Exclusive with zipBase64. Lets a create/modif… |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnosticCounts | object | – | Number of diagnostics received per code (counts every occurrence, including de-duplicated ones). |
| diagnostics | array | yes | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| diagnosticsTruncated | boolean | – | Present (true) when more than 200 distinct diagnostics were dropped from `diagnostics`. |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | yes | modify_zip summary. |
No examples provided.
read_zip_entry Read one entry (random access) ~739
Read ONE entry without extracting the archive, by `name` (exact; the last duplicate wins) or `index` (central-directory position — disambiguates duplicates). mode 'data' (default): decompressed content as base64 or UTF-8 `text` (encoding:'utf8'; ENTRY_NOT_UTF8 otherwise), CRC-verified; a `range` {offset,length} reads a byte window through the chunked stream (bounded memory, no CRC). mode 'raw': the compressed payload verbatim (feed it to inflate_raw). mode 'verify': CRC / size / local-header agreement only. Inline cap 16 MiB per entry (ENTRY_TOO_LARGE → use a range or extract_zip file mode). Encrypted entries → ZIP_UNSUPPORTED_ENCRYPTION (no decryption in this engine).
| Name | Type | Req | Description |
|---|---|---|---|
| encoding | string | – | Content encoding for mode 'data': base64 (default) or UTF-8 text (invalid UTF-8 → ENTRY_NOT_UTF8). |
| fields | array | – | Dot-path projection applied after verbosity (e.g. ['entryCount', 'entries.name']); array segments map over elements; unmatched paths are reported in _meta.unmatchedFields. |
| index | integer | – | Central-directory position (from list_zip_entries) — disambiguates duplicate names. Exclusive with name. |
| limits | object | – | Override zipnative's named security bounds for this call (CWE-400 / CWE-409 guards). Every key is optional; absent keys keep the engine defaults (maxEntries 100000, maxEntryUncompressedSize 1 GiB, ma… |
| mode | string | – | 'data' (default): decompressed content; 'raw': the compressed payload bytes verbatim (zero-copy, no decompression); 'verify': CRC / size / local-header check only, no payload. |
| name | string | – | Entry name (exact, case-sensitive; the LAST duplicate wins). Exclusive with index. |
| range | object | – | Read only a byte window of the decompressed content through the chunked stream (bounded memory; CRC is not verified for a window). length ≤ 16777216. |
| strict | boolean | – | Escalate the first engine diagnostic (prepended data, duplicate name, name mismatch, …) to a ZIP_STRICT_DIAGNOSTIC error instead of reporting it. |
| verbosity | string | – | 'summary' returns only the scalar verdict fields (drops arrays and payloads) — the token-frugal form. |
| verifyCrc | boolean | – | Verify the decompressed CRC-32 against the central directory (mode data, no range). |
| zipBase64 | string | – | The archive bytes as base64 (exactly once; a data: URI prefix is tolerated). Exclusive with zipPath. Decoded size ≤ 128 MiB. |
| zipPath | string | – | Relative path of an archive inside the ZIPNATIVE_MCP_OUTPUT_DIR sandbox (no absolute paths, no '..'; container extensions only: .zip .jar .docx .epub …). Exclusive with zipBase64. Lets a create/modif… |
| Name | Type | Req | Description |
|---|---|---|---|
| crcVerified | boolean | – | – |
| dataBase64 | string | – | – |
| diagnosticCount | integer | – | summary only: number of distinct diagnostics. |
| diagnosticCounts | object | – | Number of diagnostics received per code (counts every occurrence, including de-duplicated ones). |
| diagnostics | array | – | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| diagnosticsTruncated | boolean | – | Present (true) when more than 200 distinct diagnostics were dropped from `diagnostics`. |
| encoding | string | – | – |
| entry | object | – | – |
| index | integer | – | summary only: the entry index. |
| mode | string | – | – |
| name | string | – | summary only: the entry name. |
| range | object | – | – |
| sizeBytes | integer | – | Bytes returned (data / raw) or the declared uncompressed size (verify). |
| text | string | – | – |
| textLength | integer | – | – |
| verification | object | – | – |
No examples provided.
sanitize_entry_paths Sanitize entry paths (the traversal gate) ~200
Apply zipnative's single traversal gate `sanitizeEntryPath()` to a list of names: the safe '/'-separated relative form each maps to (join it under your extraction root — never the raw name), or null with the rule that fired (empty, NUL byte, absolute, drive letter, UNC, '..' traversal, NTFS alternate data stream ':', Windows reserved device name CON/NUL/COM1…). Use it when you extract with another tool or plan an external filesystem sink. No archive needed.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | – | Dot-path projection applied after verbosity (e.g. ['entryCount', 'entries.name']); array segments map over elements; unmatched paths are reported in _meta.unmatchedFields. |
| names | array | yes | Entry names to check (as stored in an archive). |
| verbosity | string | – | 'summary' returns only the scalar verdict fields (drops arrays and payloads) — the token-frugal form. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| rejectedCount | integer | – | – |
| rejectedNames | array | – | summary only: the rejected names. |
| results | array | – | – |
No examples provided.
scan_zip_forward Scan forward (truncated / unseekable streams — NOT authoritative) ~816
Walk LOCAL headers in stream order with bounded memory (zipnative's central-directory-less reader). The only tool that works on a truncated archive or a stream cut mid-way (it cannot skip an SFX prefix: the stream must start at a local header) — and the only one whose result is NOT authoritative: forward iteration trusts local headers ALONE, so a hostile archive can present different content here than inspect_zip / list_zip_entries report (the upload-scanner differential). Prefer those tools whenever the whole archive is available; use this one for forensics (`tolerateTruncation:true` returns the partial inventory + `error`). data 'none' skips payloads, 'verify' decompresses to check CRCs, 'include' returns them (inline caps). `stoppedAt` tells you whether a central directory was reached. Names are NOT sanitized — `sanitizedPath` shows what the extraction gate would use.
| Name | Type | Req | Description |
|---|---|---|---|
| data | string | – | 'none' (default): skip payloads (a data-descriptor entry still costs a full decompress-and-discard); 'verify': decompress every kept entry so CRC and sizes are checked; 'include': also return the con… |
| fields | array | – | Dot-path projection applied after verbosity (e.g. ['entryCount', 'entries.name']); array segments map over elements; unmatched paths are reported in _meta.unmatchedFields. |
| filter | object | – | Select entries by name. `names` (exact, case-sensitive), `prefix` (path prefix) and `glob` (patterns: `*` within a segment, `**` across segments, `?` one character; a pattern without `/` matches at a… |
| limits | object | – | Override zipnative's named security bounds for this call (CWE-400 / CWE-409 guards). Every key is optional; absent keys keep the engine defaults (maxEntries 100000, maxEntryUncompressedSize 1 GiB, ma… |
| maxEntries | integer | – | Stop after this many local headers (bounded work on an unbounded stream). Default 10000, clamped to the operator ceiling ZIPNATIVE_MCP_MAX_ENTRIES; an explicit value above the ceiling is refused (LIM… |
| strict | boolean | – | Escalate the first engine diagnostic (prepended data, duplicate name, name mismatch, …) to a ZIP_STRICT_DIAGNOSTIC error instead of reporting it. |
| tolerateTruncation | boolean | – | true: a truncated / corrupt stream ends the scan with `stoppedAt:"error"` and the partial inventory (forensics) instead of failing the call. |
| verbosity | string | – | 'summary' returns only the scalar verdict fields (drops arrays and payloads) — the token-frugal form. |
| zipBase64 | string | – | The archive bytes as base64 (exactly once; a data: URI prefix is tolerated). Exclusive with zipPath. Decoded size ≤ 128 MiB. |
| zipPath | string | – | Relative path of an archive inside the ZIPNATIVE_MCP_OUTPUT_DIR sandbox (no absolute paths, no '..'; container extensions only: .zip .jar .docx .epub …). Exclusive with zipBase64. Lets a create/modif… |
| Name | Type | Req | Description |
|---|---|---|---|
| bytesDelivered | integer | – | Bytes handed to the forward reader. |
| diagnosticCount | integer | – | summary only: number of distinct diagnostics. |
| diagnosticCounts | object | – | Number of diagnostics received per code (counts every occurrence, including de-duplicated ones). |
| diagnostics | array | – | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| diagnosticsTruncated | boolean | – | Present (true) when more than 200 distinct diagnostics were dropped from `diagnostics`. |
| entries | array | – | – |
| entryCount | integer | – | Local headers seen (before the filter). |
| error | object | – | – |
| inputBytes | integer|null | – | – |
| keptCount | integer | – | – |
| maxEntries | integer | – | The header budget in force (after clamping to the operator ceiling). |
| names | array | – | summary only: the kept entry names. |
| stoppedAt | string | – | 'central-directory' is the normal end of a complete archive; 'eof' means the stream ended before any central directory (truncated or CD-less); 'max-entries' means more local headers remained. |
| truncated | boolean | – | true when the stream ended without reaching a central directory. |
| trust | string | – | Constant reminder: nothing here was cross-checked against a central directory. |
No examples provided.
verify_zip Verify archive integrity (one call, never throws for archive problems) ~606
Deep verification in one call — zipnative's verifyZip report verbatim: eager structural validation, then every entry's CRC-32 / size / local-header agreement. `ok` is true when the structure is valid AND every verifiable entry passed. This tool NEVER fails for a problem with the archive: a structural refusal lands in `error` {code: ZIP_*, message}; an unverifiable entry is `skipped` ('encrypted' | 'stream-only-codec') and does not fail the archive, while an entry whose method has no codec here (anything but 0 store / 8 deflate) is reported FAILED, not skipped — the engine's verdict verbatim. Only caller mistakes (bad limits, bad input) are isError. `entries:'failed'` keeps the rows you act on; `verbosity:'summary'` keeps the verdict + counts. Verify before you trust: run it on any archive from an untrusted source before extract_zip.
| Name | Type | Req | Description |
|---|---|---|---|
| entries | string | – | Which per-entry rows to return: 'all' (default), only 'failed' (ok:false, not skipped), only 'skipped', or 'none' (verdict + counts only). |
| fields | array | – | Dot-path projection applied after verbosity (e.g. ['entryCount', 'entries.name']); array segments map over elements; unmatched paths are reported in _meta.unmatchedFields. |
| limits | object | – | Override zipnative's named security bounds for this call (CWE-400 / CWE-409 guards). Every key is optional; absent keys keep the engine defaults (maxEntries 100000, maxEntryUncompressedSize 1 GiB, ma… |
| maxEntries | integer | – | Cap on returned rows (the counts always cover every entry); `entriesTruncated` flags a cut. |
| verbosity | string | – | 'summary' returns only the scalar verdict fields (drops arrays and payloads) — the token-frugal form. |
| zipBase64 | string | – | The archive bytes as base64 (exactly once; a data: URI prefix is tolerated). Exclusive with zipPath. Decoded size ≤ 128 MiB. |
| zipPath | string | – | Relative path of an archive inside the ZIPNATIVE_MCP_OUTPUT_DIR sandbox (no absolute paths, no '..'; container extensions only: .zip .jar .docx .epub …). Exclusive with zipBase64. Lets a create/modif… |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnosticCount | integer | – | summary only: number of diagnostics. |
| diagnostics | array | – | Non-fatal conformance concerns the engine raised while parsing or writing (de-duplicated by code + entry, at most 200). Empty for a clean archive. Codes: ZIP_PREPENDED_DATA, ZIP_MULTIPLE_EOCD, ZIP_NA… |
| entries | array | – | – |
| entriesTruncated | boolean | – | – |
| entryCount | integer | – | – |
| error | object|null | – | The structural refusal when the archive could not even be opened (frozen ZIP_* code + engine message), else null. |
| failedCount | integer | – | Entries with a CRC / size / local-header mismatch. |
| ok | boolean | – | – |
| skippedCount | integer | – | Entries that could not be verified (encrypted, stream-only codec). |
| verifiedCount | integer | – | Entries that passed every check. |
No examples provided.
What is the zipnative MCP — ZIP creation, inspection, secure… server?
zipnative MCP — ZIP creation, inspection, secure… is listed in the public MCP registry as io.github.Nizoka/zipnative-mcp. ZIP MCP server: create, inspect, verify, extract securely, modify without recompression. 13 tools. This page covers its npm package (zipnative-mcp).
Is the zipnative MCP — ZIP creation, inspection, secure… server safe to use?
zipnative MCP — ZIP creation, inspection, secure… scores 88 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the zipnative MCP — ZIP creation, inspection, secure… server expose?
zipnative MCP — ZIP creation, inspection, secure… exposes 13 tools: inspect_zip, list_zip_entries, read_zip_entry, verify_zip, extract_zip, and 8 more. Their descriptions and schemas cost roughly 8,079 tokens of context every time the server is loaded.
Is the zipnative MCP — ZIP creation, inspection, secure… server still maintained?
zipnative MCP — ZIP creation, inspection, secure… is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the zipnative MCP — ZIP creation, inspection, secure… server under?
zipnative MCP — ZIP creation, inspection, secure… declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.