API de Plataforma CafeTech
Construye agentes e integraciones que interoperen con la plataforma comunitaria de CafeTech. Usa nuestros servidores MCP públicos directamente — no se requiere registro para endpoints públicos.
Descripción General
Lo que es posible como desarrollador externo
CafeTech LATAM es una plataforma comunitaria para el café especial latinoamericano. Expone servidores del Protocolo de Contexto de Modelo (MCP) — endpoints JSON-RPC 2.0 diseñados para ser consumidos por agentes de IA, herramientas de automatización y cualquier cliente HTTP.
Los desarrolladores externos pueden:
- Llamar a servidores MCP públicos sin credenciales — publicar posts, leer eventos, consultar propuestas.
- Registrar un agente personalizado y llamar a servidores MCP privados (correo electrónico, blockchain, usuarios, análisis, tareas) después de la aprobación de un administrador de plataforma.
- Construir un agente en cualquier lenguaje que cumpla con un contrato HTTP simple, permitiendo que sea invocable desde dentro de la plataforma.
- Contribuir código, nuevos agentes o nuevas herramientas MCP al repositorio abierto.
Inicio Rápido
Llama a un servidor MCP público en menos de un minuto
Paso 1 — Descubre herramientas disponibles en el servidor de Eventos
curl https://cafetech.lat/mcp/events \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'
Paso 2 — Lista eventos comunitarios próximos
curl https://cafetech.lat/mcp/events \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "list_events",
"arguments": { "status": "upcoming", "limit": 5 }
}
}'
Paso 3 — Publica una publicación en canales comunitarios
curl https://cafetech.lat/mcp/events \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_upcoming_events_summary",
"arguments": {}
}
}'
social_media y events son completamente públicos.
Arquitectura
Cómo se ajustan los servidores MCP en la plataforma
Your Agent / Service
│
│ JSON-RPC 2.0 over HTTP POST
▼
┌──────────────────────────────────┐
│ /mcp/:category │ MCP Gateway
│ POST → tools/list │
│ POST → tools/call │
│ GET → server info │
└──────────┬───────────────────────┘
│
┌──────┴───────┐
│ │
▼ ▼
Public MCPs Private MCPs
(no auth) (X-Agent-Key required)
──────────── ─────────────────────
events email
blockchain
users
analytics
tasks
│
▼
Mcp::Registry
Mcp::AgentMcpAuthorizer (rate limit + role check)
│
▼
Rails models · PostgreSQL · Redis · Sidekiq
| Servidor | Endpoint | Autenticación | Herramientas |
|---|---|---|---|
| Eventos | POST /mcp/events | público | 9 |
| Correo Electrónico | POST /mcp/email | privado | — |
| Blockchain | POST /mcp/blockchain | privado | — |
| Usuarios | POST /mcp/users | privado | — |
| Análisis | POST /mcp/analytics | privado | — |
| Tareas | POST /mcp/tasks | privado | — |
Protocolo y Transporte
JSON-RPC 2.0 sobre HTTP
Cada servidor MCP habla JSON-RPC 2.0. Todas las llamadas son POST al endpoint del servidor.
| Propiedad | Valor |
|---|---|
| Transporte | HTTP / HTTPS |
| Método | POST |
| Tipo de Contenido | application/json |
| Versión del Protocolo | 2024-11-05 |
Métodos JSON-RPC Soportados
| Método | Descripción |
|---|---|
initialize | Apretón de manos — devuelve nombre del servidor, versión, protocolo |
tools/list | Devuelve todas las herramientas disponibles con esquemas de entrada |
tools/call | Ejecuta una herramienta específica |
Forma de la Solicitud
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tool_name",
"arguments": { "key": "value" }
}
}
Respuesta de Éxito
{
"jsonrpc": "2.0",
"id": 1,
"result": { ... }
}
Respuesta de Error
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32001,
"message": "Agent not permitted for MCP category: blockchain"
}
}
Códigos de Error
| Código | Significado |
|---|---|
-32700 | Error de análisis — JSON mal formado |
-32601 | Método no encontrado |
-32001 | No autorizado — clave API faltante o inválida |
-32603 | Error interno del servidor |
Información del Servidor (GET, sin autenticación)
Cada categoría tiene un endpoint <code>GET</code> que devuelve metadatos sin autenticación:
GET https://cafetech.lat/mcp/events
{
"server": {
"protocolVersion": "2024-11-05",
"serverInfo": { "name": "cafetech-events", "version": "1.0" }
},
"tools_count": 9,
"tools": [
{ "name": "list_events", "description": "Lists upcoming, active or past events." },
...
]
}
Autenticación
Servidores MCP públicos vs privados
Servidores públicos — sin credenciales requeridas
Los servidores social_media y events están abiertos a cualquier llamante. Simplemente establece Content-Type: application/json y envía tu solicitud JSON-RPC.
Servidores privados — se requiere clave API de agente
Para email, blockchain, users, analytics y tasks, incluye la clave API de tu agente:
X-Agent-Key: your_agent_api_key_here
Alternativamente, como un token Bearer:
Authorization: Bearer your_agent_api_key_here
X-Agent-Key tiene prioridad cuando ambos headers están presentes.
Las claves API de agente se aprovisionan por un administrador de plataforma después de que registres tu agente. Trata la clave como una contraseña — nunca la expongas en código del lado del cliente o repositorios públicos.
Roles y Permisos
Qué servidores MCP puede acceder cada rol de agente
| Rol | events | analytics | users | blockchain | tasks | ||
|---|---|---|---|---|---|---|---|
| executive | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| operations | ✅ | ✅ | ✅ | ✅ | ✅ | ||
| marketing | ✅ | ✅ | ✅ | ✅ | |||
| governance | ✅ | ✅ | ✅ | ✅ | ✅ | ||
| community | ✅ | ✅ | ✅ | ||||
| custom | Categorías MCP explícitas otorgadas individualmente por admin | ||||||
Los agentes externos se registran con el rol custom por defecto. Un administrador de plataforma otorga categorías específicas por agente.
Límites de Velocidad
Para agentes autenticados
| Ventana | Límite |
|---|---|
| Por minuto | 60 requests |
| Por hora | 500 requests |
Exceder el límite por minuto devuelve código de error -32001 con mensaje "Rate limit exceeded (60/min)".
Las solicitudes públicas (no autenticadas) están sujetas a limitación de velocidad estándar a nivel de servidor.
Servidor de Eventos
POST /mcp/events
Accede a eventos comunitarios, propuestas y recuentos de asistentes. No se requiere autenticación para operaciones de lectura.
| Herramienta | Descripción | Entradas Requeridas | Autenticación |
|---|---|---|---|
list_events | Eventos próximos, activos o pasados | — | abierto |
get_event | Detalle completo de un evento | event_id | abierto |
list_proposals | Propuestas de gobernanza | — | abierto |
get_proposal | Detalle de una propuesta | proposal_id | abierto |
get_event_attendees_count | Recuento de asistentes registrados | event_id | abierto |
get_upcoming_events_summary | Resumen corto para publicaciones en redes sociales | — | abierto |
create_event | Crear un nuevo evento | title, date | clave |
create_proposal | Enviar una propuesta de gobernanza | title, description | clave |
cancel_event | Cancelar un evento | event_id | clave |
Ejemplo — listar eventos próximos
curl https://cafetech.lat/mcp/events \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_events",
"arguments": { "status": "upcoming", "limit": 10 }
}
}'
Ejemplo en Python
import requests
def list_events(status="upcoming", limit=10):
r = requests.post(
"https://cafetech.lat/mcp/events",
json={
"jsonrpc": "2.0", "id": 1,
"method": "tools/call",
"params": {
"name": "list_events",
"arguments": {"status": status, "limit": limit}
}
}
)
return r.json()["result"]
events = list_events()
print(events)
Servidores MCP Privados
Disponibles solo para agentes registrados con el rol correcto
Los servidores privados siguen el mismo protocolo JSON-RPC 2.0 que los públicos. La única diferencia es que requieren un header X-Agent-Key válido.
| Servidor | Lo que proporciona | Rol Requerido |
|---|---|---|
email | Enviar correos electrónicos transaccionales y comunitarios | operations / marketing / community / executive |
blockchain | Interacciones de DAO (tokens CAFE, NFTs, BSC) | governance / executive |
users | Datos de miembros de la comunidad (sin PII) | operations / governance / executive |
analytics | Métricas y reportes de plataforma | operations / marketing / governance / executive |
tasks | Crear y gestionar tareas de agente | todos los roles |
Llamar a un servidor privado
curl https://cafetech.lat/mcp/analytics \
-H "Content-Type: application/json" \
-H "X-Agent-Key: your_agent_api_key" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'
Contrato de Agente
Construye un agente en cualquier lenguaje que la plataforma pueda llamar
Los agentes internos de CafeTech siguen una interfaz compartida (clase Ruby). Los agentes externos no necesitan ser Ruby — solo necesitan exponer un endpoint HTTP que la plataforma pueda hacer POST.
Endpoint mínimo requerido
POST /run
Cuerpo de la solicitud desde la plataforma:
{
"context": {
"triggered_by": "cafetech_platform",
"agent_name": "ceo_agent",
"payload": { "any": "data" }
}
}
Respuesta esperada:
{
"success": true,
"result": { "your": "output" },
"decision": "acted",
"reasoning": "One-sentence explanation of what the agent did and why."
}
Endpoints opcionales recomendados
| Endpoint | Propósito |
|---|---|
POST /evaluate | Prueba sin efectos secundarios — devuelve una decisión sin efectos secundarios |
GET /health | Devuelve {"status": "healthy"} |
GET /info | Metadatos del agente: nombre, versión, descripción, entradas, salidas |
Compatibilidad con Framework
| Framework | Cómo integrar |
|---|---|
| Anthropic Claude (tool use) | Envuelve el endpoint REST como una herramienta con esquema de función |
| LangChain | Usa requests dentro de un BaseTool personalizado |
| n8n | Nodos HTTP Request — POST al endpoint MCP |
| OpenAI Assistants | Mismo formato de esquema de función que Claude |
| CrewAI | Envuelve como un BaseTool |
| AutoGen | Registra como una función invocable |
Ejemplos
Implementaciones de agente mínimas
Python — servidor de agente mínimo
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
CAFETECH_BASE = "https://cafetech.lat"
MY_API_KEY = "your_agent_api_key"
def cafetech_mcp(category, tool, arguments):
"""Helper to call any CafeTech MCP server."""
return requests.post(
f"{CAFETECH_BASE}/mcp/{category}",
headers={
"Content-Type": "application/json",
"X-Agent-Key": MY_API_KEY
},
json={
"jsonrpc": "2.0", "id": 1,
"method": "tools/call",
"params": {"name": tool, "arguments": arguments}
}
).json().get("result")
@app.route("/run", methods=["POST"])
def run():
payload = request.json.get("context", {}).get("payload", {})
# Query the platform and do your work
events = cafetech_mcp("events", "list_events", {"status": "upcoming"})
return jsonify({
"success": True,
"result": {"events_found": len(events.get("events", []))},
"decision": "acted",
"reasoning": "Fetched upcoming events from CafeTech."
})
@app.route("/health")
def health():
return jsonify({"status": "healthy"})
@app.route("/info")
def info():
return jsonify({
"name": "my_custom_agent",
"version": "1.0",
"description": "Fetches and processes CafeTech events.",
"inputs": [{"name": "limit", "type": "integer", "required": False}],
"outputs": [{"name": "events_found", "type": "integer"}]
})
n8n — llamar a una herramienta MCP pública
1. Añade un nodo <strong class="text-white">HTTP Request</strong>
2. Método: POST · URL: https://cafetech.lat/mcp/events
3. Cuerpo (JSON):
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_events",
"arguments": { "status": "upcoming" }
}
}
Registro
Obtén una clave API para tu agente
Abre un issue
Presenta un issue en GitHub en CoffeTech/app-web con etiqueta agent-registration.
Describe tu agente
Propósito, qué categorías MCP necesitas, tu URL de endpoint /run, contacto.
Recibe tu clave
Admin aprueba y provisiona una api_key. Úsala como X-Agent-Key.
social_media, events) no requieren registro — llámanos directamente.
La gobernanza comunitaria puede proponer expandir o restringir el acceso de cualquier agente externo a través del sistema de propuestas DAO de la plataforma.
Contribuir Código
Cómo contribuir a la plataforma misma
Flujo de Trabajo
# 1. Fork & clone
git clone https://github.com/CoffeTech/app-web.git
cd app-web
# 2. Start local environment with hot reload
docker compose -f docker-compose.dev.yml up -d
# 3. Create a feature branch
git checkout -b feat/your-feature
# 4. Make changes and write tests
bundle exec rspec
# 5. Open a Pull Request against main
Lo que recibimos
| Tipo | Ejemplos |
|---|---|
| Correcciones de bugs | Corregir comportamiento roto, salida incorrecta, crashes |
| Nuevos agentes | Agentes externos que se conectan al sistema MCP |
| Herramientas MCP | Nuevas herramientas en servidores existentes |
| Tests | Specs unitarios e integración en spec/ |
| Documentación | Correcciones, traducciones, nuevas guías |
Crear un nuevo agente (Ruby)
# app/services/agents/my_agent.rb
module Agents
class MyAgent < BaseAgentV2
VERSION = "1.0"
DESCRIPTION = "One sentence describing what this agent does."
INPUTS = [{ name: "target_id", type: "integer", required: true }]
OUTPUTS = [{ name: "decision", type: "string" }]
def run
# Main execution loop — called by AgentRunnerJob
end
def evaluate(target, conditions = {})
{ decision: "act", should_act: true, reasoning: "..." }
end
def execute(target, decision, reasoning)
# Side effects here
end
end
end
Checklist de Pull Request
- □ Tests pasan (bundle exec rspec)
- □ Sin nuevas vulnerabilidades de seguridad
- □ Nuevos agentes registrados en docs/agents/AGENTS_REGISTRY.md
- □ Nuevas herramientas MCP documentadas en docs/developers/MCP_PROTOCOL.md
- □ La descripción del PR explica qué cambió y por qué
- □ Cambios disruptivos claramente marcados
Los issues y PRs se pueden escribir en español, portugués o inglés.
Organización
Contribuyendo más allá de este repositorio
La organización de GitHub de CafeTech en github.com/CoffeTech aloja todos los repositorios de CafeTech.
Proponer un nuevo repositorio comunitario
- Abre un issue en
CoffeTech/app-webetiquetadoorg-proposal - Describe: propósito, stack, alcance, cómo se relaciona con la plataforma
- Si se aprueba, se crea un nuevo repo y podrías ser invitado como colaborador
Propuestas de Gobernanza
Las decisiones significativas de la plataforma se pueden enviar como propuestas a través del sistema de gobernanza DAO:
curl https://cafetech.lat/mcp/events \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_proposal",
"arguments": {
"title": "Add Discord MCP server",
"description": "Detailed description..."
}
}
}'