Egnyte Large File Manager

Egnyte Large File Manager

Enables downloading real binary files from Egnyte and uploading large files with chunked support, complementing the official Egnyte MCP connector.

Category
访问服务器

README

Egnyte Large File Manager

A local MCP server that fills the binary / large-file gap in Egnyte's hosted MCP connector.

Egnyte's official connector only returns extracted text (get_file_content) into agent context — it never hands you the real file bytes. So you can't pandas.read_excel() / openpyxl a workbook, parse a native PDF, or re-package a .msg. This server adds the missing piece: sign in with OAuth, then download the actual binary to local disk (and chunk-upload large files back).

It is meant to run alongside the official Egnyte connector, not replace it:

Use the official Egnyte MCP for Use this server for
search, list_filesystem, text extraction, ask_document, metadata downloading real file binaries to disk, chunked upload of large files

Where it runs. This is a local stdio MCP server (and .mcpb bundle). The download→disk→load flow only works where the MCP server shares a filesystem with code execution:

  • Claude Code (CLI): ✅ fully works — server and your code run on the same machine.
  • Claude Cowork / sandboxes: ⚠️ Cowork runs your code in an isolated VM whose filesystem is separate from the host where the MCP server runs, so a file the MCP downloads isn't visible to the VM's Python. Use the bundled python/egnyte_fetch.py inside the sandbox instead (see Claude Cowork / cloud sandbox).
  • claude.ai web chat: ❌ remote connectors only; no local MCP, no Python filesystem.

Tools

Tool Purpose Returns
egnyte_download Download a file's real bytes to local disk by path or group_id. Streams — handles large files. the local filesystem path (never the bytes)
egnyte_upload Upload a local file to Egnyte. Automatically uses chunked upload above the size threshold. entry/group id + checksum
egnyte_stat Get file metadata (size, type, ids, checksum) — use to decide before downloading. metadata object
egnyte_login Force the OAuth browser sign-in (otherwise it happens lazily on first call). sign-in status

The model gets a path, not the bytes — so a 200 MB workbook never bloats the context. Your code then does pd.read_excel("/path/from/tool").

Auth — simple OAuth sign-in

Uses the OAuth 2.0 authorization-code flow over an HTTPS localhost loopback redirect. Egnyte does not support PKCE / public clients, so this is a confidential client: a client_secret is required and is stored as a sensitive config field (never logged).

  1. On first tool call (or egnyte_login) the server opens your browser to Egnyte's sign-in page.
  2. You log in as yourself — including via your company's SSO/SAML.
  3. Egnyte redirects to https://localhost:<port>/callback (a self-signed loopback listener — accept the one-time browser cert warning); the server captures the code and exchanges it (with the client_secret) for a token.
  4. The token is cached locally (0600-permission file in your config dir) and reused; it auto-refreshes, falling back to a browser re-auth only when the refresh token is gone.

Because you sign in as yourself, the server only sees what your Egnyte permissions allow — same access model as the official connector. No shared service account, no flattened ACLs.

Headless / SSH: set EGNYTE_NO_BROWSER=1 — the server prints the authorize URL instead of launching a browser; open it on any machine that can reach your Egnyte domain, and it will redirect back to the loopback.

Prerequisites

  • Node.js ≥ 18
  • An Egnyte API key + secret. Register an app at https://developers.egnyte.com → "Get an API Key". Register https://localhost:53682/callback as the allowed redirect (Egnyte requires HTTPS).
  • Your Egnyte domain (e.g. acme.egnyte.com).

Configure

Local dev: copy .env.example.env and fill in EGNYTE_DOMAIN, EGNYTE_CLIENT_ID, and EGNYTE_CLIENT_SECRET (all required — Egnyte is a confidential client).

Installed .mcpb bundle: the host (Claude Desktop) prompts for these via the bundle's user_configclient_secret is stored as a sensitive field.

Run / develop

npm install
npm run login     # one-time browser sign-in, caches token
npm run dev       # run the stdio server locally
npm run build     # compile to dist/
npm run pack      # build + package into egnyte-large-file-manager.mcpb

Use with Claude Code

claude mcp add egnyte-large-file-manager --transport stdio -- node /abs/path/to/dist/server.js

(or install the packed .mcpb in Claude Desktop)

Claude Cowork / cloud sandbox

In Cowork your code runs in an isolated VM whose filesystem is separate from the host where an MCP server runs — so the MCP's download wouldn't be visible to the VM's Python. For these environments use the bundled, dependency-free python/egnyte_fetch.py, which runs inside the sandbox and pulls bytes straight from the Egnyte API.

1. Pre-seed a token (interactive browser OAuth can't reach a headless VM):

  • Run npm run login once on a machine with a browser, then inject the resulting token into the sandbox — either copy ~/.config/egnyte-mcp/tokens.json, or set EGNYTE_ACCESS_TOKEN as a sandbox secret.
  • Per-user ACLs are preserved only if each user injects their own token (not a shared one).

2. Use it in the sandbox (EGNYTE_DOMAIN + the token in env):

python egnyte_fetch.py download "/Shared/Docs/report.xlsx"   # prints {"path": "...", ...}
from egnyte_fetch import download
import pandas as pd
path = download("/Shared/Docs/report.xlsx")["path"]
df = pd.read_excel(path, sheet_name=None)   # real binary, loaded in-VM

Same hardening as the MCP: *.egnyte.com host lock, .. path rejection, download-dir confinement, SHA-512 verify, single + chunked upload.

Security

  • Per-user OAuth — no shared service token; Egnyte ACLs are enforced per signed-in user.
  • Client secret — Egnyte requires a confidential client; the client_secret is stored as a sensitive config field and is never logged or returned to the model. OAuth state guards the callback against CSRF.
  • Token cache is a 0600 file; it is git-ignored and must never be committed.
  • Least privilege — request only the scopes you need (filesystem read; add write only if you upload).
  • Paths, not bytes — file contents are written to disk and referenced by path, never echoed through the model.
  • Download confinement — downloads are restricted to the configured download directory; a model-supplied dest cannot escape it (no ../ or absolute-path writes).
  • Host locked to *.egnyte.com — the API host is validated, so a bad EGNYTE_DOMAIN can't exfiltrate the token/secret to another server. .. segments in Egnyte paths are rejected.

License

Apache-2.0. See LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选