Todas las contribuciones
Ingenieríamcptemplateschatbots

MCP templates: el estándar que faltaba para chatbots empresariales

Diez servidores MCP listos para producción: CRM, WhatsApp Business, facturación CFDI, calendario, Postgres con RLS y RAG con Qdrant. Repo abierto numoru/mcp-templates-es con tests, OAuth, Docker y despliegue en Cloudflare Workers.

Numoru EngineeringPublicado el 10 de mayo de 202620 min de lectura
Compartir
Propuesta de implementacióngithub.com/numoru-ia/mcp-templates-es

TL;DR

Model Context Protocol (MCP) se convirtió en el estándar de facto para conectar LLMs con herramientas y datos empresariales. Pero la mayoría de ejemplos públicos son juguetes: un hello world en Python sin autenticación, sin row-level security y sin pruebas. En este artículo publicamos numoru-ia/mcp-templates-es, diez servidores MCP listos para producción: CRM (HubSpot/Pipedrive), WhatsApp Business Cloud, facturación CFDI 4.0 para México, Google Calendar, Postgres con RLS multi-tenant, RAG con Qdrant, tickets (Zendesk/Freshdesk), inventario, pagos (Stripe/Mercado Pago) y documentos (Google Drive). Todos en Go y TypeScript, con OAuth 2.1, tests e2e, Docker y despliegue opcional a Cloudflare Workers.

10
Servidores MCP productivos
Go + TypeScript
80%
Cobertura de use cases chatbot B2B
Enterprise MX + LATAM
6 sem
Timeline típico bot-a-prod
Templates vs desde cero
$18-40k
Ticket de implementación
Por chatbot con 3-5 tools

¿Por qué hacen falta "templates" MCP?

La especificación MCP resuelve el transporte (stdio, HTTP con SSE, streamable HTTP) y el shape de las respuestas (resource, tool, prompt). Pero deja al implementador tres decisiones críticas sin guía estandarizada:

  1. Autenticación y autorización. ¿Cómo valida el servidor que el usuario X puede leer los contactos de su empresa pero no los de otra?
  2. Idempotencia y escritura segura. ¿Qué pasa cuando el LLM llama dos veces a create_invoice por un timeout? ¿Cómo evitas duplicados?
  3. Contratos tipados con errores predecibles. El LLM necesita respuestas consistentes; si tu tool a veces devuelve null y a veces {"error": "..."}, el agente se rompe.

Los templates de este repo resuelven los tres puntos de forma uniforme. Cada servidor sigue la misma estructura:

mcp-<nombre>/
├── cmd/server/main.go          # entrypoint (o src/index.ts para TS)
├── internal/
│   ├── auth/                   # OAuth 2.1 + tenant resolution
│   ├── tools/                  # herramientas expuestas
│   ├── resources/              # recursos expuestos
│   ├── prompts/                # prompts parametrizables
│   └── storage/                # persistencia
├── migrations/                 # si usa DB propia
├── tests/e2e/                  # cliente MCP real + assertions
├── Dockerfile
├── wrangler.toml               # opcional: Cloudflare Workers
└── README.md

El patrón estándar resource/tool/prompt

Todo template expone los tres tipos de MCP con reglas estrictas:

Resources

Datos leíbles, identificados por URI. Siempre devuelven JSON válido y versionado.

// Ejemplo: resource de contactos CRM
// URI: crm://contacts/{contact_id}
type ContactResource struct {
    ID        string    `json:"id"`
    TenantID  string    `json:"tenant_id"`
    Email     string    `json:"email"`
    CreatedAt time.Time `json:"created_at"`
    // ...
}

Tools

Acciones con efecto lateral. Cada tool tiene un operation_id único que sirve de clave de idempotencia.

// create_invoice(customer_id, items, operation_id) → invoice_id
// Si ya existe una factura con ese operation_id, la devuelve; no crea duplicado.

Prompts

Plantillas reutilizables que el cliente LLM puede invocar por nombre.

