Atlas / MCP servers / swsgbl / hmharness

hmharnessBLOCK

mcp/swsgbl/hmharness

为鸿蒙 (HarmonyOS/OpenHarmony) 开发全流程而生的自进化智能体框架——零依赖内核、自进化一等公民、MCP 生态借力、模拟器与工具链无头全控。Self-evolving agent framework for the full HarmonyOS lifecycle.

Verdict
BLOCK
Grade
D
Trust score
60 /100
Exposed tools
84 71r · 11w · 2d
Transport
—
License
MIT
Stars
4
01

Overview

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

为鸿蒙 (HarmonyOS/OpenHarmony) 开发全流程而生的自进化智能体框架,已升级为跨环境 Cognitive Runtime。 零依赖内核 + 自进化一等公民 + MCP 生态借力 + 认知层(世界模型/校准/探索/迁移)——不继承任何上游运行时能力,全部自持或经标准协议外借。

English · [](https://github.com/swsgbl/hmharness/actions/workflows/ci.yml) [](https://www.npmjs.com/package/@hmharness/cli)

特性一览

Read from source at commit 9275e895eb53OBSERVED · 2026-10-11
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 web --env ARC3_API_KEY=${ARC3_API_KEY} --env ARC_API_KEY=${ARC_API_KEY} --env HMH_API_KEY=${HMH_API_KEY} --env HMH_DESKTOP_TOKEN=${HMH_DESKTOP_TOKEN} -- npx -y @hmharness/[email protected]
claude-desktop
{
  "mcpServers": {
    "web": {
      "command": "npx",
      "args": [
        "-y",
        "@hmharness/[email protected]"
      ],
      "env": {
        "ARC3_API_KEY": "${ARC3_API_KEY}",
        "ARC_API_KEY": "${ARC_API_KEY}",
        "HMH_API_KEY": "${HMH_API_KEY}",
        "HMH_DESKTOP_TOKEN": "${HMH_DESKTOP_TOKEN}"
      }
    }
  }
}
03

Exposed tools (84)

71 read · 11 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
OAuthreadAuthenticate with OAuth
aread
avg_durationreadaverage evaluation duration
avg_scorereadaverage numeric score
brokenreadalways fails
browser_clickreadClick an element by its browser_snapshot ref. After the click, re-snapshot (or browser_screenshot) to see the new state.
browser_navigatereadNavigate the BrowserOS tab to an http(s) URL, wait for load. First use auto-starts a DEDICATED BrowserOS instance (own profile; the user\
browser_openreadOpen a URL in the user\
browser_readreadRead the current page as text (title, URL, visible innerText, capped ~12k chars). Prefer this over screenshot for content extraction; use browser_screenshot for layout/visual state.
browser_screenshotreadScreenshot the current page to a PNG file; returns the path — then call see_image with it to actually look. Use when layout/visual state matters; for text content prefer browser_read.
browser_scrollreadScroll the current page: down | up | top | bottom (step ~600px). Snapshot again after scrolling — new elements become visible and get refs.
browser_snapshotreadList the visible interactive elements of the current page with stable refs ([N] tag text). Click/type target these refs. Re-snapshot after any navigation or DOM change. For visual/layout questions use browser_screenshot + see_image instead.
browser_tabsreadManage tabs of the driven browser: list (default) | new [url] | activate <target_id> | close <target_id>. Navigate/click/type/read always act on the ACTIVE tab.
browser_typereadType text into an input/textarea/contenteditable by its browser_snapshot ref (native setter + input/change events — React/Vue compatible). submit=true presses submit (form.requestSubmit, else Enter).
cfg-floorreadd
cognitive_queryreadQuery the cognitive layer\
desktop_clickreadClick the mouse at screen coordinates (left click). ALWAYS desktop_screenshot + see_image FIRST to find the right coordinates, then click, then screenshot again to verify. Coordinates are pixels from top-left of the primary display.
desktop_screenshotreadScreenshot the primary display to a PNG file and return its path. Immediately follow with see_image on that path to actually look at it. Use for: checking a GUI app state, reading dialogs/errors, verifying what a desktop automation step did.
desktop_typereadType text (or a key combo like ENTER, TAB, ^a, {F5}) into the focused window. Use after desktop_click to focus a field. Standard SendKeys syntax.
echoreadEcho back the given text.
edit_filewriteSurgical search-replace edit. Provide old_string (must appear exactly once in the file) and new_string to replace it. Prefer this over write_file for changes to existing files. old_string must be unique - if it appears more than once, the edit is refused (make it more specific).
evidence_coveragereadfraction of results with evidence
evilread
extension_page_actread在用户真实浏览器的标签页里执行一次页面操作:click(点击选择器)/type(输入文本,React 兼容)/scroll(滚动)/select(设置下拉值)。⚠️ 这会在用户真实浏览器、用户已登录的页面上动手 — 每次调用都必须获得用户批准。先 extension_page_read 看清页面再操作。
extension_page_readread读取用户真实浏览器某个标签页的内容(标题/URL/用户选区/标题大纲/表单/链接/正文,只读,约8k字符上限)。tabId 省略时读活动标签页。受保护页面(chrome:// 等)或未授权站点会诚实报错。对布局/视觉问题用 browser_screenshot 类工具,不要用这个。
extension_statusreadhmh 浏览器扩展桥的状态:桥是否运行、是否已配对、扩展是否连接、目标浏览器。排查 extension_* 工具问题时先调用这个。
extension_tabsread列出用户真实浏览器当前打开的标签页(标题/URL/是否活动)。只读。与 browser_tabs(专用实例)不同,这里看到的是用户日常浏览器里的真实标签页。
greet-loudreadshout
greet-uppercasereaduppercase the greeting
half-goodreadd
harmony_buildreadBuild a HarmonyOS project with hvigor (assembleHap). Accepts an optional project path (defaults to walking up from cwd for build-profile.json5). Long-running: allow several minutes. Reports the build result tail and the produced .hap path.
harmony_cjpm_buildreadBuild a Cangjie (cjpm) package with cjpm build. Looks for cjpm.toml at/above the given path (default cwd). Injects CANGJIE_HOME derived from the resolved cjpm.exe - the classic Windows pitfall. Long-running: allow minutes.
harmony_cjpm_testwriteRun Cangjie unit tests (cjpm test) in the project at/above the given path. Same CANGJIE_HOME injection as harmony_cjpm_build.
harmony_devicesreadList connected HarmonyOS devices/emulators (targets) via hdc. Returns the raw target list: index, state and connect string. Use before any device operation to learn the target id.
harmony_emulator_createwriteCreate (deploy) a NEW emulator instance - no DevEco GUI. Two sources: clone an existing deployed device (from=...), or materialize a CATALOG VARIANT (model=
harmony_emulator_deletedestructiveDelete a deployed emulator instance (data dir, lists entry, ini). Refuses while it is running. Destructive - requires approval.
harmony_emulator_listreadList HarmonyOS emulators: deployed devices (name/type/version/resolution + running state) and installed system images. Read-only. Pair with harmony_emulator_start / harmony_devices.
harmony_emulator_startwriteStart a deployed emulator headlessly (spawns Emulator.exe directly - no DevEco GUI). Boots take 30-90s; the tool polls until the device appears in hdc (max 3 min). Heavy: each instance uses ~4 GB RAM.
harmony_emulator_stopwriteStop running emulator(s) by terminating their exact Emulator.exe process (matched via -hvd name; state on disk is preserved like a power loss - Android-style cold stop). With a name, stops only that instance; with no name, stops ALL running emulators. Requires approval.
harmony_installwriteInstall a .hap onto a connected HarmonyOS device via hdc (mutates the device - requires approval). Without a path, installs the newest .hap in the current project build output. Tries
harmony_launchreadLaunch an app on a connected HarmonyOS device via
harmony_lintreadLint a HarmonyOS/ArkTS project with the official codelinter CLI (probe-based). If codelinter is not installed, returns install guidance instead of failing. Install options: DevEco Studio
harmony_logsreadFetch recent device logs via
harmony_ops_issue_commentreadComment on a GitHub issue (PUBLICATION - requires human approval via the gate). Never closes, never edits others\
harmony_ops_issue_createwriteCreate a GitHub issue (PUBLICATION - requires human approval via the gate). AI drafts the title/body; the approval prompt is the publication decision. A keeper identity footer is appended automatically.
harmony_ops_issue_listreadList GitHub issues for a repo (owner/name) via gh. Read-only. Returns number, title, author, updated time as JSON lines. Draft input for issue triage - pair with harmony_ops_issue_view before proposing replies.
harmony_ops_issue_viewreadRead one GitHub issue with its comments (gh issue view). Read-only.
harmony_ops_pr_draftreadOpen a DRAFT pull request (PUBLICATION - requires human approval). Always --draft; the body becomes the plan card (what/why/how to test). Keeper identity footer appended.
harmony_ops_radar_briefreadRead the latest saved ecosystem radar brief (markdown).
harmony_ops_radar_scanreadScan the OpenHarmony/HarmonyOS ecosystem radar: pull release feeds (OpenHarmony docs/ArkUI/ArkTS/Ability runtime), diff against the last snapshot, and produce a Chinese brief (model-written, template fallback when the model is down). Read-only for the outside world; results land under HMH_HOME/ops/.
harmony_ops_statusreadOps keeper status: scan count, last scan time, watched sources.
harmony_project_createwriteScaffold a buildable HarmonyOS project (stage model, ArkTS) - fully parametric, no DevEco IDE needed. Options: extra pages (PascalCase, e.g. [
harmony_project_profilereadOne-call project inventory: modules (type/pages/abilities/deviceTypes), har dependencies, resource + source counts, bundle/SDK, and config health (issue count from schema check). The
harmony_schema_checkreadValidate a HarmonyOS project\
harmony_toolchain_checkreadCheck the local HarmonyOS development toolchain: hdc (devices), hvigorw (build) and ohpm (packages), with resolved paths and versions where available.
harmony_uninstalldestructiveUninstall a bundle from a connected device via hdc (destructive - requires approval).
hmh_pingreadTest connectivity: returns pong plus the call counter.
list_dirreadList a directory: names with d/- prefix and size.
lsp_call_hierarchyreadWho calls this symbol, and what does it call (incoming/outgoing). Args: file, line (1-based), character (1-based), direction=incoming|outgoing
lsp_definitionreadGo to definition of the symbol at a position. Args: file, line (1-based), character (1-based)
lsp_diagnosticsreadGet live language-server diagnostics for a file (errors/warnings). source:lsp — this is FEEDBACK, not build/test proof. Args: file (relative to workspace or absolute)
lsp_hoverreadHover info (types/docs) for a symbol at a position. Args: file, line (1-based), character (1-based)
lsp_implementationreadFind implementations of the interface/method at a position. Args: file, line (1-based), character (1-based)
lsp_referencesreadFind references to the symbol at a position. Args: file, line (1-based), character (1-based)
lsp_symbolsreadDocument symbols (outline) for a file. Args: file
my_metricreadtest
noopreadnoop
noperead
ops_notifywriteSend a notification to a configured chat channel (Feishu/DingTalk custom bot or generic JSON webhook). Configure once in HMH_HOME config.json: channels: { name: { type, url, secret? } }. Use to report task completion, build results, device-test verdicts -
page_actread操作用户当前标签页(click 点击 / type 输入 / scroll 滚动 / select 选择)。动作会在用户眼前执行;不确定时先用 page_read 看页面、再问用户。
page_readread读取用户当前浏览器标签页:标题、URL 与正文文本的精简提取。回答任何关于
pass_ratereadfraction of evaluations that passed
pokereadno-op
read_filereadRead a text file. Returns the full content (truncated at 60k chars).
rememberreadPersist a note to long-term memory (survives restarts, loaded into future sessions). Use for user preferences, project facts, and hard-won lessons - not transient details.
rlm_workspacereadPersistent structured workspace for THIS task: variables survive between calls (unlike your context window).
run_commandwriteRun a shell command (one line, cmd on Windows / sh elsewhere) with a timeout. Prefer focused commands; read output carefully before deciding next steps.
see_imagereadLook at an image file (png/jpg/webp) with the configured vision model and answer a question about it, or describe it. Use for UI screenshots, rendered pages, photos of device screens - anything visual. Requires a vision provider in config.
slowreadsleeps 150ms
spawn_agentreadfake
web_fetchreadFetch a web page and return its readable text (HTML stripped, entities decoded, bounded to ~12k chars). Use after web_search to read a result, or for any docs page / raw file URL.
web_searchreadSearch the web (DuckDuckGo, no key). Returns top results as: title | url | snippet. Use for current events, docs, versions - anything not knowable offline.
write_filewriteWrite a text file (creates or overwrites). Use for code, config, docs.
xread
04

Trust audit

BLOCKgrade D · trust 60/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)FAIL
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

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

Findings (25)

CRITICALPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
<tool:ops_notify>:1
Send a notification to a configured chat channel (Feishu/DingTalk custom bot or generic JSON webhook). Configure once in HMH_HOME config.json: channels: { name: { type, url, secret? } }. Use to report
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/domain-harmony/src/vmenv.ts:235
sshKey: { type: 'string', description: 'for check: path to the SSH key (default ~/.ssh/VM_KEY)' },
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/sandbox/src/redteam.ts:44
{ id: 'pt-006', payload: '~/.ssh/id_rsa', description: 'SSH key access' },
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/sandbox/src/redteam.ts:168
{ name: 'ssh-key', regex: /id_rsa|id_ed25519|\.pem/i },
Why it matters. touches a credential store
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/web/src/server.ts:2323
console.log(`auth:   未配对设备需要 ?key=<web.token> 链接;已配对手机凭 cookie/局域网位置直连`);
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/publish.cjs:127
console.log('publishing as:', who, '(auth: ' + (TOKEN ? 'NODE_AUTH_TOKEN' : 'npm login session') + ')');
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
packages/extension/src/adapters.ts:43
export const EXTENSION_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4q3ILDDKZOiEgNrQDc7ljtWiTzt3tSsbgnpgvTgZNh7L4BjU+4Evad1arNin/IN6LKyS7pyJoFL6vaEApk+KZdRJQ8a6Um4IanqAIz+OLDm5NjpHqlvlPBREHb5bDA
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
harmony_emulator_delete, harmony_uninstall
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.binary · CWE-1104
docs/plans/hmharness_V2.0_施工蓝图.docx
hmharness_V2.0_施工蓝图.docx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
docs/plans/hmharness_V2_V3_路线图.docx
hmharness_V2_V3_路线图.docx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
.research-repo.md
.research-repo.md
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/agent/src/__tests__/rlm-learn.test.ts:32
assert.match(String((await exec({ action: 'set', name: 'findings', value: 'module-a,module-b' }, home)).output), /set findings/);
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
packages/agent/src/__tests__/rlm-learn.test.ts:33
assert.equal(String((await exec({ action: 'get', name: 'findings' }, home)).output), 'module-a,module-b');
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
packages/agent/src/__tests__/rlm-learn.test.ts:34
assert.match(String((await exec({ action: 'list' }, home)).output), /findings/);
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
packages/agent/src/__tests__/rlm-learn.test.ts:40
await exec({ action: 'set', name: 'a', value: '1' }, home);
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
packages/agent/src/__tests__/rlm-learn.test.ts:41
await exec({ action: 'set', name: 'b', value: '2' }, home);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/sandbox/src/__tests__/redteam.test.ts:33
assert.equal(isPathInsideWorkspace('~/.ssh/id_rsa', ROOT), false);
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/agent/src/__tests__/runner.test.ts:143
assert.equal(matchesRule(rules, 'run_command', { command: 'node scripts/../../evil.js' }), false, 'path traversal blocked');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/agent/src/__tests__/runner.test.ts:144
assert.equal(matchesRule(rules, 'run_command', { command: 'node scripts/sub/../../evil.js' }), false, 'NESTED traversal blocked (first differing segment is not ..)');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/agent/src/__tests__/runner.test.ts:145
assert.equal(matchesRule(rules, 'run_command', { command: 'node scripts/a/b/../../../evil.js' }), false, 'deep traversal blocked');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/cli/src/__tests__/update-check.test.ts:75
const cliV = req('../../package.json') as { version: string };
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/codexhost-bridge/bin/hmh-codexhost.mjs:21
const agentUrl = new URL("../../agent/dist/index.js", import.meta.url);
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
packages/sandbox/src/__tests__/redteam.test.ts:67
test('secret exfil: npmrc read detected', () => {
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
packages/sandbox/src/__tests__/redteam.test.ts:72
test('secret exfil: env echo detected', () => {
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
packages/sandbox/src/__tests__/redteam.test.ts:77
test('secret exfil: normal content not flagged', () => {

Gates applied: critical_finding, no_behavioural_pass, undeclared_transfer.

Audited 2026-10-11 · audit v0.4.1 · source sha 9275e895eb53full audit observations/trust-audit/mcp-server/swsgbl__hmharness.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-119275e895eb53BLOCKD60first audit
06

Questions

What is the @hmharness/cli MCP server?

为鸿蒙 (HarmonyOS/OpenHarmony) 开发全流程而生的自进化智能体框架——零依赖内核、自进化一等公民、MCP 生态借力、模拟器与工具链无头全控。Self-evolving agent framework for the full HarmonyOS lifecycle.

What tools does @hmharness/cli expose?

84 in total: 71 read-only, 11 that write, and 2 that can delete or overwrite (harmony_emulator_delete, harmony_uninstall). Every one is listed on this page with its risk.

Is @hmharness/cli safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (60/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does @hmharness/cli need?

It reads ARC3_API_KEY, ARC_API_KEY, HMH_API_KEY, HMH_DESKTOP_TOKEN and NODE_AUTH_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 current is this page?

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

Advertisement