Skip to main content
Glama
jginorio

Sprout Social MCP Server

by jginorio

upload_media

Upload an image or video from a public URL to Sprout Social and obtain a media ID for use in publishing posts.

Instructions

Upload media (image/video) to Sprout Social for use in publishing posts. Provide either a public URL to the media file. Returns a media ID to use with create_publishing_post.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
media_urlYesA public HTTP/HTTPS URL of the media file to upload.

Implementation Reference

  • src/index.ts:476-512 (registration)
    Registration of the 'upload_media' tool via server.tool(), including its description, schema, and handler function.
    // ─── Media Upload Tool ──────────────────────────────────────────────────────
    
    server.tool(
      "upload_media",
      "Upload media (image/video) to Sprout Social for use in publishing posts. " +
        "Provide either a public URL to the media file. Returns a media ID to use with create_publishing_post.",
      {
        media_url: z
          .string()
          .describe("A public HTTP/HTTPS URL of the media file to upload."),
      },
      async ({ media_url }) => {
        const { apiKey, customerId } = getConfig();
        const url = `${SPROUT_API_BASE}/v1/${customerId}/media`;
    
        const formData = new FormData();
        formData.append("media_url", media_url);
    
        const response = await fetch(url, {
          method: "POST",
          headers: {
            Authorization: `Bearer ${apiKey}`,
          },
          body: formData,
        });
    
        if (!response.ok) {
          const errorText = await response.text();
          throw new Error(
            `Sprout Social media upload error (${response.status}): ${errorText}`
          );
        }
    
        const data = await response.json();
        return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
      }
    );
  • Input schema for upload_media: requires a single string parameter 'media_url' (a public HTTP/HTTPS URL).
    {
      media_url: z
        .string()
        .describe("A public HTTP/HTTPS URL of the media file to upload."),
    },
  • Handler function for upload_media that constructs a FormData payload with the media_url, POSTs it to Sprout Social's /v1/{customerId}/media endpoint, and returns the JSON response containing the media ID.
    async ({ media_url }) => {
      const { apiKey, customerId } = getConfig();
      const url = `${SPROUT_API_BASE}/v1/${customerId}/media`;
    
      const formData = new FormData();
      formData.append("media_url", media_url);
    
      const response = await fetch(url, {
        method: "POST",
        headers: {
          Authorization: `Bearer ${apiKey}`,
        },
        body: formData,
      });
    
      if (!response.ok) {
        const errorText = await response.text();
        throw new Error(
          `Sprout Social media upload error (${response.status}): ${errorText}`
        );
      }
    
      const data = await response.json();
      return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
    }
  • The media_ids parameter on create_publishing_post references upload_media output, showing how the media ID returned by upload_media is consumed.
    media_ids: z
      .array(z.string())
      .optional()
      .describe(
        "Array of media IDs (from upload_media) to attach to the post."
      ),
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses the basic behavior: accepts image/video from a public URL and returns a media ID. However, it lacks details on file size limits, supported formats, storage duration, or permissions required, leaving gaps in transparency.

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?

Three short sentences focused on action, output, and integration. No fluff or redundant information. Information is front-loaded and each sentence serves a purpose.

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

Completeness4/5

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

Given the simplicity (1 parameter, no output schema, no annotations), the description is fairly complete. It covers what the tool does, how to use it, and what it returns. However, it omits potential error conditions and acceptable media formats, which could be important for an agent.

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 the 'media_url' parameter already having a clear description. The description adds minimal value ('Provide either a public URL') which is redundant with the schema. Thus the description does not enhance meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the verb 'Upload', the resource 'media (image/video)', and the purpose 'for use in publishing posts'. It distinguishes itself from the sibling tool 'create_publishing_post' by explaining that it returns a media ID for that purpose.

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

Usage Guidelines4/5

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

The description implies when to use: before creating a publishing post that needs media. It explicitly mentions the connection to 'create_publishing_post'. However, it does not provide explicit 'when not to use' or alternatives, though given no other upload tools, this is acceptable.

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/jginorio/sprout-social-mcp'

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