T09 · Insecure Skill Coding Practices
- Location
scripts/evaluation.py:117- Finding
Unredacted MCP Tool Results Are Transmitted to an External Model API
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a legitimate MCP-server building guide, but its evaluator and examples can expose sensitive MCP data or unauthenticated tool endpoints without enough built-in safeguards.
Install only if you will run it in a controlled development environment. Do not evaluate production-connected MCP servers unless you are comfortable sending tool outputs to Anthropic, and harden any generated HTTP MCP server with authentication, loopback or TLS-safe binding, origin/host checks, rate limits, and least-privilege upstream credentials.
scripts/evaluation.py:117Unredacted MCP Tool Results Are Transmitted to an External Model API
reference/node_mcp_server.md:727Copyable Streamable HTTP Server Exposes MCP Tools Without Authentication
reference/python_mcp_server.md:539Document Resource Example Allows Filesystem Path Traversal
scripts/requirements.txt:1Open-Ended Dependency Constraints Permit Unreviewed Package Updates
The declared description says this skill is a guide for creating MCP servers—documentation/tutorial content for building integrations. The supplied code does not provide guidance or server-building utilities. Instead, it implements an automated evaluation framework for existing MCP servers. Its primary purpose is materially different: testing and benchmarking MCP servers via Claude-driven tool use, with support for transports, headers/env vars, XML task parsing, scoring, and report generation. These are substantial functional capabilities not reflected in the declared purpose, so this is a clear mismatch.
Referenced artifact was not completely inspected
- [⚡ TypeScript Guide](./reference/node_mcp_server.md) - TypeScript patterns and examples
Referenced artifact was not completely inspected
- [⚡ TypeScript Guide](./reference/node_mcp_server.md) - TypeScript patterns and examples
Referenced artifact was not completely inspected
- [⚡ TypeScript Guide](./reference/node_mcp_server.md) - TypeScript patterns and examples
Skill selects an external model or provider that may use a different account or billing plan than the operator expects. Undisclosed model switches can cause unexpected cost or quota consumption.
optional arguments:
-h, --help Show help message
-t, --transport Transport type: stdio, sse, or http (default: stdio)
-m, --model Claude model to use (default: claude-3-7-sonnet-20250219)
-o, --output Output file for report (default: print to stdout)
stdio options:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
**OAuth 2.1**:
- Use secure OAuth 2.1 with certificates from recognized authorities
- Validate access tokens before processing requests
- Only accept tokens specifically intended for your server
**API Keys**:
The skill instructs the agent to perform actions that imply MCP access and file creation/writing, but it does not declare any explicit tool scope such as permissions or allowed-tools. That creates an under-specified trust boundary: a host may grant broader tools than the author intended, enabling the skill to drive sensitive capabilities during execution.
Using npx @modelcontextprotocol/inspector without pinning a version causes execution of whatever package version is current at run time. This introduces a supply-chain risk: a compromised upstream release or breaking update could execute unexpected code or alter testing behavior when users follow the guide.
Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.
After understanding the API and tools, USE the MCP server tools:
- Inspect content using READ-ONLY and NON-DESTRUCTIVE operations ONLY
- Goal: identify specific content (e.g., users, channels, messages, projects, tasks) for creating realistic questions
- Should NOT call any tools that modify state
- Will NOT read the code of the MCP server implementation itself
- Parallelize this step with individual sub-agents pursuing independent explorations
- Ensure each subagent is only performing READ-ONLY, NON-DESTRUCTIVE, and IDEMPOTENT operations
The guide presents a streamable HTTP MCP server example that accepts requests on /mcp without any authentication, authorization, or explicit warning that the endpoint is exposed. In the context of an MCP server builder skill, this is dangerous because developers may copy the example verbatim and deploy remote tool execution endpoints that arbitrary clients can invoke.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
mcp = FastMCP("example_mcp")
# Constants
API_BASE_URL = "https://api.example.com/v1"
# Enums
class ResponseFormat(str, Enum):
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
mcp = FastMCP("example_mcp")
# Constants
API_BASE_URL = "https://api.example.com/v1"
# Enums
class ResponseFormat(str, Enum):
The evaluation prompt explicitly instructs the model to disclose the inputs and outputs of every tool invocation in its
This is a true data-exposure issue: the system prompt requires the model to reveal full tool inputs and outputs, and the harness then extracts and stores those summaries/feedback in the final report. If the evaluated MCP server accesses external services, the tool I/O may include API keys, authentication headers, customer records, proprietary content, or other confidential material, turning routine evaluation into an exfiltration channel. The skill context increases the danger because this code is specifically meant to test MCP servers that bridge LLMs to external systems, where sensitive data exposure is a realistic and common failure mode.
The document explicitly instructs readers to avoid any and use proper types or unknown, but earlier example code uses makeApiRequest<any> and user: any, and later the shared utility signature uses data?: any and params?: any. This is an active contradiction between the guide's stated intent and its demonstrated implementation patterns, not merely an omission.
The guide includes a resource example that reads a local file path derived from user-controlled input (name) without any warning or safeguards. In an MCP server-building guide, this can normalize unsafe patterns and lead implementers to create path traversal or unintended local file disclosure primitives.
The dependency is specified with a lower bound only (anthropic>=0.39.0), which permits installation of any newer release and makes builds non-reproducible. This increases supply-chain risk and makes it harder to ensure deployment avoids vulnerable or breaking versions, especially relevant for an MCP-building skill that may be reused to create networked integrations.
anthropic>=0.39.0
mcp>=1.1.0
The manifest references anthropic without pinning a specific release, and the package has known advisories. That means consumers may install an affected version without realizing it, and since this package can interact with local files and external APIs, vulnerable versions may expose filesystem or sandbox-related risk depending on usage.
The dependency mcp>=1.1.0 is unpinned, so installations may resolve to different versions over time, including versions with security regressions or incompatible behavior. Because this skill is specifically for building MCP servers that expose external-service tooling, dependency uncertainty is more concerning than in a purely local utility.
anthropic>=0.39.0
mcp>=1.1.0
The mcp package has multiple known advisories, but the requirements file does not constrain it to a safe version. In the context of a skill for building MCP servers, this is more dangerous because vulnerable SDK behavior could directly affect exposed tools, request handling, or server-side protections such as validation and network safety controls.