mdymcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mdymcp list my pending workflow approvals"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mdymcp
⬆️ 已装过的用户升级
升级程序(推荐这条,绕开 uv 索引缓存偶发不更新):
uv tool install --force --refresh mdymcp(或
uv tool upgrade mdymcp;升完重启 IDE / 重开会话。)0.5.x(v1 token 多机集中刷新)
单机用户:升级程序即可,无需任何改动(默认仍是本地刷新,全向后兼容)。
多台机器/服务器共用同一明道账号:必须切「服务器集中刷新」。原因——多端各自持有 token 各自刷新,明道每次 refresh 都轮换 refresh_token,会把彼此顶成孤儿(
error_code 10101)。 把刷新集中到一台常驻服务器当唯一 owner,其余端只读:在做初始部署的那台跑mdymcp-install选[2] 服务器集中(或mdymcp-server-setup),其余机器把生成的~/.mdymcp/server_token_key+.env里 4 个MD_V1_TOKEN_*拷过去(别在其余机器重新授权)。详见server/README.md。⚠️ 若某个项目自己的 venv 里也
import mdymcp(不是只走全局 binary),那份要单独升:uv pip install --python <项目>/.venv/bin/python -U mdymcp。0.3.0(HAP 改用个人 PAT)— 仍停在 0.2.x 的老用户才需要
0.3.0 起 HAP 改用个人 PAT,不再走旧的
refresh_token / hap_key。去 https://www.mingdao.com/personal?type=pat 生成 PAT(pat_开头),然后任选其一:
省事:重跑
mdymcp-install,走到 HAP 步骤粘进去;手动:编辑
~/.mdymcp/.env,删掉MD_HAP_KEY/MD_HAP_REFRESH_TOKEN/MD_HAP_TOKEN,加上MD_HAP_PAT=pat_xxx。
Related MCP server: mingdao-mcp-server
一键安装
macOS / Linux
curl -LsSf https://raw.githubusercontent.com/andyleimc-source/mdymcp/main/install.sh | shWindows(PowerShell)
powershell -c "irm https://raw.githubusercontent.com/andyleimc-source/mdymcp/main/install.ps1 | iex"脚本做三件事:
检测
uv,没装就从官方源装上(uv 会自己拉合适的 Python,你机器上是 3.14 / 3.9 还是没装都没关系)uv tool install mdymcp启动
mdymcp-install交互向导 —— 浏览器 OAuth 拿 v1 凭据 → 自动打开 HAP 个人 PAT 页粘MD_HAP_PAT→ 让你选范围(用户级/项目级/两个都要)+ 编号多选要注册的 IDE → 检测到 Claude Code 时自动安装 mdymcp skill(使用心智 + 故障 SOP)到~/.claude/skills/mdymcp/
配置写在 ~/.mdymcp/.env(Windows: %USERPROFILE%\.mdymcp\.env),跨目录都能用。
装完后想重跑:mdymcp-install
功能
明道(Mingdao)统一 MCP Server —— 一次安装,98 个工具:
v1 协作 API(50 个,本地实现):动态 / 日程 / 私信 / 收件箱 / 群组 / 用户 / 组织 / 个人账户
HAP 网关(48 个,透明代理
api2.mingdao.com/mcp):应用 / 工作表 / 记录 / 角色成员 / 工作流审批 / 图表 / 选项集 / 知识库 / 地区组织
HAP 工具由远端网关动态提供;具体参数 schema 以启动时 tools/list 返回的为准。
支持的 AI IDE
IDE | 配置文件 | 支持范围 |
Claude Code |
| 用户级 + 项目级 |
Codex CLI |
| 用户级 |
Cursor |
| 用户级 + 项目级 |
Windsurf |
| 用户级 |
Gemini Antigravity |
| 用户级 |
Trae(含国内版 Trae CN) | mac: | 用户级 |
VS Code(Copilot Chat) |
| 项目级 |
mdymcp-install 会自动检测已装的 IDE,范围 + 客户端两个问题你挑完即可。手动指定:mdymcp-install --client=cursor,windsurf,trae(--client=all 全装)。
Antigravity:写完后去 IDE 里「Manage MCP Servers → Refresh」一下才能看到 mdymcp。
Cursor / Windsurf / Trae / VS Code:通常需要重启 IDE 或在 MCP 设置里手动刷新。
怎么拿 HAP 的 PAT
mdymcp-install走到 HAP 步骤时会自动开浏览器到 PAT 页,复制粘贴即可。
PAT 页:https://www.mingdao.com/personal?type=pat
已登录 → 直接在页面生成/管理个人 PAT(
pat_开头)。未登录 → 先登录,会自动跳回该页。
复制 pat_xxx,在向导提示 MD_HAP_PAT: 时粘进去即可。PAT 本身就是 Bearer token,长期有效、你自己可随时吊销重发,无需服务端交换。留空 = 跳过 HAP,只用 v1 工具。
架构与 Token
┌──────────────────────┐ stdio ┌──────────────────────────────┐
│ Claude Code / Cursor │──────▶│ mdymcp.server │
│ / Codex / Windsurf / │ ├──────────────────────────────┤
│ Antigravity / Trae / │ │ [静态注册] 50 个 v1 工具 │──┐
│ VS Code Copilot │ ├──────────────────────────────┤ │HTTP
└──────────────────────┘ │ [动态注册] HapGateway │──┤
│ 48 个 HAP 工具(透明代理) │ │
└──────────────────────────────┘ ▼
┌──────────────────────────────────────┐
│ api.mingdao.com/v1/* (v1 API) │
│ api2.mingdao.com/mcp (HAP gateway) │
└──────────────────────────────────────┘v1 access_token | HAP token | |
install 时 | 本地 OAuth → token 写入 | 粘 PAT → |
运行时 | 本地 token 文件,过期用 refresh_token 本地续期 | 直接用 |
缓存 TTL | 跟随明道下发的 expires_in(已发布应用 7 天) | 不需要(PAT 即 token) |
v1 token 全程本地:mdymcp-auth 授权一次拿 access_token + refresh_token 落盘(chmod 600),过期自动用 refresh_token(14 天有效)续期,refresh 也过期才需重新授权。app_key/app_secret 内嵌在包里(公共客户端模式,同 Google/GitHub CLI),零配置。已有旧凭据(MD_ACCOUNT_ID/MD_KEY)且未授权的机器回落老的远端 hook 链路。HAP 直接用 .env 里的 PAT 当 Bearer token。HAP 网关握手失败时不崩 server,仅跳过远端工具注册,v1 工具仍可用。
多机共用同一账号?用 server 模式。 多台机器/服务器持同一对 token 会互相抢刷(明道每次 refresh 都轮换 refresh_token),把对方顶成孤儿(error_code 10101)。把刷新集中到一台常驻服务器当唯一 owner:跑一次 mdymcp-server-setup(或 bash server/provision.sh <IP> <user>),其余机器只读、永不刷新。详见 server/README.md。
配置
~/.mdymcp/.env(或各 IDE 的 MCP JSON 里的 env 块):
# HAP 网关 PAT(在 https://www.mingdao.com/personal?type=pat 生成,pat_ 开头)
MD_HAP_PAT= # install 时粘贴;留空 = 跳过 HAP
# 可选(通常不用动)
# MD_APP_KEY= / MD_APP_SECRET=<换成自己的 OAuth 应用>
# MD_CALLBACK_PORT=8080
# 旧链路回落(未配 MD_APP_SECRET 时才用)
# MD_ACCOUNT_ID= / MD_KEY= / MD_HOOK_URL=故障排查
现象 | 解决 |
| 重开终端;或 |
curl / irm 拉 astral.sh 失败 | 走代理;或从 https://github.com/astral-sh/uv/releases 下载 tarball 手动解压到 |
Windows 下 | 管理员 PowerShell: |
| 跑 |
| 去 https://www.mingdao.com/personal?type=pat 重新生成 PAT,更新 |
IDE 里看不到 mdymcp | 重启 IDE;或在 IDE 的 MCP 设置里点 Refresh。GUI 启动找不到 |
启动显示 |
|
HAP 工具返回 | HAP 后端既有问题(Node 版也有),非 mdymcp bug |
API 参考
明道开放平台:https://open.mingdao.com/document
License
MIT
Available Tools
50 toolscalendar_add_membersB
给日程添加成员。member_ids 逗号分隔(明道用户),invited_accounts 为非明道用户(格式 ["电话","邮箱"])。
Inputs: event_id (required), member_ids, invited_accounts, event_recurring_time, +1 more.
calendar_create_eventC
创建日程。日期格式 YYYY-MM-DD HH:MM。member_ids 用逗号分隔多个用户ID。
Inputs: name (required), end_date (required), begin_date (required), address, +11 more.
calendar_edit_eventC
修改日程属性(名称、时间、地点、描述等)。日期格式 YYYY-MM-DD HH:MM。
Inputs: event_id (required), name, address, end_date, +11 more.
calendar_get_event_detailsC
获取单个日程的详细信息。
Inputs: event_id (required).
calendar_get_eventsA
获取日程列表。通过日历订阅接口拉取 iCal 数据并解析。
日期格式 YYYY-MM-DD(北京时间)。
不传日期:默认取 [今天-30, 今天](订阅 feed 通常只到当天,查未来多为空)。 全量约 2600+ 条会撑爆上下文,故有默认范围,需更早请显式传 start_date。
organizer:按组织者过滤(邮箱或姓名子串,大小写不敏感)。看某人日程用这个, 例:organizer="phil.ren" 查任向晖。
keyword:按标题(summary)子串过滤。
limit:最多返回条数(默认 200),超出按时间倒序截断并标记 truncated。
Inputs: limit, keyword, end_date, organizer, +1 more.
calendar_get_unconfirmed_eventsB
获取当前用户未确认的日程邀请。
Inputs: page_size, page_index.
calendar_remove_eventC
删除日程。removing_all_recurring_events: 是否删除所有循环日程。
Inputs: event_id (required), event_recurring_time, removing_all_recurring_events.
calendar_searchA
按关键词搜索日程。begin_date/end_date 格式 YYYY-MM-DD。
Inputs: keyword (required), end_date, begin_date.
company_get_by_idC
根据组织ID查询组织信息。
Inputs: project_id (required).
company_get_departmentsC
获取组织的部门列表。
Inputs: project_id (required).
company_get_projectsA
获取当前用户所属的组织列表。
Inputs: no named parameters.
group_add_adminB
添加群组管理员。
Inputs: group_id (required), account_id (required).
group_createC
创建一个新群组。group_name 为群组名称。
Inputs: group_name (required), about, project_id, is_approval.
group_create_discussionC
创建讨论组。account_ids 用逗号分隔。
Inputs: name (required), account_ids.
group_editC
编辑群组信息。
Inputs: group_id (required), name, about, is_approval.
group_get_detailC
获取群组详情(含成员信息)。
Inputs: group_id (required).
group_get_membersC
获取群组成员列表。
Inputs: group_id (required), pagesize.
group_get_my_createdA
获取当前用户创建的所有群组。
Inputs: no named parameters.
group_get_my_joinedA
获取当前用户加入的所有群组。
Inputs: no named parameters.
group_get_project_groupsC
获取组织下所有群组。
Inputs: project_id.
group_get_project_membersC
获取组织群组的成员列表。
Inputs: group_id (required), pagesize.
message_get_postC
获取与动态相关的收件箱消息。
Inputs: pagesize.
message_get_systemC
获取系统消息列表。
Inputs: pagesize.
passport_get_detailA
获取当前登录用户的详细信息。
Inputs: no named parameters.
passport_get_settingA
获取当前用户的账户设置。
Inputs: no named parameters.
passport_get_unread_countB
获取各类未读消息数量。
Inputs: no named parameters.
passport_get_user_cardB
获取当前用户的个人名片。
Inputs: no named parameters.
post_add_postB
发布一条新动态。post_type: 0=普通,1=链接,2=图片,3=文档,4=提问,7=投票。group_ids/project_ids 逗号分隔。
Inputs: post_msg (required), group_ids, post_type, project_ids.
post_add_post_replyC
给指定动态添加评论。reply_id 为回复某条评论时填写。
Inputs: post_id (required), reply_msg (required), reply_id.
post_delete_postB
删除一条动态。
Inputs: post_id (required).
post_delete_post_replyA
删除一条动态评论。post_id 必填,reply_id 为要删除的评论ID。
Inputs: post_id (required), reply_id.
post_get_all_postsA
获取全公司可见的动态流。可按关键词、类型、群组过滤。用 max_id 翻页。
Inputs: max_id, group_id, keywords, pagesize, +3 more.
post_get_group_postsC
获取指定群组的动态。
Inputs: group_id (required), max_id, pagesize.
post_get_my_postsC
获取当前用户自己发布的动态。
Inputs: max_id, pagesize.
post_get_post_detailA
获取单条动态的详细信息。
Inputs: post_id (required).
post_get_post_replyC
获取某条动态的评论列表。
Inputs: post_id (required), max_id, pagesize.
post_get_post_select_groupsB
获取当前用户可以发布动态的群组列表。
Inputs: no named parameters.
post_get_user_postsC
获取指定用户的动态。account_id 为目标用户ID。
Inputs: account_id (required), max_id, pagesize.
user_get_by_phoneC
根据手机号或邮箱查找用户。
Inputs: identifier (required).
user_get_cardC
获取指定用户的名片信息。
Inputs: account_id (required).
user_get_friendsC
获取当前用户的联系人列表。
Inputs: pagesize.
user_get_mentionedA
获取可 @ 的用户列表,可按关键词过滤。
Inputs: keywords.
user_get_project_usersC
获取组织通讯录(所有成员)。
Inputs: pagesize, project_id.
user_get_subordinateC
获取下属列表。
Inputs: project_id (required).
webchat_get_chat_listB
获取聊天会话列表。
Inputs: no named parameters.
webchat_get_message_by_idB
根据消息ID获取前后消息。account_id 和 group_id 二选一。
Inputs: message_id (required), size, group_id, account_id.
webchat_get_message_countB
获取与某人或某群的消息总数。account_id 和 group_id 二选一。
Inputs: group_id, account_id.
webchat_get_messagesB
获取与某人或某群的消息记录。account_id 和 group_id 二选一。
Inputs: keyword, group_id, pagesize, pageindex, +1 more.
webchat_get_unread_countB
获取未读消息总数。
Inputs: no named parameters.
webchat_send_messageA
给用户或群组发送文本消息。account_id 和 group_id 二选一。
Inputs: message (required), group_id, account_id.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 50 tools
Most tools have distinct purposes through different resource+verb combinations (e.g., calendar_get_events vs calendar_search), but the sheer number of similar 'get' tools and overlapping scope (e.g., post_get_all_posts vs post_get_group_posts) may cause occasional misselection. Overall, descriptions help differentiate.
Tools consistently follow a prefix_verb_noun snake_case pattern (e.g., group_create, post_delete_post). Minor inconsistencies exist like 'webchat_get_message_by_id' vs 'webchat_get_messages' and 'post_add_post' redundancy, but the pattern is predictable.
With 50 tools, the set is far beyond the typical well-scoped range (3-15). Although the platform covers many domains, the high count risks overwhelming agents and increasing selection errors. A more focused subset would improve usability.
The tool set covers major CRUD-like operations for calendars, posts, groups, and chat, but lacks some obvious actions like group deletion, user information updates, or file handling. The coverage is decent but not fully comprehensive for the implied collaboration domain.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Unified MCP Server is a remote MCP connector for AI agents and vertical AI products that provides access to 22,000+ authorized SaaS tools across 400+ integrations and 24 categories directly inside LLMs (Claude, GPT, Gemini, Cohere). Tools operate only on explicitly authorized customer connections, enabling agents to safely read and write against live third-party systems.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA comprehensive MCP server providing over 390 tools across 66 providers, including major SaaS platforms like GitHub, Slack, and Stripe. It enables AI assistants to interact directly with a wide array of public APIs and utility services through a single interface.-
- AlicenseAqualityDmaintenanceMCP server for Mingdao Worksheet API. Enables listing worksheets, querying records, and performing CRUD operations on Mingdao (明道云) works through natural language.1322 npm1MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for Feishu/Lark API integration, enabling AI agents to send messages, manage groups, create and edit documents and spreadsheets, and search knowledge bases.MIT
- AlicenseNot gradedqualityDmaintenanceOfficial MCP server for Feishu/Lark OpenAPI, enabling AI assistants to interact with Feishu/Lark platform for document processing, messaging, calendar scheduling, and more.33,351 npmMIT