Skip to main content
Glama

ExcelMCP

Eine Live-Excel-Intelligenzschicht für KI-Agenten. Richten Sie es auf einen OneDrive-Ordner aus und Ihr Agent kann Fragen zu diesen Tabellenkalkulationen in einfachem Englisch stellen – zu den Zahlen, die gerade darin stehen.

Python License: MIT MCP Built with FastMCP Microsoft Graph Status PRs welcome


Das Problem, das dies löst

Die meisten Tabellenkalkulations-Integrationen funktionieren, indem sie Ihre Daten woanders hin kopieren. Sie erfassen die Arbeitsmappe, teilen sie auf, betten die Zellenwerte ein und speichern das Ganze in einer Vektordatenbank. Von diesem Moment an beantwortet Ihr Agent Fragen zu einer Momentaufnahme. Jemand aktualisiert um 9 Uhr das Inventarblatt und der Agent zitiert immer noch die Zahlen von Dienstag.

ExcelMCP teilt das Problem in zwei Teile.

Die Struktur wird zwischengespeichert. Dateinamen, Blattnamen, Spaltenüberschriften, wo die Kopfzeile beginnt, welche Spalten Daten enthalten, wie Blätter zueinander in Beziehung stehen – plus eine kleine Stichprobe unterschiedlicher Bezeichnungen pro Spalte mit geringer Kardinalität, was das Routing über hundert fast identische Blätter hinweg ermöglicht. Dies ändert sich selten, ist billig zu speichern und ist das, was der Agent braucht, um zu wissen, wonach er fragen muss. (Die Stichprobenbezeichnungen sind der einzige Ort, an dem die Struktur Werte berührt; die genaue Grenze wird in Was landet auf der Festplatte erläutert.)

Daten werden nie zwischengespeichert. Jeder Tool-Aufruf, der eine Zahl zurückgibt, geht an die Microsoft Graph API und holt sie live ab. Es gibt keinen Daten-Cache, der veralten könnte, keinen Synchronisationsjob, der zurückfallen könnte, und keine Antwort, die jemals von der Festplatte bedient wird.

Jede Antwort enthält einen metadata.fetched_at-Zeitstempel und ein is_cached: false-Flag, damit das Modell im Band sehen kann, dass es frische Daten betrachtet.


Related MCP server: Microsoft 365 MCP Server

So funktioniert es

Eine Frage in natürlicher Sprache wird eingebettet, per Kosinusähnlichkeit mit den Blattbeschreibungen abgeglichen und dann durch lexikalische Überlappung mit Spaltennamen und Stichprobenwerten neu bewertet – das hält das Routing sinnvoll, wenn zwanzig Arbeitsmappen ein Schema teilen. Diese Blätter, und nur diese, werden live abgerufen. Filterung und Aggregation erfolgen dann in pandas auf dem frisch abgerufenen DataFrame. Einwertige Fragen überspringen die Zeilenpipeline vollständig: lookup liest eine Schlüsselspalte und eine Zeile und gibt die Zelle mit ihrer Herkunft zurück.


Voraussetzungen

  • Python 3.10 oder neuer

  • Ein Microsoft 365-Konto mit OneDrive

  • uv oder einfaches pip, wenn Sie bevorzugen


Installation

Aus dem Repository-Stammverzeichnis:

git clone https://github.com/Karunya-Muddana/ExcelMCP.git
cd ExcelMCP

uv sync      # install dependencies
uv build     # build the wheel
pip install dist/excelmcp-0.3.0-py3-none-any.whl

Oder direkt aus dem Quellcode installieren, ohne zu bauen:

pip install .

Es gibt keinen Compiler-Schritt und keine native Erweiterung, die gebaut werden muss. Die Vektorsuche verwendet einen NumPy-Kosinus-Scan anstelle von hnswlib, speziell damit pip install auf einem Rechner ohne C++-Toolchain funktioniert.


Einrichtung

Führen Sie den Assistenten einmal aus:

excelmcp-setup

Er führt durch vier Schritte:

  1. Microsoft-Gerätefluss-Anmeldung. Sie erhalten einen Code, den Sie im Browser einfügen, der Token-Cache landet in ~/.excelmcp/token.json mit 0600-Berechtigungen.

  2. Welcher OneDrive-Ordner indiziert werden soll, z. B. /ERP.

  3. Ein Scan jeder .xlsx in diesem Ordner, um den Strukturgraphen und die Einbettungen zu erstellen.

  4. Erkennung der bereits auf Ihrem Rechner installierten KI-Agenten und ein schriftlicher Konfigurationseintrag für diejenigen, die Sie auswählen.

