飞书 Aily 本地文件 MCP 服务 — 通过 ngrok 内网穿透实现远程文件读写

feishu_mcp:个人本地开发工作台 MCP

部署前请先阅读 SECURITY.md。每台电脑必须使用自己的 .envMCP_AUTH_TOKEN、授权目录、ngrok 地址和 Aily MCP 配置。不要共享或提交这些信息。

这是一个运行在你自己电脑上的 MCP(Model Context Protocol)服务。它让飞书 Aily工作台在受控范围内访问本机项目:读写文件、查看 Git、运行构建与测试、检查 Android或 Windows 开发环境,并安全导入二进制制品。

你的 Aily 工作台  →  HTTPS 隧道  →  你电脑上的 MCP  →  你的项目目录与工具链
                         Bearer 鉴权       目录边界、审批、审计和限额

源代码可以通过 Git 分享;Token、ngrok authtoken、.env、日志、审批数据、构建输出和个人路径不能分享。

10 分钟个人接入

1. 克隆并安装

git clone https://github.com/zhuxice-ctrl/feishu_mcp.git
cd feishu_mcp
npm install

2. 创建自己的本地配置

复制 .env.example.env,然后只填写自己的项目目录和随机生成的 Token。不要把其他电脑的 .env 复制过来。

# 只授权自己的项目根目录;可用逗号分隔多个目录
ALLOWED_DIRS=F:\MyProjects

# 自己生成的长随机值;不要提交、截图或发送给他人
MCP_AUTH_TOKEN=<your-own-random-token>

# 个人部署的默认安全模式
AUTH_MODE=pin
AUTH_PIN=<your-own-strong-pin>
AUTH_USER_HEADER=x-aily-user

# 公网可达的自有主机名(Cloudflare 命名隧道前置的域名,见下文)
PUBLIC_HOST=mcp.example.com

# 命令默认仍需确认
OWNER_COMMAND_POLICY=approval

AUTH_MODE=none 仅适合完全由你自己控制的个人入口;即使使用它,也应保留MCP_AUTH_TOKEN

3. 启动本地 MCP 与公网连接器

本地 MCP 与公网传输彼此解耦。Windows 推荐双击仓库根目录的:

start-feishu-mcp.bat

启动器只负责本地服务:它会构建服务、检查本地健康状态并启动 node dist/index.js,不会替你再启动任何隧道进程。它从 .env 读取 PUBLIC_HOST 并打印预期公网地址;公网连接器是否健康由下面第 4 步的手动 Tunnel supervisor 或scripts\test-cloudflare-tunnel.ps1 检查。你也可以手动运行:

npm run build
npm start

本地健康检查:

Invoke-RestMethod http://127.0.0.1:3000/health

正常时应返回 status: ok,并报告 42 个工具。若你使用 Clash Fake-IP,对公网/health 的回访失败只说明反向探测受限;本地服务和连接器仍可正常工作。

4. 先选择公网传输

在配置隧道前,先确定两件事:你使用 Cloudflare 还是 ngrok,以及是否拥有一个可专用于此 MCP 的独立域名。

选择 是否有独立 MCP 域名 建议
Cloudflare 使用 Cloudflare 命名隧道,并分配 mcp.<你的域名> 等专用子域名。这是主路径。
Cloudflare 没有 不要默认把现有业务域名暴露给本 MCP;建议先注册专用域名,或暂时使用 ngrok。
ngrok 不限 使用自己的 ngrok 账号和 HTTPS 地址;适合临时接入、没有独立域名时使用,或作为 Cloudflare 的回滚方案。

同一时间只能启用一个同用途的 Aily MCP 条目。 两个条目同时提供同一批工具会使工具路由产生歧义。切换时请遵循:先新建目标条目,验证 ping 与工具发现成功,最后再关闭旧条目。

5. 公网传输(默认 Cloudflare 命名隧道,回滚备用 ngrok)

