x-developer 2.4.1 → 2.4.4

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 (50) hide show
  1. package/openclaw.plugin.json +1 -1
  2. package/package.json +5 -1
  3. package/skills/check-mutuals/SKILL.md +50 -0
  4. package/skills/clean-followers/SKILL.md +66 -0
  5. package/skills/export-tweets-csv/SKILL.md +65 -0
  6. package/skills/extract-followers/SKILL.md +78 -0
  7. package/skills/find-bangers/SKILL.md +56 -0
  8. package/skills/find-influencers/SKILL.md +67 -0
  9. package/skills/find-viral-tweets/SKILL.md +75 -0
  10. package/skills/follow-unfollow/SKILL.md +79 -0
  11. package/skills/for-you-feed/SKILL.md +57 -0
  12. package/skills/going-viral/SKILL.md +64 -0
  13. package/skills/grow-followers/SKILL.md +61 -0
  14. package/skills/monitor-accounts/SKILL.md +77 -0
  15. package/skills/optimize-tweets/SKILL.md +73 -0
  16. package/skills/post-tweets/SKILL.md +105 -0
  17. package/skills/run-giveaway/SKILL.md +88 -0
  18. package/skills/search-tweets/SKILL.md +119 -0
  19. package/skills/send-dms/SKILL.md +88 -0
  20. package/skills/top-replies/SKILL.md +66 -0
  21. package/skills/track-competitors/SKILL.md +67 -0
  22. package/skills/track-hashtags/SKILL.md +81 -0
  23. package/skills/track-mentions/SKILL.md +83 -0
  24. package/skills/trending-news/SKILL.md +63 -0
  25. package/skills/tweet-analytics/SKILL.md +131 -0
  26. package/skills/tweet-ideas/SKILL.md +59 -0
  27. package/skills/tweet-replies/SKILL.md +77 -0
  28. package/skills/tweet-style/SKILL.md +68 -0
  29. package/skills/tweet-webhooks/SKILL.md +79 -0
  30. package/skills/update-x-profile/SKILL.md +71 -0
  31. package/skills/user-tweets/SKILL.md +125 -0
  32. package/skills/who-liked/SKILL.md +63 -0
  33. package/skills/who-quoted/SKILL.md +63 -0
  34. package/skills/who-retweeted/SKILL.md +62 -0
  35. package/skills/write-threads/SKILL.md +69 -0
  36. package/skills/write-tweets/SKILL.md +75 -0
  37. package/skills/x-articles/SKILL.md +79 -0
  38. package/skills/x-bookmarks/SKILL.md +57 -0
  39. package/skills/x-communities/SKILL.md +66 -0
  40. package/skills/x-lists/SKILL.md +65 -0
  41. package/skills/x-spaces/SKILL.md +62 -0
  42. package/skills/x-trends/SKILL.md +67 -0
  43. package/skills/x-twitter-scraper/SKILL.md +65 -52
  44. package/skills/x-twitter-scraper/metadata.json +1 -1
  45. package/skills/x-twitter-scraper/references/api-endpoints.md +4 -40
  46. package/skills/x-twitter-scraper/references/mcp-setup.md +14 -7
  47. package/skills/x-twitter-scraper/references/python-examples.md +0 -2
  48. package/skills/x-twitter-scraper/references/types.md +4 -25
  49. package/skills/x-twitter-scraper/references/webhooks.md +2 -2
  50. package/skills/x-twitter-scraper/references/workflows.md +2 -2
@@ -124,7 +124,7 @@ POST /monitors
124
124
  }
125
125
  ```
126
126
 
127
- Event types: `tweet.new`, `tweet.quote`, `tweet.reply`, `tweet.retweet`, `follower.gained`, `follower.lost`.
127
+ Event types: `tweet.new`, `tweet.quote`, `tweet.reply`, `tweet.retweet`, `webhook.test`.
128
128
 
129
129
  Returns `409 monitor_already_exists` if the username is already monitored.
130
130
 
@@ -1046,6 +1046,8 @@ Returns a checkout URL for subscribing or managing the subscription. If already
1046
1046
 
1047
1047
  Manage connected X accounts for write actions. All endpoints are free (no usage cost).
1048
1048
 
1049
+ **Connecting or re-authenticating an X account is done by the user in the Xquik dashboard** at [xquik.com/dashboard/account](https://xquik.com/dashboard/account), not via this skill. The skill never handles X login credentials. The agent should direct the user to the dashboard when a new account needs to be connected or an existing session needs to be refreshed.
1050
+
1049
1051
  ### List X Accounts
1050
1052
 
1051
1053
  ```
@@ -1054,28 +1056,6 @@ GET /x/accounts
1054
1056
 
1055
1057
  Returns all connected X accounts. Response: `{ accounts: [{ id, username, displayName, isActive, createdAt }] }`.
1056
1058
 
