Skip to main content
Glama

Create an upload link

create_upload_link
Destructive

A short-lived pre-signed PUT URL for uploading content directly. Refuses to mint the link if the key already exists unless overwrite is true. On AWS a link minted without overwrite also refuses, with HTTP 412, to replace an object created after it was minted; elsewhere that check happens only at mint time, and the URL can still overwrite a key created afterward. The PUT must send every header in the result's headers, unchanged: the content headers and userMetadata given here are signed into the URL, and a missing or different header fails the upload. Headers left out take whatever the PUT sends.

Input Schema

NameRequiredDescriptionDefault
keyYesFull object key.
bucketYesBucket name.
overwriteNoAllow the URL to replace an existing object.
contentTypeNoContent-Type to store on the object.
cacheControlNoCache-Control to store on the object, such as max-age=3600.
connectionIdYesConnection id from list_connections.
userMetadataNoUser metadata to store on the object, as a map of name to value.
contentEncodingNoContent-Encoding to store on the object, such as gzip for a body compressed before upload.
contentLanguageNoContent-Language to store on the object, such as en-US.
expiresInMinutesNoHow long the URL stays valid, 1-60 minutes (default 15). Values outside that range are clamped, and expiresInMinutes reports what the URL actually got.
contentDispositionNoContent-Disposition to store on the object, such as attachment; filename="report.pdf".

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • addedInput schema / properties / cacheControl
      Added value: +{
      +  "description": "Cache-Control to store on the object, such as max-age=3600.",
      +  "type": "string"
      +}
    • addedInput schema / properties / contentDisposition
      Added value: +{
      +  "description": "Content-Disposition to store on the object, such as attachment; filename=\"report.pdf\".",
      +  "type": "string"
      +}
    • addedInput schema / properties / contentEncoding
      Added value: +{
      +  "description": "Content-Encoding to store on the object, such as gzip for a body compressed before upload.",
      +  "type": "string"
      +}
    • addedInput schema / properties / contentLanguage
      Added value: +{
      +  "description": "Content-Language to store on the object, such as en-US.",
      +  "type": "string"
      +}
    • addedInput schema / properties / contentType
      Added value: +{
      +  "description": "Content-Type to store on the object.",
      +  "type": "string"
      +}
    • addedInput schema / properties / userMetadata
      Added value: +{
      +  "description": "User metadata to store on the object, as a map of name to value.",
      +  "type": "object"
      +}
  2. First observed

TDQS

A4/5.0
Behavior5/5

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

With annotations already flagging destructiveHint=true and non-idempotent, the description goes well beyond them: mint-time refusal when the key exists unless overwrite is set, the AWS-specific HTTP 412 guard against replacing objects created after minting versus the weaker mint-time-only check elsewhere, and the header-mismatch upload failure mode. These are exactly the failure conditions an agent needs before calling.

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?

Five sentences, front-loaded with what is produced, then overwrite semantics, then the header contract. Every sentence carries operational information, though the AWS-versus-elsewhere conditional sentence is dense and slightly hard to parse on first read.

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?

For an 11-parameter mutation tool with no output schema, the description covers the highest-risk aspects: overwrite behavior, platform-dependent race guards, and the header signing contract, and it implies the result carries a headers map and an effective expiry. Minor gaps remain around the shape of the returned URL itself, but the critical call-time knowledge is present.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3, but the description adds genuinely new semantics: content headers and userMetadata are signed into the URL and must be sent unchanged, and headers omitted here take whatever the PUT sends. That changes how an agent should populate the 8 optional parameters rather than merely restating them.

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?

The first sentence names the concrete artifact produced (a short-lived pre-signed PUT URL) and its purpose (uploading content directly), which is far more specific than the title alone. It does not explicitly distinguish itself from close siblings like presign_upload_parts, start_multipart_upload, or write_object, so an agent must infer which upload path to take.

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?

Usage is implied rather than stated: single-object direct PUT uploads, with overwrite required to replace an existing key. There is no explicit 'use this instead of X when Y' routing versus the multipart and write_object siblings, which are the main competing options for this task.

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