归档检查与提取MCP服务器

archive-mcp 是一款通过 stdio 运行的 MCP 服务器,使用系统 PATH 中的原生工具安全地列出、检查和选择性提取 tar、tar.gz、gz、zip 等归档文件,适用于开发者在本地或 MCP 主机中快速、安全地处理压缩包内容。

  • by ipolyzos
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 ipolyzos/archive-mcp

使用说明

archive-mcp

archive-mcp is a Go Model Context Protocol (MCP) server over stdio that inspects and selectively extracts archives using system tools on PATH (no shell).

License Apache-2.0
OS Linux, macOS

Documentation

Start here — guides and contracts live under docs/:

Doc Description
Tools reference Parameters and result shapes for every MCP tool
Usage examples Worked JSON requests (list, inspect, extract, ping)
Client contract Error codes, fields, configuration-sensitive limits
Architecture Packages, adapters, stdio request flow
Development Local checks, fuzzing, doc update checklist
Troubleshooting Missing binaries, permissions, malformed JSON, CI
Releases Branching, tags, changelog policy

Repository meta:

Security policy Threat model, runner limits, extraction + ZIP encryption notes
Contributing Branches, PRs, CI gate
Code of conduct Community expectations
Changelog Version history (Keep a Changelog)

On GitHub, relative links above resolve to the browsable files for the branch/tag you are viewing.

Contents

What it does

Capability Tools
Health / version ping
List members (read-only) list_archive_contents
Metadata + warnings (read-only) inspect_archive (optional deep)
Extract named paths only extract_selected_files

Details: Tools reference · Examples: Usage.

Supported archive shapes

Extensions / detection (see internal/archive):

  • .tar → tar
  • .tar.gz, .tgz → targz
  • .gz → single-stream gz (not a multi-file container)
  • .zip → zip

External binaries (PATH)

Format family Typical binaries
tar / tar.gz tar
zip unzip (list + extract); zipinfo optional for name listing
gzip stream gzip tooling where used by adapters; .gz extract may use stdlib

Clients should expect binary_missing if required tools are absent — see Troubleshooting.

Stdio transport

One JSON object per line on stdin (NDJSON). stdout carries only JSON; stderr is for logs (--debug adds detail).

MCP hosts (Cursor, Claude Desktop, …)

Use JSON-RPC 2.0 messages (jsonrpc, id, method, params):

  • initialize → capabilities + serverInfo
  • notifications/initialized → no stdout line (notification)
  • tools/list → tool names, descriptions, inputSchema
  • tools/call with name + arguments → content / isError (see Usage)

Legacy / scripts

A single-line object with tool (and optional id, params) still works for ad-hoc pipes and tests.

Malformed input

Non-JSON or bad frames: legacy-shaped lines get one invalid_request response and the process exits. JSON-RPC lines return a JSON-RPC error when possible — see Troubleshooting and Client contract.

Safety guarantees

  • No shell interpolation (exec.CommandContext only).
  • Bounded command timeouts and stdout/stderr capture limits.
  • Path traversal prevention and archive entry validation.
  • Extraction: no overwrite, optional allowed output base, symlink/hardlink entries refused by default.

More detail: SECURITY.md · Errors: Client contract.

Quickstart

go build -o bin/archive-mcp ./cmd/archive-mcp
./bin/archive-mcp

Embedded version string (shown in ping):

go build -ldflags "-X main.buildVersion=$(git describe --tags --always)" -o bin/archive-mcp ./cmd/archive-mcp

Ping:

{"id":"req-1","tool":"ping"}
{"id":"req-1","result":{"ok":true,"version":"dev","server":"archive-mcp"}}

Configuration

Flags and equivalent environment variables (see internal/config):

Flag Env (typical)
--timeout ARCHIVE_MCP_TIMEOUT_SECONDS
--max-output-bytes ARCHIVE_MCP_MAX_OUTPUT_BYTES
--max-entries ARCHIVE_MCP_MAX_ENTRIES
--max-archive-size ARCHIVE_MCP_MAX_ARCHIVE_SIZE
--allowed-output-base ARCHIVE_MCP_ALLOWED_OUTPUT_BASE
--debug ARCHIVE_MCP_DEBUG

Example:

./bin/archive-mcp --timeout 10 --max-output-bytes 1048576 --debug

Limits also appear in Client contract.

Sample list_archive_contents

{
  "id": "req-list-1",
  "tool": "list_archive_contents",
  "params": {
    "archive_path": "internal/archive/testdata/sample.tar",
    "max_entries": 100,
    "include_details": true
  }
}

License

Licensed under Apache-2.0. See LICENSE.