1057
- ### Connect X Account
1058
-
1059
- ```
1060
- POST /x/accounts
1061
- ```
1062
-
1063
- **Body:**
1064
-
1065
- | Field | Type | Required | Description |
1066
- |-------|------|----------|-------------|
1067
- | `username` | string | Yes | X username (`@` auto-stripped) |
1068
- | `email` | string | Yes | Email associated with the X account |
1069
- | `password` | string | Yes | Account password (encrypted at rest) |
1070
- | `totp_secret` | string | No | TOTP base32 secret for 2FA accounts |
1071
- | `proxy_country` | string | No | Preferred proxy region (e.g. `"US"`, `"TR"`) |
1072
-
1073
- **Response (201):** `{ id, username, isActive, createdAt }`
1074
-
1075
- **Errors:** `409 account_already_connected`, `422 login_failed`
1076
-
1077
- **Security:** This is a credential proxy endpoint. The agent transmits the user's X credentials to Xquik over HTTPS for session establishment. Credentials are encrypted at rest and never returned in responses. Before calling: (1) confirm with the user that they want to connect this account, (2) show which fields will be sent, (3) never log or retain credentials after the call.
1078
-
1079
1059
  ### Get X Account
1080
1060
 
1081
1061
  ```
@@ -1090,23 +1070,7 @@ Returns `{ id, username, displayName, isActive, createdAt }`.
1090
1070
  DELETE /x/accounts/{id}
1091
1071
  ```
1092
1072
 
1093
- Permanently removes the account and deletes stored credentials. Returns `{ success: true }`.
1094
-
1095
- ### Re-authenticate X Account
1096
-
1097
- ```
1098
- POST /x/accounts/{id}/reauth
1099
- ```
1100
-
1101
- Use when a session expires or X requires re-verification.
1102
-
1103
- **Body:** `{ "password": "...", "totp_secret": "..." }` (password required, totp_secret optional)
1104
-
1105
- **Response:** `{ success: true }`
1106
-
1107
- **Errors:** `422 reauth_failed`
1108
-
1109
- **Security:** Same credential proxy rules as POST /x/accounts — confirm with user, never log or retain credentials.
1073
+ Permanently removes the account from Xquik. Returns `{ success: true }`. Before calling, confirm with the user.
1110
1074
 
1111
1075
  ---
1112
1076
 
@@ -8,7 +8,7 @@ Connect AI agents and IDEs to Xquik via the Model Context Protocol. The MCP serv
8
8
  | Endpoint | `https://xquik.com/mcp` |
9
9
  | Auth header | `x-api-key` |
10
10
 
