postfast-mcp 0.6.2 → 0.7.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/dist/core/build-tools.d.ts +10 -0
- package/dist/core/build-tools.js +15 -5
- package/dist/core/build-tools.js.map +1 -1
- package/dist/core/confirm-token.d.ts +23 -0
- package/dist/core/confirm-token.js +64 -0
- package/dist/core/confirm-token.js.map +1 -0
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/instructions.d.ts +3 -1
- package/dist/core/instructions.js +25 -1
- package/dist/core/instructions.js.map +1 -1
- package/dist/core/tool-def.d.ts +14 -3
- package/dist/core/tools/inbox-confirm.d.ts +12 -0
- package/dist/core/tools/inbox-confirm.js +103 -0
- package/dist/core/tools/inbox-confirm.js.map +1 -0
- package/dist/core/tools/inbox.js +23 -7
- package/dist/core/tools/inbox.js.map +1 -1
- package/dist/core/tools/index.js +2 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/posts.js +20 -8
- package/dist/core/tools/posts.js.map +1 -1
- package/dist/core/tools/uploads.js +13 -5
- package/dist/core/tools/uploads.js.map +1 -1
- package/dist/stdio/index.js +1 -1
- package/package.json +2 -1
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
{
|
|
12
12
|
"name": "postfast",
|
|
13
13
|
"description": "Schedule, manage, and analyze social media posts via PostFast. Supports Facebook, Instagram, X, TikTok, LinkedIn, YouTube, BlueSky, Threads, Pinterest, Telegram, and Google Business Profile.",
|
|
14
|
-
"version": "0.
|
|
14
|
+
"version": "0.7.1",
|
|
15
15
|
"author": {
|
|
16
16
|
"name": "PostFast",
|
|
17
17
|
"email": "me@peturgeorgievv.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "postfast",
|
|
3
3
|
"description": "Schedule, manage, and analyze social media posts via PostFast. Supports Facebook, Instagram, X, TikTok, LinkedIn, YouTube, BlueSky, Threads, Pinterest, Telegram, and Google Business Profile. After installing, tell Cowork: 'Set my PostFast API key' — get your key at https://app.postfa.st/dashboard → API.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.7.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "PostFast",
|
|
7
7
|
"email": "me@peturgeorgievv.com"
|
|
@@ -2,6 +2,10 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
2
2
|
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import type { BackendPort } from './backend-port.js';
|
|
4
4
|
import type { Binding, ResolvedTool } from './tool-def.js';
|
|
5
|
+
export interface ConfirmGateOptions {
|
|
6
|
+
/** HMAC key for confirm tokens; at least 32 characters. */
|
|
7
|
+
secret: string;
|
|
8
|
+
}
|
|
5
9
|
export interface BuildToolsOptions {
|
|
6
10
|
binding: Binding;
|
|
7
11
|
/**
|
|
@@ -16,6 +20,12 @@ export interface BuildToolsOptions {
|
|
|
16
20
|
* catalog keeps working when a newer catalog adds tools it can't serve yet.
|
|
17
21
|
*/
|
|
18
22
|
port?: BackendPort;
|
|
23
|
+
/**
|
|
24
|
+
* Remote only. Holds every new post for approval and routes comment
|
|
25
|
+
* replies, private replies and deletions through prepare_inbox_action and
|
|
26
|
+
* confirm_inbox_action. When absent, the output is identical to 0.6.2.
|
|
27
|
+
*/
|
|
28
|
+
confirmGate?: ConfirmGateOptions;
|
|
19
29
|
}
|
|
20
30
|
/** Resolve the catalog for one binding: filter, flatten binding-variant fields. */
|
|
21
31
|
export declare function buildTools(options: BuildToolsOptions): ResolvedTool[];
|
package/dist/core/build-tools.js
CHANGED
|
@@ -2,10 +2,16 @@ import { workspaceIdField } from './shared.js';
|
|
|
2
2
|
import { ALL_TOOLS } from './tools/index.js';
|
|
3
3
|
/** Resolve the catalog for one binding: filter, flatten binding-variant fields. */
|
|
4
4
|
export function buildTools(options) {
|
|
5
|
-
const { binding, withWorkspaceField = false, port } = options;
|
|
5
|
+
const { binding, withWorkspaceField = false, port, confirmGate } = options;
|
|
6
|
+
const gated = binding === 'remote' && !!confirmGate;
|
|
7
|
+
if (gated && !(confirmGate.secret?.length >= 32)) {
|
|
8
|
+
throw new Error('confirmGate.secret must be at least 32 characters.');
|
|
9
|
+
}
|
|
6
10
|
return ALL_TOOLS.filter((def) => {
|
|
7
11
|
if (def.binding !== 'both' && def.binding !== binding)
|
|
8
12
|
return false;
|
|
13
|
+
if (gated ? def.hiddenWhenGated : def.gatedOnly)
|
|
14
|
+
return false;
|
|
9
15
|
if (port &&
|
|
10
16
|
def.portMethod &&
|
|
11
17
|
typeof port[def.portMethod] !== 'function') {
|
|
@@ -14,18 +20,22 @@ export function buildTools(options) {
|
|
|
14
20
|
}
|
|
15
21
|
return true;
|
|
16
22
|
}).map((def) => {
|
|
17
|
-
const inputSchema = typeof def.inputSchema === 'function' ? def.inputSchema(binding) : def.inputSchema;
|
|
23
|
+
const inputSchema = typeof def.inputSchema === 'function' ? def.inputSchema(binding, gated) : def.inputSchema;
|
|
24
|
+
const annotations = gated && def.gatedAnnotations ? def.gatedAnnotations : def.annotations;
|
|
18
25
|
return {
|
|
19
26
|
name: def.name,
|
|
20
27
|
title: def.title,
|
|
21
|
-
description: typeof def.description === 'function' ? def.description(binding) : def.description,
|
|
28
|
+
description: typeof def.description === 'function' ? def.description(binding, gated) : def.description,
|
|
22
29
|
inputSchema: withWorkspaceField && def.workspaceScoped !== false
|
|
23
30
|
? { ...inputSchema, workspaceId: workspaceIdField }
|
|
24
31
|
: inputSchema,
|
|
25
|
-
annotations: { title: def.title, ...
|
|
32
|
+
annotations: { title: def.title, ...annotations },
|
|
26
33
|
_meta: def._meta,
|
|
27
34
|
portMethod: def.portMethod,
|
|
28
|
-
|
|
35
|
+
// Gated: hand the secret to run(), also for hosts that call tool.run() themselves.
|
|
36
|
+
run: gated
|
|
37
|
+
? (p, args, workspaceId) => def.run(p, args, workspaceId, { confirmSecret: confirmGate.secret })
|
|
38
|
+
: def.run,
|
|
29
39
|
};
|
|
30
40
|
});
|
|
31
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-tools.js","sourceRoot":"","sources":["../../src/core/build-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"build-tools.js","sourceRoot":"","sources":["../../src/core/build-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokens that tie confirm_inbox_action to exactly what prepare_inbox_action
|
|
3
|
+
* previewed: an HMAC over the workspace, item, action and text. Format
|
|
4
|
+
* `v1.<exp>.<jti>.<base64url mac>`, exp in epoch seconds. Stateless apart from
|
|
5
|
+
* the used-jti list below, so a token verifies on any replica of a host.
|
|
6
|
+
*/
|
|
7
|
+
export type ConfirmAction = 'REPLY' | 'PRIVATE_REPLY' | 'DELETE';
|
|
8
|
+
export interface ConfirmFields {
|
|
9
|
+
ws?: string;
|
|
10
|
+
itemId: string;
|
|
11
|
+
action: ConfirmAction;
|
|
12
|
+
text?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function sign(fields: ConfirmFields, secret: string, now?: number): {
|
|
15
|
+
confirmToken: string;
|
|
16
|
+
expiresAt: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Verify a token against the caller's own values and reserve its jti in the
|
|
20
|
+
* same synchronous step, so two concurrent confirms cannot both pass. Returns
|
|
21
|
+
* a release() for when the action itself then fails.
|
|
22
|
+
*/
|
|
23
|
+
export declare function redeem(confirmToken: string, fields: ConfirmFields, secret: string, now?: number): () => void;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createHmac, randomUUID, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
const TTL_SECONDS = 900;
|
|
3
|
+
const MISMATCH = 'confirmToken does not match this action. Prepare it again with prepare_inbox_action and confirm exactly what was previewed.';
|
|
4
|
+
const EXPIRED = 'confirmToken has expired. Prepare the action again.';
|
|
5
|
+
const USED = 'This confirmToken was already used.';
|
|
6
|
+
/**
|
|
7
|
+
* jti -> exp of every redeemed token that has not expired yet. Module-level,
|
|
8
|
+
* so it spans sessions and buildTools() calls, but it is per process: a token
|
|
9
|
+
* replayed on another replica of a host is not caught here.
|
|
10
|
+
*/
|
|
11
|
+
const usedJtis = new Map();
|
|
12
|
+
function prune(nowSeconds) {
|
|
13
|
+
for (const [jti, exp] of usedJtis) {
|
|
14
|
+
if (exp < nowSeconds)
|
|
15
|
+
usedJtis.delete(jti);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function mac(secret, exp, jti, fields) {
|
|
19
|
+
// DELETE carries no text: any text passed is ignored when signing and when
|
|
20
|
+
// verifying, so a confirm that echoes one still matches.
|
|
21
|
+
const text = fields.action === 'DELETE' ? '' : (fields.text ?? '');
|
|
22
|
+
return createHmac('sha256', secret)
|
|
23
|
+
.update(JSON.stringify(['v1', exp, jti, fields.ws ?? '', fields.itemId, fields.action, text]))
|
|
24
|
+
.digest('base64url');
|
|
25
|
+
}
|
|
26
|
+
export function sign(fields, secret, now = Date.now()) {
|
|
27
|
+
const nowSeconds = Math.floor(now / 1000);
|
|
28
|
+
prune(nowSeconds);
|
|
29
|
+
const exp = nowSeconds + TTL_SECONDS;
|
|
30
|
+
const jti = randomUUID();
|
|
31
|
+
return {
|
|
32
|
+
confirmToken: `v1.${exp}.${jti}.${mac(secret, exp, jti, fields)}`,
|
|
33
|
+
expiresAt: new Date(exp * 1000).toISOString(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Verify a token against the caller's own values and reserve its jti in the
|
|
38
|
+
* same synchronous step, so two concurrent confirms cannot both pass. Returns
|
|
39
|
+
* a release() for when the action itself then fails.
|
|
40
|
+
*/
|
|
41
|
+
export function redeem(confirmToken, fields, secret, now = Date.now()) {
|
|
42
|
+
const nowSeconds = Math.floor(now / 1000);
|
|
43
|
+
prune(nowSeconds);
|
|
44
|
+
const parts = confirmToken.split('.');
|
|
45
|
+
const [version, expText, jti, given] = parts;
|
|
46
|
+
if (parts.length !== 4 || version !== 'v1' || !/^\d+$/.test(expText)) {
|
|
47
|
+
throw new Error(MISMATCH);
|
|
48
|
+
}
|
|
49
|
+
const exp = Number(expText);
|
|
50
|
+
if (nowSeconds > exp)
|
|
51
|
+
throw new Error(EXPIRED);
|
|
52
|
+
const expected = Buffer.from(mac(secret, exp, jti, fields));
|
|
53
|
+
const actual = Buffer.from(given);
|
|
54
|
+
if (expected.length !== actual.length || !timingSafeEqual(expected, actual)) {
|
|
55
|
+
throw new Error(MISMATCH);
|
|
56
|
+
}
|
|
57
|
+
if (usedJtis.has(jti))
|
|
58
|
+
throw new Error(USED);
|
|
59
|
+
usedJtis.set(jti, exp);
|
|
60
|
+
return () => {
|
|
61
|
+
usedJtis.delete(jti);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=confirm-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-token.js","sourceRoot":"","sources":["../../src/core/confirm-token.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* remote host (social-schedule-mcp). Import as "postfast-mcp/core".
|
|
5
5
|
*/
|
|
6
6
|
export * from './backend-port.js';
|
|
7
|
-
export { buildTools, registerCatalogTools, runTool, toolError, toolResult, type BuildToolsOptions, type RegisterToolsOptions, } from './build-tools.js';
|
|
7
|
+
export { buildTools, registerCatalogTools, runTool, toolError, toolResult, type BuildToolsOptions, type ConfirmGateOptions, type RegisterToolsOptions, } from './build-tools.js';
|
|
8
8
|
export { SERVER_INSTRUCTIONS, instructionsFor } from './instructions.js';
|
|
9
9
|
export { CREATE_APPROVAL_STATUSES, CREATE_STATUSES, IMAGE_MIME_TYPES, PLATFORMS, POST_STATUSES, SET_APPROVAL_STATUSES, VIDEO_MIME_TYPES, jsonParse, workspaceIdField, } from './shared.js';
|
|
10
10
|
export type { Binding, ResolvedTool, ResolvedToolAnnotations, ToolAnnotations, ToolDef, } from './tool-def.js';
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,SAAS,EACT,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,SAAS,EACT,UAAU,GAIX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,gBAAgB,EAChB,SAAS,EACT,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,cAAc,YAAY,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { Binding } from './tool-def.js';
|
|
2
2
|
export declare const SERVER_INSTRUCTIONS: Record<Binding, string>;
|
|
3
|
-
export declare function instructionsFor(binding: Binding
|
|
3
|
+
export declare function instructionsFor(binding: Binding, opts?: {
|
|
4
|
+
gated?: boolean;
|
|
5
|
+
}): string;
|
|
@@ -61,7 +61,31 @@ export const SERVER_INSTRUCTIONS = {
|
|
|
61
61
|
stdio: STDIO_INSTRUCTIONS,
|
|
62
62
|
remote: REMOTE_INSTRUCTIONS,
|
|
63
63
|
};
|
|
64
|
-
|
|
64
|
+
/**
|
|
65
|
+
* The remote text for a host with the confirm gate on: REMOTE_INSTRUCTIONS
|
|
66
|
+
* with the paragraphs starting with these prefixes swapped, so the ungated
|
|
67
|
+
* text above is never touched.
|
|
68
|
+
*/
|
|
69
|
+
const GATED_PARAGRAPHS = [
|
|
70
|
+
[
|
|
71
|
+
'Flow: ',
|
|
72
|
+
"Flow: list_accounts (+ list_workspaces) to see what's connected → create_posts (one socialMediaId per post; batch up to 15) → attach media via upload_from_url (a public https URL) or upload_media (base64 bytes in data + contentType). Posts are held for approval and nothing publishes until approve_posts sets them to APPROVED: show the user what will be posted, where and when, and call approve_posts only after they say yes, even if they asked you to post it.",
|
|
73
|
+
],
|
|
74
|
+
[
|
|
75
|
+
'Status & timing: ',
|
|
76
|
+
'Status & timing: status=SCHEDULED requires scheduledAt on every post (ISO-8601, in the future, within 1 year); status=DRAFT must omit scheduledAt. Every post is created as PENDING_APPROVAL and publishes at its scheduledAt only once approve_posts sets it to APPROVED.',
|
|
77
|
+
],
|
|
78
|
+
[
|
|
79
|
+
'Social inbox ',
|
|
80
|
+
"Social inbox (comments on your posts: TikTok, Instagram, Facebook Pages, Threads; an account's inboxCapable flag from list_accounts says what is live today): read with list_inbox_conversations → list_inbox_items (get_inbox_unread_count for the total). To reply publicly under a comment (REPLY), send an Instagram private reply (PRIVATE_REPLY: one per comment, within 7 days) or delete a comment permanently (DELETE), call prepare_inbox_action, show the user the preview, and carry it out with confirm_inbox_action only after they say yes, even if they gave you the text. Whether and how long a reply can be comes ONLY from the conversation's server-computed canReply / maxReplyLength / windowState / disabledReason; never assume platform rules. Hide or restore a comment with set_inbox_item_state (HIDE / UNHIDE), triage with set_inbox_conversation_status and assign_inbox_conversation, and call mark_inbox_conversation_read after presenting a thread. It is a comments inbox; never present it as DMs or messages.",
|
|
81
|
+
],
|
|
82
|
+
];
|
|
83
|
+
const GATED_REMOTE_INSTRUCTIONS = REMOTE_INSTRUCTIONS.split('\n\n')
|
|
84
|
+
.map((paragraph) => GATED_PARAGRAPHS.find(([prefix]) => paragraph.startsWith(prefix))?.[1] ?? paragraph)
|
|
85
|
+
.join('\n\n');
|
|
86
|
+
export function instructionsFor(binding, opts) {
|
|
87
|
+
if (binding === 'remote' && opts?.gated)
|
|
88
|
+
return GATED_REMOTE_INSTRUCTIONS;
|
|
65
89
|
return SERVER_INSTRUCTIONS[binding];
|
|
66
90
|
}
|
|
67
91
|
//# sourceMappingURL=instructions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/core/instructions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;w4BAkCo3B,CAAC;AAEz4B,MAAM,kBAAkB,GAAG;;;;;;EAMzB,WAAW,EAAE,CAAC;AAEhB,MAAM,mBAAmB,GAAG;;;;;;EAM1B,WAAW,EAAE,CAAC;AAEhB,MAAM,CAAC,MAAM,mBAAmB,GAA4B;IAC1D,KAAK,EAAE,kBAAkB;IACzB,MAAM,EAAE,mBAAmB;CAC5B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAgB;
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/core/instructions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;w4BAkCo3B,CAAC;AAEz4B,MAAM,kBAAkB,GAAG;;;;;;EAMzB,WAAW,EAAE,CAAC;AAEhB,MAAM,mBAAmB,GAAG;;;;;;EAM1B,WAAW,EAAE,CAAC;AAEhB,MAAM,CAAC,MAAM,mBAAmB,GAA4B;IAC1D,KAAK,EAAE,kBAAkB;IACzB,MAAM,EAAE,mBAAmB;CAC5B,CAAC;AAEF;;;;GAIG;AACH,MAAM,gBAAgB,GAAqC;IACzD;QACE,QAAQ;QACR,8cAA8c;KAC/c;IACD;QACE,mBAAmB;QACnB,4QAA4Q;KAC7Q;IACD;QACE,eAAe;QACf,s/BAAs/B;KACv/B;CACF,CAAC;AAEF,MAAM,yBAAyB,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC;KAChE,GAAG,CACF,CAAC,SAAS,EAAE,EAAE,CACZ,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CACtF;KACA,IAAI,CAAC,MAAM,CAAC,CAAC;AAEhB,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,IAA0B;IAC1E,IAAI,OAAO,KAAK,QAAQ,IAAI,IAAI,EAAE,KAAK;QAAE,OAAO,yBAAyB,CAAC;IAC1E,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/core/tool-def.d.ts
CHANGED
|
@@ -27,19 +27,27 @@ export type ResolvedToolAnnotations = ToolAnnotations & {
|
|
|
27
27
|
* function of the binding for the few spots where the surfaces genuinely
|
|
28
28
|
* differ (upload-tool references — stdio uploads local files, the remote
|
|
29
29
|
* uploads conversation media/URLs). Everything else is binding-invariant.
|
|
30
|
+
* The functions also receive `gated`: true only on a remote build with the
|
|
31
|
+
* confirm gate on (BuildToolsOptions.confirmGate).
|
|
30
32
|
*/
|
|
31
33
|
export interface ToolDef {
|
|
32
34
|
name: string;
|
|
33
35
|
/** Which binding(s) expose the tool. */
|
|
34
36
|
binding: Binding | 'both';
|
|
35
37
|
title: string;
|
|
36
|
-
description: string | ((binding: Binding) => string);
|
|
37
|
-
inputSchema: ZodRawShape | ((binding: Binding) => ZodRawShape);
|
|
38
|
+
description: string | ((binding: Binding, gated?: boolean) => string);
|
|
39
|
+
inputSchema: ZodRawShape | ((binding: Binding, gated?: boolean) => ZodRawShape);
|
|
38
40
|
annotations: ToolAnnotations;
|
|
41
|
+
/** Replaces `annotations` when the confirm gate is on. */
|
|
42
|
+
gatedAnnotations?: ToolAnnotations;
|
|
39
43
|
/** Extra tool metadata, e.g. the ChatGPT file-param marker on upload_media. */
|
|
40
44
|
_meta?: Record<string, unknown>;
|
|
41
45
|
/** False only for tools that are not scoped to a workspace (list_workspaces). */
|
|
42
46
|
workspaceScoped?: boolean;
|
|
47
|
+
/** The tool exists only when the confirm gate is on. */
|
|
48
|
+
gatedOnly?: boolean;
|
|
49
|
+
/** The tool is dropped when the confirm gate is on. */
|
|
50
|
+
hiddenWhenGated?: boolean;
|
|
43
51
|
/**
|
|
44
52
|
* The BackendPort method this tool's run() dispatches to. When set and the
|
|
45
53
|
* port instance lacks the method (an older adapter running a newer catalog),
|
|
@@ -51,8 +59,11 @@ export interface ToolDef {
|
|
|
51
59
|
* Dispatch to the backend. `args` are the validated tool arguments minus
|
|
52
60
|
* `workspaceId`, which is split off by the registrar and passed separately
|
|
53
61
|
* (always undefined on stdio — the pf-api-key is already workspace-scoped).
|
|
62
|
+
* `ctx.confirmSecret` is set by buildTools() when the confirm gate is on.
|
|
54
63
|
*/
|
|
55
|
-
run: (port: BackendPort, args: Record<string, unknown>, workspaceId?: string
|
|
64
|
+
run: (port: BackendPort, args: Record<string, unknown>, workspaceId?: string, ctx?: {
|
|
65
|
+
confirmSecret?: string;
|
|
66
|
+
}) => Promise<unknown>;
|
|
56
67
|
}
|
|
57
68
|
/** A ToolDef with binding-dependent fields resolved for one concrete binding. */
|
|
58
69
|
export interface ResolvedTool {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ToolDef } from '../tool-def.js';
|
|
2
|
+
/**
|
|
3
|
+
* Comment replies, Instagram private replies and comment deletions in two
|
|
4
|
+
* steps, for hosts with the confirm gate on (there they replace
|
|
5
|
+
* reply_to_inbox_item, send_inbox_private_reply and set_inbox_item_state
|
|
6
|
+
* DELETE). prepare returns a preview and a signed token and calls nothing.
|
|
7
|
+
* confirm repeats the same values, so the client's approval prompt for the
|
|
8
|
+
* destructive call shows the real reply text, and any change fails the
|
|
9
|
+
* signature. The token is not tied to a user: confirm runs with the caller's
|
|
10
|
+
* own credentials, so the backend still decides who may reply or delete.
|
|
11
|
+
*/
|
|
12
|
+
export declare const inboxConfirmTools: ToolDef[];
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { redeem, sign } from '../confirm-token.js';
|
|
3
|
+
const CONFIRM_ACTIONS = ['REPLY', 'PRIVATE_REPLY', 'DELETE'];
|
|
4
|
+
/** The confirm-gate secret, handed to run() by buildTools() when the gate is on. */
|
|
5
|
+
function secretOf(ctx) {
|
|
6
|
+
if (!ctx?.confirmSecret) {
|
|
7
|
+
throw new Error('The confirm gate is not configured on this server.');
|
|
8
|
+
}
|
|
9
|
+
return ctx.confirmSecret;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Comment replies, Instagram private replies and comment deletions in two
|
|
13
|
+
* steps, for hosts with the confirm gate on (there they replace
|
|
14
|
+
* reply_to_inbox_item, send_inbox_private_reply and set_inbox_item_state
|
|
15
|
+
* DELETE). prepare returns a preview and a signed token and calls nothing.
|
|
16
|
+
* confirm repeats the same values, so the client's approval prompt for the
|
|
17
|
+
* destructive call shows the real reply text, and any change fails the
|
|
18
|
+
* signature. The token is not tied to a user: confirm runs with the caller's
|
|
19
|
+
* own credentials, so the backend still decides who may reply or delete.
|
|
20
|
+
*/
|
|
21
|
+
export const inboxConfirmTools = [
|
|
22
|
+
{
|
|
23
|
+
name: 'prepare_inbox_action',
|
|
24
|
+
binding: 'remote',
|
|
25
|
+
gatedOnly: true,
|
|
26
|
+
title: 'Prepare Comment Reply or Deletion',
|
|
27
|
+
description: "Prepare a reply to a comment, an Instagram private reply, or a comment deletion WITHOUT doing it. REPLY posts publicly under the comment; PRIVATE_REPLY sends an Instagram private reply that arrives as a direct message (one per comment, within 7 days; check the item's canPrivateReply); DELETE removes the comment on the platform permanently (not supported on Threads). Before a reply, check the conversation's canReply and maxReplyLength. Returns a preview and a confirmToken. Then show the user which comment it is (its author and text) and exactly what will happen, and wait for their yes in the conversation before calling confirm_inbox_action, even if they already told you what to write. Nothing reaches the platform in this step.",
|
|
28
|
+
inputSchema: {
|
|
29
|
+
itemId: z.uuid().describe('The comment item id (from list_inbox_items)'),
|
|
30
|
+
action: z
|
|
31
|
+
.enum(CONFIRM_ACTIONS)
|
|
32
|
+
.describe('REPLY (public, under the comment), PRIVATE_REPLY (Instagram only) or DELETE (permanent)'),
|
|
33
|
+
text: z
|
|
34
|
+
.string()
|
|
35
|
+
.min(1)
|
|
36
|
+
.optional()
|
|
37
|
+
.describe('Reply text. Required for REPLY and PRIVATE_REPLY; omit for DELETE.'),
|
|
38
|
+
},
|
|
39
|
+
annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
|
|
40
|
+
portMethod: 'replyToInboxItem',
|
|
41
|
+
run: async (_port, args, workspaceId, ctx) => {
|
|
42
|
+
const action = args.action;
|
|
43
|
+
const itemId = args.itemId;
|
|
44
|
+
const text = action === 'DELETE' ? undefined : args.text;
|
|
45
|
+
if (action !== 'DELETE' && !text) {
|
|
46
|
+
throw new Error('text is required for REPLY and PRIVATE_REPLY.');
|
|
47
|
+
}
|
|
48
|
+
const { confirmToken, expiresAt } = sign({ ws: workspaceId, itemId, action, text }, secretOf(ctx));
|
|
49
|
+
return {
|
|
50
|
+
preview: {
|
|
51
|
+
action,
|
|
52
|
+
itemId,
|
|
53
|
+
...(text === undefined ? {} : { text }),
|
|
54
|
+
...(workspaceId === undefined ? {} : { workspaceId }),
|
|
55
|
+
},
|
|
56
|
+
confirmToken,
|
|
57
|
+
expiresAt,
|
|
58
|
+
next: 'Show the user which comment this is (author and text) and exactly what will be sent or deleted, and wait for their yes in the conversation, even if they already gave you the text. Only then call confirm_inbox_action with this confirmToken and the same itemId, action and text, plus the same workspaceId only if you passed one.',
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'confirm_inbox_action',
|
|
64
|
+
binding: 'remote',
|
|
65
|
+
gatedOnly: true,
|
|
66
|
+
title: 'Confirm Comment Reply or Deletion',
|
|
67
|
+
description: 'Carry out a reply or deletion prepared with prepare_inbox_action. Pass its confirmToken with the same itemId, action and text (and workspaceId, if you used one); anything different is rejected. Call it only after the user has seen the preview and said yes in the conversation. Replies on Threads cannot be removed through PostFast, private replies cannot be unsent, and deletions cannot be undone. A token expires 15 minutes after it was prepared and works once. Failures return the underlying inbox.* codes (for example replyTooLong, privateReplyAlreadySent, deleteNotSupported).',
|
|
68
|
+
inputSchema: {
|
|
69
|
+
confirmToken: z.string().min(1).describe('The confirmToken from prepare_inbox_action'),
|
|
70
|
+
itemId: z.uuid().describe('Must match the prepared action exactly.'),
|
|
71
|
+
action: z.enum(CONFIRM_ACTIONS).describe('Must match the prepared action exactly.'),
|
|
72
|
+
text: z.string().min(1).optional().describe('Must match the prepared action exactly.'),
|
|
73
|
+
},
|
|
74
|
+
annotations: {
|
|
75
|
+
readOnlyHint: false,
|
|
76
|
+
destructiveHint: true,
|
|
77
|
+
idempotentHint: false,
|
|
78
|
+
openWorldHint: true,
|
|
79
|
+
},
|
|
80
|
+
portMethod: 'replyToInboxItem',
|
|
81
|
+
run: async (port, args, workspaceId, ctx) => {
|
|
82
|
+
const action = args.action;
|
|
83
|
+
const itemId = args.itemId;
|
|
84
|
+
const text = action === 'DELETE' ? undefined : args.text;
|
|
85
|
+
// Reserves the token before the platform call; released only if that call throws.
|
|
86
|
+
const release = redeem(args.confirmToken, { ws: workspaceId, itemId, action, text }, secretOf(ctx));
|
|
87
|
+
try {
|
|
88
|
+
if (action === 'REPLY') {
|
|
89
|
+
return await port.replyToInboxItem({ itemId, text: text }, workspaceId);
|
|
90
|
+
}
|
|
91
|
+
if (action === 'PRIVATE_REPLY') {
|
|
92
|
+
return await port.sendInboxPrivateReply({ itemId, text: text }, workspaceId);
|
|
93
|
+
}
|
|
94
|
+
return await port.setInboxItemState({ itemId, action: 'DELETE' }, workspaceId);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
release();
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
//# sourceMappingURL=inbox-confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-confirm.js","sourceRoot":"","sources":["../../../src/core/tools/inbox-confirm.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tools/inbox.js
CHANGED
|
@@ -63,7 +63,9 @@ export const inboxTools = [
|
|
|
63
63
|
name: 'list_inbox_items',
|
|
64
64
|
binding: 'both',
|
|
65
65
|
title: 'List Inbox Items',
|
|
66
|
-
description: 'List the items of one inbox conversation — the comments and the replies sent to them — oldest first by default (order=DESC for newest first). Items carry direction (INBOUND | OUTBOUND), state (VISIBLE | HIDDEN | DELETED), author info, and on Instagram comments canPrivateReply (eligibility for
|
|
66
|
+
description: (_binding, gated) => 'List the items of one inbox conversation — the comments and the replies sent to them — oldest first by default (order=DESC for newest first). Items carry direction (INBOUND | OUTBOUND), state (VISIBLE | HIDDEN | DELETED), author info, and on Instagram comments canPrivateReply (eligibility for ' +
|
|
67
|
+
(gated ? 'a PRIVATE_REPLY through prepare_inbox_action' : 'send_inbox_private_reply') +
|
|
68
|
+
'). Replies sent from PostFast appear exactly once — no duplicates when the platform reports them back.',
|
|
67
69
|
inputSchema: {
|
|
68
70
|
conversationId: z
|
|
69
71
|
.uuid()
|
|
@@ -101,6 +103,7 @@ export const inboxTools = [
|
|
|
101
103
|
// destructive: publishes a public comment; Threads exposes no delete verb, so a
|
|
102
104
|
// reply there cannot be removed through our API.
|
|
103
105
|
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
|
|
106
|
+
hiddenWhenGated: true,
|
|
104
107
|
portMethod: 'replyToInboxItem',
|
|
105
108
|
run: (port, args, workspaceId) => port.replyToInboxItem(args, workspaceId),
|
|
106
109
|
},
|
|
@@ -118,6 +121,7 @@ export const inboxTools = [
|
|
|
118
121
|
// destructive: sends a real direct message with no unsend path, and the
|
|
119
122
|
// once-per-comment guard means the attempt cannot be repeated.
|
|
120
123
|
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
|
|
124
|
+
hiddenWhenGated: true,
|
|
121
125
|
portMethod: 'sendInboxPrivateReply',
|
|
122
126
|
run: (port, args, workspaceId) => port.sendInboxPrivateReply(args, workspaceId),
|
|
123
127
|
},
|
|
@@ -125,14 +129,26 @@ export const inboxTools = [
|
|
|
125
129
|
name: 'set_inbox_item_state',
|
|
126
130
|
binding: 'both',
|
|
127
131
|
title: 'Moderate Inbox Comment',
|
|
128
|
-
description:
|
|
129
|
-
|
|
132
|
+
description: (_binding, gated) => gated
|
|
133
|
+
? 'Hide a comment from the public on the platform (HIDE) or restore it (UNHIDE). Works on TikTok, Instagram, Facebook and Threads and can be reversed. To delete a comment permanently, use prepare_inbox_action with action DELETE. State changes made on the platform itself sync back to the inbox automatically.'
|
|
134
|
+
: 'Moderate a comment on the platform: HIDE hides it from the public, UNHIDE restores it, DELETE removes the comment on the platform — cannot be undone. HIDE/UNHIDE work on TikTok, Instagram, Facebook, and Threads; DELETE is not supported on Threads (inbox.deleteNotSupported). State changes made on the platform itself sync back to the inbox automatically.',
|
|
135
|
+
inputSchema: (_binding, gated) => ({
|
|
130
136
|
itemId: z.uuid().describe('The comment item id (from list_inbox_items)'),
|
|
131
|
-
action:
|
|
132
|
-
.enum(
|
|
133
|
-
|
|
134
|
-
|
|
137
|
+
action: gated
|
|
138
|
+
? z.enum(['HIDE', 'UNHIDE']).describe('HIDE or UNHIDE')
|
|
139
|
+
: z
|
|
140
|
+
.enum(INBOX_ITEM_STATE_ACTIONS)
|
|
141
|
+
.describe('HIDE, UNHIDE, or DELETE (DELETE is irreversible)'),
|
|
142
|
+
}),
|
|
135
143
|
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
|
|
144
|
+
// Gated, DELETE moves to prepare/confirm_inbox_action, leaving only
|
|
145
|
+
// reversible HIDE/UNHIDE here.
|
|
146
|
+
gatedAnnotations: {
|
|
147
|
+
readOnlyHint: false,
|
|
148
|
+
destructiveHint: false,
|
|
149
|
+
idempotentHint: true,
|
|
150
|
+
openWorldHint: true,
|
|
151
|
+
},
|
|
136
152
|
portMethod: 'setInboxItemState',
|
|
137
153
|
run: (port, args, workspaceId) => port.setInboxItemState(args, workspaceId),
|
|
138
154
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../../src/core/tools/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,SAAS,GACV,MAAM,cAAc,CAAC;AAGtB;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAAc;IACnC;QACE,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACT,i2BAAi2B;QACn2B,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC1E,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAChF,cAAc,EAAE,CAAC;iBACd,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACf,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;YAC/E,QAAQ,EAAE,CAAC;iBACR,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;iBAC1C,QAAQ,EAAE;iBACV,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,UAAU,EAAE,CAAC;iBACV,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,yCAAyC,CAAC;YACtD,gBAAgB,EAAE,CAAC;iBAChB,IAAI,EAAE;iBACN,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;SACpE;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;QACjF,UAAU,EAAE,wBAAwB;QACpC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,sBAAuB,CAC1B,IAA6C,EAC7C,WAAW,CACZ;KACJ;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,8cAA8c;QAChd,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;SACzE;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;QACjF,UAAU,EAAE,sBAAsB;QAClC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,oBAAqB,CAAC,IAAI,CAAC,EAAY,EAAE,WAAW,CAAC;KAC7D;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,kBAAkB;QACzB,WAAW,
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../../src/core/tools/inbox.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tools/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { accountTools } from './accounts.js';
|
|
2
|
+
import { inboxConfirmTools } from './inbox-confirm.js';
|
|
2
3
|
import { inboxTools } from './inbox.js';
|
|
3
4
|
import { postTools } from './posts.js';
|
|
4
5
|
import { tiktokTools } from './tiktok.js';
|
|
@@ -17,5 +18,6 @@ export const ALL_TOOLS = [
|
|
|
17
18
|
...uploadTools,
|
|
18
19
|
...inboxTools,
|
|
19
20
|
...tiktokTools,
|
|
21
|
+
...inboxConfirmTools,
|
|
20
22
|
];
|
|
21
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,GAAG,SAAS;IACZ,GAAG,YAAY;IACf,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,UAAU;IACb,GAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,GAAG,SAAS;IACZ,GAAG,YAAY;IACf,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,UAAU;IACb,GAAG,WAAW;IACd,GAAG,iBAAiB;CACrB,CAAC"}
|
package/dist/core/tools/posts.js
CHANGED
|
@@ -207,9 +207,12 @@ export const postTools = [
|
|
|
207
207
|
name: 'create_posts',
|
|
208
208
|
binding: 'both',
|
|
209
209
|
title: 'Create Posts',
|
|
210
|
-
description: (binding) =>
|
|
210
|
+
description: (binding, gated) => (gated
|
|
211
|
+
? 'Create social media posts (batch up to 15), held for approval: nothing publishes until approve_posts sets them to APPROVED.'
|
|
212
|
+
: 'Create and schedule social media posts (batch up to 15).') +
|
|
213
|
+
' Each post targets one social account (socialMediaId from list_accounts). SCHEDULED requires scheduledAt on every post; DRAFT must omit scheduledAt. Scheduling to a disconnected account (connectionStatus DISABLED in list_accounts) is rejected with HTTP 400 "socialMediaDisconnected" — pre-check connectionStatus before calling. Saving as DRAFT to a disconnected account is allowed. TikTok, Instagram, YouTube, Pinterest, and Google Business Profile require at least one media item EVEN FOR DRAFTS — attach media first (ask the user for an image/video, or generate+upload one, if none was provided). Attach media via the key returned by ' +
|
|
211
214
|
`${UPLOAD_TOOLS[binding]}.`,
|
|
212
|
-
inputSchema: (binding) => ({
|
|
215
|
+
inputSchema: (binding, gated) => ({
|
|
213
216
|
posts: jsonParse(z
|
|
214
217
|
.array(postItemSchema(binding))
|
|
215
218
|
.min(1)
|
|
@@ -219,25 +222,34 @@ export const postTools = [
|
|
|
219
222
|
.enum(CREATE_STATUSES)
|
|
220
223
|
.default('SCHEDULED')
|
|
221
224
|
.describe('Post status. SCHEDULED requires scheduledAt on every post.'),
|
|
222
|
-
approvalStatus:
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
225
|
+
approvalStatus: gated
|
|
226
|
+
? z
|
|
227
|
+
.enum(['PENDING_APPROVAL'])
|
|
228
|
+
.default('PENDING_APPROVAL')
|
|
229
|
+
.describe('Posts created here are always held for approval. Publish them with approve_posts after the user confirms.')
|
|
230
|
+
: z
|
|
231
|
+
.enum(CREATE_APPROVAL_STATUSES)
|
|
232
|
+
.default('APPROVED')
|
|
233
|
+
.describe('Approval workflow status'),
|
|
226
234
|
controls: jsonParse(controlsSchema
|
|
227
235
|
.optional()
|
|
228
236
|
.describe('Platform-specific controls (shared across all posts in the batch)')),
|
|
229
237
|
}),
|
|
230
238
|
// destructive: a SCHEDULED+APPROVED post (both defaults) publishes publicly and
|
|
231
239
|
// cannot be retracted through our API — delete_post removes our row, not the
|
|
232
|
-
// platform post.
|
|
240
|
+
// platform post. Gated, every post is created held, so the call only writes to
|
|
241
|
+
// PostFast (removable with delete_post); approve_posts is what publishes.
|
|
233
242
|
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
|
|
243
|
+
gatedAnnotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
234
244
|
run: (port, args, workspaceId) => port.createPosts(args, workspaceId),
|
|
235
245
|
},
|
|
236
246
|
{
|
|
237
247
|
name: 'approve_posts',
|
|
238
248
|
binding: 'remote',
|
|
239
249
|
title: 'Approve Posts',
|
|
240
|
-
description:
|
|
250
|
+
description: (_binding, gated) => gated
|
|
251
|
+
? 'Approve posts so they publish at their scheduled time. This is the only way a post created with create_posts goes out, so show the user exactly what will be posted, where and when, and call this only after they say yes in the conversation, even if they asked you to post it. Can also set PENDING_APPROVAL, REJECTED or NEEDS_WORK. If its scheduled time passed more than 2 hours ago, create the post again with a new time instead of approving it, and delete the old one.'
|
|
252
|
+
: 'Set the approval status of one or more posts (approval workflow). Typically used to move posts to APPROVED so they can publish, or to PENDING_APPROVAL / REJECTED / NEEDS_WORK.',
|
|
241
253
|
inputSchema: {
|
|
242
254
|
postIds: z.array(z.uuid()).min(1).describe('Post ids to update'),
|
|
243
255
|
approvalStatus: z.enum(SET_APPROVAL_STATUSES).describe('New approval status'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posts.js","sourceRoot":"","sources":["../../../src/core/tools/posts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"posts.js","sourceRoot":"","sources":["../../../src/core/tools/posts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,SAAS,GACV,MAAM,cAAc,CAAC;AAGtB,6EAA6E;AAC7E,MAAM,YAAY,GAA4B;IAC5C,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,gCAAgC;CACzC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAE,EAAE,CAC3C,CAAC,CAAC,MAAM,CAAC;IACP,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,CAAC,kBAAkB,YAAY,CAAC,OAAO,CAAC,0BAA0B,CAAC;IAC9E,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,+IAA+I,CAChJ;IACH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yGAAyG,CAC1G;CACJ,CAAC,CAAC;AAEL,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAE,EAAE,CAC1C,CAAC,CAAC,MAAM,CAAC;IACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IACjD,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,mJAAmJ,CACpJ;IACH,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SAC/B,QAAQ,EAAE;SACV,QAAQ,CAAC,mBAAmB,CAAC;IAChC,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;CAClF,CAAC,CAAC;AAEL,0EAA0E;AAC1E,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,YAAY;IACZ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS;IACT,aAAa,EAAE,CAAC;SACb,IAAI,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;SACpE,QAAQ,EAAE;SACV,QAAQ,CACP,8IAA8I,CAC/I;IACH,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACrC,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACvC,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACzC,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC1C,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC1C,kBAAkB,EAAE,CAAC;SAClB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,2JAA2J,CAC5J;IACH,YAAY,EAAE,CAAC;SACZ,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,kKAAkK,CACnK;IACH,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CACP,wMAAwM,CACzM;IACH,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,iXAAiX,CAClX;IACH,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,qJAAqJ,CACtJ;IACH,YAAY;IACZ,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtE,0BAA0B,EAAE,CAAC;SAC1B,IAAI,CAAC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;SAClC,QAAQ,EAAE;SACV,QAAQ,CACP,ocAAoc,CACrc;IACH,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtD,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,4KAA4K,CAC7K;IACH,qBAAqB,EAAE,CAAC;SACrB,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0FAA0F,CAC3F;IACH,sBAAsB,EAAE,CAAC;SACtB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,+WAA+W,CAChX;IACH,UAAU;IACV,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACtC,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC1C,6BAA6B,EAAE,CAAC;SAC7B,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,kNAAkN,CACnN;IACH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;IACrF,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,iGAAiG,CAClG;IACH,WAAW;IACX,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjE,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7C,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;SACzD,QAAQ,EAAE;IACb,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/C,2BAA2B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnD,0BAA0B,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1D,uBAAuB,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC3B,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CACP,kMAAkM,CACnM;IACH,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,mMAAmM,CACpM;IACH,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0FAA0F,CAC3F;IACH,0BAA0B;IAC1B,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,2EAA2E,CAAC;IACxF,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IACrF,mBAAmB,EAAE,CAAC;SACnB,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SAChE,QAAQ,EAAE;IACb,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yDAAyD,CAAC;IACtE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC3F,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IAC1F,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACtF,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC9E,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAChF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAClF,YAAY;IACZ,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,qGAAqG,CACtG;IACH,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW;IACX,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,8WAA8W;QAChX,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC1E,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,yBAAyB,CAAC;YACtC,GAAG,EAAE,CAAC;iBACH,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACf,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,kFAAkF,CAAC;YAC/F,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAChF,QAAQ,EAAE,CAAC;iBACR,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBAC5B,QAAQ,EAAE;iBACV,QAAQ,CAAC,yBAAyB,CAAC;YACtC,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6DAA6D,CAAC;YAC1E,EAAE,EAAE,CAAC;iBACF,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,2DAA2D,CAAC;SACzE;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;QACjF,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,SAAS,CAAC,IAAgC,EAAE,WAAW,CAAC;KAChE;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAC9B,CAAC,KAAK;YACJ,CAAC,CAAC,6HAA6H;YAC/H,CAAC,CAAC,0DAA0D,CAAC;YAC/D,8nBAA8nB;YAC9nB,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG;QAC7B,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAChC,KAAK,EAAE,SAAS,CACd,CAAC;iBACE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;iBAC9B,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,CAAC,iCAAiC,CAAC,CAC/C;YACD,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,eAAe,CAAC;iBACrB,OAAO,CAAC,WAAW,CAAC;iBACpB,QAAQ,CAAC,4DAA4D,CAAC;YACzE,cAAc,EAAE,KAAK;gBACnB,CAAC,CAAC,CAAC;qBACE,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC;qBAC1B,OAAO,CAAC,kBAAkB,CAAC;qBAC3B,QAAQ,CACP,2GAA2G,CAC5G;gBACL,CAAC,CAAC,CAAC;qBACE,IAAI,CAAC,wBAAwB,CAAC;qBAC9B,OAAO,CAAC,UAAU,CAAC;qBACnB,QAAQ,CAAC,0BAA0B,CAAC;YAC3C,QAAQ,EAAE,SAAS,CACjB,cAAc;iBACX,QAAQ,EAAE;iBACV,QAAQ,CAAC,mEAAmE,CAAC,CACjF;SACF,CAAC;QACF,gFAAgF;QAChF,6EAA6E;QAC7E,+EAA+E;QAC/E,0EAA0E;QAC1E,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;QAChF,gBAAgB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;QACvF,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,WAAW,CAAC,IAAkC,EAAE,WAAW,CAAC;KACpE;IACD;QACE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAC/B,KAAK;YACH,CAAC,CAAC,sdAAsd;YACxd,CAAC,CAAC,iLAAiL;QACvL,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAChE,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;SAC9E;QACD,+EAA+E;QAC/E,yDAAyD;QACzD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;QAChF,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,YAAY,CAAC,IAAmC,EAAE,WAAW,CAAC;KACtE;IACD;QACE,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,mYAAmY;QACrY,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SAC3C;QACD,gFAAgF;QAChF,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAY,EAAE,WAAW,CAAC;KAClF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,mzCAAmzC;QACrzC,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,CAAC,+DAA+D,CAAC;YAC5E,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CAAC,6DAA6D,CAAC;YAC1E,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAChF,cAAc,EAAE,CAAC;iBACd,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACf,QAAQ,EAAE;iBACV,QAAQ,CAAC,6CAA6C,CAAC;SAC3D;QACD,2EAA2E;QAC3E,iCAAiC;QACjC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;QACjF,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAgC,EAAE,WAAW,CAAC;KACvE;CACF,CAAC"}
|
|
@@ -45,7 +45,11 @@ export const uploadTools = [
|
|
|
45
45
|
name: 'upload_from_url',
|
|
46
46
|
binding: 'remote',
|
|
47
47
|
title: 'Upload Media From URL',
|
|
48
|
-
description: 'Fetch media from a public https URL and store it for use in create_posts. Returns { media_id, type }; pass media_id as a mediaItems[].key.
|
|
48
|
+
description: (_binding, gated) => 'Fetch media from a public https URL and store it for use in create_posts. Returns { media_id, type }; pass media_id as a mediaItems[].key. ' +
|
|
49
|
+
(gated
|
|
50
|
+
? 'Use this when the media is already at a public https URL, such as a CDN or hosted image.'
|
|
51
|
+
: 'Ideal for ChatGPT/Claude-generated image URLs and remote CDN media.') +
|
|
52
|
+
' Redirects are followed (each hop is SSRF-validated); the URL must be public https and within the size limit. Supported types: image/jpeg, image/png, image/gif, image/webp, video/mp4, video/webm, video/quicktime.',
|
|
49
53
|
inputSchema: {
|
|
50
54
|
sourceUrl: z.url().describe('Public https URL of the media to upload'),
|
|
51
55
|
contentType: z
|
|
@@ -60,8 +64,10 @@ export const uploadTools = [
|
|
|
60
64
|
name: 'upload_media',
|
|
61
65
|
binding: 'remote',
|
|
62
66
|
title: 'Upload Media',
|
|
63
|
-
description:
|
|
64
|
-
|
|
67
|
+
description: (_binding, gated) => gated
|
|
68
|
+
? "Upload an image or video for use in create_posts. If the media is already at a public https URL, use upload_from_url instead. Otherwise pass the file as base64 bytes in `data` with its MIME type in `contentType`. If you cannot read the file's bytes, ask the user for a public https link and use upload_from_url. Clients that attach files natively may supply `file` instead. Returns { media_id, type }; use media_id as a mediaItems[].key. Supported types: image/jpeg, image/png, image/gif, image/webp, video/mp4, video/webm, video/quicktime."
|
|
69
|
+
: 'Upload an image/video that is present in this conversation, for use in create_posts. Pass EITHER a ChatGPT-attached or model-generated file (the `file` argument — ChatGPT fills this automatically) OR base64 bytes (`data` + `contentType`). Returns { media_id, type }; use media_id as a mediaItems[].key. For large or remote media, prefer upload_from_url. Supported types: image/jpeg, image/png, image/gif, image/webp, video/mp4, video/webm, video/quicktime.',
|
|
70
|
+
inputSchema: (_binding, gated) => ({
|
|
65
71
|
file: z
|
|
66
72
|
.object({
|
|
67
73
|
download_url: z.url().describe('Temporary URL to fetch the file'),
|
|
@@ -70,7 +76,9 @@ export const uploadTools = [
|
|
|
70
76
|
file_name: z.string().optional(),
|
|
71
77
|
})
|
|
72
78
|
.optional()
|
|
73
|
-
.describe(
|
|
79
|
+
.describe(gated
|
|
80
|
+
? 'A file supplied natively by the client, for clients that support attaching files to tool calls. If yours does not, leave this empty and use data + contentType.'
|
|
81
|
+
: 'A ChatGPT-provided file (attached or generated). Filled in automatically by ChatGPT.'),
|
|
74
82
|
data: z
|
|
75
83
|
.string()
|
|
76
84
|
.optional()
|
|
@@ -79,7 +87,7 @@ export const uploadTools = [
|
|
|
79
87
|
.string()
|
|
80
88
|
.optional()
|
|
81
89
|
.describe('MIME type for base64 data (e.g. image/png). Required with data.'),
|
|
82
|
-
},
|
|
90
|
+
}),
|
|
83
91
|
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
|
|
84
92
|
_meta: { 'openai/fileParams': ['file'] },
|
|
85
93
|
run: (port, args, workspaceId) => port.uploadMedia(args, workspaceId),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../../src/core/tools/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGlE,MAAM,oBAAoB,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,oIAAoI;QACtI,WAAW,EAAE;YACX,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,qCAAqC,oBAAoB,EAAE,CAAC;YACxE,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,CAAC,CAAC;iBACN,OAAO,CAAC,CAAC,CAAC;iBACV,QAAQ,CAAC,sDAAsD,CAAC;SACpE;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;QACjF,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,aAAa,CAAC,IAAiC,EAAE,WAAW,CAAC;KACrE;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,mMAAmM;QACrM,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,CAAC,4DAA4D,CAAC;SAC1E;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;QACjF,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAkB,CAAC;KACnE;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,
|
|
1
|
+
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../../src/core/tools/uploads.ts"],"names":[],"mappings":"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"}
|
package/dist/stdio/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { instructionsFor } from '../core/instructions.js';
|
|
|
6
6
|
import { RestAdapter } from './rest-adapter.js';
|
|
7
7
|
const server = new McpServer({
|
|
8
8
|
name: 'postfast',
|
|
9
|
-
version: '0.
|
|
9
|
+
version: '0.7.1',
|
|
10
10
|
}, { instructions: instructionsFor('stdio') });
|
|
11
11
|
const port = new RestAdapter();
|
|
12
12
|
registerCatalogTools(server, { binding: 'stdio', port });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "postfast-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"mcpName": "io.github.peturgeorgievv-factory/postfast-mcp",
|
|
5
5
|
"description": "MCP server for the PostFast API — schedule and manage social media posts via AI tools",
|
|
6
6
|
"type": "module",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"build": "tsc",
|
|
29
29
|
"dev": "tsc --watch",
|
|
30
30
|
"start": "node dist/stdio/index.js",
|
|
31
|
+
"test": "npm run build && node --test test/*.test.mjs",
|
|
31
32
|
"version": "changeset version && node scripts/stamp-versions.mjs",
|
|
32
33
|
"prepublishOnly": "npm run build"
|
|
33
34
|
},
|