Why this verdict
mcp-server . Suspicious
- suspicious: finding mcp-server:.:src/tools/deploy-token.ts:10:MANIP
- suspicious: finding mcp-server:.:src/tools/deploy-token.ts:11:MANIP
- suspicious: unverified finding mcp-server:.:src/license.ts:18:EXFIL
- suspicious: unverified finding mcp-server:.:src/tools/upgrade-nudge.ts:8:MANIP
skill .claude/skills/multichain-mcp-skill No issues found
- benign: 35 checks satisfied, no findings for skill:.claude/skills/multichain-mcp-skill
Security findings 4
Data exfiltration
highUnverifiedmedium confidenceUndeclared license-validation call: the server POSTs the user-supplied license key to api.lemonsqueezy.com, a third party not mentioned in the declared purpose; it only sends the key the user configured and is plausibly honest licensing.
body: new URLSearchParams({ license_key: licenseKey })vector:code
Manipulation
highContextual risklow confidencedeploy_token embeds an opaque, unverifiable hardcoded ERC-20 bytecode blob that is returned as unsigned deploy data for the user to sign, so its on-chain behavior (e.g. who receives the supply) cannot be confirmed from the source and appears not to match the 5-argument constructor ABI used.
0x60806040523480156200001157600080fd5b50
conceal:packedvector:code
Counter-argument considered
The blob is an opaque hardcoded bytecode returned as deploy data for the user to sign, and its behaviour cannot be confirmed from source. Nothing shown refutes the concern, so it stays unrefuted.
Manipulation
highContextual risklow confidencedeploy_token embeds a large opaque hardcoded ERC-20 bytecode blob that cannot be reviewed in source; it is deployed on-chain from the user's own transaction and could hide a backdoor, though no malicious logic is shown.
0x60806040523480156200001157600080fd5b50
conceal:packedvector:code
Counter-argument considered
This is the same opaque bytecode blob as the previous finding. It cannot be reviewed in source and is deployed from the user's own transaction, so it is not refuted.
Manipulation
mediumUnverifiedlow confidenceUndeclared monetization: tool metadata is computed at runtime and locked tools return tier-upsell text with hardcoded checkout URLs on wkalidev.com into the agent context; this is not hidden and looks like a commercial upsell rather than a hijack.
https://wkalidev.com/checkout/buy/74e9f10d-3806-413c-881d-761319ee535b
vector:codevector:metadata
Open questions 4
What the analysis could not settle from the code alone.
What does resolveTier in src/license.js do with MULTICHAIN_LICENSE_KEY (e.g., validate against Lemon Squeezy, or send elsewhere)?
Data exfiltration
[file request src/tools/upgrade-nudge.ts] What does registerUpgradeNudge register? Does tool output or metadata contain instructions to the agent or conditioning of other tools?
Tool poisoning
[file request src/tools/deploy-token.ts] Does prepareDeployToken only build unsigned deployment data, or does it embed hidden behavior (fee recipient, backdoor in bytecode, signing/broadcast)?
Manipulation
[file request scripts/build-mcpb.mjs] Does the build script execute or fetch anything unexpected (network, shell exec, credential access)?
Code execution
Refuted findings 2
Candidates the review stage examined and rejected, kept for transparency.
Tool poisoning
highRefutedlow confidenceTool registration computes name and description at runtime, appending tier text, so metadata cannot be statically reviewed, though it appears to be a tier-gating upgrade nudge.
`${description} (requires ${tierLabel(requiredTier)} — you're on ${tierLabel(currentTier)})`Why it was refuted
The runtime part of the description is a fixed template that appends only tier labels. Name and description come from the server's own registration parameters, not remote or attacker-controlled content, so there is no poisoning chain.
Supply chain
mediumRefutedlow confidenceThe setup docs tell users to register the MCP server through `npx -y` with an unpinned package, so whatever version is latest on npm runs unreviewed on the host each launch; the declared install is `npm install`, so this launch method is not covered by the declaration.
"args": ["-y", "@wkalidev/multichain-mcp"]
Why it was refuted
The npx command launches the skill's own declared npm package, which is the documented way to run the server. It is openly shown in the setup docs and is not a third-party or concealed dependency.
Coverage gaps 2
Parts of the artifact the static analysis could not fully examine.
dynamic_metadata line 44: tool None description is computed: `${description} (requires ${tierLabel(requiredTier)} — you're on ${tierLabel(currentTier)})`
src/tools/upgrade-nudge.ts
request_unanswered request.0: behavior-chains.0/req-upgrade: resolved_clean: citation not shown or quote not in it