MCP server for the Suppa platform (modern.suppa.me) — Tasks, Docs/Pages, Entities & Schema, Forms, Automations, and file attachments, with multi-tenant Google auth. Node port of PyPI suppa-mcp.
AI Security Review
scanned 14d ago · by lpm-firewall-ai
Source inspection found a postinstall guard installer gated to relevant Suppa projects, plus package-aligned authentication and maintenance behavior. The scanner’s dynamic evaluation finding corresponds to bundled Vue compiler diagnostics; the inspected evidence does not establish malicious behavior.
Installing the package triggers its postinstall script; authentication, version lookup, self-check, and compiler diagnostics run through their respective package features.
Impact
No credential theft, unrelated endpoint forwarding, or unconsented broad agent-control mutation was established.
Mechanism
Guard setup is gated by environment and project checks. Authentication requests support Suppa login and refresh, the version check retrieves registry metadata, the self-check launches the package binary, and the compiler uses dynamic code generation for diagnostics.
AI rationale
Source inspection found a postinstall guard installer gated to relevant Suppa projects, plus package-aligned authentication and maintenance behavior. The scanner’s dynamic evaluation finding corresponds to bundled Vue compiler diagnostics; the inspected evidence does not establish malicious behavior.
AI called this Clean at 91.0% confidence as Benign with low false-positive risk.
Evidence for AI clean decision
The manifest runs a postinstall guard setup script.
The postinstall guard skips CI and global installs and only continues for a project with Suppa schema code or a Suppa dependency.
The installer reads existing Claude settings before deciding whether to change them.
Authentication sends cookies through a request URL supplied by the package’s auth flow; token persistence is limited to the matching default tenant’s existing environment file.
The version check fetches the registry for update metadata, and the self-check launches the package binary to verify its MCP response.
The flagged dynamic code generation is part of the bundled Vue compiler diagnostics.
22import { randomBytes } from "node:crypto";
L23: import { spawn } from "node:child_process";
L24: import { createServer } from "node:http";
L25: import { readFileSync, statSync, writeFileSync } from "node:fs";
...
L33: export const EXPIRY_SKEW = 30.0; // seconds — refresh this long before the token actually expires
L34: // One refresh attempt, response body included. Bounded well below the refresh lock"s patience\n// (refreshLock.ts WAIT_MS): a waiting process gives up rather than spend the token ...
L35: * machine"s timezone. Any failure -> 0.\n */\nfunction isoToEpoch(value) {\n try {\n if (!value) {\n return 0;\n }\n // Determine whether the str...
L36: * tenant, while SUPPA_API_KEY names the env-configured default: writing tenant
...
L41: if (host
Critical
Credential Exfiltration
Source appears to send environment or credential material to an external endpoint.
22import { randomBytes } from "node:crypto";
L23: import { spawn } from "node:child_process";
L24: import { createServer } from "node:http";
L25: import { readFileSync, statSync, writeFileSync } from "node:fs";
...
L33: export const EXPIRY_SKEW = 30.0; // seconds — refresh this long before the token actually expires
L34: // One refresh attempt, response body included. Bounded well below the refresh lock"s patience\n// (refreshLock.ts WAIT_MS): a waiting process gives up rather than spend the token ...
L35: * machine"s timezone. Any failure -> 0.\n */\nfunction isoToEpoch(value) {\n try {\n if (!value) {\n return 0;\n }\n // Determine whether the str...
L36: * tenant, while SUPPA_API_KEY names the env-configured default: writing tenant
...
L41: if (host
High
Command Output Exfiltration
Source combines command execution, command-output handling, and outbound requests; review data flow before blocking.
1// @vue/compiler-dom 3.5.12, esm-bundler build, NODE_ENV=development (MIT, (c) Evan You and Vue contributors), bundled by scripts/sync-vue-compiler.mjs. Do not edit.
2functionJ(e){let t=Object.create(null);for(let n of e.split(","))t[n]
22import { randomBytes } from "node:crypto";
L23: import { spawn } from "node:child_process";
L24: import { createServer } from "node:http";
L25: import { readFileSync, statSync, writeFileSync } from "node:fs";
...
L33: export const EXPIRY_SKEW = 30.0; // seconds — refresh this long before the token actually expires
L34: // One refresh attempt, response body included. Bounded well below the refresh lock"s patience\n// (refreshLock.ts WAIT_MS): a waiting process gives up rather than spend the token ...
L35: * machine"s timezone. Any failure -> 0.\n */\nfunction isoToEpoch(value) {\n try {\n if (!value) {\n return 0;\n }\n // Determine whether the str...
L36: * tenant, while SUPPA_API_KEY names the env-configured default: writing tenant
...
L41: if (host
Critical
Credential Exfiltration
Source appears to send environment or credential material to an external endpoint.
3 Details: ${o}`:""}`,l=newSyntaxError(a);l.code=e,n&&(l.loc=n),t.onWarn(l)}functionHt(e){throw e}functionPn(e){console.warn(`[Vue warn] ${e.message}`)}functionb(e,t,n,s){let i=(n||Us)[e]+(s||""),r=newSyntaxError(String(i));return r.code=e,r.loc=t,r}var Us={0:"Illegal comment.",1:"CDATA section is allowed only in XML context.",2:"Duplicate attribute.",3:"End tag cannot have attributes.",4:"Illegal '/' in tags.",5:"Unexpected EOF in tag.",6:"Unexpected EOF in CDATA section.",7:"Unexpected EOF in comment.",8:"Unexpected EOF in script.",9:"Unexpected EOF in tag.",10:"Incorrectly closed comme ...
4Use a v-bind binding combined with a v-on listener that emits update:x event instead.`,45:"Error parsing JavaScript expression: ",46:"<KeepAlive> expects exactly one child component.",51:"@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.",47:'"prefixIdentifiers" option is not supported in this build of compiler.',48:"ES module mode is not supported in this build of compiler.",49:'"cacheHandlers" option is only supported when the "prefixIdentifiers" opti ...
22import { randomBytes } from "node:crypto";
L23: import { spawn } from "node:child_process";
L24: import { createServer } from "node:http";
L25: import { readFileSync, statSync, writeFileSync } from "node:fs";
...
L33: export const EXPIRY_SKEW = 30.0; // seconds — refresh this long before the token actually expires
L34: // One refresh attempt, response body included. Bounded well below the refresh lock"s patience\n// (refreshLock.ts WAIT_MS): a waiting process gives up rather than spend the token ...
L35: * machine"s timezone. Any failure -> 0.\n */\nfunction isoToEpoch(value) {\n try {\n if (!value) {\n return 0;\n }\n // Determine whether the str...
L36: * tenant, while SUPPA_API_KEY names the env-configured default: writing tenant
...
L41: if (host
High
Command Output Exfiltration
Source combines command execution, command-output handling, and outbound requests; review data flow before blocking.