"create_follow_up_email(contact_id, tone='friendly')"
→ devuelve mensajes formateados listos para Claude/GPT

Los 10 templates publicados

1. mcp-crm

Conecta HubSpot o Pipedrive. Resources: contacts, deals, companies. Tools: create_contact, update_deal_stage, log_activity. Autenticación OAuth 2.1 con refresh token en Postgres cifrado. Soporta multi-tenant: cada token está asociado a un workspace_id, y cualquier tool filtra por él antes de llamar a la API upstream.

func (s *Server) createContact(ctx context.Context, args CreateContactArgs) (*Contact, error) {
    tenantID, err := auth.TenantFromContext(ctx)
    if err != nil {
        return nil, mcp.ErrUnauthorized
    }
    return s.hubspot.CreateContact(ctx, tenantID, args)
}

2. mcp-whatsapp

Wrapper de WhatsApp Business Cloud API. Resources: conversations, messages. Tools: send_text, send_template, send_media, mark_as_read. Incluye guardrail obligatorio: no permite enviar mensajes fuera de la ventana de 24h sin plantilla aprobada (evita que el LLM caiga en violación de política de Meta).

3. mcp-cfdi

Facturación electrónica México 4.0. Tools: create_invoice, cancel_invoice, get_xml, get_pdf. Integra con PAC (Facturama, Finkok, SW Sapien) vía driver intercambiable. Valida RFC, régimen fiscal y uso CFDI antes de timbrar. Guarda el XML timbrado en Spaces y devuelve URL firmada.

4. mcp-calendar

Google Calendar + Microsoft Graph. Resources: events, availability. Tools: create_event, find_slot, cancel. Incluye algoritmo find_slot que respeta zona horaria del usuario, horario laboral configurable y eventos existentes — el agente no tiene que implementar lógica de disponibilidad.

5. mcp-postgres-rls

El más crítico para SaaS multi-tenant. Expone Postgres como MCP con row-level security real activado a nivel de base de datos. El servidor establece SET app.current_tenant = $1 en cada conexión del pool, y las policies de RLS garantizan que una query inyectada por el LLM no pueda leer filas de otro tenant.

CREATE POLICY tenant_isolation ON contacts
  USING (tenant_id::text = current_setting('app.current_tenant'));

Tools: query (SELECT validado por parser), execute (solo INSERT/UPDATE/DELETE con whitelist de tablas), describe_schema.

6. mcp-qdrant-rag

Retrieval Augmented Generation como servicio MCP. Resources: collections, documents. Tools: search_semantic, search_hybrid (dense + BM25), add_document, reindex. Soporta reranking con BGE-reranker v2-m3 local y Contextual Retrieval de Anthropic. Trazas opcionales a Langfuse.

7. mcp-tickets

Zendesk y Freshdesk. Resources: tickets, agents. Tools: create_ticket, assign, reply, close, merge. Incluye ranking de prioridad automático usando un small model local vía LiteLLM.

8. mcp-inventory

Genérico para catálogos: productos, stock, ubicaciones. Tools: search_product, check_stock, reserve, release. Driver por adaptador: Shopify, WooCommerce, Odoo, o base de datos propia.

9. mcp-payments

Stripe + Mercado Pago. Tools: create_payment_link, refund, get_transaction, list_disputes. No expone create_charge directo con datos de tarjeta — fuerza al LLM a usar hosted pages o tokens, mitigando riesgo PCI.

10. mcp-drive

Google Drive + Box. Resources: files, folders. Tools: search, download, upload, share. Incluye ingesta automática con Unstructured.io + chunking con Chonkie para que el contenido quede indexable por mcp-qdrant-rag.

OAuth 2.1 estandarizado

Todos los templates comparten el mismo flujo OAuth. El cliente MCP envía un token opaco; el servidor lo valida contra Postgres y resuelve el tenant. El token se refresca con 5 minutos de margen antes de expirar.

