Skip to main content
Glama

Create qURL

create_qurl

Protect a target URL by generating a restricted, expiring access link with optional IP, geo, user-agent, or AI-agent filters and time or session limits.

Instructions

Create a qURL — a policy-bound, expiring access link that gates a target URL with optional IP/geo/UA/AI-agent filters and time or session limits. When to use: minting a fresh protected access link for share-once or time-limited access (e.g. send a customer a 24-hour download link, gate a doc behind an IP allowlist, distribute a one-time-use credential to a contractor). Do NOT use this for chat-uploaded images, PDFs, screenshots, or file attachments. In HTTP MCP mode, those should go through upload_file_data_qurl; in stdio mode, use upload_file_qurl. When NOT to use: use mint_link when you already have a resource identifier and just need an additional access token under it — create_qurl identifies the resource by target URL and may return an existing same-type resource grouping. Use batch_create_qurls to create many in one round-trip. Use update_qurl to retag or extend an existing resource without minting a new one. If the user says 'give me the qURL of this image/file' and the content was uploaded in chat, this is the wrong tool. Behavior: not idempotent — calling twice produces two distinct qURL tokens, though both may share the same resource_id when the target URL groups to an existing same-type resource (this tool doesn't surface the underlying API's Idempotency-Key header). The returned qurl_link is shown ONCE in this response and is never recoverable through get_qurl or list_qurls; persist or share it immediately. A returned resource is in active status with the policy and per-token limits applied. If expires_in is omitted the API defaults to 24h — do not assume the link is permanent. max_sessions is per minted qURL, not resource-wide; set one_time_use: false explicitly when you need max_sessions: 0 to mean unlimited visitors. Returns: { qurl_id: string (q_…), resource_id: string, qurl_link: string (shown once), branded_domain?: string, qurl_site: string, expires_at: string (RFC 3339), label?: string, type?: string }. qurl_id is the only q_… display ID an agent gets in this response — keep it if you plan a follow-up against get_qurl/update_qurl/mint_link (which accept either prefix). Example: create_qurl({ target_url: 'https://example.com/private', expires_in: '24h', one_time_use: true, access_policy: { geo_allowlist: ['US'] } }).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
typeNoResource type for integrations allowed to mint non-url qURLs (max 64 chars). Defaults to url.
labelNoHuman-readable label identifying who this qURL is for (max 500 chars)
expires_inNoDuration string (e.g., "1h", "24h", "7d")
target_urlYesThe URL to protect with qURL
max_sessionsNoMaximum concurrent sessions for this qURL token (0 = unlimited when one_time_use is explicitly false; max 1000)
one_time_useNoWhether the link can only be used once
access_policyNoAccess control policy for the qURL
custom_domainNoCustom domain to assign to the auto-created resource (max 253 chars, must be registered/active/owned).
session_durationNoHow long access lasts after the recipient reaches the content (e.g., "1h"). This anchors the resource-level session-duration cap when a new resource is created.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
typeNoResource type echoed from the create request
labelNo
qurl_idYesDisplay-friendly qURL ID (q_ prefix)
qurl_linkYesOne-shot display access link — shown ONCE on creation, never returned again. Share immediately.
qurl_siteNo
expires_atNo
resource_idYesStable resource identifier (public key or legacy r_ ID)
branded_domainNoBare branded hostname for anchor text when the resource has a usable custom domain
email_deliveryNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed37 schema fields changedv0.2.1
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / access_policy / additionalProperties
      Removed value: -false
    • removedInput schema / properties / access_policy / properties / ai_agent_policy / additionalProperties
      Removed value: -false
    • changedInput schema / properties / access_policy / properties / ai_agent_policy / properties / allow_categories / description
      Previous value: -"AI agent categories to permit (all others blocked)"New value: +"AI agent categories to permit (all others blocked; max 20 entries, 128 chars each)"
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / allow_categories / items / maxLength
      Added value: +128
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / allow_categories / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / allow_categories / maxItems
      Added value: +20
    • changedInput schema / properties / access_policy / properties / ai_agent_policy / properties / deny_categories / description
      Previous value: -"AI agent categories to block (e.g., gptbot, commoncrawl)"New value: +"AI agent categories to block (e.g., gptbot, commoncrawl; max 20 entries, 128 chars each)"
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / deny_categories / items / maxLength
      Added value: +128
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / deny_categories / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / deny_categories / maxItems
      Added value: +20
    • changedInput schema / properties / access_policy / properties / geo_allowlist / description
      Previous value: -"Allowed country codes (ISO 3166-1 alpha-2)"New value: +"Allowed country codes (ISO 3166-1 alpha-2; max 50 entries, 8 chars each)"
    • addedInput schema / properties / access_policy / properties / geo_allowlist / items / maxLength
      Added value: +8
    • addedInput schema / properties / access_policy / properties / geo_allowlist / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / geo_allowlist / maxItems
      Added value: +50
    • changedInput schema / properties / access_policy / properties / geo_denylist / description
      Previous value: -"Denied country codes (ISO 3166-1 alpha-2)"New value: +"Denied country codes (ISO 3166-1 alpha-2; max 50 entries, 8 chars each)"
    • addedInput schema / properties / access_policy / properties / geo_denylist / items / maxLength
      Added value: +8
    • addedInput schema / properties / access_policy / properties / geo_denylist / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / geo_denylist / maxItems
      Added value: +50
    • changedInput schema / properties / access_policy / properties / ip_allowlist / description
      Previous value: -"Allowed IP addresses or CIDR ranges"New value: +"Allowed IP addresses or CIDR ranges (max 100 entries, 64 chars each)"
    • addedInput schema / properties / access_policy / properties / ip_allowlist / items / maxLength
      Added value: +64
    • addedInput schema / properties / access_policy / properties / ip_allowlist / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / ip_allowlist / maxItems
      Added value: +100
    • changedInput schema / properties / access_policy / properties / ip_denylist / description
      Previous value: -"Denied IP addresses or CIDR ranges"New value: +"Denied IP addresses or CIDR ranges (max 100 entries, 64 chars each)"
    • addedInput schema / properties / access_policy / properties / ip_denylist / items / maxLength
      Added value: +64
    • addedInput schema / properties / access_policy / properties / ip_denylist / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / ip_denylist / maxItems
      Added value: +100
    • changedInput schema / properties / access_policy / properties / user_agent_allow_regex / description
      Previous value: -"Regex to allow matching user agents"New value: +"Regex to allow matching user agents (max 256 chars)"
    • addedInput schema / properties / access_policy / properties / user_agent_allow_regex / maxLength
      Added value: +256
    • changedInput schema / properties / access_policy / properties / user_agent_deny_regex / description
      Previous value: -"Regex to deny matching user agents"New value: +"Regex to deny matching user agents (max 256 chars)"
    • addedInput schema / properties / access_policy / properties / user_agent_deny_regex / maxLength
      Added value: +256
    • changedInput schema / properties / custom_domain / description
      Previous value: -"Custom domain to assign to the auto-created resource"New value: +"Custom domain to assign to the auto-created resource (max 253 chars, must be registered/active/owned)."
    • addedInput schema / properties / custom_domain / maxLength
      Added value: +253
    • changedInput schema / properties / max_sessions / description
      Previous value: -"Maximum concurrent sessions (0 = unlimited, max 1000)"New value: +"Maximum concurrent sessions for this qURL token (0 = unlimited when one_time_use is explicitly false; max 1000)"
    • changedInput schema / properties / session_duration / description
      Previous value: -"How long access lasts after clicking (e.g., \"1h\")"New value: +"How long access lasts after the recipient reaches the content (e.g., \"1h\"). This anchors the resource-level session-duration cap when a new resource is created."
    • addedInput schema / properties / type
      Added value: +{
      +  "description": "Resource type for integrations allowed to mint non-url qURLs (max 64 chars). Defaults to url.",
      +  "maxLength": 64,
      +  "type": "string"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "properties": {
      +    "branded_domain": {
      +      "description": "Bare branded hostname for anchor text when the resource has a usable custom domain",
      +      "type": "string"
      +    },
      +    "email_delivery": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "attempted": {
      +          "type": "boolean"
      +        },
      +        "enabled": {
      +          "type": "boolean"
      +        },
      +        "failed": {
      +          "type": "number"
      +        },
      +        "recipients": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "results": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "email": {
      +                "type": "string"
      +              },
      +              "error": {
      +                "type": "string"
      +              },
      +              "message_id": {
      +                "type": "string"
      +              },
      +              "skipped": {
      +                "type": "boolean"
      +              },
      +              "success": {
      +                "type": "boolean"
      +              }
      +            },
      +            "required": [
      +              "email",
      +              "success",
      +              "skipped"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "sent": {
      +          "type": "number"
      +        },
      +        "skipped_reason": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "attempted",
      +        "enabled",
      +        "recipients",
      +        "sent",
      +        "failed",
      +        "results"
      +      ],
      +      "type": "object"
      +    },
      +    "expires_at": {
      +      "type": "string"
      +    },
      +    "label": {
      +      "type": "string"
      +    },
      +    "qurl_id": {
      +      "description": "Display-friendly qURL ID (q_ prefix)",
      +      "type": "string"
      +    },
      +    "qurl_link": {
      +      "description": "One-shot display access link — shown ONCE on creation, never returned again. Share immediately.",
      +      "type": "string"
      +    },
      +    "qurl_site": {
      +      "type": "string"
      +    },
      +    "resource_id": {
      +      "description": "Stable resource identifier (public key or legacy r_ ID)",
      +      "type": "string"
      +    },
      +    "type": {
      +      "description": "Resource type echoed from the create request",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "qurl_id",
      +    "resource_id",
      +    "qurl_link"
      +  ],
      +  "type": "object"
      +}
  2. First observedv0.2.0

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already indicate non-idempotence and non-read-only, but the description goes far beyond them: it states calling twice produces two distinct tokens, the qurl_link is shown once and is never recoverable, the API defaults expires_in to 24h, and max_sessions is per-token rather than resource-wide. These are critical behavioral traits that structured fields alone do not convey.

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?

