outrank-cli 0.11.0 → 0.12.0

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 CHANGED
@@ -290,7 +290,7 @@ Tools that take a JSON `body` describe its fields in their description; `product
290
290
  Generated from the command registry with `npm run docs:tools`. The registry is checked against the Outrank server's route list in `tests/fixtures/agentApiSurface.json`, refreshed from a checkout of the Outrank app with `npm run surface:extract -- <path-to-outrank-repo>`: a server route without a tool, a tool without a server route, a guidance sentence naming an endpoint the server cannot map to a tool, or a rewritten argument the named tool would refuse fails the tests. The fixture records the server commit and, as `sourceDirty`, whether that checkout had uncommitted changes in the files it reads; extract again from a clean checkout before a release. To see whether the fixture is stale, run `node scripts/extractAgentApiSurface.js --check <path-to-outrank-repo>`, or run the tests with `OUTRANK_SERVER_DIR=<path-to-outrank-repo>`: both list the routes and guidance mentions that differ, and without the variable that one test is skipped. Kinds: `read` changes nothing; `write` changes Outrank or the connected site; `destructive` deletes or cannot be undone; `money` changes what the organization pays; `local` makes no request. Tools marked ★ are always listed in `auto` mode.
291
291
 
292
292
  <!-- mcp-tools:start -->
293
- 245 tools.
293
+ 244 tools.
294
294
 
295
295
  | Tool | CLI command | Kind | Toolset | What it does |
296
296
  | --- | --- | --- | --- | --- |
@@ -526,13 +526,12 @@ Generated from the command registry with `npm run docs:tools`. The registry is c
526
526
  | `ai_cited_lists_settings_get` | `ai-cited-lists settings get` | read | ai-cited-lists | Get the AI-Cited Lists settings of a product: sender details, positions, pause, entry. |
527
527
  | `ai_cited_lists_settings_update` | `ai-cited-lists settings update` | write | ai-cited-lists | Update the AI-Cited Lists settings of a product from a JSON body. |
528
528
  | `ai_cited_lists_mailbox_get` | `ai-cited-lists mailbox get` | read | ai-cited-lists | Get the connected Google mailbox and its four sending checks. |
529
- | `ai_cited_lists_mailbox_connect` | `ai-cited-lists mailbox connect` | write | ai-cited-lists | Start the Google mailbox connection: returns a connect_url for the human and an attempt_id to poll. |
530
- | `ai_cited_lists_mailbox_poll` | `ai-cited-lists mailbox poll` | read | ai-cited-lists | Poll a mailbox connection attempt until Google consent completed. |
529
+ | `ai_cited_lists_mailbox_connect` | `ai-cited-lists mailbox connect` | write | ai-cited-lists | Connect the Google mailbox that sends the offers with its address and a Google app password. |
531
530
  | `ai_cited_lists_mailbox_domain_check` | `ai-cited-lists mailbox domain-check` | write | ai-cited-lists | Re-run the SPF, DKIM and DMARC check of the mailbox domain. |
532
531
  | `ai_cited_lists_mailbox_inbox_test` | `ai-cited-lists mailbox inbox-test` | write | ai-cited-lists | Send the seed-list inbox test from the mailbox (server rate-limited). |
533
532
  | `ai_cited_lists_mailbox_filter_test` | `ai-cited-lists mailbox filter-test` | write | ai-cited-lists | Send the reply-filter test email to confirm replies reach Outrank. |
534
533
  | `ai_cited_lists_mailbox_dkim_selector` | `ai-cited-lists mailbox dkim-selector` | write | ai-cited-lists | Set the Google Workspace DKIM selector of the mailbox domain, or reset it to the default. |
535
- | `ai_cited_lists_mailbox_disconnect` | `ai-cited-lists mailbox disconnect` | destructive | ai-cited-lists | Disconnect the Google mailbox and revoke its token. |
534
+ | `ai_cited_lists_mailbox_disconnect` | `ai-cited-lists mailbox disconnect` | destructive | ai-cited-lists | Disconnect the Google mailbox and delete its stored app password. |
536
535
  | `ai_cited_lists_top_up_consent_get` | `ai-cited-lists top-up-consent get` | read | ai-cited-lists | Read the automatic credit top-up terms and whether they were confirmed. |
537
536
  | `ai_cited_lists_top_up_consent_confirm` | `ai-cited-lists top-up-consent confirm` | money | ai-cited-lists | Confirm the automatic credit top-up: authorizes credit-pack purchases on the card on file. |
538
537
  | `ai_cited_lists_entry_generate` | `ai-cited-lists entry generate` | write | ai-cited-lists | Write a fresh base entry for the product from its site (multi-minute). |
@@ -575,7 +574,7 @@ outrank-cli improvements executions push 00000000-0000-0000-0000-000000000000
575
574
  outrank-cli ai-cited-lists status 00000000-0000-0000-0000-000000000000
576
575
  outrank-cli ai-cited-lists lists list 00000000-0000-0000-0000-000000000000 --view to_send
577
576
  outrank-cli ai-cited-lists questions add 00000000-0000-0000-0000-000000000000 --question "What is the best privacy-friendly analytics tool?"
578
- outrank-cli ai-cited-lists mailbox connect 00000000-0000-0000-0000-000000000000 --email ada@acme.com
577
+ echo '{"email":"ada@acme.com","app_password":"abcd efgh ijkl mnop"}' | outrank-cli ai-cited-lists mailbox connect 00000000-0000-0000-0000-000000000000 --json-stdin
579
578
  outrank-cli subscription status
580
579
  outrank-cli usage stats
581
580
  outrank-cli products get 00000000-0000-0000-0000-000000000000
@@ -826,7 +825,7 @@ For a product with a hosted Outrank Blog (`products blog get` shows it):
826
825
  AI-Cited Lists is part of the Backlinks Enterprise plan. Outrank asks ChatGPT the product's buyer questions several times a week, keeps the "best of" lists it cites, and emails each list's owner from the customer's own Google mailbox with a paid offer for the #1 or #2 spot. The `ai-cited-lists` toolset is listed only for organizations with a product on that plan; on any other product every command except `mailbox disconnect` (admin-only, so a leaving customer can still revoke the Google token) returns `AI_CITED_LISTS_ENTERPRISE_REQUIRED` with `details.upgrade_url`, and while Outrank has outreach switched off they return `AI_CITED_LISTS_UNAVAILABLE`, which is not a plan problem.
827
826
 
828
827
  - `ai-cited-lists status <product-id>` is the entry point: `data.setup.missing` names what outreach still needs (`mailbox`, `sender_details`, `top_up_consent`) and `data.checked` says whether ChatGPT was asked yet.
829
- - Setup needs an admin key for the top-up consent, the mailbox and the settings (questions, `entry generate` and `setup finish` do not) and happens in three parts: `top-up-consent get`, then `top-up-consent confirm` after the human agreed to the terms (it authorizes credit-pack purchases on the card on file when the balance cannot cover a verified spot); `mailbox connect` returns a `connect_url` the human opens in a browser, `mailbox poll --attempt-id <attempt-id>` waits for Google consent, and `mailbox get` shows the four checks (`connection`, `domain`, `reply_filter`, `inbox_test`) with `mailbox domain-check`, `mailbox filter-test`, `mailbox inbox-test` and `mailbox dkim-selector --selector <name>` (or `--reset`) to fix them; `settings update --json '{"sender_name":"...","sender_title":"...","postal_address":"..."}'` signs the emails.
828
+ - Setup needs an admin key for the top-up consent, the mailbox and the settings (questions, `entry generate` and `setup finish` do not) and happens in three parts: `top-up-consent get`, then `top-up-consent confirm` after the human agreed to the terms (it authorizes credit-pack purchases on the card on file when the balance cannot cover a verified spot); `mailbox connect --json-stdin` takes `{"email","app_password"}` (a Google app password the human created at https://myaccount.google.com/apppasswords; pass it on stdin so it stays out of the shell history) and connects at once, and `mailbox get` shows the four checks (`connection`, `domain`, `reply_filter`, `inbox_test`) with `mailbox domain-check`, `mailbox filter-test`, `mailbox inbox-test` and `mailbox dkim-selector --selector <name>` (or `--reset`) to fix them; `settings update --json '{"sender_name":"...","sender_title":"...","postal_address":"..."}'` signs the emails.
830
829
  - `questions list|add|edit|remove` manage the buyer questions. `citations check` asks ChatGPT now unless fresh data or a running check exists; `citations summary [--weeks 4|12]` shows the answers naming the product and the pages ChatGPT cited.
831
830
  - `lists list [--view to_send|skipped]` shows this week's cited lists; nothing needs approval, every list gets an offer on `next_send_at` unless `lists skip` is called. `outreach` lists every offer with its stage, the latest owner replies and the sending health; `offers get` opens one and `offers withdraw` cancels a draft or sent offer; `wins get` is the proof page of a won list. `settings update --json '{"outreach_paused":true}'` pauses new emails without hiding live spots.
832
831
  - `entry generate` rewrites the base entry owners publish (minutes; read it with `settings get`); `settings update --json '{"entry_mode":"custom","custom_entry":{"markdown":"..."}}'` publishes custom wording instead (links may only point to the product site).
package/SKILL.md CHANGED
@@ -610,8 +610,8 @@ Inspect before mutating:
610
610
  Setup (the top-up consent, the mailbox and the settings need a key that belongs to an organization admin; questions, `entry generate` and `setup finish` do not):
611
611
 
612
612
  1. `outrank-cli ai-cited-lists top-up-consent get <productId>`, show the terms, and only after the human agrees in their own words run `top-up-consent confirm <productId>` — it authorizes credit-pack purchases on the card on file when the balance cannot cover a verified spot
613
- 2. `outrank-cli ai-cited-lists mailbox connect <productId> [--email <address>]` returns `connect_url`: the human opens it in a browser and allows sending from their Google mailbox (Workspace or personal Gmail); then `mailbox poll <productId> --attempt-id <attempt-id>` until `status` is `completed`, `failed` or `expired`; on `failed`, report `data.outcome` to the human; on `failed` or `expired`, follow the poll guidance before starting a fresh connect
614
- 3. `outrank-cli ai-cited-lists mailbox get <productId>` shows the four checks: `connection`, `domain` (SPF, DKIM, DMARC; `mailbox domain-check` re-runs it, `mailbox dkim-selector --selector <name>` sets a Workspace selector, `--reset` restores the default), `reply_filter` (the human creates a Gmail filter that forwards replies to `reply_filter.forward_address`, then `mailbox filter-test`), `inbox_test` (`mailbox inbox-test`). Sending starts only when `ready_to_send` is true
613
+ 2. Ask the human for the Gmail or Google Workspace address and a Google app password created for it at https://myaccount.google.com/apppasswords (2-Step Verification must be on), then pipe `{"email":"...","app_password":"..."}` into `outrank-cli ai-cited-lists mailbox connect <productId> --json-stdin`; on an error, report the error message to the human. Never repeat the app password back or store it
614
+ 3. `outrank-cli ai-cited-lists mailbox get <productId>` shows the four checks: `connection`, `domain` (SPF, DKIM, DMARC; `mailbox domain-check` re-runs it, `mailbox dkim-selector --selector <name>` sets a Workspace selector, `--reset` restores the default), `reply_filter` (the human adds `reply_filter.forward_address` under Forwarding and POP/IMAP in Gmail, confirms it by opening `reply_filter.forwarding_confirmation_url`, keeps Disable forwarding selected, creates a Gmail filter that forwards replies to that address, then `mailbox filter-test`; `reply_filter.forwards_all_mail_since` means Gmail forwards every email and the human must select Disable forwarding), `inbox_test` (`mailbox inbox-test`). Sending starts only when `ready_to_send` is true
615
615
  4. `outrank-cli ai-cited-lists settings update <productId> --json '{"sender_name":"...","sender_title":"...","postal_address":"..."}'` signs the emails
616
616
  5. optionally `questions add|edit|remove` (written the way a buyer asks ChatGPT), `entry generate <productId>` (minutes; read the result with `settings get`) or `settings update --json '{"entry_mode":"custom","custom_entry":{"markdown":"..."}}'`, and `setup finish <productId>` so the dashboard opens on the tabs
617
617
 
@@ -689,4 +689,4 @@ Then: `placements list`, `placements regenerate|revalidate`, `article get/edit <
689
689
 
