A permanent memory layer for AI agents to mint media and text as NFTs.
Hekkova MCP Server
The permanent memory layer for AI agents. Connect any MCP-compatible AI (Claude, ChatGPT, Gemini, Cursor, custom agents) and mint moments — photos, videos, audio, text — permanently to the Polygon blockchain with IPFS + Filecoin storage, Lit Protocol encryption, and privacy tiers that let you control who sees what.
Quick Start
# 1. Install dependencies
npm install
# 2. Copy and configure environment variables
cp .env.example .env
# Edit .env with your Supabase, Thirdweb, Pinata, and Stripe credentials
# 3. Seed the local test account and API key
npm run seed
# 4. Start the development server
npm run dev
# → Server running at http://localhost:3000/mcp
Connect with Claude Desktop
Add this to your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"hekkova": {
"type": "url",
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer hk_test_local_dev_key_12345678"
}
}
}
}
For production, replace the URL and API key:
{
"mcpServers": {
"hekkova": {
"type": "url",
"url": "https://mcp.hekkova.com/mcp",
"headers": {
"Authorization": "Bearer hk_live_YOUR_API_KEY"
}
}
}
}
Get your API key at hekkova.com/dashboard/keys.
Tool Reference
| Tool | Description |
|---|---|
mint_moment |
Mint media (photo, video, audio, text) permanently to Polygon. Encrypts based on phase, pins to IPFS, mints ERC-721 NFT. Returns a Block ID. |
mint_from_url |
Fetch a public URL (tweet, Instagram post, image, web page) and mint it. Extracts og:title and og:image automatically. |
list_moments |
Paginated list of all minted moments. Filterable by phase, category, or search query. |
get_moment |
Full details for a single moment by Block ID: CIDs, transaction hash, phase, tags, and more. |
update_phase |
Change a moment's privacy phase. Free between encrypted tiers (New Moon → Crescent → Gibbous). $0.49 to/from Full Moon. Free for Legacy Plan. |
export_moments |
Export all moments as JSON or CSV. Returns a 24-hour download URL with all Block IDs and IPFS CIDs. |
get_balance |
Check remaining mint credits, current plan (free / arc_builder / legacy), and phase shift balance. |
get_account |
Account identity: Light ID, display name, wallet address, default phase, and legacy plan status. |
Privacy Phases
| Phase | Access | Encryption |
|---|---|---|
new_moon |
Owner only | Lit Protocol (owner wallet ACC) |
crescent |
Close circle (2–10 people) | Lit Protocol (shared access conditions) |
gibbous |
Extended group (up to 50) | Token-gated via Hekkova ERC-721 |
full_moon |
Fully public | None |
Moment Categories
| Category | Meaning |
|---|---|
super_moon |
Major life event |
blue_moon |
Rare moment |
super_blue_moon |
Once-in-a-lifetime |
eclipse |
Time-locked — sealed until eclipse_reveal_date |
null |
Uncategorized |
Rate Limits
| Plan | Requests/min | Mints/min |
|---|---|---|
| Sandbox (test keys) | 10 | 1 |
| Standard (any paid pack) | 60 | 10 |
| Legacy Plan | 120 | 20 |
Rate limit headers are included on every response:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Reset: 1710680460
Running Tests
# Make sure the server is running in another terminal
npm run dev
# Run the test client
npm run test-client
Deployment
Vercel (Serverless)
npm install -g vercel
vercel
Add a vercel.json:
{
"builds": [{ "src": "src/server.ts", "use": "@vercel/node" }],
"routes": [{ "src": "/(.*)", "dest": "src/server.ts" }]
}
Set all environment variables in the Vercel dashboard under Project → Settings → Environment Variables.
Railway
npm install -g @railway/cli
railway login
railway init
railway up
Set environment variables in the Railway dashboard. Railway will auto-detect the npm start script.
Fly.io
npm install -g flyctl
fly auth login
fly launch
Fly will generate a fly.toml. Set secrets with:
fly secrets set SUPABASE_URL=... SUPABASE_SERVICE_KEY=... THIRDWEB_SECRET_KEY=...
fly deploy
Project Structure
hekkova-mcp/
├── src/
│ ├── server.ts # Express + MCP server, auth middleware, rate limiter
│ ├── config.ts # Typed config from environment variables
│ ├── types/index.ts # TypeScript interfaces (Account, Moment, ApiKey, etc.)
│ ├── services/
│ │ ├── auth.ts # API key validation and hashing
│ │ ├── database.ts # Supabase queries (moments, accounts, API keys)
│ │ ├── blockchain.ts # Thirdweb/Polygon minting (stub → real)
│ │ ├── storage.ts # Pinata IPFS pinning (stub → real)
│ │ └── enc
Tools (8)
mint_momentMint media or text permanently to Polygon with encryption and IPFS storage.mint_from_urlFetch a public URL and mint it as a moment.list_momentsPaginated list of all minted moments with filtering options.get_momentRetrieve full details for a single moment by Block ID.update_phaseChange a moment's privacy phase and encryption tier.export_momentsExport all moments as JSON or CSV.get_balanceCheck remaining mint credits and plan status.get_accountRetrieve account identity and wallet information.Environment Variables
SUPABASE_URLrequiredSupabase project URLSUPABASE_SERVICE_KEYrequiredSupabase service role keyTHIRDWEB_SECRET_KEYrequiredThirdweb secret key for blockchain interactionsConfiguration
{"mcpServers": {"hekkova": {"type": "url", "url": "https://mcp.hekkova.com/mcp", "headers": {"Authorization": "Bearer hk_live_YOUR_API_KEY"}}}}