@twitterapis/mcp 0.11.0 → 0.11.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/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.1 (2026-09-13)
4
+
5
+ ### Fixed
6
+ - `twitter_update_profile`: an empty string CLEARS a field. The tool description said
7
+ the opposite, and 0.11.0 shipped that to npm. It was true of the API when written
8
+ and stopped being true when the handler was fixed the same day.
9
+
10
+ ### Notes
11
+ - A PATCH, not a minor: the catalog is unchanged at 107 tools, 65 reads and 42 writes.
12
+ Only description text moves, which `scripts/prepublish-version-class.mjs` confirms.
13
+ - The claim is now verified the only way that works on this endpoint: by sending a
14
+ value that CHANGES and reading the profile back. The previous check used a
15
+ byte-for-byte no-op, which is the one test that cannot fail, since the profile looks
16
+ identical whether the write applied or was silently dropped.
17
+ - Why it matters that this was wrong rather than merely vague: the old text told a
18
+ model that `description: ""` was a harmless no-op. After the handler fix, that exact
19
+ call blanks the field. A description that is confidently wrong about a destructive
20
+ operation is worse than one that says nothing.
21
+ - Separately, writes to this endpoint are sometimes accepted upstream and sometimes
22
+ refused, and only some refusals are classified honestly. That is a defect under
23
+ repair on the API side, not part of this tool's contract, so it is deliberately not
24
+ written into the description.
25
+
3
26
  ## 0.11.0 (2026-09-13)
4
27
 
5
28
  ### Added
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@twitterapis/mcp",
3
3
  "mcpName": "io.github.TwitterAPIs/twitterapis-mcp",
4
- "version": "0.11.0",
4
+ "version": "0.11.1",
5
5
  "description": "Official MCP server for twitterapis.com, the Twitter/X API (search, users, followers, tweets, threads, lists, likes, bookmarks, DMs) plus write actions (post/like/retweet/follow) as native tools for Claude, Cursor, and any MCP client.",
6
6
  "repository": {
7
7
  "type": "git",
package/src/tools.js CHANGED
@@ -1168,16 +1168,16 @@ export const TOOLS = [
1168
1168
  write: true,
1169
1169
  jsonBody: true,
1170
1170
  description:
1171
- "Change the display name, bio, location or link on your authenticated account's own X profile. This is a PARTIAL update: send only the fields you want to change and everything you omit keeps its current value, so passing just a name will NOT wipe the bio. An empty string does NOT clear a field: the API trims it and treats it exactly like an omitted field, so there is currently no way to blank a bio or a location through this tool. At least one of name, description, location or url is required, and a request whose only values are empty strings is refused with that same 400. It writes a real profile and takes effect immediately with no undo, so read the current values with twitter_user_info first if you may need to restore them. Requires an authenticated session behind your key. Returns ok and updated_fields, which echoes the field names you SENT rather than a diff against the previous profile.",
1171
+ "Change the display name, bio, location or link on your authenticated account's own X profile. This is a PARTIAL update: send only the fields you want to change and everything you omit keeps its current value, so passing just a name will NOT wipe the bio. An empty string CLEARS that field, which is different from omitting it: \"\" blanks the value, an absent key leaves it alone. At least one of name, description, location or url is required, and a request whose only value is an empty string is a valid clear rather than an empty request. It writes a real profile and takes effect immediately with no undo, so read the current values with twitter_user_info first if you may need to restore them. Requires an authenticated session behind your key. Returns ok and updated_fields, which echoes the field names you SENT rather than a diff against the previous profile.",
1172
1172
  shape: {
1173
1173
  name: z.string().optional().describe(
1174
1174
  "Optional. New display name, up to 50 characters. Omit to leave it unchanged.",
1175
1175
  ),
1176
1176
  description: z.string().optional().describe(
1177
- "Optional. New bio. An empty string does NOT clear it: the API trims empty values and treats them as absent, so the current bio is left alone either way.",
1177
+ "Optional. New bio. Send an EMPTY STRING to clear it; OMIT the field to leave it alone. Those are different.",
1178
1178
  ),
1179
1179
  location: z.string().optional().describe(
1180
- "Optional. New location text. Same rule: an empty string is treated as absent and leaves the current value alone.",
1180
+ "Optional. New location text. Same rule: an empty string clears it, omitting the field leaves it alone.",
1181
1181
  ),
1182
1182
  url: z.string().optional().describe(
1183
1183
  "Optional. New profile link.",