MCP Framework Personal
Enables interaction with Apache Kafka for producing and consuming messages, managing topics, and more.
Allows management of Docker containers, images, and related operations.
Provides tools for performing Git operations such as clone, commit, push, branch management, and more.
Integrates with GitHub API for managing repositories, issues, pull requests, and other GitHub features.
Enables management of Kubernetes clusters, pods, deployments, services, and other resources.
Provides tools for interacting with S3-compatible object storage, specifically MinIO, for managing buckets and objects.
Integrates with Snyk for SAST (Static Application Security Testing) and SCA (Software Composition Analysis).
Integrates with SonarCloud for continuous code quality and security analysis.
Integrates with SonarQube for on-premises code quality and security analysis.
Provides tools for managing Terraform infrastructure as code, including plan and apply operations.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Framework PersonalShow today's exchange rate USD to MXN"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Framework — Manual de Onboarding
Para quien nunca escuchó hablar de MCP: Este documento explica desde cero qué es MCP, para qué sirve este proyecto, cómo usarlo hoy mismo y cómo extenderlo. Léelo de principio a fin la primera vez; después úsalo como referencia.
Tabla de Contenidos
Related MCP server: MCP Server TypeScript
1. ¿Qué es MCP? (la idea en 5 minutos)
El problema que MCP resuelve
Los modelos de lenguaje (Claude, GPT, Gemini…) son muy buenos generando texto, pero viven "encerrados" — no pueden leer tus archivos, consultar tu base de datos, ni llamar a tus APIs internas. Cada integración se construía a mano, de forma distinta en cada herramienta.
MCP (Model Context Protocol) es el estándar abierto creado por Anthropic en 2024 que define cómo un modelo de IA se comunica con herramientas externas de forma universal. Es como USB para la IA: cualquier cliente que hable MCP puede usar cualquier servidor MCP, sin código de pegamento.
Los tres componentes del protocolo
┌─────────────────────────────────────────────────────────────┐
│ CLIENTE MCP │
│ (Claude Desktop, Cursor, Windsurf, tu app…) │
│ │
│ El modelo de IA le dice al cliente: "necesito leer │
│ un Excel". El cliente llama al servidor correcto. │
└───────────────────────┬─────────────────────────────────────┘
│ Protocolo JSON-RPC 2.0
│ (via stdio o HTTP)
┌───────────────────────▼─────────────────────────────────────┐
│ SERVIDOR MCP │
│ (este proyecto — mcp-tabular, etc.) │
│ │
│ Proceso Python independiente que expone "tools", │
│ "resources" y "prompts" al modelo. │
└───────────────────────┬─────────────────────────────────────┘
│
┌───────────────────────▼─────────────────────────────────────┐
│ SISTEMA EXTERNO │
│ (archivos del disco, APIs web, bases de datos…) │
└─────────────────────────────────────────────────────────────┘Los tres tipos de capacidades que expone un servidor
Tipo | ¿Qué es? | Ejemplo |
Tool | Función que el modelo puede llamar |
|
Resource | Datos que el modelo puede leer | El contenido de un archivo |
Prompt | Plantilla de instrucciones reutilizable | "Eres un analista de datos…" |
Este proyecto usa principalmente tools — son las más versátiles.
Los dos modos de transporte
Modo | Cuándo usarlo | Cómo funciona |
stdio | Local (Claude Desktop, Cursor, Windsurf) | El cliente lanza el servidor como subproceso; se comunican por stdin/stdout |
streamable-http | Producción (servidor remoto, múltiples clientes) | El servidor escucha en un puerto HTTP; el cliente hace requests |
Regla de oro: durante desarrollo usa
stdio. En producción usastreamable-httpcon Docker.
2. ¿Para qué sirve este proyecto?
Este repositorio es un framework propio de servidores MCP, diseñado para:
Correr localmente en la máquina del desarrollador (integrado con Claude Desktop, Cursor o Windsurf).
Desplegarse en producción en un servidor remoto de forma transparente — cambiando solo una variable de entorno (
MCP_TRANSPORT).Compartir código de infraestructura (logging, configuración, manejo de errores) entre todos los servidores a través de la librería
mcp_shared.Seguir estándares de producción: tipado estático, tests, Docker multi-stage, usuarios no-root y healthchecks.
3. Arquitectura general
mcps/ ← raíz del workspace uv
│
├── shared/ ← librería compartida (se instala como paquete)
│ └── src/mcp_shared/
│ ├── config.py ← BaseMcpSettings (base de configuración)
│ ├── errors.py ← jerarquía de errores tipados
│ ├── logging.py ← setup_logging() con structlog
│ └── models.py ← modelos Pydantic reutilizables
│
├── mcp-tabular/ ← Archivos tabulares
├── mcp-calendar/ ← Días hábiles y divisas
├── mcp-markdown/ ← Archivos Markdown
├── mcp-prompt-engineer/ ← Ingeniería de prompts
├── mcp-structured-output/ ← Structured Output (LLMs JSON Schema)
├── mcp-fetch/ ← HTTP y web scraping
├── mcp-docker/ ← Gestión Docker
├── mcp-kafka/ ← Apache Kafka
├── mcp-project-memory/ ← Memoria de proyecto persistente
├── mcp-llm-router/ ← Ruteo inteligente de LLMs
├── mcp-git/ ← Operaciones Git
├── mcp-github/ ← Integración GitHub
├── mcp-code-quality/ ← Calidad de código
├── mcp-architecture/ ← Análisis de arquitectura
├── mcp-event-driven/ ← Event-driven architecture
├── mcp-orchestrator/ ← Orquestación de DAGs
├── mcp-best-practices/ ← Documentación retroactiva
├── mcp-ci-cd/ ← Simulación de pipelines
├── mcp-design-patterns/ ← Patrones de diseño
├── mcp-security-champion/ ← Seguridad y compliance
├── mcp-database/ ← Consultas SQL
├── mcp-filesystem/ ← Filesystem sandbox
├── mcp-object-storage/ ← Object Storage S3/MinIO
├── mcp-openapi/ ← OpenAPI client
├── mcp-documents/ ← Documentos PDF/DOCX/PPTX
├── mcp-browser/ ← Automatización web
├── mcp-kubernetes/ ← Kubernetes
├── mcp-observability/ ← Observabilidad
├── mcp-terraform/ ← Infraestructura como código
├── mcp-snyk/ ← Snyk SAST/SCA
├── mcp-sonar/ ← SonarQube/SonarCloud
├── mcp-java-build/ ← Builds Java
├── mcp-agent-runner/ ← Orquestación de agentes
├── mcp-personal-vault/ ← Bóveda personal cifrada
│
├── docker-compose.yml ← orquestación (modo HTTP / producción)
├── pyproject.toml ← workspace root: ruff, mypy, pytest
├── Makefile ← comandos operacionales
├── claude_desktop_config.json ← config para Claude Desktop (modo stdio)
└── .env.example ← plantilla de variables de entornoserver.py ← CAPA MCP: registra tools, maneja errores MCP, logging │ tools/*.py ← CAPA DE NEGOCIO: lógica pura, sin dependencias MCP │ mcp_shared/ ← CAPA COMPARTIDA: config, errores, logging, modelos
Esto significa que puedes probar la lógica de `tools/` con tests unitarios normales, sin necesidad de levantar un servidor MCP.
---
## 4. Catálogo de servidores
### `mcp-tabular` — Archivos tabulares
Lee Excel, CSV, TSV, ODS y Parquet; filtra, agrega y exporta a JSON.
| Tool | Qué hace |
|------|----------|
| `read_tabular_file` | Lee un archivo tabular (Excel, CSV, TSV, ODS, Parquet) y retorna los datos en formato JSON. Detecta automáticamente el encoding para archivos CSV/TSV. Parámetros: path (ruta al archivo), sheet (nombre de hoja para Excel/ODS, opcional), encoding ('auto' o nombre de encoding como 'utf-8', 'latin-1'). Retorna: columns (metadatos de columnas), records (filas como dicts), total_rows, returned_rows, truncated, metadata, warnings. |
| `get_sheet_names` | Retorna la lista de nombres de hojas de un archivo Excel (.xlsx, .xls) u ODS. No aplica para CSV, TSV ni Parquet. Parámetro: path (ruta al archivo). Retorna: lista de strings con los nombres de las hojas en orden. |
| `get_file_summary` | Retorna estadísticas completas de un archivo tabular: shape (filas × columnas), tipos de datos, conteo de nulos por columna, y estadísticas descriptivas (mean, std, min, max, percentiles) de columnas numéricas. Parámetros: path (ruta al archivo), sheet (hoja para Excel/ODS, opcional). Retorna: dict con shape, columns, dtypes, null_counts, null_percentages, numeric_describe, size_bytes, size_mb. |
| `read_specific_sheet` | Lee una hoja específica de un archivo Excel (.xlsx, .xls) u ODS por nombre exacto. Retorna un error descriptivo si la hoja no existe, indicando las hojas disponibles. Parámetros: path (ruta al archivo), sheet_name (nombre exacto de la hoja). Retorna: mismo formato que read_tabular_file. |
| `filter_rows` | Filtra filas de un archivo tabular según un criterio en una columna. Operadores soportados: eq (igual), ne (diferente), gt (mayor), lt (menor), gte (mayor o igual), lte (menor o igual), contains (contiene substring, case-insensitive), startswith (empieza con, case-insensitive). Parámetros: path, column (nombre de columna), operator (ver lista), value (valor a comparar como string), sheet (opcional). El valor se convierte automáticamente al tipo de la columna para comparaciones numéricas. Retorna: mismo formato que read_tabular_file pero solo con las filas que cumplen el filtro. |
| `search_in_file` | Busca un texto en todas las columnas del archivo tabular (búsqueda case-insensitive). Retorna todas las celdas que contienen el texto buscado, con el contexto completo de la fila. Parámetros: path, query (texto a buscar), sheet (opcional), max_results (máximo de resultados, por defecto 100). Retorna: lista de matches con row_index, column, value y row (fila completa). |
| `convert_to_csv` | Convierte un archivo tabular (Excel, ODS, Parquet) a formato CSV. Retorna el contenido CSV completo como string, incluyendo encabezados. Útil para exportar datos o usar en otros sistemas que solo aceptan CSV. Parámetros: path, sheet (nombre de hoja para Excel/ODS, opcional), output_encoding (encoding del CSV de salida, por defecto 'utf-8'). Retorna: string con el contenido CSV completo. |
| `get_column_stats` | Retorna estadísticas detalladas de una columna específica del archivo. Para columnas numéricas: mean, std, min, max, percentiles, skewness, kurtosis. Para columnas de texto: value_counts top-10, most_frequent, avg/min/max length. Para columnas de fecha: min_date, max_date, date_range_days. Para todas: null_count, null_percentage, unique_count, dtype, total_count. Parámetros: path, column (nombre exacto de la columna), sheet (opcional). Retorna: dict con stats adaptadas al tipo de la columna. |
| `sort_rows` | Ordena las filas del archivo por una o más columnas. Parámetros: path, by (nombre de columna o lista), ascending (bool, default true), sheet (opcional). Retorna: mismo formato que read_tabular_file con las filas ordenadas. |
| `drop_columns` | Elimina columnas específicas del archivo. Parámetros: path, columns (nombre o lista de columnas a eliminar), sheet (opcional). Retorna: mismo formato que read_tabular_file sin las columnas eliminadas. |
| `select_columns` | Selecciona solo las columnas especificadas, descartando las demás. Parámetros: path, columns (nombre o lista de columnas a conservar), sheet (opcional). Retorna: mismo formato que read_tabular_file con solo las columnas seleccionadas. |
| `rename_columns` | Renombra columnas del archivo usando un diccionario {nombre_antiguo: nombre_nuevo}. Parámetros: path, mapping (dict de renombrado), sheet (opcional). Retorna: mismo formato que read_tabular_file con las columnas renombradas. |
| `fill_nulls` | Rellena valores nulos (NaN) con un valor dado. Parámetros: path, value (valor de relleno, default 0), columns (lista opcional de columnas a rellenar; si es None, rellena todas), sheet (opcional). Retorna: mismo formato que read_tabular_file con los nulos rellenados. |
| `drop_nulls` | Elimina filas que contienen valores nulos. Parámetros: path, how ('any' = cualquier nulo, 'all' = todos nulos, default 'any'), subset (columnas específicas a considerar, opcional), sheet (opcional). Retorna: mismo formato que read_tabular_file sin las filas con nulos. |
| `drop_duplicates` | Elimina filas duplicadas del archivo. Parámetros: path, subset (columnas a considerar para duplicados, opcional), keep ('first' = mantener primero, 'last' = mantener último, 'false' = eliminar todos), sheet (opcional). Retorna: mismo formato que read_tabular_file sin duplicados. |
| `groupby_agg` | Agrupa filas por una o más columnas y aplica una función de agregación. Funciones soportadas: mean, sum, min, max, count, median, std, var, first, last, nunique. Parámetros: path, by (columna o lista de agrupación), agg_func (función de agregación), sheet (opcional). Retorna: mismo formato que read_tabular_file con el resultado agrupado. |
| `pivot_table` | Crea una tabla pivot desde el archivo tabular. Parámetros: path, index (columna de filas), columns (columna de columnas), values (columna de valores), aggfunc (función de agregación, default 'mean'), sheet (opcional). Retorna: mismo formato que read_tabular_file con la tabla pivot. |
| `melt_table` | Convierte el archivo de formato ancho a largo (unpivot/melt). Parámetros: path, id_vars (columnas que se mantienen), value_vars (columnas a despivotar, opcional), sheet (opcional). Retorna: mismo formato que read_tabular_file en formato largo. |
| `sample_rows` | Retorna una muestra aleatoria de n filas del archivo. Parámetros: path, n (número de filas, default 10), random_state (semilla, opcional), sheet (opcional). Retorna: mismo formato que read_tabular_file con la muestra. |
| `head_rows` | Retorna las primeras n filas del archivo. Parámetros: path, n (número de filas, default 10), sheet (opcional). Retorna: mismo formato que read_tabular_file. |
| `tail_rows` | Retorna las últimas n filas del archivo. Parámetros: path, n (número de filas, default 10), sheet (opcional). Retorna: mismo formato que read_tabular_file. |
| `convert_to_json` | Convierte un archivo tabular a formato JSON. Parámetros: path, sheet (opcional), orient ('records', 'index', 'columns', 'values', 'split'). Retorna: string JSON completo. |
| `convert_to_markdown` | Convierte un archivo tabular a tabla Markdown. Parámetros: path, sheet (opcional), max_rows (límite de filas, default 50). Retorna: string con tabla Markdown. |
| `get_duplicates_info` | Reporta filas duplicadas en el archivo con conteo y muestra. Parámetros: path, subset (columnas a considerar, opcional), sheet (opcional). Retorna: dict con total_rows, duplicate_rows, duplicate_percentage, sample_duplicates. |
| `get_correlation` | Calcula la matriz de correlación entre columnas numéricas. Métodos soportados: pearson, spearman, kendall. Parámetros: path, method (default 'pearson'), sheet (opcional). Retorna: dict con la matriz de correlación. |
**Caso de uso típico:** Analiza ventas_Q1.xlsx y muestra las 5 categorías con más ingresos.
---
### `mcp-calendar` — Días hábiles y divisas
Calcula días hábiles y feriados para más de 100 países y consulta tasas de cambio vía Frankfurter.
| Tool | Qué hace |
|------|----------|
| `get_holidays` | Lista todos los feriados de un país para un año dado. Soporta más de 100 países usando ISO 3166-1 alpha-2 (ej: 'MX', 'US', 'DE'). Parámetros: country (código de país), year (año ej: 2025), state (subdivisión opcional ej: 'CDMX', 'CA'). Retorna: lista de feriados con fecha, nombre, país y región. |
| `calculate_business_days` | Calcula los días hábiles entre dos fechas (ambas inclusive). Excluye fines de semana y feriados del país. Parámetros: start_date (YYYY-MM-DD), end_date (YYYY-MM-DD), country (ISO alpha-2, por defecto 'MX'). Retorna: business_days, total_days, weekend_days, holidays_excluded, country. |
| `add_business_days` | Suma N días hábiles a una fecha de inicio. Si n_days es negativo, resta días hábiles hacia atrás. La fecha de inicio NO cuenta como día hábil a sumar. Parámetros: start_date (YYYY-MM-DD), n_days (entero, puede ser negativo), country (ISO alpha-2, por defecto 'MX'). Retorna: fecha resultante en formato ISO 8601 (YYYY-MM-DD). |
| `is_business_day` | Verifica si una fecha específica es día hábil en el país dado. Parámetros: check_date (YYYY-MM-DD), country (ISO alpha-2, por defecto 'MX'). Retorna: is_business_day, is_weekend, is_holiday, holiday_name, holiday_description, day_of_week, country. |
| `next_business_day` | Retorna el siguiente día hábil después de la fecha dada. Si la fecha dada ya es hábil, retorna el SIGUIENTE (no el mismo día). Parámetros: check_date (YYYY-MM-DD), country (ISO alpha-2, por defecto 'MX'). Retorna: fecha del siguiente día hábil en formato ISO 8601. |
| `previous_business_day` | Retorna el día hábil anterior a la fecha dada. Si la fecha dada ya es hábil, retorna el ANTERIOR (no el mismo día). Parámetros: check_date (YYYY-MM-DD), country (ISO alpha-2, por defecto 'MX'). Retorna: fecha del día hábil anterior en formato ISO 8601. |
| `business_days_in_month` | Calcula el total de días hábiles en un mes completo. Parámetros: year (ej: 2025), month (1–12), country (ISO alpha-2, por defecto 'MX'). Retorna: year, month, month_name, business_days, total_days, weekend_days, holiday_count, holidays, country. |
| `get_mexico_holidays` | Retorna todos los feriados oficiales de México para el año dado, con descripciones en español de su contexto histórico y cultural. Incluye la base legal (Ley Federal del Trabajo, Art. 74). Parámetro: year (ej: 2025). Retorna: lista de feriados con date, name, description, is_fixed, day_of_week, legal_basis. |
| `get_country_list` | Retorna la lista de todos los países soportados para cálculo de días hábiles. Incluye código ISO alpha-2, nombre del país y subdivisiones disponibles. Útil para validar códigos de país antes de llamar otras herramientas. No requiere parámetros. Retorna: lista con code, name, has_subdivisions, subdivisions. |
| `get_exchange_rate` | Obtiene la tasa de cambio actual entre dos divisas vía Frankfurter API (BCE). Las tasas se actualizan diariamente y se cachean en memoria. Parámetros: from_currency (ISO 4217 ej: 'USD'), to_currency (ISO 4217 ej: 'MXN'), ttl_seconds (TTL del caché, por defecto 3600). Retorna: base_currency, target_currency, rate, timestamp, source. |
| `convert_currency` | Convierte un monto de una divisa a otra usando la tasa de cambio actual. Parámetros: amount (monto a convertir, >=0), from_currency (ISO 4217), to_currency (ISO 4217), ttl_seconds (TTL del caché, por defecto 3600). Retorna: original_amount, converted_amount, rate (tasa utilizada). |
| `get_historical_rate` | Obtiene la tasa de cambio histórica entre dos divisas para una fecha específica. Datos disponibles desde 1999-01-04 (inicio del BCE). Parámetros: from_currency (ISO 4217), to_currency (ISO 4217), rate_date (YYYY-MM-DD, no puede ser fecha futura). Retorna: base_currency, target_currency, rate, timestamp, source. |
| `get_mx_rates` | Obtiene las tasas de cambio entre MXN y las principales monedas mundiales (USD, EUR, GBP, CAD, JPY, CHF, CNY). Parámetros: base (divisa base, por defecto 'MXN'), ttl_seconds (TTL del caché, por defecto 3600). Retorna: base, date, rates (mapa código→rate), source. |
| `list_supported_currencies` | Lista todas las divisas soportadas por Frankfurter API (ISO 4217). Incluye el código y el nombre completo en inglés de cada divisa. No requiere parámetros. Los resultados se cachean 24 horas. Retorna: lista de dicts con 'code' y 'name', ordenados alfabéticamente. |
| `get_rate_history` | Obtiene el historial de tasas de cambio entre dos divisas para un rango de fechas. Solo incluye días hábiles del BCE (no fines de semana ni feriados europeos). Parámetros: from_currency (ISO 4217), to_currency (ISO 4217), start_date (YYYY-MM-DD), end_date (YYYY-MM-DD). Retorna: lista de tasas de cambio diarias ordenadas por fecha ascendente. |
**Caso de uso típico:** Calcula fechas de entrega entre México y Alemania y convierte montos a EUR.
---
### `mcp-markdown` — Archivos Markdown
Lee, analiza, valida y transforma archivos Markdown: headings, links, code blocks, frontmatter.
| Tool | Qué hace |
|------|----------|
| `read_markdown` | Lee y analiza un archivo Markdown de forma completa. Retorna el contenido crudo, frontmatter YAML, título (primer H1), recuento de palabras, headings, links, bloques de código e imágenes. |
| `extract_headings` | Extrae todos los encabezados (H1-H6) de un archivo Markdown. Cada encabezado incluye su nivel (1-6), texto y anchor HTML. |
| `extract_links` | Extrae todos los enlaces de un archivo Markdown, incluyendo imágenes. Cada enlace indica texto, URL, si es externo y si es imagen. |
| `extract_code_blocks` | Extrae todos los bloques de código (fenced code blocks) de un archivo Markdown. Incluye el lenguaje declarado, el contenido y la línea de inicio. |
| `get_toc` | Genera una tabla de contenidos Markdown para el archivo, con enlaces de anclaje a cada encabezado. Se puede limitar la profundidad (1-6). |
| `markdown_to_html` | Convierte un archivo Markdown (o texto Markdown directo) a HTML5 completo con estilos básicos embebidos. Soporta tablas, strikethrough y autolinks. |
| `markdown_to_plain_text` | Convierte Markdown a texto plano eliminando todo el markup (encabezados, énfasis, links, bloques de código, tablas, etc.). |
| `validate_markdown` | Valida un archivo Markdown y reporta problemas: H1 faltante o múltiple, encabezados duplicados, enlaces locales rotos, y ausencia de título. Retorna valid=True solo si no hay warnings. |
| `search_in_markdown` | Busca un texto en un archivo Markdown línea por línea. Retorna cada coincidencia con número de línea, contexto completo y el encabezado bajo el cual aparece. |
| `format_markdown` | Formatea y normaliza un archivo Markdown (o texto directo) usando mdformat. Estandariza encabezados, listas, espaciado y bloques de código. |
| `get_frontmatter` | Extrae solo el frontmatter YAML de un archivo Markdown. Retorna un dict vacío si el archivo no tiene frontmatter. |
| `list_markdown_files` | Lista todos los archivos Markdown en un directorio. Para cada archivo retorna la ruta, título, recuento de palabras, tamaño y frontmatter. Soporta búsqueda recursiva. |
**Caso de uso típico:** Genera un resumen de /docs o valida que no haya enlaces rotos.
---
### `mcp-prompt-engineer` — Ingeniería de prompts
Analiza, mejora, clasifica y genera variaciones de prompts para LLMs.
| Tool | Qué hace |
|------|----------|
| `analyze_prompt` | Analiza un prompt de LLM de forma exhaustiva usando heurísticas reales. Detecta: tokens estimados, conteo de palabras, idioma, tipo de prompt, puntuación de claridad (0–10), problemas (críticos/warnings/info) y fortalezas. Parámetros: prompt (texto a analizar), target_model (modelo objetivo opcional: 'gpt-4', 'claude-3-5', etc.). Retorna: token_count, word_count, language, prompt_type, clarity_score, issues, strengths, suggestions, has_role, has_examples, has_format_spec. |
| `classify_prompt` | Clasifica el tipo de un prompt con una puntuación de confianza. Tipos posibles: instruction (tarea directa), question (pregunta abierta), closed_question (sí/no), few_shot (con ejemplos), system (system prompt), conversation (conversacional), creative (creativo), code (código). Parámetro: prompt (texto a clasificar). Retorna: type, confidence, indicators_found. |
| `estimate_tokens` | Estima el número de tokens para un texto en múltiples modelos de lenguaje. Usa tiktoken para modelos OpenAI y heurísticas para Claude. También indica si el texto cabe en el contexto de cada modelo. Parámetros: text (texto a analizar), model (modelo de referencia, por defecto 'gpt-4o'). Retorna: text_length, word_count, method, tokens (por modelo), context_fit. |
| `improve_prompt` | Mejora automáticamente un prompt aplicando buenas prácticas de prompt engineering. Las mejoras son heurísticas: agrega contexto, clarifica instrucciones, añade formato si falta, elimina ambigüedades. Parámetros: prompt (prompt original), goal (objetivo del prompt, opcional), target_model (modelo objetivo, opcional), style (estilo deseado: formal | casual | technical | simple | concise, opcional). Retorna: original, improved, changes (lista de cambios aplicados), score_before, score_after, improvement_delta. |
| `generate_variations` | Genera N variaciones del prompt con diferentes enfoques de prompt engineering: role_injection (añade rol experto), chain_of_thought (razonamiento paso a paso), structured_output (plantilla de salida), concise (versión condensada), audience_context (adapta para audiencia específica). Parámetros: prompt (prompt base), n (número de variaciones, 1–10, por defecto 3). Retorna: lista de variaciones con variation, approach, description, clarity_score. |
| `create_system_prompt` | Crea un system prompt estructurado y completo a partir de componentes. Parámetros: role (rol o persona del asistente, ej: 'experto en finanzas'), context (contexto de uso o empresa), constraints (restricciones o reglas a seguir, opcional). Retorna: system_prompt (texto listo para usar como system message). |
| `decompose_task` | Descompone una tarea compleja en subtareas numeradas y manejables. Útil para tareas de múltiples pasos que abruman al modelo en un solo prompt. Parámetro: task (descripción de la tarea compleja). Retorna: lista de subtareas con step, title, description, prompt_suggestion. |
| `get_prompt_template` | Retorna un template de prompt optimizado para un caso de uso específico. Casos de uso disponibles: analysis, code_review, code_generation, writing, translation, summarization, classification, extraction, qa, brainstorming, debugging, documentation, refactoring, testing, explanation. Parámetro: use_case (nombre del caso de uso). Retorna: use_case, template, placeholders (variables a reemplazar), description, tips. |
**Caso de uso típico:** Optimiza un prompt de soporte al cliente para mayor claridad.
---
### `mcp-structured-output` — Structured Output (LLMs JSON Schema)
Invoca LLMs (Bedrock, OpenAI-compatible) con salida forzada a JSON Schema; incluye validación y generación de schemas.
| Tool | Qué hace |
|------|----------|
| `invoke_structured` | Llama a un LLM y garantiza que la respuesta cumpla un JSON Schema. Proveedores: bedrock-converse | bedrock-invoke-claude | bedrock-invoke-openweight | openai-compatible. Credenciales AWS vía entorno/perfil boto3. Parámetros: prompt, schema, schema_name (default 'response'), provider, model_id, system_prompt, max_tokens (default 2048), temperature (default 0.0), region (AWS), base_url (solo openai-compatible). |
| `validate_schema` | Valida localmente que un JSON Schema sea compatible con Bedrock structured output (Draft 2020-12). Detecta: schemas recursivos, $ref externos, additionalProperties != false, constraints numéricas/string no soportadas, minItems fuera de [0,1], enum con tipos complejos. No hace llamadas a AWS. Retorna: valid (bool), issues (lista con path, message, severity). |
| `generate_schema` | Genera un JSON Schema Bedrock-compatible a partir de un objeto JSON de ejemplo. Infiere tipos automáticamente y aplica additionalProperties: false. Parámetros: example (dict JSON), name (nombre del schema, default 'schema'), description (opcional), strict (bool, default true — marca todos los campos como required). Retorna: schema (dict), field_count (int), warnings (list). |
| `sanitize_schema` | Transforma un JSON Schema para que sea compatible con Bedrock structured output. Elimina/transforma automáticamente: constraints numéricas (minimum, maximum, multipleOf), constraints de string (minLength, maxLength), additionalProperties != false, $ref externos, minItems fuera de [0,1], valores complejos en enum. El schema original NO se modifica. Retorna: sanitized (dict), changes (lista con path, action, reason), was_valid (bool). |
**Caso de uso típico:** Extrae entidades estructuradas de texto o genera un schema compatible con Bedrock.
---
### `mcp-fetch` — HTTP y web scraping
Realiza peticiones GET/POST, extrae texto de HTML y consume JSON.
| Tool | Qué hace |
|------|----------|
| `fetch_url` | Realiza un GET HTTP y devuelve el contenido crudo + metadatos. Parámetros: url (requerido), headers (dict opcional), timeout (segundos, default 30), max_bytes (default 5MB). Retorna: url, status_code, content_type, content, truncated, headers, elapsed_ms. |
| `fetch_post` | Realiza un POST HTTP con cuerpo JSON o form-data. Parámetros: url (requerido), json_body (dict para application/json), form_data (dict para form-urlencoded), headers, timeout, max_bytes. Solo uno de json_body o form_data puede estar presente. Retorna: url, status_code, content_type, content, truncated, headers, elapsed_ms. |
| `extract_text` | Descarga una página HTML y extrae el texto limpio (sin tags HTML, scripts ni estilos). Ideal para leer documentación: Spring Boot docs, Kafka docs, Kubernetes docs, Terraform registry, Javadoc, Stack Overflow, artículos, etc. Parámetros: url (requerido), headers, timeout, include_links (bool, default false), include_title (bool, default true). Retorna: url, title, text, word_count, links (si include_links=true), status_code. |
| `fetch_json` | Descarga una URL y parsea la respuesta como JSON. Opcionalmente navega el resultado con un path tipo 'data.items[0].name'. Ideal para consultar APIs REST: GitHub API, Docker Hub API, Kubernetes API, Terraform Cloud API, Kafka REST Proxy, Spring Boot Actuator, etc. Parámetros: url (requerido), headers, timeout, jq_path (string opcional, notación punto+índice). Retorna: url, data (JSON completo o sub-valor), status_code, path_used. |
**Caso de uso típico:** Obtén el contenido de una API REST o extrae el artículo de una página de noticias.
---
### `mcp-docker` — Gestión Docker
Lista contenedores, imágenes, logs, exec y gestiona el ciclo de vida de contenedores e imágenes.
| Tool | Qué hace |
|------|----------|
| `containers_list` | Lista contenedores Docker. Parámetros: all_containers (bool, default false = solo running), filters (dict opcional, ej: {"name": "web", "status": "running"}). Retorna: containers[], count, showing. |
| `containers_stats` | Estadísticas de recursos de un contenedor: CPU %, memoria MB, red, disco. Parámetros: container_id (ID o nombre, requerido). Retorna: cpu_percent, memory_mb, memory_limit_mb, memory_percent, net_rx_mb, net_tx_mb, block_read_mb, block_write_mb. |
| `container_logs` | Obtiene los logs de un contenedor. Parámetros: container_id (requerido), lines (int, default 100), since (str opcional, ej: '1h', '30m', '2024-01-01T10:00:00'), timestamps (bool, default false). Retorna: logs (texto), container_id, container_name, lines_requested, status. |
| `container_exec` | Ejecuta un comando dentro de un contenedor en ejecución (debe estar running). Parámetros: container_id (requerido), command (string, requerido), workdir (string opcional), user (string opcional, ej: 'root'), environment (dict opcional). Retorna: exit_code, output, success, container_id, command. |
| `run_container` | Crea y arranca un contenedor Docker. Parámetros: image (requerido, ej: 'nginx:latest'), command (string opcional), name (string opcional), detach (bool, default true = background), ports (dict container→host, ej: {'80': '8080'}), environment (dict), volumes (dict host_path→container_path), remove_on_exit (bool, default false). Retorna: id, name, status, image, ports. |
| `stop_container` | Detiene un contenedor Docker en ejecución. Parámetros: container_id (ID o nombre, requerido), timeout (int segundos antes de SIGKILL, default 10), remove (bool, si True elimina tras detener, default false). Retorna: container_id, name, action, removed. |
| `images_list` | Lista imágenes Docker locales. Parámetros: name (string opcional, filtrar por nombre/tag), dangling (bool, incluir imágenes sin tag, default false). Retorna: images[], count. |
| `image_pull` | Descarga una imagen Docker desde un registry (Docker Hub, ECR, GHCR, etc.). Parámetros: image (requerido, ej: 'nginx', 'python', 'my-registry/app'), tag (string, default 'latest'). Retorna: image, tag, id, tags[], size_mb. |
**Caso de uso típico:** Consulta logs de un contenedor o ejecuta un comando ad-hoc sin abrir la terminal.
---
### `mcp-kafka` — Apache Kafka
Lista topics, describe configuraciones, produce y consume mensajes, revisa consumer groups.
| Tool | Qué hace |
|------|----------|
| `topics_list` | Lista todos los topics del cluster Kafka. Parámetros: prefix (string opcional, filtrar por prefijo), exclude_internal (bool, default true, excluye topics __). Retorna: topics[], count, cluster_id, broker_count. |
| `topic_describe` | Describe un topic Kafka: particiones, líder, réplicas e ISR. Parámetros: topic (requerido). Retorna: topic, partition_count, replication_factor, partitions[]. |
| `consumer_groups_list` | Lista todos los consumer groups del cluster Kafka. Parámetros: prefix (string opcional, filtrar por prefijo). Retorna: groups[], count, errors[]. |
| `consumer_group_offsets` | Obtiene los offsets actuales de un consumer group. Parámetros: group_id (requerido), topics (list de strings opcional). Retorna: group_id, offsets[] (topic, partition, offset), partition_count. |
| `produce_message` | Produce un mensaje en un topic Kafka. Parámetros: topic (requerido), value (string o dict → se serializa como JSON), key (string opcional), partition (int opcional), headers (dict opcional). Retorna: topic, partition, offset, timestamp_ms, key, value_size_bytes. |
| `consume_messages` | Consume mensajes de un topic Kafka. Parámetros: topic (requerido), group_id (default 'mcp-kafka-consumer'), max_messages (int, default 50), from_beginning (bool, default false), timeout (float segundos, default 5), parse_json (bool, default true). Retorna: topic, group_id, messages[] (partition, offset, key, value, timestamp_ms, headers), count. |
**Caso de uso típico:** Depura un consumer group atascado o publica un mensaje de prueba en un topic.
---
### `mcp-project-memory` — Memoria de proyecto persistente
Mantiene estado, decisiones, tareas y snapshots entre sesiones de agentes de IA.
| Tool | Qué hace |
|------|----------|
| `get_project_state` | Retorna el estado completo del proyecto: componentes, decisiones activas, tareas pendientes, invariantes y resumen de la última sesión. LLAMA ESTE TOOL AL INICIO DE CADA SESIÓN para recuperar el contexto completo. |
| `generate_project_brief` | Genera un resumen ejecutivo del proyecto en Markdown. Ideal para iniciar una nueva sesión con un agente que no tiene contexto previo. |
| `get_component_map` | Retorna el mapa de todos los componentes del proyecto con su estado, versión, número de tools y descripción. |
| `get_decisions_history` | Retorna el historial de decisiones de arquitectura y diseño. Parámetro opcional status_filter: 'active', 'superseded' o 'rejected'. |
| `get_session_history` | Retorna el historial de sesiones de trabajo registradas, ordenadas de más reciente a más antigua. Parámetro limit: máximo de sesiones a retornar (default 20). |
| `search_memory` | Búsqueda de texto en toda la memoria del proyecto: decisiones, tareas, sesiones e invariantes. Parámetro query: texto a buscar (mínimo 2 caracteres). |
| `diff_state` | Compara el estado actual del proyecto con el estado al finalizar una sesión anterior. Muestra componentes nuevos, decisiones tomadas y tareas completadas desde esa sesión. Parámetro session_id: ID de la sesión a comparar (ej: 'SES-0003'). |
| `export_memory_snapshot` | Exporta toda la memoria del proyecto como JSON estructurado. Útil para backup, migración o inspección completa del estado. |
| `snapshot_session` | Guarda un snapshot de la sesión de trabajo actual. LLAMA ESTE TOOL AL FINALIZAR CADA SESIÓN para preservar el contexto. Parámetros: summary (resumen de lo hecho), changes_made (lista de archivos/componentes modificados), decisions_taken (int), tasks_completed (int), agent (nombre del agente). |
| `update_component_status` | Actualiza o registra un componente del proyecto. Parámetros: component_name (ej: 'mcp-tabular'), status ('draft'|'ready'|'deprecated'), version (ej: '1.0.0'), description (str), tools (int), port (int). |
| `record_decision` | Registra una decisión de arquitectura o diseño con su justificación. Parámetros: title (título conciso), rationale (justificación), alternatives_rejected (lista de alternativas descartadas), tags (lista de etiquetas). |
| `add_pending_task` | Agrega una tarea pendiente al backlog del proyecto. Parámetros: title (descripción corta), context (detalles), priority ('high'|'medium'|'low'). |
| `complete_pending_task` | Marca una tarea pendiente como completada. Parámetros: task_id (ej: 'TASK-0001'), resolution (cómo se resolvió). |
| `initialize_project` | Inicializa o actualiza los datos base del proyecto en la memoria. Idempotente: no borra sesiones ni decisiones existentes. Parámetros: project_name, description, tech_stack (lista), invariants (reglas que nunca deben violarse). |
| `sync_from_filesystem` | Escanea el filesystem del proyecto y registra automáticamente los directorios 'mcp-*' detectados como componentes en la memoria. No elimina componentes existentes. Parámetro project_root: ruta raíz del proyecto (default: directorio actual). |
**Caso de uso típico:** Recupera el contexto completo al inicio de una sesión y guárdalo al finalizar.
---
### `mcp-llm-router` — Ruteo inteligente de LLMs
Rutea tareas entre modelos locales (LM Studio) y modelos en la nube según complejidad, privacidad y tokens.
| Tool | Qué hace |
|------|----------|
| `route_task` | Analiza un prompt y decide qué modelo usar: local (LM Studio) o nube. Retorna destination, model recomendado, task_type, complexity_score (1-10), estimated_tokens y razonamiento de la decisión. Parámetros: prompt (obligatorio), context (contexto adicional), force_local (bool), force_cloud (bool). |
| `estimate_task_complexity` | Evalúa la complejidad de un prompt (score 1-10) sin tomar decisión de ruteo. Retorna complexity_score, task_type, estimated_tokens, complexity_label y factores. Parámetros: prompt, context (opcional). |
| `get_routing_config` | Retorna la configuración actual del router: modelos locales asignados por rol, modelo de nube, umbrales de complejidad y tokens, modo privacidad. |
| `get_routing_history` | Retorna el historial de decisiones de ruteo tomadas por el servidor. Muestra destination, model, task_type y complexity_score por decisión. Parámetro limit: máximo de entradas (default 50). |
| `check_lmstudio_health` | Verifica si LM Studio está corriendo y lista los modelos disponibles. Retorna status, available_models y model_count. Parámetro timeout: segundos de espera (default 5). |
| `list_local_models` | Lista todos los modelos disponibles en LM Studio con sus metadatos completos (id, object, etc.). Útil para verificar qué modelos están cargados. |
| `call_local_model` | Ejecuta un prompt directamente en un modelo local de LM Studio. Retorna response_text, tokens_used y elapsed_seconds. Parámetros: prompt, model (nombre en LM Studio), system (prompt de sistema), temperature (0-2, default 0.7), max_tokens (default 2048). |
| `call_cloud_model` | Ejecuta un prompt en el modelo de nube configurado (Anthropic o OpenAI). Requiere ROUTER_CLOUD_API_KEY configurado en el .env. Retorna response_text, tokens_used y elapsed_seconds. Parámetros: prompt, system (prompt de sistema), temperature (default 0.7), max_tokens (default 4096). |
**Caso de uso típico:** Delega una pregunta simple a un modelo local y una tarea compleja a Claude.
---
### `mcp-git` — Operaciones Git
Status, diff, log, add, commit en dos pasos, pull, push y gestión de ramas.
| Tool | Qué hace |
|------|----------|
| `get_git_status` | Retorna el estado de git: branch actual, cambios sin trackear y en stage. |
| `get_git_diff` | Retorna el diff de cambios. Parámetros: staged (bool), file_path (str opcional). |
| `get_git_log` | Retorna el historial reciente. Parámetro: max_count (int, default 10). |
| `git_add` | Agrega archivos al stage. Parámetro: files (lista de strings, o ['.'] para todos). |
| `git_reset` | Quita archivos del stage (unstage). Si no se proveen files, quita todos. |
| `git_branch` | Cambia de rama (checkout). Usa create=True para crearla (-b). |
| `prepare_commit` | PASO 1 de commit: Prepara el commit con el mensaje dado, revisa qué hay en el stage y genera un TOKEN. DEBES pedir autorización al usuario mostrando el diff antes de usar confirm_commit. |
| `confirm_commit` | PASO 2 de commit: Aplica el commit previamente preparado usando el TOKEN devuelto por prepare_commit. SOLO USAR si el usuario aprobó el diff. |
| `git_pull` | Descarga e integra cambios remotos en la rama actual (git pull). |
| `git_push` | Sube los commits locales al repositorio remoto. Para --force usa force=True. |
**Caso de uso típico:** Prepara un commit revisando el diff y confirma de forma segura.
---
### `mcp-github` — Integración GitHub
Crea issues, pull requests, comentarios y consulta diffs vía API REST de GitHub.
| Tool | Qué hace |
|------|----------|
| `github_create_issue` | Crea un issue en GitHub. Parámetros owner y repo son obligatorios si no están en .env. |
| `github_get_issue` | Obtiene información detallada de un issue por su número. |
| `github_create_pull_request` | Crea un Pull Request de la rama 'head' a 'base'. |
| `github_get_pull_request_diff` | Obtiene el diff completo de un Pull Request. |
| `github_add_issue_comment` | Agrega un comentario a un issue o Pull Request. |
**Caso de uso típico:** Abre un issue con el contexto de un error o revisa un PR desde el chat.
---
### `mcp-code-quality` — Calidad de código
Ejecuta linters, formateadores y tests sobre el proyecto.
| Tool | Qué hace |
|------|----------|
| `quality_run_lint` | Ejecuta el linter sobre el proyecto. Puedes especificar un archivo/carpeta con 'target'. |
| `quality_run_format` | Ejecuta el formateador de código. Usa check_only=True para ver qué cambiaría sin modificar. |
| `quality_run_tests` | Ejecuta los tests unitarios. Puedes pasar un archivo de tests específico con 'target'. |
**Caso de uso típico:** Verifica rápido que el código pase ruff y pytest.
---
### `mcp-architecture` — Análisis de arquitectura
Explora la estructura de un proyecto Python, analiza dependencias por AST y detecta violaciones a principios SOLID.
| Tool | Qué hace |
|------|----------|
| `arch_get_project_tree` | Retorna la estructura de carpetas y archivos del proyecto. Útil para entender la arquitectura macro. |
| `arch_analyze_dependencies` | Usa AST para extraer todas las importaciones de un archivo .py y entender su acoplamiento. |
| `arch_check_solid_principles` | Revisa un archivo buscando heurísticas como Clases Gigantes o demasiados argumentos, que violan SOLID. |
**Caso de uso típico:** Entiende el acoplamiento de un módulo nuevo o revisa si una clase cumple SOLID.
---
### `mcp-event-driven` — Event-driven architecture
Parsea esquemas de eventos, analiza coreografía y genera payloads de prueba.
| Tool | Qué hace |
|------|----------|
| `event_parse_schema` | Parsea un esquema de evento (JSON Schema o AsyncAPI) para extraer metadata y propiedades. |
| `event_analyze_choreography` | Escanea el directorio de esquemas configurado para encontrar todos los eventos registrados. |
| `event_generate_mock_payload` | Genera un payload JSON simulado para un evento, dado un arreglo de sus propiedades. |
**Caso de uso típico:** Diseña un flujo event-driven validando que los consumidores cubren todos los eventos.
---
### `mcp-orchestrator` — Orquestación de DAGs
Parsea DAGs de Airflow, valida acyclicidad y genera código boilerplate.
| Tool | Qué hace |
|------|----------|
| `orch_parse_airflow_dag` | Parsea un archivo de Python que contiene un DAG de Airflow y extrae tareas y sus dependencias (AST). |
| `orch_validate_dag` | Valida que un conjunto de aristas (dependencias) formen un grafo acíclico dirigido (DAG) válido. |
| `orch_generate_boilerplate` | Genera código Python (Airflow DAG) a partir de un dag_id y una lista de nombres de tareas. |
**Caso de uso típico:** Valida que un nuevo DAG no tenga ciclos antes de subirlo.
---
### `mcp-best-practices` — Documentación retroactiva
Mantiene actualizados docs/project-state.md y docs/servers-reference.md escaneando el repositorio.
| Tool | Qué hace |
|------|----------|
| `bp_update_project_state` | Genera o actualiza el archivo docs/project-state.md escaneando la estructura actual del proyecto. |
| `bp_update_servers_reference` | Genera o actualiza docs/servers-reference.md leyendo claude_desktop_config.json de la raíz. |
**Caso de uso típico:** Pídele que refresque la referencia de servidores tras agregar un nuevo MCP.
---
### `mcp-ci-cd` — Simulación de pipelines
Ejecuta pipelines CI/CD locales configurables sobre el repositorio.
| Tool | Qué hace |
|------|----------|
| `cicd_run_pipeline` | Ejecuta un pipeline local que incluye linting, testing y simulación de despliegue. |
**Caso de uso típico:** Corre un pipeline de validación antes de hacer commit.
---
### `mcp-design-patterns` — Patrones de diseño
Detecta anti-patrones en el código y sugiere patrones de diseño aplicables.
| Tool | Qué hace |
|------|----------|
| `dp_analyze_code_patterns` | Analiza un archivo Python (.py) para detectar posibles antipatrones como God Objects o Long Methods. |
| `dp_suggest_pattern` | Sugiere un patrón de diseño (GoF) basado en la descripción del problema de software a resolver. |
**Caso de uso típico:** Refactoriza una clase con muchas responsabilidades sugiriendo Strategy o Factory.
---
### `mcp-security-champion` — Seguridad y compliance
Audita código buscando secretos y funciones inseguras, y revisa compliance financiero básico.
| Tool | Qué hace |
|------|----------|
| `sec_audit_code` | Audita código fuente buscando hardcoded secrets o funciones inseguras (OWASP Top 10). |
| `sec_financial_compliance` | Revisa el cumplimiento de normativas financieras como PCI-DSS (enmascaramiento de datos, uso de HTTPS). |
**Caso de uso típico:** Revisa un archivo antes de commit en busca de tokens hardcodeados.
---
### `mcp-database` — Consultas SQL
Inspecciona esquemas y ejecuta queries SQL de forma controlada (read-only por defecto).
| Tool | Qué hace |
|------|----------|
| `database_info` | Sin descripción. |
| `database_list_tables` | Sin descripción. |
| `database_describe_table` | Sin descripción. |
| `database_query` | Sin descripción. |
**Caso de uso típico:** Consulta tablas de una base SQLite de analytics sin salir del chat.
---
### `mcp-filesystem` — Filesystem sandbox
Lista, lee, busca y escribe archivos dentro de una raíz configurable.
| Tool | Qué hace |
|------|----------|
| `filesystem_list` | Sin descripción. |
| `filesystem_read_text` | Sin descripción. |
| `filesystem_search` | Sin descripción. |
| `filesystem_write_text` | Sin descripción. |
**Caso de uso típico:** Lee logs o busca archivos de configuración dentro del proyecto.
---
### `mcp-object-storage` — Object Storage S3/MinIO
Lista buckets y objetos, sube/descarga texto, genera URLs presignadas y elimina objetos.
| Tool | Qué hace |
|------|----------|
| `storage_list_buckets` | Sin descripción. |
| `storage_list_objects` | Sin descripción. |
| `storage_object_metadata` | Sin descripción. |
| `storage_presign_download` | Sin descripción. |
| `storage_upload_text` | Sin descripción. |
| `storage_delete_object` | Sin descripción. |
**Caso de uso típico:** Sube un reporte JSON a S3 o genera una URL temporal de descarga.
---
### `mcp-openapi` — OpenAPI client
Descubre operaciones de una especificación OpenAPI y las invoca con un allowlist.
| Tool | Qué hace |
|------|----------|
| `openapi_list_operations` | Sin descripción. |
| `openapi_describe_operation` | Sin descripción. |
| `openapi_invoke` | Sin descripción. |
**Caso de uso típico:** Lista los endpoints de una API interna documentada en OpenAPI y llama uno permitido.
---
### `mcp-documents` — Documentos PDF/DOCX/PPTX
Extrae texto y metadatos de documentos de oficina.
| Tool | Qué hace |
|------|----------|
| `documents_extract` | Sin descripción. |
| `documents_metadata` | Sin descripción. |
**Caso de uso típico:** Resume el contenido de un contrato PDF o extrae diapositivas de una presentación.
---
### `mcp-browser` — Automatización web
Navega sitios con Playwright, extrae contenido visible y toma screenshots.
| Tool | Qué hace |
|------|----------|
| `browser_extract` | Sin descripción. |
| `browser_screenshot` | Sin descripción. |
**Caso de uso típico:** Lee el contenido de una documentación web o captura un screenshot de una UI.
---
### `mcp-kubernetes` — Kubernetes
Lista namespaces, pods y deployments, obtiene logs y escala deployments.
| Tool | Qué hace |
|------|----------|
| `kubernetes_list_namespaces` | Sin descripción. |
| `kubernetes_list_pods` | Sin descripción. |
| `kubernetes_list_deployments` | Sin descripción. |
| `kubernetes_pod_logs` | Sin descripción. |
| `kubernetes_scale_deployment` | Sin descripción. |
**Caso de uso típico:** Consulta logs de un pod en staging o escala un deployment ante pico de tráfico.
---
### `mcp-observability` — Observabilidad
Ejecuta queries PromQL y LogQL, y realiza health checks a endpoints.
| Tool | Qué hace |
|------|----------|
| `observability_prometheus_query` | Sin descripción. |
| `observability_loki_query` | Sin descripción. |
| `observability_health_check` | Sin descripción. |
**Caso de uso típico:** Consulta el error rate de las últimas horas o busca logs de un servicio.
---
### `mcp-terraform` — Infraestructura como código
Ejecuta comandos Terraform init, plan, validate y apply (deshabilitado por defecto).
| Tool | Qué hace |
|------|----------|
| `tf_run_cmd` | Ejecuta un comando Terraform en el proyecto. Provee los argumentos (ej. 'plan' o 'init'). |
**Caso de uso típico:** Valida un cambio de infraestructura con `terraform plan` antes de aplicar.
---
### `mcp-snyk` — Snyk SAST/SCA
Ejecuta `snyk test` sobre el proyecto y reporta vulnerabilidades en dependencias.
| Tool | Qué hace |
|------|----------|
| `snyk_run_test` | Ejecuta 'snyk test' en el proyecto actual y devuelve un reporte de vulnerabilidades. |
**Caso de uso típico:** Escanea vulnerabilidades de una rama antes del merge.
---
### `mcp-sonar` — SonarQube/SonarCloud
Ejecuta análisis de calidad con sonar-scanner y resume bugs, code smells y cobertura.
| Tool | Qué hace |
|------|----------|
| `sonar_run_scan` | Ejecuta 'sonar-scanner' en el proyecto actual y devuelve un resumen de calidad. |
**Caso de uso típico:** Obtén un resumen de deuda técnica del proyecto.
---
### `mcp-java-build` — Builds Java
Ejecuta comandos Maven y Gradle sobre proyectos Java.
| Tool | Qué hace |
|------|----------|
| `java_mvn` | Ejecuta un comando Maven en el proyecto. Provee los argumentos (ej. 'clean install'). |
| `java_gradle` | Ejecuta un comando Gradle en el proyecto. Provee los argumentos (ej. 'build'). |
**Caso de uso típico:** Compila un proyecto Spring Boot o ejecuta tests con Maven.
---
### `mcp-agent-runner` — Orquestación de agentes
Dispara webhooks (ej. n8n) y ejecuta scripts locales para delegar tareas a sub-agentes.
| Tool | Qué hace |
|------|----------|
| `agent_trigger_webhook` | Dispara un webhook REST HTTP (ej. n8n) enviando un payload en JSON. |
| `agent_run_local_script` | Ejecuta un sub-agente o script Python en local y espera su resultado. |
**Caso de uso típico:** Automatiza un workflow de n8n o ejecuta un script de mantenimiento desde Claude.
---
### `mcp-personal-vault` — Bóveda personal cifrada
Almacena y recupera contexto personal cifrado (preferencias, contactos, trayectoria).
| Tool | Qué hace |
|------|----------|
| `personal_vault_status` | Sin descripción. |
| `personal_upsert` | Sin descripción. |
| `personal_get` | Sin descripción. |
| `personal_list` | Sin descripción. |
| `search_personal_context` | Sin descripción. |
| `personal_delete` | Sin descripción. |
**Caso de uso típico:** Recuerda preferencias del usuario entre sesiones sin exponer datos sensibles.
---
## 5. Prerrequisitos e instalación
### Herramientas necesarias
| Herramienta | Para qué | Instalación |
|-------------|----------|-------------|
| Python 3.11+ | Ejecutar los servidores | [python.org](https://python.org) |
| **uv** | Gestor de paquetes y entornos | Ver abajo |
| Docker Desktop | Modo producción | [docker.com](https://docker.com) |
| Node.js / npx | MCP Inspector (opcional) | [nodejs.org](https://nodejs.org) |
### Instalar `uv`
`uv` es el gestor de paquetes de este proyecto. Es mucho más rápido que pip y maneja workspaces de Python.
```powershell
# Windows (PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
# Verificar instalación
uv --version# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | shClonar e instalar el proyecto
# 1. Clonar el repositorio
git clone <url-del-repo>
cd mcps
# 2. Instalar todas las dependencias (crea el entorno virtual automáticamente)
uv sync --all-packages
# 3. Instalar con dev tools (para contribuir al código)
uv sync --all-packages --all-extras
uv run pre-commit install
# 4. Crear tu archivo .env
cp .env.example .envDespués de uv sync, verás una carpeta .venv/ en la raíz. No necesitas activarla manualmente — uv run la usa automáticamente.
6. Uso local con Claude Desktop / Cursor / Windsurf
En modo local, el cliente de IA lanza cada servidor como un subproceso y se comunican por stdio (sin abrir puertos, sin red). Es la forma más simple y segura de usar los MCPs en tu máquina.
Paso 1 — Verificar que los servidores funcionan
# Prueba rápida: inicia un servidor manualmente
cd mcp-calendar
uv run python -m mcp_calendar.server
# Debería iniciar sin errores (Ctrl+C para parar)Paso 2 — Configurar Claude Desktop
Copia el archivo claude_desktop_config.json de este repositorio a la carpeta de configuración de Claude Desktop:
Sistema operativo | Ruta |
Windows |
|
macOS |
|
Importante: actualiza las rutas absolutas dentro del JSON. Busca
C:/Users/germa/Documents/IA/mcpsy reemplázalas con tu ruta real.
{
"mcpServers": {
"mcp-calendar": {
"command": "uv",
"args": [
"--directory", "C:/TU_RUTA/mcps/mcp-calendar",
"run", "python", "-m", "mcp_calendar.server"
],
"env": {
"LOG_LEVEL": "INFO",
"LOG_FORMAT": "console",
"DEFAULT_COUNTRY": "MX"
}
}
}
}Paso 3 — Reiniciar Claude Desktop
Cierra y vuelve a abrir Claude Desktop. En la barra inferior verás el icono de herramientas — al hacer click verás los MCPs disponibles y sus tools.
Configurar Cursor o Windsurf
Estos editores tienen una sección "MCP Servers" en su configuración. El formato es idéntico al de Claude Desktop.
7. Desarrollo y pruebas
Iniciar un servidor en modo desarrollo
# Opción A: modo dev con hot-reload (recomienda para desarrollo activo)
make dev-mcp-tabular
# Opción B: ejecución directa
cd mcp-tabular
uv run python -m mcp_tabular.server
# Opción C: MCP Inspector (interfaz web visual para probar tools)
make inspect SERVER=mcp-tabular
# Abre http://localhost:5173 en el navegadorEjecutar tests
# Todos los tests del workspace
make test
# Tests de un servidor específico
make test-mcp-calendar
# Tests rápidos (sin coverage, para verificar rápido)
make test-fast
# Con coverage detallado
uv run pytest --cov=. --cov-report=html
# Abre htmlcov/index.html en el navegadorLinting y formateo
# Verificar calidad del código (ruff + mypy)
make lint
# Formatear código automáticamente
make format
# Verificar que todo está en orden antes de un commit
make checkPre-commit está configurado para ejecutar estas verificaciones automáticamente antes de cada git commit.
Estructura de un servidor (para leer el código)
Cuando abres cualquier servidor, encontrarás esta estructura:
mcp-tabular/
└── src/mcp_tabular/
├── __init__.py ← versión del paquete, exports públicos
├── config.py ← Settings: todas las variables de entorno del servidor
├── server.py ← PUNTO DE ENTRADA: instancia FastMCP, registra tools
└── tools/
├── __init__.py ← exports públicos de las tools
└── tabular_tools.py ← implementación real (sin dependencias MCP)Flujo de una llamada MCP:
Cliente llama tool "read_excel"
│
▼
server.py: @mcp.tool("read_excel") ← recibe parámetros validados
│
▼
tools/tabular_tools.py: read_excel() ← lógica pura, testeable
│
▼
Resultado → serializado a JSON → devuelto al cliente8. Despliegue en producción con Docker
Los servidores corren como contenedores HTTP y Compose publica sus puertos solo
en 127.0.0.1. Para acceso remoto se requiere un reverse proxy con TLS y
autenticación; no expongas estos puertos directamente a Internet.
Configurar el entorno de producción
# 1. Crear .env de producción
cp .env.example .env
# 2. Ajustar las variables clave en .env:
# LOG_FORMAT=json (logs JSON para ELK/Datadog)
# LOG_LEVEL=INFO
# MCP_TRANSPORT=streamable-http (ya lo fija docker-compose)
# MCP_DATA_DIR=/ruta/a/tus/datosBuild y arranque
# Build de todas las imágenes (primera vez o tras cambios)
make build
# Levantar todos los servicios en background
make up
# mcp-docker requiere acceso privilegiado al socket del daemon
docker compose --profile privileged-tools up -d mcp-docker
# Kubernetes, observabilidad y Terraform
make up-platform
# Todos los perfiles opcionales, incluido S3 y Playwright
make up-extended
# Ver estado
make ps
# Ver logs en tiempo real
make logs
# Logs de un servidor específico
make logs-mcp-calendar
# Parar todo
make downPuertos expuestos
Servidor | Puerto | URL |
| 8001 |
|
| 8002 |
|
| 8003 |
|
| 8004 |
|
| 8005 |
|
| 8006 |
|
| 8007 |
|
| 8008 |
|
| 8009 |
|
| 8010 |
|
| 8011 |
|
| 8012 |
|
| 8013 |
|
| 8014 |
|
| 8015 |
|
| 8016 |
|
| 8017 |
|
| 8018 |
|
| 8019 |
|
| 8020 |
|
| 8021 |
|
| 8022 |
|
| 8023 |
|
| 8024 |
|
| 8025 |
|
| 8026 |
|
| 8027 |
|
| 8028 |
|
| 8029 |
|
| 8030 |
|
| 8031 |
|
| 8032 |
|
| 8033 |
|
| 8034 |
|
Healthcheck
Cada contenedor verifica su propia disponibilidad:
# Ver estado de salud de todos los contenedores
docker compose ps
# Verificar manualmente un servidor HTTP
python -c "import socket; socket.create_connection(('localhost', 8002), timeout=5); print('OK')"Acceso mediante reverse proxy
El endpoint público del ejemplo debe terminar TLS y exigir autenticación antes de reenviar tráfico al puerto local:
{
"mcpServers": {
"mcp-calendar": {
"transport": "streamable-http",
"url": "http://tu-servidor.com:8002/"
}
}
}9. La librería compartida mcp_shared
Todos los servidores importan de mcp_shared. No dupliques lo que ya está ahí.
BaseMcpSettings — Configuración base
La mayoría de los servidores heredan de esta clase. Markdown y Prompt Engineer mantienen settings propios compatibles con las mismas variables globales.
from mcp_shared.config import BaseMcpSettings
from pydantic import Field
class MiSettings(BaseMcpSettings):
mi_api_key: str = Field(default="", description="API key del servicio.")
max_items: int = Field(default=100, ge=1)
settings = MiSettings()
# Lee MCP_HOST, MCP_PORT, MCP_TRANSPORT, LOG_LEVEL, LOG_FORMAT, etc.
# + MCP_MI_API_KEY, MCP_MAX_ITEMS (si defines env_prefix="MCP_")Variables que hereda todo servidor de BaseMcpSettings:
Variable | Default | Descripción |
|
| Nivel de logging |
|
|
|
|
| Host del servidor HTTP |
|
| Puerto del servidor HTTP |
|
| Nombre en logs |
|
|
|
|
| Modo debug |
|
| Workers del servidor |
setup_logging — Logging estructurado
from mcp_shared.logging import setup_logging, get_logger
# Llamar UNA vez al inicio del servidor (antes de crear FastMCP)
setup_logging(
log_level=settings.log_level, # "INFO", "DEBUG", etc.
log_format=settings.log_format, # "json" o "console"
server_name="mi-servidor",
)
# En cualquier módulo:
logger = get_logger(__name__)
logger.info("Procesando archivo", path="/data/ventas.xlsx", rows=1500)En LOG_FORMAT=console (desarrollo) los logs son coloridos y legibles. En LOG_FORMAT=json (producción) son JSON de una línea, listos para ingestar en ELK o Datadog.
McpError y subclases — Errores tipados
from mcp_shared.errors import (
ValidationError, # Parámetro inválido
NotFoundError, # Recurso no encontrado
InvalidValueError, # Valor fuera de rango
ApiError, # Error de API externa
NetworkError, # Error de red
NetworkTimeoutError,# Timeout de red
)
# Uso en tools:
def mi_tool(path: str) -> dict:
if not Path(path).exists():
raise NotFoundError(resource="archivo", identifier=path)
if len(path) > 1000:
raise ValidationError(field="path", message="Ruta demasiado larga")En server.py se capturan y convierten a SdkMcpError para que el cliente MCP reciba un error estructurado:
from mcp.shared.exceptions import McpError as SdkMcpError
from mcp.types import ErrorData
from mcp_shared.errors import McpError
@mcp.tool("mi_tool")
def tool_mi_tool(path: str) -> dict:
try:
return mi_tool(path)
except McpError as exc:
raise SdkMcpError(ErrorData(code=-32000, message=str(exc)))
except Exception as exc:
raise SdkMcpError(ErrorData(code=-32603, message="Error interno del servidor."))10. Cómo crear un nuevo servidor MCP
Sigue estos pasos para agregar mcp-database (ejemplo):
Paso 1 — Crear la estructura de carpetas
mcp-database/
├── src/
│ └── mcp_database/
│ ├── __init__.py
│ ├── config.py
│ ├── server.py
│ └── tools/
│ ├── __init__.py
│ └── database_tools.py
├── tests/
│ └── test_server.py
├── Dockerfile
└── pyproject.tomlPaso 2 — pyproject.toml
[project]
name = "mcp-database"
version = "1.0.0"
requires-python = ">=3.11"
dependencies = [
"fastmcp>=2.3",
"pydantic>=2.7",
"pydantic-settings>=2.3",
"structlog>=24.1",
"mcp-shared", # librería compartida del workspace
"sqlalchemy>=2.0", # dependencia específica de este servidor
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/mcp_database"]Paso 3 — config.py
from pydantic import Field
from pydantic_settings import SettingsConfigDict
from mcp_shared.config import BaseMcpSettings
class DatabaseSettings(BaseMcpSettings):
model_config = SettingsConfigDict(
env_prefix="MCP_DB_", # lee MCP_DB_DATABASE_URL, etc.
env_file=".env",
extra="ignore",
)
database_url: str = Field(
default="sqlite:///./data.db",
description="URL de conexión a la base de datos.",
)
settings = DatabaseSettings()Paso 4 — tools/database_tools.py
# Lógica pura — sin imports de MCP ni FastMCP
from mcp_shared.errors import NotFoundError, ValidationError
def query_table(table: str, limit: int = 100) -> list[dict]:
"""Ejecuta una query SELECT sobre una tabla."""
if not table.isidentifier():
raise ValidationError(field="table", message="Nombre de tabla inválido.")
# ... implementación real
return []Paso 5 — server.py
from __future__ import annotations
from contextlib import asynccontextmanager
from typing import Any, AsyncIterator
import structlog
from fastmcp import FastMCP
from mcp.shared.exceptions import McpError as SdkMcpError
from mcp.types import ErrorData
from mcp_shared.errors import McpError
from mcp_shared.logging import get_logger, setup_logging
from mcp_database.config import settings
from mcp_database.tools.database_tools import query_table
setup_logging(
log_level=settings.log_level,
log_format=settings.log_format,
server_name="mcp-database",
)
logger = get_logger(__name__)
@asynccontextmanager
async def lifespan(server: FastMCP) -> AsyncIterator[None]:
structlog.contextvars.bind_contextvars(server_name="mcp-database")
logger.info("Servidor mcp-database iniciando", db_url=settings.database_url)
yield
logger.info("Servidor mcp-database detenido")
mcp = FastMCP(
name="mcp-database",
instructions="Servidor MCP para consultar bases de datos.",
lifespan=lifespan,
)
@mcp.tool(
name="query_table",
description="Ejecuta SELECT sobre una tabla. Parámetros: table (str), limit (int, default 100).",
)
def tool_query_table(table: str, limit: int = 100) -> list[dict[str, Any]]:
try:
return query_table(table=table, limit=limit)
except McpError as exc:
raise SdkMcpError(ErrorData(code=-32000, message=str(exc)))
except Exception as exc:
raise SdkMcpError(ErrorData(code=-32603, message="Error interno del servidor."))
if __name__ == "__main__":
if settings.mcp_transport == "streamable-http":
mcp.run(transport="streamable-http", host=settings.mcp_host, port=settings.mcp_port)
else:
mcp.run(transport="stdio")Paso 6 — Registrar en el workspace
pyproject.toml (raíz):
[tool.uv.workspace]
members = [
"shared",
"mcp-tabular",
"mcp-calendar",
"mcp-markdown",
"mcp-prompt-engineer",
"mcp-database", # ← agregar aquí
]docker-compose.yml:
mcp-database:
build:
context: .
dockerfile: mcp-database/Dockerfile
target: runtime
image: mcp-database:latest
container_name: mcp-database
restart: unless-stopped
env_file: .env
environment:
MCP_TRANSPORT: streamable-http
MCP_HOST: "0.0.0.0"
MCP_PORT: "8005"
ports:
- "127.0.0.1:8009:8005"
healthcheck:
test: ["CMD", "python", "-c", "import socket; socket.create_connection(('localhost', 8005), timeout=5)"]
interval: 30s
timeout: 10s
retries: 3
start_period: 15sclaude_desktop_config.json:
"mcp-database": {
"command": "uv",
"args": [
"--directory", "C:/TU_RUTA/mcps/mcp-database",
"run", "python", "-m", "mcp_database.server"
],
"env": { "LOG_LEVEL": "INFO", "LOG_FORMAT": "console" }
}Paso 7 — Sincronizar e instalar
uv sync --all-packages
make test-mcp-database11. Variables de entorno de referencia
Copia .env.example a .env y ajusta según tu entorno.
Variables globales (todos los servidores)
Variable | Default | Descripción |
|
|
|
|
| Host del servidor HTTP |
|
| Puerto base (docker-compose asigna uno por servidor) |
|
|
|
|
|
|
|
| Directorio de datos montado en Docker |
Variables específicas por servidor
Variable | Servidor | Descripción |
|
| Máximo de filas retornadas en una respuesta sin paginación. Si el archivo tiene más filas, se trunca y se indica en 'truncated'. Variable de entorno: TABULAR_MAX_ROWS_PREVIEW. |
|
| Tamaño máximo permitido de archivo en MB. Archivos más grandes serán rechazados con un error descriptivo. Variable de entorno: TABULAR_MAX_FILE_SIZE_MB. |
|
| Encoding por defecto para archivos CSV y TSV cuando no se puede detectar automáticamente con chardet. Ejemplos: 'utf-8', 'latin-1', 'cp1252'. Variable de entorno: TABULAR_DEFAULT_ENCODING. |
|
| Número de valores de muestra a incluir por columna en la respuesta. Variable de entorno: TABULAR_SAMPLE_VALUES_COUNT. |
|
| Umbral mínimo de confianza para aceptar la detección de encoding con chardet. Si la confianza es menor, se usa default_encoding. Variable de entorno: TABULAR_CHARDET_CONFIDENCE_THRESHOLD. |
|
| Directorio raíz opcional al que se restringe el acceso a archivos. Variable de entorno: TABULAR_ALLOWED_ROOT. |
|
| Código de país ISO 3166-1 alpha-2 usado por defecto en todas las operaciones de calendario cuando no se especifica explícitamente. Variable de entorno: DEFAULT_COUNTRY. |
|
| Tiempo de vida del caché de tasas de cambio en segundos. Rango válido: 60–86400 (1 minuto a 24 horas). Variable de entorno: EXCHANGE_CACHE_TTL_SECONDS. |
|
| Nombre del servidor MCP. |
|
| Versión del servidor. |
|
| Tamaño máximo permitido de archivo Markdown en MB. |
|
| Extensiones de archivo reconocidas como Markdown. |
|
| Profundidad máxima por defecto para la tabla de contenidos. |
|
| Si True, valida que los enlaces externos respondan (requiere red). |
|
| Directorio raíz opcional al que se restringe el acceso a archivos. Variable: MCP_MARKDOWN_ALLOWED_ROOT. |
|
| Longitud máxima del prompt en caracteres. |
|
| Número máximo de variaciones a generar. |
|
| Número por defecto de variaciones a generar. |
|
| Modelo por defecto para estimación de tokens. |
|
| Directorio de caché para modelos tiktoken (opcional). |
|
| Nombre del servidor MCP. |
|
| Versión del servidor MCP. |
|
| Región AWS por defecto para Bedrock. Variable: MCP_SO_AWS_REGION. |
|
| Perfil AWS opcional (boto3 credential chain). Variable: MCP_SO_AWS_PROFILE. |
|
| Proveedor por defecto: bedrock-converse |
|
| ID del modelo por defecto. Variable: MCP_SO_DEFAULT_MODEL_ID. |
|
| Max tokens por defecto. Variable: MCP_SO_DEFAULT_MAX_TOKENS. |
|
| Temperature por defecto (0.0 recomendado para structured output). Variable: MCP_SO_DEFAULT_TEMPERATURE. |
|
| URL base para endpoints OpenAI-compatible. Variable: MCP_SO_OPENAI_BASE_URL. |
|
| API key para endpoints OpenAI-compatible. Variable: MCP_SO_OPENAI_API_KEY. |
|
| Timeout en segundos para peticiones HTTP. Variable: MCP_FETCH_DEFAULT_TIMEOUT. |
|
| Tamaño máximo de respuesta en bytes (default 5 MB). Variable: MCP_FETCH_MAX_CONTENT_LENGTH. |
|
| User-Agent enviado en peticiones. Variable: MCP_FETCH_USER_AGENT. |
|
| Seguir redirecciones HTTP. Desactivado por defecto para reducir riesgo SSRF. Variable: MCP_FETCH_FOLLOW_REDIRECTS. |
|
| Permitir destinos loopback, privados, link-local o reservados. Variable: MCP_FETCH_ALLOW_PRIVATE_NETWORKS. |
|
| Verificar certificados SSL. Variable: MCP_FETCH_VERIFY_SSL. |
|
| URL del daemon Docker. None = usa DOCKER_HOST del entorno o socket por defecto. Variable: MCP_DOCKER_DOCKER_HOST. Ej: unix:///var/run/docker.sock o tcp://host:2376 |
|
| Número de líneas de logs a retornar por defecto. Variable: MCP_DOCKER_LOG_LINES. |
|
| Timeout en segundos para exec en contenedor. Variable: MCP_DOCKER_EXEC_TIMEOUT. |
|
| Brokers Kafka (comma-separated). Variable: MCP_KAFKA_BOOTSTRAP_SERVERS. Ej: localhost:9092 o broker1:9092,broker2:9092 |
|
| Protocolo de seguridad: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL. Variable: MCP_KAFKA_SECURITY_PROTOCOL. |
|
| Mecanismo SASL: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512. Variable: MCP_KAFKA_SASL_MECHANISM. |
|
| Usuario SASL. Variable: MCP_KAFKA_SASL_USERNAME. |
|
| Contraseña SASL. Variable: MCP_KAFKA_SASL_PASSWORD. |
|
| Ruta al CA certificate para SSL. Variable: MCP_KAFKA_SSL_CA_LOCATION. |
|
| Timeout en segundos para consumir mensajes. Variable: MCP_KAFKA_CONSUME_TIMEOUT. |
|
| Número máximo de mensajes a consumir por llamada. Variable: MCP_KAFKA_MAX_CONSUME_MESSAGES. |
|
| Timeout en segundos para operaciones admin (list topics, etc.). Variable: MCP_KAFKA_ADMIN_TIMEOUT. |
|
| Directorio donde se almacena el archivo JSON de memoria del proyecto. Puede ser relativo al directorio de trabajo o absoluto. Variable de entorno: MEMORY_DIR. |
|
| Nombre del archivo JSON que almacena la memoria del proyecto. Variable de entorno: MEMORY_FILE. |
|
| Nombre del proyecto para identificación en los metadatos. Variable de entorno: MEMORY_PROJECT_NAME. |
|
| Si es true, sincroniza automáticamente el estado de componentes con el filesystem al leer el estado del proyecto. Variable de entorno: MEMORY_AUTO_SYNC. |
|
| Ruta raíz del proyecto para sincronización con el filesystem. Variable de entorno: MEMORY_PROJECT_ROOT. |
|
| Número máximo de sesiones a conservar en el historial. Las más antiguas se eliminan al superar el límite. Variable de entorno: MEMORY_MAX_SESSIONS. |
|
| URL base de la API de LM Studio (compatible con OpenAI). Variable de entorno: ROUTER_LMSTUDIO_BASE_URL. |
|
| Umbral de complejidad (1-10) por encima del cual se usa la nube. Tareas con score >= threshold van a la nube. Variable de entorno: ROUTER_COMPLEXITY_THRESHOLD. |
|
| Número máximo de tokens estimados para usar modelo local. Si la tarea requiere más tokens, se ruta a la nube. Variable de entorno: ROUTER_MAX_LOCAL_TOKENS. |
|
| Si es true, fuerza el uso de modelos locales siempre. Nunca envía datos a la nube, independientemente de la complejidad. Variable de entorno: ROUTER_PRIVACY_MODE. |
|
| Número máximo de entradas a conservar en el historial de ruteo. Variable de entorno: ROUTER_HISTORY_MAX. |
|
| Modelo local rápido para tareas simples (< complexity 3, < 2K tokens). Ejemplo: qwen3-8b. Variable de entorno: ROUTER_MODEL_FAST. |
|
| Modelo local especializado en código. Usado para generación, review y refactoring de código. Variable de entorno: ROUTER_MODEL_CODE. |
|
| Modelo local con capacidades de razonamiento (chain-of-thought). Usado para análisis complejos que no requieren la nube. Variable de entorno: ROUTER_MODEL_REASON. |
|
| Modelo local con ventana de contexto grande (1M tokens). Usado para tareas con mucho contexto que pueden hacerse localmente. Variable de entorno: ROUTER_MODEL_LARGE. |
|
| Proveedor de modelos en la nube: 'anthropic' o 'openai'. Variable de entorno: ROUTER_CLOUD_PROVIDER. |
|
| Nombre del modelo de nube a usar para tareas complejas. Variable de entorno: ROUTER_CLOUD_MODEL. |
|
| API key del proveedor de nube. Dejar vacío si solo se usa local. Variable de entorno: ROUTER_CLOUD_API_KEY. |
|
| Timeout en segundos para llamadas a LM Studio. Variable: ROUTER_LMSTUDIO_TIMEOUT_SECONDS. |
|
| Timeout en segundos para llamadas a la nube. Variable: ROUTER_CLOUD_TIMEOUT_SECONDS. |
|
| Ruta al repositorio Git sobre el que operará el servidor. Variable de entorno: GIT_REPO_PATH. |
|
| Nombre de la rama principal por defecto. Variable de entorno: GIT_DEFAULT_BRANCH. |
|
| Si es true, permite al agente usar push --force (peligroso). Variable de entorno: GIT_ALLOW_FORCE_PUSH. |
|
| Personal Access Token (PAT) de GitHub para autenticación. Requerido para la mayoría de operaciones. Variable de entorno: GITHUB_TOKEN. |
|
| Usuario u organización propietaria del repositorio. Variable de entorno: GITHUB_OWNER. |
|
| Nombre del repositorio objetivo principal. Variable de entorno: GITHUB_REPO. |
|
| URL base de la API de GitHub. Útil para GitHub Enterprise Server. Variable de entorno: GITHUB_API_URL. |
|
| Timeout para peticiones a la API en segundos. |
|
| Ruta base del proyecto a analizar. |
|
| Comando usado para linting de código. |
|
| Comando usado para formateo de código. |
|
| Comando usado para correr tests unitarios. |
|
| Ruta base del proyecto a analizar. |
|
| Ruta donde se almacenan los esquemas de eventos. |
|
| Ruta donde se almacenan los archivos de DAGs. |
|
| Ruta base del proyecto. |
|
| Ruta donde se almacenará la documentación retroactiva. |
|
| Ruta base del proyecto. |
|
| Comando de test. |
|
| Comando de lint. |
|
| Comando de despliegue. |
|
| Ruta base del proyecto. |
|
| Ruta base del proyecto. |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| Ruta base donde están los archivos .tf. |
|
| Ruta base del proyecto. |
|
| Token de API de Snyk (opcional para CLI auth global). |
|
| Ruta base del proyecto. |
|
| URL del servidor SonarQube. |
|
| Token de API de SonarQube. |
|
| Ruta base del proyecto Java. |
|
| Ruta base del proyecto. |
|
| URL base para webhooks de n8n. |
|
| Token opcional para autenticar webhooks de n8n. |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — |
12. Referencia de comandos Makefile
# Setup
make install # Instala todas las dependencias (uv sync)
make install-dev # Instala con dev tools + pre-commit
make setup-env # Crea .env desde .env.example
make status # Verifica herramientas instaladas
# Desarrollo
make dev-mcp-tabular # Inicia servidor con hot-reload
make run-mcp-calendar # Ejecuta directamente un servidor
make inspect SERVER=mcp-tabular # Abre MCP Inspector visual
# Testing
make test # Todos los tests con coverage
make test-mcp-calendar # Tests de un servidor específico
make test-fast # Tests rápidos sin coverage
# Calidad de código
make lint # ruff check + mypy
make format # ruff format + ruff check --fix
# Docker (producción)
make build # Build todas las imágenes
make build-mcp-tabular # Build una imagen específica
make up # Levantar servicios sin acceso al socket Docker
docker compose --profile privileged-tools up -d mcp-docker
make down # Parar todos los servicios
make logs # Ver logs en tiempo real
make logs-mcp-calendar # Logs de un servidor
make ps # Estado de los contenedores
make restart # down + up
# Utilidades
make claude-config # Muestra cómo configurar Claude Desktop
make clean # Limpia __pycache__, .pytest_cache, etc.
make help # Lista todos los comandos disponibles13. Convenciones y estándares de código
Python
Versión mínima: Python 3.11 (se usan
match,str | None,TypeAlias, etc.)Tipos: tipo hints en todas las funciones públicas (
ANNactivado en ruff)Strings: dobles
"siempreLongitud de línea: 100 caracteres
Imports: agrupados y ordenados por isort (
Ien ruff)
Naming
Funciones de tool (en
server.py): prefijotool_→tool_read_excelFunciones de lógica pura (en
tools/*.py): sin prefijo →read_excelClases de configuración:
SettingsoXSettings(ej:CalendarSettings)Variables de entorno:
UPPER_SNAKE_CASE
Errores
Usa siempre las clases de
mcp_shared.errorsen la capa de toolsConvierte a
SdkMcpErrorsolo enserver.pyNunca hagas
raise Exception("mensaje vago")— usa la clase específica
Logging
Llama
setup_logging()una sola vez al inicio deserver.pyObtén loggers con
get_logger(__name__)— no usesprint()Incluye contexto estructurado:
logger.info("msg", key=value, otro=valor)En la capa de tools, no hagas logging — solo en
server.py
Tests
Cada servidor tiene su carpeta
tests/Tests unitarios de
tools/*.py: no requieren servidor MCPCobertura mínima: 55% (configurado en
pyproject.toml)
14. Preguntas frecuentes (FAQ)
¿Por qué uv y no pip o poetry?
uv es entre 10x y 100x más rápido que pip, maneja workspaces de Python nativamente (un solo uv sync instala todos los paquetes de todos los servidores) y genera lock files reproducibles. En Docker usamos la imagen oficial de ghcr.io/astral-sh/uv para el stage de build.
¿Qué es un "workspace" de uv?
Un workspace permite tener múltiples paquetes Python en un repositorio y que se referencien entre sí. El pyproject.toml raíz declara los miembros. mcp_shared se instala como un paquete real disponible para todos los servidores, sin necesidad de sys.path hacks.
¿Puedo usar los MCPs desde código Python propio (sin Claude Desktop)?
Sí. Con MCP_TRANSPORT=streamable-http cada servidor expone un endpoint HTTP estándar. Puedes conectarte con el cliente oficial:
from fastmcp import Client
async with Client("http://localhost:8002/") as client:
result = await client.call_tool("calculate_business_days", {
"start_date": "2025-01-01",
"end_date": "2025-03-31",
})¿Por qué los Dockerfiles usan usuarios no-root? Buena práctica de seguridad. Si un atacante logra ejecutar código dentro del contenedor, no tiene privilegios de root en el host. Todos los Dockerfiles crean un usuario con UID 1001.
¿Cómo depuro si una tool falla en producción?
# 1. Ver logs del contenedor
make logs-mcp-calendar
# 2. Los logs JSON tienen: tool, error_code, error_type, mensaje
# 3. Para debug más detallado, agrega MCP_DEBUG=true y LOG_LEVEL=DEBUG en .env
# 4. Reiniciar con: make restart¿FastMCP v1 o v2?
Este proyecto usa FastMCP v2 (fastmcp>=2.3, paquete standalone). La v1 venía incluida en mcp[cli] de Anthropic. La v2 tiene mejor soporte para transporte HTTP, mejor manejo del lifespan y una API más limpia.
¿Qué pasa si MCP_TRANSPORT no está definido?
El default es stdio. El servidor arranca en modo local. Nunca fallará por falta de esta variable.
¿Puedo agregar autenticación al transporte HTTP? Sí. FastMCP v2 soporta middleware ASGI. Para producción se recomienda poner un reverse proxy (nginx, Caddy) con autenticación delante de los servidores MCP, en lugar de manejar auth dentro del servidor.
Última actualización: junio 2026 — FastMCP v2, Python 3.11+, uv workspaces
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- -license-quality-maintenanceA comprehensive production-ready MCP server with AI integration, plugin management, and web-based administration. Features multi-database support, RAG capabilities, SSH/SFTP access, and a built-in plugin hub for managing the MCP ecosystem.Last updated
- -license-quality-maintenanceA production-ready TypeScript MCP server providing basic tools (add, echo, timestamp), resources (server info, greetings, data access), and prompt templates (analyze, code-review, summarize). Serves as a foundation for building custom MCP servers with extensible architecture.Last updated307
- Alicense-qualityDmaintenanceProduction-ready MCP server enabling LLM text generation, template management, context-aware conversations, and memory storage with enterprise quality assurance.Last updated432MIT
- Alicense-qualityCmaintenanceEasiest framework for building MCP servers with automatic discovery of tools, prompts, and resources, plus enterprise-grade authentication and telemetry.Last updated835Apache 2.0
Related MCP Connectors
MCP server for generating rough-draft project plans from natural-language prompts.
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Markdown-first MCP server for Notion API with 8 composite tools and 39 actions.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/inggerman/mcps'
If you have feedback or need assistance with the MCP directory API, please join our Discord server