posterly-mcp-server 0.44.0 → 0.45.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.
Files changed (155) hide show
  1. package/README.md +310 -111
  2. package/dist/index.js +190 -894
  3. package/dist/lib/alias-transport.d.ts +84 -0
  4. package/dist/lib/alias-transport.js +193 -0
  5. package/dist/lib/api-client.d.ts +18 -0
  6. package/dist/lib/api-client.js +55 -0
  7. package/dist/lib/preview-token-core.d.ts +62 -0
  8. package/dist/lib/preview-token-core.js +131 -0
  9. package/dist/lib/preview-token.d.ts +23 -0
  10. package/dist/lib/preview-token.js +44 -0
  11. package/dist/lib/tool-registry.d.ts +246 -0
  12. package/dist/lib/tool-registry.js +394 -0
  13. package/dist/lib/tool-runtime.d.ts +68 -0
  14. package/dist/lib/tool-runtime.js +85 -0
  15. package/dist/lib/version.d.ts +1 -1
  16. package/dist/lib/version.js +1 -1
  17. package/dist/tools/audit-google-business-profile.js +1 -1
  18. package/dist/tools/connect-account.d.ts +4 -4
  19. package/dist/tools/connect-account.js +2 -2
  20. package/dist/tools/create-connect-session.d.ts +2 -2
  21. package/dist/tools/create-connect-session.js +2 -2
  22. package/dist/tools/create-post.d.ts +6 -6
  23. package/dist/tools/create-post.js +3 -3
  24. package/dist/tools/create-posts-batch.d.ts +4 -4
  25. package/dist/tools/create-webhook.d.ts +2 -2
  26. package/dist/tools/delete-post.d.ts +34 -10
  27. package/dist/tools/delete-post.js +52 -16
  28. package/dist/tools/generate-captions.d.ts +2 -2
  29. package/dist/tools/generate-image.d.ts +4 -4
  30. package/dist/tools/generate-image.js +2 -2
  31. package/dist/tools/generate-video.d.ts +6 -6
  32. package/dist/tools/generate-video.js +1 -1
  33. package/dist/tools/get-agent-signup-info.js +2 -2
  34. package/dist/tools/get-post.d.ts +16 -1
  35. package/dist/tools/get-post.js +35 -19
  36. package/dist/tools/list-accounts.d.ts +49 -3
  37. package/dist/tools/list-accounts.js +148 -33
  38. package/dist/tools/list-analytics.d.ts +111 -0
  39. package/dist/tools/list-analytics.js +393 -0
  40. package/dist/tools/list-brands.d.ts +38 -3
  41. package/dist/tools/list-brands.js +138 -20
  42. package/dist/tools/list-comments.d.ts +29 -9
  43. package/dist/tools/list-comments.js +75 -34
  44. package/dist/tools/list-conversations.d.ts +32 -9
  45. package/dist/tools/list-conversations.js +63 -27
  46. package/dist/tools/list-google-business-media.js +1 -1
  47. package/dist/tools/list-google-business-reviews.d.ts +32 -9
  48. package/dist/tools/list-google-business-reviews.js +77 -52
  49. package/dist/tools/list-jobs.d.ts +60 -0
  50. package/dist/tools/list-jobs.js +81 -0
  51. package/dist/tools/list-platforms.d.ts +62 -3
  52. package/dist/tools/list-platforms.js +118 -9
  53. package/dist/tools/list-posts.d.ts +2 -2
  54. package/dist/tools/manage-comment.d.ts +102 -0
  55. package/dist/tools/manage-comment.js +125 -0
  56. package/dist/tools/manage-conversation.d.ts +79 -0
  57. package/dist/tools/manage-conversation.js +75 -0
  58. package/dist/tools/manage-google-business-media.d.ts +103 -0
  59. package/dist/tools/manage-google-business-media.js +126 -0
  60. package/dist/tools/manage-google-business-review.d.ts +146 -0
  61. package/dist/tools/manage-google-business-review.js +115 -0
  62. package/dist/tools/manage-oauth-client.d.ts +121 -0
  63. package/dist/tools/manage-oauth-client.js +94 -0
  64. package/dist/tools/manage-webhook.d.ts +99 -0
  65. package/dist/tools/manage-webhook.js +87 -0
  66. package/dist/tools/start-signup.d.ts +2 -2
  67. package/dist/tools/submit-agent-feedback.d.ts +4 -4
  68. package/dist/tools/trigger-platform-helper.d.ts +2 -2
  69. package/dist/tools/update-post.d.ts +62 -11
  70. package/dist/tools/update-post.js +79 -26
  71. package/dist/tools/upload-media.d.ts +32 -9
  72. package/dist/tools/upload-media.js +54 -18
  73. package/dist/tools/validate-post.d.ts +4 -4
  74. package/dist/tools/whoami.d.ts +15 -2
  75. package/dist/tools/whoami.js +221 -25
  76. package/package.json +5 -3
  77. package/scripts/test-alias-transport.mjs +368 -0
  78. package/scripts/test-client-header-sanitization.mjs +78 -0
  79. package/scripts/test-tool-annotations.mjs +38 -17
  80. package/server.json +9 -2
  81. package/src/index.ts +227 -1443
  82. package/src/lib/alias-transport.ts +233 -0
  83. package/src/lib/api-client.ts +65 -0
  84. package/src/lib/preview-token-core.ts +157 -0
  85. package/src/lib/preview-token.ts +54 -0
  86. package/src/lib/tool-registry.ts +538 -0
  87. package/src/lib/tool-runtime.ts +117 -0
  88. package/src/lib/version.ts +1 -1
  89. package/src/tools/audit-google-business-profile.ts +1 -1
  90. package/src/tools/connect-account.ts +2 -2
  91. package/src/tools/create-connect-session.ts +2 -2
  92. package/src/tools/create-post.ts +3 -3
  93. package/src/tools/delete-post.ts +60 -19
  94. package/src/tools/generate-image.ts +2 -2
  95. package/src/tools/generate-video.ts +1 -1
  96. package/src/tools/get-agent-signup-info.ts +2 -2
  97. package/src/tools/get-post.ts +35 -21
  98. package/src/tools/list-accounts.ts +187 -39
  99. package/src/tools/list-analytics.ts +444 -0
  100. package/src/tools/list-brands.ts +162 -26
  101. package/src/tools/list-comments.ts +86 -43
  102. package/src/tools/list-conversations.ts +81 -39
  103. package/src/tools/list-google-business-media.ts +1 -1
  104. package/src/tools/list-google-business-reviews.ts +93 -64
  105. package/src/tools/list-jobs.ts +91 -0
  106. package/src/tools/list-platforms.ts +135 -11
  107. package/src/tools/manage-comment.ts +142 -0
  108. package/src/tools/manage-conversation.ts +89 -0
  109. package/src/tools/manage-google-business-media.ts +147 -0
  110. package/src/tools/manage-google-business-review.ts +139 -0
  111. package/src/tools/manage-oauth-client.ts +116 -0
  112. package/src/tools/manage-webhook.ts +103 -0
  113. package/src/tools/update-post.ts +106 -39
  114. package/src/tools/upload-media.ts +76 -28
  115. package/src/tools/whoami.ts +253 -30
  116. package/tool-annotations.json +76 -149
  117. package/tool-registry.json +2085 -0
  118. package/src/tools/add-google-business-media.ts +0 -50
  119. package/src/tools/create-oauth-client.ts +0 -36
  120. package/src/tools/delete-comment.ts +0 -29
  121. package/src/tools/delete-google-business-media.ts +0 -30
  122. package/src/tools/delete-google-business-review-reply.ts +0 -30
  123. package/src/tools/delete-oauth-client.ts +0 -23
  124. package/src/tools/delete-post-group.ts +0 -17
  125. package/src/tools/delete-webhook.ts +0 -17
  126. package/src/tools/get-account-analytics.ts +0 -171
  127. package/src/tools/get-brand-profile.ts +0 -86
  128. package/src/tools/get-brand.ts +0 -34
  129. package/src/tools/get-comment.ts +0 -47
  130. package/src/tools/get-connect-link.ts +0 -61
  131. package/src/tools/get-connect-session.ts +0 -63
  132. package/src/tools/get-conversation.ts +0 -44
  133. package/src/tools/get-google-business-review-link.ts +0 -30
  134. package/src/tools/get-image-job.ts +0 -36
  135. package/src/tools/get-learned-voice.ts +0 -31
  136. package/src/tools/get-mcp-status.ts +0 -212
  137. package/src/tools/get-performance-profile.ts +0 -47
  138. package/src/tools/get-platform-schema.ts +0 -56
  139. package/src/tools/get-post-analytics.ts +0 -243
  140. package/src/tools/get-post-insights.ts +0 -60
  141. package/src/tools/get-post-missing.ts +0 -16
  142. package/src/tools/get-video-job.ts +0 -36
  143. package/src/tools/list-brand-accounts.ts +0 -36
  144. package/src/tools/reply-google-business-review.ts +0 -32
  145. package/src/tools/reply-to-comment.ts +0 -30
  146. package/src/tools/send-message.ts +0 -28
  147. package/src/tools/suggest-google-business-review-reply.ts +0 -44
  148. package/src/tools/sync-inbox.ts +0 -28
  149. package/src/tools/test-webhook.ts +0 -18
  150. package/src/tools/update-comment.ts +0 -31
  151. package/src/tools/update-oauth-client.ts +0 -38
  152. package/src/tools/update-post-release-id.ts +0 -25
  153. package/src/tools/update-post-status.ts +0 -31
  154. package/src/tools/update-webhook.ts +0 -36
  155. package/src/tools/upload-media-from-url.ts +0 -33
