mcp-ready-data-discovery-tool

mcp-ready-data-discovery-tool

Enables local data discovery by indexing metadata from SQLite, CSV, and Markdown sources, providing hybrid keyword and TF-IDF semantic search via MCP tools (listSources, indexSource, search, getSchema) and a REST API.

Category
访问服务器

README

MCP-ready Data Discovery Tool

Локальный MVP-инструмент для поиска и обнаружения данных. Проект индексирует метаданные, схемы, примеры строк, примеры значений и Markdown-документацию из нескольких локальных источников, сохраняет каталог в SQLite и отдаёт результаты через Web UI, REST API и MCP-ready функции.

Это инструмент обнаружения данных, а не система Text-to-SQL.

Что делает проект

  • Подключает локальные источники данных: SQLite-базу, папку с CSV-файлами и Markdown-документацию.
  • Показывает доступные источники, таблицы/файлы, колонки и документы.
  • Собирает метаданные: количество строк, типы данных, примеры строк, примеры значений и время последней индексации.
  • Индексирует данные во внутренний каталог storage/catalog.db.
  • Использует SQLite FTS5 для поиска по ключевым словам.
  • Использует локальный семантический слой на основе TF-IDF и косинусного сходства. поверх Markdown-документации, описаний, metadata, примеров значений и preview.
  • Возвращает ранжированные результаты с происхождением данных: source, sourceType, table, column, path, matchedBy, keywordScore, semanticScore.
  • Возвращает фрагменты Markdown-документов, а для таблиц и колонок — примеры строк и примеры значений.
  • Предоставляет MCP-ready инструменты: listSources, indexSource, search, getSchema.

Что проект НЕ делает

  • Не является Text-to-SQL системой.
  • Не генерирует SQL из пользовательского текста.
  • Не выполняет LLM query planning.
  • Не реализует ETL/ELT-пайплайн.
  • Не реализует CDC.
  • Не является production RBAC системой.
  • Не использует внешние платные API.
  • Не отправляет данные во внешние сервисы по умолчанию.

Быстрый запуск

make install
make seed
make index
make run

После запуска откройте:

http://localhost:8000

Ручной запуск без make

python -m pip install -e ".[dev]"
python scripts/generate_seed_data.py
python scripts/index_all.py
python -m uvicorn app.main:app --reload

Тестовые данные

Команда:

make seed

создаёт воспроизводимые локальные данные:

  • data/shop.db
    • users
    • orders
    • payments
    • products
  • data/csv/events.csv
  • data/csv/support_tickets.csv
  • data/csv/marketing_campaigns.csv
  • data/docs/users.md
  • data/docs/orders.md
  • data/docs/payments.md

Генератор использует фиксированное зерно 42, поэтому данные одинаково воспроизводятся при повторных запусках.

Индексирование

Команда:

make index

индексирует все настроенные источники и записывает результат во внутреннюю SQLite-базу каталога:

storage/catalog.db

В каталоге сохраняются:

  • источники;
  • элементы каталога;
  • история запусков индексирования;
  • поисковый индекс FTS5.

Индексируются не все строки целиком, а представления, полезные для поиска данных: схемы, названия, описания, примеры строк, примеры значений и документация.

UI

Минимальный Web UI реализован через FastAPI и Jinja2-шаблоны.

  • / Главная страница со списком источников и строкой поиска.

  • /search?q=customer+email Страница с ранжированными результатами поиска.

  • /schema?sourceId=sqlite_shop&path=sqlite_shop.users Страница просмотра схемы: колонки, metadata и примеры строк.

UI остаётся тонким слоем и использует ту же бизнес-логику, что REST API и MCP-инструменты.

REST API

Примеры:

curl http://localhost:8000/api/sources
curl -X POST http://localhost:8000/api/sources/sqlite_shop/index
curl "http://localhost:8000/api/search?q=payment%20method"
curl "http://localhost:8000/api/search?q=email&sourceId=csv_folder&type=column"
curl "http://localhost:8000/api/schema?sourceId=sqlite_shop&path=sqlite_shop.users"

/api/search возвращает объекты такого формата:

{
  "type": "column",
  "score": 0.91,
  "sourceId": "sqlite_shop",
  "path": "sqlite_shop.users.email",
  "metadata": {
    "sourceId": "sqlite_shop",
    "path": "sqlite_shop.users.email",
    "sourceType": "sqlite",
    "resultType": "column",
    "matchedBy": "hybrid",
    "keywordScore": 1.34,
    "semanticScore": 0.11,
    "parentTable": "users",
    "table": "users",
    "column": "email"
  },
  "preview": ["user001@example.com", "user002@example.com"]
}