Agenten, die es automatisch konfigurieren kann

Agent

Konfigurationsdatei

Claude Code

~/.claude.json

Claude Desktop

claude_desktop_config.json

Cursor

~/.cursor/mcp.json

Windsurf

~/.codeium/windsurf/mcp_config.json

Gemini CLI

~/.gemini/settings.json

Codex CLI

~/.codex/config.toml

VS Code (Copilot)

VS Code Benutzer mcp.json

Cline

Erweiterung cline_mcp_settings.json

Continue

~/.continue/config.yaml

Goose

~/.config/goose/config.yaml

Zed

~/.config/zed/settings.json

Hermes

~/.hermes/config.yaml

Vorhandene Konfigurationsdateien werden gesichert, bevor sie geändert werden. Wenn Ihr Agent nicht auf der Liste steht, gibt der Assistent den genauen JSON- oder TOML-Block aus, den Sie selbst einfügen können.

Weitere Assistentenbefehle

excelmcp-setup list-agents           # show what was detected
excelmcp-setup install --only cursor # register with one agent, skip the rescan
excelmcp-setup doctor                # diagnose a broken install
excelmcp-setup uninstall             # remove ExcelMCP from every agent config
excelmcp-setup --folder /ERP --yes   # fully non-interactive
excelmcp-setup --dry-run             # print the changes, write nothing

Für den Agenten verfügbare Tools

Tool

Netzwerk

Funktion

get_workspace_graph

keins

Vollständige Struktur des Arbeitsbereichs: Dateien, Blätter, Spalten, Tabellenbereiche, Beziehungen, Namensvarianten, Alter des Scans. Sofort.

inspect_file

keins

Gleiches, eingeschränkt auf eine Datei, mit ungefähren Zeilenanzahlen zum Zeitpunkt des letzten Scans. Sofort.

scan_workspace

schwer

OneDrive neu durchsuchen und Struktur, Stichprobenwerte, Beziehungen, Einbettungen neu erstellen.

query

live

Frage in natürlicher Sprache, geroutet durch Vektorähnlichkeit plus lexikalisches Reranking.

lookup

live

Ein Aufruf → ein Zellenwert mit Datei-/Blatt-/Zellen-Herkunft und einem Konfidenzsignal.

get_cell

live

Eine adressierte Zelle in einer Graph-Anfrage.

filter_sheet

live

Ein Blatt abrufen, Zeilen zurückgeben, die Bedingungen entsprechen.

aggregate

live

Ein Blatt abrufen, gruppieren und reduzieren, mit having.

cross_file_aggregate

live

Passende Blätter aus jeder Datei abrufen, zu einer Summe zusammenführen.

join_sheets

live

Zwei Blätter über Schlüsselspalten zusammenführen, vorgeschlagen aus bekannten Beziehungen.

derive

live

Vorzeichenbehaftete Summe über Transaktionstypen – Nettobestand in einem Aufruf.

Die beiden Struktur-Tools sind kostenlos und sofort, da sie den lokalen Graphen lesen. Alles, was mit live markiert ist, geht bei jedem einzelnen Aufruf an die API.


Verwendung

Sobald der Server registriert ist, sprechen Sie meist einfach normal mit Ihrem Agenten. Im Hintergrund führt er Aufrufe wie diese durch.

Zuerst orientieren. Der Agent sollte dies immer tun, bevor er einen Spaltennamen errät, da keine zwei Unternehmen Dinge gleich benennen:

get_workspace_graph(folder_path="/ERP")

Eine Frage stellen, ohne zu wissen, wo die Antwort lebt:

query("what are the top 10 products by sales value", folder_path="/ERP")

Ein bekanntes Blatt filtern:

filter_sheet(
    file_name="Inventory.xlsx",
    sheet="Stock",
    conditions={"Status": "Low", "Quantity": "<50"},
    folder_path="/ERP",
    sort_by="Quantity",
    limit=100,
)

Unterstützte Bedingungsoperatoren, alle mit UND verknüpft:

Form

Bedeutung

{"Spalte": "Wert"}

exakte Übereinstimmung – groß-/kleinschreibungs- und leerzeichenunabhängig; exact_case=True für strenge Übereinstimmung übergeben

{"Spalte": "~Wert"}

enthält, wörtlicher Teilstring, kein Regex

