Back to skill

Security audit

composio-mcp

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly purpose-aligned, but its setup helper can persistently add Composio access to multiple agent clients and copy a plaintext consumer key into their configs.

Before installing, decide which single agent client should receive Composio MCP access, use dry-run first, prefer an environment or secret-store reference over pasting a literal ck_* key into config files, and avoid using skip-checks, raw proxy, or composio run unless you explicitly need them for the task.

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 (6)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/setup_composio_mcp.sh:36
Finding
Consumer Key Exposed Through Visible Input and Child Process Arguments<![CDATA[ ## Vulnerability Details **File Location**: `scripts/setup_composio_mcp.sh:36-39` and `scripts/setup_composio_mcp.sh:91` **Vulnerability Type**: Local credential disclosure **Risk Level**: Medium ### Vulnerable Code ```bash if [ "$REMOVE" -eq 0 ] && [ -z "$KEY" ]; then printf 'Enter your Composio consumer key (ck_...): ' read -r KEY [ -n "$KEY" ] || { echo "No key provided. Aborting." >&2; exit 1; } fi ``` The key is subsequently passed to Python as a command-line argument: ```bash python3 - "$path" "$jsonpath" "$url_field" "$format" "$KEY" "$REMOVE" <<'PY' ``` ### Technical Analysis The interactive prompt uses `read -r` without silent mode, so the consumer key is displayed while the user types it. The key is then placed in the argument vector of a child Python process. On systems where process arguments are visible to other local users, monitoring agents, audit systems, or diagnostic tooling, the complete reusable `ck_*` credential may be captured. Passing a secret through an argument vector is less secure than transmitting it through a protected file descriptor or standard input. The behavior is not necessary for the Skill's declared functionality. Configuration can be generated without exposing the secret through visible terminal input or child-process arguments. ### Attack Path 1. A user runs the setup helper and enters a Composio consumer key. 2. An observer captures the visible terminal input, terminal recording, or Python process argument vector. 3. The observer extracts the `ck_*` value. 4. The observer sends authenticated requests to `https://connect.composio.dev/mcp`. 5. The observer gains access to MCP capabilities available to that consumer key and any linked accounts. ### Impact Assessment Successful exploitation discloses a reusable Composio consumer credential. The resulting scope depends on the Composio project, connected toolkits, and linked accounts. It may permit reading external account data or invoking actions suc ...[truncated 80 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Read interactive secrets without terminal echo: ```bash printf 'Enter your Composio consumer key (ck_...): ' IFS= read -rs KEY printf '\n' ``` 2. Do not place the key in the Python argument vector. Pass it through standard input or a dedicated inherited file descriptor. 3. Avoid exporting the key into a broadly inherited environment when a narrower channel is available. 4. Clear the shell variable after configuration: ```bash unset KEY ``` 5. Prefer writing a supported environment-variable reference into MCP configurations instead of copying the literal key. 6. Document that users should use an OS secret manager or a permission-restricted environment file. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/verify_composio.sh:27
Finding
Consumer Key Exposed in Curl Process Arguments During Verification<![CDATA[ ## Vulnerability Details **File Location**: `scripts/verify_composio.sh:27-36` **Vulnerability Type**: Secret-bearing command-line argument **Risk Level**: Medium ### Vulnerable Code ```bash CK="${COMPOSIO_CONSUMER_KEY:-}" if [ -z "$CK" ]; then echo "✗ COMPOSIO_CONSUMER_KEY not set. Get ck_* from dashboard → Connect Settings → Sessions & API Key" else echo " consumer key prefix: ${CK:0:5}…" resp=$(curl -sS --max-time 15 -X POST "https://connect.composio.dev/mcp" \ -H "Content-Type: application/json" \ -H "x-consumer-api-key: $CK" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"verify","version":"1.0"}}}' 2>&1 || true) ``` ### Technical Analysis Although the destination is the declared Composio HTTPS endpoint, the complete consumer key is interpolated into a curl command-line header. This makes the credential part of curl's process argument vector for the duration of the request. The network transmission itself is required to authenticate the verification request. Exposing the key through local process metadata is not required. ### Attack Path 1. A user runs `verify_composio.sh` with `COMPOSIO_CONSUMER_KEY` set. 2. A same-host user, process monitor, audit collector, or diagnostic tool records the curl argument vector. 3. The observer extracts the `x-consumer-api-key` header value. 4. The observer reuses the key against the Composio MCP endpoint. 5. The observer invokes capabilities authorized for the affected consumer key. ### Impact Assessment The issue may compromise the MCP consumer credential. Potential impact includes unauthorized MCP tool discovery and execution against linked external services. The precise privileges depend on project policy, connected accounts, and whether an additional project API key is required. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Avoid interpolating secrets directly into curl arguments. 2. Supply the sensitive header through a permission-restricted temporary curl configuration, anonymous file descriptor, or equivalent mechanism that does not reveal it in process arguments. 3. If a temporary file is necessary: - Create it with `umask 077`. - Use `mktemp`. - Install an `EXIT` trap to remove it. - Never print its contents. 4. Unset `CK` immediately after the request. 5. Ensure debug modes such as shell tracing cannot print credentials. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/setup_composio_mcp.sh:113
Finding
Setup Helper Duplicates a Plaintext Consumer Key Across All Detected Client Configurations<![CDATA[ ## Vulnerability Details **File Location**: `scripts/setup_composio_mcp.sh:113-132` **Vulnerability Type**: Plaintext credential storage and excessive configuration scope **Risk Level**: Medium ### Vulnerable Code ```python if remove: parent.pop(last, None) else: if fmt == "opencode": parent[last] = { "type": "remote", "url": "https://connect.composio.dev/mcp", "headers": {"x-consumer-api-key": key}, "enabled": True } elif fmt == "serverUrl": parent[last] = { "serverUrl": "https://connect.composio.dev/mcp", "headers": {"x-consumer-api-key": key} } else: # standard parent[last] = { "type": "http", "url": "https://connect.composio.dev/mcp", "headers": {"x-consumer-api-key": key} } ``` The main loop patches every detected configuration unless the user explicitly selects a platform: ```bash for p in "${PLATFORMS[@]}"; do IFS='|' read -r label path jsonpath url_field format <<< "$p" if [ -f "$path" ]; then patch_json "$label" "$path" "$jsonpath" "$url_field" "$format" found=1 fi done ``` ### Technical Analysis The helper stores the raw consumer key in each detected MCP client configuration. It does not validate that the target file has restrictive permissions and does not use the environment-substitution mechanism recommended elsewhere in the Skill. By default, the helper scans and modifies all recognized configurations. This duplicates the credential across unrelated clients even when only one client is needed. The expanded storage footprint exceeds minimum privilege and increases the chance that the key will be exposed through backups, configuration synchronization, support bundles, permissive file modes, or accidental commits. ### Attack Path 1. A user runs the helper without `--platform`. 2. The helper discovers several client configuration files. 3. The same p ...[truncated 741 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require an explicit platform rather than patching every detected client by default. 2. Present the detected clients and request confirmation before modifying more than one. 3. Write environment-variable references instead of literal keys where the client supports substitution. 4. Validate target ownership and permissions before modification. 5. Reject symlinks or unexpected file types to reduce unsafe configuration writes. 6. Apply restrictive permissions such as owner read/write only where compatible. 7. Create a permission-restricted backup and use atomic replacement to avoid corruption. 8. Warn users if a project-scoped configuration may be committed to source control. 9. Avoid placing project API keys and consumer keys together in plaintext configurations. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:91
Finding
Documentation Encourages Supplying Reusable Secrets Through Command Lines and Shell Profiles<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:91-103` **Additional Locations**: `references/mcp-config.md:46-47`, `references/mcp-config.md:106-107`, `references/mcp-config.md:191-192`, `references/mcp-config.md:233-243` **Vulnerability Type**: Unsafe credential-handling guidance **Risk Level**: Medium ### Vulnerable Code ```bash # Interactive (opens browser, polls for completion) composio login # Headless / CI: pass the key directly composio login --user-api-key ak_your_key_here --yes # No-browser flow: prints a URL + session key, you complete in any browser composio login --no-browser --no-wait # then later: composio login --key <session-key> ``` The MCP reference also presents literal command-line headers and plaintext shell-profile storage: ```bash openclaw mcp add composio --transport streamable-http --url https://connect.composio.dev/mcp \ --header "x-consumer-api-key: ck_your_consumer_key" ``` ```bash # ~/.bashrc or ~/.zshrc export COMPOSIO_CONSUMER_KEY="ck_your_consumer_key" ``` ### Technical Analysis Users are instructed to replace credential placeholders directly in command lines. Depending on the shell and host controls, those commands may be retained in shell history, process accounting, terminal transcripts, CI logs, or process-monitoring systems. Using an environment-variable reference in client JSON reduces accidental configuration commits, but storing the literal key in a shell profile still leaves it as long-lived plaintext. Shell profiles may also be readable by backup agents, support tooling, plugins, or other processes running as the same user. ### Attack Path 1. A user follows the documented command and substitutes a real `ak_*`, `ck_*`, or login session key. 2. The command is retained in shell history, CI logs, process accounting, or a terminal transcript; alternatively, the key remains in a plaintext shell profile. 3. An attacker or lower-trust local process reads the retained material. 4. The attacker reu ...[truncated 411 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Make interactive browser login or hidden secret input the primary authentication method. 2. Do not instruct users to place literal keys in command lines. 3. Provide examples using secret-manager integration, protected file descriptors, or masked CI secret variables. 4. Warn explicitly that command-line arguments may appear in history and process listings. 5. If shell-based environment loading is unavoidable: - Use a separate permission-restricted file. - Set permissions to owner-only. - Keep the file outside repositories. - Source it only in the required execution context. 6. Prefer client-native secret stores over plaintext MCP headers. 7. Advise immediate key rotation after suspected logging or history exposure. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
references/troubleshooting.md:37
Finding
Troubleshooting Guidance Prints the Complete Pending Login Session<![CDATA[ ## Vulnerability Details **File Location**: `references/troubleshooting.md:37-44` **Vulnerability Type**: Authentication session disclosure **Risk Level**: Low ### Vulnerable Code ```bash ## Pending login session If a `--no-browser --no-wait` login was started but never completed, the session lingers: ```bash cat ~/.composio/pending-login-session.json # inspect composio login --poll # resume polling up to 10 min rm ~/.composio/pending-login-session.json # or abandon ``` ``` ### Technical Analysis The guidance prints the entire pending-login session file to standard output. That file represents an in-flight no-browser authentication session and may contain session identifiers, authorization metadata, or other values that should not be copied into terminal logs or AI-agent transcripts. Displaying the complete file is unnecessary for troubleshooting. Only non-sensitive status fields should be inspected. ### Attack Path 1. A no-browser login creates `~/.composio/pending-login-session.json`. 2. The user follows the troubleshooting instruction and prints the complete file. 3. Terminal recording, support tooling, an AI transcript, or another observer captures the output. 4. An attacker extracts usable pending-session data before it expires. 5. The attacker attempts to interfere with or reuse the authentication session. ### Impact Assessment The likely scope is limited to the lifetime and authority of the pending login session. Depending on the file contents and server-side session protections, exposure could enable authentication-session misuse or reveal account and organization metadata. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not print the complete pending-session file. 2. Provide a redacting inspection command that outputs only non-sensitive status and expiration fields. 3. Explicitly exclude session keys, tokens, authorization codes, and secret-bearing URLs. 4. Warn users not to paste pending-login files into support tickets or agent conversations. 5. Ensure the file is created with owner-only permissions. 6. Recommend deleting abandoned sessions promptly and rotating credentials if session material was disclosed. ]]>

T08 · Insecure Dependencies

Note
Location
SKILL.md:70
Finding
Global Package Installation Is Not Protected by Lockfile or Artifact Integrity Verification<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:70-82` **Vulnerability Type**: Third-party package supply-chain exposure **Risk Level**: Low ### Vulnerable Code ```bash ## A.1 Install Pin the package versions before installing. Replace `<VERSION>` with the latest stable from `npm view @composio/cli version` or the version required by the project. ```bash # Option 1: npm (recommended) — pinned versions npm install -g composio-core@<VERSION> @composio/cli@<VERSION> # Option 2: let Composio auto-install for your agent host # Ask the user before auto-installing; prefer --dry-run first if available. composio setup --target auto --yes --dry-run || composio setup --target auto --yes ``` ``` ### Technical Analysis The instructions improve reproducibility by requiring an explicit version, but they do not use a lockfile, package integrity digest, signature, or other artifact verification. The suggested version is obtained dynamically from the package registry. A global npm installation expands the impact of package lifecycle scripts beyond the project directory. If the selected package version, package publisher account, registry response, or transitive dependency is compromised, installation may execute attacker-controlled lifecycle code with the privileges of the installing user. No evidence indicates that the named packages are currently malicious. The confirmed weakness is the absence of strong artifact-integrity controls around a global installation path. ### Attack Path 1. An attacker compromises the registry package, publisher account, selected version, or a transitive dependency. 2. A user retrieves the reported version and runs the documented global installation. 3. npm downloads and processes the compromised package. 4. A lifecycle script or installed executable runs attacker-controlled code. 5. The code gains the installing user's privileges and access to that user's files, credentials, and agent configurations. ### Impact Assessment ...[truncated 357 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Publish and document known-good exact versions rather than directing users to select the current registry version at execution time. 2. Provide verified package integrity hashes or signed release provenance. 3. Prefer a project-local, isolated installation over global installation. 4. Use a lockfile for transitive dependency resolution where possible. 5. Verify package ownership, release signatures, and registry provenance before installation. 6. Disable lifecycle scripts where the package supports installation without them. 7. Test installation in a sandbox or disposable environment before deployment to credential-bearing agent hosts. 8. Retain the existing requirement for user confirmation before automatic setup. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (59)

Tool Parameter Abuse

High
Category
Tool Misuse
Content
| `--parallel` / `-p` | Execute multiple independent tool calls in the same invocation |
| `--skip-connection-check` | Skip the connected-account check |
| `--skip-tool-params-check` | Skip input validation against cached schema |
| `--skip-checks` | Skip both checks above |

### `composio run` — scripting without SDK
Confidence
83% confidence
Finding
Documenting --skip-checks, --skip-connection-check, and --skip-tool-params-check exposes a path to bypass validation safeguards when invoking external actions. In a skill meant for agent use, normalizing these flags can lead to unsafe execution with malformed parameters or against unintended accounts, especially because many tools have side effects.

MCP Config Access

High
Category
Agent Snooping
Content
|----------|-------------|----------|-----------|--------|
| Claude Code | `~/.claude.json` | `mcpServers` | `url` | `type: "http"` |
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | — |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | — |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `devin mcp add` CLI |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | `type: "remote"`, `environment` not `env` |
Confidence
91% confidence
Finding
The skill includes exact MCP config file targets for multiple clients and later recommends an automated script to patch them. Persistent modification of MCP config can silently add a remote server that gains future tool-call opportunities, making this more dangerous than ordinary documentation about file paths.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Code | `~/.claude.json` | `mcpServers` | `url` | `type: "http"` |
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | — |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | — |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `devin mcp add` CLI |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | `type: "remote"`, `environment` not `env` |
| Antigravity IDE/CLI | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! Clear cache on uninstall |
Confidence
91% confidence
Finding
This line identifies another client MCP config path in the same multi-platform patching table. In context, the risk is not the path string itself but that the skill operationalizes edits to persistent trust configuration across developer tools, which can broaden future agent access.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | — |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | — |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `devin mcp add` CLI |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | `type: "remote"`, `environment` not `env` |
| Antigravity IDE/CLI | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! Clear cache on uninstall |
| OpenClaw | OpenClaw config | **`mcp.servers`** | `url` | `transport: "streamable-http"`, `openclaw mcp add` CLI |
Confidence
91% confidence
Finding
The documented Devin Desktop configuration path is part of a set of persistent MCP configuration targets. Because the skill is designed to patch these files to activate a remote MCP endpoint, it can modify long-lived agent behavior and expand tool connectivity beyond the immediate task.

Agent Config Directory Access

High
Category
Agent Snooping
Content
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `devin mcp add` CLI |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | `type: "remote"`, `environment` not `env` |
| Antigravity IDE/CLI | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! Clear cache on uninstall |
| OpenClaw | OpenClaw config | **`mcp.servers`** | `url` | `transport: "streamable-http"`, `openclaw mcp add` CLI |

> **Top 3 silent-failure traps:**
Confidence
90% confidence
Finding
Referencing agent configuration directories is not harmful by itself, but in this skill context it is coupled to instructions and scripts that modify those directories to install MCP server definitions. Writing into agent config locations can change tool availability and trust settings, which is security-sensitive because it persists beyond the current session.

MCP Config Access

High
Category
Agent Snooping
Content
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `devin mcp add` CLI |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | `type: "remote"`, `environment` not `env` |
| Antigravity IDE/CLI | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | NOT `url`! Clear cache on uninstall |
| OpenClaw | OpenClaw config | **`mcp.servers`** | `url` | `transport: "streamable-http"`, `openclaw mcp add` CLI |

> **Top 3 silent-failure traps:**
Confidence
91% confidence
Finding
The Antigravity MCP config path is another persistent agent trust location referenced in support of automated modification. In context, adding remote MCP server definitions here can enable future external tool use and should be treated as a high-sensitivity configuration change.

Ae1

High
Category
analysis-evasion
Content
See **`references/mcp-config.md`** for the exact JSON block per platform.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
See **`references/mcp-config.md`** for the exact JSON block per platform.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Tool Parameter Abuse

High
Category
Tool Misuse
Content
| MCP `Authorization required: No Authorization header` | No header at all | Add `x-consumer-api-key` header to the MCP config |
| `composio login` hangs on headless box | Browser flow needs a display | Use `--no-browser --no-wait` then `--key <session>` or `--user-api-key ak_...` |
| Tools appear but execute returns 401 | `require_mcp_api_key` enabled, no `x-api-key` | Add `x-api-key: ak_*` header alongside `x-consumer-api-key` |
| `composio search` returns no results | Cache stale or org not set | `rm -rf ~/.composio/toolkits.json` then retry |

---
Confidence
85% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
| MCP `Authorization required: No Authorization header` | No header at all | Add `x-consumer-api-key` header to the MCP config |
| `composio login` hangs on headless box | Browser flow needs a display | Use `--no-browser --no-wait` then `--key <session>` or `--user-api-key ak_...` |
| Tools appear but execute returns 401 | `require_mcp_api_key` enabled, no `x-api-key` | Add `x-api-key: ak_*` header alongside `x-consumer-api-key` |
| `composio search` returns no results | Cache stale or org not set | `rm -rf ~/.composio/toolkits.json` then retry |

---
Confidence
90% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Ae1

High
Category
analysis-evasion
Content
- **`scripts/setup_composio_mcp.sh`** — Detects all installed platforms and patches each with the correct format (handles serverUrl/url, mcp/mcpServers, environ
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Tool Parameter Abuse

High
Category
Tool Misuse
Content
- `-p, --parallel`: run independent calls concurrently
- `--skip-connection-check`: skip the connected-account check
- `--skip-tool-params-check`: skip input validation against cached schema
- `--skip-checks`: bypass both checks above

**Flow:** `search` → `execute` (with `link` when the toolkit is not connected).
Confidence
95% confidence
Finding
Documenting `--skip-checks` exposes an easy path to bypass connection and parameter validation, removing safety barriers that help prevent malformed, unauthorized, or unintended tool invocations. In an agent-operated context, especially one meant for setup help, this is dangerous because it normalizes disabling safeguards to make commands 'work' under failure conditions.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
`composio run` enables arbitrary inline TS/JS execution with injected helpers that can call external tools and sub-agents, greatly expanding what an agent can do from a troubleshooting skill. In this context, that creates an execution primitive that can be repurposed for unauthorized actions, data access, or chained abuse far beyond setup assistance.

MCP Config Access

High
Category
Agent Snooping
Content
|----------|-------------|----------|------------------|---------------|-----------|------------------|
| Claude Code | `~/.claude.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "http"` / `"stdio"` |
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
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.

MCP Config Access

High
Category
Agent Snooping
Content
|----------|-------------|----------|------------------|---------------|-----------|------------------|
| Claude Code | `~/.claude.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "http"` / `"stdio"` |
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
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.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Code | `~/.claude.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "http"` / `"stdio"` |
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
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.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Code | `~/.claude.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "http"` / `"stdio"` |
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
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.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| Antigravity CLI (agy) | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
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.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| Antigravity CLI (agy) | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
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.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| Antigravity CLI (agy) | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
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.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| Antigravity CLI (agy) | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
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.

MCP Config Access

High
Category
Agent Snooping
Content
| Claude Desktop | `claude_desktop_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | — (inferred) |
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | `url` | `command` + `args` | `env` | `type: "stdio"` required for stdio |
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| Antigravity CLI (agy) | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
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.

Agent Config Directory Access

High
Category
Agent Snooping
Content
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| Antigravity CLI (agy) | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenClaw | OpenClaw config | **`mcp.servers`** | `url` + `transport` | `command` + `args` | `env` | `transport: "streamable-http"` / `"stdio"` |
Confidence
90% confidence
Finding
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Agent Config Directory Access

High
Category
Agent Snooping
Content
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| Antigravity CLI (agy) | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenClaw | OpenClaw config | **`mcp.servers`** | `url` + `transport` | `command` + `args` | `env` | `transport: "streamable-http"` / `"stdio"` |
Confidence
90% confidence
Finding
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Agent Config Directory Access

High
Category
Agent Snooping
Content
| Devin CLI | `~/.config/devin/mcp_config.json` | `mcpServers` | `url` | `command` + `args` | `env` | `transport: "http"` (optional) |
| Devin Desktop | `~/.devin/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenCode | `~/.config/opencode/opencode.json` | **`mcp`** | `url` | **`command` (single array)** | **`environment`** | `type: "remote"` / `"local"` |
| Antigravity IDE | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| Antigravity CLI (agy) | `~/.gemini/config/mcp_config.json` | `mcpServers` | **`serverUrl`** | `command` + `args` | `env` | — |
| OpenClaw | OpenClaw config | **`mcp.servers`** | `url` + `transport` | `command` + `args` | `env` | `transport: "streamable-http"` / `"stdio"` |
Confidence
90% confidence
Finding
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Static analysis

No suspicious patterns detected.