Поиск

Поиск реализован как локальный гибридный механизм:

  1. SQLite FTS5 для поиска по ключевым словам Ищет по именам источников, таблиц и колонок, тексту документации, metadata и примерам значений.

  2. Локальный семантический поиск на основе TF-IDF Использует TfidfVectorizer и Cosine Similarity по вспомогательному тексту:

    • Markdown-документации;
    • именам элементов;
    • путям;
    • описаниям;
    • metadata;
    • примерам значений;
    • фрагментам в preview.
  3. Гибридное ранжирование результатов Результаты FTS5 и TF-IDF объединяются по (sourceId, path). В metadata сохраняются:

    • keywordScore;
    • semanticScore;
    • matchedBy.

    Итоговый score примерно объединяет keywordScore и semanticScore с весами 0.65 / 0.35.

  4. Происхождение результатов и поле preview Каждый результат содержит сведения о происхождении: источник, таблицу, колонку или документ. Документы возвращают фрагмент Markdown-текста, таблицы — примеры строк, колонки — примеры значений.

Важно: под семантическим поиском здесь понимается локальный механизм на TF-IDF, а не LLM- или embedding-based поиск.

MCP-инструменты

MCP-ready слой находится в:

app/mcp_server/server.py
app/mcp_server/manifest.json

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

  • listSources()
  • indexSource({sourceId})
  • search({query, filters?})
  • getSchema({sourceId, path})

Локальная демонстрация:

make mcp-demo

Она напрямую вызывает локальные функции-инструменты и проверяет тот же контракт, который мог бы использовать AI-агент, совместимый с MCP. Реальный AI-агент для демонстрации не требуется.

Если установлен MCP Python SDK, app/mcp_server/server.py может зарегистрировать эти инструменты через FastMCP. Если SDK не установлен, локальные функции всё равно работают.

Тесты

make test

Тесты покрывают ключевые сценарии:

  • SQLite-коннектор;
  • CSV-коннектор;
  • индексирование;
  • фильтры поиска;
  • metadata для гибридного поиска и происхождения результатов;
  • фрагменты документов;
  • маршруты REST/UI;
  • MCP-инструменты;
  • получение схемы.

Оценка качества поиска

make evaluate

Оценка считает:

  • Precision@5;
  • Recall@5;
  • задержку поиска;
  • количество проиндексированных объектов;
  • результаты запросов для проверки семантического поиска;
  • распределение matchedBy.

Результаты также записываются в:

storage/evaluation_results.json

Docker Compose

docker compose up

Контейнер устанавливает зависимости, генерирует тестовые данные, индексирует источники и запускает приложение на порту 8000.

Принятые архитектурные компромиссы

  • SQLite FTS5 выбран вместо Elasticsearch, потому что MVP должен быть локальным, лёгким и воспроизводимым.
  • TF-IDF выбран вместо embedding-моделей на базе transformer, чтобы получить локальный семантический слой без внешних API и тяжёлой инфраструктуры.
  • SQLite + CSV выбраны вместо PostgreSQL/warehouse, потому что задача связана с обнаружением данных, а не с production-платформой для работы с данными.
  • Jinja2 выбран вместо React, потому что нужен минимальный рабочий UI.
  • Примеры строк и примеры значений индексируются вместо полной индексации на уровне отдельных строк, чтобы не превращать проект в ETL или индексатор для data lake.
  • MCP SDK остаётся необязательным: проект можно демонстрировать через локальные функции-инструменты.

Ограничения текущей реализации

  • Это MVP, а не enterprise-каталог данных.
  • Конфигурация источников статическая.
  • TF-IDF не понимает смысл так же глубоко, как embedding-модели на базе transformer.
  • semanticScore может не доминировать над keywordScore.
  • Для больших каталогов TF-IDF-матрицу лучше кешировать или вынести в отдельный локальный индекс.
  • RBAC, audit, multi-tenant isolation и усиление безопасности и надёжности для production-эксплуатации не реализованы.

Возможные направления дальнейшего развития

  • Добавить конфигурационный файл для источников.
  • Кешировать TF-IDF-матрицу между запросами.
  • Добавить инкрементальную индексацию по времени изменения файлов.
  • Улучшить словари синонимов и подсказок для бизнес-терминов.
  • Рассмотреть локальные embedding-модели на базе transformer и лёгкое векторное хранилище.
  • Добавить полноценную инструкцию регистрации MCP server в реальном клиенте, совместимом с MCP.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选