@prowl-ai/prowl-skill 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.6.1 – 2026-10-11
4
+
5
+ Package `@prowl-ai/prowl-skill` 0.6.1 · plugins `prowl` 0.5.1, `prowl-cli` 0.3.0.
6
+
7
+ ### Security
8
+
9
+ - **The API key is no longer in a process's arguments.** The bundled launcher used to
10
+ start `mcp-remote … --header "Authorization: Bearer <key>"`, so the key sat in argv,
11
+ where any process of the same user reads it with `ps` or `pgrep -fl` — and two Prowl
12
+ keys leaked from one machine exactly that way (2026-10-04, 2026-10-09). The launcher
13
+ now exports `PROWL_MCP_AUTH="Bearer <key>"` and passes the literal
14
+ `Authorization:${PROWL_MCP_AUTH}`, which `mcp-remote` expands from its own
15
+ environment. Key sources and their order are unchanged. `test/mcp_launch_test.js`
16
+ asserts no argument carries the key from any source; `negative-self-test.js` plants
17
+ the old form and watches that assertion fire. Verified live against prowl.chat with
18
+ `mcp-remote` 0.14.3: `initialize` and `tools/list` (23 tools) succeed, the argv shows
19
+ only the placeholder.
20
+ - **Restart running sessions after updating.** An `mcp-remote` already running keeps
21
+ its old argv until its session restarts; rotate a key that was exposed.
22
+
3
23
  ## v0.6.0 – 2026-09-29
4
24
 
5
25
  Package `@prowl-ai/prowl-skill` 0.6.0 · plugins `prowl` 0.5.0, `prowl-cli` 0.3.0.
package/README.md CHANGED
@@ -97,7 +97,7 @@ codex plugin marketplace add https://github.com/PROWL-AI/prowl-skill
97
97
 
98
98
  Then ensure `[plugins."prowl@prowl"] enabled = true` in `${CODEX_HOME:-$HOME/.codex}/config.toml` and restart.
99
99
 
100
- The bundled `.mcp.json` connects to `https://prowl.chat/mcp` via `mcp-remote`, reading the token from `PROWL_MCP_TOKEN` or `~/.prowl/prowl_mcp_token`.
100
+ The bundled `.mcp.json` connects to `https://prowl.chat/mcp` via `mcp-remote`, reading the token from `PROWL_MCP_TOKEN` or `~/.prowl/prowl_mcp_token`. The token never appears in a process's arguments: the launcher hands it to `mcp-remote` in the `PROWL_MCP_AUTH` environment variable and passes only the placeholder `Authorization:${PROWL_MCP_AUTH}`, which `mcp-remote` expands itself — so `ps` and `pgrep -fl` show no key.
101
101
 
102
102
  With no key in either place the server **refuses to start** — it prints the two ways to supply one and exits `78` (`EX_CONFIG`). It deliberately does not fall through to `mcp-remote`'s OAuth: that opens a browser and waits on a `localhost` callback, and an MCP server started by an agent is killed long before the consent screen comes back, leaving the operator holding a redirect into a dead port.
103
103
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prowl-ai/prowl-skill",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "The Prowl plugin: install/usage skills, the hosted MCP config, and the live status widget that makes a running Prowl call, its progress and its cost visible in the terminal. This package is the installer CLI.",
5
5
  "keywords": [
6
6
  "prowl",
@@ -3,7 +3,7 @@
3
3
  "name": "prowl",
4
4
  "displayName": "Prowl",
5
5
  "description": "Real-world market data for your agents: the Prowl skill backed by the hosted Prowl MCP server (444 market data tools across 17 providers), with a status widget that makes a running call, its progress and its cost visible in the terminal.",
6
- "version": "0.5.0",
6
+ "version": "0.5.1",
7
7
  "author": {
8
8
  "name": "Prowl",
9
9
  "email": "support@prowl.chat",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "prowl",
4
4
  "displayName": "Prowl",
5
- "version": "0.5.0",
5
+ "version": "0.5.1",
6
6
  "description": "Real-world market data for your agents: the Prowl skill backed by the hosted Prowl MCP server (444 market data tools across 17 providers), with a status widget that makes a running call, its progress and its cost visible in the terminal.",
7
7
  "author": {
8
8
  "name": "Prowl",
@@ -4,7 +4,7 @@
4
4
  "command": "sh",
5
5
  "args": [
6
6
  "-lc",
7
- "TOKEN=\"$(printf %s \"${PROWL_MCP_TOKEN:-}\" | tr -d \"[:space:]\")\"; if [ -z \"$TOKEN\" ] && [ -f \"$HOME/.prowl/prowl_mcp_token\" ]; then TOKEN=\"$(tr -d \"[:space:]\" < \"$HOME/.prowl/prowl_mcp_token\")\"; fi; if [ -z \"$TOKEN\" ] && [ -f \"$HOME/.codex/prowl_mcp_token\" ]; then TOKEN=\"$(tr -d \"[:space:]\" < \"$HOME/.codex/prowl_mcp_token\")\"; fi; if [ -z \"$TOKEN\" ]; then echo 'prowl: no API key; the MCP server will not start.' >&2; echo 'prowl: store one with: npx @prowl-ai/prowl-skill token' >&2; echo 'prowl: or set PROWL_MCP_TOKEN in the environment.' >&2; echo 'prowl: not falling back to OAuth - browser consent cannot finish inside MCP startup.' >&2; exit 78; fi; exec npx -y mcp-remote https://prowl.chat/mcp --header \"Authorization: Bearer $TOKEN\" --transport http-first --silent"
7
+ "TOKEN=\"$(printf %s \"${PROWL_MCP_TOKEN:-}\" | tr -d \"[:space:]\")\"; if [ -z \"$TOKEN\" ] && [ -f \"$HOME/.prowl/prowl_mcp_token\" ]; then TOKEN=\"$(tr -d \"[:space:]\" < \"$HOME/.prowl/prowl_mcp_token\")\"; fi; if [ -z \"$TOKEN\" ] && [ -f \"$HOME/.codex/prowl_mcp_token\" ]; then TOKEN=\"$(tr -d \"[:space:]\" < \"$HOME/.codex/prowl_mcp_token\")\"; fi; if [ -z \"$TOKEN\" ]; then echo 'prowl: no API key; the MCP server will not start.' >&2; echo 'prowl: store one with: npx @prowl-ai/prowl-skill token' >&2; echo 'prowl: or set PROWL_MCP_TOKEN in the environment.' >&2; echo 'prowl: not falling back to OAuth - browser consent cannot finish inside MCP startup.' >&2; exit 78; fi; PROWL_MCP_AUTH=\"Bearer $TOKEN\"; export PROWL_MCP_AUTH; unset TOKEN; exec npx -y mcp-remote https://prowl.chat/mcp --header 'Authorization:${PROWL_MCP_AUTH}' --transport http-first --silent"
8
8
  ]
9
9
  }
10
10
  }
@@ -5,7 +5,7 @@ license: MIT
5
5
  compatibility: Requires network access to prowl.chat and a Prowl API token; speaks MCP protocol 2025-06-18 over Streamable HTTP; the bundled MCP config runs `npx mcp-remote` (needs Node.js 18+).
6
6
  metadata:
7
7
  author: prowl.chat
8
- version: "0.5.0"
8
+ version: "0.5.1"
9
9
  ---
10
10
 
11
11
  # Prowl – real-world market data for your agents