Skip to main content
Glama
skvertl

SQLite Shop MCP Server

by skvertl

SQLite Shop MCP Server 🛍️

Sicherer, leistungsfähiger MCP (Model Context Protocol)-Server in Python zum Anbinden von KI-Agenten (Claude Desktop, Cursor, Antigravity, Gemini CLI) an die relationale Datenbank des Online-Shops (shop.db).

Der Server arbeitet lokal über die Standardeingabe/-ausgabe (stdio), implementiert zweistufigen Schutz vor Änderungen (strenges Read-Only), unterstützt automatische Paginierung, verständliche Fehlerbehandlung zur Selbstkorrektur der Agenten und wird mit 100 % Testabdeckung geliefert.


🌟 Wichtigste Funktionen

  1. Mehrstufige Sicherheit (Strict Read-Only):

    • Physische Ebene (SQLite Engine): Die Datenbank wird über die URI file:shop.db?mode=ro geöffnet. Jeder Schreibversuch wird physisch durch die C-Bibliothek von SQLite blockiert (OperationalError: attempt to write a readonly database).

    • Lexikalische Ebene (AST & Token Validator): Abfragen werden vor der Übergabe an die Datenbank analysiert. Erlaubt sind nur SELECT, WITH (CTE) und EXPLAIN. Alle destruktiven Operationen (INSERT, UPDATE, DELETE, DROP, ALTER, CREATE, ATTACH, PRAGMA writable) sowie Abfrageketten mit Semikolon werden sofort abgelehnt.

  2. Intelligentes Tool-Design (4 Tools):

    • get_database_schema: vollständiger Katalog aller Tabellen, Typen, Primär-/Fremdschlüssel, Zeilenanzahl und fachlicher Hinweise.

    • describe_table: detailliertes Schema einer bestimmten Tabelle.

    • get_sample_data: Vorschau auf die Datensätze einer Tabelle ohne SQL-Schreiben.

    • execute_query: sichere Ausführung beliebiger SQL-Abfragen mit automatischer Paginierung (page, page_size), Schutz vor Kontextüberlauf (bis zu 1000 Zeilen) und Messung der Ausführungszeit.

  3. Verständliche Fehlerbehandlung (Self-Correction):

    • Keine „rohen“ Python-Stacktraces nach außen.

    • Wenn beim Zugriff auf eine nicht vorhandene Spalte ein Fehler auftritt, schlägt der Server die Liste der verfügbaren Spalten in der Tabelle vor, sodass das Modell sich sofort selbst korrigieren kann.

  4. Portabilität:

    • Keine fest codierten absoluten Pfade. Der Pfad wird automatisch relativ zum Projekt oder über die Umgebungsvariable SHOP_DB_PATH bestimmt.

  5. Tests und Docker:

    • 51 pytest-Autotests (Sicherheit, Datenbank, Integration, alle 8 Aufgaben aus der Aufgabenstellung).

    • Fertige Dockerfile und docker-compose.yml.


Related MCP server: Read-Only SQLite Shop Database MCP Server

🏗️ Architektur

[ AI Agent: Claude / Cursor / Antigravity ]
                   │  (stdio JSON-RPC)
                   ▼
           [ server.py ] (MCPServer stdio transport)
                   │
     ┌─────────────┴─────────────┐
     ▼                           ▼
[ src/security.py ]       [ src/db.py ]
(Валидация SQL,           (Подключение в mode=ro,
 защита от инъекций)       пагинация, сбор метрик)
                                 │
                                 ▼
                       [ shop.db (mode=ro) ]

Datenbankschema shop.db

customers (150 строк)
    │
    └──< orders (750 строк)
             │
             └──< order_items (1900 строк) >── products (50 строк)

🚀 Schnellstart

1. Installation der Abhängigkeiten (Install)

Erforderlich ist Python 3.10+:

# Клонируйте репозиторий или перейдите в папку проекта
cd HW_MCP

# Установите зависимости
pip install -r requirements.txt

2. Konfiguration (Configure)

Standardmäßig sucht der Server die Datei shop.db im Projektstamm. Bei Bedarf kann der Pfad über die Umgebungsvariable überschrieben werden:

# Windows (PowerShell)
$env:SHOP_DB_PATH = "C:\path\to\shop.db"

# Linux / macOS
export SHOP_DB_PATH="/path/to/shop.db"

3. Server starten (Run)

Der Server wird im stdio-Modus gestartet:

