ZKshare logo

ZKshare

ZKshare stdio MCP: store/prove/share, semantic search, sandbox proxy to HTTPS /api/v1/context.

Install ZKshare

Pick your client, then add it in one click or paste the config.

STDIONode.js
~/Library/Application Support/Claude/claude_desktop_config.json
claude_desktop_config.json
{
  "mcpServers": {
    "zkshare": {
      "command": "npx",
      "args": [
        "-y",
        "zkshare-mcp"
      ]
    }
  }
}

Settings → Developer → Edit Config, merge this into mcpServers, then fully quit and reopen Claude Desktop.

We couldn’t confirm it starts correctly

We ran the install command but it didn't respond within our test window — this can mean a slow first-time install rather than a real problem.

npx -y zkshare-mcp

No response to initialize.

This is an experimental automated check and can have false negatives — missing environment variables, a slow cold install, etc. It doesn’t necessarily mean something’s wrong. Last checked 1d ago.

Overview

Security & health

What it can reach and how reliably it runs — from our own checks, not the maintainer’s claims.

ActiveLast checked 2d ago

Recent health check succeeded.

7/7 checks healthy over the last 39d

Supply-chain signal

No high-severity advisories surfaced by our automated scan.

Critical 0High 0Medium 0Low 0

Scanned 10d ago via OSV.dev · zkshare-mcp (npm)

Adoption & maintenance

Factual signals from GitHub, npm, and our automated checks — not a rating.

npm downloads101Package downloads in the last 30 days.
Last commit5mo agoMost recent push to the default branch.
Install checkInconclusiveDidn't respond in our test window — often a slow first install.
Directory activity2 viewsConfig copies, upvotes, and views on AllMCPs.

From the project README

zkShare

Privacy-oriented context API for users, AI agents, and back-office systems. A single HTTP entrypoint (POST /api/v1/context) handles encrypted fact storage, commitment-based proof envelopes, semantic search over encrypted data, end-to-end-encrypted (client-sealed) facts, and a isolated sandbox execution for sensitive computations. The implementation is a Next.js (App Router) application backed by PostgreSQL with pgvector.

This document is for developers integrating against the API and operators self-hosting the service. It is not a marketing brochure — pricing tiers, dashboards, and billing are optional layers defined separately in the application code.


Privacy and security model

The platform is designed around three trust boundaries:

BoundaryWhat the operator can seeWhat stays private
Server-sealed storeCiphertext, IV, auth tag, commitment, embedding vector. The server holds the AES-256-GCM key (ZKSHARE_ENCRYPTION_SECRET) and decrypts in memory only when the caller invokes prove, share, or search summaries.Database operators (without the encryption secret) and direct table readers (RLS denies anon and authenticated) cannot read plaintext.
Client-sealed (E2EE) storeOpaque ciphertext blobs, IV, auth tag, commitment, and a caller-supplied embedding vector. The server never receives or derives plaintext, and never calls an embedding model on the fact.The platform operator. Decryption requires the caller's own key, which never leaves the caller.
Proof envelopesA versioned, HMAC-signed JSON envelope (commitment + query + yes/no answer + nonce). Verifiable by anyone holding ZKSHARE_PROOF_SECRET.The fact plaintext used to derive the answer is never included in the envelope.

What this means in practice

  • Users can prove a property of a personal fact (for example, "the user prefers beach trips") to a third party without exposing the underlying value. The third party verifies the envelope through verify_proof.
  • Agents can hold and exchange context across sessions or tool boundaries without surfacing the raw values to downstream systems. Sharing produces a single-use, time-bound share_token bound to a recipient agent identifier.
  • Businesses integrating the API can offer privacy guarantees that are technical, not contractual — RLS denies direct table access, the encryption key is server-only, the proof HMAC secret is server-only, and the client-sealed path lets sensitive data stay outside the operator's reach entirely.

SECURITY.md is the canonical reference for the threat model, the trust model summary, vulnerability disclosure, the operator checklist, and third-party LLM exposure controls.


API contract