@@ -1,39 +1,262 @@
1
1
  import { z } from 'zod';
2
+ import { POSTERLY_MCP_VERSION } from '../lib/version.js';
2
3
  import type { PosterlyClient } from '../lib/api-client.js';
4
+ import { resolvePosterlyBaseUrl } from '../lib/api-client.js';
3
5
  import { code, mdKeyValue, mdTable, mdTitle } from '../lib/format.js';
6
+ import { validateArgs, type ToolContext } from '../lib/tool-runtime.js';
7
+
8
+ const NPM_LATEST_URL = 'https://registry.npmjs.org/posterly-mcp-server/latest';
4
9
 
5
10
  export const whoamiTool = {
6
11
  name: 'whoami',
7
12
  description:
8
- 'Return the authenticated user, API key scopes, workspaces, and onboarding next step. ALWAYS call this at the start of a session. If onboarding.completed is false, walk the remaining onboarding steps IN THIS conversation (about you, connect, brand voice, first post). Do not send the user to /onboarding-v2 or the dashboard composer wizard.',
9
- inputSchema: z.object({}),
10
-
11
- async execute(client: PosterlyClient) {
12
- const info = await client.whoami();
13
-
14
- return [
15
- mdTitle('posterly identity'),
16
- mdKeyValue([
17
- ['User', info.user.email || code(info.user.id)],
18
- ['API scopes', info.api_key.scopes.join(', ') || 'none'],
19
- ['Default workspace', `${info.default_workspace.name} (${code(info.default_workspace.id)})`],
20
- ['Default timezone', info.default_workspace.timezone || 'n/a'],
21
- ['Onboarding', info.onboarding?.completed ? 'complete' : info.onboarding?.next_step_label || 'unknown'],
22
- ]),
23
- info.onboarding && !info.onboarding.completed
24
- ? `**Onboarding next:** ${info.onboarding.next_step_label}. ${info.onboarding.instruction}`
25
- : '',
26
- mdTable(
27
- ['Workspace', 'Workspace ID', 'Role', 'Timezone', 'Default'],
28
- info.workspaces.map((workspace) => [
29
- `${workspace.name}${workspace.is_personal ? ' (personal)' : ''}`,
30
- code(workspace.id),
31
- workspace.role || 'member',
32
- workspace.timezone || 'n/a',
33
- workspace.id === info.default_workspace.id,
34
- ]),
35
- ),
36
- '**Tip:** Pass `workspace_id` to `create_post`, `list_posts`, `list_accounts`, and `find_available_slot` when you want the assistant to stay inside one workspace.',
37
- ].filter(Boolean).join('\n\n');
13
+ 'Who you are and how posterly is connected. view=identity (default): the authenticated user, API key scopes, workspaces, and onboarding next step. ALWAYS call this at the start of a session; if onboarding.completed is false, walk the remaining onboarding steps IN THIS conversation (about you, connect, brand voice, first post) and do not send the user to /onboarding-v2 or the dashboard composer wizard. view=status: MCP server version, latest npm version, endpoint and API key health, and update guidance; works before POSTERLY_API_KEY is configured.',
14
+ inputSchema: z.object({
15
+ view: z
16
+ .enum(['identity', 'status'])
17
+ .optional()
18
+ .describe('identity (default): user, scopes, workspaces, onboarding. status: MCP server and connection health.'),
19
+ }),
20
+ /** The old tools' exact input schemas, for alias calls (see alias-transport.ts). */
21
+ legacySchemas: {
22
+ get_mcp_status: z.object({}),
23
+ },
24
+
25
+ async execute(client: PosterlyClient, input: { view?: 'identity' | 'status' }, ctx: ToolContext) {
26
+ const { mode } = validateArgs(ctx, 'whoami', input);
27
+ if (mode === 'status') return mcpStatus(client);
28
+ return identity(client, ctx);
38
29
  },
39
30
  };
31
+
32
+ async function identity(client: PosterlyClient, ctx: ToolContext): Promise<string> {
33
+ const info = await client.whoami();
34
+
35
+ const text = [
36
+ mdTitle('posterly identity'),
37
+ mdKeyValue([
38
+ ['User', info.user.email || code(info.user.id)],
39
+ ['API scopes', info.api_key.scopes.join(', ') || 'none'],
40
+ ['Default workspace', `${info.default_workspace.name} (${code(info.default_workspace.id)})`],
41
+ ['Default timezone', info.default_workspace.timezone || 'n/a'],
42
+ ['Onboarding', info.onboarding?.completed ? 'complete' : info.onboarding?.next_step_label || 'unknown'],
43
+ ]),
44
+ info.onboarding && !info.onboarding.completed
45
+ ? `**Onboarding next:** ${info.onboarding.next_step_label}. ${info.onboarding.instruction}`
46
+ : '',
47
+ mdTable(
48
+ ['Workspace', 'Workspace ID', 'Role', 'Timezone', 'Default'],
49
+ info.workspaces.map((workspace) => [
50
+ `${workspace.name}${workspace.is_personal ? ' (personal)' : ''}`,
51
+ code(workspace.id),
52
+ workspace.role || 'member',
53
+ workspace.timezone || 'n/a',
54
+ workspace.id === info.default_workspace.id,
55
+ ]),
56
+ ),
57
+ '**Tip:** Pass `workspace_id` to `create_post`, `list_posts`, `list_accounts`, and `find_available_slot` when you want the assistant to stay inside one workspace.',
58
+ ].filter(Boolean).join('\n\n');
59
+
60
+ // Only when tool sets are filtered, so the default answer is unchanged.
61
+ const toolsets = ctx.toolsets;
62
+ if (!toolsets || toolsets.all) return text;
63
+ return `${text}\n\n**Tool sets:** ${toolsets.enabled.join(', ')} are listed in this connection. Every tool can still be called by name. To list every set, unset POSTERLY_TOOLSETS (or set it to all) and restart the MCP client.`;
64
+ }
65
+
66
+ async function mcpStatus(client: PosterlyClient): Promise<string> {
67
+ const apiOrigin = client.getBaseUrl();
68
+ const [latest, apiProbe, authProbe] = await Promise.all([
69
+ fetchLatestNpmVersion(),
70
+ probeHostedMcp(apiOrigin),
71
+ client.hasApiKey() ? client.probeWhoami() : Promise.resolve(null),
72
+ ]);
73
+ const updateStatus = describeUpdateStatus(POSTERLY_MCP_VERSION, latest.version, latest.error);
74
+ const versionMatch = apiProbe.version ? yesNo(apiProbe.version === POSTERLY_MCP_VERSION) : 'unknown';
75
+ const rows: Array<[string, string | number | boolean]> = [
76
+ ['Connection type', 'local app process (stdio)'],
77
+ ['Current server version', POSTERLY_MCP_VERSION],
78
+ ['Latest npm version', latest.version || 'unknown'],
79
+ ['Update status', updateStatus],
80
+ ['posterly API origin', code(apiOrigin)],
81
+ ['MCP endpoint health', formatApiProbe(apiProbe)],
82
+ ['Hosted MCP version', apiProbe.version || 'unknown'],
83
+ ['Version match', versionMatch],
84
+ ['API key configured', client.hasApiKey()],
85
+ ['API auth check', formatAuthProbe(authProbe)],
86
+ ];
87
+
88
+ if (authProbe?.ok && authProbe.whoami) {
89
+ rows.push(
90
+ ['User', authProbe.whoami.user.email || code(authProbe.whoami.user.id)],
91
+ ['Default workspace', `${authProbe.whoami.default_workspace.name} (${code(authProbe.whoami.default_workspace.id)})`],
92
+ ['API scopes', authProbe.whoami.api_key.scopes.join(', ') || 'none'],
93
+ );
94
+ }
95
+
96
+ return [
97
+ mdTitle('posterly MCP status'),
98
+ mdKeyValue(rows),
99
+ latest.error ? `**Latest check:** ${latest.error}` : '',
100
+ apiProbe.error ? `**MCP endpoint check:** ${apiProbe.error}` : '',
101
+ authProbe && !authProbe.ok ? `**API auth check:** ${authProbe.error || 'API key validation failed'}` : '',
102
+ nextStep({ hasApiKey: client.hasApiKey(), updateStatus, apiProbe, authProbe }),
103
+ ].filter(Boolean).join('\n\n');
104
+ }
105
+
106
+ type HostedMcpProbe = {
107
+ ok: boolean;
108
+ status?: number;
109
+ version?: string;
110
+ error?: string;
111
+ durationMs: number;
112
+ };
113
+
114
+ type AuthProbe = Awaited<ReturnType<PosterlyClient['probeWhoami']>> | null;
115
+
116
+ async function probeHostedMcp(apiOrigin: string): Promise<HostedMcpProbe> {
117
+ const startedAt = Date.now();
118
+ const controller = new AbortController();
119
+ const timeout = setTimeout(() => controller.abort(), 2500);
120
+
121
+ try {
122
+ const res = await fetch(`${resolvePosterlyBaseUrl(apiOrigin)}/api/mcp`, {
123
+ headers: { Accept: 'application/json' },
124
+ signal: controller.signal,
125
+ });
126
+ const text = await res.text();
127
+ const data = parseJson(text);
128
+ if (!res.ok) {
129
+ return {
130
+ ok: false,
131
+ status: res.status,
132
+ error: formatError(data, text, res.statusText),
133
+ durationMs: Date.now() - startedAt,
134
+ };
135
+ }
136
+ const version = typeof data?.serverInfo?.version === 'string' ? data.serverInfo.version : undefined;
137
+ return {
138
+ ok: Boolean(version),
139
+ status: res.status,
140
+ version,
141
+ error: version ? undefined : 'Hosted MCP response did not include serverInfo.version',
142
+ durationMs: Date.now() - startedAt,
143
+ };
144
+ } catch (err: any) {
145
+ return {
146
+ ok: false,
147
+ error: err?.name === 'AbortError' ? 'timed out after 2500ms' : err?.message || String(err),
148
+ durationMs: Date.now() - startedAt,
149
+ };
150
+ } finally {
151
+ clearTimeout(timeout);
152
+ }
153
+ }
154
+
155
+ async function fetchLatestNpmVersion(): Promise<{ version?: string; error?: string }> {
156
+ const controller = new AbortController();
157
+ const timeout = setTimeout(() => controller.abort(), 2500);
158
+
159
+ try {
160
+ const res = await fetch(NPM_LATEST_URL, {
161
+ headers: { Accept: 'application/json' },
162
+ signal: controller.signal,
163
+ });
164
+ if (!res.ok) {
165
+ return { error: `npm registry returned HTTP ${res.status}` };
166
+ }
167
+ const data = await res.json() as { version?: unknown };
168
+ return typeof data.version === 'string'
169
+ ? { version: data.version }
170
+ : { error: 'npm registry response did not include a version' };
171
+ } catch (err: any) {
172
+ const reason = err?.name === 'AbortError' ? 'timed out' : err?.message || String(err);
173
+ return { error: `could not check npm latest: ${reason}` };
174
+ } finally {
175
+ clearTimeout(timeout);
176
+ }
177
+ }
178
+
179
+ function describeUpdateStatus(current: string, latest?: string, error?: string): string {
180
+ if (!latest) return error ? 'unknown' : 'unknown';
181
+
182
+ const comparison = compareSemver(current, latest);
183
+ if (comparison < 0) {
184
+ return `update available: restart the MCP client or run ${code('npx -y posterly-mcp-server@latest')}`;
185
+ }
186
+ if (comparison > 0) {
187
+ return 'running newer than npm latest; npm may not have been published yet';
188
+ }
189
+ return 'current';
190
+ }
191
+
192
+ function formatApiProbe(probe: HostedMcpProbe): string {
193
+ if (probe.ok) return `ok (HTTP ${probe.status}, ${probe.durationMs}ms)`;
194
+ const status = probe.status ? `HTTP ${probe.status}` : 'network';
195
+ return `failed (${status}, ${probe.durationMs}ms)`;
196
+ }
197
+
198
+ function formatAuthProbe(probe: AuthProbe): string {
199
+ if (!probe) return 'skipped (POSTERLY_API_KEY not configured)';
200
+ if (probe.ok) return `valid (HTTP ${probe.status}, ${probe.durationMs}ms)`;
201
+ const status = probe.status ? `HTTP ${probe.status}` : 'network';
202
+ return `failed (${status}, ${probe.durationMs}ms)`;
203
+ }
204
+
205
+ function nextStep(input: {
206
+ hasApiKey: boolean;
207
+ updateStatus: string;
208
+ apiProbe: HostedMcpProbe;
209
+ authProbe: AuthProbe;
210
+ }): string {
211
+ const { hasApiKey, updateStatus, apiProbe, authProbe } = input;
212
+ if (updateStatus.startsWith('update available')) {
213
+ return '**Next step:** Restart your MCP client so it pulls `posterly-mcp-server@latest`, then call `whoami` with `view: "status"` again.';
214
+ }
215
+ if (!apiProbe.ok) {
216
+ return '**Next step:** Check `POSTERLY_URL` / `POSTERLY_API_BASE_URL`, DNS, and network access to the hosted MCP endpoint, then call `whoami` with `view: "status"` again.';
217
+ }
218
+ if (!hasApiKey) {
219
+ return '**Next step:** Add `POSTERLY_API_KEY` after activating API and MCP access, then call `whoami`.';
220
+ }
221
+ if (authProbe && !authProbe.ok) {
222
+ return '**Next step:** Create or reinstall a valid posterly API key, then restart the MCP client and call `whoami` with `view: "status"` again.';
223
+ }
224
+ return '**Next step:** Call `whoami` to confirm the user, workspace, and scopes before scheduling posts.';
225
+ }
226
+
227
+ function yesNo(value: boolean): string {
228
+ return value ? 'yes' : 'no';
229
+ }
230
+
231
+ function parseJson(text: string): any {
232
+ try {
233
+ return text ? JSON.parse(text) : {};
234
+ } catch {
235
+ return null;
236
+ }
237
+ }
238
+
239
+ function formatError(data: any, fallback: string, statusText: string): string {
240
+ if (data && typeof data === 'object') {
241
+ return data.error || data.message || data.code || statusText || 'API request failed';
242
+ }
243
+ return fallback || statusText || 'API request failed';
244
+ }
245
+
246
+ function compareSemver(a: string, b: string): number {
247
+ const left = parts(a);
248
+ const right = parts(b);
249
+ for (let i = 0; i < 3; i += 1) {
250
+ if (left[i] !== right[i]) return left[i] > right[i] ? 1 : -1;
251
+ }
252
+ return 0;
253
+ }
254
+
255
+ function parts(value: string): [number, number, number] {
256
+ const nums = value.split(/[.-]/).slice(0, 3).map((part) => Number.parseInt(part, 10));
257
+ return [
258
+ Number.isFinite(nums[0]) ? nums[0] : 0,
259
+ Number.isFinite(nums[1]) ? nums[1] : 0,
260
+ Number.isFinite(nums[2]) ? nums[2] : 0,
261
+ ];
262
+ }
@@ -3,237 +3,164 @@
3
3
  "get_agent_signup_info",
4
4
  "start_signup",
5
5
  "get_signup_session",
6
- "get_mcp_status",
7
6
  "whoami",
7
+ "create_api_key",
8
+ "delete_api_key",
9
+ "list_workspace_members",
10
+ "manage_workspace_member",
8
11
  "list_accounts",
9
12
  "disconnect_account",
10
- "get_connect_link",
11
13
  "connect_account",
12
14
  "create_connect_session",
13
- "get_connect_session",
14
- "create_api_key",
15
- "delete_api_key",
16
- "get_credits",
17
- "get_subscription",
18
- "cancel_subscription",
19
- "pause_subscription",
20
- "resume_subscription",
21
- "downgrade_subscription",
22
15
  "list_oauth_clients",
23
- "create_oauth_client",
24
- "update_oauth_client",
25
- "delete_oauth_client",
16
+ "manage_oauth_client",
26
17
  "list_platforms",
27
- "get_platform_schema",
28
18
  "trigger_platform_helper",
29
19
  "list_brands",
30
- "get_brand",
31
- "list_brand_accounts",
32
- "get_brand_profile",
33
- "get_learned_voice",
34
- "get_performance_profile",
35
- "get_post_insights",
36
20
  "list_post_suggestions",
37
21
  "dismiss_suggestion",
22
+ "list_posts",
23
+ "get_post",
24
+ "ask_support",
25
+ "find_available_slot",
38
26
  "submit_agent_feedback",
39
27
  "submit_product_feedback",
40
28
  "validate_post",
41
29
  "create_post",
42
30
  "create_posts_batch",
43
- "find_available_slot",
44
- "list_posts",
31
+ "update_post",
32
+ "delete_post",
33
+ "get_x_posting_quota",
45
34
  "upload_media",
46
- "upload_media_from_url",
47
35
  "create_signed_upload",
48
36
  "create_media_drop",
49
37
  "list_media",
50
38
  "get_video_options",
51
39
  "run_video_function",
52
40
  "generate_video",
53
- "get_video_job",
54
- "get_image_job",
41
+ "list_jobs",
55
42
  "generate_captions",
56
43
  "generate_image",
57
- "get_post",
58
- "get_post_missing",
59
- "ask_support",
60
- "update_post",
61
- "update_post_status",
62
- "update_post_release_id",
63
- "delete_post",
64
- "delete_comment",
65
- "delete_post_group",
66
- "get_account_analytics",
67
- "get_post_analytics",
44
+ "list_analytics",
68
45
  "list_google_business_reviews",
69
- "get_google_business_review_link",
70
46
  "audit_google_business_profile",
71
- "suggest_google_business_review_reply",
72
- "reply_google_business_review",
73
- "delete_google_business_review_reply",
47
+ "manage_google_business_review",
74
48
  "list_google_business_media",
75
- "add_google_business_media",
76
- "delete_google_business_media",
49
+ "manage_google_business_media",
50
+ "list_conversations",
51
+ "manage_conversation",
52
+ "list_comments",
53
+ "manage_comment",
77
54
  "list_activity",
78
- "get_updates",
79
55
  "list_webhooks",
80
56
  "create_webhook",
81
- "update_webhook",
82
- "delete_webhook",
83
- "test_webhook",
84
- "get_x_posting_quota",
85
- "list_conversations",
86
- "get_conversation",
87
- "send_message",
88
- "list_comments",
89
- "get_comment",
90
- "reply_to_comment",
91
- "update_comment",
92
- "sync_inbox",
93
- "list_workspace_members",
94
- "manage_workspace_member"
57
+ "manage_webhook",
58
+ "get_credits",
59
+ "get_subscription",
60
+ "cancel_subscription",
61
+ "pause_subscription",
62
+ "resume_subscription",
63
+ "downgrade_subscription",
64
+ "get_updates"
95
65
  ],
