Skip to main content
Glama

Upload an asset

upload_file

Store an image, font or PDF in the account's asset bucket and get back a kamy://asset/<id> reference you can drop anywhere inside a render_pdf / render_html data payload — Kamy swaps it for a fresh signed URL at render time. That reference is the point of this tool: it is how a logo, signature image or custom font gets into a template without hosting it yourself. Pass contentBase64 and this server performs the upload for you, returning { id, assetRef, bytes, uploaded: true }. Omit contentBase64 for files too big to pass through a tool call and you get the raw slot instead — { uploadUrl, uploadMethod, uploadHeaders, expiresAt, uploaded: false } — then PUT the bytes yourself within 15 minutes. Inline uploads are capped at 5 MB here; the API itself allows 100 MB via that URL. Only the listed MIME types are accepted. Requires a Kamy API key with the uploads:write scope; without a key, returns dashboard setup instructions.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
filenameYesName to store the asset under. Characters outside [A-Za-z0-9._-] are replaced with '_'.
sizeBytesNoDeclared size in bytes. Computed automatically when contentBase64 is supplied. Max 100 MB.
contentTypeYesMIME type. The API rejects anything outside this list.
contentBase64NoBase64 bytes to upload. When supplied, this server PUTs them to the pre-signed URL and the asset is immediately usable. Omit for files too large to pass through a tool call — you then get uploadUrl back and PUT the bytes yourself within 15 minutes.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond annotations (which are minimal), the description reveals multiple behavioral traits: the dual upload mechanism, size limits, time constraint, return value shapes for both scenarios, MIME restriction enforcement, and authentication requirements. This fully informs the agent about the tool's non-obvious behaviors and side effects.

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?

The description is a single, dense paragraph, but every sentence adds essential information without redundancy. It front-loads the core purpose (storing assets and returning references). A slight improvement would be structuring into separate sentences or bullets, but it remains efficient and scannable.

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

Completeness5/5

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

Despite no output schema, the description fully specifies the return object shape for both modes (`{ id, assetRef, bytes, uploaded: true }` and `{ uploadUrl, uploadMethod, uploadHeaders, expiresAt, uploaded: false }`). It covers auth, size caps, timeouts, MIME restrictions, and integration with other tools (render_pdf/render_html). The description leaves no major information gaps for an agent to safely and correctly invoke the tool.

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?

The input schema covers all 4 parameters with descriptions (coverage 100%). The description adds extra semantics: it explains that `contentBase64` triggers immediate upload vs. deferred, that `sizeBytes` is auto-computed when `contentBase64` is present, and that `contentType` must be from the enum. This enriches the schema's baseline by providing usage context and dependencies between parameters.

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 tool stores an asset (image, font, PDF) in the account's asset bucket and returns a `kamy://asset/<id>` reference. It specifies the verb 'store', the resource type, and the output, and distinguishes itself from sibling tools by being the only upload-focused tool.

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

Usage Guidelines5/5

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

The description explicitly explains two usage modes: supplying contentBase64 for inline uploads (capped at 5 MB) or omitting it to receive a pre-signed URL for large files (up to 100 MB, 15-minute window). It also states the acceptable MIME types, the required API key scope (`uploads:write`), and implies when this tool should be used (for assets needed in render_pdf/render_html templates). This provides clear situational guidance.

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.

TDQS

A4.2/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose with detailed descriptions that differentiate similar tools (e.g., render_pdf vs render_async vs render_batch, create_signature_request vs create_envelope). No two tools overlap in a way that would cause confusion.

Naming Consistency5/5

All tool names follow a consistent lower_snake_case verb_noun pattern (e.g., attest_artifact, convert_document, list_renders). No mixing of conventions or ambiguous verb choices.

Tool Count4/5

47 tools is high but reflects the broad scope of the platform (document generation, signing, auditing, scheduling, webhooks, verification). Some informational tools could be merged, but the count is still reasonable for the domain.

Completeness3/5

The tool set covers the core document lifecycle well but has notable gaps: no tool to delete renders, no tool to void/cancel signature requests, and no CRUD for templates (only list and schema). The inability to pause schedules via MCP is also a gap.

Resources