OperationBehavior
storeServer-sealed: caller sends value. Server encrypts with AES-256-GCM, computes a salted commitment, generates an embedding (or accepts a 1536-dim embedding), and persists with client_encrypted = false. Client-sealed: caller sends ciphertext, iv, auth_tag, commitment, and the required embedding. Server stores blobs and the vector, sets client_encrypted = true, and never derives anything from the plaintext or label.
proveLoads a server-sealed fact, decrypts in memory, derives a yes/no answer for the supplied query (LLM with temperature: 0, or a heuristic when external LLMs are disabled), and returns an HMAC-signed proof envelope. Returns 422 / CLIENT_ENCRYPTED if the fact is client-sealed.
shareSame as prove, plus inserts a row into share_tokens (recipient_agent_id, expiry, proof) and returns a share_token. The token is a 24-byte base64url string, valid for seven days.
searchEmbeds the query, calls match_facts (a security definer SQL function with cosine distance over pgvector), and returns ranked summaries for server-sealed rows only. Client-sealed rows are excluded at the SQL level and the application level.
verify_proofValidates an envelope without loading any fact. Malformed envelope returns 400 / VALIDATION_ERROR; well-formed envelope with a bad HMAC returns 200 with data.valid: false.
sandboxExecutes a small allow-listed function inside an isolated node:vm sandbox (no host I/O, 50 ms timeout) and returns the result with attestation metadata and a short-lived HS256 JWT (proof_of_execution). Every response advertises provider: "vm-sandbox" — this is software isolation, not hardware attestation.

Authoritative request and response shapes live in types/index.ts and openapi.json.

Model Context Protocol (MCP)

The npm package zkshare-mcp (npm, source packages/zkshare-mcp/) is a stdio MCP server exposing tools (zkshare_store, zkshare_prove, …) that call POST https://zkshare.io/api/v1/context (or your ZKSHARE_API_URL) with ZKSHARE_API_KEY.

Official MCP Registry canonical name: io.github.sp0oby/zkshare — registry lookup · About the MCP Registry (discovery metadata; runnable package remains on npm).

End users: Node.js ≥ 18, then npx -y zkshare-mcp — no clone. Configure your host (example below).

Contributors: from the repo root pnpm install, then pnpm mcp to run the local package; source is packages/zkshare-mcp/.

Advanced client-sealed store bodies stay on HTTPS/OpenAPI — not via MCP tools.

json
// ~/.cursor/mcp.json
{
  "mcpServers": {
    "zkshare": {
      "command": "npx",
      "args": ["-y", "zkshare-mcp"],
      "env": {
        "ZKSHARE_API_KEY": "zk_live_…",
        "ZKSHARE_API_URL": "https://zkshare.io"
      }
    }
  }
}

Error codes

CodeHTTPMeaning
INVALID_API_KEY401Missing, malformed, or revoked key.
RATE_LIMITED429Per-key sliding-window limit exceeded. Retry-After header included.
VALIDATION_ERROR400Body fails the Zod schema or a malformed proof was passed to verify_proof.
FACT_NOT_FOUND404No row matches (api_key_id, logical_user_id, fact_key).
PROOF_FAILED400Decryption failed or no definite yes/no answer could be derived.
CLIENT_ENCRYPTED422prove or share was called against a client-sealed fact.
INTERNAL_ERROR500Caught exception. The original message is logged via lib/logger.ts; clients see a generic message.

