Unlock-MCP

Unlock-MCP

An MCP server providing comprehensive access to Unlock Protocol on Base and Base-Sepolia networks, enabling AI agents to interact with membership, subscription, and access control functionality.

Category
Visit Server

README

Unlock-MCP

Unlock MCP is an MCP server that provides comprehensive access to Unlock Protocol on Base and Base-Sepolia networks. This server exposes a number of public read and write functions from the Unlock Protocol smart contracts, enabling AI agents to interact with membership, subscription, and access control functionality.

🚀 Features

Complete Function Coverage

  • 55 Tools: All public read and write functions from PublicLock contract plus essential Unlock protocol functions
  • PublicLock Functions: Complete coverage of membership, pricing, transfers, and access control
  • Unlock Protocol Functions: Lock creation, upgrades, and protocol information
  • Read Functions: Query membership status, pricing, metadata, configuration, and protocol info
  • Write Functions: Purchase keys, manage memberships, configure locks, create locks, and handle upgrades

Two Operating Modes

Mode Key Location Gas Payer Transport Use Case
stdio Server .env Server stdio Claude Desktop, MCP clients
proxy Browser/Wallet Client HTTP/SSE n8n, web applications

Enterprise Ready

  • Comprehensive Input Validation with Zod schemas
  • Proper Error Handling with detailed logging
  • Type Safety throughout the codebase
  • n8n Integration with dedicated endpoints
  • Health Monitoring and graceful shutdown
  • Extensive Documentation for all tools

📦 Quick Start

1. Installation

git clone <repo-url> unlock-mcp
cd unlock-mcp
npm install
cp .env.example .env

2. Configuration

Edit .env with your settings:

# Required: Choose RPC provider
INFURA_API_KEY=your_infura_project_id
# OR
ALCHEMY_API_KEY=your_alchemy_api_key

# Required: Unlock Protocol contract addresses
# Base Mainnet
UNLOCK_ADDRESS=0x1FF7e338d5E582138C46044dc238543Ce555C963
# Base Sepolia (for testing)
# UNLOCK_ADDRESS=0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06

# Optional: Default lock address
LOCK_ADDRESS=0x...

# Required for stdio mode only
PRIVATE_KEY=0x...  # ⚠️ Use test wallet with minimal funds

3. Build

npm run build

4A. Run stdio Mode (Claude Desktop)

Start the server:

MCP_MODE=stdio node dist/index.js

Claude Desktop configuration:

{
  "mcpServers": {
    "unlock": {
      "command": "node",
      "args": ["/ABSOLUTE/PATH/unlock-mcp/dist/index.js"],
      "env": { "MCP_MODE": "stdio" }
    }
  }
}

4B. Run proxy Mode (n8n, HTTP APIs)

Start the server:

MCP_MODE=proxy node dist/index.js

For Claude Desktop with SSE:

{
  "mcpServers": {
    "unlock": {
      "command": "node",
      "args": ["/ABSOLUTE/PATH/unlock-mcp/dist/index.js"],
      "env": { "MCP_MODE": "proxy" },
      "transport": { 
        "type": "sse", 
        "url": "http://localhost:3000/sse" 
      }
    }
  }
}

🔧 n8n Integration

The proxy mode is optimized for n8n workflows with:

MCP Client Tool Node

# Install n8n community MCP node
npm install n8n-nodes-mcp

Available Endpoints

  • GET /tools - List all available MCP tools
  • POST /tools/call - Execute MCP tools with validation
  • GET /health - Health check and server status
  • GET /sse - Server-Sent Events for real-time connection
  • GET / - API documentation

Example n8n Workflow

  1. Add MCP Client Tool node
  2. Configure server URL: http://localhost:3000
  3. Use tools like getHasValidKey, purchase, grantKeys, etc.

🛠️ Available Tools

📖 Read Functions (30 tools)

Unlock Protocol Information

  • chainIdRead - Get current network chain ID
  • unlockVersion - Get Unlock protocol version
  • governanceToken - Get UDT governance token address
  • getGlobalTokenSymbol - Get global token symbol
  • publicLockLatestVersion - Get latest lock template version

PublicLock ERC721 & Membership

  • balanceOf - Get number of keys owned
  • ownerOf - Get owner of specific token
  • tokenURI - Get metadata URI
  • totalSupply - Get total keys created
  • getHasValidKey - Check if address has valid key
  • isValidKey - Check if specific token is valid
  • keyExpirationTimestampFor - Get key expiration time

Lock Configuration

  • keyPrice - Get current key price
  • maxKeysPerAddress - Get max keys per address
  • maxNumberOfKeys - Get maximum total keys
  • expirationDuration - Get key validity duration
  • name/symbol - Get lock metadata
  • tokenAddress - Get payment token
  • transferFeeBasisPoints - Get transfer fee

Pricing & Fees

  • purchasePriceFor - Calculate purchase price
  • getCancelAndRefundValue - Get refund amount
  • getTransferFee - Calculate transfer fee

Access Control

  • owner - Get lock owner
  • isLockManager - Check manager status
  • hasRole - Check role permissions

✍️ Write Functions (27 tools)

Lock Creation & Management

  • createLock - Deploy new basic PublicLock contract
  • createUpgradeableLock - Deploy upgradeable lock with custom data
  • upgradeLock - Upgrade existing lock to new version

Key Management

  • purchase - Buy keys for recipients
  • grantKeys - Issue keys administratively
  • extend - Extend key duration
  • renewMembershipFor - Renew membership

Key Transfers

  • transferFrom - Transfer key ownership
  • approve - Approve address for transfer
  • lendKey/unlendKey - Temporary key lending
  • shareKey - Share key time with others

