Atlas / MCP servers / open-multi-agent / Open Multi Agent

Open Multi AgentBLOCK

mcp/open-multi-agent/open-multi-agent

Self-hosted TypeScript agent runtime with durable approvals and verifiable run records. Own it, approve it, audit it.

Verdict
BLOCK
Grade
F
Trust score
56 /100
Exposed tools
74 66r · 8w · 0d
Transport
streamable-http
License
MIT
Stars
6,997
01

Overview

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

OMA

Agents your organization can own, approve, and audit. OMA (Open Multi-Agent) is a self-hosted TypeScript agent runtime: consequential actions wait for durable, tamper-evident approvals, and every run leaves a record you can verify offline, byte for byte.

Website ·

Read from source at commit dfe2da8cbc42OBSERVED · 2026-10-12
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 release-bot --env AGENT_API_KEY=${AGENT_API_KEY} --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env ARK_API_KEY=${ARK_API_KEY} --env ASTA_API_KEY=${ASTA_API_KEY} -- npx -y @open-multi-agent/[email protected]
claude-desktop
{
  "mcpServers": {
    "release-bot": {
      "command": "npx",
      "args": [
        "-y",
        "@open-multi-agent/[email protected]"
      ],
      "env": {
        "AGENT_API_KEY": "${AGENT_API_KEY}",
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "ARK_API_KEY": "${ARK_API_KEY}",
        "ASTA_API_KEY": "${ASTA_API_KEY}"
      }
    }
  }
}
03

Exposed tools (74)

66 read · 8 write · 0 destructive.

ToolRiskDescription
areadA
breadB
bashwriteRun a shell command.
bigreadReturns large output.
big_outputreadreturns a large string
boomreadfails
change-analystreadClassifies merged changes and drafts evidence-backed changelog entries.
charge_cardreadCharge a card.
commitwriteCommit a labelled side effect.
commit_effectwriteCommit a labelled side effect to an external system.
compatibility-auditorreadAttempts to find breaking changes, migration requirements, and release blockers.
custom_toolreadCustom tool
dangerreadDangerous op.
delegate_to_agentwriteRun a sub-task on another agent from this team and return that agent\
echoreadEcho input
echo_toolreadReturn the caller-supplied payload unchanged.
engram_commitwriteCommit a verified fact to Engram shared team memory.
engram_conflictsreadList conflicts between facts in Engram shared memory.
engram_queryreadQuery Engram shared memory for facts about a topic.
engram_resolvereadOverride an auto-resolution for a conflict between facts.
errorbigreadThrows a huge error.
failreadAlways throws.
failed_picreadPic
file_editwriteEdit file
file_readreadRead the contents of a file from disk.
file_writewriteWrite file
filesreadFiles
format_currencyreadFormat a number as a localised currency string.
get_exchange_ratereadGet the current exchange rate between two currencies.
get_release_evidencereadReturn immutable release evidence collected from the latest core tag through the current HEAD.
get_weatherreadGet the weather for a city
globreadList file paths under a directory that match an optional filename glob.
greetreadgreets
grepreadSearch for a regular-expression pattern in one or more files.
invalidreadreturns invalid output
json-erroredreadAlways fails with a non-JSON error message.
json-gated-invalidreadReturns invalid JSON output after the gate allows it.
json-okreadReturns valid JSON output.
json-truncatedreadReturns broken-but-deceptive JSON output.
leakyreadreturns a sensitive-looking value
legacyreadlegacy string tool
limitedreadHas its own limit.
long_toolreadReturns long output
lookupreadLook up
malformed_gatereadUses a malformed gate decision.
my_customreadA custom capability.
my_custom_toolreadA custom tool for testing
no-schemareadNo output schema configured.
noopreadnoop
nullable_inputreadAccepts a required nullable value.
picreadPic
private_lookupreadPrivacy test tool.
read_release_contractreadRead the repository release contract from .github/RELEASING.md.
read_release_review_bundlereadRead one deterministic, risk-ranked, size-bounded bundle of base-to-HEAD diffs. The bot selects the paths; model-supplied repository paths are not accepted. Unselected paths remain listed in the full evidence metadata.
release-plannerreadCombines independent analysis into one bounded release proposal.
release-reviewerreadIndependently approves or rejects the bounded proposal before any mutation.
release_markerreadReturn a fixed marker for the provider E2E test.
renderreadrender an artifact
render_previewreadRender an image preview for a named artifact.
repo_searchreadSearch underscore.
run_landing_variantwriteGenerate this variant\
searchreadSearch the web
search_issuesreadSearch repository issues.
short_toolreadReturns short output
slow_gatereadRuns after a delayed gate.
slow_toolreadSlow op.
smallreadReturns small output.
spyreadCaptures the abort signal from context.
structuredreadStructured output.
tdam_search_conversationsreadSearch the raw conversation history captured in long-term memory.
tdam_search_memoriesreadSearch the team\
testreadtest
trackreadTracks concurrency.
typedreadtyped application output
04