type Principal struct {
    UserID   string
    TenantID string
    Scopes   []string
}

func (s *Server) middleware(next mcp.Handler) mcp.Handler {
    return mcp.HandlerFunc(func(ctx context.Context, req mcp.Request) (mcp.Response, error) {
        token := mcp.AuthTokenFromContext(ctx)
        principal, err := s.auth.Validate(ctx, token)
        if err != nil {
            return nil, mcp.Unauthorized("token inválido")
        }
        ctx = auth.WithPrincipal(ctx, principal)
        return next.Handle(ctx, req)
    })
}

Idempotencia: la clave que todos olvidan

Cualquier tool con efecto lateral acepta un parámetro operation_id. El servidor guarda en Postgres una tabla operations(operation_id, tenant_id, tool, result_json, created_at) con índice único compuesto. Si la misma operación se recibe dos veces, se devuelve el resultado cacheado sin volver a llamar al upstream.

Esto resuelve tres bugs clásicos de agentes LLM:

  • Retries del cliente tras timeout → duplicado de factura
  • Agente que decide "mejor intentar de nuevo" → duplicado de email
  • Flujo multi-step interrumpido a mitad → operación parcial repetida

Despliegue: tres opciones

Opción A — Docker Compose local

docker compose up -d levanta cualquier template con su Postgres, Redis y servidor HTTP. Ideal para desarrollo y para clientes que exigen self-host.

Opción B — Cloudflare Workers (serverless MCP)

Cada template TS incluye wrangler.toml. Deploy en un comando:

npx wrangler deploy

Cloudflare Workers soporta MCP sobre streamable-http nativamente desde finales de 2025. El servidor aguanta ráfagas sin pagar por tiempo de idle — perfecto para clientes PyME que reciben 200 requests al día.

Opción C — Digital Ocean droplet compartido

Usando el stack del artículo Stack de IA self-hosted en un droplet de DO, los 10 servidores MCP se montan tras Nginx como sub-paths (/mcp/crm, /mcp/whatsapp, ...). Una sola instancia Postgres compartida con schemas separados.

Testing e2e estandarizado

Cada template incluye una suite que levanta el servidor en un container efímero y corre un cliente MCP real contra él. No mocks — las aserciones validan flujo completo de OAuth, idempotencia y errores tipados.

func TestCreateInvoiceIdempotent(t *testing.T) {
    srv := testutil.StartServer(t)
    client := mcp.Dial(srv.URL, testToken)

    args := CreateInvoiceArgs{OperationID: "op-123", /* ... */}
    r1, _ := client.CallTool(ctx, "create_invoice", args)
    r2, _ := client.CallTool(ctx, "create_invoice", args)

    assert.Equal(t, r1.InvoiceID, r2.InvoiceID, "mismo operation_id debe devolver misma factura")
}

Integración con Claude Agent SDK

Ejemplo minimalista: un agente que usa tres de nuestros servidores MCP para agendar una demo comercial desde una conversación de WhatsApp.

from anthropic import Anthropic
from mcp import stdio_client

client = Anthropic()
servers = [
    stdio_client("./mcp-whatsapp"),
    stdio_client("./mcp-crm"),
    stdio_client("./mcp-calendar"),
]

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    tools=await aggregate_tools(servers),
    messages=[{
        "role": "user",
        "content": "Un lead nuevo escribió por WhatsApp pidiendo demo. Crea contacto en CRM y agenda slot el próximo martes 3pm."
    }],
)

El agente orquesta los tres MCPs sin necesidad de glue code ad-hoc.

Compatibilidad con otros clientes MCP

Probados y funcionales con:

  • Claude Desktop
  • Claude Code CLI
  • Cursor
  • Continue.dev
  • Windsurf
  • OpenAI Agents SDK (vía shim)
  • VS Code extension MCP

Impacto de negocio y casos

Business & commercial impact

Por qué los templates comprimen los ciclos de venta

