lhremote 0.7.0 → 0.9.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.
Files changed (2) hide show
  1. package/README.md +346 -5
  2. package/package.json +3 -3
package/README.md CHANGED
@@ -20,10 +20,28 @@ lhremote lets AI assistants (Claude, etc.) control LinkedHelper through the [Mod
20
20
  - **Campaign automation** — create, configure, start, stop, and monitor campaigns with full action-chain management
21
21
  - **People import** — import LinkedIn profile URLs into campaign target lists
22
22
  - **Profile queries** — look up and search cached LinkedIn profiles from the local database
23
- - **Messaging** — query messaging history, check for new replies, scrape conversations from LinkedIn
23
+ - **Messaging** — send direct messages, InMails, and connection requests; query messaging history and check for replies
24
+ - **LinkedIn engagement** — visit profiles, endorse skills, follow/unfollow, like posts, comment, and react
25
+ - **Feed & post intelligence** — read the LinkedIn feed, search posts, get post details, engagement stats, and engager lists
26
+ - **Profile enrichment** — extract emails, phones, socials, and company data from LinkedIn profiles
27
+ - **LinkedIn search** — build search URLs, resolve entity IDs, and query reference data for search filters
28
+ - **Budget & throttle monitoring** — check daily action limits and LinkedIn throttling status
24
29
  - **Action discovery** — list available LinkedHelper action types with configuration schemas
25
30
 
26
- **New to lhremote?** Check out the [Getting Started guide](docs/getting-started.md) for a step-by-step walkthrough.
31
+ ## Quick Start
32
+
33
+ ```sh
34
+ npm install -g lhremote # or: npx lhremote --help
35
+ lhremote launch-app # start LinkedHelper with remote debugging
36
+ lhremote list-accounts # find your LinkedIn account ID
37
+ lhremote start-instance # start an instance (auto-selects single account)
38
+ lhremote campaign-create --file my-campaign.yaml # create a campaign
39
+ lhremote import-people-from-urls <campaignId> --urls "https://www.linkedin.com/in/..."
40
+ lhremote campaign-start <campaignId> --person-ids <id1,id2,...>
41
+ lhremote campaign-status <campaignId> # monitor progress
42
+ ```
43
+
44
+ > **Pacing**: LinkedIn monitors automated activity. See the [Rate Limiting guide](docs/rate-limiting.md) for recommended settings.
27
45
 
28
46
  ## Prerequisites
29
47
 
@@ -57,7 +75,7 @@ Add to your Claude Desktop configuration (`claude_desktop_config.json`):
57
75
  }
58
76
  ```
59
77
 
60
- Once configured, Claude can use all 44 tools directly. A typical workflow:
78
+ Once configured, Claude can use all 68 tools directly. A typical workflow:
61
79
 
62
80
  1. **`find-app`** — Detect a running LinkedHelper instance (or **`launch-app`** to start one)
63
81
  2. **`list-accounts`** — See available LinkedIn accounts
@@ -77,8 +95,8 @@ The `lhremote` command provides the same functionality as the MCP server. Every
77
95
 
78
96
  ```sh
79
97
  lhremote find-app [--json]
80
- lhremote launch-app [--cdp-port <port>] [--force]
81
- lhremote quit-app [--cdp-port <port>]
98
+ lhremote launch-app
99
+ lhremote quit-app
82
100
  ```
83
101
 
84
102
  ### Account & Instance
@@ -99,6 +117,7 @@ lhremote campaign-get <campaignId> [--cdp-port <port>] [--json]
99
117
  lhremote campaign-export <campaignId> [--format yaml|json] [--output <path>] [--cdp-port <port>]
100
118
  lhremote campaign-update <campaignId> [--name <name>] [--description <text>] [--clear-description] [--cdp-port <port>] [--json]
101
119
  lhremote campaign-delete <campaignId> [--cdp-port <port>] [--json]
120
+ lhremote campaign-erase <campaignId> [--cdp-port <port>] [--json]
102
121
  lhremote campaign-start <campaignId> --person-ids <ids> | --person-ids-file <path> [--cdp-port <port>] [--json]
103
122
  lhremote campaign-stop <campaignId> [--cdp-port <port>] [--json]
104
123
  lhremote campaign-status <campaignId> [--include-results] [--limit <n>] [--cdp-port <port>] [--json]
@@ -150,11 +169,48 @@ lhremote check-replies [--since <timestamp>] [--cdp-port <port>] [--json]
150
169
  lhremote scrape-messaging-history --person-ids <ids> | --person-ids-file <path> [--cdp-port <port>] [--json]
151
170
  ```
