Back to skill

Security audit

mcp-company-search

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to do the advertised company-search task, but its install instructions are inconsistent and execute an unpinned npm package, so users should review it carefully before installing.

Install only after confirming the intended npm package owner and pinning a reviewed version. Treat company names and jurisdictions you search as data sent to Nautdev's API, expect possible L402 metered charges, and run the MCP server with restricted filesystem, environment, and network access where practical.

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
README.md:15
Finding
Unpinned and Inconsistently Named npm Package Is Automatically Downloaded and Executed## Vulnerability Details **File Location**: `README.md:15-24`; `SKILL.md:20-30` **Vulnerability Type**: Insecure package execution and supply-chain ambiguity **Risk Level**: Medium ### Vulnerable Code `README.md:15-24`: ```json { "mcpServers": { "company-search": { "command": "npx", "args": ["-y", "@blue-trianon/mcp-company-search"], "env": { "NAUTDEV_BASE_URL": "https://api.nautdev.com" } } } } ``` `SKILL.md:20-30`: ```json { "mcpServers": { "company-search": { "command": "npx", "args": ["-y", "@vbotholemu/mcp-company-search"], "env": { "L402_API_BASE_URL": "https://api.nautdev.com" } } } } ``` The package manifest identifies the project as `@vbotholemu/mcp-company-search`, while the README instructs users to execute `@blue-trianon/mcp-company-search`. Neither command pins a package version or integrity digest. ### Technical Analysis `npx -y` automatically downloads and executes the package selected by the npm registry without asking the user for confirmation. Because no version is specified, npm resolves the current distribution tag, normally `latest`, each time the command is installed or executed in a fresh environment. The conflicting package scopes create ambiguity about which publisher and package are authoritative: - `package.json` and `SKILL.md` identify `@vbotholemu/mcp-company-search`. - `README.md` directs users to `@blue-trianon/mcp-company-search`. Consequently, reviewed source code in this repository does not reliably identify the code that users will execute. If either referenced package is compromised, transferred, incorrectly published, or controlled by an unintended publisher, a future package version can run arbitrary JavaScript under the invoking user's account. npm lifecycle scripts may also execute during installation, before the MCP entry point itself starts. Th ...[truncated 1769 chars]
Remediation
## Remediation Suggestions 1. Establish one canonical npm package name and use it consistently in `package.json`, `README.md`, and `SKILL.md`. 2. Verify ownership of the canonical npm scope and enable multi-factor authentication and provenance-backed publishing for maintainers. 3. Pin the documented package to a reviewed immutable version, for example: ```json { "command": "npx", "args": ["-y", "@vbotholemu/mcp-company-search@1.0.0"] } ``` 4. Prefer a controlled installation step using a lockfile and integrity-verified artifacts rather than downloading executable code automatically whenever the MCP server starts. 5. Publish checksums, npm provenance attestations, or signed release metadata so users can verify that the installed artifact corresponds to the reviewed source. 6. Add CI checks that reject inconsistent package names across documentation and metadata. 7. Review package lifecycle scripts and transitive dependencies before each release, and use exact or tightly controlled dependency versions where practical. 8. Run the MCP server under a restricted account or sandbox with minimal filesystem access, a filtered environment, and limited outbound network permissions.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description promises a concrete business-search capability using an external API, but the provided code chunk is effectively empty and does not implement any of that behavior. Because the actual code shows no relevant functionality at all, the description does not accurately represent the supplied code.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The README states that the tool searches corporate registries via the L402 API and mentions pricing later, but it does not clearly warn users up front that their search terms will be transmitted to a third-party service and may trigger metered charges. In a due-diligence/compliance context, company names and search targets can be sensitive business intelligence, so lack of explicit disclosure can lead to unintended data exposure and unexpected billing.

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill declares environment and network capabilities but does not constrain tool scope with explicit permissions or allowed-tools. This weakens least-privilege controls and can let the skill invoke broader functionality than users expect, especially when combined with an externally fetched MCP package.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The skill runs an npm package through npx without pinning an exact immutable version, which creates a supply-chain risk. A later package update, account compromise, or dependency hijack could cause arbitrary code to be executed on the user's machine when the skill is installed or run.

Missing User Warnings

Low
Confidence
89% confidence
Finding
The code makes HTTP requests to an external API and includes user-supplied company search parameters in those requests. While this is central to the tool's purpose, there is no confirmation prompt or explicit user-facing disclosure in the code path that search terms are sent to a remote service.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"author": "Blue-Trianon-Ventures",
  "license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.12.1",
    "zod": "^3.23.0"
  },
  "devDependencies": {
Confidence
95% confidence
Finding
The dependency uses a caret range instead of an exact pinned version, which allows different installs over time to resolve to newer releases. This weakens build reproducibility and can unintentionally pull in a vulnerable or breaking version through the normal package resolution process.

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
92% confidence
Finding
The manifest allows a floating @modelcontextprotocol/sdk version while known advisories exist for some releases, so consumers may install an affected version without realizing it. This is more concerning here because the skill is an MCP-integrated networked tool, making SDK flaws such as cross-client data leakage, ReDoS, or missing DNS rebinding protections more relevant to real deployment risk.

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
95% confidence
Finding
Using a non-exact semver range for zod means installs are not fully reproducible and may fetch newer versions than originally tested. In supply-chain terms, that increases exposure to accidental vulnerable upgrades or malicious package compromise within the allowed range.

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
Because zod is not pinned, installations may resolve to a version affected by the known Zod DoS advisory. If schema validation is performed on attacker-controlled input, a vulnerable parser could be abused for resource exhaustion, though the manifest alone does not prove exploitability.

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
dist/index.js:7

Environment variable access combined with network send.

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