Atlas / MCP servers / anis-marrouchi / agentix-cli

agentix-cliBLOCK

mcp/anis-marrouchi/agentx

Self-hosted AI agents for small teams. Route Telegram, WhatsApp, GitHub, GitLab, crons, webhooks and mesh tasks to agents on Claude Code, Codex, OpenCode or any LLM API. Web dashboard + CLI. MIT.

Verdict
BLOCK
Grade
F
Trust score
32 /100
Exposed tools
121 89r · 30w · 2d
Transport
—
License
MIT
Stars
13
01

Overview

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

Put an AI teammate on the tools your team already uses.

[](https://www.npmjs.com/package/agentix-cli) [](https://github.com/anis-marrouchi/agentx/actions/workflows/ci.yml) [](LICENSE) [](package.json)

Watch it · See the demo · Install · Read the guide

AgentX routes messages and scheduled jobs to AI agents you host. Connect Telegram, WhatsApp, GitLab, GitHub, or a webhook. Give each agent a clear job. Watch the result in a browser dashboard.

Watch it

Short videos show AgentX running, one task each. Click the picture to open the Learn AgentX playlist on YouTube.

[](https://www.youtube.com/playlist?list=PLWyRWfXkYvlw)

Read from source at commit b5d4850b6beeOBSERVED · 2026-10-11
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 agentx-plugin-echo-channel --env ACME_AGENT_TOOLS_SECRET=${ACME_AGENT_TOOLS_SECRET} --env AGENTX_CHAT_SECRET=${AGENTX_CHAT_SECRET} --env AGENTX_MESH_AUTH=${AGENTX_MESH_AUTH} --env AGENTX_TOKEN=${AGENTX_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "agentx-plugin-echo-channel": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ACME_AGENT_TOOLS_SECRET": "${ACME_AGENT_TOOLS_SECRET}",
        "AGENTX_CHAT_SECRET": "${AGENTX_CHAT_SECRET}",
        "AGENTX_MESH_AUTH": "${AGENTX_MESH_AUTH}",
        "AGENTX_TOKEN": "${AGENTX_TOKEN}"
      }
    }
  }
}
03

Exposed tools (121)

