akij-hr-data-mcp
akij-hr-data-mcp
一个生产就绪、只读、远程的 Model Context Protocol (MCP) 服务器,通过现代 Streamable HTTP 传输,将单个 Google Drive 文件夹(即 AKIJ HR DATA 仓库)开放给兼容 MCP 的客户端。
它是一个通用 Drive MCP:可处理 XLSX、XLS、CSV、PDF、DOCX、TXT、图片以及原生 Google Docs/Sheets/Slides 文件——并非仅限 Excel 的工具。
1. 这个项目做什么
使用服务账号连接 Google Drive(没有用户 OAuth 流程,也不需要浏览器登录)。
将所有操作限制在一个已配置的文件夹(
GOOGLE_DRIVE_FOLDER_ID)及其子文件夹内。超出该目录树的文件永远不会被返回,即使服务账号在技术上能够看到它们。提供 11 个 MCP 工具,用于发现和读取文件(列表、搜索、元数据、内容,以及针对 Excel/CSV/PDF/DOCX 的格式特定提取)。
作为标准的 Node/Express HTTP 服务器运行,带有一个
POST /mcp端点(Streamable HTTP 传输)和一个GET /health端点,可部署到 Render(或任何 Node 主机),以便在您的 PC 关闭时继续运行。在每一个 MCP 请求上强制实施 API 密钥身份验证。
严格只读——不存在任何能够上传、编辑、删除、重命名、移动、共享 Drive 文件或更改权限的代码路径。
Related MCP server: Google Drive MCP Server
2. 架构
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)服务器是无状态的:每个 POST /mcp 请求都会获得自己的 McpServer + StreamableHTTPServerTransport 实例(sessionIdGenerator: undefined),因此没有会话亲和性要求,并且可以在 Render 上无需粘性会话地进行水平扩展。
项目结构
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. 先决条件
Node.js 20+ 和 npm
一个已启用 Google Drive API 的 Google Cloud 项目
一个在 AKIJ HR DATA Drive 文件夹上共享了 Viewer 访问权限的 Google 服务账号
一个 GitHub 账号(用于从仓库部署到 Render)
一个 Render 账号
4. 安装
npm install5. 环境变量
变量 | 是否必需 | 描述 |
| 否(默认 | HTTP 服务器监听的端口。Render 会自动设置此项。 |
| 是 | 此 MCP 被限制访问的 Drive 文件夹 ID。 |
| 是 | Base64 编码的服务账号 JSON 密钥。 |
| 是 | 用于 |
模板见 .env.example(没有提交任何真实机密)。
6. Google Cloud 设置
转到 console.cloud.google.com 并选择/创建一个项目。
APIs & Services → Library → 启用 Google Drive API。
APIs & Services → Credentials → Create Credentials → Service Account。
为它命名(例如
akij-hr-data-mcp),不需要项目级 IAM 角色。打开新的服务账号 → Keys → Add Key → Create new key → JSON。这会下载一个
gcp-key.json文件——不要提交此文件。记下服务账号的电子邮件地址(看起来像
akij-hr-data-mcp@your-project.iam.gserviceaccount.com)。
7. Google Drive 权限
在 Google Drive 中打开 AKIJ HR DATA 文件夹(文件夹 ID
1oxYLPcC9MPVuxsbeP0kGgYhLmkxt0w2o)。点击 Share,粘贴服务账号的电子邮件,并授予 Viewer 访问权。
不要授予 Editor/Owner——此服务器从不写入 Drive,因此 Viewer 就足够了,而且更安全。
8. 本地设置
npm install
cp .env.example .env
# fill in GOOGLE_DRIVE_FOLDER_ID, GCP_KEY_BASE64, API_KEYS in .env
npm run devnpm run dev 直接使用 tsx watch 运行 TypeScript 服务器(本地迭代无需构建步骤)。
9. 生成 GCP_KEY_BASE64
切勿将原始服务账号 JSON 粘贴到聊天、源代码或 .env.example 中。请从下载的 gcp-key.json 在本地生成 base64 值,并且只将其放入本地 .env(已被 gitignore)或 Render 的环境变量设置中。
PowerShell:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("$HOME\Downloads\gcp-key.json")) | Set-Clipboard这会读取密钥文件并将 base64 字符串直接复制到剪贴板——请将其作为 GCP_KEY_BASE64 的值粘贴到 .env(本地)或 Render 仪表板(用于部署)中。如果 gcp-key.json 不在您的下载文件夹中,请调整路径。
如果您更想将其打印到终端而不是剪贴板:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("$HOME\Downloads\gcp-key.json"))10. 本地测试
启动服务器:
npm run dev检查健康状态:
curl http://localhost:10000/health使用 curl 调用某个 MCP 工具(例如:list_files),按 initialize → tools/call 顺序操作,或者将任何支持 Streamable-HTTP 的 MCP 客户端指向 http://localhost:10000/mcp,并带有请求头 X-Api-Key: <one of your API_KEYS>。
11. 构建
npm run build将 src/(TypeScript,NodeNext ESM)编译到 dist/。运行 npm run typecheck 可在不生成文件的情况下进行类型检查。
运行测试套件:
npm test这会以 in-band 模式运行 Jest(10 个测试套件共 46 个测试:配置、认证、Google 认证、Drive 文件夹范围强制、全部 11 个工具,以及 /health//mcp HTTP 端点)。
12. GitHub 设置
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 和 *.key 已被 gitignore——在提交之前使用 git status 验证没有暂存任何机密内容。
13. Render 部署
转到 render.com → New → Web Service。
连接您的 GitHub 仓库(
akij-hr-data-mcp)。Render 会自动检测
render.yaml(Blueprint),或者手动配置:构建命令:
npm install && npm run build启动命令:
npm start健康检查路径:
/health
在 Render 仪表板中添加环境变量(第 14 节)——切勿提交它们。
部署。Render 会构建、启动服务,并使其独立于您的 PC 持续运行。
14. Render 环境变量
在 Render → 您的服务 → 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>生成强随机 API 密钥,例如:
[Convert]::ToBase64String([Guid]::NewGuid().ToByteArray()) -replace '[+/=]',''15. 健康端点
GET /health{ "status": "ok", "timestamp": "2026-08-17T12:00:00.000Z" }无需认证;不暴露任何机密或内部状态。
16. MCP 端点
POST /mcp实现 MCP Streamable HTTP 传输(
@modelcontextprotocol/sdk的StreamableHTTPServerTransport),无状态(sessionIdGenerator: undefined)——没有仅限 SSE 的回退。需要认证:
Authorization: Bearer <API_KEY>或X-Api-Key: <API_KEY>请求头。GET /mcp和DELETE /mcp返回405——此服务器不维护会话,也不支持可选的 SSE 流。
17. 将远程 MCP 连接到客户端
部署后,您的 MCP 端点为:
https://<your-render-service>.onrender.com/mcp对于支持远程/HTTP 服务器的 MCP 客户端,添加一个服务器条目,包含:
URL:
https://<your-render-service>.onrender.com/mcp传输方式: Streamable HTTP
请求头:
X-Api-Key: <one of your API_KEYS>(或Authorization: Bearer <API_KEY>)
通用客户端配置示例:
{
"mcpServers": {
"akij-hr-data": {
"url": "https://<your-render-service>.onrender.com/mcp",
"headers": {
"X-Api-Key": "<API_KEY>"
}
}
}
}18. 安全性
只读:此代码库中不存在上传/删除/编辑/重命名/移动/共享/权限工具。
文件夹范围:
GoogleDriveClient.assertFileInScope在返回任何元数据或内容之前,会沿着每个文件的parents链向上遍历到已配置的根目录;树之外的文件会引发ForbiddenError。API 密钥认证:每个
POST /mcp请求都会通过时序安全比较(crypto.timingSafeEqual)对照API_KEYS进行检查。缺失/无效的密钥会得到401。凭据从不记录或返回:解码后的服务账号 JSON 只保留在
google-auth.ts内;任何工具、日志行或错误消息都无法将其暴露。错误响应经过toSafeErrorMessage处理,该函数会剥离堆栈跟踪和上游原始错误主体。大小/输出限制:下载有上限(
LIMITS.MAX_DOWNLOAD_BYTES/MAX_PARSE_BYTES),文本提取被截断(MAX_TEXT_OUTPUT_CHARS),行数据分页(DEFAULT_ROW_LIMIT/MAX_ROW_LIMIT),并且每次向 Google API 发出的调用都有超时(GOOGLE_API_TIMEOUT_MS)。可扩展认证:
req.identity是一个小巧、稳定的结构({ keyId }),旨在让未来的按用户密钥、OAuth 或基于角色的授权层能够附加更丰富的声明,而无需更改每个调用点。已知依赖公告:用于解析旧版
.xls的xlsx(SheetJS)包有一个已发布的高严重性公告(原型污染 / ReDoS)。它仅用于处理来自您自己的 Drive 文件夹的内部、受访问控制的文件(不是任意的互联网上传),并且文件在解析前有大小上限。请定期运行npm audit,如果有已修复的版本可用,请考虑替换它。
安全清单
gcp-key.json永远不会提交到 git.env永远不会提交到 gitAPI_KEYS在 Render 中设置为强随机值(不是本地开发值)服务账号在 Drive 文件夹上只有 Viewer 权限
GOOGLE_DRIVE_FOLDER_ID与预期的仓库文件夹匹配Render 环境变量直接在仪表板中设置,绝不使用
render.yaml中已提交的值
19. 故障排除
症状 | 原因 | 修复 |
服务器以 | 环境变量缺失或无效 | 对照第 5 节检查错误消息中指定的确切变量名称 |
| 编码了错误的文件,或复制/粘贴截断了字符串 | 使用第 9 节中的 PowerShell 命令重新生成 |
Drive API 返回 | 服务账号未共享到该文件夹,或共享到了错误的电子邮件 | 重新检查第 7 节;确认密钥中的 |
| 您传入的 | 使用 |
每次 | API 密钥缺失或不正确 | 发送与 |
| 文件超过配置的字节限制 | 这是有意为之;大文件会被拒绝,而不是完全加载到内存中(参见 |
Render 服务休眠 / 冷启动缓慢 | 免费/入门级 Render 套餐在闲置后空闲 | 升级 Render 套餐,或接受首次请求时的冷启动延迟 |
测试在本地挂起数分钟 |
| 已缓解: |
剩余的手动步骤(只有您能完成这些)
从你下载的
gcp-key.json(第9节)生成GCP_KEY_BASE64,并将其放入本地.env文件用于测试。将 AKIJ HR DATA Drive 文件夹以查看者(Viewer)权限共享给你的服务账号邮箱(第7节)。
本地运行(
npm run dev),并确认GET /health和真实的list_files调用能针对你的真实 Drive 文件夹正常工作。推送到 GitHub(第12节)。
创建 Render Web Service,连接仓库,并在 Render 仪表板中设置四个环境变量(第13–14节)——Render 将自动构建和部署。
生成生产环境
API_KEYS(与任何本地开发密钥不同),并安全存储以供你的 MCP 客户端使用。将你的 MCP 客户端连接到
https://<your-render-service>.onrender.com/mcp(第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