主路径:Cloudflare 命名隧道 + 自有主机名。 在 Cloudflare 控制台完成以下一次性配置(不要在仓库或截图里放凭据、tunnel UUID 或证书 JSON):

  1. 安装 cloudflared,并在你的终端完成 cloudflared tunnel login
  2. 创建命名隧道:cloudflared tunnel create feishu-mcp(记下打印的 UUID)。
  3. 绑定主机名:cloudflared tunnel route dns feishu-mcp mcp.example.com(该子域需在Cloudflare DNS 中被代理)。
  4. %USERPROFILE%\.cloudflared\config.yml 写外部连接配置,ingress 指向http://127.0.0.1:3000(以 .envPORT 为准),并为证书 JSON 和 config.yml收紧 NTFS ACL。
  5. 保持手动启动:运行 scripts\start-cf-mcp.ps1,它会在当前会话启动 supervisor;不安装 Windows 服务,也不创建开机启动项。

PUBLIC_HOST 设置为这个自有主机名并重启本地启动器。随后运行有界健康验证(区分本地与公网失败,退出码非零即失败):

.\scripts\test-cloudflare-tunnel.ps1 -PublicHost mcp.example.com -Port 3000 -MetricsPort 20241 -TunnelName feishu-mcp

手动会话状态与停止命令:

.\scripts\tunnel-supervisor.ps1 -Action Status
.\scripts\stop-cf-mcp.ps1

完整恢复说明见 docs/MANUAL_CLOUDFLARE_TUNNEL_RECOVERY.md

回滚备用:ngrok。 观察期内如公网中断超过 5 分钟且原因未明,可按CLOUDFLARE_TUNNEL_MIGRATION.md 一键回滚:先运行 scripts\stop-cf-mcp.ps1,再在 .env 恢复 NGROK_DOMAINNGROK_AUTHTOKEN,运行 .\scripts\start-ngrok.ps1,并把 Aily endpoint 改回旧 ngrok 地址。不要把mcp.example.com 当作凭据,也不要把它复制给其他使用者。

测试环境(与正式环境隔离)

正式服务只使用 .env127.0.0.1:3000mcp.zxc66.asia。测试服务使用另一份.env.test127.0.0.1:3001mcp-test.zxc66.asia,其审批数据、任务、日志、工作区目录及 Cloudflare 凭据都必须独立。测试脚本不会读取、修改、重启或停止正式 MCP。

# 1. 复制 .env.test.example 为 .env.test,并只填写测试值
.\scripts\start-test-mcp.ps1

# 2. 如需公网测试,再使用独立的测试 Cloudflare 配置
.\scripts\start-test-cloudflared.ps1 -ConfigPath C:\test-cloudflared\config.yml

完成测试后停止测试进程即可。合并或发布代码是另一项独立操作;生产仍保持 .env 和3000 端口,除非你明确启动正式服务。

6. 在 Aily 添加 MCP

在 Aily 中添加企业自定义 MCP,Endpoint 类型选 Streamable HTTP。使用 Cloudflare时将 <你的公网主机名> 替换为 PUBLIC_HOST;使用 ngrok 时替换为自己的 ngrok 域名:

MCP endpoint: https://<你的公网主机名>/mcp
Authorization: Bearer <your-own-MCP_AUTH_TOKEN>
x-aily-user: <your-own-OWNER_USER_ID>

Authorizationx-aily-user 必须添加在请求头中。对于这个仅自己可用的个人MCP,Authorization 应使用固定值,其参数值为 Bearer <your-own-MCP_AUTH_TOKEN>,这样 Aily 才能在注册阶段发现完整工具清单。不要把真实 Token 放在展示名称、描述、图片或普通对话中;x-aily-user 应固定为你的 owner 身份。

保存新 MCP 后,先重新打开 Aily 对话并调用 ping 或让它枚举工具;确认成功后,再关闭旧的同用途 MCP 条目。出现 401 时,先核对 Token 是否与本机 .env 一致,以及是否包含Bearer 前缀。