11
- > **Security:** Use a scoped, revocable API key — not your primary account key. Where your platform supports environment variable interpolation (e.g., `${XQUIK_API_KEY}`), prefer that over hardcoding. Rotate keys periodically from the [dashboard](https://dashboard.xquik.com/account). Never commit API keys to version control.
11
+ > **Security:** Use a scoped, revocable API key - not your primary account key. Where your platform supports environment variable interpolation (e.g., `${XQUIK_API_KEY}`), prefer that over hardcoding. Rotate keys periodically from the [dashboard](https://dashboard.xquik.com/account). Never commit API keys to version control.
12
12
 
13
13
  ## Claude.ai (Web)
14
14
 
@@ -16,19 +16,24 @@ Claude.ai supports MCP connectors natively via OAuth. Add Xquik as a connector f
16
16
 
17
17
  ## Claude Desktop
18
18
 
19
- Claude Desktop only supports stdio transport. Use `mcp-remote` as a bridge (requires [Node.js](https://nodejs.org)).
19
+ Claude Desktop only supports stdio transport, so it needs a local stdio-to-HTTP bridge. The recommended setup avoids runtime package fetches: **install the bridge globally first, then invoke the pinned binary directly.**
20
20
 
21
- > **About `mcp-remote`:** [`mcp-remote`](https://www.npmjs.com/package/mcp-remote) is an open-source stdio-to-HTTP bridge maintained by the MCP ecosystem (MIT license, [source on GitHub](https://github.com/geelen/mcp-remote)). It translates Claude Desktop's stdio transport to StreamableHTTP — it does not execute arbitrary code, access your filesystem, or modify your system. The version is pinned (`@0.1.38`) to prevent supply-chain drift. If you prefer not to use `npx`, install it globally first: `npm install -g mcp-remote@0.1.38`, then replace `"command": "npx"` with `"command": "mcp-remote"` and remove the version from args.
21
+ > **About `mcp-remote`:** [`mcp-remote`](https://www.npmjs.com/package/mcp-remote) is an open-source stdio-to-HTTP bridge (MIT license, [source on GitHub](https://github.com/geelen/mcp-remote)) maintained by the MCP ecosystem. It translates stdio to StreamableHTTP - it does not execute arbitrary code, access your filesystem, or modify your system. Always pin the version (`@0.1.38`) and audit the package on npm before installing.
22
22
 
23
- Add to `claude_desktop_config.json`:
23
+ ### Step 1: Install the bridge globally (one-time, audited)
24
+
25
+ ```bash
26
+ npm install -g mcp-remote@0.1.38
27
+ ```
28
+
29
+ ### Step 2: Add to `claude_desktop_config.json`
24
30
 
25
31
  ```json
26
32
  {
27
33
  "mcpServers": {
28
34
  "xquik": {
29
- "command": "npx",
35
+ "command": "mcp-remote",
30
36
  "args": [
31
- "mcp-remote@0.1.38",
32
37
  "https://xquik.com/mcp",
33
38
  "--header",
34
39
  "x-api-key:${XQUIK_API_KEY}"
@@ -38,7 +43,9 @@ Add to `claude_desktop_config.json`:
38
43
  }
39
44
  ```
40
45
 
41
- > Replace `${XQUIK_API_KEY}` with your actual API key, or set the environment variable before launching Claude Desktop.
46
+ > Set the `XQUIK_API_KEY` environment variable before launching Claude Desktop, or replace `${XQUIK_API_KEY}` with your actual API key.
47
+
48
+ > **Prefer a hosted option?** Claude.ai (web) supports Xquik natively via OAuth - see the section above. No local bridge required.
42
49
 
43
50
  ## Claude Code
44
51
 
@@ -126,8 +126,6 @@ EVENT_HANDLERS = {
126
126
  "tweet.reply": lambda u, d: print(f"Reply from @{u}: {d['text']}"),
127
127
  "tweet.quote": lambda u, d: print(f"Quote from @{u}: {d['text']}"),
128
128
  "tweet.retweet": lambda u, d: print(f"Retweet by @{u}"),
129
- "follower.gained": lambda u, d: print(f"@{u} gained follower: @{d['followerUsername']}"),
130
- "follower.lost": lambda u, d: print(f"@{u} lost follower: @{d['followerUsername']}"),
131
129
  }
132
130
 
133
131
  @app.route("/webhook", methods=["POST"])
@@ -81,9 +81,7 @@ type EventType =
81
81
  | "tweet.new"
82
82
  | "tweet.quote"
83
83
  | "tweet.reply"
84
- | "tweet.retweet"
85
- | "follower.gained"
86
- | "follower.lost";
84
+ | "tweet.retweet";
87
85
 
88
86
  // ─── Events ──────────────────────────────────────────────
89
87
 
@@ -117,16 +115,7 @@ interface TweetEventData {
117
115
  retweetedUsername?: string;
118
116
  }
119
117
 
120
- // Follower events (follower.gained, follower.lost)
121
- interface FollowerEventData {
122
- followerId: string;
123
- followerUsername: string;
124
- followerName: string;
125
- followerFollowersCount: number;
126
- followerVerified: boolean;
127
- }
128
-
129
- type EventData = TweetEventData | FollowerEventData;
118
+ type EventData = TweetEventData;
130
119
 
131
120
  interface EventList {
132
121
  events: Event[];
@@ -965,18 +954,8 @@ interface ConnectedXAccount {
965
954
  createdAt: string; // ISO 8601 timestamp
966
955
  }
967
956
 
968
- interface ConnectXAccountRequest {
969
- username: string; // X username (@ auto-stripped)
970
- email: string; // Email associated with X account
971
- password: string; // Password (encrypted at rest)
972
- totp_secret?: string; // TOTP base32 secret for 2FA accounts
973
- proxy_country?: string; // Preferred proxy region (e.g. "US")
974
- }
975
-
976
- interface ReauthXAccountRequest {
977
- password: string; // Current password
978
- totp_secret?: string; // TOTP secret if 2FA enabled
979
- }
957
+ // Connecting an X account is done by the user in the Xquik dashboard,
958
+ // not through this skill. The skill never handles X login credentials.
980
959
 
981
960
  // ─── X Write ──────────────────────────────────────────
982
961
 
@@ -60,8 +60,8 @@ app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
60
60
  case "tweet.reply":
61
61
  console.log(`Reply from @${event.username}: ${event.data.text}`);
62
62
  break;
63
- case "follower.gained":
64
- console.log(`@${event.username} gained a follower`);
63
+ case "tweet.retweet":
64
+ console.log(`@${event.username} retweeted`);
65
65
  break;
66
66
  }
67
67
 
@@ -131,7 +131,7 @@ const monitor = await xquikFetch("/monitors", {
131
131
  method: "POST",
132
132
  body: JSON.stringify({
133
133
  username: "elonmusk",
134
- eventTypes: ["tweet.new", "tweet.reply", "tweet.quote", "follower.gained"],
134
+ eventTypes: ["tweet.new", "tweet.reply", "tweet.quote", "tweet.retweet"],
135
135
  }),
136
136
  });
137
137
 
@@ -149,7 +149,7 @@ const webhook = await xquikFetch("/webhooks", {
149
149
  const events = await xquikFetch("/events?monitorId=7&limit=50");
150
150
  ```
151
151
 
152
- Event types: `tweet.new`, `tweet.quote`, `tweet.reply`, `tweet.retweet`, `follower.gained`, `follower.lost`.
152
+ Event types: `tweet.new`, `tweet.quote`, `tweet.reply`, `tweet.retweet`, `webhook.test`.
153
153
 
154
154
  ## Endpoint Guide
155
155