Un chatbot enterprise integrado con CRM + WhatsApp + calendario solía ser un build de 3 meses. Con templates, el delivery se reduce a 4-6 semanas porque 80% del código de integración ya está escrito, probado y desplegado. Eso cambia la conversación de venta: en lugar de "dame 90 días", cotizas "agente vivo en 6 semanas, precio fijo". Los compradores cierran más rápido a margen más alto.

Timeline build-a-producción: desde cero vs con templates (semanas)

Tiempo observado para un chatbot B2B con MCP de 5 tools: CRM + WhatsApp + calendario + pagos + CFDI. De kickoff a producción.

ScopingIntegracionesAuth + RLSTesting + hardeningDeploy + handover0 sem3 sem6 sem9 sem12 sem
  • Desde cero
  • Con templates Numoru

Telemetría interna Numoru de engagements, 2024-2026.

Industrias y rangos de ticket

Build de chatbot sobre templates — ticket por vertical (USD)

SaaS B2B (CRM-heavy)
Calificación lead + agenda demo + follow-up WhatsApp.
$18,000 – 35,000
One-time + $900 / mes ops
Fintech (cobranza / onboarding)
KYC light + intent de pago + triage de disputas.
$30,000 – 65,000
One-time + $1,800 / mes ops
Retail / e-commerce
Seguimiento pedido + devoluciones + Stripe / Mercado Pago + CFDI.
$22,000 – 50,000
One-time + $1,200 / mes ops
Admin salud
Agenda + elegibilidad de seguros + recordatorios pacientes.
$28,000 – 55,000
One-time + $1,500 / mes ops
Gobierno / utility
Ticketing + solicitudes de documentos + payment rails.
$45,000 – 120,000
Ciclo RFP + SLA
Agencia white-label
Licencia reseller para 5-20 clientes finales.
$60,000 / año + rev-share
Anual

Benchmarks públicos que respaldan el pitch

Public case studyInfraestructura IA · Global · 2024-2025

Anthropic — lanzamiento Model Context Protocol

Challenge
Publicar un protocolo abierto para la integración LLM ↔ tool y reducir fragmentación.
Solution
Anthropic lanzó MCP en nov 2024; la adopción por Claude Desktop, Cursor, Continue, Windsurf y OpenAI Agents SDK se dio en 6 meses.
Results
Integraciones de cliente
15+
IDEs + apps desktop a Q1 2025
Servidores MCP públicos
800+
Registro comunidad
Adopción enterprise
Fuerte
Block, Sourcegraph, Replit
Public case studyMessaging · LATAM + EMEA · 2024

Meta — adopción WhatsApp Business Platform

Challenge
Dimensionar la oportunidad de mensajería automatizada B2B en LATAM.
Solution
Meta publica datos trimestrales de adopción Cloud API + volumen; LATAM lidera consistentemente los rails de conversational commerce.
Results
Cuentas de negocio LATAM
30M+
Mensuales activas
Mensajes automatizados
500M / día
Cloud API
Lift de conversión (estudios)
+35%
Vs email / SMS

Caso ilustrativo — agencia LATAM revendiendo templates

Illustrative caseAgencia de integración IA · 6 ingenieros · $850K ARR · LATAM

Agencia IA boutique (México / Buenos Aires) usando templates para 8 builds enterprise

Baseline
Cada build era proyecto de 90 días / $45,000 — ~40% del esfuerzo era glue-code de CRM + WhatsApp + calendario. Margen: 28%. Dos builds concurrentes máximo.
Intervention
Licenció templates Numoru como vendor (agencia paga $60k / año de licencia reseller + 8% rev-share). Re-precio builds a $28k fijo y delivery de 5 semanas. Absorbió 4× el throughput con misma plantilla.
Projected outcome (12 mo)
Duración del build
90 → 35 días
-61%
Margen attached
28% → 54%
Menor share de labour
Builds concurrentes
2 → 6
Mismos 6 ing.
ARR anual
$850K → $1.9M
Año 1 post-licencia
Costo licencia + rev-share
−$152,000
$60k + 8% × $1.15M fees
Lift de contribución neta
+$638,000
Año 1 vs baseline
Rangos de margen anclados al benchmark SCORE 2024 y a acuerdos reseller Numoru. Caso sintético — no representa a un cliente específico de Numoru.

