Skip to main content
Glama
andreykutsenko

mcp-shop-server

mcp-shop-server

Servidor MCP que da al agente de IA acceso de solo lectura a la base de datos SQLite de una tienda en línea (customers, products, orders, order_items). A través de él, el agente responde a preguntas analíticas sobre los datos: estructura de la base, agregados por clientes, productos, categorías e ingresos. El transporte es stdio.

La escritura en la base es imposible por diseño: tres capas de protección independientes: conexión mode=ro, validación de la consulta antes de la ejecución (solo SELECT / WITH ... SELECT) y sqlite3-authorizer.

Mediciones, pruebas y desviaciones del pliego de condiciones — en REPORT.md.


Uso

1. Clonar

git clone https://github.com/andreykutsenko/mcp-shop-server.git
cd mcp-shop-server

En el repositorio ya está shop.db (150 clientes, 50 productos, 750 pedidos, 1900 posiciones).

2. Instalar dependencias

uv venv .venv
uv pip install --python .venv/bin/python -r requirements.txt

Sin uv — lo mismo con las herramientas estándar:

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt

Se requiere Python 3.11+. Dependencias: mcp (SDK oficial de MCP) y pytest para las pruebas; el trabajo con la base — con sqlite3 de la biblioteca estándar.

3. Configurar en el agente

Forma mínima de configuración:

{
  "command": "python",
  "args": ["/absolute/path/to/mcp-shop-server/server.py"]
}

Ejemplo funcional para un cliente con el bloque mcpServers (Claude Desktop, Cursor y compatibles):

{
  "mcpServers": {
    "shop-db": {
      "command": "/absolute/path/to/mcp-shop-server/.venv/bin/python",
      "args": ["/absolute/path/to/mcp-shop-server/server.py"],
      "env": {
        "MCP_SHOP_DB": "/absolute/path/to/mcp-shop-server/shop.db"
      }
    }
  }
}

Para Claude Code basta un solo comando:

claude mcp add shop-db -- /absolute/path/to/mcp-shop-server/.venv/bin/python /absolute/path/to/mcp-shop-server/server.py

MCP_SHOP_DB es opcional: si la variable no está definida, el servidor toma shop.db junto a server.py. Indíquela si la base está en otro lugar. Es mejor indicar el intérprete desde .venv — de lo contrario, el python del sistema puede no encontrar el paquete mcp.

4. Ejecución

El servidor lo inicia el agente; manualmente rara vez se necesita:

.venv/bin/python server.py

El proceso espera en silencio JSON-RPC en stdin; el diagnóstico va a stderr, stdout está ocupado por el protocolo MCP.

5. Verificación y preguntas al agente

.venv/bin/python -m pytest -q

Tras la conexión, el agente ve tres herramientas. Las preguntas se formulan en lenguaje natural.

Ocho tareas del texto de la tarea — son las que conviene ejecutar para la verificación:

1. Show me all available tables and explain what information each table contains.
2. How many customers are from Germany?
3. Which country has the most customers?
4. Who is the customer who spent the most money?
5. What are the top 5 best-selling products?
6. What are the top 3 product categories by revenue?
7. How much revenue did we generate in 2025?
8. Which customer placed the most orders?

⚠️ Las tareas 2, 3 y 7 en la base suministrada no tienen solución, y esto es esperable. En customers no hay columna de país — los 150 clientes tienen teléfonos rusos; los 750 pedidos están fechados en 2026, no hay datos de 2025.

En este caso, el servidor no inventa datos: informa que ese campo no existe en el esquema y enumera las columnas existentes. Nada está codificado — el esquema se lee de la base, por lo que en otra base donde country exista, las mismas preguntas funcionarán con normalidad.

Además se verifican preguntas que la base cubre por completo: top-5 clientes por importe de pedidos, ingresos por categorías, distribución de pedidos por estados, ticket medio, existencias de productos.

Verificación de la protección contra escritura. Ante «Delete all cancelled orders» el agente recibe una negativa clara, no un error: el servidor solo funciona en lectura, los 102 pedidos cancelados permanecen en su lugar.

Herramientas

Herramienta

Función

list_tables()

Todas las tablas con su propósito, número de filas, columnas, relaciones, lista de estados de pedidos y formato de fechas.

describe_table(table)

Columnas reales con tipos, claves externas en ambas direcciones y un ejemplo de fila.

run_select_query(sql, limit=100, offset=0)

Ejecutar un SELECT (o WITH ... SELECT) y devolver filas paginadas.

La salida está limitada: por defecto 100 filas, máximo 1000. Al truncar, la respuesta informa cuántas filas se devolvieron, cuántas se encontraron en total y con qué offset seguir leyendo.

Si el campo solicitado no existe en la base (por ejemplo, el país del cliente), el servidor lo dice honestamente y enumera las columnas existentes — no inventa campos inexistentes.


Related MCP server: Shop Analytics MCP Server

