Atlas / MCP servers / longngn204 / Local Coding Agent

Local Coding AgentBLOCK

mcp/longngn204/local-coding-agent

Local MCP coding agent for ChatGPT Web: run files/commands on your own machine via the OpenAI Secure Tunnel, with a Windows tray app and metrics dashboard.

Verdict
BLOCK
Grade
F
Trust score
53 /100
Exposed tools
9 7r · 2w · 0d
Transport
streamable-http
License
AGPL-3.0
Stars
56
01

Overview

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

Local Coding Agent

Turn your machine into a local MCP coding workspace for AI agents. Let an AI agent read files, edit code, run checks, inspect git, and show live health metrics from a local dashboard.

Works with

Compatible with any MCP client. Not affiliated with Anthropic, OpenAI, GitHub, or Microsoft.

The Community Edition code is open source under AGPL. The project name and brand assets are governed separately by the Trademark Policy.

Read from source at commit 2defb88435bdOBSERVED · 2026-10-08
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 local-coding-agent --env AGENT_APPROVAL_TOKEN=${AGENT_APPROVAL_TOKEN} --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env LCA_DESKTOP_BRIDGE_TOKEN=${LCA_DESKTOP_BRIDGE_TOKEN} --env LCA_LICENSE_PUBLIC_KEY_PEM=${LCA_LICENSE_PUBLIC_KEY_PEM} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "local-coding-agent": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "AGENT_APPROVAL_TOKEN": "${AGENT_APPROVAL_TOKEN}",
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "LCA_DESKTOP_BRIDGE_TOKEN": "${LCA_DESKTOP_BRIDGE_TOKEN}",
        "LCA_LICENSE_PUBLIC_KEY_PEM": "${LCA_LICENSE_PUBLIC_KEY_PEM}"
      }
    }
  }
}
03

Exposed tools (9)

7 read · 2 write · 0 destructive.

ToolRiskDescription
bug_fixreadInvestigates errors, points at relevant files, and proposes a focused fix plan.
defaultreadPrivate Local Codex Studio profile
demo-skillreadTemporary skill created by the regression test.
docs_updatewriteUpdates bilingual Vietnamese/English docs with matching content.
network_checkreadRuns network/customer diagnostics and writes a redacted report.
release_prepreadPrepares changelog, version notes, build checklist, and a release-readiness report.
repo_setupwriteHelps install, verify, and diagnose Local Coding Agent setup problems.
safety_reviewreadChecks permission risks, token leaks, unsafe commands, public tunnel exposure, and log redaction.
workreadtest
04

Trust audit

BLOCKgrade F · trust 53/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 (6 observation(s))
Network
declared (8 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
server/server.mjs:5952
if (/\beval\s*\(/.test(added)) findings.push({ priority: "P1", loc, issue: "eval() usage — potential code injection" });
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
server/server.mjs:5959
findings.push({ priority: "P1", loc, issue: "exec() in Python context — verify input is sanitized" });
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
experiments/standalone-client-roadmap/v5.0.0-local-agent-studio/scripts/generate-license-token.mjs:55
console.log(`License token written to: ${resolve(options.out)}`);
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
experiments/standalone-client-roadmap/v5.0.0-local-agent-studio/integrity-manifest.json:2
"payload": "eyJzY2hlbWFWZXJzaW9uIjoxLCJwcm9kdWN0IjoibG9jYWwtYWdlbnQtc3R1ZGlvIiwidmVyc2lvbiI6InY1LjAuMCIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTNUMTQ6MTE6MzAuNzQyWiIsImZpbGVzIjpbeyJwYXRoIjoiY29yZS9hZ2VudC10b29s
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
desktop-app/main/config.mjs:45
const text = readFileSync(this.file, "utf8").replace(/^/, "");
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
server/server.mjs:2625
text = text.replace(/^/, ""); // strip UTF-8 BOM (some Windows editors add it)
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
experiments/standalone-client-roadmap/v5.0.0-local-agent-studio/test/desktop-credential-store.test.mjs:14
const secret = "sk-os-secret-never-plaintext";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
experiments/standalone-client-roadmap/v5.0.0-local-agent-studio/test/secret-store.test.mjs:16
const secret = "sk-test-secret-value-123";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
server/context-memory.test.mjs:12
const secret = "sk-proj-abcdefghijklmnopqrstuvwxyz123456";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
server/test-agents.mjs:52
'api_key: "hunter2hunter2hunter2"'
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
server/test-agents.mjs:144
const secret = "sk-proj-DEADBEEF1234567890";
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
experiments/standalone-client-roadmap/v5.0.0-local-agent-studio/test/redaction.test.mjs:20
const text = redactText("Bearer abcdefghijklmnop\n-----BEGIN PRIVATE KEY-----\nsecret\n-----END PRIVATE KEY-----");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
evals/run.mjs:205
const r = await call(client, "read_file", { path: "../../../../etc/passwd" });
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
server/security-test.mjs:29
check("path traversal blocked", (await call("read_file", { path: "../../../etc/passwd" })).isError);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
server/test-agent.mjs:88
await call("read_file", { path: "../../../etc/passwd" }, { expectError: true });
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
server/test-agents.mjs:82
const bad = makeLocalReportPath("/tmp/x", "../../etc/passwd", "log");
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:153
for i in $(seq 1 30); do curl -fsS http://127.0.0.1:8799/healthz >/dev/null && break; sleep 1; done
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:154
TEST_ENDPOINT=http://127.0.0.1:8799/mcp AUDIT_LOG=data/audit.log npm run test:security:baseline
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
AGENTS.md:12
(`http://127.0.0.1:8790/ui`).
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
AGENTS.md:42
- Health: `curl http://127.0.0.1:8787/healthz` → expect `{"status":"ok",...}`.
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:103
Open the dashboard at `http://127.0.0.1:8790/ui` to copy the same setup,
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
desktop-app/package.json
@types/react, @types/react-dom, @vitejs/plugin-react, electron, electron-builder, react, react-dom, typescript
Why it matters. 9 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
desktop-tray/package.json
@types/react, @types/react-dom, @vitejs/plugin-react, electron, electron-builder, react, react-dom, typescript
Why it matters. 9 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
experiments/standalone-client-roadmap/v4.5.0-pro-local-client-mvp/package.json
@modelcontextprotocol/sdk
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
experiments/standalone-client-roadmap/v4.6.0-pro-model-router/package.json
@modelcontextprotocol/sdk
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 2defb88435bdfull audit observations/trust-audit/mcp-server/longngn204__local-coding-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-082defb88435bdBLOCKF53first audit
06

Questions

What is the Local Coding Agent MCP server?

Local MCP coding agent for ChatGPT Web: run files/commands on your own machine via the OpenAI Secure Tunnel, with a Windows tray app and metrics dashboard.

What tools does Local Coding Agent expose?

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

Is Local Coding Agent safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (53/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 Local Coding Agent need?

It reads AGENT_APPROVAL_TOKEN, ANTHROPIC_API_KEY, LCA_DESKTOP_BRIDGE_TOKEN, LCA_LICENSE_PUBLIC_KEY_PEM, LCA_RELEASE_PUBLIC_KEY_PEM, LCA_RELEASE_SIGNING_PRIVATE_KEY_FILE, LCA_UPDATE_PUBLIC_KEY_PEM, LCA_UPDATE_SIGNING_PRIVATE_KEY_FILE, MCP_AUTH_TOKEN and OPENAI_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 Local Coding Agent run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as local-coding-agent at 5.0.1.

How current is this page?

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

Advertisement