mdymcp@0.5.3
CAUTION· not startedPublisher claims: "Unified MCP server for Mingdao — v1 collaboration API + HAP gateway (worksheets, records, apps)" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
MD_APP_SECRETMD_HAP_PATMD_V1_TOKEN_MODEMD_V1_TOKEN_REMOTE_PATHMD_V1_TOKEN_SSH_HOSTMD_V1_TOKEN_SSH_KEYMD_V1_TOKEN_SSH_USERConfiguration, not credentials: MD_ACCOUNT_ID, MD_APP_KEY, MD_CALLBACK_PORT, MD_HOOK_URL, MD_KEY, MDYMCP_INSTALL_DEBUG, MDYMCP_SKIP_PAT_PROMPT- Where it talks to
- no vendor host named in the codeAlso mingdao.com, githubusercontent.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names mingdao.com, githubusercontent.com as well as its own vendor. The guard injects MD_APP_SECRET, MD_HAP_PAT, MD_V1_TOKEN_MODE, MD_V1_TOKEN_REMOTE_PATH, MD_V1_TOKEN_SSH_HOST, MD_V1_TOKEN_SSH_KEY, MD_V1_TOKEN_SSH_USER only into requests to the host you bind (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-11 and scored it 68/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
"""Lazy load .env,**合并** cwd → ~/.mdymcp → ~/.mdmcp (legacy) → package parent。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(旧实现读到第一个 .env 就 return,导致带自有 .env 的项目里 mdymcp 完全拿不到凭据。)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print("→ 跳过。之后可在 ~/.mdymcp/.env 加 MD_HAP_PAT=pat_xxx 并重启 MCP 客户端启用 HAP 工具。")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env(如某项目根放了 META_* / PORT 等配置)**不会屏蔽** ~/.mdymcp/.env 里的Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.0.2.x → 0.4.x 跳级用户的 .env 里只有已废弃的 MD_HAP_TOKEN/REFRESH/KEY,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._check_hap_pat(target / ".env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print(" curl -LsSf https://raw.githubusercontent.com/andyleimc-source/mdymcp/main/install.sh | sh")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run(cmd, capture_output=True, text=True, timeout=30)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."并更新 .env 的 MD_HAP_PAT(或重跑 mdymcp-install)。"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- `server 模式缺配置` / `SSH key 不存在` → `~/.mdymcp/.env` 缺 `MD_V1_TOKEN_*`,跑 **`mdymcp-server-setup`** 重配。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.源码 `~/code/mdymcp`(clone),改完 bump version → 发 PyPI → 三台 mac `uv tool upgrade mdymcp`(不动 `~/.mdymcp/.env`)。skill 走 dotfiles 同步(见 skill `mac-sync`)。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.ok(f".env 已存在 HAP PAT(…{existing_pat[-6:]})")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."重新生成,并更新 .env 的 MD_HAP_PAT(或重跑 mdymcp-install)。"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print(" 之后把 ~/.mdymcp/server_token_key 和 .env 里 4 个 MD_V1_TOKEN_* 拷到本机即可。")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print(f"\n→ 运行 {script} …(过程中可能要你输服务器登录密码 / sudo 密码)\n")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.current = read_env(root / ".env").get("MD_V1_TOKEN_MODE", "local").strip().lower()Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(["bash", str(script), host, ssh_user], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.ok("已写入 .env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.- 服务器:`[email protected]`(腾讯云内地)。SSH host/user/key/远程路径配在 `~/.mdymcp/.env`(`MD_V1_TOKEN_SSH_HOST/SSH_USER/SSH_KEY/REMOTE_PATH`)。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."生成 PAT 写入 ~/.mdymcp/.env(MD_HAP_PAT=pat_xxx)后重启。", hint)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run(cmd, check=check, **kw)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.p = subprocess.Popen(cmd, stdin=subprocess.PIPE)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.r = subprocess.run([str(py), "-c", code], env=env, capture_output=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.print(" curl -LsSf https://raw.githubusercontent.com/andyleimc-source/mdymcp/main/install.sh | sh")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.print(" curl -LsSf https://raw.githubusercontent.com/andyleimc-source/mdymcp/main/install.sh | sh")Fix: Pin versions and sources; vendor anything fetched at install time.Andy 三台 mac 现在都跑 **server 模式**(`.env` 里 `MD_V1_TOKEN_MODE=server`):Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print(" 2) 删除 ~/.mdymcp(含 .env / 所有凭据)")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.uv_bin = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.- 把新 `pat_xxx` 更新到 `.env` 的 `MD_HAP_PAT`,或重跑 `mdymcp-install`。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file = root / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if _purge_env_vars(root / ".env", SERVER_ENV_KEYS):Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.r = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.两种响应格式。Token 使用 `auth.ensure_hap_token()`,即用户在 .env 配置的 HAP PAT(pat_xxx);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for mdymcp@0.5.3 as of 3d ago. This is the package itself, not its dependencies.
What would make this Verified
12 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Pipe-to-shell pattern≈ +9 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Unclaimed publisher≈ +8 on the totalClaim andyleimc-source: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Direct script execution from GitHub raw URL≈ +4 on the totalPin versions and sources; vendor anything fetched at install time.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.