Android 与 Windows 本地开发环境

项目内提供 个人 MCP 接入教学 Skill。它适合让 Aily 或 Codex 先检查你的设备,再给出手动安装与接入步骤。

它会按项目需要检查:

  • Node.js、npm、Git、本地 MCP、ngrok;
  • Android Studio、Android SDK、JDK、Gradle wrapper、adb
  • Visual Studio Build Tools、MSVC、Windows SDK、CMake。

它不会替你注册 ngrok、安装软件、填写 Token、修改 .env 或改变系统环境。示例提问:

检查我的 Windows 电脑是否能运行这个 MCP,并给我手动接入 Aily 的步骤。
检查这个 Android 项目缺少哪些 SDK、JDK 和 adb 配置,只给我手动修复方法。
检查这个 Windows 原生项目需要的 MSVC、Windows SDK 和 CMake 环境。

能力概览:42 个工具

工具清单由服务在 tools/list 中实际返回;Aily 的文字总结可能合并或漏列工具,应以该响应和 /health 为准。

分组 工具
连通与授权 pingauthlist_allowed_directories
文件与目录 read_filewrite_fileedit_filecreate_directorylist_directorymove_filesearch_filessearch_contentget_file_infocompare_filesapply_patch
命令与 Git execute_commandgit_statusgit_diff
结构化 Git git_workflow(固定 Git 工作流 action)
网络与任务 web_fetchtodo_writetodo_readask_user
开发环境 get_development_tasklist_development_tasksread_development_task_logscancel_development_taskinspect_development_environmentplan_environment_changesapply_environment_planandroid_developmentwindows_developmentnode_developmentpython_developmentjava_developmentmanage_development_project
本地工作流 list_local_workspaces(列出受保护目录中的工作空间和配方)、run_local_workflow(异步执行已登记的受控验证配方)
本地开发服务 local_dev_server(仅 owner;启动、查询日志或停止 catalog 声明的本机/LAN 开发服务;不接受任意命令,也不会自动通过 Cloudflare 公开)
工作区路由 workspace_context(owner 专用:选择/恢复受信任工作区,返回确定性的 route.recommended:Android 走 android_development、固定 Node 校验走 run_local_workflow,并提供 error.nextAction
二进制制品 manage_binary_artifact
大文本传输 manage_text_transfer
Android 验证 staging_android_verify(按应用 Profile 执行受控的 SSH/ADB staging 验证)

manage_binary_artifact 用于验证、分块接收、存储和原子落盘 PNG、ZIP 等二进制制品;manage_text_transfer 用于超过单次 MCP 请求限制的 UTF-8 源码:先 begin(目标路径、字节数、SHA-256),再按返回的 48 KiB 上限调用 append,可用 inspect 查询断点,最后 commit 完成校验后的原子替换。小文件继续使用 edit_file;该工具只传输文本,绝不执行内容。它不提供任意二进制执行或解压能力。二进制构建产物通常应放在制品存储或 Release,而不是提交到 Git。

python_development 用于受控的 Python 版本检查、脚本运行和 pytest 验证。它会优先选择工作目录下的 .venv,再回退到系统 launcher,不接受任意 shell 字符串或原始 pytest flags。

构建与测试命令

结构化开发工具遵循 context-first 流程:workspace_context bootstrap/select → 阅读声明的指令文件 →workspace_context mark_instructions_read → 使用 git_workflowjava_developmentnode_developmentpython_development。Node 工具还提供固定的npm_cinpm_testnpm_buildnpm_lintnpm_typecheck action;Python 工具提供固定的python_versionscript_runpytest_run action;调用方不得用任意 shell 命令替代这些结构化 action。

execute_command 是本地 MCP 的通用命令工具;Aily 可能不会把任意 Shell 执行能力交给智能体。Node/PNPM 验证应优先使用结构化的 node_development:它要求已授权的workdir,且只允许 pnpm_versiontest_runbuildtypecheck 四个 action。Windows 上会以完全固定的 pnpm.cmd 命令片段启动包管理器;调用方仍不能传入任意命令或参数。两类工具都受目录边界、受保护内部目录、审批、超时、输出上限、取消、并发限制和审计约束。

在 Aily 中可这样请求:

请调用 node_development,action 为 typecheck,workdir 为已授权 Node 项目目录。
如果要做 Python 校验,请调用 python_development,action 为 pytest_run,workdir 为已授权 Python 项目目录。
如需审批,请在当前窗口展示审批卡;不要改用任意 shell 命令。

默认策略:

OWNER_COMMAND_POLICY=approval

个人设备所有者确实需要让构建和测试直通时,才可以显式配置:

OWNER_USER_ID=<your-own-owner-id>
OWNER_COMMAND_POLICY=direct

direct 仅跳过该 Owner 的普通单次命令审批;它不会放宽目录权限、内部数据保护、超时、输出限制、取消、审计或并发限制。非 Owner 仍遵循普通审批流程。包安装和构建脚本可能联网或产生外部副作用,不能视为可由回收站完全回滚的操作。

安全模型

  • 传输鉴权MCP_AUTH_TOKEN 保护公网 MCP 入口,错误或缺失会返回 401。
  • 工具授权:支持 pinheadernone;公网 header 模式只能放在可信网关后。
  • 目录白名单:仅允许 ALLOWED_DIRS 中的项目目录,解析后防止路径穿越和符号链接逃逸。
  • 操作确认:文件写入、风险命令、敏感路径与首次网络来源按策略要求确认。
  • 审计与限流:操作写入审计日志,Token 仅以哈希形式记录;并发、频率、大小和时间均有上限。
  • 软删除:覆盖或移动文件会先进入项目的 .trash/;它不保证撤销网络、包管理器或外部系统副作用。

永远不要以管理员身份运行 MCP。不要把整个磁盘授权给日常 Aily 对话;优先只授权一个项目根目录。

常见问题

Aily 显示 401 或没有工具

检查顺序:本地 /health 是否正常、ngrok 是否在线、Aily endpoint 是否为 /mcpAuthorization 是否为固定请求头且值为 Bearer <your token>。Aily 的描述栏不会代替真实请求头值。

Aily 的文字回答只列出一部分工具

服务的 /healthtools/list 当前应返回 42 个工具。Aily 可能因平台安全策略只把其中一部分交给智能体;如果没有 execute_command,请使用 node_development 完成四个受限的 PNPM 操作;如果要验证 Python 脚本或 pytest,请使用 python_development,而不要要求智能体改用任意 Shell。

启动器报告公网 health 超时

在 Clash Fake-IP 等本机 DNS 场景可能发生。确认 http://127.0.0.1:3000/health 和 ngrok隧道状态;启动器不会因为该公网回访警告停止健康的本地服务。

Android 或 Windows 构建环境缺失

使用 个人 MCP 接入教学 Skill 先检测,再按Android Studio SDK Manager 或 Visual Studio Installer 的手动步骤安装相应组件。

项目结构

feishu_mcp/
├── src/                         # MCP 服务、鉴权、工具和安全边界
├── scripts/                     # Windows 启动器与辅助脚本
├── skills/
│   └── personal-mcp-onboarding/ # 个人电脑接入教学 Skill
├── docs/                        # 设计、计划与接入参考
├── test/                        # Node 测试
├── .env.example                 # 本地配置模板,不含真实密钥
├── start-feishu-mcp.bat         # Windows 启动入口
└── SECURITY.md                  # 安全部署要求

开发与验证

npm install
npm run build
npm run typecheck

运行某一组测试时使用 Node 内置测试运行器,例如:

node --test test/launcher.test.mjs

完整配置项以 .env.examplesrc/config.ts 为准;详细 Aily 接入说明见docs/aily-integration-guide.md。

License

MIT

MCP Server · Populars

MCP Server · New