Skip to main content
Glama
bradley-t-t

cryptofort

by bradley-t-t

Why CryptoFort

Secrets sprawl across .env files, shell history, and plaintext columns — and agents have no safe, structured way to ask for them. CryptoFort seals every secret with authenticated encryption, keeps the key out of the database entirely, and hands agents a narrow MCP interface that returns metadata by default and plaintext only on an explicit get.

Related MCP server: GhostKey

Stack

Layer

Technology

Language

TypeScript 5, ESM-first with a CJS build

Encryption

Node crypto — AES-256-GCM, 32-byte key from the environment

Validation

Zod 4 (MCP tool schemas)

Agent interface

@modelcontextprotocol/sdk over stdio, read-only by default

Backends

@supabase/supabase-js, postgres, or better-sqlite3 — all optional peers

Build

tsup (ESM + CJS + .d.ts)

Tests

Vitest

Runtime

Node 20 or newer

Getting started

Install

npm install cryptofort
# plus the driver for your backend:
npm install @supabase/supabase-js   # or: better-sqlite3 | postgres
# and, to run the MCP server:
npm install @modelcontextprotocol/sdk

Every driver — and the MCP SDK — is an optional peer dependency, so nothing is pulled in that you do not use. Requires Node 20 or newer.

CryptoFort is also published to GitHub Packages as @bradley-t-t/cryptofort. Point the @bradley-t-t scope at the GitHub registry and authenticate with a token that has read:packages — GitHub Packages requires auth even for public packages:

@bradley-t-t:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}
npm install @bradley-t-t/cryptofort

Library usage

import { Vault, Crypto, SqliteAdapter } from 'cryptofort';

const adapter = new SqliteAdapter('vault.db');
await adapter.init();

const vault = new Vault({
  adapter,
  crypto: new Crypto({ key: process.env.CRYPTOFORT_MASTER_KEY! }),
});

await vault.put({
  name: 'stripe-secret-key',
  secret: 'sk_live_…',
  provider: 'stripe',
  tags: ['payments'],
});
await vault.search('stripe'); // metadata only — never the secret
await vault.get('stripe-secret-key'); // the decrypted secret

Generate a master key (base64, 32 bytes):

node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

…or from the library with import { generateKey } from 'cryptofort'.

MCP server

The MCP server needs @modelcontextprotocol/sdk installed alongside CryptoFort. Point any MCP client at the cryptofort-mcp binary:

{
  "mcpServers": {
    "cryptofort": {
      "command": "cryptofort-mcp",
      "env": {
        "CRYPTOFORT_ADAPTER": "supabase",
        "SUPABASE_URL": "https://<ref>.supabase.co",
        "SUPABASE_SERVICE_ROLE_KEY": "<service-role-key>",
        "CRYPTOFORT_MASTER_KEY": "<base64-32-bytes>"
      }
    }
  }
}

The server is read-only by default. Add "args": ["--allow-write"] to expose credential_put.

Tools

Tool

Access

Description

credential_search

read

Search by name, description, provider, or tag. Returns metadata only.

credential_get

read

Decrypt and return a single secret by exact name.

credential_list

read

List credential metadata in a namespace, optionally filtered by tag.

credential_put

write

Create or update a credential. Requires --allow-write.

Environment

Variable

Required

Purpose

CRYPTOFORT_MASTER_KEY

always

Base64, 32-byte AES-256 key. Never written to the database.

CRYPTOFORT_ADAPTER

supabase (default), sqlite, or postgres.

CRYPTOFORT_KEY_ID

Key identifier for rotation. Defaults to default.

SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY

Supabase

Connection for the Supabase adapter.

CRYPTOFORT_SUPABASE_DB_URL

Direct Postgres URL, used only to auto-create the schema. Needs the postgres driver.

CRYPTOFORT_POSTGRES_URL

Postgres

Connection string for the Postgres adapter.

CRYPTOFORT_SQLITE_PATH

SQLite file path. Defaults to cryptofort.db.

Backends

Backend

Driver

Best for

Supabase

@supabase/supabase-js

Hosted, shared across agents, service-role access.

Postgres

postgres

Dropping the vault into existing Postgres infrastructure.

SQLite

better-sqlite3

