mcp4acumatica@0.53.0
BLOCKED· install onlyPublisher claims: "Enables Claude to access Acumatica ERP 2025 R2 through per-user OAuth and role-governed tools for lookups, discovery, documentation, and optional customer updates. Includes consent, sensitive-field redaction, rate limiting, pagination safeguards, and audit logging." Observed in sandbox: reads credential files, sends data to fd12:ea5f:789c:1:d000:2b:95f6:3c3a, 10.246.60.58, sparrow.cloudflare.com.
Coverage
Install scripts ran; no agent task scenario for this bundle.- Tested
- install scripts, with decoy credentials in place · second launch with the clock 45 days ahead · every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
What this means for the label: Blocked here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Revoked: guards refuse to launch this version
confirmed incident: read ~/.npmrc; contacted fd12:ea5f:789c:1:d000:2b:95f6:3c3a, 10.246.60.58, sparrow.cloudflare.com (undeclared) Every machine running vet-skills guard stops starting it at the next launch; the state clears when the honeypot re-run or a reviewer clears it.
Before you give it your token
- It will ask for
ACUMATICA_CLIENT_SECRETADMIN_SECRETOAUTH_PROVIDERTOKEN_MANAGERTOKEN_STOREConfiguration, not credentials: ACUMATICA_CANARY_GI, ACUMATICA_CLIENT_ID, ACUMATICA_ENDPOINT_NAME, ACUMATICA_ENDPOINT_VERSION, ACUMATICA_MAX_CONCURRENT, ACUMATICA_MAX_PER_MINUTE, ACUMATICA_MAX_RECORDS, ACUMATICA_RATE_LIMIT_QUEUE_WAIT_MS, ACUMATICA_TENANT, ACUMATICA_URL, ACUMATICA_WRITES_ENABLED, COOKIE_ENCRYPTION_KEY, INDEX_STORE, REDACT_PATTERNS, REDACT_SKIP- Where it talks to
- no vendor host named in the codeAlso acumatica.com, hallboys.com, nodejs.org, git-scm.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- read ~/.npmrc · contacted fd12:ea5f:789c:1:d000:2b:95f6:3c3a, 10.246.60.58, sparrow.cloudflare.com (undeclared)
- What we could not test
- use of the skill by an agent
Do not connect it. The honeypot or a critical finding blocked this version; the evidence is below.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; install scripts ran; no agent task scenario for this bundle) on 2026-11-12 and scored it 23/100 (Blocked). Do not install it: the sandbox observed behaviour consistent with credential theft, exfiltration or persistence. Notable findings: document.cookie access; Pipe-to-shell pattern; document.cookie access. Summary: reads credential files, sends data to fd12:ea5f:789c:1:d000:2b:95f6:3c3a, 10.246.60.58, sparrow.cloudflare.com.
Behavior trace
Honeypot run · 53 s · 2 scenariosStatic findings
const m = document.cookie.match(/(?:^|; )mcp_admin_csrf=([^;]+)/);Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.console.log(`Uploading ${file} → ${BUCKET}/${key} ...`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.# When invoked via `curl | bash`, stdin is the pipe (the script), not theFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…ported as a text module via the `**/*.sh` rule in `wrangler.jsonc`). Users run `curl -fsSL https://<worker>/install.sh | bash`; it checks for `git`/`node`/`npm`, clones the repo, `npm install`s, and `exec`…Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# 1. A Cloudflare account with `npx wrangler login` already authenticated.Fix: Pin versions and sources; vendor anything fetched at install time.npx wrangler dev # Local devFix: Pin versions and sources; vendor anything fetched at install time.…istry`, never on `GiRegistryEntry`, so nothing model-facing changed. Raw data: `npx wrangler kv key get "cache:gi_registry" --namespace-id <id> --remote`. - **Measured 2026…Fix: Pin versions and sources; vendor anything fetched at install time.// reads via document.cookie is the defense.Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.const m = document.cookie.match(/(?:^|; )mcp_admin_csrf=([^;]+)/);Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.if ! npx --no-install wrangler --version >/dev/null 2>&1; thenFix: Pin versions and sources; vendor anything fetched at install time.// curl -fsSL https://<this-worker>/install.sh | bashFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…ported as a text module via the `**/*.sh` rule in `wrangler.jsonc`). Users run `curl -fsSL https://<worker>/install.sh | bash`; it checks for `git`/`node`/`npm`, clones the repo, `npm install`s, and `exec`…Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# When invoked via `curl | bash`, stdin is the pipe (the script), not theFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# curl -fsSL https://mcp4acumatica.hallboys.com/install.sh | bashFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.console.log("Upload with `npm run upload-index`.");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.1. **Update CLAUDE.md** — ensure it reflects all changes made during the sessionFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.npx wrangler deploy # Deploy to CloudflareFix: Pin versions and sources; vendor anything fetched at install time.…n this occurs. - **Empty / non-JSON 2xx bodies (fixed 0.44.0):** `await response.json()` on an empty Acumatica body throws the raw V8 message `Unexpected end of JSON input`, which reached the model verbatim as the entire explanation. Produ…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.npx wrangler tail # Live logsFix: Pin versions and sources; vendor anything fetched at install time.npx tsc --noEmit # Type checkFix: Pin versions and sources; vendor anything fetched at install time.…user write gate can `enable()` per session), and `runWriter` still enforces the kill switch per call. **A tool registered via `this.server.tool(...)` directly bypass…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.warn "You may not be logged in to wrangler. Run: npx wrangler login"Fix: Pin versions and sources; vendor anything fetched at install time.# curl -fsSL https://mcp4acumatica.hallboys.com/install.sh | bashFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…binding `INDEX_STORE`) — schema-knowledge + documentation indexes (`schema-index.json`, `docs-index.json` + `docs-chunks/*` parts, future `dac-index.json`/`gi-examples-index.json`). Built offline by `scripts/` and uploaded with `npm run up…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.if ! npx wrangler whoami 2>&1 | grep -qi 'logged in\|email\|account'; thenFix: Pin versions and sources; vendor anything fetched at install time.…han hand-building. See "GI Tool Gating & Registry". - **Re-import `MCPGIFields.xml` if the instance predates 0.48.0** — it gained the `SortOrder` and `IsActive` output columns (positional alignment can't attach column descriptions without …Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(`Done — uploaded ${uploaded} index file(s).`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why./** Same truthiness rule runWriter() uses for the kill switch. */Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// curl -fsSL https://<this-worker>/install.sh | bashFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.CREATE_OUT="$(npx wrangler kv namespace create TOKEN_STORE 2>&1 || true)"Fix: Pin versions and sources; vendor anything fetched at install time.* still enforces the kill switch on every call regardless.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# If swagger.json is present, build the schema index and upload it so theFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* kill switch is off.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
57 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%An override rule (credential_read_plus_egress) caps this verdict regardless of the score. The first item below has to go before anything else counts.
- Reads credential files≈ +27 on the totalThe sandbox saw reads under ~/.ssh, ~/.aws, ~/.npmrc, ~/.config or similar. Read only files inside the project, and only the ones the task needs.
- Contacts a host you did not declare≈ +23 on the totalList every host you talk to in SKILL.md frontmatter (`network: [api.example.com]`), or stop contacting the ones you cannot justify.
- Unclaimed publisher≈ +8 on the totalClaim anilcopilot: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- document.cookie access≈ +4 on the totalReplace encoded or assembled strings with plain literals and remove undeclared network calls.
- Pipe-to-shell pattern≈ +4 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.