@jclvsh/dropspace 2.19.0 → 2.21.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.
@@ -36,4 +36,19 @@ export function registerConnectionCommands(program, client) {
36
36
  handleError(error);
37
37
  }
38
38
  });
39
+ connections
40
+ .command("profile <platform>")
41
+ .description("edit the connected account's profile on the platform (youtube only today: the channel description, max 1,000 chars; pass an empty string to clear)")
42
+ .requiredOption("--description <text>", "the new profile / channel description")
43
+ .action(async (platform, opts) => {
44
+ try {
45
+ const result = await client.patch(`/connections/${encodeURIComponent(platform)}/profile`, {
46
+ description: opts.description,
47
+ });
48
+ formatOutput(result, getFormat(program.opts()));
49
+ }
50
+ catch (error) {
51
+ handleError(error);
52
+ }
53
+ });
39
54
  }
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ import { registerRedditTools } from "./tools/reddit.js";
18
18
  import { registerAudienceTools } from "./tools/audience.js";
19
19
  const server = new McpServer({
20
20
  name: "dropspace",
21
- version: "2.18.0",
21
+ version: "2.20.0",
22
22
  });
23
23
  const client = new DropspaceClient();
24
24
  registerLaunchTools(server, client);
@@ -27,4 +27,26 @@ export function registerConnectionTools(server, client) {
27
27
  };
28
28
  }
29
29
  });
30
+ server.tool("update_connection_profile", "edit the connected account's profile ON the platform. youtube only today: sets the channel description (max 1,000 characters; an empty string clears it) via channels.update. instagram's api can read a profile but not write it, facebook page \"about\" needs a permission dropspace does not hold, and tiktok / x / linkedin expose no profile write - those return an error with the reason. requires the write scope.", {
31
+ platform: z.string().describe('platform whose profile to edit (currently only "youtube")'),
32
+ description: z.string().max(1000).describe("the new profile / channel description (max 1,000 characters)"),
33
+ }, async ({ platform, description }) => {
34
+ try {
35
+ const result = await client.patch(`/connections/${encodeURIComponent(platform)}/profile`, { description });
36
+ return {
37
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
38
+ };
39
+ }
40
+ catch (error) {
41
+ return {
42
+ content: [
43
+ {
44
+ type: "text",
45
+ text: `error: ${error instanceof Error ? error.message : String(error)}`,
46
+ },
47
+ ],
48
+ isError: true,
49
+ };
50
+ }
51
+ });
30
52
  }
@@ -110,7 +110,7 @@ export function registerLaunchTools(server, client) {
110
110
  platform_contents: z
111
111
  .record(z.string(), z.record(z.string(), z.unknown()))
112
112
  .optional()
113
- .describe('per-platform content — each value needs "content" (string). Reddit also requires "title" (max 300) and supports "metadata": { "subreddits": string[] (max 10, names without the r/ prefix — posts the launch once per subreddit, each tracked and retryable on its own; omit to post to the default community), "first_comment": string (max 1500 — posted as a comment under each reddit post once it goes live) }. for multi-account reddit, each connected account can target its own subreddits via "reddit:<account_id>" content keys (falls back to the base "reddit" block); a subreddit is posted by at most one of your accounts per launch (first wins, others skipped as SUBREDDIT_ALREADY_TARGETED). each subreddit has its own rules: many restrict or ban promotional posts and posting where the account has no history gets filtered, so target a few genuinely relevant subreddits rather than blasting. Twitter supports "thread" (string[], max 6, each ≤280 or ≤25,000 for X Premium) instead of "content". TikTok supports "tiktok_settings": { "publish_mode"?: "direct"|"draft" (default "direct"; "draft" uploads to the TikTok inbox to finish and publish in-app), "privacy_level": "PUBLIC_TO_EVERYONE"|"FOLLOWER_OF_CREATOR"|"MUTUAL_FOLLOW_FRIENDS"|"SELF_ONLY" (required before publish in direct mode; not required for draft), "allow_comments"?, "allow_duet"?, "allow_stitch"?, "is_commercial"?, "is_your_brand"?, "is_branded_content"?, "auto_add_music"? (booleans, direct mode) }. YouTube requires video and supports "title" (max 100 chars). character limits: Twitter 280/tweet (25,000 for X Premium), LinkedIn 3000, Instagram 2200, Reddit 3000, Facebook 3000, TikTok 4000, YouTube 5000 (description). X Premium status is auto-detected from the connected account. mutually exclusive with custom_content'),
113
+ .describe('per-platform content — each value needs "content" (string). Reddit also requires "title" (max 300) and supports "metadata": { "subreddits": string[] (max 10, names without the r/ prefix — posts the launch once per subreddit, each tracked and retryable on its own; omit to post to the default community), "first_comment": string (max 1500 — posted as a comment under each reddit post once it goes live) }. for multi-account reddit, each connected account can target its own subreddits via "reddit:<account_id>" content keys (falls back to the base "reddit" block); a subreddit is posted by at most one of your accounts per launch (first wins, others skipped as SUBREDDIT_ALREADY_TARGETED). each subreddit has its own rules: many restrict or ban promotional posts and posting where the account has no history gets filtered, so target a few genuinely relevant subreddits rather than blasting. Twitter supports "thread" (string[], max 6, each ≤280 or ≤25,000 for X Premium) instead of "content". TikTok supports "tiktok_settings": { "publish_mode"?: "direct"|"draft" (default "direct"; "draft" uploads to the TikTok inbox to finish and publish in-app), "privacy_level": "PUBLIC_TO_EVERYONE"|"FOLLOWER_OF_CREATOR"|"MUTUAL_FOLLOW_FRIENDS"|"SELF_ONLY" (required before publish in direct mode; not required for draft), "allow_comments"?, "allow_duet"?, "allow_stitch"?, "is_commercial"?, "is_your_brand"?, "is_branded_content"?, "auto_add_music"? (booleans, direct mode), "cover_timestamp_ms"? (integer 0-600000 — which frame TikTok uses as the cover, in ms from the start; VIDEO posts only, photo posts take their cover by index; omit for the first frame) }. YouTube requires video and supports "title" (max 100 chars). character limits: Twitter 280/tweet (25,000 for X Premium), LinkedIn 3000, Instagram 2200, Reddit 3000, Facebook 3000, TikTok 4000, YouTube 5000 (description). X Premium status is auto-detected from the connected account. mutually exclusive with custom_content'),
114
114
  custom_content: z
115
115
  .union([z.string().min(1), z.array(z.string()).min(1).max(6)])
116
116
  .optional()
@@ -6,7 +6,9 @@ const WEBHOOK_EVENTS = [
6
6
  "media.ready",
7
7
  "persona.analyzed",
8
8
  "post.deleted",
9
+ "recommendation.created",
9
10
  "connection.expired",
11
+ "connection.restored",
10
12
  ];
11
13
  export function registerWebhookTools(server, client) {
12
14
  server.tool("list_webhooks", "list your webhooks (requires admin scope)", {}, async () => {
package/package.json CHANGED
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "name": "@jclvsh/dropspace",
3
- "version": "2.19.0",
3
+ "version": "2.21.0",
4
4
  "description": "MCP server and CLI for the Dropspace API",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/JCLVSH/monorepo.git",
8
+ "directory": "apps/dropspace/packages/mcp"
9
+ },
5
10
  "type": "module",
6
11
  "main": "dist/index.js",
7
12
  "types": "dist/index.d.ts",