outrank-cli 0.7.0 → 0.7.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/README.md +13 -13
- package/SKILL.md +2 -2
- package/package.json +1 -1
- package/src/adapters/mcp/prompts.js +3 -1
- package/src/adapters/mcp/toolNotes.js +2 -1
package/README.md
CHANGED
|
@@ -119,13 +119,13 @@ Requirements: Node.js 18+ (check with `node --version`), an Outrank API key from
|
|
|
119
119
|
Run this in the project folder (macOS, Linux, WSL, or the Windows Command Prompt):
|
|
120
120
|
|
|
121
121
|
```bash
|
|
122
|
-
claude mcp add outrank --env OUTRANK_API_KEY=outr_live_xxx -- npx -y outrank-cli@
|
|
122
|
+
claude mcp add outrank --env OUTRANK_API_KEY=outr_live_xxx -- npx -y outrank-cli@latest mcp
|
|
123
123
|
```
|
|
124
124
|
|
|
125
125
|
If the server does not start on native Windows, use the `cmd /c` form:
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
|
-
claude mcp add outrank --env OUTRANK_API_KEY=outr_live_xxx -- cmd /c npx -y outrank-cli@
|
|
128
|
+
claude mcp add outrank --env OUTRANK_API_KEY=outr_live_xxx -- cmd /c npx -y outrank-cli@latest mcp
|
|
129
129
|
```
|
|
130
130
|
|
|
131
131
|
In PowerShell, call `claude.exe` instead of `claude` (`claude.cmd` when Claude Code was installed with npm), so that the `--` separator is kept.
|
|
@@ -139,7 +139,7 @@ To share the server with a team, commit a `.mcp.json` that takes the key from ea
|
|
|
139
139
|
"mcpServers": {
|
|
140
140
|
"outrank": {
|
|
141
141
|
"command": "npx",
|
|
142
|
-
"args": ["-y", "outrank-cli@
|
|
142
|
+
"args": ["-y", "outrank-cli@latest", "mcp"],
|
|
143
143
|
"env": { "OUTRANK_API_KEY": "${OUTRANK_API_KEY}" }
|
|
144
144
|
}
|
|
145
145
|
}
|
|
@@ -167,14 +167,14 @@ Add the server to `~/.cursor/mcp.json`, the file for all projects (on Windows: `
|
|
|
167
167
|
"mcpServers": {
|
|
168
168
|
"outrank": {
|
|
169
169
|
"command": "npx",
|
|
170
|
-
"args": ["-y", "outrank-cli@
|
|
170
|
+
"args": ["-y", "outrank-cli@latest", "mcp"],
|
|
171
171
|
"env": { "OUTRANK_API_KEY": "outr_live_xxx" }
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
```
|
|
176
176
|
|
|
177
|
-
If the server does not start on native Windows, use `"command": "cmd"` and `"args": ["/c", "npx", "-y", "outrank-cli@
|
|
177
|
+
If the server does not start on native Windows, use `"command": "cmd"` and `"args": ["/c", "npx", "-y", "outrank-cli@latest", "mcp"]`.
|
|
178
178
|
|
|
179
179
|
For one project or a team, put the server in `.cursor/mcp.json` inside the project and take the key from the environment, so the file can be committed without it:
|
|
180
180
|
|
|
@@ -183,7 +183,7 @@ For one project or a team, put the server in `.cursor/mcp.json` inside the proje
|
|
|
183
183
|
"mcpServers": {
|
|
184
184
|
"outrank": {
|
|
185
185
|
"command": "npx",
|
|
186
|
-
"args": ["-y", "outrank-cli@
|
|
186
|
+
"args": ["-y", "outrank-cli@latest", "mcp"],
|
|
187
187
|
"env": { "OUTRANK_API_KEY": "${env:OUTRANK_API_KEY}" }
|
|
188
188
|
}
|
|
189
189
|
}
|
|
@@ -199,10 +199,10 @@ Set `OUTRANK_API_KEY` as shown in the Claude Code section, then quit and reopen
|
|
|
199
199
|
Any client that can start a local MCP server (the stdio transport) works. Give it these three values; many clients read the same JSON as the Cursor example above.
|
|
200
200
|
|
|
201
201
|
- Command: `npx`
|
|
202
|
-
- Arguments: `-y outrank-cli@
|
|
202
|
+
- Arguments: `-y outrank-cli@latest mcp`
|
|
203
203
|
- Environment variable: `OUTRANK_API_KEY` set to your API key
|
|
204
204
|
|
|
205
|
-
The examples
|
|
205
|
+
The examples use the `latest` tag, so the server picks up each new release the next time the client starts it. To stay on one version, replace `latest` with an exact version number from the [npm page](https://www.npmjs.com/package/outrank-cli). If you install the package globally (`npm install -g outrank-cli`), the command is `outrank-cli mcp`, or the `outrank-mcp` binary.
|
|
206
206
|
|
|
207
207
|
### Options
|
|
208
208
|
|
|
@@ -241,8 +241,8 @@ For several organizations, store one profile per organization with the CLI and r
|
|
|
241
241
|
```bash
|
|
242
242
|
outrank-cli auth login outr_live_xxx --profile acme
|
|
243
243
|
outrank-cli auth login outr_live_yyy --profile globex
|
|
244
|
-
claude mcp add outrank-acme -- npx -y outrank-cli@
|
|
245
|
-
claude mcp add outrank-globex -- npx -y outrank-cli@
|
|
244
|
+
claude mcp add outrank-acme -- npx -y outrank-cli@latest mcp --profile acme
|
|
245
|
+
claude mcp add outrank-globex -- npx -y outrank-cli@latest mcp --profile globex
|
|
246
246
|
```
|
|
247
247
|
|
|
248
248
|
A selected profile ignores `OUTRANK_API_KEY`, so both servers stay on their own organization even when that variable is exported in your shell. In PowerShell, call `claude.exe` in the last two commands, as described under [Claude Code](#claude-code).
|
|
@@ -262,10 +262,10 @@ A selected profile ignores `OUTRANK_API_KEY`, so both servers stay on their own
|
|
|
262
262
|
|
|
263
263
|
### Troubleshooting
|
|
264
264
|
|
|
265
|
-
- **The server does not start.** Run the same command in a terminal: `npx -y outrank-cli@
|
|
265
|
+
- **The server does not start.** Run the same command in a terminal: `npx -y outrank-cli@latest mcp --help` must print usage. Check that Node.js 18 or newer is installed (`node --version`). On native Windows, if the client cannot start `npx` directly, use the `cmd /c npx …` form.
|
|
266
266
|
- **The command works in a terminal, but the client cannot find `npx` or `node` (macOS, Linux).** A client started from the Dock or a desktop menu does not always get the `PATH` of your shell, so a Node.js installed with nvm, fnm or volta can be invisible to it. Run `which npx` in a terminal, use that full path as the command, and add its folder to `PATH` in the `env` block of the server entry, for example `"PATH": "/home/you/.nvm/versions/node/v22.0.0/bin:/usr/bin:/bin"`. The full path alone is not enough: `npx` starts `node` through `PATH`.
|
|
267
267
|
- **PowerShell reports `unknown option '-y'` on `claude mcp add`.** PowerShell drops the `--` separator when `claude` is a script or a function instead of the program itself (an npm-installed Claude Code, or a wrapper in your profile). Call `claude.exe mcp add …` (`claude.cmd` when Claude Code was installed with npm) or run the command from the Command Prompt.
|
|
268
|
-
- **The first start is slow, or the server fails to connect.** `npx` downloads the package the first time and contacts the npm registry on every start, so an empty cache or a slow registry can push startup past the client's limit. In Claude Code, run `/mcp reconnect all` to try again; `MCP_TIMEOUT` (milliseconds) raises the startup limit. To take the registry out of the startup path, install the package globally (`npm install -g outrank-cli@
|
|
268
|
+
- **The first start is slow, or the server fails to connect.** `npx` downloads the package the first time and contacts the npm registry on every start, so an empty cache or a slow registry can push startup past the client's limit. In Claude Code, run `/mcp reconnect all` to try again; `MCP_TIMEOUT` (milliseconds) raises the startup limit. To take the registry out of the startup path, install the package globally (`npm install -g outrank-cli@latest`) and use `outrank-cli mcp` as the command.
|
|
269
269
|
- **Every call returns `CLI_AUTH_REQUIRED`.** The server has no key. Add `OUTRANK_API_KEY` to the server entry, or select a stored profile with `--profile`.
|
|
270
270
|
- **Only a few tools are listed.** Read the server instructions in the client: they name the toolsets that are off and why. See [Toolsets](#toolsets).
|
|
271
271
|
- **A long call times out.** `improvements_analyze`, `improvements_candidates_brief`, `improvements_tasks_execute`, `improvements_executions_push`, `articles_generate`, `articles_precreate`, `articles_retry_publish` and `keywords_generate` can run for minutes. When the call does not finish, the result is `CLI_OPERATION_MAY_STILL_BE_RUNNING` and names the tool to poll: the work continues on the server, so poll instead of repeating the call. The server sends progress notifications while such a call runs, but clients do not have to extend their own limit because of them. Claude Code does not cut a tool call off by default: `MCP_TOOL_TIMEOUT` (milliseconds) is about 28 hours when unset, and a `timeout` field on the server's `.mcp.json` entry sets a hard limit for that server which progress notifications do not extend. Cursor (measured on 3.22) stops a call after 120 seconds without a progress notification and keeps waiting while they arrive, so long calls get through there. Other clients may stop after a fixed time whatever the server does; the poll tools are the way through.
|
|
@@ -730,7 +730,7 @@ Buyer side:
|
|
|
730
730
|
- Shopify uses a direct app access token. Start with `outrank-cli products integrations validate shopify --json '{"access_token":"shpat_xxx"}'`; the response returns `shop_name` and the available blogs you can use in the create payload, so the human does not need to provide the store name separately.
|
|
731
731
|
- Webflow uses a direct API token plus pre-save discovery. Start with `outrank-cli products integrations validate webflow --json-file webflow-sites.json`, then use `webflow sites`, `webflow collections`, `webflow fields`, and `webflow items` to build the exact create or update payload for the chosen CMS collection.
|
|
732
732
|
- Wix is a direct credential flow using `site_id`, `api_key`, and `publish_status`. Validate first, then create or update directly; there is no OAuth or prepare step.
|
|
733
|
-
- Next.js Blog is a one-step create flow. Run `outrank-cli products integrations create <product-id> --json '{"provider":"nextjs-blog"}'` and store the returned `data.secrets.api_key` immediately because it is not readable later.
|
|
733
|
+
- Next.js Blog is a one-step create flow. Run `outrank-cli products integrations create <product-id> --json '{"provider":"nextjs-blog"}'` and store the returned `data.secrets.api_key` immediately because it is not readable later. One key serves both the articles and the marketplace integration of a product: when the product already hosts marketplace placements through Next.js Blog, create reuses that key and returns no `secrets`.
|
|
734
734
|
- Validate unsaved webhook, Ghost, Framer, Shopify, Webflow, Wix, or WordPress Plugin credentials with `outrank-cli products integrations validate <provider> --json-file integration.json`.
|
|
735
735
|
- Create a webhook, Ghost, Framer, Shopify, Webflow, Wix, WordPress Plugin, or Next.js Blog integration with `outrank-cli products integrations create <product-id> --json-file integration-create.json`.
|
|
736
736
|
- Inspect one integration with `outrank-cli products integrations get <product-id> <integration-id>`.
|
package/SKILL.md
CHANGED
|
@@ -383,7 +383,7 @@ Recommended flow:
|
|
|
383
383
|
8. For Shopify, start with `outrank-cli products integrations validate shopify --json '{"access_token":"shpat_xxx"}'`. The response returns `shop_name` and the available blogs, which the agent should use to build the create payload instead of guessing them or asking the human for the store name first.
|
|
384
384
|
9. For Webflow, start with `outrank-cli products integrations validate webflow --json-file webflow-sites.json`, then use `webflow sites`, `webflow collections`, `webflow fields`, and `webflow items` to build the exact create or update payload for the chosen CMS collection.
|
|
385
385
|
10. For Framer, use only the newer Server API flow. Start with `outrank-cli products integrations validate framer --json-file framer-validate.json`, then use `framer collections` and `framer fields` when the human wants to publish into an existing editable collection. Do not use or mention the older plugin-based setup.
|
|
386
|
-
11. For Next.js Blog, do not ask the human for credentials first. Run `outrank-cli products integrations create <productId> --json '{"provider":"nextjs-blog"}'` and treat the returned `data.secrets.api_key` as a one-time secret that must be saved immediately.
|
|
386
|
+
11. For Next.js Blog, do not ask the human for credentials first. Run `outrank-cli products integrations create <productId> --json '{"provider":"nextjs-blog"}'` and treat the returned `data.secrets.api_key` as a one-time secret that must be saved immediately. If the response has no `secrets`, the product already hosts marketplace placements through Next.js Blog and that integration's key was reused: the site needs no change.
|
|
387
387
|
12. For Wix, use a direct credential flow with `site_id`, `api_key`, and `publish_status`. Validate first, then create or update directly; there is no OAuth or prepare step.
|
|
388
388
|
13. Validate webhook, Ghost, Shopify, Webflow, Wix, Framer, or WordPress Plugin credentials before saving with `outrank-cli products integrations validate <provider> --json-file integration.json`.
|
|
389
389
|
14. Create a webhook, Ghost, Shopify, Webflow, Wix, Framer, WordPress Plugin, or Next.js Blog integration with `outrank-cli products integrations create <productId> --json-file integration-create.json`.
|
|
@@ -403,7 +403,7 @@ Important behavior:
|
|
|
403
403
|
- `webflow` should use validation plus discovery before create. The agent should not guess `site_id`, `collection_id`, or Webflow field mappings.
|
|
404
404
|
- `framer` should use the newer Server API flow only. The agent should not mention the older Framer plugin flow. Validate the project URL and Server API key first, then use `framer collections` and `framer fields` only when the human chooses an existing editable collection. There is no separate plugin-config step in the agent surface.
|
|
405
405
|
- `wix` uses direct validate/create/update/test with a site UUID plus API key. The agent should validate `site_id` and `api_key` before create or after credentials change.
|
|
406
|
-
- `nextjs-blog` create returns a one-time API key. The agent must surface and preserve it immediately because later reads only show that a hash exists, not the plain secret.
|
|
406
|
+
- `nextjs-blog` create returns a one-time API key. The agent must surface and preserve it immediately because later reads only show that a hash exists, not the plain secret. One key serves both the articles and the marketplace integration of a product: when an active Next.js Blog marketplace integration exists, create reuses its key and returns no `secrets`; creating again issues a new key and invalidates the old one.
|
|
407
407
|
- deleting the current active integration clears the product integration fields automatically
|
|
408
408
|
- `validate` tests unsaved credentials without persisting a row, while `test` re-checks a saved integration row
|
|
409
409
|
- the current CLI surface still does not expose create, update, or test for some providers, and only WordPress.com and Notion currently expose an OAuth connect flow; if the human asks for unsupported operations, say they are not shipped in this CLI yet instead of inventing commands
|
package/package.json
CHANGED
|
@@ -143,7 +143,9 @@ const providerHints = Object.freeze({
|
|
|
143
143
|
ghost:
|
|
144
144
|
'products_integrations_validate with url and api_key (the Ghost Admin API key, id:secret), then create with ' +
|
|
145
145
|
'publish_status (draft | published).',
|
|
146
|
-
'nextjs-blog':
|
|
146
|
+
'nextjs-blog':
|
|
147
|
+
'products_integrations_create directly; data.secrets.api_key is shown once and must be saved. No secrets means ' +
|
|
148
|
+
'the key of the existing Next.js Blog marketplace integration was reused: the site needs no change.',
|
|
147
149
|
});
|
|
148
150
|
|
|
149
151
|
const setupPublishingIntegrationText = (productId, provider) =>
|
|
@@ -262,7 +262,8 @@ export const TOOL_NOTES = Object.freeze({
|
|
|
262
262
|
'products.integrations.create': {
|
|
263
263
|
note:
|
|
264
264
|
'A product keeps one publishing integration. Validate the credentials first. nextjs-blog returns a one-time ' +
|
|
265
|
-
'secrets.api_key: show it to the user at once
|
|
265
|
+
'secrets.api_key: show it to the user at once (no secrets when it reuses the key of the marketplace ' +
|
|
266
|
+
'integration). Use connect for notion and wordpress-com.',
|
|
266
267
|
body:
|
|
267
268
|
'provider (required) plus: webhook { name, endpoint, access_token }; ghost { name, url, api_key, ' +
|
|
268
269
|
'publish_status (draft | published) }; shopify { name, access_token, blog_id, author_name, publish_status ' +
|