python server.py

🤖 Verbindung zu KI-Agenten (Connect to Agent)

Claude Desktop

Fügen Sie die Konfiguration in die Einstellungsdatei von Claude Desktop ein:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "sqlite-shop": {
      "command": "python",
      "args": [
        "C:\\Users\\user\\OneDrive\\BackToTheFuture\\HW_MCP\\server.py"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1"
      }
    }
  }
}

Cursor

Gehen Sie in Cursor zu Settings > Features > MCP > Add New MCP Server:

  • Name: sqlite-shop

  • Type: command

  • Command: python C:\Users\user\OneDrive\BackToTheFuture\HW_MCP\server.py

Oder erstellen Sie im Stammverzeichnis des Projekt-Workspace eine Datei .cursor/mcp.json:

{
  "mcpServers": {
    "sqlite-shop": {
      "command": "python",
      "args": ["server.py"]
    }
  }
}

Antigravity / Gemini CLI

Fügen Sie den Abschnitt in mcp_config.json hinzu:

{
  "mcpServers": {
    "sqlite-shop": {
      "command": "python",
      "args": ["server.py"]
    }
  }
}

🛠️ Beschreibung der Tools (MCP Tools)

1. get_database_schema

Gibt die vollständige Struktur aller Tabellen, die Datentypen der Spalten, die Primär- und Fremdschlüssel, die Zeilenanzahl und erläuternde Hinweise zu den Daten zurück.

2. describe_table(table_name: str)

Gibt das detaillierte Schema der Spalten und Einschränkungen der ausgewählten Tabelle zurück (customers, products, orders, order_items).

3. get_sample_data(table_name: str, limit: int = 10)

Gibt Beispielzeilen aus der Tabelle zur vorläufigen Analyse des Datenformats zurück.

4. execute_query(query: str, page: int = 1, page_size: int = 50)

Führt eine sichere SQL-Leseabfrage aus.

  • Parameter:

    • query (string, erforderlich): SQL-Abfrage (SELECT, WITH ... SELECT, EXPLAIN).

    • page (int, Standard: 1): Seitennummer.

    • page_size (int, Standard: 50, max: 1000): Anzahl der Zeilen pro Seite.

  • Antwortformat:

    {
      "rows": [
        { "id": 1, "first_name": "Арина", "email": "..." }
      ],
      "page": 1,
      "page_size": 50,
      "total_rows_in_page": 50,
      "has_more": true,
      "execution_time_ms": 1.24
    }

📊 Lösung der 8 Kontrollaufgaben aus der Aufgabenstellung

Alle Abfragen wurden mit echten Daten aus shop.db geprüft:

Frage aus der Aufgabenstellung

SQL-Abfrage über execute_query

Antwort des Agenten

1

Show me all available tables and explain what information each table contains.

Aufruf von get_database_schema()

4 Tabellen: customers (150 Kunden), products (50 Produkte), orders (750 Bestellungen), order_items (1900 Positionen).

2

How many customers are from Germany?

SELECT COUNT(*) FROM customers WHERE phone LIKE '+49%'

0 Kunden. (Die Tabelle hat keine Spalte country, und alle Telefonnummern beginnen mit +7.)

3

Which country has the most customers?

SELECT SUBSTR(phone, 1, 2) as code, COUNT(*) as c FROM customers GROUP BY code

Russland (+7) — 150 Kunden (100 % der Datenbank).

4

Who is the customer who spent the most money?

SELECT c.first_name, c.last_name, c.email, ROUND(SUM(o.total_amount), 2) as spent FROM customers c JOIN orders o ON c.id = o.customer_id WHERE o.status != 'cancelled' GROUP BY c.id ORDER BY spent DESC LIMIT 1

Дмитрий Харитонов (dmitriy.kharitonov845@mail.ru) — 701 780.00 Rubel

5

What are the top 5 best-selling products?

SELECT p.name, SUM(oi.quantity) as qty, ROUND(SUM(oi.quantity * oi.unit_price), 2) as rev FROM products p JOIN order_items oi ON p.id = oi.product_id JOIN orders o ON o.id = oi.order_id WHERE o.status != 'cancelled' GROUP BY p.id ORDER BY qty DESC LIMIT 5

1. Schulterexpander (93 Stk., 110 670 Rubel)2. Luftbefeuchter AirFresh (92 Stk., 394 680 Rubel)3. Stabmixer 800W (84 Stk., 267 960 Rubel)4. Lederstiefel (83 Stk., 704 670 Rubel)5. Profi-Haartrockner (83 Stk., 455 670 Rubel)