152
171
 
172
+ ### LinkedIn Actions
173
+
174
+ ```sh
175
+ lhremote visit-profile --person-id <id> | --url <url> [--extract-current-organizations] [--cdp-port <port>] [--json]
176
+ lhremote endorse-skills --person-id <id> | --url <url> [--skill-name <name>]... [--limit <n>] [--skip-if-not-endorsable] [--keep-campaign] [--cdp-port <port>] [--json]
177
+ lhremote enrich-profile --person-id <id> | --url <url> [--enrich-profile-info] [--enrich-phones] [--enrich-emails] [--enrich-socials] [--enrich-companies] [--keep-campaign] [--cdp-port <port>] [--json]
178
+ lhremote follow-person --person-id <id> | --url <url> [--mode <follow|unfollow>] [--skip-if-unfollowable] [--keep-campaign] [--cdp-port <port>] [--json]
179
+ lhremote like-person-posts --person-id <id> | --url <url> [--number-of-articles <n>] [--number-of-posts <n>] [--max-age-of-articles <days>] [--max-age-of-posts <days>] [--should-add-comment] [--message-template <json>] [--skip-if-not-liked] [--keep-campaign] [--cdp-port <port>] [--json]
180
+ lhremote message-person --person-id <id> | --url <url> --message-template <json> [--subject-template <json>] [--reject-if-replied] [--reject-if-messaged] [--keep-campaign] [--cdp-port <port>] [--json]
181
+ lhremote send-invite --person-id <id> | --url <url> [--message-template <json>] [--save-as-lead-sn] [--keep-campaign] [--cdp-port <port>] [--json]
182
+ lhremote send-inmail --person-id <id> | --url <url> --message-template <json> [--subject-template <json>] [--reject-if-replied] [--proceed-on-out-of-credits] [--keep-campaign] [--cdp-port <port>] [--json]
183
+ lhremote remove-connection --person-id <id> | --url <url> [--keep-campaign] [--cdp-port <port>] [--json]
184
+ ```
185
+
186
+ ### Feed & Posts
187
+
188
+ ```sh
189
+ lhremote get-feed [--count <n>] [--cursor <token>] [--cdp-port <port>] [--json]
190
+ lhremote get-post <postUrl> [--comment-count <n>] [--cdp-port <port>] [--json]
191
+ lhremote get-post-stats <postUrl> [--cdp-port <port>] [--json]
192
+ lhremote get-profile-activity <profile> [--count <n>] [--cursor <token>] [--cdp-port <port>] [--json]
193
+ lhremote search-posts <query> [--count <n>] [--cursor <n>] [--cdp-port <port>] [--json]
194
+ lhremote comment-on-post --url <url> --text <text> [--cdp-port <port>] [--json]
195
+ lhremote react-to-post <postUrl> [--type <like|celebrate|support|love|insightful|funny>] [--cdp-port <port>] [--json]
196
+ ```
197
+
198
+ ### LinkedIn Search & Reference
199
+
200
+ ```sh
201
+ lhremote build-url <sourceType> [--keywords <keywords>] [--current-company <id>]... [--past-company <id>]... [--geo <id>]... [--industry <id>]... [--school <id>]... [--network <code>]... [--profile-language <code>]... [--service-category <id>]... [--filter <spec>]... [--slug <slug>] [--id <id>] [--json]
202
+ lhremote resolve-entity <entityType> <query> [--limit <n>] [--cdp-port <port>] [--json]
203
+ lhremote list-reference-data <dataType> [--json]
204
+ ```
205
+
153
206
  ### Utilities
154
207
 
155
208
  ```sh
156
209
  lhremote describe-actions [--category <category>] [--type <type>] [--json]
157
210
  lhremote get-errors [--cdp-port <port>] [--json]
211
+ lhremote dismiss-errors [--cdp-port <port>] [--json]
212
+ lhremote get-action-budget [--cdp-port <port>] [--json]
213
+ lhremote get-throttle-status [--cdp-port <port>] [--json]
158
214
  ```
