@jclvsh/dropspace 2.32.0 → 2.33.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
@@ -51,7 +51,7 @@ dropspace launches --help
51
51
  | media | generate, job, library list, library add, library describe, library delete |
52
52
  | connections | list |
53
53
  | boosts | create, list, get, activate, cancel, performance |
54
- | reddit | suggest, config, configure, discover, comments, approve, reject, standing, activate, deactivate |
54
+ | reddit | suggest |
55
55
  | credits | balance, purchase |
56
56
  | keys | me, list, create, rename, revoke, rotate |
57
57
  | webhooks | list, create, get, update, delete, test, rotate-secret, deliveries |
@@ -119,7 +119,7 @@ https://api.dropspace.dev/mcp
119
119
 
120
120
  - Transport: MCP streamable HTTP, `POST` only, stateless, JSON responses.
121
121
  - Auth: `Authorization: Bearer ds_live_...` (the same API key; its scopes apply).
122
- - Tools: a subset of this package. API key, webhook, boost, credit, and reddit engagement tools are only available through the npm package.
122
+ - Tools: a subset of this package. API key, webhook, boost, credit, and reddit tools are only available through the npm package.
123
123
  - Every tool is annotated by class: `read` (`readOnlyHint: true`), `write`, or `sensitive` (`destructiveHint: true`: it publishes, schedules, or deletes on a connected platform, or deletes a launch or persona with no restore). The class of each hosted tool is listed at https://www.dropspace.dev/docs#mcp-hosted, and the source of truth is `src/tool-policy.ts`.
124
124
  - `create_launch` sends a content-derived `Idempotency-Key`, so a retry after a timeout returns the launch already created instead of creating a second one (the result says so).
125
125
  - Each MCP request counts once against the key's rate limit, and each tool call counts once more when it reaches the REST API.
@@ -1,4 +1,5 @@
1
1
  import { formatOutput, handleError, getFormat } from "../cli-utils.js";
