hermoso 0.1.280 → 0.1.281
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/mcp/tools.mjs +15 -4
- package/package.json +1 -1
package/mcp/tools.mjs
CHANGED
|
@@ -18613,22 +18613,33 @@ function memoryNoteVerdict(text) {
|
|
|
18613
18613
|
}));
|
|
18614
18614
|
server.registerTool('remove_member', {
|
|
18615
18615
|
title: 'Remove a teammate',
|
|
18616
|
-
description: 'Remove a member from this brand workspace by email — they lose access (you can re-invite them later).
|
|
18616
|
+
description: 'Remove a member from this brand workspace by email — they lose access (you can re-invite them later), AND every connection THEY made on this brand is disconnected with them: their own X, LinkedIn, TikTok, YouTube, Pinterest, Threads… connections (on a channel holding several accounts, only the accounts they added), and any extra login or authorization they added. Connections the owner or anyone else made are never touched, and one with no record of who connected it is treated as the owner\'s. Queued posts that would publish through their accounts, or that they scheduled themselves, will not go out. The unconfirmed call reports exactly which connections and how many scheduled posts — relay that to the user, then call with confirm:true.',
|
|
18617
18617
|
inputSchema: {
|
|
18618
18618
|
email: z.string().describe('the member’s email'),
|
|
18619
18619
|
confirm: z.boolean().optional().describe('REQUIRED true'),
|
|
18620
18620
|
},
|
|
18621
|
-
outputSchema: { ok: z.boolean().optional(), removed: z.boolean().optional(), email: z.string().optional(), members: z.array(z.any()).optional() },
|
|
18621
|
+
outputSchema: { ok: z.boolean().optional(), removed: z.boolean().optional(), email: z.string().optional(), members: z.array(z.any()).optional(), connectionsDisconnected: z.array(z.any()).optional(), scheduledPostsNotGoingOut: z.number().optional() },
|
|
18622
18622
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
|
|
18623
18623
|
}, wrap(async (a) => {
|
|
18624
|
-
|
|
18624
|
+
// THE CONFIRM NAMES WHAT GOES WITH THEM (2026-09-24): removing a teammate disconnects the connections they made,
|
|
18625
|
+
// so the sentence the user approves must say which, from the same plan the removal runs. A 404 (not a member)
|
|
18626
|
+
// surfaces as the error it is; a preview that could not be read is said, never rendered as "nothing".
|
|
18627
|
+
if (a.confirm !== true) {
|
|
18628
|
+
let pv = null;
|
|
18629
|
+
try { pv = await apiGet('/api/team/remove-preview', { email: a.email || '' }); }
|
|
18630
|
+
catch (e) { if (e?.status === 404 || e?.status === 403) throw e; }
|
|
18631
|
+
return ok(pv?.message
|
|
18632
|
+
? `${pv.message} Confirm with the user, then call again with confirm:true.`
|
|
18633
|
+
: `This will remove ${a.email || '(no email)'} from the workspace and disconnect any connections they made on this brand. I could not read which ones just now — check Settings ▸ Connectors before confirming. Confirm with the user, then call again with confirm:true.`,
|
|
18634
|
+
{ ok: false, ...(pv ? { connectionsDisconnected: pv.connectionsDisconnected || [], scheduledPostsNotGoingOut: pv.scheduledPostsNotGoingOut || 0 } : {}) });
|
|
18635
|
+
}
|
|
18625
18636
|
// The route 404s BY NAME when the address is not a member (a typo, a stale address, the wrong brand) — that error
|
|
18626
18637
|
// surfaces through wrap(). What reaches here is a real change or an honest no-op, and the sentence comes from the
|
|
18627
18638
|
// server's READ-BACK of the members list, never from what we asked for.
|
|
18628
18639
|
const d = await apiPost('/api/team/remove', { email: a.email });
|
|
18629
18640
|
if (d.alreadyRemoved) return ok(d.message || `${a.email} already had no access to this workspace — nothing changed.`, { ok: false, removed: false, alreadyRemoved: true, email: a.email });
|
|
18630
18641
|
const left = (d.members || []).map(m => ` \u2022 ${m.email} \u2014 ${m.role || 'member'}`);
|
|
18631
|
-
return ok(`${d.message || `${a.email} no longer has access to this workspace.`}${left.length ? `\nStill on this workspace:\n${left.join('\n')}` : ''}`, { ok: true, removed: !!d.removed, email: d.email || a.email, members: d.members });
|
|
18642
|
+
return ok(`${d.message || `${a.email} no longer has access to this workspace.`}${left.length ? `\nStill on this workspace:\n${left.join('\n')}` : ''}`, { ok: true, removed: !!d.removed, email: d.email || a.email, members: d.members, connectionsDisconnected: d.connectionsDisconnected || [], scheduledPostsNotGoingOut: d.scheduledPostsNotGoingOut || 0 });
|
|
18632
18643
|
}));
|
|
18633
18644
|
server.registerTool('set_role', {
|
|
18634
18645
|
title: 'Change a teammate’s role',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hermoso",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.281",
|
|
4
4
|
"mcpName": "io.github.hermoso-ai/hermoso",
|
|
5
5
|
"description": "Marketing on autopilot, run from your own AI agent. 856 tools. Publishing, scheduling, ad campaign management, comments, DMs and analytics cost no credits on every plan; credits are only for generating creative and for Ad Spy research. AD PLATFORMS: Meta, Google Ads, TikTok Ads, LinkedIn Ads, Reddit Ads, X Ads, Pinterest Ads, Snapchat Ads, Microsoft Advertising, Apple Search Ads and ChatGPT Ads, plus product feeds in Google Merchant Center. PUBLISHING AND SCHEDULING: Facebook, Instagram, Threads, TikTok, YouTube, X, LinkedIn, Pinterest, Bluesky and Telegram. AD RESEARCH: the Meta, Google and LinkedIn ad libraries plus organic TikTok, Instagram, YouTube, Threads and Reddit. ANALYTICS: Google Analytics 4, Google Search Console and every connected platform's own post and campaign insights. Also brand onboarding, 50+ image and video generation models, ad scoring, competitor teardowns, Google Drive and OneDrive, a CLI and installable Claude skills.",
|
|
6
6
|
"type": "module",
|