Hive Secrets

io.github.srotzinPublished by GitHub account srotzinv1.0.0Updated Oct 24, 2026

Encrypted secret store and rotation for autonomous agent credentials

The publisher's own server: Secrets.RealEstate

VerifiedStreamable HTTPWeb executableFinanceSecurity & Monitoring

Overview

AI-generated overview

A remote MCP server that stores and retrieves encrypted agent credentials in per-agent namespaces, with paid reads and writes settled in USDC on Base.

What you can do
Store, read and delete secrets keyed by namespace and key, encrypted at rest with AES-256-GCM and scoped to the caller's agent DID namespace. List the keys held in a namespace. Read the per-namespace audit log of actions, including payment and error events. Check today's revenue snapshot and service health. Paid operations require a Base USDC transaction hash that the service verifies on-chain before serving the call.
When to use it
Useful when an autonomous agent needs a hosted place to keep API keys or other credentials between runs, isolated per agent identity, and you accept paying small per-call USDC fees for reads and writes.
Requirements
Remote streamable-HTTP endpoint; no local install or declared authentication. Paid calls need a Base USDC transfer to the operator's wallet and a transaction hash supplied in the request body or the x402-tx-hash header. Self-hosting needs Node.js, npm and a SECRETS_MASTER_KEY environment variable; without it, writes return 503.
Before you install
The service holds real credentials: anyone who can act as your agent DID can read your namespace, and rotating the master key invalidates all stored ciphertexts. Reads and writes cost USDC on Base and require sending a transaction hash; the README also publishes a wallet address and payment details. Writes, deletes and audit reads change or expose stored data, and the operator runs the hosted instance and its master key.

Installation

In SourceWeft

  1. Open Hive Secrets in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.srotzin%2Fhive-mcp-secrets/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "hive-secrets": {
      "type": "http",
      "url": "https://hive-mcp-secrets.onrender.com/mcp"
    }
  }
}

README

hive-mcp-secrets

[srotzin/hive-mcp-secrets MCP server]

Encrypted secret store for the A2A network — Hive Civilization. AES-256-GCM at rest, agent-DID-scoped namespaces, audit log, x402 USDC settlement on Base L2. MCP 2024-11-05. Inbound only.

Agents put encrypted secrets keyed by (namespace, key) and retrieve them later. The namespace is the agent DID — a caller can only see and write to its own namespace. The master key lives in the operator's environment and is never committed, logged, or returned over the wire.

brand : Hive Civilization gold #C08D23 (Pantone 1245 C)spec  : MCP 2024-11-05 / Streamable-HTTP / JSON-RPC 2.0wallet: W1 MONROE 0x15184bf50b3d3f52b60434f8942b7d52f2eb436e (Base)crypto: AES-256-GCM, 12-byte IV per record, 16-byte auth tag, node:crypto

Quick start

bash
git clone https://github.com/srotzin/hive-mcp-secretscd hive-mcp-secretsnpm install
# 32 random bytes as hex — never commit this valueexport SECRETS_MASTER_KEY=$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")
npm start# hive-mcp-secrets on :3000

Hosted endpoint: https://hive-mcp-secrets.onrender.com/mcp

Tools and pricing

ToolUSD / callNotes
secrets_get$0.002Read and decrypt a secret. Caller must own the namespace.
secrets_put$0.005Encrypt and store a secret. Returns 503 if master key not configured.
secrets_listfreeList keys in a namespace. Tier 0.
secrets_audit$0.002Read the audit log for a namespace.

All payments are inbound. Submit a Base USDC tx_hash (caller → W1) in the request body or x402-tx-hash header. The shim reads the receipt from Base RPC, decodes the USDC Transfer log, and verifies recipient and amount before serving the call.

Operator note — master key required for writes

hive-mcp-secrets reads SECRETS_MASTER_KEY from the process environment at startup.

  • If set, it is parsed as 64-char hex → 32 raw bytes; or as base64 → 32 raw bytes; or otherwise SHA-256 hashed to 32 bytes.
  • If not set, writes return 503 service_unavailable with reason: "SECRETS_MASTER_KEY not set". Reads of records that do not exist return 404 as usual; reads of stored records require the same key that wrote them, since AES-256-GCM rejects decryption with any other key.

The key is never committed to the repository, never logged, and never returned over the wire. Operators are expected to set it in the deployment environment (Render env var, Kubernetes secret, etc.) before enabling production traffic. Rotating the key invalidates all previously stored ciphertexts.

Namespace model

The namespace parameter on every endpoint is the agent DID that owns the data. Every endpoint enforces caller_did === namespace and returns forbidden_namespace_mismatch otherwise. There is no superuser, no cross-namespace read, and no multi-DID sharing in v1.

