Trust Assessment
plan2meal received a trust score of 81/100, placing it in the Mostly Trusted category. This skill has passed most security checks with only minor considerations noted.
SkillShield's automated analysis identified 6 findings: 0 critical, 0 high, 3 medium, and 2 low severity. Key findings include Missing required field: name, Unpinned npm dependency version, Skill provides SSRF vector to backend via user-provided URLs.
The analysis covered 4 layers: Manifest Analysis, Static Code Analysis, Dependency Graph, LLM Behavioral Safety. All layers scored 70 or above, reflecting consistent security practices.
Last analyzed on February 13, 2026 (commit 13146e6a). SkillShield performs automated 4-layer security analysis on AI skills and MCP servers.
Layer Breakdown
Behavioral Risk Signals
Security Findings6
| Severity | Finding | Layer | Location | |
|---|---|---|---|---|
| MEDIUM | Missing required field: name The 'name' field is required for claude_code skills but is missing from frontmatter. Add a 'name' field to the SKILL.md frontmatter. | Static | skills/okikesolutions/plan2meal/SKILL.md:1 | |
| MEDIUM | Unpinned npm dependency version Dependency '@types/node' is not pinned to an exact version ('^25.0.8'). Pin dependencies to exact versions to reduce drift and supply-chain risk. | Dependencies | skills/okikesolutions/plan2meal/package.json | |
| MEDIUM | Skill provides SSRF vector to backend via user-provided URLs The skill allows users to provide arbitrary URLs (e.g., `plan2meal add <url>`) which are then sent to the configured backend API (`/api/recipes/scrape`). If the backend is vulnerable to Server-Side Request Forgery (SSRF), an attacker could use this functionality to make the backend fetch internal network resources or other sensitive data. The skill itself acts as a proxy, enabling this potential attack. Implement robust URL validation and sanitization on the backend to prevent SSRF. Consider whitelisting allowed domains or protocols for recipe scraping. | LLM | dist/commands.js:40 | |
| LOW | Session tokens stored in-memory, potential for exfiltration in compromised environments The skill stores user session tokens and refresh tokens in an in-memory `Map` (`sessionStore`). While this is a common pattern for managing state in skills, if the underlying LLM execution environment is compromised or allows for memory inspection, these tokens could be exfiltrated. The `SKILL.md` also notes that users manually copy tokens, which introduces another risk if the channel is insecure. Ensure the skill execution environment provides strong memory isolation. Implement short-lived session tokens and aggressive token rotation. Consider encrypting tokens even in memory if the environment allows. | LLM | dist/index.js:21 | |
| LOW | Unused GitHub OAuth implementation present in distribution The `dist/github-oauth.js` file contains a full implementation of a GitHub OAuth device flow, including a constructor that takes a `clientId`. This code is not used by the skill's main entry point (`dist/index.js`), which instead uses `dist/device-auth.js` for a backend-proxied authentication flow. The presence of unused code, especially authentication-related code, can be a supply chain risk. It could be accidentally activated, contain vulnerabilities, or expose sensitive information if it were intended for a different, less secure, deployment. The `SKILL.md` explicitly states "No GitHub Client ID required - all OAuth is handled by the backend," which contradicts the functionality of this unused file. Remove unused code from the skill package to reduce attack surface and avoid confusion. | LLM | dist/github-oauth.js:5 | |
| INFO | Hardcoded API URL contradicts documentation claim of privacy The `SKILL.md` documentation states, "Convex URL is never exposed to users or the skill." However, the skill's `dist/index.js` (and `src/index.ts`) explicitly hardcodes `https://gallant-bass-875.convex.site` as a fallback for the `PLAN2MEAL_API_URL` environment variable. While this specific URL is likely a public API endpoint and not inherently secret, the direct contradiction in the documentation is misleading. If this URL were intended to be private or sensitive, its hardcoding would constitute a data exfiltration. Update documentation to accurately reflect that the API URL is known to the skill, or remove the hardcoded fallback if the URL is truly meant to be private and always provided via environment variables. | LLM | dist/index.js:15 |
Scan History
Embed Code
[](https://skillshield.io/report/25dbe064d935c72c)
Powered by SkillShield