2
+ import { REDDIT_ENGAGEMENT_PAUSED } from "../tool-policy.js";
2
3
  /**
3
4
  * Reddit discovery + engagement CLI — the earn-standing-before-promoting loop:
4
5
  * suggest → activate → discover → approve/reject → standing. Requires an api key whose
@@ -7,7 +8,9 @@ import { formatOutput, handleError, getFormat } from "../cli-utils.js";
7
8
  export function registerRedditCommands(program, client) {
8
9
  const reddit = program
9
10
  .command("reddit")
10
- .description("subreddit discovery + engagement (earn standing before promoting)");
11
+ .description(REDDIT_ENGAGEMENT_PAUSED
12
+ ? "subreddit discovery"
13
+ : "subreddit discovery + engagement (earn standing before promoting)");
11
14
  reddit
12
15
  .command("suggest")
13
16
  .description("ICP-matched subreddit discovery with per-community standing badges")
@@ -21,6 +24,9 @@ export function registerRedditCommands(program, client) {
21
24
  handleError(error);
22
25
  }
23
26
  });
27
+ // Engagement commands are paused with the API (see REDDIT_ENGAGEMENT_PAUSED).
28
+ if (REDDIT_ENGAGEMENT_PAUSED)
29
+ return;
24
30
  reddit
25
31
  .command("config")
26
32
  .description("read the engagement settings (enabled, caps, gate state, comment voice)")
package/dist/server.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { createPolicyRegistrar } from "./policy.js";
3
- import { TOOL_POLICY } from "./tool-policy.js";
3
+ import { PAUSED_TOOLS, TOOL_POLICY } from "./tool-policy.js";
4
4
  import { registerLaunchTools } from "./tools/launches.js";
5
5
  import { registerPersonaTools } from "./tools/personas.js";
6
6
  import { registerConnectionTools } from "./tools/connections.js";
@@ -15,9 +15,19 @@ import { registerAutopilotTools } from "./tools/autopilot.js";
15
15
  import { registerRecommendationTools } from "./tools/recommendations.js";
16
16
  import { registerRedditTools } from "./tools/reddit.js";
17
17
  import { registerAudienceTools } from "./tools/audience.js";
18
+ /** Drops tools whose feature is paused before the policy registrar sees them (see PAUSED_TOOLS). */
19
+ function skipPausedTools(registrar) {
20
+ return {
21
+ tool(name, ...rest) {
22
+ if (PAUSED_TOOLS.has(name))
23
+ return;
24
+ return registrar.tool(name, ...rest);
25
+ },
26
+ };
27
+ }
18
28
  export function createDropspaceServer({ client, version, profile }) {
19
29
  const server = new McpServer({ name: "dropspace", version });
20
- const registrar = createPolicyRegistrar(server, TOOL_POLICY, profile);
30
+ const registrar = skipPausedTools(createPolicyRegistrar(server, TOOL_POLICY, profile));
21
31
  registerLaunchTools(registrar, client);
22
32
  registerPersonaTools(registrar, client);
23
33
  registerConnectionTools(registrar, client);
@@ -18,8 +18,17 @@ import { type PolicyTable, type ToolClass, type ToolPolicy, type ToolProfile } f
18
18
  export type { ToolClass, ToolPolicy, ToolProfile };
19
19
  export declare const TOOL_CATEGORIES: readonly ["launches", "posts", "personas", "media", "connections", "boosts", "credits", "API keys", "webhooks", "dropspace", "usage", "autopilot", "recommendations", "reddit engagement", "audience"];
20
20
  export type ToolCategory = (typeof TOOL_CATEGORIES)[number];
21
+ /**
22
+ * Reddit engagement is paused (dropspace's reddit_engagement_disabled switch, 10/15/2026): the API
23
+ * answers 404 on /reddit/engagement/*, so the package neither serves nor counts these tools, and
24
+ * the CLI drops their commands. Set false, with the switch, to bring them back.
25
+ */
26
+ export declare const REDDIT_ENGAGEMENT_PAUSED = true;
27
+ /** Tools classified but not served while their feature is paused. */
28
+ export declare const PAUSED_TOOLS: ReadonlySet<string>;
29
+ /** The tools the package serves - every docs count and category list reads this. */
21
30
  export declare const TOOL_POLICY: PolicyTable<ToolCategory>;
22
- export declare const toolPolicy: (name: string) => ToolPolicy<"launches" | "personas" | "connections" | "webhooks" | "usage" | "credits" | "media" | "boosts" | "autopilot" | "recommendations" | "audience" | "dropspace" | "posts" | "API keys" | "reddit engagement">;
31
+ export declare const toolPolicy: (name: string) => ToolPolicy<"launches" | "personas" | "connections" | "webhooks" | "usage" | "credits" | "media" | "boosts" | "audience" | "posts" | "API keys" | "dropspace" | "autopilot" | "recommendations" | "reddit engagement">;
23
32
  export declare const isToolEnabled: (name: string, profile: ToolProfile) => boolean;
24
33
  export declare const toolAnnotations: (name: string) => {
25
34
  readOnlyHint: boolean;
@@ -42,7 +42,7 @@ const localOnly = (category, toolClass) => ({
42
42
  hosted: false,
43
43
  category,
44
44
  });
45
- export const TOOL_POLICY = {
45
+ const FULL_TOOL_POLICY = {
46
46
  // launches
47
47
  list_launches: hosted("launches", "read"),
48
48
  get_launch: hosted("launches", "read"),
@@ -144,6 +144,27 @@ export const TOOL_POLICY = {
144
144
  test_webhook: localOnly("webhooks", "write"),
145
145
  rotate_webhook_secret: localOnly("webhooks", "sensitive"),
146
146
  };
147
+ /**
148
+ * Reddit engagement is paused (dropspace's reddit_engagement_disabled switch, 10/15/2026): the API
149
+ * answers 404 on /reddit/engagement/*, so the package neither serves nor counts these tools, and
150
+ * the CLI drops their commands. Set false, with the switch, to bring them back.
151
+ */
152
+ export const REDDIT_ENGAGEMENT_PAUSED = true;
153
+ const REDDIT_ENGAGEMENT_TOOLS = [
154
+ "get_engagement_config",
155
+ "get_engagement_standing",
156
+ "list_engagement_comments",
157
+ "update_engagement_config",
158
+ "discover_engagement",
159
+ "reject_engagement_comment",
160
+ "activate_engagement_subreddit",
161
+ "deactivate_engagement_subreddit",
162
+ "approve_engagement_comment",
163
+ ];
164
+ /** Tools classified but not served while their feature is paused. */
165
+ export const PAUSED_TOOLS = new Set(REDDIT_ENGAGEMENT_PAUSED ? REDDIT_ENGAGEMENT_TOOLS : []);
166
+ /** The tools the package serves - every docs count and category list reads this. */
167
+ export const TOOL_POLICY = Object.fromEntries(Object.entries(FULL_TOOL_POLICY).filter(([name]) => !PAUSED_TOOLS.has(name)));
147
168
  export const toolPolicy = (name) => toolPolicyFor(TOOL_POLICY, name);
148
169
  export const isToolEnabled = (name, profile) => isToolEnabledIn(TOOL_POLICY, name, profile);
149
170
  export const toolAnnotations = (name) => toolAnnotationsFor(TOOL_POLICY, name);
@@ -59,7 +59,7 @@ export function registerRedditTools(server, client) {
59
59
  return fail(error);
60
60
  }
61
61
  });
62
- server.tool("discover_engagement", "draft helpful comments for ONE of the account's active subreddits (call again to cover more). fills the review queue; posts NOTHING — approval is the separate, rail-gated step. `skipped` names why nothing ran (kill_switch | not_enabled | gate_not_passed).", {}, async () => {
62
+ server.tool("discover_engagement", "draft helpful comments for ONE of the account's active subreddits (call again to cover more). fills the review queue; posts NOTHING — approval is the separate, rail-gated step. `skipped` names why nothing ran (kill_switch | not_enabled | gate_not_passed | account_hidden).", {}, async () => {
63
63
  try {
64
64
  return ok(await client.post("/reddit/engagement/discover"));
65
65
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jclvsh/dropspace",
3
- "version": "2.32.0",
3
+ "version": "2.33.0",
4
4
  "description": "MCP server and CLI for the Dropspace API",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,7 +10,7 @@ Dropspace turns one brief into per-platform posts and publishes them on the user
10
10
  ## Setup
11
11
 
12
12
  - MCP over stdio: `npx -y -p @jclvsh/dropspace dropspace-mcp` with `DROPSPACE_API_KEY=ds_live_...` in the environment. Every tool is available.
13
- - Hosted MCP: `https://api.dropspace.dev/mcp` (streamable HTTP, POST, `Authorization: Bearer ds_live_...`). Serves a subset: no credits, boosts, API keys, webhooks, or reddit engagement tools.
13
+ - Hosted MCP: `https://api.dropspace.dev/mcp` (streamable HTTP, POST, `Authorization: Bearer ds_live_...`). Serves a subset: no credits, boosts, API keys, webhooks, or reddit tools.
14
14
  - CLI: `npx -y @jclvsh/dropspace <command>` (the same key). `dropspace --help` lists commands.
15
15
  - No key? The user creates one at https://www.dropspace.dev/settings/api. A key's scopes limit what it can do (`read`, `write`, `generate`, `send`, `admin`); a 403 names the missing scope.
16
16