nexus-mcp-agent
npm
v2.0.1
Published by anomalyco — no publish provenance, so origin is unverified, but the source is public: the repository link below is self-declared yet readable, so you can inspect the code before adopting it.
Agentic OS MCP Server — 169 tools with on-demand loading (26 core), Streamable HTTP transport, background task engine, browser automation, TF-IDF semantic memory, multi-agent orchestration. Zero API keys.
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 9.5 = 91. What the published surface and source actually contain:
| Points | What was found | Category |
|---|---|---|
| −9.5 | Untrusted input concatenated into a command sink ×2 MTC-SRC-009 | injection |
2. Client adoption risk — 91 − 11 = 80. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −10 | capability blast radius (critical) — client exposure if the model is manipulated |
| −1 | publisher verification (public source) — no provenance, but the source is public and inspectable |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
This server (without client built-ins) exposes a complete data-exfiltration chain: agent_catalog → cicd_get_logs → cmd_spawn. Untrusted input is ingested, private data is read, and it can be sent to an external sink via the agent composing the tools (→). Static analysis proves the primitive exists, not that a specific run will occur.
Fix: Remove one leg of the trifecta: isolate untrusted-input tools from secret-reading tools and from egress tools, or require human approval between them.
Location: flow agent_catalog → cicd_get_logs → cmd_spawn
Tool "subagent_spawn" appears to run shell commands or evaluate code (keyword "spawn" in tool name). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.
Fix: Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.
Location: tool subagent_spawn
Tool "cmd_spawn" appears to run shell commands or evaluate code (keyword "spawn" in tool name). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.
Fix: Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.
Location: tool cmd_spawn
In the server's implementation (`dist/tools/dev.js:107`): Evaluating strings as code is the most direct RCE primitive; if any tool input reaches it, the server executes attacker-chosen code. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: rch text="TODO|password|eval("', ' 4. Run reason_reflect on any failed checks and propose corrections',
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/dev.js
In the server's implementation (`dist/core/shell.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: nSync, execSync } from 'child_process'; import { existsSync } from 'fs'; import { join } from 'path'; // Resolve the bes
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/core/shell.js
In the server's implementation (`dist/tools/agent-loop.js:2`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: port { execSync } from 'child_process'; import { readFile, readdir } from 'fs/promises'; import { existsSync } from 'fs'
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/agent-loop.js
In the server's implementation (`dist/tools/bg.js:2`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: import { spawn } from 'child_process'; import { join } from 'path'; import { getDataDir } from '../core/config.js'; imp
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/bg.js
In the server's implementation (`dist/tools/checkpoint.js:2`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: port { execSync } from 'child_process'; function git(args, cwd) { const opts = { cwd: cwd || process.cwd(), encoding
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/checkpoint.js
In the server's implementation (`dist/tools/lint-fix.js:2`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: port { execSync } from 'child_process'; import { readdir } from 'fs/promises'; import { existsSync } from 'fs'; import {
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/lint-fix.js
In the server's implementation (`dist/tools/project.js:5`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: port { execSync } from 'child_process'; import { resolveSafePath } from '../core/safe-path.js'; import { logError } from
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/project.js
In the server's implementation (`dist/tools/sandbox.js:2`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: import { spawn } from 'child_process'; import { mkdtemp, writeFile, rm } from 'fs/promises'; import { tmpdir } from 'os
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/sandbox.js
In the server's implementation (`dist/tools/security.js:23`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: te)' }, { pattern: /exec(?:Sync)?\s*\(/i, label: 'Command Execution' }, { pattern: /new\s+Function\s*\(/i, label
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/security.js
In the server's implementation (`dist/tools/terminal.js:2`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ; import { exec } from 'child_process'; import { promisify } from 'util'; import { resolve } from 'path'; import { parse
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/terminal.js
In the server's implementation (`dist/tools/testing/test-runner.js:13`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ; import { exec } from 'child_process'; import { promisify } from 'util'; const execAsync = promisify(exec); const FRAME
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/testing/test-runner.js
In the server's implementation (`dist/tools/web.js:188`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const res = await fetch('https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions', { me
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/web.js
In the server's implementation (`dist/core/shell.js:135`): A shell/process command assembled from concatenated or interpolated values is command injection when any part is attacker-influenced — the OWASP canonical RCE flow. Verify what reaches the interpolated value. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: execSync(`taskkill /pid ${child.pid} /f /t 2>nul`, { stdio: 'ignore' });
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/core/shell.js
In the server's implementation (`dist/tools/checkpoint.js:6`): A shell/process command assembled from concatenated or interpolated values is command injection when any part is attacker-influenced — the OWASP canonical RCE flow. Verify what reaches the interpolated value. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: try { return execSync(`git ${args.join(' ')}`, opts).toString().trim(); } catch (e) { if (e.s
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/checkpoint.js
In the server's implementation (`dist/tools/automation.js:7`): Loading a module chosen at runtime (from a variable) can pull in and run attacker-influenced code paths. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: '; return await import(mod); } catch { const error = [ '❌ Playwright not installed.
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/tools/automation.js
Tool "subagent_spawn" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.
Fix: Declare accurate annotations, and gate destructive tools on user confirmation regardless.
Location: tool subagent_spawn
Tool "cmd_spawn" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.
Fix: Declare accurate annotations, and gate destructive tools on user confirmation regardless.
Location: tool cmd_spawn
Each tool and what it can reach — statically extracted from the published source.
agent_catalogingests untrusted inputbrowseingests untrusted inputbrowse_clickingests untrusted inputbrowse_screenshotingests untrusted inputbrowse_statusingests untrusted inputcatalog_fetchingests untrusted inputcicd_get_logsreads sensitive datacmd_spawnruns code / shellsubagent_spawnruns code / shellweb_fetchingests untrusted inputweb_scrapeingests untrusted inputweb_searchingests untrusted inputweb_search_dashscopeingests untrusted inputagent_createno sensitive capabilityagent_delegateno sensitive capabilityagent_deleteno sensitive capabilityagent_domainsno sensitive capabilityagent_fanoutno sensitive capabilityagent_hierarchicalno sensitive capabilityagent_listno sensitive capabilityagent_loadno sensitive capabilityagent_loopno sensitive capabilityagent_parallelno sensitive capabilityagent_pipelineno sensitive capabilityagent_searchno sensitive capabilityautopilot_cancelno sensitive capabilityautopilot_resumeno sensitive capabilityautopilot_startno sensitive capabilityautopilot_statusno sensitive capabilitybg_agentno sensitive capabilitybg_cancelno sensitive capabilitybg_listno sensitive capabilitybg_startno sensitive capabilitybg_statusno sensitive capabilitybg_streamno sensitive capabilitybrowser_clickno sensitive capabilitybrowser_devtools_statusno sensitive capabilitybrowser_extractno sensitive capabilitybrowser_inputno sensitive capabilitybrowser_listno sensitive capabilitybrowser_navigateno sensitive capabilitybrowser_pw_extractno sensitive capabilitybrowser_pw_navigateno sensitive capabilitybrowser_pw_screenshotno sensitive capabilitybrowser_pw_statusno sensitive capabilitybrowser_screenshotno sensitive capabilitybrowser_session_closeno sensitive capabilitybrowser_session_openno sensitive capabilitybrowser_skillsno sensitive capabilitybrowser_stateno sensitive capabilitybrowser_test_smokeno sensitive capabilitycatalog_searchno sensitive capabilitycatalog_statusno sensitive capabilitychain_createno sensitive capabilitychain_executeno sensitive capabilitychain_listno sensitive capabilitychain_statusno sensitive capabilitychain_step_doneno sensitive capabilitycheckpoint_createno sensitive capabilitycheckpoint_diffno sensitive capabilitycheckpoint_dropno sensitive capabilitycheckpoint_listno sensitive capabilitycheckpoint_restoreno sensitive capabilitycicd_cancel_runno sensitive capabilitycicd_get_runno sensitive capabilitycicd_list_runsno sensitive capabilitycicd_list_workflowsno sensitive capabilitycicd_rerunno sensitive capabilitycicd_trigger_workflowno sensitive capabilitycicd_usageno sensitive capabilitycmd_executeno sensitive capabilitycontext_restoreno sensitive capabilitycontext_saveno sensitive capabilitycontext_statusno sensitive capabilitycontext_summarizeno sensitive capabilitycontext_trimno sensitive capabilityfs_deleteno sensitive capabilityfs_editno sensitive capabilityfs_edit_multino sensitive capabilityfs_infono sensitive capabilityfs_listno sensitive capabilityfs_readno sensitive capabilityfs_searchno sensitive capabilityfs_writeno sensitive capabilitygit_addno sensitive capabilitygit_branchesno sensitive capabilitygit_checkoutno sensitive capabilitygit_cloneno sensitive capabilitygit_commitno sensitive capabilitygit_diffno sensitive capabilitygit_logno sensitive capabilitygit_pullno sensitive capabilitygit_pushno sensitive capabilitygit_statusno sensitive capabilitygithub_contentno sensitive capabilitygithub_issuesno sensitive capabilitygithub_prno sensitive capabilitygithub_searchno sensitive capabilityknowledge_clearno sensitive capabilityknowledge_import_webno sensitive capabilityknowledge_ingestno sensitive capabilityknowledge_ingest_dirno sensitive capabilityknowledge_searchno sensitive capabilityknowledge_statsno sensitive capabilitylint_fixno sensitive capabilitymcp_callno sensitive capabilitymcp_connectno sensitive capabilitymcp_disconnectno sensitive capabilitymcp_proxy_statusno sensitive capabilitymcp_serversno sensitive capabilitymcp_toolsno sensitive capabilitymem_deleteno sensitive capabilitymem_listno sensitive capabilitymem_recallno sensitive capabilitymem_statsno sensitive capabilitymem_storeno sensitive capabilitymemory_episodic_recallno sensitive capabilitymemory_episodic_statsno sensitive capabilitymemory_episodic_storeno sensitive capabilitymemory_kg_add_entityno sensitive capabilitymemory_kg_add_relationno sensitive capabilitymemory_kg_queryno sensitive capabilitymemory_kg_statsno sensitive capabilitymemory_procedural_executeno sensitive capabilitymemory_procedural_findno sensitive capabilitymemory_procedural_listno sensitive capabilitymemory_procedural_saveno sensitive capabilitymemory_semantic_deleteno sensitive capabilitymemory_semantic_listno sensitive capabilitymemory_semantic_rebuild_indexno sensitive capabilitymemory_semantic_searchno sensitive capabilitymemory_semantic_storeno sensitive capabilityorch_agentsno sensitive capabilityorch_routeno sensitive capabilityproject_analyzeno sensitive capabilityproject_packno sensitive capabilityproject_scaffoldno sensitive capabilityproject_scanno sensitive capabilityproject_set_contextno sensitive capabilityproject_suggestno sensitive capabilityreason_planno sensitive capabilityreason_reactno sensitive capabilityreason_react_listno sensitive capabilityreason_reflectno sensitive capabilityreason_reflect_singleno sensitive capabilityreason_tree_of_thoughtno sensitive capabilityreview_codeno sensitive capabilitysandbox_nodeno sensitive capabilitysandbox_pythonno sensitive capabilitysandbox_runno sensitive capabilitysandbox_statusno sensitive capabilityscan_depsno sensitive capabilityscan_injectionno sensitive capabilityscan_secretsno sensitive capabilityscheduleno sensitive capabilityschedule_listno sensitive capabilitysession_auto_saveno sensitive capabilitysession_listno sensitive capabilitysession_restoreno sensitive capabilitysession_resumeno sensitive capabilitysession_saveno sensitive capabilityskill_crystalizeno sensitive capabilityskill_listno sensitive capabilityskill_loadno sensitive capabilityskill_saveno sensitive capabilityskill_searchno sensitive capabilitystatusno sensitive capabilitystatus_historyno sensitive capabilitystatus_loop_checkno sensitive capabilitystatus_summarizeno sensitive capabilitysubagent_completeno sensitive capabilitysubagent_domainsno sensitive capabilitysubagent_listno sensitive capabilitysubagent_logno sensitive capabilitysubagent_statusno sensitive capabilitysubagent_updateno sensitive capabilitysys_echono sensitive capabilitysys_envno sensitive capabilitysys_healthno sensitive capabilitysys_infono sensitive capabilitytask_checkpointno sensitive capabilitytask_listno sensitive capabilitytask_restoreno sensitive capabilitytask_startno sensitive capabilitytest_coverage_reportno sensitive capabilitytest_detectno sensitive capabilitytest_generateno sensitive capabilitytest_runno sensitive capabilitytool_loadno sensitive capabilitytool_searchno sensitive capabilityurl_extractno sensitive capabilityvision_analyzeno sensitive capabilityworkflow_createno sensitive capabilityworkflow_executeno sensitive capabilityworkflow_listno sensitive capabilityworkflow_statusno sensitive capabilityworkflow_step_doneno sensitive capabilityCross-tool combinations that form a data-exfiltration primitive (untrusted input → sensitive source → external sink).
Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v2.0.1 latest |
B 80/100 | 20 | 1.13.0 | 2026-09-07 |
v1.7.0 |
B 80/100 | 20 | 1.12.1 | 2026-08-06 |
v1.5.3 |
B 80/100 | 19 | 1.12.1 | 2026-08-05 |
v1.5.2 |
B 80/100 | 19 | 1.12.1 | 2026-08-03 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan nexus-mcp-agent --online
Authenticated MCP transport with HTTP Signatures for AAuth agents
Local-first MCP server for parallel AI coding agents to claim file ownership before edits, preventing stomping on each other in the same worktree.
Agent-agnostic intercommunication system — sessions, messaging, channels, shared state, and real-time events
MCP server for AI agent task communication and delegation with diagnostic lifecycle visibility
Programmatic add/link/unlink for MCP servers across 23 AI coding agents (Claude Code, Claude Desktop, Cursor, VS Code, Codex, Gemini CLI, Zed, Cline, OpenCode, Goose, Kiro, Windsurf, and more). Functional API with dry-run support.
MCP server layer exposing agent-mesh orchestrator as an MCP agent