llm-analytics-mcp
LLM-basiertes Analysesystem mit MCP-Integration
Ein MCP-Server, der der Sprachmodell eine Reihe von Werkzeugen zur Analyse tabellarischer Daten bereitstellt: Laden, Bereinigen, Erstellen von Diagrammen, Zusammenstellen eines Berichts. Eine eigene Chat-Oberfläche wird nicht entwickelt – verwendet wird die Weboberfläche der vorhandenen Plattform (Claude als Hauptclient, ChatGPT als Alternative).
Ein und derselbe Tool-Registry wird gleichzeitig über zwei Protokolle veröffentlicht:
Protokoll | Endpunkt | Client |
MCP (Streamable HTTP) |
| Claude – Web, Desktop, jeder MCP-Client |
REST + OpenAPI |
| ChatGPT Custom GPT Action |
Was das System kann
12 Tools, 5 Skills. Die vollständige Liste erhalten Sie durch Aufruf von
describe_system oder in ARCHITECTURE.md.
Tool | Skill | Zweck |
| — | Katalog der verfügbaren Daten |
| DataLoadingSkill | Laden von CSV/TSV/Excel/JSON/Parquet aus Katalog, Pfad oder URL |
| DataLoadingSkill | Struktur, Typen, fehlende Werte, Duplikate |
| DataCleaningSkill | Duplikate, fehlende Werte, Normalisierung, Ausreißer |
| InsightGenerationSkill | Automatische Auswahl eines Analyseplans passend zur Datensstruktur |
| VisualizationSkill | Verlauf einer Metrik über die Zeit |
| VisualizationSkill | Histogramm oder Balkendiagramm (Typ wird automatisch gewählt) |
| VisualizationSkill | Korrelations-Heatmap |
| VisualizationSkill | Aufschlüsselung einer Metrik nach Kategorien |
| InsightGenerationSkill | Überprüfbare Zahlen für den Berichtstext |
| ReportingSkill | Bericht in Markdown, HTML und PDF |
| — | Introspektion: Zusammensetzung der Skills und Tools |
Zusätzliche Funktionen:
Automatische Analyseauswahl –
suggest_analysisermittelt, welche Spalte die Zeitachse ist, welche die Metriken und welche die Aufschlüsselungen sind, und liefert einen fertigen Aufrufplan mit Begründung für jeden Schritt.Multi-Format und Multi-Quelle – CSV, TSV, Excel, JSON, Parquet; Katalog, lokaler Pfad oder HTTP(S)-Link. Letzteres ist für das Webszenario entscheidend: Eine im Browser-Chat hochgeladene Datei ist für den Server nicht verfügbar.
Berichterstellung mit einem Befehl –
build_reportergänzt fehlende Diagramme selbst und liefert das Dokument in drei Formaten aus.
Related MCP server: Claude Data Buddy
Installation
Erforderlich ist Python 3.10 oder neuer.
git clone <адрес-репозитория>
cd llm-analytics-mcp
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtSchritt 1. Testdaten
Die Daten im Repository wurden synthetisch generiert nach dem Superstore-Schema. Die Aufgabenstellung erlaubt dies ausdrücklich: „Sie können die Daten selbst generieren oder einen bekannten Datensatz verwenden.“
python scripts/prepare_dataset.py --synthetic --rows 4000Die fertigen Dateien liegen bereits in data/ – der Befehl wird nur benötigt,
wenn Sie sie neu erzeugen oder den Umfang ändern möchten.
Warum synthetische Daten statt Kaggle
Der Generator bietet Kontrolle darüber, was genau das System demonstriert:
Überprüfbare Muster sind eingebaut – ein Aufwärtstrend, eine jährliche Saisonalität mit Spitze am Jahresende und der Zusammenhang „Rabatt über 30 % → negativer Gewinn“. Dadurch sind die Analyseergebnisse aussagekräftig und nicht zufällig.
Fehler wurden absichtlich eingebaut. Der echte Superstore ist nahezu perfekt sauber: Ohne fehlende Werte und Duplikate würde
DataCleaningSkill„0 Zeilen entfernt“ melden, und die Bereinigung ließe sich nicht demonstrieren.Reproduzierbarkeit. Ein fester
seed=42– wer prüft, erhält exakt dieselben Daten und dieselben Zahlen im Bericht wie im Beispiel.Das Repository ist eigenständig. Es ist kein Kaggle-Konto erforderlich, um das Projekt zu starten.
Das Laden des echten Superstore wird ebenfalls unterstützt – die Spaltenstruktur stimmt überein:
python scripts/prepare_dataset.py --input ~/Downloads/Sample-Superstore.csvWas das Skript erzeugt
Datei | Zweck |
| Daten, auf die in der Aufgabenstellung festgelegten Spalten normiert |
| Dieselbe Tabelle mit eingebaunten Fehlern |
Spalten: Date, Product, Region, Sales, Quantity, Profit (aus der
Aufgabenstellung) plus Aufschlüsselungen Category, Sub-Category, Segment,
Discount, Ship Mode. Zeitraum: 2021–2024, 48 Monate.
Die Zusammensetzung der Fehler wird beim Start ausgegeben und ist deterministisch:
Fehler | Umfang |
Fehlende Werte in | ~3.5% / 4.5% / 2% |
Vollständige Zeilenduplikate | ~0.8% |
Uneinheitliche Schreibweise von | ~6% der Zeilen |
Extreme Ausreißer in | 12 Zeilen |
Alternatives Datumsformat ( | ~10% der Zeilen |
Schritt 2. Prüfung ohne Server
Ein End-to-End-Durchlauf der gesamten Kette – vom Laden bis zum PDF-Bericht:
PYTHONPATH=src python -m analytics_mcp.selfcheckDas Skript wiederholt, was das LLM im Dialog tut, aber deterministisch. Es eignet sich als Smoke-Test vor der Demo: Wenn es durchläuft, liegt das Problem fast sicher an der Integration, nicht an der Analyse.
Schritt 3. Start des Servers
PYTHONPATH=src uvicorn analytics_mcp.app:app --host 127.0.0.1 --port 8000Prüfung:
curl http://127.0.0.1:8000/healthNützliche Adressen:
Adresse | Bedeutung |
| Status und Anzahl der registrierten Komponenten |
| Swagger UI: Alle Tools können manuell aufgerufen werden |
| Spezifikation für Custom GPT Action |
| MCP-Endpunkt |
Wenn der Port belegt ist. Ein zuvor gestarteter Prozess kann weiterhin mit altem Code antworten – das Symptom ist trügerisch:
/healthantwortet, aber Änderungen werden nicht übernommen. Vor dem Neustart:pkill -f uvicorn.
Schritt 4. Öffentliche Adresse über ngrok
Claude greift von außen auf den Server zu, daher wird eine HTTPS-Adresse benötigt.
# 1. Установка и регистрация: https://ngrok.com/download
ngrok config add-authtoken <ваш-токен>
# 2. В личном кабинете ngrok зарезервируйте бесплатный статический домен
# (Domains -> Create Domain). Без него адрес меняется при каждом
# перезапуске, и настройку коннектора придётся повторять.
# 3. Запуск туннеля
ngrok http 8000 --domain=ваш-домен.ngrok-free.appTragen Sie die Adresse anschließend in der Umgebung ein und starten Sie den Server neu:
cp .env.example .env
# в .env укажите:
# PUBLIC_BASE_URL=https://ваш-домен.ngrok-free.app
export PUBLIC_BASE_URL=https://ваш-домен.ngrok-free.app
export MCP_ALLOWED_HOSTS='127.0.0.1:*,localhost:*,*.ngrok-free.app'
PYTHONPATH=src uvicorn analytics_mcp.app:app --host 127.0.0.1 --port 8000Der häufigste Grund für „keine Verbindung“. Das MCP SDK aktiviert standardmäßig einen Schutz gegen DNS-Rebinding und akzeptiert nur einen
Host-Header der Formlocalhost. Hinter dem Tunnel enthältHostdie ngrok-Domäne, und die Anfrage wird beim Verbindungsaufbau des Konnektors abgelehnt, ohne klare Fehlermeldung in der Oberfläche. Die VariableMCP_ALLOWED_HOSTSlöst genau dieses Problem.
Schritt 5. Verbindung zu Claude (Hauptszenario)
Öffnen Sie Settings → Connectors → Add custom connector.
Geben Sie die Adresse an:
https://ваш-домен.ngrok-free.app/mcp(beachten Sie das Suffix/mcp).Speichern Sie und stellen Sie sicher, dass der Konnektor in den Zustand „verbunden“ übergegangen ist.
Aktivieren Sie in einem neuen Dialog den Konnektor
analytics_mcpüber das Tool-Menü.Kopieren Sie den Inhalt von
prompts/system_prompt.mdin die Projektbeschreibung (Project instructions) – das legt die Reihenfolge der Aufrufe fest.
Testabfrage: „Welche Datensätze sind verfügbar?“ – Das Modell sollte
list_datasets aufrufen und den Inhalt des Katalogs anzeigen.
Schritt 6. Verbindung zu ChatGPT (alternatives Szenario)
Laden Sie die Spezifikation von der öffentlichen Adresse herunter:
PUBLIC_BASE_URL=https://ваш-домен.ngrok-free.app \ PYTHONPATH=src python scripts/export_openapi.pyErstellen Sie einen Custom GPT: Explore GPTs → Create → Configure.
Create new action → Schema – fügen Sie den Inhalt von
openapi.jsonein.Authentication: None.
Fügen Sie im Feld Instructions
prompts/system_prompt.mdein.
Details und Besonderheiten der Diagrammdarstellung finden Sie in
prompts/gpt_action_setup.md.
Demonstrationsszenario
Die Reihenfolge der Anfragen ist so gewählt, dass auf den Screenshots eine Kette von Aufrufen sichtbar ist, nicht nur eine einzelne Anfrage. Das Schlüsselbild ist Schritt 4: Man sieht, dass das Modell plant, und keinen Hardcode.
# | Benutzeranfrage | Erwartete Aufrufe |
1 | Welche Datensätze sind verfügbar? |
|
2 | Lade superstore_raw und beschreibe die Struktur |
|
3 | Bereinige die Daten |
|
4 | Was lohnt es sich hier zu analysieren? |
|
5 | Erstelle diese Diagramme |
|
6 | Erstelle einen Bericht mit Erkenntnissen und Empfehlungen |
|
Ein Beispielergebnis finden Sie in
docs/report_example.md, Diagramme in
docs/plots/.
Screenshots der Arbeit
Die Demonstrationsmaterialien liegen in docs/screenshots/:
Datei | Inhalt |
Claude ruft | |
Bericht | |
Vergleich der Datensatzversionen „mit Auffüllen fehlender Werte“ und „ohne“ | |
Das Modell prüft Hypothesen aus dem Bericht mit neuen Tool-Aufrufen | |
Priorisierte Liste von Richtungen für die weitere Analyse | |
Erstellung von Diagrammen; das Modell vermerkt ausdrücklich, was die Tools nicht können |
Die Screenshots zeigen die zentrale Eigenschaft des Systems: Die Aufrufkette wird vom LLM gesteuert. Das Modell entscheidet selbst, welche Tools es aufruft, erkennt Einschränkungen des Tool-Sets (z. B. das Fehlen einer Zeilenfilterung) und berichtet darüber, anstatt das Ergebnis zurechtzubiegen.
Integrationsprüfung
# Полный цикл по обоим транспортам: initialize, tools/list, tools/call,
# возврат изображения, обработка ошибочных аргументов
python scripts/integration_test.pyRepository-Struktur
llm-analytics-mcp/
├── README.md инструкция (этот файл)
├── ARCHITECTURE.md архитектура и роль MCP/скиллов
├── openapi.json спецификация для Custom GPT Action
├── requirements.txt
├── .env.example
├── data/ тестовые данные
├── docs/
│ ├── report_example.md/html/pdf пример сгенерированного отчёта
│ ├── plots/ примеры графиков
│ └── screenshots/ скриншоты диалога
├── prompts/
│ ├── system_prompt.md инструкция для LLM
│ └── gpt_action_setup.md настройка Custom GPT Action
├── scripts/
│ ├── prepare_dataset.py подготовка данных
│ ├── export_openapi.py выгрузка спецификации
│ └── integration_test.py проверка обоих транспортов
└── src/analytics_mcp/
├── core/ реестр инструментов, хранилище, модели
├── skills/ бизнес-логика этапов анализа
├── tools/ инструменты, публикуемые наружу
├── transports/ адаптеры MCP и REST
├── rendering/ оформление графиков, артефакты
├── app.py сборка ASGI-приложения
└── selfcheck.py сквозная самопроверкаSo fügen Sie ein eigenes Tool hinzu
Der Kern bleibt dabei unverändert. Erstellen Sie eine Datei
src/analytics_mcp/tools/my_tools.py:
from __future__ import annotations
from analytics_mcp.core.datasets import store
from analytics_mcp.core.registry import tool
@tool(tags=("stats",), skill="DataLoadingSkill", title="Топ значений")
def top_values(column: str, dataset_id: str | None = None, limit: int = 10) -> dict:
"""Возвращает самые частые значения колонки.
Args:
column: Имя колонки.
dataset_id: Датасет. По умолчанию — последний использованный.
limit: Сколько значений вернуть.
"""
record = store.get(dataset_id)
record.require_column(column)
counts = record.df[column].value_counts().head(limit)
return {str(k): int(v) for k, v in counts.items()}Starten Sie den Server neu. Das Tool erscheint sofort in beiden Protokollen:
in tools/list bei MCP und in /openapi.json bei REST. Das Paket tools
importiert seine Module automatisch, das JSON-Schema wird aus der Signatur
abgeleitet, die Beschreibung aus dem Docstring.
Bekannte Einschränkungen
Sie sind bewusst genannt – das sind Grenzen des Prototyps, keine unfertigen Teile:
In-Memory-Speicherung der Datasets. Beim Neustart des Servers gehen die geladenen Daten verloren. Für einen Prototyp akzeptabel; in der Produktion — Redis oder Festplatte.
Keine Authentifizierung. Die Demo-Umgebung befindet sich hinter einem temporären Tunnel. Für die Produktion — API-Schlüssel im Header und Prüfung seitens FastAPI.
Keine Zeilenfilterung. Die Tools arbeiten mit dem gesamten Dataset: ein Ausschnitt „nur Region West für 2024“ lässt sich nicht erstellen. Das zeigt sich in der Demo — das Modell gibt ehrlich an, was es nicht berechnen kann, statt die Ausgabe anzupassen.
Fünf Skills, nicht mehr. Eine bewusste Entscheidung: besser fünf funktionierende als zehn formale.
Keine Unit-Tests — nur ein End-to-End-Selbsttest
selfcheck.pyund ein Integrationstest beider Transporte.
This server cannot be deployed
Maintenance
Related MCP Connectors
Clean messy tabular data and render publication-ready PNG charts from your AI assistant.
- OleanderOAuthdev.oleander
The all-in-one data stack for agents. Upload files, run SQL, evolve tables, and render charts.
Explore, clean, transform and export your Mammoth Analytics data from an AI client.
Ask questions about a CSV in plain English and get answers, charts and cleaned data back.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI-powered business intelligence and data analysis using pandas and LLM code generation. Supports automated data processing, statistical analysis, and visualization creation through natural language interactions.15-
- FlicenseNot gradedqualityDmaintenanceEnables conversational analysis of CSV and Parquet files through natural language, providing statistics, summaries, data type information, and comprehensive multi-step data analysis.-
- AlicenseNot gradedqualityCmaintenanceGives LLM agents access to local and remote data via databases, files, graphs, and structured documents, along with a full data science toolkit for analysis and modeling.23 PyPI13Apache 2.0
- AlicenseBqualityBmaintenanceEnables LLMs to work with Excel and CSV files through structured tools for workbook operations, formatting, charts, ETL, analysis, and more.695MIT