Cómo está hecho

El proyecto se generó con un solo prompt — el archivo SPEC-mcp-shop.md, enviado al agente completo, sin aclaraciones posteriores.

Internamente, el agente trabajó en un ciclo según la habilidad repo-task-proof-loop (Denis Shiryaev, Apache-2.0): congelación de la especificación → construcción → empaquetado de pruebas → verificación con una sesión nueva → corrección mínima → verificación de nuevo, hasta el veredicto PASS.

Las pruebas de la ejecución están en el repositorio, en .agent/tasks/mcp-shop-server/:

  • spec.md — especificación congelada con criterios de aceptación AC1…AC17;

  • evidence.md / evidence.json — para cada criterio, veredicto y prueba concreta;

  • verdict.json — resultado de la verificación independiente con una sesión nueva;

  • problems.md — discrepancias encontradas por el verificador;

  • raw/ — registros brutos de las ejecuciones: pruebas, sesión MCP en vivo, verificación de la limpieza de stdout.

No se verifica el código fuente, sino el comportamiento del servidor con un agente real: el harness raw/mcp_session_check.py levanta server.py por stdio con un cliente MCP real, llama a todas las herramientas, ejecuta las ocho tareas analíticas, recibe la negativa ante el borrado y comprueba que stdout contenga solo marcos JSON-RPC.

La propia habilidad de desarrollo está localmente en .claude/skills/ y no se commitea al repositorio — es código de terceros.


Decisiones tomadas sobre ambigüedades del pliego

#

Ambigüedad

Decisión

1

«El agente responde a las ocho tareas del pliego» — la lista de las ocho tareas no se da en el pliego.

Las ocho preguntas analíticas se deducen de la sección <objective> («estructura de la base, agregados por clientes, productos, categorías e ingresos») y se fijan en la sección «Verificación y preguntas al agente» anterior. Cada una se ejecuta a través de las herramientas del servidor en .agent/tasks/mcp-shop-server/raw/test-integration.txt.

2

La versión del SDK de MCP no está fijada.

Se toma la línea actual mcp>=2.1,<3 (API MCPServer). En mcp 1.x la clase se llamaba FastMCP; el límite superior está fijado para que la instalación sea reproducible.

3

«Máximo 1000 filas» — no se dice si es un error o un truncamiento.

limit mayor que 1000 no se considera error: el valor se limita a 1000 y se informa en el campo notes. Solo se consideran errores limit < 1 y offset negativo.

4

«Cuántas se encontraron en total» con una consulta sin límite.

El resultado del cursor se calcula por completo, pero no más de 100 000 filas; si la consulta devuelve más, total_is_exact=false y en la respuesta aparece «al menos N». Así, un número honesto no se convierte en riesgo de cuelgue.

5

El authorizer prohíbe todo excepto lectura, pero describe_table necesita PRAGMA table_info.

El authorizer solo permite tres pragmas de solo lectura (table_info, foreign_key_list, index_list). Un PRAGMA de usuario en cualquier forma se rechaza ya en la segunda capa — el validador, antes de la ejecución.

6

El formato de respuesta de las herramientas no está definido.

Todas las herramientas devuelven un objeto estructurado con el campo ok. La negativa y el error son ok=false con explicación textual, no una excepción de MCP: el agente lo lee como respuesta, no como fallo de transporte.

7

Los nombres de las herramientas y su composición («el conjunto lo diseñas tú»).

Se mantiene el mínimo recomendado de tres herramientas exactamente con los nombres list_tables, describe_table, run_select_query: todo lo demás (agregados, tops, cortes por años) se expresa mediante run_select_query; herramientas estrechas adicionales solo inflarían el contexto.

8

Punto y coma al final de la consulta.

Se permite el ; final — es una sola instrucción. Solo se rechaza una segunda instrucción no vacía después de ;; un punto y coma dentro de un literal de cadena no se considera segunda instrucción.

9

Ubicación de las pruebas y el harness.

Las pruebas están en tests/test_server.py (numeradas según los puntos <tests> del pliego), el harness de la sesión MCP en vivo está en .agent/tasks/mcp-shop-server/raw/, junto a las pruebas, para poder reiniciarlo durante la verificación.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to safely interact with a SQLite shop database through schema discovery, read-only SQL queries, and pre-built analytics reports like top customers, top products, and revenue summaries.
    6
    83
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Enables AI agents to answer analytical questions about an online store's SQLite database through specialized read-only tools, without any risk of modifying the underlying data.
    8
  • F
    license
    A
    quality
    C
    maintenance
    Enables AI agents to read-only query an online store's SQLite database, listing tables, inspecting schemas, and running SELECT queries over customers, products, orders, and order items.
    3
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to read-only analyze a SQLite e-commerce database, exploring schema and running analytical SQL queries over stdio.

Latest Blog Posts

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/andreykutsenko/mcp-shop-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server