IDICO IDRA MCP
Servidor MCP construido con FastMCP para exponer consultas analíticas de ventas, operaciones y desempeño comercial a partir de NetSuite y PostgreSQL. El servicio entrega respuestas resumidas listas para consumo por clientes MCP y, cuando aplica, guarda datasets completos en data/ para consultas posteriores o exportación a Excel.
Qué hace este proyecto
Este repositorio centraliza consultas predefinidas y transformaciones en pandas para responder preguntas de negocio como:
- cotizaciones por Inside Sales o cliente
- bookings y margen por periodo
- oportunidades y conversión comercial
- items cotizados o vendidos
- scorecards y performance de Inside Sales
- OTD, guías Helga e importaciones por cliente
- recuperación de datasets JSON y archivos Excel generados por tools previas
La aplicación se publica como un servidor MCP HTTP en:
- host:
0.0.0.0 - puerto:
8000 - transporte:
streamable-http - endpoint:
/mcp
Arquitectura
Flujo general:
main.pyregistra todas las tools MCP.tools/encapsula los casos de uso expuestos al cliente MCP.connections/construye y ejecuta consultas contra NetSuite y PostgreSQL.analitycs/transforma los resultados tabulares en resúmenes JSON.utils/guarda datasets, genera Excel y resuelve utilidades de fechas.
Componentes principales:
main.py: arranque del servidor MCP y registro de tools.tools/sales.py: tools comerciales y de ventas.tools/operations.py: tools operativas.tools/performance.py: tools de performance y scorecards.tools/files.py: acceso a datasets JSON y archivos Excel generados.connections/netsuite.py: conexión JDBC a NetSuite usandojaydebeapiyNQjc.jar.connections/postgresql.py: ejecución de consultas en PostgreSQL.data/: datasets JSON y Excel generados en tiempo de ejecución.
Requisitos
- Python
>= 3.10.12 - Java/JDK disponible para el driver JDBC de NetSuite
- Acceso de red a NetSuite y PostgreSQL
- Variables de entorno configuradas para ambas conexiones
Dependencias principales definidas en pyproject.toml:
fastmcpmcp[cli]pandasopenpyxljaydebeapipsycopg[binary]python-dotenv
Variables de entorno
El proyecto carga variables desde .env para NetSuite mediante load_dotenv(). PostgreSQL se lee desde variables de entorno del proceso.
NetSuite
Variables requeridas por connections/netsuite.py:
DRIVER_NETSUITEURL_NETSUITEUSER_NETSUITEPWD_NETSUITE
El driver JDBC se toma desde:
PostgreSQL
Variables usadas por connections/postgresql.py:
PGHOSTPGHOST_DEVPGPORTPGDATABASEPGUSERPGPASSWORD
Notas:
execute_pg_query()usaPGHOST.execute_pg_query_dev()usaPGHOST_DEV.- varias tools operan actualmente contra
PGHOST_DEV.
Instalación y ejecución local
Opción 1: usando uv
uv sync
uv run main.pyOpción 2: usando pip
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python main.pySi todo está configurado correctamente, el servidor quedará escuchando en http://localhost:8000/mcp.
Ejecución con Docker
Build y arranque
docker compose up --buildLa composición actual:
- expone
8000:8000 - carga variables desde
.env - usa una imagen basada en
python:3.12-slim - instala
default-jdk-headlesspara soportar el driver JDBC de NetSuite
Archivos relacionados:
Catálogo de tools
Los nombres públicos de las tools corresponden a los nombres de función registrados en main.py.
Sales
| Tool | Parámetros | Descripción |
|---|---|---|
get_quotes | initial_date, final_date, inside_sales, customer_name | Resume cotizaciones por periodo, Inside Sales y cliente. Genera dataset JSON y archivo Excel. |
get_bookings | initial_date, final_date, customer_name, inside_sales | Resume bookings, margen, términos, top clientes y KPIs agregados. Genera dataset JSON. |
get_quoted_items | initial_date, final_date, customer_name, inside_sales | Analiza items cotizados por cliente, marca, vendor e Inside Sales. Genera dataset JSON. |
get_sold_items | initial_date, final_date, customer_name, inside_sales | Analiza items vendidos, marcas, vendors y distribución comercial. Genera dataset JSON. |
get_opportunities | initial_date, final_date, inside_sales | Resume oportunidades por periodo e Inside Sales. Genera dataset JSON. |
get_vendors_to_quote | customer_name, brand | Sugiere vendors a cotizar combinando histórico por cliente/marca y país/marca desde PostgreSQL. |
Operations
| Tool | Parámetros | Descripción |
|---|---|---|
get_helga_guides | po, status, service | Recupera guías Helga filtradas por PO, estado o servicio. Genera dataset JSON. |
get_otd_indicators | initial_date, final_date, so_number | Calcula indicadores OTD por mes y, si se envía so_number, devuelve detalle de la orden. Genera dataset JSON. |
get_customer_imports | customer_name | Resume importaciones de un cliente: montos FOB/CIF, marcas, vendors, años e indicadores asociados. |
Performance
| Tool | Parámetros | Descripción |
|---|---|---|
get_inside_sales_performance_report | initial_date, final_date | Calcula tiempos de respuesta, hitrates y score de performance de Inside Sales. Genera dataset JSON. |
get_scorecard_by_is | inside_sales | Devuelve scorecards diario, mensual y anual desde PostgreSQL. |
Files
| Tool | Parámetros | Descripción |
|---|---|---|
get_dataset | data_set_reference | Recupera un dataset JSON generado previamente. |
get_excel_file | file_name | Devuelve un archivo .xlsx previamente generado. Incluye validación contra path traversal. |
Comportamiento por defecto de fechas
Las tools no usan exactamente la misma ventana por defecto. Según implementación:
get_quotes: hoy a hoyget_opportunities: hoy a hoyget_inside_sales_performance_report: hoy a hoyget_bookings: primer día del mes actual a hoyget_quoted_items: primer día del mes actual a hoyget_sold_items: primer día del mes actual a hoyget_otd_indicators: primer día del mes actual a hoy
El helper que define estas fechas está en utils/date.py.
Datasets y archivos generados
Varias tools persisten el resultado completo de las consultas para poder reutilizarlo después.
JSON
Los datasets se guardan en data/ con nombre timestamped, por ejemplo:
20260129_152522_get_quotes.jsonLa estructura es:
{
"data_set_description": "Descripción del dataset",
"columns": ["col1", "col2"],
"rows": [
["valor1", "valor2"]
]
}Excel
Algunas tools también exportan el DataFrame completo a .xlsx, por ejemplo:
20260129_152522_get_quotes.xlsxLa lógica de persistencia está en:
Detalles operativos importantes
- El servidor registra las tools con
readOnlyHint=TrueydestructiveHint=False. - El proyecto no expone escritura sobre bases de datos; las tools actuales son de consulta y análisis.
- Las consultas SQL están predefinidas en
connections/netsuite_querys.pyyconnections/postgresql_querys.py. - Algunas tools guardan referencias al dataset completo bajo la clave
full_data_reference. get_quotestambién devuelveexcel_filecuando genera una exportación.
Desarrollo
Script auxiliar disponible:
test.py: script manual de prueba y exploración local. No corresponde a una suite automatizada formal.
Estado actual del repositorio:
- no se detectó una carpeta de tests automatizados
- la documentación debe considerarse alineada con la implementación actual de
main.pyytools/
Sugerencia de .env
Ejemplo mínimo:
DRIVER_NETSUITE=...
URL_NETSUITE=...
USER_NETSUITE=...
PWD_NETSUITE=...
PGHOST=...
PGHOST_DEV=...
PGPORT=5432
PGDATABASE=...
PGUSER=...
PGPASSWORD=...