Lock Administration

  • updateKeyPricing - Change price and payment token
  • updateLockConfig - Modify lock settings
  • setLockMetadata - Update name, symbol, URI
  • withdraw - Extract funds from lock

Access Control

  • grantRole/revokeRole - Manage permissions
  • setOwner - Transfer ownership

Advanced Features

  • cancelAndRefund - Cancel with refund
  • setReferrerFee - Configure referral rewards
  • mergeKeys - Combine key durations

🔍 Example Usage

Get Protocol Information

# Get current protocol version
{
  "name": "unlockVersion",
  "arguments": {
    "chainId": 8453
  }
}

# Get UDT governance token address
{
  "name": "governanceToken",
  "arguments": {
    "chainId": 8453
  }
}

Create a New Lock

# Deploy basic lock
{
  "name": "createLock",
  "arguments": {
    "chainId": 8453,
    "_lockCreator": "0x...",
    "_expirationDuration": "31536000",
    "_tokenAddress": "0x0000000000000000000000000000000000000000",
    "_keyPrice": "1000000000000000000",
    "_maxNumberOfKeys": "100",
    "_lockName": "My Membership Lock"
  }
}

# Deploy upgradeable lock with custom initialization
{
  "name": "createUpgradeableLock",
  "arguments": {
    "chainId": 8453,
    "data": "0x..."
  }
}

Check Membership Status

{
  "name": "getHasValidKey",
  "arguments": {
    "chainId": 8453,
    "lockAddress": "0x...",
    "_keyOwner": "0x..."
  }
}

Purchase a Key

{
  "name": "purchase", 
  "arguments": {
    "chainId": 8453,
    "lockAddress": "0x...",
    "_values": ["1000000000000000000"],
    "_recipients": ["0x..."],
    "_referrers": ["0x0000000000000000000000000000000000000000"],
    "_keyManagers": ["0x..."],
    "_data": ["0x"]
  }
}

Upgrade an Existing Lock

{
  "name": "upgradeLock",
  "arguments": {
    "chainId": 8453,
    "lockAddress": "0x...",
    "version": "15"
  }
}

Grant Administrative Keys

{
  "name": "grantKeys",
  "arguments": {
    "chainId": 8453, 
    "lockAddress": "0x...",
    "_recipients": ["0x...", "0x..."],
    "_expirationTimestamps": ["1735689600", "1735689600"], 
    "_keyManagers": ["0x...", "0x..."]
  }
}

🏗️ Architecture

Validation Pipeline

Request → Zod Schema → Function Call → Result/Error

Error Handling

  • Input Validation: Comprehensive Zod schemas for all parameters
  • Network Errors: Automatic retry and detailed error messages
  • Transaction Failures: Clear error reporting with gas estimation
  • Logging: Structured logs with timestamps and context

Security Features

  • Environment variable validation
  • Address format verification
  • Role-based access control
  • Safe error handling without data leaks

📚 Environment Variables

Variable Required Description Example
MCP_MODE No Operating mode stdio or proxy
INFURA_API_KEY Yes* Infura project ID abc123...
ALCHEMY_API_KEY Yes* Alchemy API key xyz789...
UNLOCK_ADDRESS Yes Unlock factory address 0x1FF7e338d5E5...
LOCK_ADDRESS No Default lock address 0x...
PRIVATE_KEY stdio only Wallet private key 0x...
PORT No Proxy server port 3000

*Choose one RPC provider


🧪 Testing

Comprehensive Test Suite

This project includes a complete testing framework covering:

  • 77 Tests across unit, integration, and E2E layers
  • Mock Blockchain Interactions for reliable testing
  • MCP Protocol Compliance verification
  • CI/CD Integration with GitHub Actions

Running Tests

# Run all tests
npm test

# Run tests with coverage
npm run test:coverage

# Run specific test suites
npm run test tests/unit          # Unit tests only
npm run test:integration         # Integration tests
npm run test:e2e                # End-to-end tests

# Watch mode for development
npm run test:watch

# Interactive UI
npm run test:ui

Test MCP Inspector

# Test with official MCP Inspector
npm run test:mcp

# Manual testing
npm run build
npx @modelcontextprotocol/inspector node dist/src/index.js

Health Check API (Proxy Mode)

# Health status
curl http://localhost:3000/health

# List all 55 tools
curl http://localhost:3000/tools

# Execute function
curl -X POST http://localhost:3000/tools/call \
  -H "Content-Type: application/json" \
  -d '{
    "name": "keyPrice",
    "arguments": {
      "chainId": 8453,
      "lockAddress": "0x..."
    }
  }'

Test Coverage

Current test coverage includes:

  • Schema Validation: 100% coverage of all input validation
  • Tool Definitions: Complete verification of 55 tools
  • Function Categorization: Read vs write function classification
  • Contract Interactions: Mocked blockchain operations
  • Error Handling: Comprehensive error scenario testing

📋 Contract Addresses

Base Mainnet (Chain ID: 8453)

  • Unlock Protocol: 0x1FF7e338d5E582138C46044dc238543Ce555C963

Base Sepolia (Chain ID: 84532)

  • Unlock Protocol: 0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06

🤝 Contributing

This implementation follows MCP best practices:

  • Type-safe function signatures
  • Comprehensive input validation
  • Detailed error handling
  • Extensive logging
  • Clear documentation

Perfect for building membership systems, subscription services, and access control mechanisms with AI assistance.


⚠️ Security Notice

  • Use test networks for development
  • Never commit private keys to version control
  • Use dedicated wallets with minimal funds
  • Validate all inputs in production environments
  • Monitor transaction costs and set appropriate limits

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured