Skip to main content
Glama
liam-edmunds

enable-nz-mcp

by liam-edmunds

enable-nz-mcp

Un servidor MCP público y alojado que expone el contenido de enable.co.nz como herramientas buscables, conectable desde Copilot Studio, VS Code Copilot, Claude Desktop o cualquier cliente MCP.

Este es un proyecto de portafolio personal. No está afiliado con Enable New Zealand ni con ningún empleador, y solo lee contenido disponible públicamente de un sitio web público.

  • Servidor: https://enable-nz-mcp.duckdns.org/mcp (Streamable HTTP)

  • Comprobación de salud: https://enable-nz-mcp.duckdns.org/health


Arquitectura

GitHub Actions (weekly cron)
  └─ crawl enable.co.nz → build index.db.new
     └─ rsync over SSH → droplet:/opt/enable-nz-mcp/data/index.db.new
        └─ atomic mv → index.db

DigitalOcean droplet (Ubuntu 24.04, Sydney)
  ├─ Caddy  → TLS termination + reverse proxy on enable-nz-mcp.duckdns.org
  └─ pm2    → node dist/server.js  (port 8081, localhost only)
                └─ opens a fresh SQLite read connection per query

El servidor nunca almacena en caché el índice en memoria — cada llamada a una herramienta abre una conexión nueva de solo lectura contra index.db en disco. Un rastreo semanal reconstruye el índice y lo intercambia con un único mv atómico, de modo que el índice se actualiza sin tiempo de inactividad y sin reinicio.

Solo lectura en todas las direcciones: el rastreador solo lee enable.co.nz, y las herramientas MCP solo leen el índice SQLite local. No se realiza ningún tipo de operación de escritura.


Related MCP server: Net-Syphon

Herramientas

search_enable_nz

Búsqueda de texto completo en enable.co.nz.

Parámetro

Tipo

Obligatorio

Notas

query

string

sí

Términos de búsqueda

limit

integer

no

Por defecto 5, máximo 20

section

string

no

Restringir a una sección, p. ej. services

Devuelve las páginas coincidentes ordenadas por relevancia, cada una con url, title, section y un fragmento resaltado.

get_page

Recupera el texto completo de una página por URL.

Parámetro

Tipo

Obligatorio

url

string

sí

Devuelve url, title, section, description, content y crawled_at. El contenido de más de ~15.000 caracteres se trunca, con truncated: true en la respuesta.

list_sections

Sin entrada. Enumera las secciones de nivel superior del sitio con recuentos de páginas, y la marca de tiempo crawled_at del índice — útil para orientarse antes de una búsqueda, o para comprobar la actualidad de los datos.


Ejemplos de consultas

Una vez conectado, pide a tu cliente MCP cosas como:

  • "Busca en enable.co.nz información sobre financiación de sillas de ruedas."

  • "¿Qué secciones cubre el índice de enable.co.nz?"

  • "Obtén el contenido completo de https://www.enable.co.nz/services y resúmelo."


Conexión de un cliente MCP

Copilot Studio

  1. Abre tu agente → Herramientas → Añadir una herramienta → Nueva herramienta → Model Context Protocol.

  2. Nombre del servidor: enable-nz-mcp (o lo que quieras — es solo una etiqueta).

  3. URL del servidor: https://enable-nz-mcp.duckdns.org/mcp

  4. Autenticación: Sin autenticación (déjalo como está a menos que el servidor tenga API_KEY configurada, en cuyo caso elige una opción de autenticación por clave API/bearer y proporciónala).

  5. Crea → Copilot Studio se conecta mediante Streamable HTTP (el único transporte que soporta desde que eliminó SSE en agosto de 2025) y enumera search_enable_nz, get_page y list_sections. Añade la herramienta a tu agente y pruébala con un prompt como "busca en enable.co.nz financiación para sillas de ruedas".

VS Code Copilot

  1. Abre la Paleta de comandos → MCP: Añadir servidor.

  2. Elige HTTP e introduce https://enable-nz-mcp.duckdns.org/mcp.

  3. VS Code enumerará search_enable_nz, get_page y list_sections como herramientas disponibles una vez conectado.

Claude Desktop

  1. Ajustes → Conectores → Añadir conector personalizado.

  2. URL: https://enable-nz-mcp.duckdns.org/mcp.

  3. Claude negociará el transporte Streamable HTTP automáticamente.

Cualquier otro cliente MCP

Apunta a https://enable-nz-mcp.duckdns.org/mcp usando el transporte Streamable HTTP. Si API_KEY está configurada en el servidor, envía Authorization: Bearer <clave>.


Desarrollo local

npm ci
cp .env.example .env        # edit as needed

npm run crawl                # builds data/index.db.new
mv data/index.db.new data/index.db

npm run dev                  # starts the server with tsx, reading .env

Prueba el servidor en ejecución con MCP Inspector:

npx @modelcontextprotocol/inspector
# connect to http://127.0.0.1:8081/mcp

O haz una prueba rápida manualmente:

curl http://127.0.0.1:8081/health

curl -X POST http://127.0.0.1:8081/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Ejecuta la suite de pruebas:

npm test

Despliegue

El servidor se ejecuta en un droplet existente de DigitalOcean bajo su propio usuario de sistema sin privilegios (mcpsvc), aislado de otros servicios en la misma máquina — mcpsvc no tiene sudo ni acceso de lectura fuera de /opt/enable-nz-mcp. Consulta deploy/ecosystem.config.cjs para la configuración del proceso pm2 y deploy/Caddyfile.example para el bloque de proxy inverso.

Tanto los cambios de configuración de pm2 como los de Caddy requieren root, por lo que mcpsvc no puede ir más allá de pm2 save por su cuenta — un administrador debe ejecutar pm2 startup (para persistir el proceso entre reinicios) e instalar/recargar el bloque del sitio en Caddy. La limitación de tasa no se aplica actualmente en la capa de Caddy: requiere el plugin de terceros caddy-ratelimit, que no está en la compilación de Caddy de esta máquina.

El flujo de trabajo .github/workflows/refresh-index.yml re-rastrea el sitio semanalmente (domingo 02:00 UTC, o manualmente mediante workflow_dispatch), establece un umbral mínimo de recuento/tamaño de páginas, y despliega el nuevo índice mediante rsync + un mv atómico por SSH. Necesita tres secretos de repositorio: DEPLOY_SSH_KEY, DEPLOY_HOST, DEPLOY_USER — usando un par de claves de despliegue dedicado restringido mediante una directiva command= en authorized_keys para que solo pueda ejecutar el rsync/mv, no un shell arbitrario.


Fuera del alcance de v1

  • Embeddings / búsqueda semántica (la búsqueda por palabras clave mediante SQLite FTS5 es suficiente para un sitio de marketing)

  • Renderizado con navegador headless

  • Soporte multi-sitio

  • Operaciones de escritura de cualquier tipo

  • Autenticación a nivel de usuario o aislamiento por inquilino

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables querying and searching Ben Milne's personal site content, including essays, API endpoints, and PDF books, via MCP tools.
    -
  • F
    license
    A
    quality
    B
    maintenance
    Enables web search and anonymous public-page retrieval through MCP, with provider-neutral selection, bounded plain-text results, and built-in auditing.
    2
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables keyless local web search and page fetching through MCP, with domain-filtered queries, extractable original-text evidence, hashes, and snapshot cursors for verifiable, traceable results.
    26 npm
    MIT