Skip to main content
Glama
README.md
# ContextVM MCP Bridge

**Expone servicios ContextVM (Event Sourcing + FSM + DDD) a LLMs mediante Model Context Protocol sobre Nostr.**

## 🎯 ¿Qué hace este Bridge?

Este bridge actúa como traductor bidireccional entre:

- **MCP (Model Context Protocol)**: Protocolo estándar para que LLMs interactúen con servicios externos
- **ContextVM**: Nuestra arquitectura de Event Sourcing + FSM + DDD

```
LLMs (Claude, GPT, etc.)
    ↓ MCP (kind 25910)
MCP Bridge (Traductor)
    ↓ DVM (kind 5051-6054)
ContextVM Services (sin cambios)
```

## ✨ Características

- ✅ **No invasivo**: Los ContextVMs existentes no se modifican
- ✅ **Nostr como BUS**: Un solo relay para MCP y DVM
- ✅ **Bidireccional**: Traduce peticiones y respuestas
- ✅ **Configurable**: Mapeos externos en JSON
- ✅ **Observable**: Logs detallados y métricas
- ✅ **Production-ready**: Docker, health checks, error handling

## 🚀 Quick Start

### 1. Instalación

```bash
# Clonar repositorio
git clone https://github.com/your-org/contextvm-mcp-bridge.git
cd contextvm-mcp-bridge

# Instalar dependencias
npm install

# Configurar
cp .env.example .env
# Editar .env con tu configuración
```

### 2. Generar Keypair

```bash
# Generar nueva keypair para el bridge
npx tsx scripts/generate-keypair.ts

# Copiar el private key a .env
# BRIDGE_PRIVATE_KEY=<hex-key>
```

### 3. Configurar Contextos

Editar `config/contexts.json` con los ContextVMs disponibles:

```json
{
  "contexts": [
    {
      "id": "cbz_tesoreria_pagos",
      "name": "CBZ Tesorería - Pagos Ejecutados",
      "namespace": "cbz-tesoreria-pagos-ejecutados",
      "jobRequestKind": 5053,
      "jobResultKind": 6053,
      "rootEntity": {
        "type": "pago-tesoreria",
        "initialState": "planificado",
        "schema": { ... },
        "transitions": [ ... ]
      }
    }
  ]
}
```

### 4. Ejecutar

```bash
# Modo desarrollo
npm run dev

# Modo producción
npm run build
npm start

# Con Docker
docker-compose up -d
```

## 📋 Uso para LLMs

### Conectar desde Claude/GPT

```typescript
import { NostrMCPProxy } from '@contextvm/sdk/proxy';

// Crear proxy MCP
const proxy = new NostrMCPProxy({
  privateKey: "llm-private-key-hex",
  relays: ["wss://relay.controller-ai.com"],
  serverPubkey: "bridge-public-key-hex"
});

await proxy.start();

// Listar herramientas disponibles
const tools = await proxy.request({
  method: "tools/list"
});

// Llamar herramienta
const result = await proxy.request({
  method: "tools/call",
  params: {
    name: "cbz_tesoreria_pagos_create",
    arguments: {
      importe: 1500.00,
      concepto: "Pago nómina",
      beneficiario: "Juan Pérez"
    }
  }
});
```

## 🏗️ Arquitectura

```
src/
├── core/
│   ├── bridge.ts              # Clase principal del bridge
│   ├── translator.ts          # MCP ↔ DVM translator
│   └── routing.ts             # Routing logic
├── mcp/
│   ├── mcp-listener.ts        # Escucha kind 25910
│   ├── mcp-publisher.ts       # Publica kind 25910
│   └── mcp-types.ts           # Tipos MCP
├── dvm/
│   ├── dvm-listener.ts        # Escucha kind 5051-6054
│   ├── dvm-publisher.ts       # Publica kind 5051-6054
│   └── dvm-types.ts           # Tipos DVM
├── mapping/
│   ├── capabilities.ts        # Mapeo de capabilities
│   ├── schemas.ts             # Schemas de validación
│   └── contexts.ts            # Contextos disponibles
├── config/
│   └── index.ts               # Configuración
└── index.ts                   # Entry point
```

## 🔧 Configuración Avanzada

### Mapeo de Contextos

Ver [docs/context-mapping.md](docs/context-mapping.md) para detalles sobre cómo mapear ContextVMs a MCP tools.

### Queries sin Eventos

Para consultas de solo lectura, el bridge puede consultar directamente la API/PostgreSQL sin generar eventos DVM:

```typescript
// En config/contexts.json
{
  "queries": {
    "enabled": true,
    "apiEndpoint": "https://api.cbz-tesoreria.controller-ai.com",
    "cacheEnabled": true,
    "cacheTTL": 300
  }
}
```

## 📊 Monitoring

### Health Check

```bash
curl http://localhost:4000/health

# Response:
{
  "status": "healthy",
  "uptime": 3600,
  "relay": "connected",
  "contexts": 4,
  "requests": {
    "total": 1234,
    "success": 1200,
    "errors": 34
  }
}
```

### Métricas

El bridge expone métricas en formato Prometheus:

```bash
curl http://localhost:4000/metrics
```

## 🧪 Testing

```bash
# Tests unitarios
npm test

# Tests con watch
npm run test:watch

# Tests de integración (requiere relay activo)
npm run test:integration
```

## 🐳 Docker

### Build

```bash
docker build -t contextvm-mcp-bridge:latest .
```

### Run

```bash
docker run -d \
  --name mcp-bridge \
  -p 4000:4000 \
  -e BRIDGE_PRIVATE_KEY=your-key \
  -e RELAY_URL=ws://relay:8080 \
  contextvm-mcp-bridge:latest
```

### Docker Compose

```bash
docker-compose up -d
```

## 📖 Documentación

- [Arquitectura completa](../ARQUITECTURA-MCP-BRIDGE.md)
- [Análisis de integración](../ANALISIS-INTEGRACION-CONTEXTVM-OFICIAL.md)
- [Context Mapping Guide](docs/context-mapping.md)
- [API Reference](docs/api-reference.md)

## 🤝 Contribuir

1. Fork el repositorio
2. Crear feature branch (`git checkout -b feature/amazing-feature`)
3. Commit cambios (`git commit -m 'Add amazing feature'`)
4. Push al branch (`git push origin feature/amazing-feature`)
5. Abrir Pull Request

## 📄 Licencia

MIT License - ver [LICENSE](LICENSE)

## 🔗 Links

- **ContextVM Docs**: https://contextvm.org
- **MCP Protocol**: https://modelcontextprotocol.io
- **Nostr Protocol**: https://nostr.com
- **GitHub**: https://github.com/your-org/contextvm-mcp-bridge

---

**Última actualización**: 23 de diciembre de 2025