Skip to main content
Glama

Share an image

share_image
Idempotent

Give a finished image a public page, returned as share_url, where anyone with the link can see the optimized copy, compare it with the original and download either. The page is kept out of search engines. Sharing an image that is already shared keeps its link. The link can be switched off from the website's results table or the API.

Input Schema

NameRequiredDescriptionDefault
idYesThe image's id.

Output Schema

NameRequiredDescriptionDefault
idNoThe image's id.
hintNoWhat to do next, when the status alone does not say.
nameNoThe name the optimized copy downloads under.
folderNoThe folder it was sent with, which a zip puts it in. Null for an image on its own.
statusNo
scan_idNoThe page scan that found it, if one did.
alt_textNoThe AI alt text, or null when none was asked for.
originalNo
settingsNo
optimizedNoNull until the image has finished.
share_urlNoIts public page, once shared.
created_atNo
responsiveNoThe responsive sizes (paid plans), or null when none were asked for. list_images carries only their status.
source_urlNoThe address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.
updated_atNo
saved_bytesNoNegative when the optimized copy is larger.
saved_percentNo
size_limit_statusNoAgainst settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.
content_credentialsNoThe Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / responsive / description
      Previous value: -"The responsive sizes (Pro), or null when none were asked for. list_images carries only their status."New value: +"The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status."
  2. Changed7 schema fields changed
    • addedOutput schema / properties / content_credentials
      Added value: +{
      +  "description": "The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.",
      +  "properties": {
      +    "generative_ai": {
      +      "description": "Whether they say generative AI made the image, as they state it; the signature is not checked.",
      +      "type": "boolean"
      +    },
      +    "status": {
      +      "description": "removed: the optimized copy no longer carries them. kept: the optimized copy is the file that was sent, unchanged.",
      +      "enum": [
      +        "removed",
      +        "kept"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "status",
      +    "generative_ai"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / folder
      Added value: +{
      +  "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / responsive
      Added value: +{
      +  "description": "The responsive sizes (Pro), or null when none were asked for. list_images carries only their status.",
      +  "properties": {
      +    "download_url": {
      +      "description": "A zip of every width, once ready. Works without a token for an hour. Not in list_images.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "files": {
      +      "description": "Each width, narrowest first, once ready. Not in list_images.",
      +      "items": {
      +        "properties": {
      +          "download_url": {
      +            "description": "Works without a token for an hour.",
      +            "type": "string"
      +          },
      +          "height": {
      +            "type": "integer"
      +          },
      +          "name": {
      +            "description": "The name it downloads under, which html uses.",
      +            "type": "string"
      +          },
      +          "size": {
      +            "description": "Bytes.",
      +            "type": "integer"
      +          },
      +          "width": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "width",
      +          "height",
      +          "size",
      +          "name",
      +          "download_url"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "html": {
      +      "description": "An <img srcset> naming the files, once ready. Not in list_images.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "description": "pending: being made, a few seconds after the image is completed or already-optimized. ready: every width is made. failed: none was kept; compress it again with responsive_widths. skipped: an animation gets none.",
      +      "enum": [
      +        "pending",
      +        "ready",
      +        "failed",
      +        "skipped"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "status"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / settings / properties / responsive_widths
      Added value: +{
      +  "description": "The responsive widths asked for, or null.",
      +  "items": {
      +    "type": "integer"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / settings / properties / size_limit
      Added value: +{
      +  "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / settings / required
      Previous value: -[
      -  "level",
      -  "format",
      -  "keep_metadata",
      -  "width",
      -  "height",
      -  "scale"
      -]New value: +[
      +  "level",
      +  "format",
      +  "keep_metadata",
      +  "width",
      +  "height",
      +  "scale",
      +  "size_limit",
      +  "responsive_widths"
      +]
    • addedOutput schema / properties / size_limit_status
      Added value: +{
      +  "description": "Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.",
      +  "enum": [
      +    "under",
      +    "resized",
      +    "over",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / alt_text
      Added value: +{
      +  "description": "The AI alt text, or null when none was asked for.",
      +  "properties": {
      +    "language": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.",
      +      "enum": [
      +        "pending",
      +        "written",
      +        "failed",
      +        "skipped"
      +      ],
      +      "type": "string"
      +    },
      +    "suggested_name": {
      +      "description": "A descriptive file name without an extension, for rename_image.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "text": {
      +      "description": "One sentence for the image's alt attribute, once written.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "status",
      +    "text",
      +    "language",
      +    "suggested_name"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / source_url
      Added value: +{
      +  "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  5. Changed2 schema fields changed
    • addedOutput schema / properties / settings / properties / format
      Added value: +{
      +  "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.",
      +  "enum": [
      +    "auto",
      +    "webp",
      +    "avif",
      +    "png",
      +    "jpg",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / settings / required
      Previous value: -[
      -  "level",
      -  "keep_metadata",
      -  "width",
      -  "height",
      -  "scale"
      -]New value: +[
      +  "level",
      +  "format",
      +  "keep_metadata",
      +  "width",
      +  "height",
      +  "scale"
      +]
  6. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "created_at": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "hint": {
      +      "description": "What to do next, when the status alone does not say.",
      +      "type": "string"
      +    },
      +    "id": {
      +      "description": "The image's id.",
      +      "type": "string"
      +    },
      +    "name": {
      +      "description": "The name the optimized copy downloads under.",
      +      "type": "string"
      +    },
      +    "optimized": {
      +      "description": "Null until the image has finished.",
      +      "properties": {
      +        "download_url": {
      +          "description": "Works without a token for an hour.",
      +          "type": "string"
      +        },
      +        "format": {
      +          "type": "string"
      +        },
      +        "height": {
      +          "type": "integer"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "size": {
      +          "description": "Bytes.",
      +          "type": "integer"
      +        },
      +        "width": {
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "format",
      +        "size",
      +        "width",
      +        "height",
      +        "download_url"
      +      ],
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "original": {
      +      "properties": {
      +        "download_url": {
      +          "description": "Works without a token for an hour.",
      +          "type": "string"
      +        },
      +        "format": {
      +          "type": "string"
      +        },
      +        "height": {
      +          "type": "integer"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "size": {
      +          "description": "Bytes.",
      +          "type": "integer"
      +        },
      +        "width": {
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "format",
      +        "size",
      +        "width",
      +        "height",
      +        "download_url"
      +      ],
      +      "type": "object"
      +    },
      +    "saved_bytes": {
      +      "description": "Negative when the optimized copy is larger.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "saved_percent": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "scan_id": {
      +      "description": "The page scan that found it, if one did.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "settings": {
      +      "properties": {
      +        "height": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "keep_metadata": {
      +          "type": "boolean"
      +        },
      +        "level": {
      +          "enum": [
      +            "none",
      +            "lossless",
      +            "ultra",
      +            "smart",
      +            null
      +          ],
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "scale": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "width": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "level",
      +        "keep_metadata",
      +        "width",
      +        "height",
      +        "scale"
      +      ],
      +      "type": "object"
      +    },
      +    "share_url": {
      +      "description": "Its public page, once shared.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "enum": [
      +        "queued",
      +        "optimizing",
      +        "completed",
      +        "failed",
      +        "already-optimized",
      +        "cancelled"
      +      ],
      +      "type": "string"
      +    },
      +    "updated_at": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  7. First observed

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare non-readonly, idempotent, non-destructive and openWorld, so the bar is lower. The description adds genuinely new context: the page is deliberately kept out of search engines (privacy/noindex behavior), what visitors can do (view optimized copy, compare with original, download), and that the link can be revoked via the results table or API. Restating idempotency slightly duplicates the annotation.

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

Conciseness4/5

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

Front-loaded with the outcome ('public page, returned as share_url') followed by visitor capabilities, noindex, idempotency and revocation. Every sentence carries information, though the visitor-capability clause is the most expendable.

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?

Output schema exists so return values needn't be spelled out, yet the description still explains share_url usefully. It covers the mutation's visibility model and revocation path, leaving only edge cases like error behavior unaddressed.

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?

Single parameter with 100% schema description coverage, so the schema carries the semantics and a 3 is the baseline. The description adds only the hint that the image should be 'finished', not new meaning for the id field itself.

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?

Specific verb+resource: 'Give a finished image a public page, returned as share_url' states exactly what is produced. It also distinguishes the resource from siblings like share_scan_report by naming the object (image) and the result (share_url).

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?

Implies a precondition ('a finished image') and states repeat-call behavior ('Sharing an image that is already shared keeps its link'), which tells the agent it's safe to call again. It does not explicitly name when to use an alternative (e.g., share_scan_report) or state an exclusion, so it falls short of a 5.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources