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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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 gradedqualityAmaintenanceGives 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.3Apache 2.0
- AlicenseBqualityCmaintenanceEnables LLMs to work with Excel and CSV files through structured tools for workbook operations, formatting, charts, ETL, analysis, and more.692MIT
Related MCP Connectors
Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.
The grounded data layer for any LLM: governed SQL, metrics, lineage and catalog over your data.
The statistical analyst in your AI chat — validated, citable, re-runnable analysis of your data.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Kirill-FD/llm-analytics-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server