@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 +2 -2
- package/dist/commands/reddit.js +7 -1
- package/dist/server.js +12 -2
- package/dist/tool-policy.d.ts +10 -1
- package/dist/tool-policy.js +22 -1
- package/dist/tools/reddit.js +1 -1
- package/package.json +1 -1
- package/skills/dropspace/SKILL.md +1 -1
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
|
|
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
|
|
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.
|
package/dist/commands/reddit.js
CHANGED
|
@@ -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(
|
|
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);
|
package/dist/tool-policy.d.ts
CHANGED
|
@@ -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" | "
|
|
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;
|
package/dist/tool-policy.js
CHANGED
|
@@ -42,7 +42,7 @@ const localOnly = (category, toolClass) => ({
|
|
|
42
42
|
hosted: false,
|
|
43
43
|
category,
|
|
44
44
|
});
|
|
45
|
-
|
|
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);
|
package/dist/tools/reddit.js
CHANGED
|
@@ -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
|
@@ -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
|
|
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
|
|