Back to skill

Security audit

viator-mcp

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed read-only Viator search integration, with ordinary setup risks around running an external MCP package and storing an API key.

Before installing, use a pinned reviewed package version or commit, avoid putting a real Viator API key in a shared project config, keep local config files out of source control, and run the MCP server with only the access needed for Viator lookups.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (2)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:20
Finding
Execution of Unpinned Third-Party Package and Repository Content<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 20-45 **Vulnerability Type**: Unpinned and mutable third-party dependency execution **Risk Level**: Medium ### Vulnerable Code ```json { "mcpServers": { "viator": { "command": "npx", "args": ["-y", "@chrischall/viator-mcp"], "env": { "VIATOR_API_KEY": "your-viator-partner-api-key" } } } } ``` ```bash git clone https://github.com/chrischall/viator-mcp cd viator-mcp npm install && npm run build ``` ### Technical Analysis The recommended `npx` configuration executes `@chrischall/viator-mcp` without specifying an exact version or validating an integrity hash. The `-y` option automatically approves installation, removing an opportunity for the user to review the package and resolved version before execution. The alternative source installation is also mutable: it clones the repository's current default branch rather than an audited commit or signed release, then installs dependencies and runs the package build process. Both `npm install` and the MCP server can execute package-controlled JavaScript, including npm lifecycle scripts. Consequently, code executed after the Skill was reviewed may differ from the reviewed implementation. There is no evidence in the audited file that the named package or repository is currently malicious; the vulnerability is the absence of version pinning and integrity verification. ### Attack Path 1. An attacker compromises the npm publisher account, source repository, or an upstream dependency. 2. The attacker publishes malicious package content or modifies the repository's default branch. 3. A user follows the documented setup and runs the unpinned `npx -y` command or clones and builds the current repository content. 4. The modified package executes with the permissions of the MCP host user. 5. The malicious code can read the configured `VIATOR_API_KEY` and access other files, environment variables, and network res ...[truncated 506 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin `@chrischall/viator-mcp` to an exact, reviewed version rather than resolving the latest release: ```json "args": ["@chrischall/viator-mcp@<audited-exact-version>"] ``` 2. Avoid `npx -y`; require explicit review and confirmation of the resolved package and version. 3. For source installation, check out a specific audited commit or signed release tag instead of the mutable default branch. 4. Verify release signatures, npm provenance, and package integrity hashes before execution. 5. Commit and enforce a reviewed lockfile for source builds, and use a deterministic installation command such as `npm ci`. 6. Disable or separately review npm lifecycle scripts where operationally possible. 7. Run the MCP server under a restricted account or sandbox with only the filesystem and network access required for Viator API queries. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:20
Finding
Plaintext API Key Placement in MCP Configuration<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 20-32 **Vulnerability Type**: Plaintext sensitive-data storage in project or user configuration **Risk Level**: Medium ### Vulnerable Code ```json { "mcpServers": { "viator": { "command": "npx", "args": ["-y", "@chrischall/viator-mcp"], "env": { "VIATOR_API_KEY": "your-viator-partner-api-key" } } } } ``` ### Technical Analysis The documentation directs users to add the configuration to either a project-level `.mcp.json` file or `~/.claude/mcp.json`, with the API key represented directly in the `env` object. If the placeholder is replaced with a real credential, the key is stored in plaintext. Authentication to the Viator API is necessary for the declared functionality, but embedding the secret in a project configuration file is not the least-risk mechanism. Project-level configuration is especially susceptible to accidental source-control commits, repository sharing, backups, or artifact publication. A user-level configuration may also disclose the key to other local principals if its filesystem permissions are insufficient. The audited Skill does not instruct the agent to read unrelated credential files, and no evidence shows deliberate credential exfiltration. The issue is insecure credential-storage guidance. ### Attack Path 1. A user replaces the placeholder with a valid Viator Partner API key in `.mcp.json`. 2. The project-level file is committed, shared, archived, or copied into a build artifact, or a local attacker reads an insufficiently protected user-level configuration file. 3. The unauthorized party extracts the plaintext API key. 4. The party uses the key to issue requests under the victim's Viator affiliate account until the credential is revoked or rotated. ### Impact Assessment Exposure would grant the attacker the Viator API access associated with the compromised key, including the ability to consume the account's API quo ...[truncated 312 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not place a real API key directly in a project-level `.mcp.json` file. 2. Configure the MCP process to inherit `VIATOR_API_KEY` from a protected runtime environment or retrieve it from an operating-system keychain or secret manager. 3. Add `.mcp.json` and other local secret-bearing configuration files to `.gitignore` where appropriate. 4. Provide a sanitized `.mcp.json.example` containing only placeholders. 5. Apply restrictive permissions to any local configuration that must contain sensitive values, allowing access only to the relevant user. 6. Add automated secret scanning to source-control and release workflows. 7. Document immediate revocation and rotation procedures for any key that may have been committed, shared, or otherwise exposed. ]]>
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (3)

MCP Config Access

High
Category
Agent Snooping
Content
### Option A — npx (recommended)

Add to `.mcp.json` in your project or `~/.claude/mcp.json`:

```json
{
Confidence
95% confidence
Finding
Skill accesses MCP server configuration files (mcp.json). MCP configs contain server URLs, authentication tokens, and tool definitions — reading them allows the skill to discover and potentially abuse other tool integrations.

MCP Config Access

High
Category
Agent Snooping
Content
npm install && npm run build
```

Then point `.mcp.json` at `dist/index.js` with `VIATOR_API_KEY` in `env`.

## Workflow
Confidence
90% confidence
Finding
Skill accesses MCP server configuration files (mcp.json). MCP configs contain server URLs, authentication tokens, and tool definitions — reading them allows the skill to discover and potentially abuse other tool integrations.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Response shape

Every read tool — all ten of them — takes `view: "compact" | "full"`, and
**`compact` is the default**, so the smaller payload is what you get without
asking for it. Pass `view: "full"` for Viator's untouched record.

What `compact` *does* differs by tool, because only two of them have a field
Confidence
75% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Static analysis

No suspicious patterns detected.