Back to skill

Security audit

mcp-marine-weather

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to provide the promised NOAA marine-weather MCP tool, but its documented setup runs an unpinned third-party package through npx, so users should review the package source and version before installing.

Install only after pinning the npx command to a reviewed exact package version and confirming the package identity. The weather functionality itself is narrow and NOAA-focused, but the current setup gives the npm registry-selected package normal local code execution authority.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:20
Finding
Unpinned Package Download and Execution Through npx<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:20-24` **Vulnerability Type**: Unpinned third-party package execution **Risk Level**: Medium ```json { "mcpServers": { "marine-weather": { "command": "npx", "args": ["-y", "@vbotholemu/mcp-marine-weather"] } } } ``` ### Technical Analysis The recommended configuration invokes `npx` with `-y` and a package name that has no exact version constraint. Consequently, setup can download and execute the package version currently selected by the package registry rather than a specifically reviewed release. The `-y` option automatically accepts installation prompts, removing an opportunity for the user to review the package and resolved version before execution. The repository also contains no lockfile or integrity value that binds this documented installation command to the audited source code. This does not demonstrate that the current package is malicious. It creates a supply-chain exposure in which a compromised registry account, malicious future release, or package ownership change could cause code different from the audited repository to execute. ### Attack Path 1. An attacker compromises the package publisher account or otherwise gains the ability to publish a release under `@vbotholemu/mcp-marine-weather`. 2. The attacker publishes a modified package containing malicious initialization or runtime code. 3. A user follows the documented MCP configuration without specifying an exact reviewed version. 4. `npx -y` retrieves the registry-selected package release and accepts installation without confirmation. 5. The package executable starts as the configured MCP server and runs attacker-controlled code under the MCP host user's account. ### Impact Assessment Successful exploitation permits arbitrary code execution with the operating-system privileges of the user running the MCP client. Depending on that user's access, attacker code could read or modify accessible files, in ...[truncated 371 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the command to an exact reviewed release, for example: ```json { "command": "npx", "args": ["@vbotholemu/mcp-marine-weather@1.0.0"] } ``` 2. Avoid `-y` where interactive confirmation is acceptable, so unexpected installation behavior remains visible. 3. Publish and document package integrity information or provenance attestations, and verify that the registry artifact corresponds to the reviewed source. 4. Use a lockfile and reproducible build process when installing the server as part of a managed deployment. 5. Protect the publisher account with phishing-resistant multifactor authentication, restricted publishing tokens, and automated provenance. 6. Review each new release before changing the pinned version. ]]>
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (9)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
Yes, this is a mismatch. The declared description promises a functioning marine weather integration using NOAA's api.weather.gov, but the provided code chunk contains no such logic. It is essentially an empty declaration file and does not demonstrate any of the stated capabilities, resources, or behavior. Based on the supplied code alone, the actual behavior does not match the declared purpose.

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill invokes an MCP server via `npx`, which inherently enables outbound network access and may expose environment data, yet the manifest declares no `permissions` or `allowed-tools` scope. This weakens least-privilege controls and makes it harder for operators or automated policy systems to understand and constrain what the skill can do at runtime.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The setup uses `npx -y @vbotholemu/mcp-marine-weather` without pinning an exact package version. This creates a supply-chain risk because future package updates—or a compromised published version—could execute different code than the reviewed skill, including arbitrary malicious behavior at install/run time.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"author": "velocibot",
  "license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.12.1",
    "zod": "^3.23.0"
  },
  "devDependencies": {
Confidence
92% confidence
Finding
The dependency uses a caret range (^1.12.1), which allows automatic installation of newer minor/patch releases. This weakens build reproducibility and can unexpectedly introduce vulnerable or malicious upstream changes through the supply chain, especially for a network-facing MCP SDK dependency.

Unverifiable Dependency: @modelcontextprotocol/sdk has 3 known advisory(ies) (CVE-2026-25536 (@modelcontextprotocol/sdk has cross-client data leak via shared server/transport); CVE-2026-0621 (Anthropic's MCP TypeScript SDK has a ReDoS vulnerability); CVE-2025-66414 (Model Context Protocol (MCP) TypeScript SDK does not enable DNS rebinding protec)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
91% confidence
Finding
The manifest references @modelcontextprotocol/sdk with a non-exact version while known advisories exist for that package, so the actual installed version may be affected and cannot be verified from this file alone. In an MCP skill, the SDK is a core runtime component handling protocol and transport behavior, which makes known issues such as data leakage, ReDoS, or DNS rebinding more relevant than in a non-networked package.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.12.1",
    "zod": "^3.23.0"
  },
  "devDependencies": {
    "typescript": "^5.7.0",
Confidence
88% confidence
Finding
The zod dependency is specified with a caret range, so different installs may resolve to different package versions over time. While common in JavaScript projects, this creates avoidable supply-chain and reproducibility risk if an upstream release introduces a security issue or regression.

Unverifiable Dependency: zod has 1 known advisory(ies) (CVE-2023-4316 (Zod denial of service vulnerability)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
84% confidence
Finding
zod has a known DoS advisory, and because the manifest uses a version range instead of an exact version, it is not possible to confirm whether deployed installations are patched. Since this skill likely validates external NOAA-derived or user-supplied inputs, a vulnerable parser could make malformed input a denial-of-service vector, though the overall impact is limited by the simple weather-tool context.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"zod": "^3.23.0"
  },
  "devDependencies": {
    "typescript": "^5.7.0",
    "@types/node": "^22.0.0"
  }
}
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
},
  "devDependencies": {
    "typescript": "^5.7.0",
    "@types/node": "^22.0.0"
  }
}
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/index.ts:7