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 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
- -license-qualityAmaintenanceThis MCP server integrates with Google Drive to allow listing, reading, and searching over files.4,90789,405MIT
- Alicense-qualityDmaintenanceA 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
- Flicense-qualityCmaintenanceA 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.262
- 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.4396MIT
Related MCP Connectors
MCP server for Google search results via SERP API
MCP server for AgentDocs (agentdocs.eu): read, search, write, comment on & share Markdown docs.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
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/mdshahabdulaziz-beep/mcp-akij'
If you have feedback or need assistance with the MCP directory API, please join our Discord server