The audit log is per-namespace and records every action — get, put, delete, list, audit, plus the negative paths payment_required, error:not_found, error:integrity_check_failed, etc. Entries store caller_did, action, ts_ms, and (for paid ops) tx_hash, payer, and amount_usd.

REST endpoints

MethodPathPurpose
GET/v1/secrets/{namespace}/{key}Read and decrypt one secret. Paid.
PUT/v1/secrets/{namespace}/{key}Encrypt and store one secret. Paid. Returns 503 without master key.
DELETE/v1/secrets/{namespace}/{key}Remove a secret. Free, caller-owned.
GET/v1/secrets/{namespace}List keys in a namespace. Free, Tier 0.
GET/v1/secrets/auditAudit log read. Paid. Query: namespace, caller_did, since_ms?, until_ms?, limit?.
GET/v1/secrets/todayToday's revenue snapshot. Free.
GET/healthService health, including master_key_loaded.
GET/.well-known/mcp.jsonMCP discovery.
POST/mcpMCP JSON-RPC.

PUT /v1/secrets/{namespace}/{key} body

json
{  "value": "the-secret-string",  "caller_did": "did:hive:0xabc...",  "tx_hash": "0x...64-char-tx-on-base..."}

Without tx_hash, the response is a 402 envelope:

json
{  "error": "payment_required",  "x402": {    "type": "x402", "version": "1", "kind": "secrets_put",    "asking_usd": 0.005, "accept_min_usd": 0.005,    "asset": "USDC", "asset_address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",    "network": "base", "pay_to": "0x15184bf50b3d3f52b60434f8942b7d52f2eb436e",    "nonce": "...", "issued_ms": 1714200000000  }}

Encryption details

  • Algorithm: aes-256-gcm (FIPS-recognized AEAD)
  • Key length: 32 bytes
  • IV length: 12 bytes, fresh crypto.randomBytes(12) per record
  • Auth tag length: 16 bytes
  • Storage: SQLite secrets table — (namespace, key, ciphertext, iv, auth_tag, created_ms, updated_ms, version) with PRIMARY KEY (namespace, key)
  • Write path: node:crypto.createCipheriv → update → final, then getAuthTag(). All three values stored as base64 TEXT.
  • Read path: createDecipheriv → setAuthTag → update → final. Any single bit flipped in ciphertext, iv, or auth_tag causes final() to throw, which surfaces as integrity_check_failed.

The smoke test below verifies tampered ciphertext fails to decrypt — this is real AES-GCM, not an integrity check tacked on after the fact.

MCP usage

bash
curl -X POST https://hive-mcp-secrets.onrender.com/mcp \  -H "content-type: application/json" \  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
bash
curl -X POST https://hive-mcp-secrets.onrender.com/mcp \  -H "content-type: application/json" \  -d '{    "jsonrpc":"2.0","id":2,"method":"tools/call",    "params":{      "name":"secrets_put",      "arguments":{        "namespace":"did:hive:0xabc",        "key":"openai_api_key",        "value":"sk-...",        "caller_did":"did:hive:0xabc",        "tx_hash":"0x..."      }    }  }'

Local smoke test

bash
export SECRETS_MASTER_KEY=$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")npm start &sleep 1
# Tier 0 list (empty)curl -s "http://localhost:3000/v1/secrets/did:hive:0xa/" | jq .
# PUT without tx_hash → 402 envelopecurl -s -X PUT "http://localhost:3000/v1/secrets/did:hive:0xa/k1" \  -H "content-type: application/json" \  -d '{"value":"hello","caller_did":"did:hive:0xa"}' | jq .
# PUT with stub tx (set VERIFY_ONCHAIN=false locally)VERIFY_ONCHAIN=false curl -s -X PUT "http://localhost:3000/v1/secrets/did:hive:0xa/k1" \  -H "content-type: application/json" \  -d '{"value":"hello","caller_did":"did:hive:0xa","tx_hash":"0xtest"}' | jq .
# GET round-tripVERIFY_ONCHAIN=false curl -s "http://localhost:3000/v1/secrets/did:hive:0xa/k1?caller_did=did:hive:0xa&tx_hash=0xtest" | jq .

Hosting

Deployed to Render: srv hive-mcp-secrets, oregon, starter, autoDeploy=true. The Render env var SECRETS_MASTER_KEY is the operator's responsibility to set. Without it, the deployed service still runs, /health reports master_key_loaded: false, and writes return 503.

License

MIT — see LICENSE.

Hive Civilization Directory

Part of the Hive Civilization — agent-native financial infrastructure.

Brand: #C08D23

Source: README.md at commit d7d19b7

Tools

0
SourceWeft has not read this server's tools yet.

Version history

1
  1. v1.0.0LatestSep 16, 2026

Score

85% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Secrets integrations