Skip to main content
Glama
dkautomation23

mcp-data-server

mcp-data-server

Пример проекта, демонстрирующий шаблоны производственного веб-скрапинга / автоматизации.

MCP-сервер, предоставляющий Клод (или любому MCP-клиенту) доступ только для чтения к бизнес-базе данных — с гарантиями, которые делают подключение LLM к реальным корпоративным данным приемлемым: подключение только для чтения, белый список таблиц, маскировка PII, ограничение количества строк, тайм-аут запроса и полный журнал аудита.

Спросите "какие страны заказывают больше всего и сколько нам стоили возвраты в прошлом квартале?" в Claude Desktop и получите ответ из реальной базы данных — без возможности для модели записывать, удалять, подключать или читать таблицу, к которой она не была допущена.


Зачем это нужно

Главное препятствие в большинстве проектов "подключите ИИ к нашим данным" — это не проводка, а первый вопрос от владельца базы данных: что мешает ему прочитать или сломать то, что не следует? Этот сервер отвечает на этот вопрос в коде.

Related MCP server: Vela MCP Server

Четыре независимых барьера

#

Барьер

Что предотвращает

1

Подключение открыто mode=ro

любую запись, даже если все проверки выше него обойдены

2

Разбор запроса

несколько операторов, всё, что не является SELECT / WITH

3

Черный список ключевых слов

ATTACH, PRAGMA, DDL, VACUUM, GRANT …

4

Белый список + маскировка + ограничения

таблицы, к которым вы не дали доступ, столбцы с PII, слишком большие результаты, неконтролируемые запросы

Каждый выполненный оператор добавляется в журнал аудита с количеством строк и продолжительностью, чтобы владелец данных мог точно видеть, о чем спрашивала модель.

2026-08-18T11:22:41  6 rows in 1ms       SELECT country, COUNT(*) FROM customers GROUP BY 1 LIMIT 201
2026-08-18T11:22:44  error: rejected     DELETE FROM customers

Доступные инструменты

Инструмент

Назначение

list_tables()

читаемые таблицы + количество строк

describe_table(table)

столбцы, типы, какие маскируются, 3 примера строк

run_sql(sql)

один SELECT только для чтения, с ограничением и аудитом

search(table, column, term, limit)

поиск подстроки без написания SQL

summarize_column(table, column)

нули, количество уникальных значений, минимум/максимум, топ-5 значений

Плюс ресурс schema://tables, чтобы клиент мог загрузить всю схему, не используя вызов инструмента.

Быстрый старт

git clone https://github.com/dkautomation23/mcp-data-server.git
cd mcp-data-server
python -m venv .venv && . .venv/bin/activate      # Windows: .venv\Scripts\activate
pip install -r requirements.txt

python -m mcp_data_server.seed                    # creates demo.db
cp .env.example .env                              # then point DATABASE_PATH at your file
python -m mcp_data_server                         # serves over stdio

Python 3.10+. Демонстрационная база данных содержит таблицы customers, orders, order_items и намеренно конфиденциальную таблицу internal_notes, используемую ниже для демонстрации блокировки доступа через белый список.

Подключение к Claude Desktop

Добавьте в claude_desktop_config.json (полный пример в examples/claude_desktop_config.json):

{
  "mcpServers": {
    "business-data": {
      "command": "python",
      "args": ["-m", "mcp_data_server"],
      "cwd": "C:/path/to/mcp-data-server",
      "env": {
        "DATABASE_PATH": "C:/path/to/your.db",
        "ALLOWED_TABLES": "customers,orders,order_items",
        "MASKED_COLUMNS": "customers.email,customers.phone"
      }
    }
  }
}

Подключение к Claude Code

claude mcp add business-data -- python -m mcp_data_server

Как выглядит сессия

Реальный вывод работающего сервера (см. examples/demo_session.md для полной стенограммы):

// run_sql("SELECT status, COUNT(*) n, ROUND(SUM(total_eur)) revenue FROM orders GROUP BY 1 ORDER BY 3 DESC")
{
  "sql": "SELECT status, COUNT(*) n, ROUND(SUM(total_eur)) revenue FROM orders GROUP BY 1 ORDER BY 3 DESC LIMIT 201",
  "columns": ["status", "n", "revenue"],
  "rows": [["paid", 92, 149914.0], ["pending", 39, 64596.0], ["refunded", 31, 45911.0]],
  "row_count": 3, "truncated": false, "elapsed_ms": 0
}

// run_sql("DELETE FROM customers")
{ "error": "only SELECT (or WITH ... SELECT) statements are allowed" }

// run_sql("SELECT * FROM internal_notes")
{ "error": "table 'internal_notes' is not in the allowlist (allowed: customers, orders, order_items)" }

// run_sql("SELECT id, name, email FROM customers LIMIT 2")
{ "rows": [[1, "Customer 001", "***"], [2, "Customer 002", "***"]] }

Конфигурация

Переменная

По умолчанию

Назначение

DATABASE_PATH

demo.db

Файл SQLite для открытия (всегда открывается только для чтения)

ALLOWED_TABLES

все

Белый список, разделенный запятыми; всё остальное невидимо

MASKED_COLUMNS

–

Список таблица.столбец, заменяемый на *** в каждом результате

MAX_ROWS

200

Жесткое ограничение на вызов; результаты сверх него помечаются как truncated

QUERY_TIMEOUT_SECONDS

10

Более длинный запрос отменяется

AUDIT_LOG_PATH

audit.log

Журнал только для добавления каждого оператора; пустое значение отключает его

Тесты

pytest -q
...............................                                          [100%]
31 passed in 1.77s

Три уровня: проверки SQL (инъекции, второй оператор, сокрытие в комментариях, запрещенные таблицы), уровень базы данных на реальном заполненном файле (включая попытку записи, которую отклоняет сам SQLite), и семь тестов, управляющих сервером через реальный протокол MCP — тот же процесс рукопожатия, list_tools и call_tool, который выполняет десктопный клиент.

Адаптация к инфраструктуре клиента

  • Postgres / MySQL: замените подключение в db.py на пулированный драйвер и сессию SET TRANSACTION READ ONLY; уровень валидации остается неизменным.

  • Бизнес-специфичные инструменты: добавьте функцию с @mcp.tool() в server.py — хорошо названный top_customers(period) лучше, чем заставлять модель писать SQL.

  • HTTP-транспорт вместо stdio: mcp.run(transport="streamable-http"), затем поместите его за свою собственную аутентификацию.

Лицензия

MIT — см. LICENSE.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables read-only exploration and querying of PostgreSQL or MySQL databases via MCP, with schema discovery, safe SQL validation, natural language to SQL conversion, and CSV export.
    11
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables governed, agent-agnostic data exploration by allowing users to ask natural language questions through MCP-compatible agents, executing safe, permission-scoped queries against data sources and returning interactive charts.
    3 npm
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides a secure, policy-driven read-only gateway that exposes multiple databases to AI tools via MCP, with governed select, search, and aggregate operations and no free-form SQL.
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables natural-language querying of Postgres and MongoDB databases in read-only mode, with PII masking and row/timeout guardrails, from any MCP client.
    -