The description is long but every sentence earns its place: definition, usage rules, behavioral caveats, return format, and a concrete example. It uses bolded section labels for scannability and front-loads the tool's purpose before routing to alternatives. The density is justified by the tool's complexity and nine parameters.

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?

Given the tool's complexity, rich schema, and large sibling set, the description is complete. It covers selection criteria, side effects, security-relevant one-time display of the link, default expiry, parameter semantics, and the exact return shape, including the fact that qurl_id is the only persistent handle. An agent has everything needed to invoke and follow up correctly.

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 description coverage is 100%, so the baseline is 3. The description adds meaningful guidance beyond the schema: target_url groups to an existing same-type resource, expires_in defaults to 24h, max_sessions: 0 requires explicit one_time_use: false, and the returned resource enters active status. This elevates the score above baseline, though not all nine parameters are individually discussed.

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 opens with a precise verb+object: 'Create a qURL — a policy-bound, expiring access link that gates a target URL.' It enumerates the optional filters and limits, and explicitly names sibling tools it is not, such as mint_link and batch_create_qurls, so an agent can distinguish it without inspecting schemas.

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 contains explicit 'When to use', 'Do NOT use', and 'When NOT to use' guidance. It names concrete alternatives (upload_file_data_qurl, upload_file_qurl, mint_link, batch_create_qurls, update_qurl) and provides a clear chat-upload exclusion, leaving no ambiguity about when this tool should be selected.

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