{"Spalte": ">100"}

größer als (auch >=, <, <=)

{"Spalte": ">=2026-01-01"}

Datumsgrenze, ISO-8601, funktioniert bei erkannten Datumsspalten

{"Spalte": {"in": ["a", "b"]}}

einer der aufgeführten Werte

{"Spalte": {"between": [10, 500]}}

inklusive Bereich, numerisch oder Datum

{"Spalte": {">=": "2026-01-01", "<": "2026-04-01"}}

kombinierte Grenzen

{"Spalte": {"is_null": false}}

Null-Prüfung – Leerzeichen und leere Zeichenfolgen gelten als null

Ein Spaltenname oder Operator, der nicht existiert, erzeugt einen Fehler, anstatt stillschweigend null Zeilen zurückzugeben – das ist der Fehlermodus, der dazu führt, dass ein Agent selbstbewusst die falsche Sache meldet. Wenn Bedingungen legitim nichts finden, enthält die Antwort zero_match_diagnostics – was jede Bedingung für sich allein gefunden hat, plus bis zu zwanzig tatsächlich in der betreffenden Spalte vorhandene Werte – damit eine knapp verfehlte Übereinstimmung korrigiert wird, anstatt als „keine Daten" gemeldet zu werden.

Nach einer einzelnen Zahl in einem Aufruf fragen:

lookup(query="contracted rate for Titanium Dioxide under the BESTEX contract",
       folder_path="/Contracts")

Die Antwort kommt mit Herkunft – Datei, Blatt, Zelladresse, die übereinstimmende Zeile – und einem Konfidenzfeld. Mehrere übereinstimmende Zeilen geben ambiguous mit jeder Zeile zurück; Blätter, die widersprechen, geben conflict mit jeder Version und keinem Wert zurück; ein falsch geschriebener Schlüssel gibt unscharfe Vorschläge zurück. Das Tool gibt niemals eine bloße Zahl zurück.

Gruppieren und reduzieren innerhalb einer Datei:

aggregate(
    file_name="Sales.xlsx",
    sheet="Q1",
    group_by="Region",
    value_col="Revenue",
    operation="sum",
    folder_path="/ERP",
)

Dasselbe Blatt über alle Dateien im Arbeitsbereich summieren:

cross_file_aggregate(
    sheet="Q1",
    value_col="Revenue",
    operation="sum",
    folder_path="/ERP",
    conditions={"Status": "Closed"},
)

cross_file_aggregate gibt eine Aufschlüsselung pro Datei zusammen mit der Gesamtsumme zurück, plus skipped_files, wenn eine Datei nicht gelesen werden konnte, und unmatched_files – mit did_you_mean-Kandidaten – für jede Datei, die nicht den genauen Blattnamen enthält. Auf diese Weise ist eine partielle Summe sichtbar partiell, anstatt stillschweigend falsch zu sein, einschließlich des Falls, wenn das Blatt in einigen Dateien Sales und in anderen Sales 2024 heißt. Überprüfen Sie sheet_name_variants in get_workspace_graph, bevor Sie aggregieren, um diese Fragmentierung im Voraus zu sehen.


Agenten-Spielbuch

Den Server zu installieren ist die einfache Hälfte. Der Ordner agents/ deckt die andere Hälfte ab: wie man einen Agenten, der diese Tools hat, auffordert, wie man ihn in jeden Host einbindet und was zu automatisieren ist, sobald es funktioniert.

agents/system-prompt.md

Ein einsatzbereiter System-Prompt für benutzerdefinierte Agents, Subagents, CLAUDE.md oder Cursor-Regeln. Vollständige und gekürzte Versionen, plus eine Vorlage zum Festlegen der Eigenheiten Ihres eigenen Arbeitsbereichs.

agents/prompts.md

Copy-Paste-Prompts, sortiert nach Aufgabe: Orientierung, direkte Antworten, Analyse, Verifikation, Berichterstattung, Datenqualität. Endet mit einer Reihe von Anti-Prompts, den plausibel klingenden Formulierungen, die zuverlässig falsche Antworten liefern.

agents/guides/getting-started.md

Eine erste Sitzung, die beweist, dass die Kette durchgängig funktioniert, einschließlich der Möglichkeit, selbst zu überprüfen, dass die Daten wirklich live sind.

agents/guides/hosts.md

Was in jede der zwölf unterstützten Host-Konfigurationen geschrieben wird, wie man es überprüft, hostspezifische Eigenheiten und wie man den Server programmatisch ohne Host betreibt.

