Skip to main content
Glama
dinwal
by dinwal

add_content_in_library

Add posts to a content library for automated recurring or evergreen social media publishing across multiple platforms with customizable settings.

Instructions

Add a post to a content library for recurring/evergreen posting

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesLibrary ID (from library_list)
messageYesDefault post content text
image_urlNoArray of image URLs to attach
video_urlNoPublic video URL to attach
urlNoWebsite link to include
host_images_on_recurpostNoHost images on RecurPost (default: true)
fb_messageNoFacebook-specific message override
tw_messageNoTwitter/X-specific message override
ln_messageNoLinkedIn-specific message override
in_messageNoInstagram-specific message override
gmb_messageNoGoogle Business Profile-specific message override
pi_messageNoPinterest-specific message override
yt_messageNoYouTube-specific message override
tk_messageNoTikTok-specific message override
th_messageNoThreads-specific message override
bs_messageNoBluesky-specific message override
fb_post_typeNoFacebook post type
in_post_typeNoInstagram post type
in_reel_share_in_feedNoShare Instagram reel in feed
first_commentNoDefault first comment
fb_first_commentNoFacebook first comment
ln_first_commentNoLinkedIn first comment
in_first_commentNoInstagram first comment
ln_documentNoLinkedIn document URL (PPT/PDF/DOCX)
ln_document_titleNoLinkedIn document title
pi_titleNoPinterest pin title
gbp_ctaNoGoogle Business Profile call to action
gbp_cta_urlNoGoogle Business Profile CTA URL
gbp_offer_titleNoGBP offer title
gbp_offer_start_dateNoGBP offer start date
gbp_offer_end_dateNoGBP offer end date
gbp_offer_coupon_codeNoGBP offer coupon code
gbp_offer_termsNoGBP offer terms and conditions
gbp_redeem_offer_linkNoGBP offer redemption URL
yt_titleNoYouTube video title
yt_categoryNoYouTube video category
yt_privacy_statusNoYouTube privacy status
yt_user_tagsNoYouTube tags
yt_thumbNoYouTube custom thumbnail URL
yt_video_made_for_kidsNoIs the YouTube video made for kids
tk_privacy_statusNoTikTok privacy status
tk_allow_commentsNoAllow TikTok comments
tk_allow_duetNoAllow TikTok duets
tk_allow_stitchesNoAllow TikTok stitches
is_top_of_queueNoAdd to top of queue (1) or bottom (0)
content_livedateNoContent live date (YYYY-MM-DD)
content_expiredateNoContent expiry date (YYYY-MM-DD)

