@buzzposter/mcp 0.1.11 → 0.1.13

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/dist/index.js CHANGED
@@ -121,6 +121,9 @@ var BuzzPosterClient = class {
121
121
  async uploadFromUrl(data) {
122
122
  return this.request("POST", "/api/v1/media/upload-from-url", data);
123
123
  }
124
+ async uploadBase64(data) {
125
+ return this.request("POST", "/api/v1/media/upload-base64", data);
126
+ }
124
127
  async getUploadUrl(data) {
125
128
  return this.request("POST", "/api/v1/media/presign", data);
126
129
  }
@@ -876,7 +879,7 @@ function registerAccountTools(server2, client2) {
876
879
  );
877
880
  server2.tool(
878
881
  "check_accounts_health",
879
- "Check the health status of all connected social media accounts. Shows which accounts are working, which have warnings, and which need reconnection. Call this before scheduling posts to make sure target platforms are healthy.",
882
+ "Check the health status of all connected social media accounts. Shows which accounts are working, which have warnings, and which need attention. Call this before scheduling posts to make sure target platforms are healthy. If a token is expiring or an account shows an error, direct the user to reconnect via the BuzzPoster web UI -- reconnection cannot be done through MCP.",
880
883
  {},
881
884
  {
882
885
  title: "Check Account Health",
@@ -1199,6 +1202,34 @@ function registerMediaTools(server2, client2) {
1199
1202
  };
1200
1203
  }
1201
1204
  );
1205
+ server2.tool(
1206
+ "upload_from_claude",
1207
+ "Upload an image that the user has dropped or pasted into Claude. When a user shares an image in the conversation, Claude can read it natively as base64. Pass the base64 data, filename, and content_type to upload it to the BuzzPoster media library and get a CDN URL back. Do NOT show the base64 data to the user -- just call this tool silently and return the CDN URL.",
1208
+ {
1209
+ data: z4.string().describe("Base64-encoded image data (no data URI prefix needed, just the raw base64 string)"),
1210
+ filename: z4.string().describe("Filename including extension (e.g. photo.jpg)"),
1211
+ content_type: z4.string().describe("MIME type (e.g. image/jpeg, image/png, image/webp, image/gif)"),
1212
+ folder: z4.string().optional().describe("Optional folder path within the customer's storage")
1213
+ },
1214
+ {
1215
+ title: "Upload Image from Claude",
1216
+ readOnlyHint: false,
1217
+ destructiveHint: false,
1218
+ idempotentHint: false,
1219
+ openWorldHint: false
1220
+ },
1221
+ async (args) => {
1222
+ const result = await client2.uploadBase64({
1223
+ data: args.data,
1224
+ filename: args.filename,
1225
+ content_type: args.content_type,
1226
+ folder: args.folder
1227
+ });
1228
+ return {
1229
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
1230
+ };
1231
+ }
1232
+ );
1202
1233
  server2.tool(
1203
1234
  "upload_from_url",
1204
1235
  "Upload media from a public URL. The server fetches the image/video and uploads it to storage. Returns a CDN URL that can be used in posts. Supports JPEG, PNG, GIF, WebP, MP4, MOV, WebM up to 25MB.",
@@ -1729,7 +1760,7 @@ import { z as z7 } from "zod";
1729
1760
  function registerBrandVoiceTools(server2, client2) {
1730
1761
  server2.tool(
1731
1762
  "get_brand_voice",
1732
- "Get the customer's brand voice profile and writing rules. IMPORTANT: Call this tool BEFORE creating any post, draft, or content. Use the returned voice description, rules, and examples to match the customer's tone and style in everything you write for them. When writing a newsletter, once you have the brand voice, template, and content sources loaded, immediately generate a full HTML artifact preview of the newsletter. Do NOT summarize or ask the user what to write -- render the artifact now and let them review it.",
1763
+ "Get the customer's brand voice profile and writing rules. Returns: name, description, dos (array), donts (array), platformRules (per-platform object), and examplePosts (array). IMPORTANT: Call this tool BEFORE creating any post, draft, or content. Use the returned voice description, rules, and examples to match the customer's tone and style in everything you write for them. This tool is read-only -- to update brand voice use update_brand_voice. Do NOT store brand voice data in the knowledge base. When writing a newsletter, once you have the brand voice, template, and content sources loaded, immediately generate a full HTML artifact preview of the newsletter. Do NOT summarize or ask the user what to write -- render the artifact now and let them review it.",
1733
1764
  {},
1734
1765
  {
1735
1766
  title: "Get Brand Voice",
@@ -1924,7 +1955,7 @@ import { z as z8 } from "zod";
1924
1955
  function registerKnowledgeTools(server2, client2) {
1925
1956
  server2.tool(
1926
1957
  "get_knowledge_base",
1927
- "Get all items from the customer's knowledge base. Use this to access reference material about the business, products, team, competitors, and other context that helps you write better content.",
1958
+ "Get all items from the customer's knowledge base. Use this to access reference material about the business, products, team, competitors, and other context that helps you write better content. The knowledge base is ONLY for uploaded documents, URLs, and text references (company info, products, pricing, competitors, stats). Do NOT use this to store or retrieve brand voice profiles or audience definitions -- those have dedicated tools.",
1928
1959
  {},
1929
1960
  {
1930
1961
  title: "Get Knowledge Base",
@@ -1978,7 +2009,7 @@ function registerKnowledgeTools(server2, client2) {
1978
2009
  );
1979
2010
  server2.tool(
1980
2011
  "search_knowledge",
1981
- "Search the customer's knowledge base by tag or keyword. Use this to find specific reference material when writing about a topic.",
2012
+ "Search the customer's knowledge base by tag or keyword. Use this to find specific reference material when writing about a topic. Search by tag first for best results, falls back to text search. Do NOT use this to find brand voice or audience data -- those have dedicated tools.",
1982
2013
  {
1983
2014
  query: z8.string().describe(
1984
2015
  "Search query - matches against tags first, then falls back to text search on title and content"
@@ -2029,7 +2060,7 @@ function registerKnowledgeTools(server2, client2) {
2029
2060
  );
2030
2061
  server2.tool(
2031
2062
  "add_knowledge",
2032
- "Add a new item to the customer's knowledge base. Use this to save useful information the customer shares during conversation.",
2063
+ "Add reference material to the customer's knowledge base. Use ONLY for: company info, product details, pricing, team bios, competitor notes, brand guidelines, and statistics. Do NOT add brand voice profiles, audience profiles, or content drafts here -- those have dedicated tools. Always include relevant tags to make items easier to find later.",
2033
2064
  {
2034
2065
  title: z8.string().describe("Title for the knowledge item"),
2035
2066
  content: z8.string().describe("The content/text to save"),
@@ -2071,7 +2102,7 @@ import { z as z9 } from "zod";
2071
2102
  function registerAudienceTools(server2, client2) {
2072
2103
  server2.tool(
2073
2104
  "get_audience",
2074
- "Get the target audience profile for content creation. Use this tool to understand WHO the content is for \u2014 their demographics, pain points, motivations, preferred platforms, and tone preferences. Call this BEFORE writing any post or content so you can tailor messaging to resonate with the intended audience.",
2105
+ "Get the target audience profile for content creation. Use this tool to understand WHO the content is for. Returns: name, description, demographics, painPoints (array), motivations (array), toneNotes, contentPreferences, preferredPlatforms (array), and isDefault. Call this BEFORE writing any post or content so you can tailor messaging to resonate with the intended audience. Pass an audienceId to fetch a specific profile, or omit it to get the default. Use list_audiences to see all available profiles. Do NOT store audience data in the knowledge base.",
2075
2106
  {
2076
2107
  audienceId: z9.string().optional().describe("Specific audience profile ID. If omitted, returns the default audience.")
2077
2108
  },
package/dist/tools.d.ts CHANGED
@@ -31,6 +31,12 @@ declare class BuzzPosterClient {
31
31
  filename?: string;
32
32
  folder?: string;
33
33
  }): Promise<unknown>;
34
+ uploadBase64(data: {
35
+ data: string;
36
+ filename: string;
37
+ content_type: string;
38
+ folder?: string;
39
+ }): Promise<unknown>;
34
40
  getUploadUrl(data: {
35
41
  filename: string;
36
42
  content_type: string;
package/dist/tools.js CHANGED
@@ -115,6 +115,9 @@ var BuzzPosterClient = class {
115
115
  async uploadFromUrl(data) {
116
116
  return this.request("POST", "/api/v1/media/upload-from-url", data);
117
117
  }
118
+ async uploadBase64(data) {
119
+ return this.request("POST", "/api/v1/media/upload-base64", data);
120
+ }
118
121
  async getUploadUrl(data) {
119
122
  return this.request("POST", "/api/v1/media/presign", data);
120
123
  }
@@ -870,7 +873,7 @@ function registerAccountTools(server, client) {
870
873
  );
871
874
  server.tool(
872
875
  "check_accounts_health",
873
- "Check the health status of all connected social media accounts. Shows which accounts are working, which have warnings, and which need reconnection. Call this before scheduling posts to make sure target platforms are healthy.",
876
+ "Check the health status of all connected social media accounts. Shows which accounts are working, which have warnings, and which need attention. Call this before scheduling posts to make sure target platforms are healthy. If a token is expiring or an account shows an error, direct the user to reconnect via the BuzzPoster web UI -- reconnection cannot be done through MCP.",
874
877
  {},
875
878
  {
876
879
  title: "Check Account Health",
@@ -1193,6 +1196,34 @@ function registerMediaTools(server, client) {
1193
1196
  };
1194
1197
  }
1195
1198
  );
1199
+ server.tool(
1200
+ "upload_from_claude",
1201
+ "Upload an image that the user has dropped or pasted into Claude. When a user shares an image in the conversation, Claude can read it natively as base64. Pass the base64 data, filename, and content_type to upload it to the BuzzPoster media library and get a CDN URL back. Do NOT show the base64 data to the user -- just call this tool silently and return the CDN URL.",
1202
+ {
1203
+ data: z4.string().describe("Base64-encoded image data (no data URI prefix needed, just the raw base64 string)"),
1204
+ filename: z4.string().describe("Filename including extension (e.g. photo.jpg)"),
1205
+ content_type: z4.string().describe("MIME type (e.g. image/jpeg, image/png, image/webp, image/gif)"),
1206
+ folder: z4.string().optional().describe("Optional folder path within the customer's storage")
1207
+ },
1208
+ {
1209
+ title: "Upload Image from Claude",
1210
+ readOnlyHint: false,
1211
+ destructiveHint: false,
1212
+ idempotentHint: false,
1213
+ openWorldHint: false
1214
+ },
1215
+ async (args) => {
1216
+ const result = await client.uploadBase64({
1217
+ data: args.data,
1218
+ filename: args.filename,
1219
+ content_type: args.content_type,
1220
+ folder: args.folder
1221
+ });
1222
+ return {
1223
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
1224
+ };
1225
+ }
1226
+ );
1196
1227
  server.tool(
1197
1228
  "upload_from_url",
1198
1229
  "Upload media from a public URL. The server fetches the image/video and uploads it to storage. Returns a CDN URL that can be used in posts. Supports JPEG, PNG, GIF, WebP, MP4, MOV, WebM up to 25MB.",
@@ -2459,7 +2490,7 @@ import { z as z8 } from "zod";
2459
2490
  function registerBrandVoiceTools(server, client) {
2460
2491
  server.tool(
2461
2492
  "get_brand_voice",
2462
- "Get the customer's brand voice profile and writing rules. IMPORTANT: Call this tool BEFORE creating any post, draft, or content. Use the returned voice description, rules, and examples to match the customer's tone and style in everything you write for them. When writing a newsletter, once you have the brand voice, template, and content sources loaded, immediately generate a full HTML artifact preview of the newsletter. Do NOT summarize or ask the user what to write -- render the artifact now and let them review it.",
2493
+ "Get the customer's brand voice profile and writing rules. Returns: name, description, dos (array), donts (array), platformRules (per-platform object), and examplePosts (array). IMPORTANT: Call this tool BEFORE creating any post, draft, or content. Use the returned voice description, rules, and examples to match the customer's tone and style in everything you write for them. This tool is read-only -- to update brand voice use update_brand_voice. Do NOT store brand voice data in the knowledge base. When writing a newsletter, once you have the brand voice, template, and content sources loaded, immediately generate a full HTML artifact preview of the newsletter. Do NOT summarize or ask the user what to write -- render the artifact now and let them review it.",
2463
2494
  {},
2464
2495
  {
2465
2496
  title: "Get Brand Voice",
@@ -2654,7 +2685,7 @@ import { z as z9 } from "zod";
2654
2685
  function registerKnowledgeTools(server, client) {
2655
2686
  server.tool(
2656
2687
  "get_knowledge_base",
2657
- "Get all items from the customer's knowledge base. Use this to access reference material about the business, products, team, competitors, and other context that helps you write better content.",
2688
+ "Get all items from the customer's knowledge base. Use this to access reference material about the business, products, team, competitors, and other context that helps you write better content. The knowledge base is ONLY for uploaded documents, URLs, and text references (company info, products, pricing, competitors, stats). Do NOT use this to store or retrieve brand voice profiles or audience definitions -- those have dedicated tools.",
2658
2689
  {},
2659
2690
  {
2660
2691
  title: "Get Knowledge Base",
@@ -2708,7 +2739,7 @@ function registerKnowledgeTools(server, client) {
2708
2739
  );
2709
2740
  server.tool(
2710
2741
  "search_knowledge",
2711
- "Search the customer's knowledge base by tag or keyword. Use this to find specific reference material when writing about a topic.",
2742
+ "Search the customer's knowledge base by tag or keyword. Use this to find specific reference material when writing about a topic. Search by tag first for best results, falls back to text search. Do NOT use this to find brand voice or audience data -- those have dedicated tools.",
2712
2743
  {
2713
2744
  query: z9.string().describe(
2714
2745
  "Search query - matches against tags first, then falls back to text search on title and content"
@@ -2759,7 +2790,7 @@ function registerKnowledgeTools(server, client) {
2759
2790
  );
2760
2791
  server.tool(
2761
2792
  "add_knowledge",
2762
- "Add a new item to the customer's knowledge base. Use this to save useful information the customer shares during conversation.",
2793
+ "Add reference material to the customer's knowledge base. Use ONLY for: company info, product details, pricing, team bios, competitor notes, brand guidelines, and statistics. Do NOT add brand voice profiles, audience profiles, or content drafts here -- those have dedicated tools. Always include relevant tags to make items easier to find later.",
2763
2794
  {
2764
2795
  title: z9.string().describe("Title for the knowledge item"),
2765
2796
  content: z9.string().describe("The content/text to save"),
@@ -2801,7 +2832,7 @@ import { z as z10 } from "zod";
2801
2832
  function registerAudienceTools(server, client) {
2802
2833
  server.tool(
2803
2834
  "get_audience",
2804
- "Get the target audience profile for content creation. Use this tool to understand WHO the content is for \u2014 their demographics, pain points, motivations, preferred platforms, and tone preferences. Call this BEFORE writing any post or content so you can tailor messaging to resonate with the intended audience.",
2835
+ "Get the target audience profile for content creation. Use this tool to understand WHO the content is for. Returns: name, description, demographics, painPoints (array), motivations (array), toneNotes, contentPreferences, preferredPlatforms (array), and isDefault. Call this BEFORE writing any post or content so you can tailor messaging to resonate with the intended audience. Pass an audienceId to fetch a specific profile, or omit it to get the default. Use list_audiences to see all available profiles. Do NOT store audience data in the knowledge base.",
2805
2836
  {
2806
2837
  audienceId: z10.string().optional().describe("Specific audience profile ID. If omitted, returns the default audience.")
2807
2838
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buzzposter/mcp",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "BuzzPoster MCP server - Social media, newsletters, and media hosting for Claude Desktop",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",