# qURL (npm · @layervai/qurl-mcp)

Mint, resolve, audit, and rotate scope-limited expiring access links (qURLs) for AI agents.

- Trust score: 76/100 (medium)
- Change this week: +52
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `@layervai/qurl-mcp`: 76/100 (this document), [markdown](https://verifymcp.io/servers/layervai-qurl-mcp/layervai-qurl-mcp.md), [page](https://verifymcp.io/servers/layervai-qurl-mcp/layervai-qurl-mcp)

## Channel facts

- Registry: `npm`
- Package: `@layervai/qurl-mcp`
- Version: `0.4.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to layervai/qurl-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 50 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 59/100
  - 60% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4430 tokens (~295/item across 15 items; 13 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add layervai-qurl-mcp -- npx -y @layervai/qurl-mcp
```

### Codex

```bash
codex mcp add layervai-qurl-mcp -- npx -y @layervai/qurl-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "layervai-qurl-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@layervai/qurl-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add layervai-qurl-mcp --command npx --arg -y --arg @layervai/qurl-mcp
```

### Hermes

```yaml
mcp_servers:
  layervai-qurl-mcp:
    command: "npx"
    args: ["-y", "@layervai/qurl-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "layervai-qurl-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@layervai/qurl-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-02 (score 75, +68)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Provenance: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: layervai/qurl-mcp
- [functional regression] Dependency health: partial → unverified
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → 60
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Stability: unverified → 0.20
- [functional improvement] License: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → excellent
- [functional] Licence: MIT

### 2026-08-01 (score 7, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-31 (score 6, −40)

- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 60 → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-07-28 (score 46, +22)

- [functional improvement] Schema quality: unverified → 60
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 24)

First indexed and scored.

## MCP tools (13)

### `create_qurl` (~734 tokens)

Create qURL

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). **When NOT to use:** use `mint_link` when you already have a resource (`r_…`) 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. **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 (r_…), 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, acces…

Input parameters:

- `access_policy` (object): Access control policy for the qURL
- `custom_domain` (string): Custom domain to assign to the auto-created resource (max 253 chars, must be registered/active/owned).
- `expires_in` (string): Duration string (e.g., "1h", "24h", "7d")
- `label` (string): Human-readable label identifying who this qURL is for (max 500 chars)
- `max_sessions` (integer): Maximum concurrent sessions for this qURL token (0 = unlimited when one_time_use is explicitly false; max 1000)
- `one_time_use` (boolean): Whether the link can only be used once
- `session_duration` (string): 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.
- `target_url` (string, required): The URL to protect with qURL
- `type` (string): Resource type for integrations allowed to mint non-url qURLs. Defaults to url.

Output parameters:

- `branded_domain` (string): Bare branded hostname for anchor text when the resource has a usable custom domain
- `expires_at` (string)
- `label` (string)
- `qurl_id` (string): Display-friendly qURL ID (q_ prefix)
- `qurl_link` (string): One-shot display access link — shown ONCE on creation, never returned again. Share immediately.
- `qurl_site` (string)
- `resource_id` (string): Stable resource identifier (r_ prefix)
- `type` (string): Resource type echoed from the create request

### `resolve_qurl` (~260 tokens)

Resolve qURL Access Token

Redeem a qURL access token (the `at_` prefix you pulled out of a `qurl_link`) to reveal the underlying URL and obtain a time-bound, IP-bound network access grant. Use this when an agent has been handed an access token and needs to fetch the protected resource — after a successful resolve, requests from `access_grant.src_ip` are permitted to the `target_url` for `access_grant.expires_in` seconds. Use `get_qurl` instead when you have a resource ID (`r_`) or qURL display ID (`q_`) and want admin-side details rather than end-user redemption. **Side-effects:** consumes one use on `one_time_use` tokens, decrements `max_sessions`, and may trip access policies (IP/geo/UA/AI-agent denylists). **`idempotentHint: false`** because one-time-use tokens consume on each call; for non-one-time tokens within an active grant window, repeats are effectively no-ops, but the conservative annotation reflects worst-case behavior.

Input parameters:

- `access_token` (string, required): The access token from a qURL link (e.g., at_k8xqp9h2sj9lx7r4a)

Output parameters:

- `access_grant` (object): Time-bound, IP-bound network access grant
- `resource_id` (string)
- `target_url` (string): Underlying URL revealed by the resolve

### `list_qurls` (~636 tokens)

List qURLs

List qURL resources, paginated and optionally filtered by status, date range, or search text. **When to use:** discovery — finding qURLs by status (e.g. everything still active), auditing date ranges, or full-text search across descriptions and target URLs (via the `q` parameter). Filters AND together (e.g. `status: 'active'` + `expires_before: '2026-05-01T00:00:00Z'` returns active qURLs about to expire). **When NOT to use:** use `get_qurl` instead when you already have a specific resource ID — it returns the same per-resource shape more cheaply and includes the `qurls[]` per-token detail that `list_qurls` omits. Use `resolve_qurl` to actually open access to a target URL. **Behavior:** read-only and idempotent. An empty `data[]` with `meta.has_more: false` means no resource matched the filters (not an error). Pagination is cursor-based: when `meta.has_more` is `true`, pass `meta.next_cursor` as `cursor` on the next call to fetch the following page. Default page size is 20, configurable via `limit` up to 100. By default only `active` qURLs are returned; pass `status: 'revoked'` to see only revoked qURLs or `'active,revoked'` to see both. Sort defaults to `created_at:desc`; override with `sort: 'expires_at:asc'` etc. **Returns:** `{ data: QURL[], meta: { has_more: boolean, next_cursor?: string, page_size?: number, request_id?: string } }` — each `data[]` item is the same stable resource shape returned by `get_qurl` minus per-token detail. Example: `list_qurls({ status: "active", sort: "expires_at:asc", limit: 10 })` returns the 10 active qURLs expiring soonest.

Input parameters:

- `created_after` (string): Filter: created after this date (RFC 3339)
- `created_before` (string): Filter: created before this date (RFC 3339)
- `cursor` (string): Pagination cursor from a previous response
- `expires_after` (string): Filter: expires after this date (RFC 3339)
- `expires_before` (string): Filter: expires before this date (RFC 3339)
- `limit` (integer): Maximum number of qURLs to return (default: 20)
- `q` (string): Search query (searches description and target_url)
- `sort` (string): Sort field and direction as 'field:direction'. Valid fields: created_at, expires_at. Valid directions: asc, desc (default desc). Example: 'created_at:desc'.
- `status` (string): Filter by status (comma-separated, e.g. 'active,revoked'). Defaults to 'active' when omitted; pass 'revoked' or 'active,revoked' to override.

Output parameters:

- `data` (array)
- `meta` (object)

### `get_qurl` (~233 tokens)

Get qURL

Fetch a single qURL resource by ID and return its current state plus a bounded preview of access tokens. Use this when you have a specific resource ID (r_ prefix) or qURL display ID (q_ prefix) — q_ IDs are auto-resolved to their parent resource. Use `list_qurls` instead when you need to discover qURLs by status, date range, or search query. Use `resolve_qurl` instead when you have an end-user access token (at_ prefix) and need to redeem it for the underlying URL. `qurls[]` is an unordered preview capped by the API at 100 rows and may be omitted on list views, preview lookup failure, or redacted connector-owned resources; use `qurl_count` to detect that more token rows may exist. The one-shot `qurl_link` from creation is never returned here.

Input parameters:

- `resource_id` (string, required): The resource ID (r_ prefix) or qURL display ID (q_ prefix) to fetch. If a q_ ID is passed, the API resolves it to the parent resource automatically.

Output parameters:

- `created_at` (string)
- `custom_domain`
- `description` (string)
- `expires_at` (string)
- `preserve_host` (boolean): When true, the original Host header is preserved when proxying via the custom domain. Only meaningful when custom_domain is set; defaults to false on the API side.
- `qurl_count` (number): Number of access tokens minted for this resource
- `qurl_site` (string)
- `qurls` (array)
- `resource_id` (string): Stable resource identifier (r_ prefix)
- `slug` (string): Immutable per-owner resource identity, when one was supplied at create time
- `status` (string)
- `tags` (array)
- `target_url` (string): Underlying URL the qURL protects; omitted on connector-owned resources

### `delete_qurl` (~275 tokens)

Delete qURL

Permanently revoke a qURL — the link and every access token under it stop working immediately. **This action is irreversible.** Use this when you want to cut off access entirely (compromised link, departed user, end-of-engagement). Use `update_qurl` instead when you only need to shorten/extend the expiration, retag, or rename — those preserve the existing access tokens. Use `extend_qurl` when you only need to push the expiration out. **Idempotent:** the API returns 404 for re-deletes, never-existed IDs, and resources owned by another API key (ownership-mismatch is collapsed into 404 server-side to avoid existence disclosure); this tool swallows all three. Branch on `was_already_revoked` to distinguish the no-op case from a successful revoke on this call. When the ID came from user input and ownership matters, call `get_qurl` first — a 200 confirms ownership; a thrown 404 is equally ambiguous on that endpoint too. Returns a confirmation payload. By default the resource is excluded from `list_qurls`; pass `status: "revoked"` to see it.

Input parameters:

- `resource_id` (string, required): The resource ID (r_ prefix). delete_qurl does not accept q_ (qURL display) IDs.

Output parameters:

- `message` (string): Human-readable confirmation message
- `resource_id` (string)
- `revoked` (boolean)
- `was_already_revoked` (boolean): True when the API responded 404 (resource was already revoked or never existed). Agents that need to distinguish 'I revoked it' from 'it was already gone' should branch on this.

### `extend_qurl` (~263 tokens)

Extend qURL Expiration

Push out the expiration of an active qURL by a relative duration. Convenience wrapper for the most common update — equivalent to `update_qurl({ resource_id, extend_by })`. Use this when the only change you need is more time on the clock. Use `update_qurl` instead when you also need to change tags, description, or set an absolute `expires_at`. Use `delete_qurl` when you want to cut off access entirely. Accepts both `r_` and `q_` IDs (q_ is auto-resolved to its parent resource). **Not idempotent:** calling twice with the same `extend_by` extends the expiration twice. If you need an absolute target, use `update_qurl` with `expires_at` so retries on transient errors don't double-push. Returns the updated resource with the new `expires_at` (same shape as `get_qurl`).

Input parameters:

- `extend_by` (string, required): Duration to extend by (e.g., "24h", "7d")
- `resource_id` (string, required): The resource ID (r_ prefix) or qURL display ID (q_ prefix) to extend. If a q_ ID is passed, the API resolves it to the parent resource automatically.

Output parameters:

- `created_at` (string)
- `custom_domain`
- `description` (string)
- `expires_at` (string)
- `preserve_host` (boolean): When true, the original Host header is preserved when proxying via the custom domain. Only meaningful when custom_domain is set; defaults to false on the API side.
- `qurl_count` (number): Number of access tokens minted for this resource
- `qurl_site` (string)
- `qurls` (array)
- `resource_id` (string): Stable resource identifier (r_ prefix)
- `slug` (string): Immutable per-owner resource identity, when one was supplied at create time
- `status` (string)
- `tags` (array)
- `target_url` (string): Underlying URL the qURL protects; omitted on connector-owned resources

### `update_qurl` (~524 tokens)

Update qURL

Update a qURL's expiration, tags, description, custom domain, or proxy host-header behavior. The richer alternative to `extend_qurl` — use `update_qurl` whenever you need anything beyond a relative time push. Accepts both `r_` and `q_` IDs for expiration, tags, and description updates (q_ is auto-resolved); custom domain and preserve_host updates require an `r_` resource ID because the qURL API now serves them from `PATCH /v1/resources/{id}`. **Constraints:** `extend_by` and `expires_at` are mutually exclusive; `custom_domain`/`preserve_host` cannot be combined with expiration changes in one call; at least one update field (`extend_by`, `expires_at`, `tags`, `description`, `custom_domain`, `preserve_host`) must be set. **Clearing fields:** pass `description: ""`, `tags: []`, or `custom_domain: ""` to clear those fields explicitly. Use `extend_qurl` when the only change is a relative time push. Use `delete_qurl` when you want to revoke entirely. **Errors:** if the input fails schema refinements (both extend_by + expires_at, or no fields set), the handler returns an `isError: true` content block before any API call. Other API errors throw with the API's `code`/`statusCode`. Returns the updated resource (same shape as `get_qurl`).

Input parameters:

- `custom_domain` (string): Replace the custom domain bound to this resource (max 253 chars, must be registered/active/owned). Pass "" to clear.
- `description` (string): Replace the resource description (max 500 chars)
- `expires_at` (string): Absolute expiration timestamp (RFC 3339). Mutually exclusive with extend_by.
- `extend_by` (string): Duration to extend by (e.g., "24h", "7d"). Mutually exclusive with expires_at.
- `preserve_host` (boolean): Whether to preserve the original Host header when proxying via the custom domain. Only meaningful when custom_domain is set; default false on the API side.
- `resource_id` (string, required): The resource ID (r_ prefix) or qURL display ID (q_ prefix) to update. If a q_ ID is passed, the API resolves it to the parent resource automatically.
- `tags` (array): Replace all tags on this resource (max 10 tags, each 1-50 chars)

Output parameters:

- `created_at` (string)
- `custom_domain`
- `description` (string)
- `expires_at` (string)
- `preserve_host` (boolean): When true, the original Host header is preserved when proxying via the custom domain. Only meaningful when custom_domain is set; defaults to false on the API side.
- `qurl_count` (number): Number of access tokens minted for this resource
- `qurl_site` (string)
- `qurls` (array)
- `resource_id` (string): Stable resource identifier (r_ prefix)
- `slug` (string): Immutable per-owner resource identity, when one was supplied at create time
- `status` (string)
- `tags` (array)
- `target_url` (string): Underlying URL the qURL protects; omitted on connector-owned resources

### `mint_link` (~438 tokens)

Mint Access Link

Mint a fresh access link for an existing qURL resource — same one-shot display semantics as `create_qurl.qurl_link`. Use this to issue additional access links to a resource without creating a brand-new qURL (e.g. a second recipient, a replacement after the original was lost). Use `create_qurl` instead when you want a brand-new resource with its own target_url and policy. Use `update_qurl` when you only want to change expiration/tags/description on the existing resource. Accepts both `r_` and `q_` IDs. **Constraints:** `expires_in` and `expires_at` are mutually exclusive (handler returns an `isError: true` content block before any API call if both are set). If neither expiry field is specified, the API defaults to 24 hours from now. **Output:** the new `qurl_link` is shown ONCE — no subsequent call returns it. Capture `qurl_id` if you need to correlate future access events or update this specific token.

Input parameters:

- `access_policy` (object): Access control policy for this link
- `expires_at` (string): Absolute expiration timestamp (RFC 3339). Mutually exclusive with expires_in
- `expires_in` (string): Relative duration until expiration (e.g., "5m", "24h", "7d"). Mutually exclusive with expires_at
- `label` (string): Human-readable label identifying who this link is for (max 500 chars)
- `max_sessions` (integer): Maximum concurrent sessions for this qURL token (0 = unlimited, max 1000)
- `one_time_use` (boolean): Whether this link can only be used once
- `resource_id` (string, required): The resource ID (r_ prefix) or qURL display ID (q_ prefix) to mint a new access link for. If a q_ ID is passed, the API resolves it to the parent resource automatically.
- `session_duration` (string): How long access lasts after clicking (e.g., "1h"). Rejected if it exceeds the parent resource's session-duration cap.

Output parameters:

- `branded_domain` (string): Bare branded hostname for anchor text when the resource has a usable custom domain
- `expires_at` (string)
- `qurl_id` (string): Display-friendly qURL ID (q_ prefix) for the minted token
- `qurl_link` (string): Newly minted access link with one-shot display semantics, like create_qurl
- `type` (string): Resource type echoed from the underlying resource

### `batch_create_qurls` (~318 tokens)

Batch Create qURLs

Create up to 100 qURLs in a single request. The single-call alternative to looping `create_qurl` — saves round trips and returns a single envelope of per-item results. **Not transactional:** items succeed or fail independently (see `succeeded`/`failed` counts and per-item `error`). Use this when you need to mint many qURLs at once (e.g. provisioning a vendor list, distributing per-customer share links). Use `create_qurl` for a single resource. **Response shape:** `{ succeeded: number, failed: number, results: BatchItemResult[], request_id?: string }`. Each `results[i]` carries `index` (matching the input position), `success`, plus either `qurl_link` + `resource_id` + `qurl_site` + `expires_at` (success) OR `error: { code, message }` (failure). Successful items may also carry `branded_domain` for custom-domain anchor text. **Partial failure signaling:** the handler sets `isError: true` on the tool response whenever `failed > 0`, so agents can branch without parsing JSON. The HTTP layer also returns 400 when every item fails — that's surfaced through the same shape (read `data.results[*].error`). **One-shot links:** like `create_qurl`, every `qurl_link` in the response is shown ONCE. Don't lose them.

Input parameters:

- `items` (array, required): Array of qURL creation requests (1-100 items)

Output parameters:

- `failed` (number)
- `request_id` (string)
- `results` (array)
- `succeeded` (number)

### `revoke_qurl_token` (~161 tokens)

Revoke qURL Token

Revoke one qURL token under a resource without revoking the whole resource. Use this when a single recipient/link should stop working but sibling qURLs on the same `resource_id` must remain active. Use `delete_qurl` instead when you want to revoke the resource and every token under it. **Constraints:** requires the parent `resource_id` (`r_…`) and the token display ID (`q_…`). Re-revoking an inactive token returns an API error rather than being treated as idempotent.

Input parameters:

- `qurl_id` (string, required): The qURL display ID (q_ prefix) to revoke.
- `resource_id` (string, required): The resource ID (r_ prefix) to revoke a specific qURL token from.

Output parameters:

- `message` (string)
- `qurl_id` (string)
- `resource_id` (string)
- `revoked` (boolean)

### `update_qurl_token` (~308 tokens)

Update qURL Token

Update one qURL token under a resource: expiration, label, access policy, max sessions, or session duration. Use this when you need to change a specific `q_…` token without changing sibling tokens or resource-level metadata. Use `update_qurl` instead for resource-level description/tags/custom-domain changes, and use `revoke_qurl_token` when the token should stop working entirely. **Constraints:** `extend_by` and `expires_at` are mutually exclusive; at least one token update field must be set. Returns the updated token summary.

Input parameters:

- `access_policy` (object): Replace the access policy for this token
- `expires_at` (string): Absolute token expiration timestamp (RFC 3339). Mutually exclusive with extend_by.
- `extend_by` (string): Duration to extend this token by (e.g., "24h", "7d"). Mutually exclusive with expires_at.
- `label` (string): Human-readable label for this token
- `max_sessions` (integer): Maximum concurrent sessions for this token (0 = unlimited, max 1000)
- `qurl_id` (string, required): The qURL display ID (q_ prefix) to update.
- `resource_id` (string, required): The resource ID (r_ prefix) to update a specific qURL token under.
- `session_duration` (string): How long access lasts after clicking (e.g., "1h"). Empty string applies the parent resource cap when one is set.

Output parameters:

- `access_policy` (object): Access control policy snapshot for this token
- `created_at` (string)
- `expires_at` (string)
- `label` (string)
- `max_sessions` (number)
- `one_time_use` (boolean)
- `qurl_id` (string)
- `qurl_site` (string)
- `session_duration` (number): Seconds of access granted after a successful resolve
- `status` (string): Per-token status (wider than resource status — tokens may be consumed/expired independently)
- `use_count` (number)

### `list_qurl_sessions` (~116 tokens)

List qURL Sessions

List active access sessions for a qURL resource. Use this to inspect who currently has live access before rotating, revoking, or terminating sessions. Use `terminate_qurl_sessions` when active sessions should be ended, and use `get_qurl` when you need token/resource metadata instead of active session state. **Behavior:** read-only and idempotent. Empty `data[]` means no active sessions for the resource.

Input parameters:

- `resource_id` (string, required): The resource ID (r_ prefix) to list active sessions for.

Output parameters:

- `data` (array)
- `meta` (object)

### `terminate_qurl_sessions` (~148 tokens)

Terminate qURL Sessions

Terminate active access sessions for a qURL resource. Use this after shortening access, rotating a link, or responding to a suspected leak when already-open sessions should end immediately. Pass `session_id` to terminate one active session; omit it to terminate all active sessions for the resource. Use `list_qurl_sessions` first when you need to inspect current sessions before taking action. **Side-effects:** existing access sessions are closed; qURL tokens themselves are not revoked.

Input parameters:

- `resource_id` (string, required): The resource ID (r_ prefix) to terminate sessions for.
- `session_id` (string): Specific session ID to terminate. Omit to terminate all active sessions for the resource.

Output parameters:

- `message` (string)
- `resource_id` (string)
- `session_id` (string)
- `terminated` (number)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/layervai-qurl-mcp/layervai-qurl-mcp#diagnostics

## Score history

- 2026-08-03: 76
- 2026-08-02: 75
- 2026-08-01: 7
- 2026-07-31: 6
- 2026-07-30: 46
- 2026-07-28: 46
- 2026-07-27: 24

## Links

- npm package: https://www.npmjs.com/package/@layervai/qurl-mcp
- Socket report: https://socket.dev/npm/package/@layervai/qurl-mcp
- Repository: https://github.com/layervai/qurl-mcp
- Website: https://layerv.ai/
- Changelog RSS feed: https://verifymcp.io/servers/layervai-qurl-mcp/layervai-qurl-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/layervai-qurl-mcp/layervai-qurl-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/layervai-qurl-mcp/layervai-qurl-mcp