agents/guides/query-patterns.md

Welches Werkzeug man verwenden sollte, wie semantisches Routing tatsächlich ein Blatt auswählt, was die Bedingungssyntax nicht ausdrücken kann und welche Datenformen zu selbstsicheren falschen Antworten führen.

agents/guides/troubleshooting.md

Symptome entschlüsselt, von PATH-Problemen und 403ern bis hin zu verstümmelten Spaltennamen und doppelten Summen.

agents/routines/

Vier planbare Routinen: täglicher Inventurcheck, wöchentlicher Verkaufsbericht, Monatsabschlussabstimmung, Datenqualitätsaudit. Jede mit Prompt, Zeitplanung und dem, was typischerweise schiefgeht.

Im Server integrierte Schutzmaßnahmen

Der Server liefert eine Reihe von Betriebsregeln in seinen MCP-Anweisungen mit, die das Host-Modell liest, bevor es seinen ersten Aufruf tätigt. Sie existieren, weil dies die spezifischen Arten sind, wie ein LLM Tabellenkalkulationsfragen falsch beantwortet:

  • Gehen Sie niemals von einem Dateinamen, Blattnamen oder Spaltennamen aus. Entdecken Sie ihn aus dem Graphen.

  • Addieren Sie niemals dateiübergreifende Zahlen im Kopf. Rufen Sie cross_file_aggregate auf und lassen Sie das Tool die Arbeit machen.

  • Greifen Sie niemals auf openpyxl, pandas.read_excel oder das lokale Dateisystem zurück. Die Dateien befinden sich nicht auf diesem Rechner.

  • Summieren Sie niemals eine Mengenspalte in transaktionsartigen Daten roh – verwenden Sie derive mit den ausgeschriebenen Transaktionstypen.

  • Datumsangaben kommen als ISO-8601-Zeichenketten an, die bereits vom Server aus Seriennummern konvertiert wurden. Führen Sie niemals manuelle Serienarithmetik durch.

  • Rufen Sie für eine einzelne Zahl lookup auf und zitieren Sie die zurückgegebene Herkunft; zeigen Sie die Ergebnisse ambiguous und conflict an, anstatt einen Wert auszuwählen.

  • Überprüfen Sie die Felder truncated und total_matched, bevor Sie ein Ergebnis als vollständig bezeichnen.

Hosts, die Serveranweisungen ignorieren, und benutzerdefinierte Agents, die Sie selbst erstellen, benötigen diese Angabe in ihrem eigenen Prompt. Siehe agents/system-prompt.md.


Konfiguration

Variable

Standard

Zweck

EXCELMCP_CLIENT_ID

integriert

Azure AD-Anwendungs-Client-ID

EXCELMCP_TENANT_ID

common

Mandant. Verwenden Sie common für persönliche Konten.

EXCELMCP_DEFAULT_FOLDER

nicht gesetzt

Ordner, der verwendet wird, wenn ein Tool-Aufruf folder_path auslässt. Der Assistent schreibt dies in Ihre Agent-Konfiguration.

EXCELMCP_MAX_CONCURRENCY

8

Maximale gleichzeitige Microsoft Graph-Anfragen über alle Codepfade hinweg.

Die integrierte Client-ID ist ein öffentlicher Client, der für den Gerätecode-Flow verwendet wird. Sie trägt kein Geheimnis, ist absichtlich in jeder Authentifizierungsanfrage sichtbar und kann bedenkenlos in diesem Repository vorhanden sein. Tauschen Sie sie gegen Ihre eigene App-Registrierung aus, wenn der Zustimmungsbildschirm den Namen Ihrer Organisation tragen soll.


Was auf der Festplatte landet

~/.excelmcp/
  token.json           MSAL token cache. Auth material only, written 0600.
  graph.json           Structure graph: item IDs, sheet names, column headers,
                       used-range dimensions, date column types, per-sheet
                       table regions, inferred and formula-declared
                       relationships — and sampled values (see below).
  vectors.npy          Embedded sheet descriptions for semantic routing.
  metadata.json        Labels and lexical terms tying each embedding to a sheet.
  relationships.yaml   Optional, written by you: declared join relationships.

