Goatcounter
Interactúa con la API de análisis web de Goatcounter.
Documentación
Servidor MCP de Goatcounter
Resumen
Este proyecto proporciona un servidor de Protocolo de Contexto de Modelo (MCP) para interactuar con la API de análisis web de Goatcounter. Permite que los modelos de lenguaje u otros clientes MCP consulten fácilmente las estadísticas e información de Goatcounter mediante una interfaz de herramientas estandarizada.
El servidor está construido con Python y la librería FastMCP. Lee el código de sitio y la clave API de Goatcounter desde variables de entorno para la autenticación.
Características
- Proporciona herramientas para la mayoría de los endpoints de la API de Goatcounter.
- Gestiona la configuración de la clave API y el código de sitio mediante variables de entorno (
GOATCOUNTER_API_KEY,GOATCOUNTER_CODE). - Inicialización diferida del cliente API: las herramientas pueden listarse incluso si las credenciales API aún no están configuradas.
- Manejo de límites de velocidad: implementa reintentos automáticos con retroceso al encontrar límites de velocidad de la API (HTTP 429).
- Prioriza el encabezado
X-Rate-Limit-Resetpara la espera si la API lo proporciona. - Recurre a un retroceso exponencial (comenzando en 1 segundo) con fluctuación aleatoria si el encabezado no está disponible o es inválido.
- Reintenta hasta 5 veces antes de fallar.
- Prioriza el encabezado
- Se ejecuta directamente usando la herramienta de línea de comandos
fastmcp.
Instalación
Opción 1: Instalación mediante Smithery (Recomendado)
Para instalar automáticamente el servidor MCP de X (Twitter) para Claude Desktop mediante Smithery:
npx -y @smithery/cli install @rafaljanicki/goatcounter-mcp-server --client claude
Opción 2: Instalar desde PyPI
La forma más sencilla de instalar goatcounter-mcp-server es mediante PyPI:
pip install goatcounter-mcp-server
O instalar directamente desde el repositorio:
pip install git+https://github.com/rafaljanicki/goatcounter-mcp-server.git
Opción 3: Instalar desde el código fuente
Si prefieres instalar desde el repositorio fuente:
-
Clonar el repositorio:
git clone https://github.com/rafaljanicki/goatcounter-mcp-server cd goatcounter-mcp-server -
Crear un entorno virtual:
python3.13 -m venv venv source venv/bin/activate # On Windows use `venv\Scripts\activate` -
Instalar dependencias: Instala FastMCP y otros paquetes requeridos:
pip install -r requirements.txt -
Configurar variables de entorno: Copia el archivo de ejemplo
.env.examplea.env:cp .env.example .envEdita el archivo
.envy añade los detalles de tu Goatcounter (consulta la sección de Variables de Entorno a continuación).
Variables de Entorno
El servidor requiere que se establezcan las siguientes variables de entorno:
GOATCOUNTER_CODE: El código de sitio de tu Goatcounter (la parte del subdominio, por ejemplo, 'mycoolsite').GOATCOUNTER_API_KEY: Tu token API de Goatcounter. Puedes generar uno en tu sitio de Goatcounter en Configuración -> Tokens API. Asegúrate de que tenga los permisos necesarios para las acciones de API que pretendes usar.
Puedes establecer estas variables directamente en tu entorno o colocarlas en un archivo .env en la raíz del proyecto.
Ejecutar el Servidor
Opción 1: Usar el script CLI
El proyecto define un script CLI goatcounter-mcp-server.
Si se instala desde PyPI:
goatcounter-mcp-server
Si se instala desde el código fuente con uv:
uv run goatcounter-mcp-server
Opción 2: Usar FastMCP directamente (solo desde el código fuente)
Si instalaste desde el código fuente y prefieres ejecutar el servidor usando el modo de desarrollo de FastMCP:
fastmcp dev src/goatcounter_mcp_server/server.py
Uso con Claude Desktop
Para usar este servidor MCP con Claude Desktop, necesitas configurar Claude para conectarse al servidor. Sigue estos pasos:
Paso 1: Instalar Node.js
Claude Desktop usa Node.js para ejecutar servidores MCP. Si no tienes Node.js instalado:
- Descarga e instala Node.js desde nodejs.org.
- Verifica la instalación:
node --version
Paso 2: Localizar la configuración de Claude Desktop
Claude Desktop usa un archivo claude_desktop_config.json para configurar los servidores MCP.
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Si el archivo no existe, créalo.
Paso 3: Configurar el servidor MCP
Edita claude_desktop_config.json para incluir el servidor goatcounter-mcp-server. Reemplaza /path/to/goatcounter-mcp-server con la ruta real a tu directorio del proyecto (si se instaló desde el código fuente) o la ruta a tu ejecutable de Python (si se instaló desde PyPI).
Si se instala desde PyPI:
{
"mcpServers": {
"goatcounter-mcp-server": {
"command": "goatcounter-mcp-server",
"args": [],
"env": {
"PYTHONUNBUFFERED": "1",
"GOATCOUNTER_CODE": "goatcounter_code",
"GOATCOUNTER_API_KEY": "goatcounter_api_key"
}
}
}
}
Si se instala desde el código fuente con uv:
{
"mcpServers": {
"goatcounter-mcp-server": {
"command": "uv",
"args": [
"--directory",
"/path/to/goatcounter-mcp-server",
"run",
"goatcounter-mcp-server"
],
"env": {
"PYTHONUNBUFFERED": "1",
"GOATCOUNTER_CODE": "goatcounter_code",
"GOATCOUNTER_API_KEY": "goatcounter_api_key"
}
}
}
}
"command": "goatcounter-mcp-server": Usa el script CLI directamente si se instaló desde PyPI."env": Si se instaló desde PyPI, es posible que necesites proporcionar variables de entorno directamente en la configuración (ya que no hay un archivo.env). Si se instaló desde el código fuente, se usará el archivo.env."env": {"PYTHONUNBUFFERED": "1"}: Asegura que la salida no esté almacenada en búfer para un mejor registro en Claude.
Paso 4: Reiniciar Claude Desktop
- Cierra Claude Desktop por completo.
- Vuelve a abrir Claude Desktop para cargar la nueva configuración.
Paso 5: Verificar la conexión
- Abre Claude Desktop.
- Busca un icono de martillo o conector en el área de entrada (esquina inferior derecha). Esto indica que las herramientas MCP están disponibles.
- Haz clic en el icono para ver las herramientas disponibles de
goatcounter-mcp-server
Documentación de la API: Herramientas Disponibles
Las siguientes herramientas MCP están disponibles:
Herramienta: Goatcounter_get_me
Obtén información sobre el usuario actual de Goatcounter y la clave API asociada con el GOATCOUNTER_API_KEY configurado.
- Parámetros: Ninguno
- Devuelve:
object- Información sobre el usuario y el token.
Herramienta: Goatcounter_list_sites
Lista todos los sitios de Goatcounter accesibles con la clave API actual.
- Parámetros: Ninguno
- Devuelve:
object- Una lista de sitios accesibles.
Herramienta: Goatcounter_list_paths
Obtén una descripción general de las rutas rastreadas en este sitio (sin estadísticas).
- Parámetros:
limit(entero, opcional): Limita el número de resultados devueltos (1-200, predeterminado 20).after(entero, opcional): Solo selecciona rutas después de este ID de ruta, para paginación.
- Devuelve:
object- Una lista de rutas e información de paginación.
Herramienta: Goatcounter_get_stats_total
Obtén el número total de visitas a páginas y visitantes únicos para el sitio dentro de un período especificado.
- Parámetros:
start(cadena, opcional): Fecha de inicio (AAAA-MM-DD o relativa, por ejemplo, 'hace 7 días').end(cadena, opcional): Fecha de fin (AAAA-MM-DD o relativa, por ejemplo, 'ayer').filter(cadena, opcional): Filtrar rutas (por ejemplo, '/blog*').daily(booleano, opcional): Mostrar estadísticas diarias en lugar de totales (predeterminado: falso).
- Devuelve:
object- Estadísticas totales o estadísticas diarias sidailyes verdadero.
Herramienta: Goatcounter_get_stats_hits
Lista estadísticas de páginas (visitas a páginas y visitantes por ruta).
- Parámetros:
start(cadena, opcional): Fecha de inicio (AAAA-MM-DD o relativa, por ejemplo, 'hace 7 días').end(cadena, opcional): Fecha de fin (AAAA-MM-DD o relativa, por ejemplo, 'ayer').filter(cadena, opcional): Filtrar rutas (por ejemplo, '/blog*').daily(booleano, opcional): Mostrar estadísticas diarias en lugar de totales (predeterminado: falso).limit(entero, opcional): Limita el número de resultados devueltos (1-200, predeterminado 20).after(entero, opcional): Cursor de paginación.
- Devuelve:
object- Una lista de estadísticas de rutas e información de paginación.
Herramienta: Goatcounter_get_stats_refs
Lista estadísticas de referentes.
- Parámetros:
start(cadena, opcional): Fecha de inicio (AAAA-MM-DD o relativa, por ejemplo, 'hace 7 días').end(cadena, opcional): Fecha de fin (AAAA-MM-DD o relativa, por ejemplo, 'ayer').filter(cadena, opcional): Filtrar rutas (por ejemplo, '/blog*').daily(booleano, opcional): Mostrar estadísticas diarias en lugar de totales (predeterminado: falso).limit(entero, opcional): Limita el número de resultados devueltos (1-200, predeterminado 20).after(entero, opcional): Cursor de paginación.
- Devuelve:
object- Una lista de estadísticas de referentes e información de paginación.
Herramienta: Goatcounter_get_stats_browsers
Lista estadísticas de navegadores.
- Parámetros:
start(cadena, opcional): Fecha de inicio (AAAA-MM-DD o relativa, por ejemplo, 'hace 7 días').end(cadena, opcional): Fecha de fin (AAAA-MM-DD o relativa, por ejemplo, 'ayer').filter(cadena, opcional): Filtrar rutas (por ejemplo, '/blog*').daily(booleano, opcional): Mostrar estadísticas diarias en lugar de totales (predeterminado: falso).limit(entero, opcional): Limita el número de resultados devueltos (1-200, predeterminado 20).after(entero, opcional): Cursor de paginación.
- Devuelve:
object- Una lista de estadísticas de navegadores e información de paginación.
Herramienta: Goatcounter_get_stats_systems
Lista estadísticas de sistemas operativos.
- Parámetros:
start(cadena, opcional): Fecha de inicio (AAAA-MM-DD o relativa, por ejemplo, 'hace 7 días').end(cadena, opcional): Fecha de fin (AAAA-MM-DD o relativa, por ejemplo, 'ayer').filter(cadena, opcional): Filtrar rutas (por ejemplo, '/blog*').daily(booleano, opcional): Mostrar estadísticas diarias en lugar de totales (predeterminado: falso).limit(entero, opcional): Limita el número de resultados devueltos (1-200, predeterminado 20).after(entero, opcional): Cursor de paginación.
- Devuelve:
object- Una lista de estadísticas de sistemas operativos e información de paginación.
Herramienta: Goatcounter_get_stats_sizes
Lista estadísticas de tamaños de pantalla.
- Parámetros:
start(cadena, opcional): Fecha de inicio (AAAA-MM-DD o relativa, por ejemplo, 'hace 7 días').end(cadena, opcional): Fecha de fin (AAAA-MM-DD o relativa, por ejemplo, 'ayer').filter(cadena, opcional): Filtrar rutas (por ejemplo, '/blog*').daily(booleano, opcional): Mostrar estadísticas diarias en lugar de totales (predeterminado: falso).limit(entero, opcional): Limita el número de resultados devueltos (1-200, predeterminado 20).after(entero, opcional): Cursor de paginación.
- Devuelve:
object- Una lista de estadísticas de tamaños de pantalla e información de paginación.
Herramienta: Goatcounter_get_stats_locations
Lista estadísticas de ubicaciones.
- Parámetros:
start(cadena, opcional): Fecha de inicio (AAAA-MM-DD o relativa, por ejemplo, 'hace 7 días').end(cadena, opcional): Fecha de fin (AAAA-MM-DD o relativa, por ejemplo, 'ayer').filter(cadena, opcional): Filtrar rutas (por ejemplo, '/blog*').daily(booleano, opcional): Mostrar estadísticas diarias en lugar de totales (predeterminado: falso).limit(entero, opcional): Limita el número de resultados devueltos (1-200, predeterminado 20).after(entero, opcional): Cursor de paginación.
- Devuelve:
object- Una lista de estadísticas de ubicaciones e información de paginación.
Uso
-
Establecer variables de entorno: Crea un archivo
.enven la raíz de tu proyecto o establece las variables de entorno directamente:GOATCOUNTER_CODE=your_site_code GOATCOUNTER_API_KEY=your_goatcounter_api_keyPuedes generar una clave API en la configuración de tu cuenta de Goatcounter.
-
Ejecutar con FastMCP: Integra este servidor con tu configuración de FastMCP. Consulta la documentación de FastMCP para obtener detalles sobre cómo conectar servidores MCP.
El servidor registra herramientas con el prefijo
Goatcounter(por ejemplo,Goatcounter.list_sites).
Desarrollo
- Instala las dependencias de desarrollo:
pip install -e ".[dev]"(si las dependencias de desarrollo están especificadas enpyproject.toml) - Este proyecto usa
hatchpara la compilación.
Contribuciones
¡Las contribuciones son bienvenidas! Por favor, abre un problema o envía una solicitud de extracción.
Licencia
Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo LICENSE para más detalles.