Calculadora ROI — comprador enterprise del chatbot integrado

Retailer mid-market reemplazando atención Tier-1 (12 meses)

Payback: 1 months
Assumptions
Tickets mensuales de soporte14,000
Ticket resuelto por bot62%
Costo humano por ticket$4.80
Costo variable bot / ticket$0.22
Lift de conversión WhatsApp+8% en reply rate
Retainer ops post-launch$1,200 / mes
Implementación (one-time)$32,000
Alcance de integraciónCRM + WA + CFDI + calendario + tickets
Implementación (one-time)−$32,000
Retainer ops (12 mo × $1,200)−$14,400
Costo variable bot (104k × $0.22)−$22,880
Labour de soporte evitado (104k × $4.80)+$499,200
Lift de conversión WhatsApp+$180,000
Automatización CFDI (tiempo)+$42,000
Contribución neta año 1+$651,920

Tiers de pricing Numoru

Acceso a templates
$0Apache 2.0
Self-serve. Fork y arranca.
  • Los 10 servidores productivos
  • Implementaciones Go + TS
  • OAuth 2.1 + RLS + idempotencia
  • Tests + Docker + config Workers
  • Soporte comunidad (GitHub issues)
Build integrado
$18,000 – 55,000one-time
Entregamos el bot completo.
  • 3-6 tool integrations
  • Orquestación Claude Agent SDK
  • Canal WhatsApp / web / Slack
  • Observabilidad Langfuse
  • Delivery 4-8 semanas
  • Warranty 60 días + handover
Licencia reseller
$60,000/ año
White-label para agencias.
  • Proyectos ilimitados con clientes finales
  • Fork privado + logo
  • SLA priority de bug-fix
  • Updates trimestrales de templates
  • 8% rev-share en builds entregados
  • Opción co-marketing

Retainer de ops post-build: $900-2,400 / mes según alcance y SLA.

FAQ

¿Puedo usar estos templates comercialmente?Sí, licencia Apache 2.0. Fork, modifica, cobra.

¿Cuánto cuesta mantenerlos?El stack base (droplet + Postgres + Redis) son ~50 USD/mes. Los templates agregan negligible CPU/RAM porque casi todo el trabajo es I/O contra APIs upstream.

¿Qué pasa si el upstream (HubSpot, Stripe, etc.) cambia su API?Cada template tiene un directorio internal/driver/<vendor>/ aislado. El contrato MCP es estable; los cambios de vendor sólo tocan el driver.

¿Pueden convivir con MCPs oficiales de cada proveedor?Sí. Estos templates existen porque los oficiales son pocos, inmaduros o no cubren idempotencia + multi-tenancy. Cuando el oficial alcance, migrar es trivial.

¿Tests de seguridad?Pipeline CI corre Semgrep (reglas p/owasp-top-ten), Bearer (detección de PII) y Trivy (CVEs en imagen Docker) en cada PR.

Próximos pasos

El repo github.com/numoru-ia/mcp-templates-es está publicado con los 10 servidores, documentación ejecutable y una carpeta examples/ con agentes de referencia. El plan de 2026 es agregar 5 templates más: ERP (Odoo/NetSuite), e-commerce (Shopify/VTEX), RR.HH. (BambooHR), firma digital (Mifiel/DocuSign) e impuestos (SAT/AFIP).

Si tu PyME usa ChatGPT Enterprise, Claude for Work o cualquier agente comercial y quieres conectarlo a tu operación sin 6 meses de integración custom, estos templates son el punto de partida más corto que conocemos.

¿Quieres resultados así para tu empresa?

Iniciar conversación
Compartir