96
66
  "readOnlyTools": [
97
67
  "get_agent_signup_info",
98
68
  "get_signup_session",
99
- "get_mcp_status",
100
69
  "whoami",
70
+ "list_workspace_members",
101
71
  "list_accounts",
102
- "get_connect_link",
103
- "get_connect_session",
104
- "get_credits",
105
- "get_subscription",
106
72
  "list_oauth_clients",
107
73
  "list_platforms",
108
- "get_platform_schema",
109
74
  "trigger_platform_helper",
110
75
  "list_brands",
111
- "get_brand",
112
- "list_brand_accounts",
113
- "get_brand_profile",
114
- "get_learned_voice",
115
- "get_performance_profile",
116
- "get_post_insights",
117
76
  "list_post_suggestions",
118
- "validate_post",
119
- "find_available_slot",
120
77
  "list_posts",
78
+ "get_post",
79
+ "find_available_slot",
80
+ "validate_post",
81
+ "get_x_posting_quota",
121
82
  "list_media",
122
83
  "get_video_options",
123
- "get_video_job",
124
- "get_image_job",
125
- "get_post",
126
- "get_post_missing",
127
- "get_account_analytics",
128
- "get_post_analytics",
84
+ "run_video_function",
85
+ "list_jobs",
86
+ "list_analytics",
129
87
  "list_google_business_reviews",
130
- "get_google_business_review_link",
131
88
  "audit_google_business_profile",
132
89
  "list_google_business_media",
133
- "list_activity",
134
- "get_updates",
135
- "list_webhooks",
136
- "get_x_posting_quota",
137
90
  "list_conversations",
138
- "get_conversation",
139
91
  "list_comments",
140
- "get_comment",
141
- "list_workspace_members"
92
+ "list_activity",
93
+ "list_webhooks",
94
+ "get_credits",
95
+ "get_subscription",
96
+ "get_updates"
142
97
  ],
