A collection of native MCP servers written in Go, providing tools for archive operations, calculator, clipboard, cryptography, DNS, and encoding/decoding
22 tools with complete schemas and descriptions. Naming is verb-first and clear (create_zip, extract_tar, fetch_url). Descriptions average ~100 chars, meeting the 10-1024 baseline. All parameters have type definitions and descriptions. However, several tools lack output schema documentation, parameter constraints are minimal (e.g., random_bytes accepts 1..1024 but not formally constrained), and error handling lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Missing idempotency guarantees and per-item failure reporting for batch operations.
Decode a base32 string (RFC 4648).
Encode a UTF-8 string to base32 (RFC 4648).
Decode a base64 string. Set urlsafe=true for URL/filename-safe alphabet.
Encode a UTF-8 string to base64. Set urlsafe=true for URL/filename-safe alphabet.
Create a TAR archive at 'output' containing 'inputs'. Set 'gzip'=true to produce .tar.gz.
Create a ZIP archive at 'output' containing 'inputs' (files or directories, walked recursively).
Evaluate an arithmetic expression. Supports + - * / % ^ ** (), unary +/-, functions (abs, sqrt, pow, exp, ln, log, log10, log2, sin, cos, tan, floor, ceil, round, min, max) and constants (pi, e). Safe parser — no arbitrary code execution.
No output schema documentation. Tools return text or error results, but LLMs cannot plan downstream calls without knowing response structure. E.g., fetch_url returns 'response body as text' but no field names or structure.
Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot distinguish safe reads from destructive writes. E.g., create_zip and extract_zip should be marked destructive; evaluate and hash should be marked readOnly.
Error handling lacks recovery guidance. Handlers return mcp.ErrorResult() with raw error messages (e.g., 'invalid arguments: ...') but do not suggest next steps or categorize errors as retryable vs user-fixable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Extract a TAR or TAR.GZ archive into 'dest_dir' (gzip auto-detected). All entries must stay within the sandbox.
Extract a ZIP archive into 'dest_dir' (created if missing). All entries must stay within the sandbox.
Fetch an HTTP(S) URL and return the response body as text. Honors --allow-domain, --max-bytes and --timeout.
Hash a UTF-8 string with the given algorithm. Output is lowercase hex.
Decode a hex string to UTF-8.
Encode a UTF-8 string to lowercase hex.
Return the configured --allow-domain list, or 'any' if no restriction is in effect.
Return the directories this server is allowed to read from / write to.
DNS lookup. type ∈ {a, aaaa, mx, txt, cname, ns, ptr}. For 'ptr', host must be an IP.
Generate cryptographically random bytes, returned as lowercase hex.
Read text from the OS clipboard. Linux: wl-paste (Wayland) or xclip (X11). macOS: pbpaste. Windows: PowerShell Get-Clipboard.
Decode a percent-encoded string.
Percent-encode a string for use in a URL query value.
Generate a UUID. version='v4' (random, default) or 'v7' (timestamp-ordered, RFC 9562).
Write text to the OS clipboard. Linux: wl-copy (Wayland) or xclip (X11). macOS: pbcopy. Windows: clip.exe.
Parameter constraints not formally declared. random_bytes accepts 1..1024 bytes (stated in description only, not in schema minLength/maxLength). fetch_url method defaults to GET but no enum constraint. LLMs cannot validate without formal constraints.
No idempotency guarantees documented. Archive creation and extraction tools do not state whether repeated calls with same inputs produce identical results or risk duplicate side effects.