Architecture

  • Runtime: /api/v1/context is a Node.js route handler (not Edge) so AES-256-GCM, scrypt key derivation, and the Supabase service-role client behave deterministically.
  • Persistence: PostgreSQL with extensions and tables managed by versioned migrations under supabase/migrations/. Tables: api_keys, facts, audit_logs, share_tokens. The facts table stores ciphertext, IV, auth tag, commitment, a vector(1536) embedding, and a client_encrypted flag.
  • Search: match_facts(api_key_id, logical_user_id, query_embedding, match_count) is a security definer function with an IVFFlat index. It returns server-sealed rows only. Updating the function's row type requires DROP FUNCTION ... CASCADE-style replacement (a PostgreSQL constraint) — the migrations handle this explicitly.
  • Authentication and authorization:
    • End-user dashboard: Supabase Auth magic-link sign-in. middleware.ts redirects unauthenticated visitors away from /dashboard.
    • HTTP API: x-api-key header. Keys are stored as SHA-256 hashes; only the prefix is shown in the dashboard. Rotating a key requires generating a new one — plaintext is never persisted.
    • Database access: RLS denies all direct access from anon and authenticated roles. The application uses the Supabase service role server-side only.
  • Rate limiting: Upstash Redis (sliding window) when configured; an in-process fallback is used in local development.
  • Encryption keys:
    • ZKSHARE_ENCRYPTION_SECRET — server-side AES-256-GCM master secret (scrypt-derived; minimum 32 characters).
    • ZKSHARE_PROOF_SECRET — HMAC secret for commitments and proof envelopes (minimum 16 characters).
    • ZKSHARE_ENCLAVE_JWT_SECRET — HS256 secret for sandbox attestations (minimum 32 characters).
    • All three are required for the relevant code paths. The application throws on startup if any are missing or too short.

Repository layout

PathPurpose
app/Next.js App Router routes — public site, dashboard, API endpoints (api/v1/context, api/keys, api/billing, api/webhooks/stripe, api/health, api/health/ready, api/audit/export, auth/callback).
lib/Server-only modules: encryption.ts, zk.ts, embeddings.ts, search.ts, sandbox.ts, api-key.ts, rate-limit.ts, audit.ts, llm-client.ts, supabase-server.ts, supabase-browser.ts.
components/UI components built on shadcn/ui primitives.
types/index.tsZod request schema, operation enum, error codes, and shared row types.
supabase/migrations/Ordered SQL migrations.
circuits/Notes and placeholders for future Groth16 wiring. snarkjs is a runtime dependency but is not on the default trust path.
packages/zkshare-mcp/Publishable zkshare-mcp npm package — MCP stdio server that proxies to /api/v1/context.
openapi.jsonOpenAPI 3.1 description of the public surface.
SECURITY.mdThreat model, operational checklist, and the encryption / LLM matrix.

Local development

Reviews

No reviews yet — be the first to share how it worked for you.

Frequently Asked Questions about ZKshare

ZKshare is an MCP server that provides a stdio interface for storing, proving, sharing, and semantically searching context through ZKshare’s privacy-oriented API. It also offers a sandbox proxy to the HTTPS `/api/v1/context` endpoint. Depending on the storage mode, facts are server-sealed or client-sealed with plaintext kept from the operator.

The server supports storing facts, proving properties about server-sealed facts, sharing proofs with recipient agents, semantic search, and sandbox execution through the `/api/v1/context` API.

Client-sealed facts are stored as caller-provided ciphertext, IV, authentication tag, commitment, and embedding. ZKshare never receives or derives the plaintext, does not generate an embedding for the fact, and cannot run `prove` on client-sealed data.

ZKshare can create HMAC-signed proof envelopes for server-sealed facts without including the underlying plaintext. A proof contains a commitment, query, yes-or-no answer, and nonce, and can be verified by someone holding the proof secret.

Sharing proves a property of a server-sealed fact and creates a single-use, time-bound share token bound to a recipient agent identifier. The token is a 24-byte base64url string and is valid for seven days.

Related MCP servers

Add a badge to your READMEShow it’s listed — live SVG, Markdown or HTML.

AllMCPs Directory Badge

Full Badge Customizer

Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.

Badge Style:
Live Dynamic SVG PreviewZKshare AllMCPs Directory Badge
Markdown (GitHub README)
[![AllMCPs](https://allmcps.com/api/badge/zkshare?style=directory)](https://allmcps.com/mcp/zkshare)
HTML Embed
<a href="https://allmcps.com/mcp/zkshare"><img src="https://allmcps.com/api/badge/zkshare?style=directory" alt="ZKshare on AllMCPs" /></a>