akij-hr-data-mcp
akij-hr-data-mcp
Ein produktionsreifer, schreibgeschützter, entfernter Model Context Protocol (MCP)-Server, der einen einzelnen Google-Drive-Ordner – das Repository AKIJ HR DATA – über modernen Streamable HTTP-Transport für MCP-kompatible Clients bereitstellt.
Es ist ein Allzweck-Drive-MCP: Es verarbeitet XLSX, XLS, CSV, PDF, DOCX, TXT, Bilder und native Google Docs/Sheets/Slides-Dateien – kein reines Excel-Werkzeug.
1. Was dieses Projekt tut
Stellt mithilfe eines Dienstkontos eine Verbindung zu Google Drive her (kein OAuth-Benutzerablauf, keine Browser-Anmeldung).
Beschränkt jeden Vorgang auf einen konfigurierten Ordner (
GOOGLE_DRIVE_FOLDER_ID) und dessen Unterordner. Dateien außerhalb dieses Baums werden nie zurückgegeben, selbst wenn das Dienstkonto sie technisch sehen könnte.Stellt 11 MCP-Tools zum Entdecken und Lesen von Dateien bereit (Liste, Suche, Metadaten, Inhalt und formatspezifische Extraktion für Excel/CSV/PDF/DOCX).
Läuft als Standard-Node/Express-HTTP-Server mit einem einzigen
POST /mcp-Endpunkt (Streamable-HTTP-Transport) und einemGET /health-Endpunkt, der auf Render (oder einem beliebigen Node-Host) bereitgestellt werden kann, sodass er weiterläuft, wenn Ihr PC ausgeschaltet ist.Erzwingt eine API-Schlüssel-Authentifizierung für jede MCP-Anfrage.
Ist strikt schreibgeschützt – es gibt keinen Codepfad, der eine Drive-Datei hochladen, bearbeiten, löschen, umbenennen, verschieben oder freigeben oder Berechtigungen ändern kann.
Related MCP server: Google Drive MCP Server
2. Architektur
Google Drive (AKIJ HR DATA folder)
↓ Drive API v3 (read-only scope)
Google Service Account (GCP_KEY_BASE64)
↓
GoogleDriveClient (src/google-drive.ts) — enforces folder-tree scope
↓
MCP Server (src/mcp-server.ts) — 11 tools, Zod-validated inputs
↓
Express app (src/index.ts) — API-key auth, Streamable HTTP transport
↓ POST /mcp (stateless, one transport per request)
↓
Render (always-on host)
↓ HTTPS
Remote MCP Clients (Claude, other MCP-compatible clients)Der Server ist zustandslos: Jede POST /mcp-Anfrage erhält eine eigene McpServer- + StreamableHTTPServerTransport-Instanz (sessionIdGenerator: undefined), sodass keine Session-Affinität erforderlich ist und er sich auf Render ohne Sticky Sessions horizontal skalieren lässt.
Projektstruktur
src/
index.ts Express app: /health, /mcp, startup
config.ts Environment variable loading/validation
auth.ts API-key authentication middleware
google-auth.ts Decodes GCP_KEY_BASE64 → JWT auth client
google-drive.ts Drive API client with folder-scope enforcement
mcp-server.ts McpServer wiring: registers all 11 tools
tools/
files.ts list_files, get_file_metadata, get_file_content, list_supported_files
search.ts search_files, search_repository
excel.ts inspect_excel, read_excel_sheet
csv.ts read_csv
pdf.ts extract_pdf_text
docx.ts extract_docx_text
utils/
errors.ts Typed AppError hierarchy + safe error serialization
limits.ts Size/row/timeout/pagination limits
mime-types.ts MIME → file-category classification
tests/ Jest test suite (46 tests, 10 suites)
.env.example
.gitignore
render.yaml Render Blueprint (optional one-click deploy)
README.md
package.json
tsconfig.json
jest.config.cjs3. Voraussetzungen
Node.js 20+ und npm
Ein Google-Cloud-Projekt mit aktivierter Google Drive API
Ein Google-Dienstkonto mit Viewer-Zugriff, das für den AKIJ HR DATA-Ordner in Google Drive freigegeben ist
Ein GitHub-Konto (zum Bereitstellen auf Render aus einem Repository)
Ein Render-Konto
4. Installation
npm install5. Umgebungsvariablen
Variable | Erforderlich | Beschreibung |
| nein (Standard | Der Port, auf dem der HTTP-Server lauscht. Render setzt diesen automatisch. |
| ja | Die Drive-Ordner-ID, auf die dieses MCP beschränkt ist. |
| ja | Base64-kodierter JSON-Schlüssel des Dienstkontos. |
| ja | Kommaseparierte Liste gültiger API-Schlüssel für |
Siehe .env.example für die Vorlage (es sind keine echten Geheimnisse eingecheckt).
6. Google-Cloud-Einrichtung
Gehen Sie zu console.cloud.google.com und wählen Sie ein Projekt aus oder erstellen Sie eines.
APIs & Services → Library → aktivieren Sie Google Drive API.
APIs & Services → Credentials → Create Credentials → Service Account.
Geben Sie ihm einen Namen (z. B.
akij-hr-data-mcp); keine projektweite IAM-Rolle ist erforderlich.Öffnen Sie das neue Dienstkonto → Keys → Add Key → Create new key → JSON. Dadurch wird eine Datei
gcp-key.jsonheruntergeladen – committen Sie diese Datei nicht.Notieren Sie die E-Mail-Adresse des Dienstkontos (sie sieht aus wie
akij-hr-data-mcp@your-project.iam.gserviceaccount.com).
7. Google-Drive-Berechtigungen
Öffnen Sie den Ordner AKIJ HR DATA in Google Drive (Ordner-ID
1oxYLPcC9MPVuxsbeP0kGgYhLmkxt0w2o).Klicken Sie auf Share, fügen Sie die E-Mail-Adresse des Dienstkontos ein und gewähren Sie Viewer-Zugriff.
Gewähren Sie keinen Editor-/Eigentümer-Zugriff – dieser Server schreibt nie nach Drive, daher ist Viewer ausreichend und sicherer.
8. Lokale Einrichtung
npm install
cp .env.example .env
# fill in GOOGLE_DRIVE_FOLDER_ID, GCP_KEY_BASE64, API_KEYS in .env
npm run devnpm run dev führt den TypeScript-Server direkt mit tsx watch aus (kein Build-Schritt für die lokale Iteration erforderlich).
9. Generieren von GCP_KEY_BASE64
Sie sollten das rohe Dienstkonto-JSON niemals in einen Chat, Quellcode oder .env.example einfügen. Generieren Sie den Base64-Wert lokal aus Ihrer heruntergeladenen gcp-key.json-Datei und legen Sie ihn nur in Ihrer lokalen .env (gitignored) oder in den Umgebungsvariablen von Render ab.
PowerShell:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("$HOME\Downloads\gcp-key.json")) | Set-ClipboardDies liest die Schlüsseldatei und kopiert die Base64-Zeichenfolge direkt in Ihre Zwischenablage – fügen Sie sie als Wert von GCP_KEY_BASE64 in .env (lokal) oder im Render-Dashboard (für die Bereitstellung) ein. Passen Sie den Pfad an, wenn sich gcp-key.json nicht in Ihrem Downloads-Ordner befindet.
Falls Sie es lieber im Terminal ausgeben möchten statt in die Zwischenablage:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("$HOME\Downloads\gcp-key.json"))10. Lokales Testen
Starten Sie den Server:
npm run devHealth-Check prüfen:
curl http://localhost:10000/healthRufen Sie ein MCP-Tool (Beispiel: list_files) mit curl auf, indem Sie die Sequenz initialize → tools/call verwenden, oder richten Sie einen beliebigen Streamable-HTTP-fähigen MCP-Client auf http://localhost:10000/mcp mit dem Header X-Api-Key: <einer Ihrer API_KEYS>.
11. Erstellen
npm run buildKompiliert src/ (TypeScript, NodeNext ESM) nach dist/. Führen Sie npm run typecheck aus, um den Typcheck ohne Dateiausgabe durchzuführen.
Test-Suite ausführen:
npm testDies führt Jest im In-Band-Modus aus (46 Tests in 10 Suiten: Konfiguration, Authentifizierung, Google-Authentifizierung, Durchsetzung des Drive-Ordnerbereichs, alle 11 Tools und die /health-//mcp-HTTP-Endpunkte).
12. GitHub-Einrichtung
git init
git add .
git commit -m "Initial commit: akij-hr-data-mcp"
git branch -M main
git remote add origin https://github.com/<your-username>/akij-hr-data-mcp.git
git push -u origin main.env, gcp-key.json, *.pem und *.key sind bereits gitignored – überprüfen Sie vor dem Committen mit git status, dass nichts Geheimes bereitgestellt wird.
13. Render-Bereitstellung
Gehen Sie zu render.com → New → Web Service.
Verbinden Sie Ihr GitHub-Repository (
akij-hr-data-mcp).Render erkennt
render.yaml(Blueprint) automatisch, oder Sie konfigurieren manuell:Build Command:
npm install && npm run buildStart Command:
npm startHealth Check Path:
/health
Fügen Sie die Umgebungsvariablen (Abschnitt 14) im Render-Dashboard hinzu – committen Sie sie nie.
Bereitstellen. Render erstellt den Build, startet den Dienst und hält ihn unabhängig von Ihrem PC am Laufen.
14. Render-Umgebungsvariablen
Setzen Sie diese in Render → Ihr Dienst → Environment:
PORT=10000
GOOGLE_DRIVE_FOLDER_ID=1oxYLPcC9MPVuxsbeP0kGgYhLmkxt0w2o
GCP_KEY_BASE64=<paste the base64 string from step 9>
API_KEYS=<comma-separated production keys, e.g. key-abc123,key-def456>Generieren Sie starke, zufällige API-Schlüssel, z. B.:
[Convert]::ToBase64String([Guid]::NewGuid().ToByteArray()) -replace '[+/=]',''15. Health-Endpunkt
GET /health{ "status": "ok", "timestamp": "2026-08-17T12:00:00.000Z" }Keine Authentifizierung erforderlich; es werden keine Geheimnisse oder internen Zustände offengelegt.
16. MCP-Endpunkt
POST /mcpImplementiert den MCP-Streamable HTTP-Transport (
@modelcontextprotocol/sdkStreamableHTTPServerTransport), zustandslos (sessionIdGenerator: undefined) – kein reines SSE-Fallback.Erfordert Authentifizierung:
Authorization: Bearer <API_KEY>- oderX-Api-Key: <API_KEY>-Header.GET /mcpundDELETE /mcpgeben405zurück – dieser Server verwaltet keine Sitzungen und unterstützt den optionalen SSE-Stream nicht.
17. Verbinden des entfernten MCP mit Clients
Nach der Bereitstellung lautet Ihr MCP-Endpunkt:
https://<your-render-service>.onrender.com/mcpFür MCP-Clients, die Remote-/HTTP-Server unterstützen, fügen Sie einen Servereintrag hinzu mit:
URL:
https://<your-render-service>.onrender.com/mcpTransport: Streamable HTTP
Headers:
X-Api-Key: <einer Ihrer API_KEYS>(oderAuthorization: Bearer <API_KEY>)
Beispiel für eine generische Client-Konfiguration:
{
"mcpServers": {
"akij-hr-data": {
"url": "https://<your-render-service>.onrender.com/mcp",
"headers": {
"X-Api-Key": "<API_KEY>"
}
}
}
}18. Sicherheit
Schreibgeschützt: Es gibt kein Upload-/Lösch-/Bearbeiten-/Umbenennen-/Verschieben-/Freigabe-/Berechtigungstool in dieser Codebasis.
Ordnerbezogen:
GoogleDriveClient.assertFileInScopedurchläuft dieparents-Kette jeder Datei bis zur konfigurierten Wurzel, bevor Metadaten oder Inhalte zurückgegeben werden; Dateien außerhalb des Baums lösen eineForbiddenErroraus.API-Schlüssel-Authentifizierung: Jede
POST /mcp-Anfrage wird mit einem timing-sicheren Vergleich (crypto.timingSafeEqual) gegenAPI_KEYSgeprüft. Fehlende/ungültige Schlüssel erhalten401.Anmeldeinformationen werden nie protokolliert oder zurückgegeben: Das dekodierte Dienstkonto-JSON bleibt in
google-auth.ts; kein Tool, keine Protokollzeile und keine Fehlermeldung kann es offenlegen. Fehlerantworten werden durchtoSafeErrorMessagegeleitet, das Stack-Traces und rohe Upstream-Fehlertexte entfernt.Größen-/Ausgabelimits: Downloads sind begrenzt (
LIMITS.MAX_DOWNLOAD_BYTES/MAX_PARSE_BYTES), Textextraktion wird abgeschnitten (MAX_TEXT_OUTPUT_CHARS), Zeilen werden paginiert (DEFAULT_ROW_LIMIT/MAX_ROW_LIMIT), und jeder ausgehende Google-API-Aufruf hat ein Timeout (GOOGLE_API_TIMEOUT_MS).Erweiterbare Authentifizierung:
req.identityist eine kleine, stabile Struktur ({ keyId }), die so entworfen wurde, dass eine zukünftige benutzerbezogene Schlüssel-, OAuth- oder rollenbasierte Autorisierungsebene umfangreichere Ansprüche anhängen kann, ohne jede Aufrufstelle zu ändern.Bekannte Abhängigkeitswarnung: Das Paket
xlsx(SheetJS), das für das Parsen von altem.xlsverwendet wird, hat eine veröffentlichte Warnung mit hohem Schweregrad (Prototype Pollution / ReDoS). Es wird nur für interne, zugriffsgeschützte Dateien aus Ihrem eigenen Drive-Ordner verwendet (nicht für willkürliche Internet-Uploads), und Dateien werden vor dem Parsen größenmäßig begrenzt. Führen Sie regelmäßignpm auditaus und erwägen Sie einen Ersatz, sobald eine gepatchte Version verfügbar ist.
Sicherheits-Checkliste
gcp-key.jsonwurde nie in Git eingecheckt.envwurde nie in Git eingechecktAPI_KEYSsind in Render auf starke, zufällige Werte gesetzt (nicht den lokalen Entwicklerwert)Dienstkonto hat nur Viewer-Zugriff auf den Drive-Ordner
GOOGLE_DRIVE_FOLDER_IDentspricht dem vorgesehenen Repository-OrdnerRender-Umgebungsvariablen werden direkt im Dashboard gesetzt, nie in committeten Werten von
render.yaml
19. Fehlerbehebung
Symptom | Ursache | Behebung |
Server beendet sich sofort mit einem | Fehlende/ungültige Umgebungsvariable | Überprüfen Sie die genaue Variable, die in der Fehlermeldung genannt wird, anhand von Abschnitt 5 |
| Falsche Datei kodiert, oder die Zeichenfolge wurde durch Kopieren/Einfügen abgeschnitten | Mit dem PowerShell-Befehl in Abschnitt 9 neu generieren |
| Dienstkonto nicht für den Ordner freigegeben oder mit der falschen E-Mail freigegeben | Abschnitt 7 erneut prüfen; bestätigen Sie, dass die |
| Sie haben eine | Verwenden Sie |
| Fehlender/ungültiger API-Schlüssel | Senden Sie |
| Datei überschreitet das konfigurierte Byte-Limit | Das ist beabsichtigt; große Dateien werden abgelehnt, anstatt vollständig in den Speicher geladen zu werden (siehe |
Render-Dienst schläft / Start dauert lange (Cold Start) | Kostenlose/Starter-Render-Pläne wechseln nach Inaktivität in den Ruhezustand | Render-Plan upgraden oder die Cold-Start-Verzögerung bei der ersten Anfrage akzeptieren |
Tests hängen lokal minutenlang |
| Bereits entschärft: |
Verbleibende manuelle Schritte (nur Sie können diese ausführen)
Generieren Sie
GCP_KEY_BASE64aus Ihrer heruntergeladenengcp-key.json(Abschnitt 9) und fügen Sie sie Ihrer lokalen.env-Datei für Tests hinzu.Teilen Sie den AKIJ HR DATA Drive-Ordner mit der E-Mail-Adresse Ihres Dienstkontos als Viewer (Abschnitt 7).
Führen Sie es lokal aus (
npm run dev) und bestätigen Sie, dassGET /healthund ein echterlist_files-Aufruf gegen Ihren echten Drive-Ordner funktionieren.Pushen Sie zu GitHub (Abschnitt 12).
Erstellen Sie den Render-Webdienst, verbinden Sie das Repository und setzen Sie die vier Umgebungsvariablen im Render-Dashboard (Abschnitte 13–14) — Render wird automatisch bauen und bereitstellen.
Generieren Sie Produktions-
API_KEYS(verschieden von jedem lokalen Entwicklungs-Key) und speichern Sie diese sicher für Ihre MCP-Clients.Verbinden Sie Ihren MCP-Client mit
https://<your-render-service>.onrender.com/mcp(Abschnitt 17).
This server cannot be deployed
Maintenance
Related MCP Connectors
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Read-only MCP server exposing a user ORANO library to their own AI agent.
Public read-only MCP server for Genvernium product and developer resources.
Document conversion MCP server: PDF to Markdown, image OCR, spreadsheet parsing.
Related MCP Servers
- -licenseNot gradedqualityAmaintenanceThis MCP server integrates with Google Drive to allow listing, reading, and searching over files.4,556 npm90,939MIT
- AlicenseNot gradedqualityDmaintenanceA server that provides a Machine Control Protocol (MCP) interface to search, access, and interact with Google Drive files and folders, enabling AI assistants to work with Google Drive content.8MIT
- FlicenseNot gradedqualityCmaintenanceA read-only Google Drive MCP server that allows searching files, reading file content (with auto-export for Google Docs, Sheets, Slides), and retrieving file metadata via OAuth authentication.15 npm2-
- AlicenseAqualityAmaintenanceMCP server for interacting with Google Drive using a service account, restricted to a specific root folder. Supports file operations like search, list, create, update, and read.436 npm1MIT