159
215
 
160
216
  ## MCP Tools
@@ -292,6 +348,15 @@ Delete (archive) a campaign.
292
348
  | `campaignId` | number | Yes | — | Campaign ID |
293
349
  | `cdpPort` | number | No | 9222 | CDP port |
294
350
 
351
+ #### `campaign-erase`
352
+
353
+ Permanently erase a campaign and all related data from the database. This is irreversible — unlike `campaign-delete` (which archives), this removes all campaign data permanently.
354
+
355
+ | Parameter | Type | Required | Default | Description |
356
+ |-----------|------|----------|---------|-------------|
357
+ | `campaignId` | number | Yes | — | Campaign ID |
358
+ | `cdpPort` | number | No | 9222 | CDP port |
359
+
295
360
  #### `campaign-start`
296
361
 
297
362
  Start a campaign with specified target persons. Returns immediately (async execution).
@@ -609,6 +674,258 @@ Scrape messaging history from LinkedIn for specified people into the local datab
609
674
  | `personIds` | number[] | Yes | — | Person IDs whose messaging history should be scraped |
610
675
  | `cdpPort` | number | No | 9222 | CDP port |
611
676
 
677
+ ### LinkedIn Actions
678
+
679
+ #### `visit-profile`
680
+
681
+ Visit a LinkedIn profile via LinkedHelper's VisitAndExtract action and return the extracted profile data. Deducts from the daily action budget.
682
+
683
+ | Parameter | Type | Required | Default | Description |
684
+ |-----------|------|----------|---------|-------------|
685
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
686
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
687
+ | `extractCurrentOrganizations` | boolean | No | false | Extract current company info during visit |
688
+ | `cdpPort` | number | No | 9222 | CDP port |
689
+
690
+ #### `endorse-skills`
691
+
692
+ Endorse skills on a LinkedIn profile via an ephemeral campaign. Deducts from the daily action budget.
693
+
694
+ | Parameter | Type | Required | Default | Description |
695
+ |-----------|------|----------|---------|-------------|
696
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
697
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
698
+ | `skillNames` | string[] | No | — | Specific skill names to endorse (mutually exclusive with `limit`) |
699
+ | `limit` | number | No | — | Max number of skills to endorse (mutually exclusive with `skillNames`) |
700
+ | `skipIfNotEndorsable` | boolean | No | true | Skip if person has no endorsable skills |
701
+ | `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
702
+ | `cdpPort` | number | No | 9222 | CDP port |
703
+
704
+ #### `enrich-profile`
705
+
706
+ Enrich a LinkedIn profile by extracting additional data (emails, phones, socials, company info) via an ephemeral campaign. Deducts from the daily action budget.
707
+
708
+ | Parameter | Type | Required | Default | Description |
709
+ |-----------|------|----------|---------|-------------|
710
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
711
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
712
+ | `profileInfo` | object | No | — | Enrich profile info (`shouldEnrich` required) |
713
+ | `phones` | object | No | — | Enrich phone numbers (`shouldEnrich` required) |
714
+ | `emails` | object | No | — | Enrich email addresses (`shouldEnrich` required) |
715
+ | `socials` | object | No | — | Enrich social profiles (`shouldEnrich` required) |
716
+ | `companies` | object | No | — | Enrich company data (`shouldEnrich` required) |
717
+ | `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
718
+ | `cdpPort` | number | No | 9222 | CDP port |
719
+
720
+ #### `follow-person`
721
+
722
+ Follow or unfollow a LinkedIn profile via an ephemeral campaign. Deducts from the daily action budget.
723
+
724
+ | Parameter | Type | Required | Default | Description |
725
+ |-----------|------|----------|---------|-------------|
726
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
727
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
728
+ | `mode` | string | No | `follow` | `follow` or `unfollow` |
729
+ | `skipIfUnfollowable` | boolean | No | true | Skip if person cannot be unfollowed |
730
+ | `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
731
+ | `cdpPort` | number | No | 9222 | CDP port |
732
+
733
+ #### `like-person-posts`
734
+
735
+ Like and optionally comment on posts and articles by a LinkedIn profile via an ephemeral campaign. Deducts from the daily action budget.
736
+
737
+ | Parameter | Type | Required | Default | Description |
738
+ |-----------|------|----------|---------|-------------|
739
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
740
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
741
+ | `numberOfArticles` | number | No | — | Number of articles to like |
742
+ | `numberOfPosts` | number | No | — | Number of posts to like |
743
+ | `maxAgeOfArticles` | number | No | — | Maximum age of articles in days |
744
+ | `maxAgeOfPosts` | number | No | — | Maximum age of posts in days |
745
+ | `shouldAddComment` | boolean | No | false | Also add a comment to liked posts/articles |
746
+ | `messageTemplate` | string | No | — | Comment text template as JSON (required when `shouldAddComment` is true) |
747
+ | `skipIfNotLiked` | boolean | No | true | Skip if nothing was liked |
748
+ | `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
749
+ | `cdpPort` | number | No | 9222 | CDP port |
750
+
751
+ #### `message-person`
752
+
753
+ Send a direct message to a 1st-degree LinkedIn connection via an ephemeral campaign. Deducts from the daily action budget.
754
+
755
+ | Parameter | Type | Required | Default | Description |
756
+ |-----------|------|----------|---------|-------------|
757
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
758
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
759
+ | `messageTemplate` | string | Yes | — | Message template as JSON |
760
+ | `subjectTemplate` | string | No | — | Subject line template as JSON |
761
+ | `rejectIfReplied` | boolean | No | false | Skip if person already replied |
762
+ | `rejectIfMessaged` | boolean | No | false | Skip if already messaged |
763
+ | `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
764
+ | `cdpPort` | number | No | 9222 | CDP port |
765
+
766
+ #### `send-invite`
767
+
768
+ Send a LinkedIn connection request via an ephemeral campaign. Deducts from the daily action budget.
769
+
770
+ | Parameter | Type | Required | Default | Description |
771
+ |-----------|------|----------|---------|-------------|
772
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
773
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
774
+ | `messageTemplate` | string | No | — | Invitation message template as JSON (empty for no message) |
775
+ | `saveAsLeadSN` | boolean | No | false | Save as lead in Sales Navigator |
776
+ | `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
777
+ | `cdpPort` | number | No | 9222 | CDP port |
778
+
779
+ #### `send-inmail`
780
+
781
+ Send an InMail message to a LinkedIn member (no connection required) via an ephemeral campaign. Deducts from the daily action budget.
782
+
783
+ | Parameter | Type | Required | Default | Description |
784
+ |-----------|------|----------|---------|-------------|
785
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
786
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
787
+ | `messageTemplate` | string | Yes | — | InMail body template as JSON |
788
+ | `subjectTemplate` | string | No | — | InMail subject line template as JSON |
789
+ | `rejectIfReplied` | boolean | No | false | Skip if person already replied |
790
+ | `proceedOnOutOfCredits` | boolean | No | false | Continue even when InMail credits are exhausted |
791
+ | `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
792
+ | `cdpPort` | number | No | 9222 | CDP port |
793
+
794
+ #### `remove-connection`
795
+
796
+ Remove a person from 1st-degree LinkedIn connections (unfriend) via an ephemeral campaign. Deducts from the daily action budget.
797
+
798
+ | Parameter | Type | Required | Default | Description |
799
+ |-----------|------|----------|---------|-------------|
800
+ | `personId` | number | No | — | Internal person ID (provide this or `url`) |
801
+ | `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
802
+ | `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
803
+ | `cdpPort` | number | No | 9222 | CDP port |
804
+
805
+ ### Feed & Posts
806
+
807
+ #### `get-feed`
808
+
809
+ Read the LinkedIn home feed. Returns structured post data with cursor-based pagination.
810
+
811
+ | Parameter | Type | Required | Default | Description |
812
+ |-----------|------|----------|---------|-------------|
813
+ | `count` | number | No | 10 | Number of posts per page |
814
+ | `cursor` | string | No | — | Cursor token from a previous call for the next page |
815
+ | `cdpPort` | number | No | 9222 | CDP port |
816
+
817
+ #### `get-post`
818
+
819
+ Get detailed data for a single LinkedIn post including its comment thread.
820
+
821
+ | Parameter | Type | Required | Default | Description |
822
+ |-----------|------|----------|---------|-------------|
823
+ | `postUrl` | string | Yes | — | LinkedIn post URL or URN |
824
+ | `commentCount` | number | No | 100 | Maximum number of comments to load (0 to skip) |
825
+ | `cdpPort` | number | No | 9222 | CDP port |
826
+
827
+ #### `get-post-stats`
828
+
829
+ Get engagement statistics for a LinkedIn post: reaction count (broken down by type), comment count, and share count.
830
+
831
+ | Parameter | Type | Required | Default | Description |
832
+ |-----------|------|----------|---------|-------------|
833
+ | `postUrl` | string | Yes | — | LinkedIn post URL or URN |
834
+ | `cdpPort` | number | No | 9222 | CDP port |
835
+
836
+ #### `get-post-engagers`
837
+
838
+ List people who engaged with a LinkedIn post (reacted, etc.) with their profile info and engagement type. Supports pagination. *MCP tool only — no CLI command.*
839
+
840
+ | Parameter | Type | Required | Default | Description |
841
+ |-----------|------|----------|---------|-------------|
842
+ | `postUrl` | string | Yes | — | LinkedIn post URL or URN |
843
+ | `start` | number | No | 0 | Pagination offset |
844
+ | `count` | number | No | 20 | Number of engagers per page |
845
+ | `cdpPort` | number | No | 9222 | CDP port |
846
+
847
+ #### `get-profile-activity`
848
+
849
+ Get recent posts/activity from a LinkedIn profile with cursor-based pagination.
850
+
851
+ | Parameter | Type | Required | Default | Description |
852
+ |-----------|------|----------|---------|-------------|
853
+ | `profile` | string | Yes | — | LinkedIn profile public ID or URL |
854
+ | `count` | number | No | 10 | Number of posts per page |
855
+ | `cursor` | string | No | — | Cursor token from a previous call for the next page |
856
+ | `cdpPort` | number | No | 9222 | CDP port |
857
+
858
+ #### `search-posts`
859
+
860
+ Search LinkedIn for posts by keyword or hashtag. Returns structured post data with cursor-based pagination.
861
+
862
+ | Parameter | Type | Required | Default | Description |
863
+ |-----------|------|----------|---------|-------------|
864
+ | `query` | string | Yes | — | Search query — keywords or hashtag |
865
+ | `count` | number | No | 10 | Number of results per page |
866
+ | `cursor` | number | No | — | Index-based cursor from a previous call for the next page |
867
+ | `cdpPort` | number | No | 9222 | CDP port |
868
+
869
+ #### `comment-on-post`
870
+
871
+ Post a comment on a LinkedIn post. Checks action budget before attempting.
872
+
873
+ | Parameter | Type | Required | Default | Description |
874
+ |-----------|------|----------|---------|-------------|
875
+ | `postUrl` | string | Yes | — | LinkedIn post URL |
876
+ | `text` | string | Yes | — | Comment text to post |
877
+ | `cdpPort` | number | No | 9222 | CDP port |
878
+
879
+ #### `react-to-post`
880
+
881
+ React to a LinkedIn post with a specific reaction type.
882
+
883
+ | Parameter | Type | Required | Default | Description |
884
+ |-----------|------|----------|---------|-------------|
885
+ | `postUrl` | string | Yes | — | LinkedIn post URL |
886
+ | `reactionType` | string | No | `like` | `like`, `celebrate`, `support`, `love`, `insightful`, or `funny` |
887
+ | `cdpPort` | number | No | 9222 | CDP port |
888
+
889
+ ### LinkedIn Search & Reference
890
+
891
+ #### `build-linkedin-url`
892
+
893
+ Build a LinkedIn URL for any supported source type. Supports SearchPage (basic search with faceted filters), SNSearchPage (Sales Navigator), and parameterised templates for company, school, group, and event pages. CLI command: `build-url`.
894
+
895
+ | Parameter | Type | Required | Default | Description |
896
+ |-----------|------|----------|---------|-------------|
897
+ | `sourceType` | string | Yes | — | LinkedIn source type (e.g., `SearchPage`, `SNSearchPage`, `OrganizationPeople`) |
898
+ | `keywords` | string | No | — | Search keywords |
899
+ | `currentCompany` | string[] | No | — | Current company IDs (SearchPage) |
900
+ | `pastCompany` | string[] | No | — | Past company IDs (SearchPage) |
901
+ | `geoUrn` | string[] | No | — | Geographic URN IDs (SearchPage) |
902
+ | `industry` | string[] | No | — | Industry IDs (SearchPage) |
903
+ | `school` | string[] | No | — | School IDs (SearchPage) |
904
+ | `network` | string[] | No | — | Connection degree codes: `F`, `S`, `O` (SearchPage) |
905
+ | `profileLanguage` | string[] | No | — | Profile language codes (SearchPage) |
906
+ | `serviceCategory` | string[] | No | — | Service category IDs (SearchPage) |
907
+ | `filters` | object[] | No | — | Sales Navigator filters (SNSearchPage) — each with `type`, `values[]` |
908
+ | `slug` | string | No | — | Company or school slug (OrganizationPeople, Alumni) |
909
+ | `id` | string | No | — | Entity ID (Group, Event, SNListPage, etc.) |
910
+
911
+ #### `resolve-linkedin-entity`
912
+
913
+ Resolve human-readable names (company names, locations, schools) to LinkedIn entity IDs via typeahead endpoints. CLI command: `resolve-entity`.
914
+
915
+ | Parameter | Type | Required | Default | Description |
916
+ |-----------|------|----------|---------|-------------|
917
+ | `query` | string | Yes | — | Search query (e.g., company name, city) |
918
+ | `entityType` | string | Yes | — | `COMPANY`, `GEO`, or `SCHOOL` |
919
+ | `cdpPort` | number | No | 9222 | CDP port |
920
+
921
+ #### `list-linkedin-reference-data`
922
+
923
+ List LinkedIn reference data for finite enumerations (industries, seniority levels, functions, company sizes, connection degrees, profile languages). Use this to discover valid IDs for search filters. CLI command: `list-reference-data`.
924
+
925
+ | Parameter | Type | Required | Default | Description |
926
+ |-----------|------|----------|---------|-------------|
927
+ | `dataType` | string | Yes | — | `INDUSTRY`, `SENIORITY`, `FUNCTION`, `COMPANY_SIZE`, `CONNECTION_DEGREE`, or `PROFILE_LANGUAGE` |
928
+
612
929
  ### Utilities
613
930
 
614
931
  #### `describe-actions`
@@ -628,6 +945,30 @@ Query current LinkedHelper UI errors, dialogs, and blocking popups.
628
945
  |-----------|------|----------|---------|-------------|
629
946
  | `cdpPort` | number | No | 9222 | CDP port |
630
947
 
948
+ #### `dismiss-errors`
949
+
950
+ Dismiss closable error popups in the LinkedHelper instance UI by clicking their close/OK buttons. Recommended after `UIBlockedError`.
951
+
952
+ | Parameter | Type | Required | Default | Description |
953
+ |-----------|------|----------|---------|-------------|
954
+ | `cdpPort` | number | No | 9222 | CDP port |
955
+
956
+ #### `get-action-budget`
957
+
958
+ Get daily action budget showing limit types, thresholds, and today's usage from LH campaigns and CDP-direct actions.
959
+
960
+ | Parameter | Type | Required | Default | Description |
961
+ |-----------|------|----------|---------|-------------|
962
+ | `cdpPort` | number | No | 9222 | CDP port |
963
+
964
+ #### `get-throttle-status`
965
+
966
+ Check if LinkedIn is currently throttling the account.
967
+
968
+ | Parameter | Type | Required | Default | Description |
969
+ |-----------|------|----------|---------|-------------|
970
+ | `cdpPort` | number | No | 9222 | CDP port |
971
+
631
972
  ## Known Limitations
632
973
 
633
974
  - **Platform support**: LinkedHelper runs on macOS, Windows, and Linux. Binary paths are detected automatically but can be overridden with the `LINKEDHELPER_PATH` environment variable.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lhremote",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "LinkedHelper automation toolkit — CLI & MCP server",
5
5
  "type": "module",
6
6
  "engines": {
@@ -37,8 +37,8 @@
37
37
  "dist"
38
38
  ],
39
39
  "dependencies": {
40
- "@lhremote/cli": "^0.7.0",
41
- "@lhremote/mcp": "^0.7.0"
40
+ "@lhremote/cli": "^0.9.0",
41
+ "@lhremote/mcp": "^0.9.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^25",