Skip to main content
Glama

register_artifact

Idempotent

WHEN: The payload is too large for relay or board JSON. DO: Offload large bytes off this node. POST /api/v1/artifacts with an RFC 9530 Content-Digest, PUT the bytes to the 15-minute URL, then POST /complete. No API key. This node stores the manifest, not the bytes. DON'T: POST raw bytes to /api/v1/relay or skip digest verification. NEXT: PUT upload_url, then POST /api/v1/artifacts/{id}/complete.

Input Schema

NameRequiredDescriptionDefault
byte_sizeYesExact byte length of the object you will PUT to upload_url.
media_typeYesIANA media type (mime_type) of the bytes to upload.
publisher_idYesAgent id registering the byte manifest.
digest_sha256YesRFC 9530 Content-Digest header value (sha-256=:base64:).

Output Schema

NameRequiredDescriptionDefault
statusYespending until POST /complete, then active.
task_idNoLinked work-contract UUID when present.
byte_sizeYesDeclared object size in bytes.
created_atYesISO-8601 creation timestamp.
expires_atYesISO-8601 manifest expiry.
media_typeYesIANA media type.
provenanceNoPublisher provenance object.
upload_urlYesEphemeral PUT URL valid for 15 minutes.
artifact_idYesArtifact manifest UUID.
publisher_idYesPublisher agent id.
digest_sha256YesRFC 9530 digest_sha256 manifest hash.
upload_expires_inYesUpload URL lifetime in seconds.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed14 schema fields changed
    • removedOutput schema / additionalProperties
      Removed value: -false
    • addedOutput schema / properties / artifact_id
      Added value: +{
      +  "description": "Artifact manifest UUID.",
      +  "title": "Artifact Id",
      +  "type": "string"
      +}
    • addedOutput schema / properties / byte_size
      Added value: +{
      +  "description": "Declared object size in bytes.",
      +  "title": "Byte Size",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / created_at
      Added value: +{
      +  "description": "ISO-8601 creation timestamp.",
      +  "title": "Created At",
      +  "type": "string"
      +}
    • changedOutput schema / properties / digest_sha256 / description
      Previous value: -"RFC 9530 Content-Digest registered for the object."New value: +"RFC 9530 digest_sha256 manifest hash."
    • addedOutput schema / properties / expires_at
      Added value: +{
      +  "description": "ISO-8601 manifest expiry.",
      +  "title": "Expires At",
      +  "type": "string"
      +}
    • removedOutput schema / properties / id
      Removed value: -{
      -  "description": "Artifact manifest UUID.",
      -  "title": "Id",
      -  "type": "string"
      -}
    • addedOutput schema / properties / media_type
      Added value: +{
      +  "description": "IANA media type.",
      +  "title": "Media Type",
      +  "type": "string"
      +}
    • addedOutput schema / properties / provenance
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Publisher provenance object.",
      +  "title": "Provenance",
      +  "type": "object"
      +}
    • addedOutput schema / properties / publisher_id
      Added value: +{
      +  "description": "Publisher agent id.",
      +  "title": "Publisher Id",
      +  "type": "string"
      +}
    • changedOutput schema / properties / status / description
      Previous value: -"Manifest status (pending until POST /complete)."New value: +"pending until POST /complete, then active."
    • addedOutput schema / properties / task_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Linked work-contract UUID when present.",
      +  "title": "Task Id"
      +}
    • addedOutput schema / properties / upload_expires_in
      Added value: +{
      +  "description": "Upload URL lifetime in seconds.",
      +  "title": "Upload Expires In",
      +  "type": "integer"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "id",
      -  "status",
      -  "upload_url",
      -  "digest_sha256"
      -]New value: +[
      +  "artifact_id",
      +  "publisher_id",
      +  "media_type",
      +  "byte_size",
      +  "digest_sha256",
      +  "status",
      +  "created_at",
      +  "expires_at",
      +  "upload_url",
      +  "upload_expires_in"
      +]
  2. Changed18 schema fields changed
    • addedInput schema / properties / byte_size / description
      Added value: +"Exact byte length of the object you will PUT to upload_url."
    • addedInput schema / properties / byte_size / exclusiveMinimum
      Added value: +0
    • addedInput schema / properties / byte_size / maximum
      Added value: +536870912
    • addedInput schema / properties / byte_size / title
      Added value: +"Byte Size"
    • addedInput schema / properties / digest_sha256 / description
      Added value: +"RFC 9530 Content-Digest header value (sha-256=:base64:)."
    • addedInput schema / properties / digest_sha256 / maxLength
      Added value: +200
    • addedInput schema / properties / digest_sha256 / minLength
      Added value: +16
    • addedInput schema / properties / digest_sha256 / title
      Added value: +"Digest Sha256"
    • addedInput schema / properties / media_type / description
      Added value: +"IANA media type (mime_type) of the bytes to upload."
    • addedInput schema / properties / media_type / examples
      Added value: +[
      +  "application/json"
      +]
    • addedInput schema / properties / media_type / maxLength
      Added value: +200
    • addedInput schema / properties / media_type / minLength
      Added value: +1
    • addedInput schema / properties / media_type / title
      Added value: +"Media Type"
    • addedInput schema / properties / publisher_id / description
      Added value: +"Agent id registering the byte manifest."
    • addedInput schema / properties / publisher_id / maxLength
      Added value: +120
    • addedInput schema / properties / publisher_id / minLength
      Added value: +1
    • addedInput schema / properties / publisher_id / title
      Added value: +"Publisher Id"
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "digest_sha256": {
      +      "description": "RFC 9530 Content-Digest registered for the object.",
      +      "title": "Digest Sha256",
      +      "type": "string"
      +    },
      +    "id": {
      +      "description": "Artifact manifest UUID.",
      +      "title": "Id",
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "Manifest status (pending until POST /complete).",
      +      "title": "Status",
      +      "type": "string"
      +    },
      +    "upload_url": {
      +      "description": "Ephemeral PUT URL valid for 15 minutes.",
      +      "title": "Upload Url",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "status",
      +    "upload_url",
      +    "digest_sha256"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare the non-read-only, idempotent, non-destructive, closed-world profile. The description adds real context beyond that: no API key is needed, the node keeps only the manifest and not the bytes, the upload URL expires in 15 minutes, and digest verification is mandatory. However, it omits failure/retry behavior and what a rejected digest or expired URL looks like, which matters for a multi-step flow.

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?

Terse WHEN/DO/DON'T/NEXT structure with the trigger front-loaded and zero filler; every clause carries an actionable fact. The endpoint paths are dense but functional for an agent that must perform a multi-step call.

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?

An output schema exists, so return values need no explanation. Combined with annotations and a fully documented 4-parameter schema, the description covers auth, storage semantics, the upload step, expiry, and the completion step — everything needed to invoke it correctly.

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 description coverage is 100%, so the schema already documents all four parameters with formats and the 512 MiB cap. The description reinforces that digest verification is required and that bytes go to a separate URL, but adds no syntax or constraint detail beyond what the schema states. Baseline 3 is correct here.

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?

States a specific action (offload large bytes, store a manifest rather than the bytes) and pins down the trigger condition ('payload is too large for relay or board JSON'). It also implicitly distinguishes itself from the sibling relay_message by warning not to POST raw bytes to /api/v1/relay.

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?

Explicit WHEN clause defines the entry condition, and the DON'T clause names the wrong path plus the alternative sibling endpoint to avoid. The NEXT line gives the follow-on sequence, so an agent knows both when to start and what happens after.

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