143
98
  "destructiveTools": [
144
- "disconnect_account",
145
99
  "delete_api_key",
146
- "cancel_subscription",
147
- "pause_subscription",
148
- "downgrade_subscription",
149
- "update_oauth_client",
150
- "delete_oauth_client",
100
+ "manage_workspace_member",
101
+ "disconnect_account",
102
+ "manage_oauth_client",
151
103
  "dismiss_suggestion",
152
104
  "update_post",
153
- "update_post_status",
154
105
  "delete_post",
155
- "delete_comment",
156
- "delete_post_group",
157
- "reply_google_business_review",
158
- "delete_google_business_review_reply",
159
- "delete_google_business_media",
160
- "update_webhook",
161
- "delete_webhook",
162
- "manage_workspace_member"
106
+ "manage_google_business_review",
107
+ "manage_google_business_media",
108
+ "manage_comment",
109
+ "manage_webhook",
110
+ "cancel_subscription",
111
+ "pause_subscription",
112
+ "downgrade_subscription"
163
113
  ],
164
114
  "idempotentMutationTools": [
165
- "connect_account",
166
- "disconnect_account",
167
115
  "delete_api_key",
168
- "cancel_subscription",
169
- "pause_subscription",
170
- "resume_subscription",
171
- "downgrade_subscription",
172
- "update_oauth_client",
173
- "delete_oauth_client",
116
+ "disconnect_account",
117
+ "connect_account",
174
118
  "dismiss_suggestion",
175
119
  "update_post",
176
- "update_post_status",
177
- "update_post_release_id",
178
120
  "delete_post",
179
- "delete_comment",
180
- "delete_post_group",
181
- "reply_google_business_review",
182
- "delete_google_business_review_reply",
183
- "delete_google_business_media",
184
- "update_webhook",
185
- "delete_webhook",
186
- "update_comment"
121
+ "cancel_subscription",
122
+ "pause_subscription",
123
+ "resume_subscription",
124
+ "downgrade_subscription"
187
125
  ],