Trust audit

BLOCKgrade F · trust 56/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
none-observed
Network
declared (3 observation(s))
Shell
declared (6 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/core/src/tool/shell/local.ts:34
exec(command: string, options: ShellExecOptions): Promise<ShellExecResult> {
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
packages/core/src/tool/shell/types.ts:37
exec(command: string, options: ShellExecOptions): Promise<ShellExecResult>
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
scripts/observability-benchmark-ci.mjs:11
const { stdout } = await exec(process.execPath, ['--expose-gc', benchmark, core, otel], {
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
scripts/observability-tarball-smoke.mjs:14
const { stdout, stderr } = await exec(file, args, {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/create-oma-app/templates/pr-review/src/input.ts:134
+    console.log('login', email, password)
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
bench/src/mock-upstream.mts:94
origin: `http://127.0.0.1:${port}`,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
bench/src/proxy.mts:91
return `http://127.0.0.1:${this.port}/v1`
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
packages/core/tests/memory-store-contract.test.ts:156
await store.set('secret', 'token sk-ant-api03-abcdefghijklmnopqrstuvwxyz0123456789')
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
packages/core/tests/memory-store-contract.test.ts:158
expect(stored).not.toContain('sk-ant-api03-abcdefghijklmnopqrstuvwxyz0123456789')
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/core/tests/coordinator-manifest.test.ts:55
credentials: { token: 'credential-secret-value' },
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/core/tests/copilot-adapter.test.ts:187
token: 'session_from_device_flow',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/core/tests/copilot-adapter.test.ts:215
apiKey: 'session_from_device_flow',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/core/tests/dashboard-render.test.ts:107
const secret = 'sk-dashboardsecretvalue1234567890'
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/core/tests/deepseek-adapter.test.ts:121
apiKey: 'deepseek-test-key-123',
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
packages/core/tests/redaction.test.ts:67
const input = '-----BEGIN RSA PRIVATE KEY-----\nMIIEv...\n-----END RSA PRIVATE KEY-----'
LOWInventory / provenance · inv.suspicious_name · CWE-1104
packages/core/tests/dependency-payload.test.ts
dependency-payload.test.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/core/examples/cookbook/contract-review-dag.ts:334
console.log(`Total token usage: ${result.totalTokenUsage.input_tokens} input, ${result.totalTokenUsage.output_tokens} output`)
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/core/examples/cookbook/incident-postmortem-dag.ts:390
console.log(`Total token usage: ${result.totalTokenUsage.input_tokens} input, ${result.totalTokenUsage.output_tokens} output`)
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/benchmarks/observability-sinks.mjs:263
?? fileURLToPath(new URL('../../otel/dist/index.js', import.meta.url))
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/examples/basics/multi-model-team.ts:19
import { OpenMultiAgent, defineTool } from '../../src/index.js'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/examples/basics/multi-model-team.ts:20
import type { AgentConfig, OrchestratorEvent } from '../../src/types.js'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/examples/basics/multi-model-team.ts:116
import { Agent, AgentPool, ToolRegistry, ToolExecutor, registerBuiltInTools } from '../../src/index.js'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/examples/basics/single-agent.ts:20
import { OpenMultiAgent, Agent, ToolRegistry, ToolExecutor, registerBuiltInTools, type SupportedProvider } from '../../src/index.js'
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/core/examples/integrations/mcp-open-design.ts:78
'  export OPEN_DESIGN_MCP_ARGS=\'[".../daemon-cli.mjs","mcp","--daemon-url","http://127.0.0.1:7456"]\'\n' +
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/core/examples/integrations/mcp-open-design.ts:96
return fail(`${name} must be a JSON array of strings, e.g. ["mcp","--daemon-url","http://127.0.0.1:7456"].`)

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha dfe2da8cbc42full audit observations/trust-audit/mcp-server/open-multi-agent__open-multi-agent.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-12dfe2da8cbc42BLOCKF56first audit
06

Questions

What is the @open-multi-agent/core MCP server?

Self-hosted TypeScript agent runtime with durable approvals and verifiable run records. Own it, approve it, audit it.

What tools does @open-multi-agent/core expose?

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

Is @open-multi-agent/core safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (56/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.

What credentials does @open-multi-agent/core need?

It reads AGENT_API_KEY, ANTHROPIC_API_KEY, ARK_API_KEY, ASTA_API_KEY, DASHSCOPE_API_KEY, DEEPSEEK_API_KEY, ENGRAM_INVITE_KEY, GEMINI_API_KEY, GITHUB_TOKEN, GOOGLE_AI_STUDIO_API_KEY, GOOGLE_API_KEY and GROQ_API_KEY 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 @open-multi-agent/core run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as @open-multi-agent/release-bot at 0.0.0.

How current is this page?

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

Advertisement