89 read · 30 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
AgentXreadTalk to your agents and watch your fleet.
Bad-Namereadx
MainreadThe first computer
add_deliverablewriteRecord a shipped artefact against a task (repo URL, preview URL, design file, document, etc.). type: repo|preview|design|artifact|document|screenshot|figma|spreadsheet|presentation|video|audio|image|other.
adminreadAdministration
agent.callreadDispatch a task to a local agent on the same daemon (fresh session by default — replaces ad-hoc
agentxreadAI-powered agentic code generation agent. Generates components, pages, APIs, documents, skills, and more for any tech stack.
agentx_agentsreadList all agents registered on the daemon with their status (active tasks, total tasks, errors, tier).
agentx_approvalreadAsk the operator for a yes/no decision by raising a decision card in their Approvals inbox, instead of asking in chat.
agentx_attach_answerreadExplicitly answer the message currently claimed by this session (attach mode). Usually unnecessary — replying normally after agentx_attach_next is captured automatically. Use this only when your reply to the channel should differ from what you told the user in the terminal.
agentx_call_ownerreadRing the owner for a live voice call on their desktop widget, when you need them directly and a message will not do.
agentx_camera_askreadAsk the owner to show you their phone camera, when you need to see something (a rack, a cable, a document).
agentx_camera_lookreadThe newest picture from the owner
agentx_channel_labeldestructiveAdd and/or remove labels on a GitLab issue or merge_request through the canonical adapter (per-agent token, ledger). Use this instead of curl when changing labels on the entity that triggered the current task.
agentx_cronsreadList cron jobs and their health. Shows healthy, failing, disabled counts and per-job status with consecutive error counts.
agentx_debugwriteToggle debug mode on the daemon. Enable verbose logging for specific categories (webhook, agent, channel, cron, mesh, context, memory, all) or disable it.
agentx_detect_output_typereadAuto-detect the best output type for a given task description based on keyword analysis.
agentx_eventsreadRead what happened on this node that matches your event subscriptions (agents.<id>.subscriptions in agentx.json): tasks other agents finished or failed, workflow runs, mesh hand-offs.
agentx_generatereadGenerate code, components, pages, APIs, documents, tests, workflows, schemas, emails, diagrams, and more using AI. Understands the project
agentx_graph_reviewreadTriage pending intent-graph classifications via the configured review agent. The review agent sees each pending classification, may call
agentx_healthreadGet the daemon health status including node info, agents, crons, mesh peers, and uptime.
agentx_inspectreadAnalyze a project and return its tech stack, frameworks, databases, schemas, installed skills, and dependencies. Use this to understand a project before generating code.
agentx_recentreadRead the most recent messages from a chat across ALL agents that have sessions for it. Returns inbound + each agent
agentx_requestreadSay what you are doing with a request the owner gave you, so it stays on their list of open requests until it is closed.
agentx_schedulewriteManage recurring routines (schedules) in plain English. Actions: list, create, pause, resume, delete.
agentx_sendwriteLow-level outbound send when you ALREADY have a channel-native chatId (Telegram numeric chat id, GitLab
agentx_signalwriteStop a running agent task cleanly, or resume one that was stopped (#857).
agentx_skill_matchreadFind installed skills that are relevant to a given task description. Returns matched skills with relevance scores.
agentx_taskwriteSend a task to a specific agent on the daemon. The agent processes it and returns a response. Use to delegate work to specialized agents.
agentx_voice_queuereadSee what this host is saying out loud and what waits to be said: every agent
agentx_wiki_interviewwriteRun a scripted wiki interview — synthesize ONE typed article from a list of Q&A answers, and save it. Non-interactive: caller supplies the answers upfront. Use for capturing tacit knowledge (person/project/decision/pattern/...) that never hit a channel. For editing an existing article, use
agentx_wiki_patchwriteEdit a single wiki article via an LLM-applied instruction and write the result. Use this for targeted fixes, additions, or clarifications to an existing article when you already know what
agentx_workflowwriteRun a request that has several steps as a workflow, so AgentX follows it to the end instead of you chasing each step.
api-servicereadREST API service with auth, validation, error handling, and tests
ask_userreadAsk the user a clarifying question when you need more information to proceed. Use this when the request is ambiguous or you need to confirm important decisions.
billing-cutoffreadInvoices close on the 25th
boomreadAlways errors
branchingreadClassify, then route on the result via a branch node.
channel.assignwriteSet assignees on a GitLab issue or MR (replaces the assignee list). Pass empty array to unassign. Use during Triage→To Do flip to assign the coding agent, or to designate reviewer/merger on an MR.
channel.create_issuewriteCreate a GitLab issue from an agent (PM test cases, CX client requests). Honors per-agent identity; resolves assignee usernames to ids; optional /relate to a parent issue.
channel.labeldestructiveAdd and/or remove labels on a GitLab issue/MR through the adapter (per-agent token, ledger, no raw curl).
channel.replywritePost a reply to a channel (gitlab/github comment, telegram/whatsapp message, ...) through the canonical adapter — auto-marker, auto-dedupe within 60s, identity resolved from agentMappings.
chrome-extensionreadBrowser extension with popup, content script, background worker, and options
cli-toolreadCLI application with commands, flags, interactive prompts, and config
codereadSoftware work
component-libraryreadUI component library with Storybook, tests, and documentation
create_fileswriteCreate one or more files as output. Use this when you need to generate code, documents, configs, or any file-based output.
create_taskwriteQueue a new task for the user. Use when they ask you to build, fix, or work on something. CONFIRM the summary verbally first.
data-pipelinereadData processing pipeline with ingestion, transformation, and output stages
deploy.stagingwriteDeploy
drift.testreadtest
echoreadEcho back input
edit_filewriteApply search-and-replace edits to an existing file. Use this for targeted modifications to existing code rather than rewriting entire files.
extractreadPull typed fields from free-form text via extract.structured.
extract.structuredreadSingle-call typed extraction: prompt + JSON-Schema → structured data via forced tool_use
f1readd
failure-0123456789readbeta: Bash keeps failing
file.read_linesreadRead a text file as an array of lines (utf-8, 8MB cap, scoped to allowed roots)
file.write_jsonlwriteAppend JSON records to a file as newline-delimited JSON (utf-8, scoped to allowed roots)
fix.bugreadFix a defect
foo.bar_bazreadx
fullstack-appreadFull-stack application with database, API, UI, and deployment config
gadget-keyreadGadget admin key
gadget-ownerwriteGadget service is run by the platform team
gadget-portwriteGadget service listens on port 7420 since the move
get_credit_balancereadGet the user
get_projectreadGet a single project with its tasks and recent conversations. Use after list_projects when the user picks one.
http.fetchreadGET a URL, return body + status + headers (1MB cap, http/https only)
http.postwritePOST a JSON body to a URL, return body + status + headers (1MB cap, http/https only)
infra-xwritedeploy and ssh notes
initech-brokenreadbroken
initech-cx-emailreademail skill
initech-cx-email-v2reademail skill
initech-stalereadinfra
initech-v2-deploywriteDeploy Initech V2
linearwriteTrigger → Agent → End. Smallest workflow that runs.
list_attachmentsreadList files the user has uploaded to the workspace. Filter by project_id and/or task_id.
list_directoryreadList files and directories at a given path. Use this to explore project structure.
list_projectsreadList the example.com user
mesh.delegatewriteSend a task to a remote mesh peer
mixed-subjectsread12 turns over three unrelated subjects with genuine follow-ups inside each.
mobile-appreadMobile application with navigation, screens, and native features
no-mock-dbreadUse a real database in tests
opsreadInfrastructure
p1readd
p2readd2
parkingreadParking
pickreadd
pingreadHTTP echo
portsreadd
prefreadterse
r1readd
rag.lexicalreadBM25-style lexical search over an agent
read_filereadRead the contents of a file. Use this to inspect existing code, understand patterns, check implementations, or gather context before generating code.
release-follow-upwriteDeploy, check it is live, tell the client (with your approval). Followed to the end; one summary for you.
reportreadReport what is visible and how it bears on the question
respond_with_structurereadReturn a structured value matching the schema
restart.servicewriteRestart
retryreadPer-node retry policy with a branch fallback path.
review.merge-requestwriteReview an MR
rolereadAlex is a solo founder — prefers terse tech replies.
run_commandwriteExecute a shell command. Use this to run build tools, test commands, linters, or inspect the environment. Commands run in the project root directory.
saas-starterreadFull-stack SaaS starter with auth, billing, dashboard, and landing page
search_filesreadSearch for files matching a pattern and optionally search their content with a regex. Use this to find relevant code, understand project structure, or locate specific patterns.
server_portsreaddaemon ports
signal.resumewriteResume a task a stop signal paused, from its resume plan, in the same chat
single-threadread8 turns on one continuous task. Every turn after the first depends on the last.
slow.thingreadtest
spawn_agentreadSpawn a sub-agent to handle a task in the background. The sub-agent runs in its own session and returns results. Use this for parallel research, long-running tasks, or delegating work to a specialized agent.
terse-switchesread10 short turns with unsignposted subject changes and one-word follow-ups.
test.capturereadtest
test.echoreadtest
test.strictreadtest
tonereadGadget replies stay short
u1readd
unnamedreadNo description
update_taskwriteUpdate a task
waclireadd
xreadd
x.yreadv1
yreadd
04

Trust audit

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

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

What the source does

Filesystem
declared (9 observation(s))
Network
declared (7 observation(s))
Shell
declared (14 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHInventory / provenance · inv.suspicious_name · CWE-1104
src/crons/event-payload.ts
event-payload.ts
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/agent/skills/loader.ts:117
const parsed = yaml.load(raw)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/agents/references/loader.ts:52
const parsed = yaml.load(raw)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/agents/references/recipes.ts:67
const parsed = yaml.load(raw)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/daemon/projects-mutate.ts:175
const raw = yaml.load(readFileSync(full, "utf-8")) as { project?: string } | null
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/daemon/projects-mutate.ts:211
const rule = (yaml.load(before) ?? {}) as ProjectRule
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/actions/runner.ts:70
exec(cmd, { cwd, env, timeout: action.timeoutMs, maxBuffer: MAX_OUTPUT }, (err, stdout, stderr) => {
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/notify/local.ts:93
if (helper && await exec(helper, ["notify", "--title", title, "--message", message])) return
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/whatsapp-triage/wacli.ts:27
const r = await exec(settings.bin, [...base(settings), "send", "text", "--to", to, "--message", text, "--no-preview"], { timeoutMs: 60_000 })
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/whatsapp-triage/wacli.ts:39
const r = await exec(settings.bin, [...base(settings), "--read-only", "media", "download", "--chat", chat, "--id", id, "--output", output], { timeoutMs: 120_000 })
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.binary · CWE-1104
apps/android/gradle/wrapper/gradle-wrapper.jar
gradle-wrapper.jar
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/commands/manage.ts:369
console.log(chalk.red(`  --token-env must be uppercase identifier (got "${tokenEnv}")`)); process.exit(1)
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/commands/manage.ts:548
console.log(chalk.red(`  Invalid token: ${e.message}`))
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/commands/manage.ts:651
console.log(chalk.dim(`  Secret token: ${answers.webhookSecret}`))
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/commands/model.ts:48
console.log(`  Token:     ${chalk.dim(maskToken(config.token))}`)
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/commands/token.ts:34
console.log(`  ${chalk.green.bold(secret)}`)
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
src/web/activity-graph/MapPerspective.tsx:63
function PhoneHome({ transit, windowH, onLine }: { transit: Transit; windowH: number; onLine: (id: string) => void }) {
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
src/web/activity-graph/MapPerspective.tsx:150
{!pl ? <PhoneHome transit={transit} windowH={windowH} onLine={(id) => { setPhoneLine(id); setSel(null) }} /> : (
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/mac-voice/Sources/AgentXVoice/Config.swift:10
static let daemonURL = env("AGENTX_DAEMON_URL") ?? "http://127.0.0.1:18800"
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/wiki/note-reader.ts:91
const text = raw.replace(/^/, "").replace(/\r\n/g, "\n")
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
test/memory-trust.test.ts:36
"AKIAABCDEFGHIJKLMNOP",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
test/guard/resolve.test.ts:7
const env = { DATABASE_URL: "postgres://u:[email protected]:5432/app", X: "y" }
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
test/memory-trust.test.ts:40
"postgres://app:[email protected]/app",
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/memory-trust.test.ts:37
"-----BEGIN OPENSSH PRIVATE KEY-----",
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
agentx_channel_label, channel.label
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

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha b5d4850b6beefull audit observations/trust-audit/mcp-server/anis-marrouchi__agentx.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-11b5d4850b6beeBLOCKF32first audit
06

Questions

What is the agentix-cli MCP server?

Self-hosted AI agents for small teams. Route Telegram, WhatsApp, GitHub, GitLab, crons, webhooks and mesh tasks to agents on Claude Code, Codex, OpenCode or any LLM API. Web dashboard + CLI. MIT.

What tools does agentix-cli expose?

121 in total: 89 read-only, 30 that write, and 2 that can delete or overwrite (agentx_channel_label, channel.label). Every one is listed on this page with its risk.

Is agentix-cli safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (32/100) and found 10 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 agentix-cli need?

It reads ACME_AGENT_TOOLS_SECRET, AGENTX_CHAT_SECRET, AGENTX_MESH_AUTH, AGENTX_TOKEN, AGENTX_TOOLS_SECRET, AGENTX_WORKFLOW_AUTHOR_AGENT, ANTHROPIC_API_KEY, ANTHROPIC_OAUTH_TOKEN, CLAUDE_CODE_OAUTH_TOKEN, ELEVENLABS_API_KEY, EXAMPLE_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 current is this page?

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

Advertisement