690
690
  ## Current limitation
691
691
 
692
- The implementation plan is broader than the current live API. Keywords, core article flows, article improvements, linking, backlink exchange management, marketplace seller and buyer flows, AI-Cited Lists, and the current integration-management flows are exposed in `outrank-cli`, including direct setup for webhook, Ghost, Shopify, Webflow, Wix, Framer, WordPress Plugin, and Next.js Blog, plus OAuth flows for WordPress.com and Notion. Purchasing or changing backlink add-ons, marketplace Enterprise checkout, Stripe Express identity/bank onboarding, marketplace plan upgrades, the Google consent step of the AI-Cited Lists mailbox connection and the AI-Cited Lists entry chat with image uploads still require the dashboard or a browser. If the user asks for something not present in `outrank-cli --help`, say that exact command surface is not shipped yet and do not invent unsupported commands.
692
+ The implementation plan is broader than the current live API. Keywords, core article flows, article improvements, linking, backlink exchange management, marketplace seller and buyer flows, AI-Cited Lists, and the current integration-management flows are exposed in `outrank-cli`, including direct setup for webhook, Ghost, Shopify, Webflow, Wix, Framer, WordPress Plugin, and Next.js Blog, plus OAuth flows for WordPress.com and Notion. Purchasing or changing backlink add-ons, marketplace Enterprise checkout, Stripe Express identity/bank onboarding, marketplace plan upgrades, the creation of the Google app password for the AI-Cited Lists mailbox and the AI-Cited Lists entry chat with image uploads still require the dashboard or a browser. If the user asks for something not present in `outrank-cli --help`, say that exact command surface is not shipped yet and do not invent unsupported commands.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "outrank-cli",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "mcpName": "so.outrank/outrank",
5
5
  "description": "Agent-first CLI and MCP server for the Outrank agent API",