6

What are the top 3 product categories by revenue?

SELECT p.category, ROUND(SUM(oi.quantity * oi.unit_price), 2) as rev FROM products p JOIN order_items oi ON p.id = oi.product_id JOIN orders o ON o.id = oi.order_id WHERE o.status != 'cancelled' GROUP BY p.category ORDER BY rev DESC LIMIT 3

1. Elektronik — 17 060 760 Rubel2. Haushaltsgeräte — 5 506 570 Rubel3. Bekleidung und Schuhe — 3 085 470 Rubel

7

How much revenue did we generate in 2025?

SELECT COALESCE(ROUND(SUM(total_amount), 2), 0.0) FROM orders WHERE order_date >= '2025-01-01' AND order_date < '2026-01-01' AND status != 'cancelled'

0.00 Rubel (Alle Bestellungen im Shop wurden im Jahr 2026 angelegt: vom 17.02.2026 bis 22.08.2026).

8

Which customer placed the most orders?

SELECT c.first_name, c.last_name, c.email, COUNT(o.id) as cnt FROM customers c JOIN orders o ON c.id = o.customer_id GROUP BY c.id ORDER BY cnt DESC LIMIT 1

София Яковлев (sofiya.yakovlev284@yandex.ru) — 16 Bestellungen.

Sicherheitsprüfung (Safety Requirement)

Abfrage des Agenten:

Delete all cancelled orders.

Antwort des MCP-Servers:

{
  "error": true,
  "error_type": "PermissionDenied",
  "message": "PermissionDenied: Modifying or destructive operations are not permitted (read-only server). Statement starts with 'DELETE'."
}

Die Datenbank bleibt vollständig unversehrt.


🧪 Automatische Tests ausführen

Im Projekt ist eine vollständige Testsuite auf Basis von pytest implementiert:

  • tests/test_security.py — prüft die Blockierung destruktiver Ausdrücke, SQL-Injektionen und Abfrageketten.

  • tests/test_db.py — prüft den physischen mode=ro, das Schema, die Paginierung und Fehlerhinweise.

  • tests/test_server.py — Integrationstests für Tool-Aufrufe und Validierung aller 8 Aufgaben der Hausaufgabe.

pytest tests/ -v

Ergebnis:

============================= 51 passed in 0.87s ==============================

🐳 Ausführung in Docker

Build und Start des Containers:

# Сборка образа
docker build -t sqlite-shop-mcp .

# Запуск с монтированием базы
docker run -i --rm -v $(pwd)/shop.db:/app/shop.db:ro sqlite-shop-mcp

Oder über docker-compose:

docker-compose run --rm sqlite-shop-mcp

📁 Repository-Struktur

HW_MCP/
├── .agent/                  # Интеграция с OpenSpec агентами
├── openspec/                # Спецификация требований (OpenSpec living specs & changes)
├── src/
│   ├── __init__.py
│   ├── config.py            # Разрешение путей и настроек SQLite URI
│   ├── security.py          # Валидатор SQL-запросов (Read-Only enforcement)
│   └── db.py                # Слой SQLite (mode=ro, пагинация, сбор схем)
├── tests/
│   ├── test_security.py     # Тесты безопасности SQL
│   ├── test_db.py           # Тесты слоя БД и пагинации
│   └── test_server.py       # Интеграционные тесты 8 аналитических задач
├── Dockerfile               # Контейнеризация сервиса
├── docker-compose.yml
├── mcp_config_example.json  # Примеры конфигов для Claude Desktop, Cursor, Antigravity
├── requirements.txt         # Зависимости Python
├── server.py                # Главная точка входа MCP-сервера
├── shop.db                  # База данных SQLite интернет-магазина
└── README.md                # Полная документация проекта

📜 Lizenz

MIT License.

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

  • F
    license
    Not graded
    quality
    C
    maintenance
    Provides AI agents read-only analytical access to a SQLite database over stdio, with tools for listing tables, describing schemas, and running paginated SQL queries.
  • F
    license
    A
    quality
    C
    maintenance
    Enables AI agents to safely inspect and query an SQLite e-commerce database with tools for listing tables, describing schemas, and running read-only SQL queries while blocking destructive operations.
    4
  • 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/skvertl/New_MCP'

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