Atlas / MCP servers / lanlan0811 / tianshu-mcp

tianshu-mcpBLOCK

mcp/lanlan0811/tianshu-mcp

天枢harness × AI-Agent 编排 MCP server:调度外部 Agent 干活,用运行时证据做客观验收,不通过自动返修闭环。

Verdict
BLOCK
Grade
F
Trust score
57 /100
Exposed tools
7 7r · 0w · 0d
Transport
stdio
License
Apache-2.0
Stars
10
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

天枢编排 MCP tianshu-mcp

把开发交给 AI-Agent,把验收交给运行时 · Dispatch with agents, verify with evidence.

官网 · GitHub 主仓 · Gitee 镜像 · 天枢 Tianshu · 简体中文 · English

架构说明 · Agent 配置 · 验收配置 · 视觉验收 · 事件流 · 日志台 GUI · 交接文档

Read from source at commit a99af01bf61bOBSERVED · 2026-10-10
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add tianshu-mcp --env GH_TOKEN=${GH_TOKEN} --env GITEE_ACCESS_TOKEN=${GITEE_ACCESS_TOKEN} --env GITEE_TOKEN=${GITEE_TOKEN} --env GITHUB_TOKEN=${GITHUB_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "tianshu-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "GH_TOKEN": "${GH_TOKEN}",
        "GITEE_ACCESS_TOKEN": "${GITEE_ACCESS_TOKEN}",
        "GITEE_TOKEN": "${GITEE_TOKEN}",
        "GITHUB_TOKEN": "${GITHUB_TOKEN}"
      }
    }
  }
}
03

Exposed tools (7)

7 read · 0 write · 0 destructive.

ToolRiskDescription
approve_visual_baselineread仅在用户明确审阅并授权后批准视觉基准。必须核对候选摘要与批准说明;自动返修禁止调用。宿主必须实施实际审批控制。
manage_taskread任务生命周期管理(合并原 cancel_task / continue_task / rework_task),用 action 区分:
prepare_visual_baselineread准备视觉基准候选,返回摘要与预览;不采用正式基准。需要用户授权。
query_inforead统一信息查询入口(合并原 list_tasks / get_task_report / get_profiles),用 type 区分:
query_taskread查询任务状态 / 进度 / 最近日志尾部(默认 agent.log 末 40 行)/ 最近细粒度事件。返回任务 meta 与日志片段。
verify_taskread对已完成任务或项目路径执行一次验收(不改源码):自动命令检查 + 代码分析(相对 git 基线)。可用 extraChecks 临时加验。需任务/项目二选一。可选 idempotencyKey:同一 key 重试不重跑验收——执行中的同键请求返回进行中提示,已完成的直接返回既有报告与轮次,参数变更则报冲突。
wait_taskread等待任务到达停点(阻塞只读原语,合并原 wait_task / wait_any)。
04

Trust audit

BLOCKgrade F · trust 57/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (12 observation(s))
Network
declared (6 observation(s))
Shell
declared (4 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/visual/capture.ts:213
await page.$eval(step.selector, (element) => {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/visual/capture.ts:220
await page.$eval(step.selector, (element) => element.scrollIntoView());
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMFilesystem / path · fs.system_paths · CWE-22, CWE-59
mcp-gui/src-tauri/src/data_home.rs:106
assert!(resolve_rel(home, "/etc/passwd").is_err());
MEDIUMFilesystem / path · fs.system_paths · CWE-22, CWE-59
mcp-gui/src-tauri/src/data_home.rs:139
assert!(validate_task_id("/etc/passwd").is_err());
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/evidence-visual-windows.mjs:94
const url = `http://127.0.0.1:${server.address().port}`;
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
mcp-gui/src-tauri/src/data_home.rs:154
assert!(validate_task_id("tаsk").is_err()); // 西里尔 а
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
test/unit/codex-core.test.ts:872
const fn = new Function(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
test/unit/opendesign-dom.test.ts:221
expect(() => new Function(`${resolveFnSource()}; return __opendesignResolve;`)()).not.toThrow();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
test/unit/opendesign-dom.test.ts:460
expect(() => new Function(expression), expression.slice(0, 60)).not.toThrow();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/verify/code-analysis.ts:253
const hash = buf.length > HASH_MAX_BYTES ? null : createHash("sha1").update(buf).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/verify/code-analysis.ts:278
return createHash("sha1").update(buf).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/verify/git-baseline.ts:110
return createHash("sha1").update(buf).digest("hex");
LOWFilesystem / path · fs.system_paths · CWE-22, CWE-59
test/unit/dry-run.test.ts:96
const r = parseDryRunPlan({ files: [{ path: "/etc/passwd", action: "modify" }] });
LOWFilesystem / path · fs.system_paths · CWE-22, CWE-59
test/unit/project-dir-guard.test.ts:116
["/etc/passwd", "linux"],
LOWFilesystem / path · fs.system_paths · CWE-22, CWE-59
test/unit/repair-directives.test.ts:136
checks: [makeCheck({ outputTail: "/etc/other/x.ts(1,1): error TS1005: oops." })],
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
mcp-gui/src-tauri/src/baseline.rs:160
let info = read_baseline(&home, &req("../../outside/evil"));
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
mcp-gui/src-tauri/src/data_home.rs:107
assert!(resolve_rel(home, "tasks/../../x").is_err());
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
mcp-gui/src-tauri/src/data_home.rs:181
assert!(task_dir(home, "../../outside/evil").is_err());
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
mcp-gui/src-tauri/src/event_stream.rs:304
task_id: "../../outside/evil".to_string(),
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
mcp-gui/src-tauri/src/export.rs:128
rel_path: "../../etc/passwd".to_string(),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/visual-acceptance.en.md:54
{ "type": "existing", "url": "http://127.0.0.1:4173" }
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/visual-acceptance.en.md:57
{ "type": "command", "command": "npm", "args": ["run", "preview", "--", "--port", "4173"], "cwd": ".", "env": { "TEST_TOKEN": "VISUAL_TEST_TOKEN" }, "readyUrl": "http://127.0.0.1:4173" }
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/visual-acceptance.md:59
{ "type": "existing", "url": "http://127.0.0.1:4173" }
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/visual-acceptance.md:62
{ "type": "command", "command": "npm", "args": ["run", "preview", "--", "--port", "4173"], "cwd": ".", "env": { "TEST_TOKEN": "VISUAL_TEST_TOKEN" }, "readyUrl": "http://127.0.0.1:4173" }

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha a99af01bf61bfull audit observations/trust-audit/mcp-server/lanlan0811__tianshu-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10a99af01bf61bBLOCKF57first audit
06

Questions

What is the tianshu-mcp MCP server?

天枢harness × AI-Agent 编排 MCP server:调度外部 Agent 干活,用运行时证据做客观验收,不通过自动返修闭环。

What tools does tianshu-mcp expose?

7 in total: 7 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is tianshu-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (57/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does tianshu-mcp need?

It reads GH_TOKEN, GITEE_ACCESS_TOKEN, GITEE_TOKEN and GITHUB_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does tianshu-mcp run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as tianshu-mcp at 0.9.6.

How current is this page?

The grade is for one exact copy of the source (a99af01bf61b), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement