@prowl-ai/prowl-skill 0.5.6 → 0.5.7

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,58 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.5.7 — 2026-08-23
4
+
5
+ Package `@prowl-ai/prowl-skill` 0.5.7 · plugins `prowl` 0.4.4, `prowl-cli` 0.2.6
6
+ (unchanged).
7
+
8
+ A first run with no key opened a browser and left the operator holding a callback into
9
+ a port that had already died. It now refuses to start, and says what to do instead.
10
+
11
+ ### Fixed
12
+
13
+ - **The MCP launcher no longer strands the operator in a half-finished OAuth flow.**
14
+ With no API key configured, `plugins/prowl/.mcp.json` used to hand `mcp-remote` an
15
+ empty `Authorization: Bearer ` header. The server rejects that, and `mcp-remote`
16
+ falls back to OAuth — which opens a browser and starts a `localhost` listener to
17
+ catch the callback. An MCP server spawned at agent startup does not survive long
18
+ enough to be there when consent completes: the listener is gone, the redirect hits a
19
+ dead port, and the operator is left holding a URL with an authorization code that
20
+ expires before anything can be done with it.
21
+
22
+ Measured on one machine on 2026-08-22: two such flows in a single day, both
23
+ stranded. The second left `~/.mcp-auth/mcp-remote-0.1.43/…_lock.json` recording
24
+ `{"pid": 68661, "port": 4333}` for a process that no longer existed.
25
+
26
+ The launcher now resolves the key, and **refuses to start without one** — printing
27
+ the two supported ways to supply it and exiting `78` (`EX_CONFIG`, `sysexits.h`)
28
+ rather than reaching `mcp-remote` at all. A key that is present but empty or
29
+ whitespace-only counts as absent.
30
+
31
+ - **The README said 22 MCP tools; the server registers 23.** `npm run check:contract`
32
+ reads the count off `https://prowl.chat/mcp/` and had no claim in the README to check
33
+ it against — the number sat one line below a heading no gate reads. The skill page
34
+ already said 23.
35
+
36
+ ### Added
37
+
38
+ - **`test/mcp_launch_test.js`** — 12 checks that execute the real `.mcp.json` launcher
39
+ rather than reading it. A fake `npx` on the launcher's own PATH captures the argv, so
40
+ the suite can assert both halves: that no key means `npx` is never reached, and that
41
+ each documented key source (`PROWL_MCP_TOKEN`, the plugin file, the Codex file)
42
+ reaches `mcp-remote` carrying that exact key, in that precedence.
43
+
44
+ Shadowing `npx` by PATH alone does not work here — `sh -lc` is a login shell, and on
45
+ macOS `/etc/profile` runs `path_helper`, which pushes an injected PATH entry to the
46
+ end. A `.profile` in the fake `HOME` is sourced afterwards and does win; that is what
47
+ the suite uses. Nothing in it touches the network.
48
+
49
+ Verified to have teeth: against the previous launcher, 6 of the 12 checks fail, and
50
+ the failure output is the defect itself — `'Authorization: Bearer '`. That proof is
51
+ now the fourteenth plant in `scripts/negative-self-test.js`, so every CI run removes
52
+ the refusal from `.mcp.json` and requires the suite to go red on `npx ran without a
53
+ key` — a suite that quietly stopped checking this would otherwise report the same
54
+ green as one that still does.
55
+
3
56
  ## v0.5.6 — 2026-08-16
4
57
 
5
58
  Package `@prowl-ai/prowl-skill` 0.5.6 · plugins `prowl` 0.4.3 (unchanged), `prowl-cli`
package/README.md CHANGED
@@ -97,6 +97,8 @@ Then ensure `[plugins."prowl@prowl"] enabled = true` in `${CODEX_HOME:-$HOME/.co
97
97
 
98
98
  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`.
99
99
 
100
+ 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.
101
+
100
102
  ### Manual MCP config (any client)
101
103
 
102
104
  Configure a Streamable HTTP MCP server at `https://prowl.chat/mcp` with header `Authorization: Bearer prowl_YOUR_KEY`. See <https://prowl.chat/mcp/install.md> for per-client snippets (Cursor, Claude Code, Codex, generic).
@@ -137,7 +139,7 @@ pruned after seven days, and the plugin never writes to your Claude Code setting
137
139
 
138
140
  ## What your agent gets
139
141
 
140
- - **22 MCP tools** front the whole catalog — discovery and schema lookup are free; only data calls are metered.
142
+ - **23 MCP tools** front the whole catalog — discovery and schema lookup are free; only data calls are metered.
141
143
  - **3 execution modes** for `prowl_analyze` — `basic` (20–100 calls, 30–90s), `deep` (40–300, 3–5 min, needs Exploit+) and `max` (60–400, 5–10 min, needs Blackops+). A key without the subscription is downgraded to `basic` rather than refused.
142
144
  - **8 playbooks** — `geo-visibility-audit`, `competitor-teardown`, `content-engine`, `local-and-reputation`, `mobile-aso`, `amazon-marketplace`, `idea-validation`, `channel-economics-audit`.
143
145
  - **Verified reports** — a typed evidence ledger extracts claims, attacks them adversarially, then gap-fills what survives. Contradictions and refuted claims ship inside the report.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prowl-ai/prowl-skill",
3
- "version": "0.5.6",
3
+ "version": "0.5.7",
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": "Prowl market-intelligence skill backed by the hosted Prowl MCP server (448 tools), with a status widget that makes a running call, its progress and its cost visible in the terminal.",
6
- "version": "0.4.3",
6
+ "version": "0.4.4",
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.4.3",
5
+ "version": "0.4.4",
6
6
  "description": "Prowl market-intelligence skill backed by the hosted Prowl MCP server (448 tools), 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=\"${PROWL_MCP_TOKEN:-}\"; if [ -z \"$TOKEN\" ] && [ -f \"$HOME/.prowl/prowl_mcp_token\" ]; then TOKEN=\"$(cat \"$HOME/.prowl/prowl_mcp_token\")\"; fi; if [ -z \"$TOKEN\" ] && [ -f \"$HOME/.codex/prowl_mcp_token\" ]; then TOKEN=\"$(cat \"$HOME/.codex/prowl_mcp_token\")\"; 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; exec npx -y mcp-remote https://prowl.chat/mcp --header \"Authorization: Bearer $TOKEN\" --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.4.3"
8
+ version: "0.4.4"
9
9
  ---
10
10
 
11
11
  # Prowl — market intelligence for your agent
@@ -28,6 +28,8 @@ Prowl API keys (`prowl_...`) are billing-bearing — every metered call debits a
28
28
  - a token file at `~/.prowl/prowl_mcp_token` (`mkdir -p ~/.prowl && printf '%s' "prowl_YOUR_KEY" > ~/.prowl/prowl_mcp_token && chmod 600 ~/.prowl/prowl_mcp_token`).
29
29
  3. The bundled `.mcp.json` reads the token automatically and connects via `mcp-remote`.
30
30
 
31
+ Without a key the server does not start: it names both ways to supply one and exits `78`. That is deliberate — it will not fall through to OAuth, because browser consent cannot finish inside an MCP startup. If the agent reports the `prowl` server as failed, read its stderr: the remedy is in it.
32
+
31
33
  For manual per-client setup (Cursor `.cursor/mcp.json`, Claude Code `claude mcp add`, Codex `config.toml`, generic MCP), see the hosted playbook: [https://prowl.chat/mcp/install.md](https://prowl.chat/mcp/install.md).
32
34
 
33
35
  ## Core tools