DUAL MCP Server
# DUAL MCP Server
AI-native integration with the [DUAL](https://dual.xyz) tokenization platform via the [Model Context Protocol](https://modelcontextprotocol.io).
This MCP server enables AI agents to interact directly with the DUAL Web3 Operating System — minting tokens, managing templates, executing actions, deploying webhooks, and querying blockchain infrastructure. Not through screen scraping or API wrappers, but through native integration that treats AI agents as first-class users of the system.
## Features
- **115 tools** across 17 API modules
- **Full CRUD** for wallets, organizations, templates, objects, faces, webhooks, notifications, and API keys
- **Event Bus** — execute actions and batch operations atomically
- **Sequencer & ZK-Rollup** — query batches and checkpoints
- **AI Services** — intelligence (agents, predictions, knowledge graph), governance (compliance, provenance), creative (token design, face templates)
- **Public API** — read-only access without authentication
- **Dual transport** — stdio for local use, HTTP for remote deployment
- **Session-isolated HTTP** — each HTTP request gets its own auth context
## Quick Start
### Install
```bash
npm install
npm run build
```
### Configure
Set your authentication via environment variables:
```bash
# Option 1: API Key (recommended for server-to-server)
export DUAL_API_KEY=your-api-key
# Option 2: JWT Token
export DUAL_ACCESS_TOKEN=your-jwt-token
# Option 3: Use the dual_login tool interactively (stdio mode only — see note below)
```
> **Note on `dual_login` and HTTP mode:** HTTP mode is stateless — each request creates a fresh
> server and API client, so any auth state set by `dual_login` is discarded after that single
> request. For HTTP deployments, always supply credentials via environment variable
> (`DUAL_API_KEY` or `DUAL_ACCESS_TOKEN`) rather than calling `dual_login` interactively.
> Interactive login via `dual_login` only works reliably in stdio mode.
### Run
```bash
# stdio transport (for Claude, Cursor, etc.)
node dist/index.js
# HTTP transport (for remote/multi-client)
# MCP_SERVER_API_KEY is REQUIRED for HTTP mode
MCP_SERVER_API_KEY=your-secret TRANSPORT=http PORT=3100 node dist/index.js
```
### Claude Desktop Configuration
Add to your `claude_desktop_config.json`:
```json
{
"mcpServers": {
"dual": {
"command": "node",
"args": ["/path/to/dual-mcp-server/dist/index.js"],
"env": {
"DUAL_API_KEY": "your-api-key"
}
}
}
}
```
## API Modules & Tools
### Core DUAL API (81 tools)
| Module | Tools | Description |
|--------|-------|-------------|
| **Wallets** | 11 | Authentication, registration, profile management, logout |
| **Organizations** | 10 | Multi-tenant workspaces, members, roles |
| **Templates** | 7 | Token template CRUD, variations |
| **Objects** | 8 | Tokenized asset instances, search, hierarchy |
| **Actions (Event Bus)** | 7 | Execute actions, batch operations, action types |
| **Faces** | 6 | Visual representations (image, 3D, web) |
| **Storage** | 4 | File upload, asset management |
| **Webhooks** | 6 | Real-time event subscriptions |
| **Notifications** | 5 | Message sending, templates |
| **Sequencer** | 4 | Batch and ZK-rollup checkpoint queries |
| **API Keys** | 3 | Programmatic access management |
| **Payments** | 2 | Payment config, deposit history |
| **Support** | 3 | Feature access requests, support messages |
| **Public API** | 5 | Read-only public endpoints (no auth) |
### AI Services (34 tools)
These tools require the DUAL AI microservices running alongside the server. See [AI Service Dependencies](#ai-service-dependencies) below.
| Module | Tools | Description |
|--------|-------|-------------|
| **Intelligence** | 12 | Autonomous agents, lifecycle predictions, trending, anomalies, knowledge graph |
| **Governance** | 14 | Compliance rules & evaluation, audit log, policy parsing, provenance verification |
| **Creative** | 8 | Token design generation, face templates, SVG rendering |
## Example Usage
### Natural Language → Token Deployment
> "Create a redeemable reward token for my brand with 1 million supply, set up a rule that expires after 12 months, and mint it on Base."
The AI agent uses:
1. `dual_create_template` — define the reward token structure
2. `dual_create_action_type` — register "Redeem" and "Expire" actions
3. `dual_execute_action` — mint the initial supply
4. `dual_create_webhook` — set up expiry monitoring
### Querying Infrastructure
> "Show me the latest ZK checkpoint and how many objects are on the platform."
1. `dual_list_checkpoints` — latest rollup state
2. `dual_public_get_stats` — platform-wide statistics
## Environment Variables
| Variable | Description | Required |
|----------|-------------|----------|
| `DUAL_API_KEY` | API key for DUAL platform authentication | One of these |
| `DUAL_ACCESS_TOKEN` | JWT access token | One of these |
| `DUAL_REFRESH_TOKEN` | JWT refresh token | No |
| `DUAL_API_URL` | API base URL (default: `https://api.blockv-labs.io/v3`) | No |
| `TRANSPORT` | `stdio` (default) or `http` | No |
| `PORT` | HTTP port (default: `3100`) | No |
| `HOST` | HTTP bind address (default: `127.0.0.1`) | No |
| `MCP_SERVER_API_KEY` | Shared secret for HTTP endpoint auth | **Yes** (HTTP mode) |
| `CORS_ORIGIN` | Comma-separated allowed origins (e.g. `https://app.example.com`) | No |
| `RATE_LIMIT_MAX` | Max requests per minute per IP (default: `100`) | No |
### AI Service Dependencies
The intelligence, governance, and creative tool modules connect to separate DUAL AI microservices. If these services are not running, those 34 tools will return connection errors; the remaining 81 core tools are unaffected.
| Variable | Default | Service |
|----------|---------|---------|
| `INTELLIGENCE_URL` | `http://localhost:3201` | Intelligence (agents, predictions, graph) |
| `GOVERNANCE_URL` | `http://localhost:3202` | Governance (compliance, provenance, policies) |
| `CREATIVE_URL` | `http://localhost:3203` | Creative (token design, face rendering) |
## Architecture
```
dual-mcp-server/
├── src/
│ ├── index.ts # Server factory, transport setup (stdio + HTTP)
│ ├── constants.ts # API URL, limits, MCP_SERVER_API_KEY
│ ├── schemas/
│ │ └── common.ts # Shared Zod schemas (pagination, IDs, filters)
│ ├── services/
│ │ ├── api-client.ts # ApiClient class (per-session auth + HTTP requests)
│ │ ├── ai-client.ts # HTTP client for AI microservices
│ │ ├── security.ts # SSRF, NoSQL injection, input validation
│ │ └── formatters.ts # Response formatting, truncation
│ └── tools/
│ ├── wallets.ts # 11 wallet tools (incl. login, logout)
│ ├── organizations.ts # 10 organization tools
│ ├── templates.ts # 7 template tools
│ ├── objects.ts # 8 object tools
│ ├── actions.ts # 7 event bus tools
│ ├── faces.ts # 6 face tools
│ ├── storage.ts # 4 storage tools
│ ├── webhooks.ts # 6 webhook tools
│ ├── notifications.ts # 5 notification tools
│ ├── sequencer.ts # 4 sequencer tools
│ ├── api-keys.ts # 3 API key tools
│ ├── payments.ts # 2 payment tools
│ ├── support.ts # 3 support tools
│ ├── public-api.ts # 5 public API tools
│ ├── intelligence.ts # 12 intelligence tools
│ ├── governance.ts # 14 governance tools
│ └── creative.ts # 8 creative tools
├── SECURITY.md # Security policy & reporting
└── dist/ # Compiled JavaScript
```
## Security
See [SECURITY.md](SECURITY.md) for the security policy, threat model, and how to report vulnerabilities.
Key security features:
- **Session isolation**: HTTP mode creates a fresh server + auth context per request
- **SSRF protection**: External URL validation blocks private networks and cloud metadata
- **NoSQL injection prevention**: Filter schemas reject `$`-operator keys
- **Input validation**: Zod schemas with size/depth limits on all tool inputs
- **Rate limiting**: Per-IP rate limiting with configurable max
- **Security headers**: X-Content-Type-Options, CSP, HSTS, X-Frame-Options
## License
MIT
TDQS
Scored across 80 tools
Most tools have distinct purposes, but there is significant overlap in some areas, such as multiple 'list' tools for different resources (e.g., dual_list_objects, dual_search_objects, dual_public_search_objects) and similar 'get' operations across entities, which could cause confusion. Descriptions help clarify, but the sheer number of tools increases ambiguity risk.
Tool names follow a consistent 'dual_verb_noun' pattern throughout, with clear action-object pairs (e.g., dual_create_template, dual_update_object). Minor deviations exist, like dual_get_me instead of dual_get_wallet_me, but overall naming is predictable and readable.
With 80 tools, the count is excessive for a single server, making it overwhelming and likely to cause agent confusion. While the domain (a multi-feature platform) is broad, this many tools suggests poor scoping and could be split into multiple focused servers for better usability.
The tool set provides comprehensive coverage for the platform's domain, including CRUD operations for templates, objects, organizations, and webhooks, plus authentication, notifications, and public access. No obvious gaps are present; it supports full lifecycle management and complex workflows like batch actions and search.