T08 · Insecure Dependencies
- Location
references/mcp-clients.md:5- Finding
Unpinned npm Package Is Downloaded and Executed Through npx
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it says, but its setup and examples create review-worthy risks around unpinned local code execution, external data processing, and proxy-based scraping guidance.
Install only if you are comfortable sending target URLs, page content, screenshots, prompts, and generated asset data to OpenGraph.io. Avoid using it on private, authenticated, regulated, or internal pages unless approved. Prefer a pinned, reviewed MCP package version or the REST examples, protect the App ID like a credential, and use proxy features only for authorized access that complies with site terms and law.
references/mcp-clients.md:5Unpinned npm Package Is Downloaded and Executed Through npx
README.md:104API Credential Can Be Exposed Through Command-Line Arguments and URL Query Strings
The README promotes scraping, screenshotting, extraction, and AI querying of webpages but does not clearly disclose that submitted URLs and page contents are sent to a third-party service. This can lead users to unknowingly transmit sensitive internal URLs, authenticated page content, or proprietary data outside their environment.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- 🌐 **Scrape content** — Fetch HTML with JavaScript rendering
- 🔍 **Extract elements** — Pull specific HTML elements (h1, p, etc.)
- 🤖 **Query pages** — Ask AI questions about any webpage
- 🎨 **Generate images** — Create diagrams, icons, social cards, QR codes
## Quick Start
The README instructs users to run npx opengraph-io-mcp without pinning a specific version, which means the latest published package will be fetched and executed at install time. If the package is compromised, typosquatted, or a malicious update is published, users could execute attacker-controlled code on their machine.
The README explicitly encourages proxy-enabled scraping of geo-restricted or bot-protected sites without warning about legal, privacy, abuse, or target-system policy implications. In a skill whose purpose is automated web interaction, this increases the chance of misuse against protected services and may expose users or operators to compliance and reputational risk.
The trigger phrases are broad natural-language patterns such as 'scrape this URL' and 'what does this page say about', which can overlap with ordinary browsing or summarization requests. In an automated agent environment, this increases the chance of unintended activation and sending user data or target URLs to the third-party service without sufficiently explicit consent.
The skill prominently encourages scraping webpages, querying page content, and generating outputs through a third-party API, but it does not explicitly warn that user-supplied URLs, page contents, prompts, and possibly sensitive internal resources may be transmitted to OpenGraph.io. In an agent setting, this omission can lead to inadvertent exfiltration of confidential data or access patterns to an external service.
This step creates a remote session by POSTing data to https://opengraph.io/image-agent/sessions, which is an external transmission to a third-party service. While expected for the product's function, it is still security-relevant because agent users may not realize prompts, session metadata, and related workflow context are leaving the local environment.
SESSION=$(curl -s -X POST "https://opengraph.io/image-agent/sessions?app_id=${OPENGRAPH_APP_ID}" \
-H "Content-Type: application/json" \
-d '{"name": "my-session"}')
SESSION_ID=$(echo $SESSION | jq -r '.sessionId')
The image generation call transmits prompt content and parameters to OpenGraph.io, which may include sensitive business information, internal URLs, or user data if an agent constructs prompts from prior conversation context. The danger is amplified in autonomous workflows because data can be forwarded externally without the user fully appreciating the transmission boundary.
curl -s -X POST "https://opengraph.io/image-agent/sessions/${SESSION_ID}/generate?app_id=${OPENGRAPH_APP_ID}" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A beautiful QR code linking to https://example.com with modern gradient design",
This premium QR marketing card example sends a rich prompt, including a destination URL and creative instructions, to the external image-generation API. If adapted to real use, such prompts can expose non-public campaigns, product names, or internal links to the provider, especially when agents auto-compose them from user context.
# Premium QR marketing card example
curl -s -X POST "https://opengraph.io/image-agent/sessions/${SESSION_ID}/generate?app_id=${OPENGRAPH_APP_ID}" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Premium marketing card with QR code for https://myapp.com, cosmic purple gradient background with floating 3D spheres, glowing accents, SCAN TO DOWNLOAD call-to-action",
The skill instructs users to run an MCP server via npx opengraph-io-mcp without pinning a specific version or integrity-verified artifact. This creates a supply-chain risk: future package updates, dependency compromise, or typosquat-style replacement could cause arbitrary code execution in the user's environment when the installer or server is launched.
This example explicitly promotes scraping through a residential proxy to avoid geo-blocking, rate limiting, and bot detection, which normalizes evasive behavior without any guardrails or warning about authorization, site terms, or legal constraints. In a skill specifically designed for web scraping and screenshot capture, such guidance materially increases the likelihood of misuse for unauthorized collection or access against third-party sites.
The scrape endpoint documentation encourages sending arbitrary target URLs and returning full rendered HTML through OpenGraph.io, but it does not warn that both the requested URL and potentially sensitive page contents are transmitted to and processed by a third-party service. In a skill explicitly designed for scraping webpages, this omission can lead users or downstream agents to exfiltrate internal, authenticated, or otherwise sensitive web content without informed consent.
The screenshot endpoint allows capture of arbitrary webpages and returns hosted screenshot URLs, but the docs omit any warning that visible page content may be transmitted to and stored by an external provider. In this skill context, screenshots of dashboards, inboxes, admin panels, or logged-in sessions could expose secrets or personal data to a third party if users assume the action is local or low-risk.
The AI query endpoint analyzes webpage contents using an AI-backed service, yet the documentation provides no privacy warning that page contents and user prompts may be processed by a third party. Because this feature invites semantic analysis of arbitrary webpages, it increases the chance that confidential or regulated content is submitted for external AI processing without the user's informed understanding.
This markdown file describes capabilities that fetch rendered HTML, capture screenshots, extract page elements, and ask AI questions about page content. Those behaviors can affect privacy or transmit page data to external services, but the document provides no user warning or disclosure about sensitive content, consent, or appropriate data handling.
The documentation instructs users to execute an npm package via npx without pinning an exact version. This allows whatever version is current on the registry at install time to be fetched and executed, creating a supply-chain risk if a malicious or compromised release is published.
The guide directs users to place OPENGRAPH_APP_ID in client configuration files but does not warn that such files may be readable by other local users, captured in backups, synced to cloud services, or accidentally committed to source control. While an app ID may be lower sensitivity than a private API secret, it is still an account credential and should be treated carefully.
This command uses npx -y opengraph-io-mcp without an exact version, which causes the client to automatically download and run the latest package release. In an MCP setup guide, this is especially risky because users are being told to trust and execute code that may later change without review.
The troubleshooting guidance again tells users to run npx opengraph-io-mcp without pinning a version. Even in troubleshooting, this encourages execution of mutable third-party code and can expose users to dependency hijacking or malicious package updates.
The manual run example OPENGRAPH_APP_ID=xxx npx opengraph-io-mcp executes an unpinned package while also handling a credential. A compromised package version could steal the supplied app ID or perform other malicious actions under the user's account.
This markdown file instructs users to use use_proxy=true and auto_proxy=true for geo-restricted, rate-limited, and paywalled sites, but it does not include any warning about privacy implications, terms-of-service concerns, or the fact that requests may be routed through proxy infrastructure. Under the markdown-specific warning rule, behavior that can affect user privacy or system/network integrity should be disclosed.
The documented default accept_lang value forces en-US,en;q=0.9, which is a locale preference baked into the skill documentation rather than chosen by the user. SQP-3 applies because this natural-language locale default is presented without opt-in or a documented regional justification.
This parameter table specifies accept_lang with an English default header value, which can bias fetched content toward English-language variants absent any user preference. That is a natural-language locale policy concern under SQP-3.
No suspicious patterns detected.