Implementation Reference

  • The handler for 'add_content_in_library' which invokes a generic API call.
    async (params) => {
      try {
        return toolResult(await callAPI("/api/add_content_in_library", params));
      } catch (e) {
        return toolResult({ error: String(e) }, true);
      }
    }
  • Zod schema definition for 'add_content_in_library' input parameters.
    {
      id: z.string().describe("Library ID (from library_list)"),
      message: z.string().describe("Default post content text"),
      image_url: z
        .array(z.string().url())
        .optional()
        .describe("Array of image URLs to attach"),
      video_url: z
        .string()
        .url()
        .optional()
        .describe("Public video URL to attach"),
      url: z.string().url().optional().describe("Website link to include"),
      host_images_on_recurpost: z
        .boolean()
        .optional()
        .describe("Host images on RecurPost (default: true)"),
      fb_message: z
        .string()
        .optional()
        .describe("Facebook-specific message override"),
      tw_message: z
        .string()
        .optional()
        .describe("Twitter/X-specific message override"),
      ln_message: z
        .string()
        .optional()
        .describe("LinkedIn-specific message override"),
      in_message: z
        .string()
        .optional()
        .describe("Instagram-specific message override"),
      gmb_message: z
        .string()
        .optional()
        .describe("Google Business Profile-specific message override"),
      pi_message: z
        .string()
        .optional()
        .describe("Pinterest-specific message override"),
      yt_message: z
        .string()
        .optional()
        .describe("YouTube-specific message override"),
      tk_message: z
        .string()
        .optional()
        .describe("TikTok-specific message override"),
      th_message: z
        .string()
        .optional()
        .describe("Threads-specific message override"),
      bs_message: z
        .string()
        .optional()
        .describe("Bluesky-specific message override"),
      fb_post_type: z
        .enum(["feed", "story", "reel"])
        .optional()
        .describe("Facebook post type"),
      in_post_type: z
        .enum(["feed", "story", "reel"])
        .optional()
        .describe("Instagram post type"),
      in_reel_share_in_feed: z
        .enum(["yes", "no"])
        .optional()
        .describe("Share Instagram reel in feed"),
      first_comment: z.string().optional().describe("Default first comment"),
      fb_first_comment: z
        .string()
        .optional()
        .describe("Facebook first comment"),
      ln_first_comment: z
        .string()
        .optional()
        .describe("LinkedIn first comment"),
      in_first_comment: z
        .string()
        .optional()
        .describe("Instagram first comment"),
      ln_document: z
        .string()
        .url()
        .optional()
        .describe("LinkedIn document URL (PPT/PDF/DOCX)"),
      ln_document_title: z
        .string()
        .optional()
        .describe("LinkedIn document title"),
      pi_title: z.string().optional().describe("Pinterest pin title"),
      gbp_cta: z
        .enum([
          "None",
          "Learn more",
          "Sign up",
          "Buy",
          "Order online",
          "Book",
          "Call now",
          "Offer",
        ])
        .optional()
        .describe("Google Business Profile call to action"),
      gbp_cta_url: z
        .string()
        .url()
        .optional()
        .describe("Google Business Profile CTA URL"),
      gbp_offer_title: z.string().optional().describe("GBP offer title"),
      gbp_offer_start_date: z
        .string()
        .optional()
        .describe("GBP offer start date"),
      gbp_offer_end_date: z
        .string()
        .optional()
        .describe("GBP offer end date"),
      gbp_offer_coupon_code: z
        .string()
        .optional()
        .describe("GBP offer coupon code"),
      gbp_offer_terms: z
        .string()
        .optional()
        .describe("GBP offer terms and conditions"),
      gbp_redeem_offer_link: z
        .string()
        .url()
        .optional()
        .describe("GBP offer redemption URL"),
      yt_title: z.string().optional().describe("YouTube video title"),
      yt_category: z.string().optional().describe("YouTube video category"),
      yt_privacy_status: z
        .enum(["Public", "Private", "Unlisted"])
        .optional()
        .describe("YouTube privacy status"),
      yt_user_tags: z.string().optional().describe("YouTube tags"),
      yt_thumb: z
        .string()
        .url()
        .optional()
        .describe("YouTube custom thumbnail URL"),
      yt_video_made_for_kids: z
        .enum(["yes", "no"])
        .optional()
        .describe("Is the YouTube video made for kids"),
      tk_privacy_status: z
        .enum(["Public to Everyone", "Mutual Follow Friends", "Self Only"])
        .optional()
        .describe("TikTok privacy status"),
      tk_allow_comments: z
        .enum(["yes", "no"])
        .optional()
        .describe("Allow TikTok comments"),
      tk_allow_duet: z
        .enum(["yes", "no"])
        .optional()
        .describe("Allow TikTok duets"),
      tk_allow_stitches: z
        .enum(["yes", "no"])
        .optional()
        .describe("Allow TikTok stitches"),
      is_top_of_queue: z
        .enum(["0", "1"])
        .optional()
        .describe("Add to top of queue (1) or bottom (0)"),
      content_livedate: z
        .string()
        .optional()
        .describe("Content live date (YYYY-MM-DD)"),
      content_expiredate: z
        .string()
        .optional()
        .describe("Content expiry date (YYYY-MM-DD)"),
    },
  • src/index.ts:141-143 (registration)
    Registration of the 'add_content_in_library' tool within the MCP server.
    server.tool(
      "add_content_in_library",
      "Add a post to a content library for recurring/evergreen posting",
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full disclosure burden for this 47-parameter write operation. It fails to mention idempotency, validation behavior, side effects, or what occurs after adding content (e.g., immediate scheduling vs. draft state).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Perfectly concise at 9 words. Every term serves a purpose: action ('Add'), object ('post'), destination ('content library'), and use-case qualifier ('recurring/evergreen posting'). No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high schema richness (100% coverage, 11 enums) and 47 parameters, the description is minimally adequate. However, for a complex multi-platform content tool with no output schema and no annotations, it lacks explanation of the library queuing system and platform override logic.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with comprehensive platform-specific field descriptions, so the description doesn't need to repeat parameter details. However, it adds no semantic context about how the platform-specific overrides (fb_message, tw_message, etc.) interact with the default message, keeping it at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb ('Add'), resource ('post'), and destination ('content library'). The phrase 'recurring/evergreen posting' effectively distinguishes this from the sibling tool 'post_content' (which implies immediate posting) though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context ('recurring/evergreen') suggesting when to use this versus one-time posting, but lacks explicit guidance on prerequisites (e.g., needing a library ID from library_list) or when NOT to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dinwal/recurpost-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server