188
126
  "openWorldTools": [
189
127
  "start_signup",
190
128
  "get_signup_session",
191
- "get_mcp_status",
129
+ "whoami",
130
+ "manage_workspace_member",
131
+ "list_accounts",
192
132
  "disconnect_account",
193
133
  "connect_account",
194
134
  "create_connect_session",
195
- "get_connect_session",
196
- "get_credits",
197
- "get_subscription",
198
- "cancel_subscription",
199
- "pause_subscription",
200
- "resume_subscription",
201
- "downgrade_subscription",
202
135
  "trigger_platform_helper",
136
+ "ask_support",
203
137
  "validate_post",
204
138
  "create_post",
205
139
  "create_posts_batch",
206
- "upload_media_from_url",
140
+ "get_x_posting_quota",
141
+ "upload_media",
207
142
  "create_signed_upload",
208
143
  "create_media_drop",
209
144
  "run_video_function",
210
145
  "generate_video",
211
- "get_video_job",
212
- "get_image_job",
146
+ "list_jobs",
213
147
  "generate_captions",
214
148
  "generate_image",
215
- "ask_support",
216
- "get_account_analytics",
217
- "get_post_analytics",
149
+ "list_analytics",
218
150
  "list_google_business_reviews",
219
- "get_google_business_review_link",
220
151
  "audit_google_business_profile",
221
- "suggest_google_business_review_reply",
222
- "reply_google_business_review",
223
- "delete_google_business_review_reply",
152
+ "manage_google_business_review",
224
153
  "list_google_business_media",
225
- "add_google_business_media",
226
- "delete_google_business_media",
154
+ "manage_google_business_media",
155
+ "manage_conversation",
156
+ "manage_comment",
227
157
  "create_webhook",
228
- "update_webhook",
229
- "delete_webhook",
230
- "test_webhook",
231
- "get_x_posting_quota",
232
- "send_message",
233
- "reply_to_comment",
234
- "update_comment",
235
- "delete_comment",
236
- "sync_inbox",
237
- "manage_workspace_member"
158
+ "manage_webhook",
159
+ "get_credits",
160
+ "get_subscription",
161
+ "cancel_subscription",
162
+ "pause_subscription",
163
+ "resume_subscription",
164
+ "downgrade_subscription"
238
165
  ]
239
166
  }