Главная / Статьи

Создайте сервер MCP на Python и подключите его к Claude Desktop и SQLite.

Создайте сервер MCP на Python, который оборачивает базу данных SQLite, зарегистрируйте его в Claude Desktop для Windows и позвольте модели писать и выполнять собственные SQL-запросы.

Издатель: REACTAPP.TOP4 мин чтения895 слов

Источники: Stop Writing Custom APIs for Your AI Agents: Build an MCP Server in 5 Minutes

Каждый, кто разрабатывает корпоративных агентов, знает, насколько сложно писать «клеевой» код. Один оберточный модуль для базы данных, другой — для интеграции с задачами в Jira, ещё один — для Slack. Умножьте это на десять баз данных и пять фреймворков больших языков моделирования, таких как Claude, AutoGen и LangChain, и структура проекта рушится под собственным весом. Это и есть проблема интеграции типа N×M: искусственный интеллект должен понимать точную структуру каждого источника данных, с которым он взаимодействует.

Протокол контекста модели (Model Context Protocol, MCP) — это открытый стандарт, направленный именно на решение этой проблемы. Представьте себе универсальный кабель USB-C для искусственного интеллекта. Соединение с базой данных создаётся один раз и предоставляется через единственный стандартизированный сервер, позволяя любому совместимому клиенту подключиться, обнаружить доступные инструменты и использовать их. Ниже приведён пример локального сервера MCP, написанного менее чем из 50 строк кода на Python, подключённого к Claude Desktop и использующего базу данных SQLite в реальном времени.

Предварительные требования

Официальный пакет Python mcp выполняет основную работу. Он скрывает детали JSON-RPC, поэтому для предоставления инструмента модели достаточно одного декоратора. Сначала установите его в свою виртуальную среду:

pip install mcp

Также необходимо установить Claude Desktop на этом компьютере.

Написание сервера

Создайте файл с именем mcp_server.py, импортируйте необходимые библиотеки и инициализируйте сервер. Здесь важен один момент: модуль os фиксирует файл SQLite в том же каталоге, что и скрипт. Claude Desktop запускает сервер в фоновом режиме, и без определенного местоположения могут возникнуть ошибки доступа.

import sqlite3
import json
import os
import sys
from mcp.server.mcpserver import MCPServer

# Initialize the MCP server
mcp = MCPServer(name="Enterprise_SQL_Agent")

# Force the database to be created in the exact same folder as this script
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.path.join(BASE_DIR, "enterprise.db")

Далее создается временная база данных, чтобы у модели было что искать. Настройка логирования происходит в стандартный поток ошибок (sys.stderr). Стандартный вывод — это канал, через который MCP общается с клиентом, и случайные записи туда могут его повредить.

def setup_dummy_db():
    """Create a sample employee database for the demo"""
    try:
        conn = sqlite3.connect(DB_PATH)
        cursor = conn.cursor()

        cursor.execute('''CREATE TABLE IF NOT EXISTS employees
                          (id INTEGER PRIMARY KEY, name TEXT, role TEXT, salary INTEGER)''')
        cursor.execute("DELETE FROM employees")

        employees = [
            ("Alice", "Data Scientist", 120000),
            ("Bob", "DevOps Engineer", 115000),
            ("Charlie", "AI Researcher", 135000)
        ]

        cursor.executemany("INSERT INTO employees (name, role, salary) VALUES (?, ?, ?)", employees)
        conn.commit()
        conn.close()
        print("Database initialized successfully.", file=sys.stderr)
    except Exception as e:
        print(f"Database setup error: {e}", file=sys.stderr)

Использование базы данных в качестве инструмента

Основным элементом является обычная функция на Python, которая выполняет SQL-запрос и возвращает строки с данными. Достаточно добавить декоратор @mcp.tool(), после чего сервер автоматически считывает документацию и указания типов, чтобы сгенерировать схему JSON для модели.

@mcp.tool()
def query_employee_database(sql_query: str) -> str:
    """
    Executes a SQL SELECT query against the enterprise.db database.

    The database contains an 'employees' table with columns:
    - id (INTEGER PRIMARY KEY)
    - name (TEXT)
    - role (TEXT)
    - salary (INTEGER)

    SECURITY: Only READ operations (SELECT) are permitted.
    """

    # Safety Check: Block destructive SQL commands
    dangerous_keywords = ["DROP", "DELETE", "UPDATE", "INSERT", "ALTER"]
    if any(keyword in sql_query.upper() for keyword in dangerous_keywords):
        return "Error: Only SELECT queries are authorized for this tool."

    try:
        conn = sqlite3.connect(DB_PATH)
        cursor = conn.cursor()
        cursor.execute(sql_query)
        results = cursor.fetchall()

        # Format the output as JSON so the LLM can read it cleanly
        column_names = [description[0] for description in cursor.description]
        formatted_results = [dict(zip(column_names, row)) for row in results]

        conn.close()
        return json.dumps(formatted_results, indent=2)

    except Exception as e:
        return f"Database error: {str(e)}"

Короткий блок запуска завершает файл:

if __name__ == "__main__":
    setup_dummy_db()
    mcp.run()

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

Необходимо указать клиенту местоположение сервера. В Windows перейдите в папку %APPDATA%\Claude, откройте файл claude_desktop_config.json в редакторе и добавьте запись mcpServers.

Особенность Windows, которая часто вызывает проблемы: если вы запускаете программу в виртуальной среде, такой как Conda или venv, укажите абсолютный путь к файлу python.exe этой среды вместо обычной команды python, причем все пути должны быть записаны с двойными обратными слешами.

{
  "mcpServers": {
    "enterprise-sql": {
      "command": "C:\\Users\\YourName\\.conda\\envs\\your_env\\python.exe",
      "args": [
        "D:\\Your\\Project\\Path\\mcp_server.py"
      ]
    }
  }
}

Сохраните файл и полностью перезагрузите Claude Desktop.

Проверка работы

Откройте Claude Desktop и найдите иконку молотка (Инструменты) в правом нижнем углу окна чата. Инструмент query_employee_database уже должен там быть зарегистрирован. Хорошим первым тестом будет запрос о том, кто зарабатывает больше всего в таблице сотрудников и какую должность занимает этот человек.

Модель читает описание инструмента, сама пишет SQL-запрос (SELECT * FROM employees ORDER BY salary DESC LIMIT 1;), отправляет его на ваш сервер и преобразует результат в ответ на простом языке. Никакой специальной слоя API не писалось, а схема была обнаружена динамически.

Тот же принцип применим к Slack, Jira, GitHub или любому внутреннему API компании, и именно это меняет экономику создания агентных систем в компании: каждая система оборачивается один раз, и любой совместимый ассистент может ею пользоваться.