6
6
  "type": "module",
@@ -12,8 +12,8 @@
12
12
  "LICENSE"
13
13
  ],
14
14
  "bin": {
15
- "outrank-cli": "./bin/outrank-cli.js",
16
- "outrank-mcp": "./bin/outrank-mcp.js"
15
+ "outrank-cli": "bin/outrank-cli.js",
16
+ "outrank-mcp": "bin/outrank-mcp.js"
17
17
  },
18
18
  "scripts": {
19
19
  "start": "node ./src/index.js",
@@ -135,11 +135,10 @@ const setupAiCitedListsText = (productId) =>
135
135
  '2. Top-up consent: read the terms with ai_cited_lists_top_up_consent_get, explain that a verified spot costs ' +
136
136
  'credits and that a short balance triggers a credit-pack purchase on the card on file, and call ' +
137
137
  'ai_cited_lists_top_up_consent_confirm only after the user agrees in their own words.',
138
- '3. Mailbox: ai_cited_lists_mailbox_connect returns a connect_url the user opens in a browser to allow sending ' +
139
- 'from their Google mailbox; poll ai_cited_lists_mailbox_poll with the attempt id until status is completed, ' +
140
- 'failed or expired. On failed, tell the user data.outcome; on either, follow the poll guidance (for ' +
141
- 'address_mismatch, they sign in with the pinned address; for access_lost, check ai_cited_lists_status) ' +
142
- 'before any fresh connect. Once completed, ' +
138
+ '3. Mailbox: ask the user for the Gmail or Google Workspace address and a Google app password created for it ' +
139
+ 'at https://myaccount.google.com/apppasswords, then call ai_cited_lists_mailbox_connect with the address and ' +
140
+ 'that app password; on an error, tell the user the error message. Never repeat the app password back. Once ' +
141
+ 'connected, ' +
143
142
  'ai_cited_lists_mailbox_get shows the four checks (connection, domain, reply filter, inbox test). Fix them ' +
144
143
  'with ai_cited_lists_mailbox_domain_check, ai_cited_lists_mailbox_filter_test (after the user created the ' +
145
144
  'Gmail forwarding filter) and ai_cited_lists_mailbox_inbox_test.',
@@ -274,17 +274,13 @@ export const TOOL_NOTES = Object.freeze({
274
274
  },
275
275
  'ai-cited-lists.mailbox.connect': {
276
276
  note:
277
- 'Admin-only and needs the top-up consent. Give connect_url to the user, then poll ai_cited_lists_mailbox_poll ' +
278
- 'with attempt_id until status is completed, failed or expired, then follow the poll agent_guidance: it ' +
279
- 'depends on data.outcome (address_mismatch: sign in with the pinned address; access_lost: check ' +
280
- 'ai_cited_lists_status first) and on data.mailbox.connected.',
281
- fields: {
282
- email:
283
- 'Google address to pin (optional): the consent screen pre-selects it and only that address can finish the ' +
284
- 'connection, so a leaked link cannot bind another mailbox.',
285
- },
277
+ 'Admin-only and needs the top-up consent. Ask the user for the Gmail or Google Workspace address and a Google ' +
278
+ 'app password created for it at https://myaccount.google.com/apppasswords (2-Step Verification must be on). ' +
279
+ 'The call checks the login with Google and connects at once; on an error, tell the user the error.message ' +
280
+ '(a regular password, a wrong app password, app passwords turned off by a Workspace admin, or too many ' +
281
+ 'attempts). Never repeat the app password back or keep it.',
282
+ body: 'Fields (all required): email, app_password.',
286
283
  },
287
- 'ai-cited-lists.mailbox.poll': { fields: { attemptId: 'attempt_id returned by ai_cited_lists_mailbox_connect.' } },
288
284
  'ai-cited-lists.mailbox.dkim-selector': {
289
285
  note: 'Pass exactly one of selector or reset.',
290
286
  fields: {
@@ -3,10 +3,7 @@ import { Surface } from '../core/context.js';
3
3
  import { usageError } from '../core/errors.js';
4
4
  import { bool, list, object, oneOf, string, uuid } from '../core/schema.js';
5
5
  import {
6
- ATTEMPT_ID_PLACEHOLDERS,
7
6
  PRODUCT_CLI,
8
- attemptIdInput,
9
- attemptIdQuery,
10
7
  productInput,
11
8
  productParams,
12
9
  productParamsWith,
@@ -15,6 +12,10 @@ import {
15
12
  import { BodyMode, CommandKind, Toolset, defineCommand, defineGroup } from './registry.js';
16
13
  import { subGroup } from './subGroup.js';
17
14
 
15
+ const MAILBOX_EMAIL_HINT = 'Gmail or Google Workspace address that sends the offers.';
16
+ const APP_PASSWORD_HINT =
17
+ 'Google app password created for that address at https://myaccount.google.com/apppasswords (16 letters; ' +
18
+ 'spaces are ignored). Never repeat it back or store it.';
18
19
  const SENDER_NAME_HINT = 'Name that signs the outreach emails.';
19
20
  const SENDER_TITLE_HINT = 'Job title under the signature.';
20
21
  const POSTAL_ADDRESS_HINT = 'Company postal address printed in every email (required by anti-spam law).';
@@ -27,6 +28,11 @@ const ENTRY_MODE_HINT = 'generated uses the entry Outrank wrote; custom uses cus
27
28
  const CUSTOM_ENTRY_HINT = 'Entry written by the customer; links may only point to the product site.';
28
29
  const CUSTOM_ENTRY_MARKDOWN_HINT = 'The entry text as markdown.';
29
30
 
31
+ const MAILBOX_CONNECT_BODY = object().shape({
32
+ email: string().required().describe(MAILBOX_EMAIL_HINT),
33
+ app_password: string().required().describe(APP_PASSWORD_HINT),
34
+ });
35
+
30
36
  const SETTINGS_BODY = object().shape({
31
37
  sender_name: string().describe(SENDER_NAME_HINT),
32
38
  sender_title: string().describe(SENDER_TITLE_HINT),
@@ -61,8 +67,7 @@ export const AI_CITED_LISTS_HELP = `Usage:
61
67
  outrank-cli ai-cited-lists settings get <product-id>
62
68
  outrank-cli ai-cited-lists settings update <product-id> --json <object>
63
69
  outrank-cli ai-cited-lists mailbox get <product-id>
64
- outrank-cli ai-cited-lists mailbox connect <product-id> [--email <address>]
65
- outrank-cli ai-cited-lists mailbox poll <product-id> --attempt-id <attempt-id>
70
+ outrank-cli ai-cited-lists mailbox connect <product-id> --json-stdin
66
71
  outrank-cli ai-cited-lists mailbox domain-check <product-id>
67
72
  outrank-cli ai-cited-lists mailbox inbox-test <product-id>
68
73
  outrank-cli ai-cited-lists mailbox filter-test <product-id>
@@ -85,7 +90,9 @@ Notes:
85
90
  the product (top-up-consent get shows the prices); a short balance is covered by an automatic credit-pack
86
91
  purchase that an organization admin confirms once with top-up-consent confirm. Sending needs a connected
87
92
  mailbox with four green checks, the sender details and that consent: status lists what is still missing.
88
- mailbox connect returns a connect_url the human opens in a browser; entry generate takes a few minutes.
93
+ mailbox connect takes {"email","app_password"}: the Google app password the human created at
94
+ https://myaccount.google.com/apppasswords. Pass it with --json-stdin so it stays out of the shell history.
95
+ entry generate takes a few minutes.
89
96
 
90
97
  Examples:
91
98
  outrank-cli ai-cited-lists status 00000000-0000-0000-0000-000000000000
@@ -93,8 +100,7 @@ Examples:
93
100
  outrank-cli ai-cited-lists lists skip 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000
94
101
  outrank-cli ai-cited-lists questions add 00000000-0000-0000-0000-000000000000 --question "What is the best privacy-friendly analytics tool?"
95
102
  outrank-cli ai-cited-lists settings update 00000000-0000-0000-0000-000000000000 --json '{"sender_name":"Ada Lovelace","sender_title":"Founder","postal_address":"1 Main St, Austin, TX 78701"}'
96
- outrank-cli ai-cited-lists mailbox connect 00000000-0000-0000-0000-000000000000 --email ada@acme.com
97
- outrank-cli ai-cited-lists mailbox poll 00000000-0000-0000-0000-000000000000 --attempt-id <attempt-id>
103
+ echo '{"email":"ada@acme.com","app_password":"abcd efgh ijkl mnop"}' | outrank-cli ai-cited-lists mailbox connect 00000000-0000-0000-0000-000000000000 --json-stdin
98
104
  outrank-cli ai-cited-lists top-up-consent confirm 00000000-0000-0000-0000-000000000000
99
105
  outrank-cli ai-cited-lists citations summary 00000000-0000-0000-0000-000000000000 --weeks 12
100
106
  `;
@@ -123,8 +129,7 @@ const SETTINGS_HELP = `Usage:
123
129
  `;
124
130
  const MAILBOX_HELP = `Usage:
125
131
  outrank-cli ai-cited-lists mailbox get <product-id>
126
- outrank-cli ai-cited-lists mailbox connect <product-id> [--email <address>]
127
- outrank-cli ai-cited-lists mailbox poll <product-id> --attempt-id <attempt-id>
132
+ outrank-cli ai-cited-lists mailbox connect <product-id> --json-stdin
128
133
  outrank-cli ai-cited-lists mailbox domain-check <product-id>
129
134
  outrank-cli ai-cited-lists mailbox inbox-test <product-id>
130
135
  outrank-cli ai-cited-lists mailbox filter-test <product-id>
@@ -157,7 +162,6 @@ const POLL_SETTINGS_GET = 'ai-cited-lists.settings.get';
157
162
  const QUESTION_REQUIRED = {
158
163
  guidance: 'Pass the buyer question as text, e.g. `--question "What is the best CRM?"`.',
159
164
  };
160
- const ATTEMPT_ID_GUIDANCE = 'Pass the attempt_id returned by `ai-cited-lists mailbox connect`.';
161
165
  const DKIM_SELECTOR_WORDING = Object.freeze({
162
166
  [Surface.CLI]: {
163
167
  message: 'Pass exactly one of --selector or --reset.',
@@ -482,7 +486,7 @@ const mailboxGet = defineCommand({
482
486
 
483
487
  const mailboxDisconnect = defineCommand({
484
488
  id: `${GROUP_ID}.mailbox.disconnect`,
485
- summary: 'Disconnect the Google mailbox and revoke its token.',
489
+ summary: 'Disconnect the Google mailbox and delete its stored app password.',
486
490
  kind: CommandKind.DESTRUCTIVE,
487
491
  toolsets: TOOLSETS,
488
492
  input: productInput(),
@@ -497,33 +501,20 @@ const mailboxDisconnect = defineCommand({
497
501
 
498
502
  const mailboxConnect = defineCommand({
499
503
  id: `${GROUP_ID}.mailbox.connect`,
500
- summary: 'Start the Google mailbox connection: returns a connect_url for the human and an attempt_id to poll.',
504
+ summary: 'Connect the Google mailbox that sends the offers with its address and a Google app password.',
501
505
  kind: CommandKind.WRITE,
502
506
  toolsets: TOOLSETS,
503
- input: { ...productInput(), email: string() },
504
- cli: { ...PRODUCT_CLI, placeholders: { email: '<address>' } },
507
+ input: productInput(),
508
+ cli: PRODUCT_CLI,
509
+ mcp: { sensitiveBody: true },
510
+ body: BodyMode.JSON,
511
+ bodyField: MAILBOX_CONNECT_BODY,
505
512
  run: (input, ctx) =>
506
513
  ctx.http({
507
514
  method: 'POST',
508
515
  path: `${BASE_PATH}/mailbox/connect`,
509
516
  pathParams: productParams(input),
510
- body: { email: input.email },
511
- }),
512
- });
513
-
514
- const mailboxPoll = defineCommand({
515
- id: `${GROUP_ID}.mailbox.poll`,
516
- summary: 'Poll a mailbox connection attempt until Google consent completed.',
517
- kind: CommandKind.READ,
518
- toolsets: TOOLSETS,
519
- input: { ...productInput(), ...attemptIdInput(ATTEMPT_ID_GUIDANCE) },
520
- cli: { ...PRODUCT_CLI, placeholders: ATTEMPT_ID_PLACEHOLDERS },
521
- run: (input, ctx) =>
522
- ctx.http({
523
- method: 'GET',
524
- path: `${BASE_PATH}/mailbox/connect`,
525
- pathParams: productParams(input),
526
- query: attemptIdQuery(input),
517
+ body: input.body,
527
518
  }),
528
519
  });
529
520
 
@@ -720,11 +711,10 @@ export const aiCitedListsGroup = defineGroup({
720
711
  subGroup({
721
712
  id: `${GROUP_ID}.mailbox`,
722
713
  usage: MAILBOX_HELP,
723
- actions: 'get|connect|poll|domain-check|inbox-test|filter-test|dkim-selector|disconnect',
714
+ actions: 'get|connect|domain-check|inbox-test|filter-test|dkim-selector|disconnect',
724
715
  children: [
725
716
  mailboxGet,
726
717
  mailboxConnect,
727
- mailboxPoll,
728
718
  mailboxDomainCheck,
729
719
  mailboxInboxTest,
730
720
  mailboxFilterTest,