Skip to content

Security

Claude Synergy is a local-only data tool. It operates entirely on your machine with optional outbound HTTP for changelog synchronization.

AssetLocationSensitivity
SQLite databasedata/claude-synergy.dbDerived — deletable and re-creatable
Markdown release filesproducts/*/releases/*.mdPublic changelog data
YAML configproducts.yamlProduct registry — no secrets
Vector embeddingsIn SQLite DB (vec_chunks table)Derived from public data

All data is derived from public sources. Deleting the database and re-running hk sync recreates everything.

  • No user code, documents, or personal files
  • No browser history, cookies, or credentials
  • No system configuration or registry entries
  • No other application data
WhenDestinationPurpose
hk fetch / hk syncapi.github.comPull GitHub releases
hk fetch / hk syncRSS feed URLsPull Cursor, Cody releases
hk fetch / hk syncChangelog HTML pagesScrape Copilot, VS Code Chat
hk fetch / hk syncSmithery, MCP Registry APIsPull MCP catalog data
hk embed (remote)Voyage AI, Cohere APIsGenerate embeddings/reranking
hk embed (local)localhost:11434 (Ollama)Local embedding generation

No network calls occur unless you explicitly run hk fetch, hk sync, or hk embed with a remote provider. The MCP server performs zero network operations — it reads only from the local database.

  • Filesystem: read/write to data/ and products/ directories under the working directory
  • Network: outbound HTTPS only, and only when explicitly invoked
  • No elevated privileges: runs as the current user, no sudo or admin required

Claude Synergy reads these environment variables when present:

VariablePurposeRequired?
GITHUB_TOKENHigher GitHub API rate limitsOptional
VOYAGE_API_KEYVoyage AI embeddings/rerankingOnly for Voyage provider
COHERE_API_KEYCohere rerankingOnly for Cohere provider
ANTHROPIC_API_KEYClaude Haiku context generationOnly for claude-haiku context
  • Secrets are never logged at any log level (silent through debug)
  • Secrets are never stored to disk — only held in memory during the active process
  • Secrets are never included in error messages — error paths use safeErrorBody() to strip response bodies
  • Secrets are never sent to unintended destinations — each key is only used with its corresponding API

Claude Synergy collects and sends zero telemetry:

  • No analytics
  • No crash reporting
  • No usage tracking
  • No phone-home checks
  • No feature flags fetched from remote servers

This is stated explicitly even though it may seem obvious for a local tool.

All filename inputs from external sources (GitHub tag names, RSS slugs, HTML headings) flow through sanitizeFilename() before being joined into filesystem paths:

  • Strips ../, /, \, leading dots
  • Rejects control characters and Windows-reserved characters
  • Double-checks output for any remaining traversal patterns
  • Length-capped at 100 characters

External shell inputs (repository names for gh CLI calls) are validated via assertRepoShape():

  • Must match ^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$
  • Passed via execFileSync argv (not shell template), preventing injection

All MCP tool inputs are validated before processing:

  • asRecord() — enforces arguments are objects
  • requireString() — enforces non-empty strings
  • optString(), optInt(), optEnum() — type and range validation
  • Invalid inputs return McpError with descriptive messages, never crash the server

Email: 64996768+mcp-tool-shop@users.noreply.github.com

Include:

  • Description of the vulnerability
  • Steps to reproduce
  • Version affected
  • Potential impact
ActionTarget
Acknowledge report48 hours
Assess severity7 days
Release fix30 days

See SECURITY.md for the full policy.