Kanka
Un servidor MCP para integrarse con la API de Kanka, una herramienta
Documentación
MCP-Kanka
Servidor MCP (Protocolo de Contexto de Modelo) para la integración con la API de Kanka. Este servidor proporciona a los asistentes de IA herramientas para interactuar con campañas de Kanka, permitiendo operaciones CRUD en varios tipos de entidades como personajes, ubicaciones, organizaciones y más.
Este paquete está diseñado específicamente para satisfacer las necesidades de Teghrim, pero puede ser útil para otras personas que trabajen con Kanka y MCP.
Características
- Gestión de Entidades: Crear, leer, actualizar y eliminar entidades de Kanka
- Búsqueda y Filtrado: Buscar entidades por nombre con coincidencia parcial, filtrar por tipo/etiquetas/fecha
- Operaciones por Lote: Procesar múltiples entidades en una sola solicitud
- Gestión de Publicaciones: Crear, actualizar y eliminar publicaciones (notas) en entidades
- Soporte de Markdown: Conversión automática entre Markdown y HTML con preservación de menciones de entidades
- Seguridad de Tipos: Sugerencias de tipo completas y validación
- Filtrado del Lado del Cliente: Filtrado mejorado más allá de las limitaciones de la API
- Soporte de Sincronización: Sincronización eficiente con seguimiento de marcas de tiempo y la función nativa lastSync de Kanka
- Seguimiento de Marcas de Tiempo: Todas las entidades incluyen marcas de tiempo created_at y updated_at
Requisitos
- Python 3.10 o superior (se recomienda 3.13.5)
- Token de API de Kanka e ID de campaña
Instalación
Desde PyPI
pip install mcp-kanka
Desde el Código Fuente (usando uv)
git clone https://github.com/twistymaze/mcp-kanka.git
cd mcp-kanka
uv sync --all-groups
uv pip install -e .
Desde el Código Fuente (usando pip)
git clone https://github.com/twistymaze/mcp-kanka.git
cd mcp-kanka
pip install -e .
Inicio Rápido
Añadir a Claude Desktop
-
Configura tus variables de entorno:
KANKA_TOKEN: Tu token de API de KankaKANKA_CAMPAIGN_ID: Tu ID de campaña
-
Añade a la configuración de Claude Desktop:
{
"mcpServers": {
"kanka": {
"command": "python",
"args": ["-m", "mcp_kanka"],
"env": {
"KANKA_TOKEN": "your-token",
"KANKA_CAMPAIGN_ID": "your-campaign-id"
}
}
}
}
Uso con Claude Code CLI
claude mcp add kanka \
-e KANKA_TOKEN="your-token" \
-e KANKA_CAMPAIGN_ID="your-campaign-id" \
-- python -m mcp_kanka
Tipos de Entidades Soportados
- Personaje - Personajes de jugador (PJs), personajes no jugadores (PNJs)
- Criatura - Tipos de monstruos, animales, criaturas no únicas
- Ubicación - Lugares, regiones, edificios, puntos de referencia
- Organización - Gremios, gobiernos, cultos, empresas
- Raza - Especies, linajes
- Nota - Contenido interno, resúmenes de sesión, notas del máster (privadas por defecto)
- Diario - Resúmenes de sesión, narrativas, crónicas
- Misión - Misiones, objetivos, arcos argumentales
Herramientas Disponibles (9 en Total)
Operaciones de Entidades
find_entities
Buscar y filtrar entidades con opciones completas y metadatos de sincronización.
Parámetros:
entity_type(opcional): Tipo para filtrar - personaje, criatura, ubicación, organización, raza, nota, diario, misiónquery(opcional): Término de búsqueda para búsqueda de texto completo en nombres y contenidoname(opcional): Filtrar por nombre (coincidencia parcial por defecto, p. ej., "Prueba" coincide con "Personaje de Prueba")name_exact(opcional): Usar coincidencia exacta de nombre en lugar de parcial (por defecto: falso)name_fuzzy(opcional): Habilitar coincidencia difusa para tolerancia a errores tipográficos (por defecto: falso)type(opcional): Filtrar por campo Tipo definido por el usuario (p. ej., 'PNJ', 'Ciudad')tags(opcional): Matriz de etiquetas - devuelve entidades que tengan TODAS las etiquetas especificadasdate_range(opcional): Solo para diarios - filtrar por rango de fechas con fechasstartyendlimit(opcional): Resultados por página (por defecto: 25, máximo: 100, usar 0 para todos)page(opcional): Número de página para paginación (por defecto: 1)include_full(opcional): Incluir detalles completos de la entidad (por defecto: verdadero)last_synced(opcional): Marca de tiempo ISO 8601 para obtener solo entidades modificadas después de este momento
Devuelve:
{
"entities": [...],
"sync_info": {
"request_timestamp": "2024-01-01T12:00:00Z",
"newest_updated_at": "2024-01-01T11:30:00Z",
"total_count": 150,
"returned_count": 25
}
}
create_entities
Crear una o más entidades con contenido en Markdown.
Parámetros:
entities: Matriz de entidades a crear, cada una con:entity_type(obligatorio): Tipo de entidad a crearname(obligatorio): Nombre de la entidadentry(opcional): Descripción en formato Markdowntype(opcional): Campo Tipo definido por el usuario (p. ej., 'PNJ', 'Personaje de Jugador')tags(opcional): Matriz de nombres de etiquetasis_hidden(opcional): Si es verdadero, oculto de los jugadores (solo administradores)
Devuelve: Matriz de entidades creadas con sus IDs y marcas de tiempo
update_entities
Actualizar una o más entidades existentes.
Parámetros:
updates: Matriz de actualizaciones, cada una con:entity_id(obligatorio): ID de la entidad a actualizarname(obligatorio): Nombre de la entidad (obligatorio por la API de Kanka incluso si no cambia)entry(opcional): Contenido actualizado en formato Markdowntype(opcional): Campo Tipo actualizadotags(opcional): Matriz de etiquetas actualizadais_hidden(opcional): Si es verdadero, oculto de los jugadores (solo administradores)
Devuelve: Matriz de resultados con estado de éxito/error para cada actualización
get_entities
Recuperar entidades específicas por ID con publicaciones opcionales.
Parámetros:
entity_ids(obligatorio): Matriz de IDs de entidades a recuperarinclude_posts(opcional): Incluir publicaciones para cada entidad (por defecto: falso)
Devuelve: Matriz de detalles completos de entidades con marcas de tiempo y publicaciones opcionales
delete_entities
Eliminar una o más entidades.
Parámetros:
entity_ids(obligatorio): Matriz de IDs de entidades a eliminar
Devuelve: Matriz de resultados con estado de éxito/error para cada eliminación
check_entity_updates
Verificar eficientemente qué entidades han sido modificadas desde la última sincronización.
Parámetros:
entity_ids(obligatorio): Matriz de IDs de entidades a verificarlast_synced(obligatorio): Marca de tiempo ISO 8601 para verificar actualizaciones desde ese momento
Devuelve:
{
"modified_entity_ids": [101, 103],
"deleted_entity_ids": [102],
"check_timestamp": "2024-01-01T12:00:00Z"
}
Operaciones de Publicaciones
create_posts
Añadir publicaciones (notas) a entidades.
Parámetros:
posts: Matriz de publicaciones a crear, cada una con:entity_id(obligatorio): Entidad a la que adjuntar la publicaciónname(obligatorio): Título de la publicaciónentry(opcional): Contenido de la publicación en formato Markdownis_hidden(opcional): Si es verdadero, oculto de los jugadores (solo administradores)
Devuelve: Matriz de publicaciones creadas con sus IDs
update_posts
Modificar publicaciones existentes.
Parámetros:
updates: Matriz de actualizaciones, cada una con:entity_id(obligatorio): El ID de la entidadpost_id(obligatorio): El ID de la publicación a actualizarname(obligatorio): Título de la publicación (obligatorio por la API incluso si no cambia)entry(opcional): Contenido actualizado en formato Markdownis_hidden(opcional): Si es verdadero, oculto de los jugadores (solo administradores)
Devuelve: Matriz de resultados con estado de éxito/error para cada actualización
delete_posts
Eliminar publicaciones de entidades.
Parámetros:
deletions: Matriz de eliminaciones, cada una con:entity_id(obligatorio): El ID de la entidadpost_id(obligatorio): El ID de la publicación a eliminar
Devuelve: Matriz de resultados con estado de éxito/error para cada eliminación
Búsqueda y Filtrado
El servidor MCP proporciona capacidades de búsqueda mejoradas:
- Búsqueda de contenido: Búsqueda de texto completo en nombres y contenido de entidades (del lado del cliente)
- Filtro de nombre: Coincidencia de nombre exacta o difusa
- Filtro de tipo: Filtrar por campo de tipo definido por el usuario (p. ej., 'PNJ', 'Ciudad')
- Filtro de etiquetas: Filtrar por etiquetas (lógica Y - la entidad debe tener todas las etiquetas especificadas)
- Rango de fechas: Filtrar diarios por fecha
- Coincidencia difusa: Coincidencia de nombre difusa opcional para búsquedas más flexibles
- Filtro de última sincronización: Usar el parámetro nativo lastSync de Kanka para obtener solo entidades modificadas
Nota: La búsqueda de contenido obtiene todas las entidades y busca del lado del cliente, lo que puede ser más lento para campañas grandes, pero proporciona una funcionalidad de búsqueda completa.
Características de Sincronización
Soporte de Marcas de Tiempo
Todas las entidades incluyen marcas de tiempo created_at y updated_at en formato ISO 8601, lo que permite:
- Rastrear cuándo se crearon o modificaron por última vez las entidades
- Implementar estrategias de resolución de conflictos
- Construir pistas de auditoría
Metadatos de Sincronización
La herramienta find_entities devuelve metadatos de sincronización que incluyen:
request_timestamp: Cuándo se realizó la solicitudnewest_updated_at: Último updated_at de las entidades devueltastotal_count: Total de entidades coincidentesreturned_count: Número devuelto en esta respuesta
Sincronización Eficiente con lastSync
Usa el parámetro last_synced para obtener solo entidades modificadas después de un momento específico:
# Example: Get entities modified in the last 24 hours
result = await find_entities(
entity_type="character",
last_synced="2024-01-01T00:00:00Z"
)
Verificación de Actualizaciones por Lote
La herramienta check_entity_updates verifica eficientemente qué entidades han sido modificadas:
# Check which of these entities have changed
result = await check_entity_updates(
entity_ids=[101, 102, 103],
last_synced="2024-01-01T00:00:00Z"
)
# Returns: modified_entity_ids, deleted_entity_ids, check_timestamp
Desarrollo
Configuración
# Clone the repository
git clone https://github.com/twistymaze/mcp-kanka.git
cd mcp-kanka
# Install development dependencies
make install
Ejecución de Pruebas
# Run all tests
make test
# Run with coverage
make coverage
# Run all checks (lint + typecheck + test)
make check
Calidad del Código
# Format code
make format
# Run linting
make lint
# Run type checking
make typecheck
Uso Programático
Además de ser un servidor MCP, este paquete proporciona una capa de operaciones que se puede usar directamente en scripts de Python:
from mcp_kanka.operations import create_operations
# Create operations instance
ops = create_operations()
# Find entities
result = await ops.find_entities(
entity_type="character",
name="Moradin"
)
# Create an entity
results = await ops.create_entities([{
"entity_type": "character",
"name": "New Character",
"type": "NPC",
"entry": "A mysterious figure"
}])
Esto facilita la creación de scripts de sincronización, operaciones masivas u otras herramientas que interactúen con Kanka.
Configuración
El servidor MCP requiere:
KANKA_TOKEN: Tu token de API de KankaKANKA_CAMPAIGN_ID: El ID de tu campaña de Kanka
Recursos
El servidor proporciona un recurso kanka://context que explica la estructura y capacidades de Kanka.
Historial de Versiones
v0.1.0
- Lanzamiento inicial
- Operaciones CRUD completas para entidades de Kanka
- Soporte de operaciones por lote
- Conversión Markdown/HTML con preservación de menciones de entidades
- Soporte de sincronización con seguimiento de marcas de tiempo
- Capacidades completas de búsqueda y filtrado
Licencia
MIT