Local, single-process, zero-infrastructure use.

Architecture

flowchart TD
    A["Agent / MCP client"] -->|"stdio"| M["cryptofort-mcp — read-only by default"]
    App["Your app"] --> V["Vault"]
    M --> V
    V --> C["Crypto — AES-256-GCM"]
    C -->|"master key from env, never stored"| K["CRYPTOFORT_MASTER_KEY"]
    V --> AD["Adapter"]
    AD --> S[("Supabase")]
    AD --> P[("Postgres")]
    AD --> Q[("SQLite")]

How it works

  • Only the secret is ciphertext. name, description, provider, and tags stay plaintext, so search and listing work without ever decrypting.

  • Each secret is sealed with AES-256-GCM — authenticated encryption, so any tampering is caught on read.

  • The master key never touches the database. It lives only in CRYPTOFORT_MASTER_KEY; a stolen dump reveals nothing without it.

  • The MCP server refuses writes unless started with --allow-write, so an agent can look secrets up but cannot quietly rewrite the vault.

Schema

CryptoFort creates its schema automatically on first connect — one table, one ciphertext column, the rest plaintext metadata for search. There is no migration to run by hand.

  • SQLite and Postgres: adapter.init() issues create table if not exists (plus indexes), so pointing CryptoFort at an empty database is enough.

  • Supabase: the client speaks PostgREST, which cannot run DDL. init() probes for the table and, when it is missing, creates it through a direct Postgres connection given in CRYPTOFORT_SUPABASE_DB_URL. If the table already exists the probe is a no-op; if it is missing and no DB URL is set, init() fails with a clear message instead of silently.

The canonical column definitions live in src/adapters/schema.ts.

Project structure

cryptofort/
├── assets/cryptofort-hero.png
├── src/
│   ├── index.ts               Public surface — Vault, Crypto, the three adapters, types
│   ├── vault.ts               put / get / search / list over an adapter
│   ├── crypto.ts              AES-256-GCM seal/open, generateKey
│   ├── types.ts               Credential and search types, DEFAULT_NAMESPACE
│   ├── adapters/
│   │   ├── types.ts           The CredentialStore contract
│   │   ├── schema.ts          Canonical column definitions
│   │   ├── supabase.ts        PostgREST, with optional direct-Postgres provisioning
│   │   ├── postgres.ts        `postgres` driver
│   │   └── sqlite.ts          better-sqlite3
│   └── mcp/
│       ├── bin.ts             The `cryptofort-mcp` executable, --allow-write
│       ├── server.ts          Tool definitions, exported as `cryptofort/mcp`
│       └── config.ts          Crypto and adapter construction from the environment
├── test/                      crypto, vault, mcp, and one suite per adapter
└── tsup.config.ts

Development

npm install
npm run build      # bundle with tsup
npm test           # run the vitest suite

Script

Does

npm run build

Bundle ESM, CJS, and types with tsup.

npm test

Run the Vitest suite.

npm run typecheck

tsc --noEmit.

npm run lint

Lint with ESLint.

npm run format

Check formatting with Prettier.

Backend drivers are optional peer dependencies — install only the one you use.

License

Released under the MIT License.

A
license - permissive license
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    -
    quality
    D
    maintenance
    Encrypted credential vault with a 21-tool MCP server. Store and manage LLM API keys, service API keys, and OAuth credentials — then let your AI agent list, reveal, rotate, rename, pause, and proxy calls through them.
    MIT
  • A
    license
    -
    quality
    B
    maintenance
    MCP-native credential vault that enables AI agents to authenticate with external services without exposing secrets, supporting bearer, basic, OAuth2, and other auth patterns via MCP tools.
    0
    MIT
  • A
    license
    -
    quality
    B
    maintenance
    An encrypted credential vault for MCP clients that stores and uses sensitive material without exposing values to the model, enabling secure command execution, HTTP requests, and template rendering.
    12
    MIT

View all related MCP servers

Related MCP Connectors

  • Encrypted secret store and rotation for autonomous agent credentials

  • Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.

  • Remote MCP for A2A caller identity, scope policy, verdict receipts, and audit history.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bradley-t-t/cryptofort'

If you have feedback or need assistance with the MCP directory API, please join our Discord server