Die ehrliche Version der No-Cache-Behauptung, Stand 0.3.0. Keine Zeile Ihrer Daten, kein Zellraster und kein abfragbarer Wert wird auf der Festplatte gespeichert – jede Antwort wird immer aus einem Live-Abruf bedient. Es gibt eine bewusste Ausnahme: graph.json speichert Stichprobenwerte, bis zu 50 unterschiedliche Textbezeichnungen pro Spalte mit niedriger Kardinalität (Kundennamen, Status, Materialnamen, Einheiten), die zum Scan-Zeitpunkt erfasst werden. Sie existieren, damit hundert strukturell identische Blätter bei der Weiterleitung einer Frage unterscheidbar sind, damit lookup finden kann, welches Blatt "BESTEX" enthält, ohne alles herunterzuladen, und damit Beziehungen aus Wertüberlappungen abgeleitet werden können, anstatt aus Spaltennamen angenommen zu werden. Sie sind Routing-Nachweise, kein Daten-Cache: Nichts beantwortet jemals eine Frage aus ihnen, und ein Arbeitsbereichs-Scan aktualisiert sie vollständig. Der Graph speichert auch einen blattspezifischen Struktur-Fingerabdruck (Kopfzeilenspalten und verwendeter Bereich) ausschließlich zur Erkennung von Abweichungen, und – neu in 0.3.0 – eine Regionenkarte: die Zeilenspannen jedes Tabellenkörpers auf einem Blatt, abgeleitet aus den Bereichen, auf die die eigenen SUM/COUNT/AVERAGE-Formeln des Blattes verweisen, plus die Adressen, die jede blattübergreifende Formel liest. Dies sind Zeilennummern und Zelladressen, keine Inhalte; es wird kein Wert gelesen, um sie zu erzeugen. Das label einer Region, sofern vorhanden, ist die zweite bewusste Ausnahme neben den Stichprobenwerten: ein paar Worte, die aus der Abschnittsbanner-Zelle unmittelbar über einer Region gelesen werden ("NAPHTHALENE", "OLEUM 65%"), aufbewahrt, damit das Modell benennen kann, welche Tabelle es meint, anstatt aus Zeilennummern zu raten. Es handelt sich um strukturelle Metadaten, die das Layout des Blattes beschreiben, nicht um Zeilendaten – dieselbe Unterscheidung, die Stichprobenwerte bereits ziehen. Wenn Ihnen das alles zu viel auf der Festplatte ist, scannen Sie diesen Ordner nicht; wenn Sie die Grenze überprüfen möchten, ist graph.json klein und lesbar, also schauen Sie nach.

Unter Windows schaltet os.chmod nur das Read-Only-Bit um, daher ist der Modus 0600 dort ein Best-Effort-Versuch, und der eigentliche Schutz ist die standardmäßige benutzerspezifische ACL auf %USERPROFILE%. Unter macOS und Linux wird der Modus auf die temporäre Datei angewendet, bevor Inhalt geschrieben wird, sodass das Token nie kurzzeitig weltweit lesbar ist.


Tests

# offline unit tests, no network and no credentials required
pytest tests/test_unit.py

# live integration tests against a workspace you have already scanned, opt in
EXCELMCP_TEST_FOLDER=/ERP pytest tests/test_live_integration.py -v

Die Integrationssuite überspringt sich selbst, wenn EXCELMCP_TEST_FOLDER nicht gesetzt ist, sodass ein einfacher pytest-Lauf offline bleibt.


Projektstruktur

agents/           prompts, host guides, and schedulable routines
auth.py           MSAL device flow, token cache, proactive refresh
graph_client.py   Graph API wrapper, 429 backoff, shared concurrency gate
structure.py      Structure discovery, value sampling, relationship inference
embeddings.py     FastEmbed vectors, NumPy cosine search, lexical rerank
query_engine.py   Conditions, live fetch, aggregation, joins, derive
lookup.py         Single-cell lookup pipeline and get_cell
ranges.py         A1-notation range arithmetic
main.py           FastMCP tool definitions and server entry point
cli.py            Setup wizard, agent detection, config writing
agents.py         Per agent config formats and file locations
storage.py        Atomic writes, stderr logging, config directory handling

Mitwirken

Issues und Pull-Requests sind willkommen. Wenn Sie Unterstützung für einen weiteren Agenten hinzufügen, ist agents.py die einzige Datei, die Sie bearbeiten müssen: Fügen Sie ein AgentSpec mit dem Konfigurationspfad, der Eintragsform und einem Erkennungshinweis hinzu.


Lizenz

MIT. Siehe LICENSE.

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

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/Karunya-Muddana/ExcelMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server