T08 · Insecure Dependencies
- Location
SKILL.md:15- Finding
Unpinned Third-Party Dependencies Allow Unreviewed Package Code
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent MCP-building guide with disclosed AINative API examples, but users should handle API keys and remote memory storage carefully.
Install only if you intend to build AINative-backed MCP servers. Use environment variables or a secret manager for AINATIVE_API_KEY, avoid committing .claude/mcp.json or source files containing real keys, pin dependency versions for production use, and do not store confidential prompts, credentials, or private user data in remote memory unless that is deliberate and authorized.
SKILL.md:15Unpinned Third-Party Dependencies Allow Unreviewed Package Code
SKILL.md:24Credential Examples Encourage API Keys to Be Stored in Source and Configuration Files
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.
// .claude/mcp.json
{
"mcpServers": {
"my-tools": {
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
@mcp.tool()
def search_memory(query: str, limit: int = 5) -> dict:
"""Search agent memory semantically."""
return requests.post(
f"{BASE}/api/v1/public/memory/v2/recall",
headers={"X-API-Key": API_KEY},
json={"query": query, "limit": limit}
The store_memory example transmits arbitrary content to a remote memory service, which can encourage users to persist sensitive prompts, credentials, or personal data without any cautionary guidance. In an MCP context, agents may pass rich contextual data into tools, so a write-to-remote-memory example is more dangerous than a simple lookup because it can create durable exposure.
@mcp.tool()
def store_memory(content: str, memory_type: str = "episodic") -> dict:
"""Store a fact or event in agent memory."""
return requests.post(
f"{BASE}/api/v1/public/memory/v2/remember",
headers={"X-API-Key": API_KEY},
json={"content": content, "memory_type": memory_type}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
server.setRequestHandler('tools/call', async (request) => {
if (request.params.name === 'get_credits') {
const resp = await fetch('https://api.ainative.studio/api/v1/public/credits/balance', {
headers: { 'X-API-Key': process.env.AINATIVE_API_KEY! }
});
return { content: [{ type: 'text', text: JSON.stringify(await resp.json()) }] };
The examples place a live API key directly into source/config snippets (API_KEY = "ak_your_key" and .claude/mcp.json env values) without warning about secret exposure. Users may copy this pattern into tracked files, shared repos, shell history, or screenshots, leading to credential leakage and unauthorized API use.
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
Brief description and usage examples.
Place in `.claude/skills/my-tool-name/SKILL.md`.
## Publish to npm
pip install without ==version installs the latest release, which could include malicious changes.