Skip to main content
Glama
sklivvz

TinyURL MCP

by sklivvz

TinyURL MCP

A local stdio Model Context Protocol server for managing individual TinyURL aliases through the authenticated TinyURL API. It supports exact-alias link creation and changes, archive and expiration controls, analytics reports and settings, raw analytics logs, and bounded typed bulk operations.

It requires Node.js 20 or newer and has zero runtime dependencies. All calls use the fixed tinyurl.com domain and the fixed https://api.tinyurl.com API origin; callers cannot supply an arbitrary host, path, or endpoint.

Requirements

  • Node.js 20 or newer.

  • A TinyURL API token with the permissions needed for the tools you enable.

  • A private directory for the configuration, token, and server state.

Related MCP server: Linkly MCP Server

Setup

From a checkout, no dependency installation is required:

npm test

The tests use Node's built-in test runner and provider mocks; they do not need a TinyURL token.

1. Create private files

Use real absolute paths in place of the /path/to/... placeholders. The token file must be a regular file with mode 0600. The state directory and its immediate parent must be real directories with mode 0700.

mkdir -p /path/to/private/tinyurl-state
chmod 700 /path/to/private /path/to/private/tinyurl-state

printf '%s\n' '<your-tinyurl-api-token>' > /path/to/private/tinyurl-api-token
chmod 600 /path/to/private/tinyurl-api-token

cp config.example.json /path/to/private/tinyurl-config.json
chmod 600 /path/to/private/tinyurl-config.json
$EDITOR /path/to/private/tinyurl-config.json

The token file may contain a raw token or JSON using either token or apiToken:

{ "token": "<your-tinyurl-api-token>" }

2. Configure the server

config.example.json uses placeholders only:

{
  "tokenFile": "/path/to/private/tinyurl-api-token",
  "stateDir": "/path/to/private/tinyurl-state",
  "timeoutMs": 4000
}

Field

Required

Description

tokenFile

Yes

Absolute path to the private token file. The file must be a regular, non-symlink file with mode 0600.

stateDir

Yes

Absolute path to the private state directory. It must be a real, non-symlink directory with mode 0700; its immediate parent must also be 0700.

timeoutMs

No

API request timeout from 100 to 4000 milliseconds. Defaults to 4000.

The config file itself must be a regular, non-symlink file with mode 0600, no larger than 64 KiB, and its path must be absolute. Do not commit the config file, token file, or state directory.

3. Token permissions

TinyURL applies permissions to API tokens. The server uses one token, so grant the permissions required by the tools you expose. The tools declare these TinyURL token permissions:

TinyURL token permission

Tools

Create TinyURL

tinyurl_create

No separate scope shown by TinyURL

tinyurl_read

Update TinyURL

tinyurl_update

Change URL

tinyurl_change_destination

Manage TinyURL Expiration

Expiration fields in tinyurl_create, tinyurl_update and tinyurl_set_expiration

Delete TinyURL

tinyurl_delete

Archive TinyURL

tinyurl_archive

Use Analytics

tinyurl_analytics_report, tinyurl_analytics_status, tinyurl_analytics_sharing

Raw Analytics Logs

tinyurl_analytics_raw_logs

Use Bulk Requests

tinyurl_bulk_create, tinyurl_bulk_status, tinyurl_bulk_report

None required

tinyurl_status

tinyurl_status checks only whether the token file and state directory appear usable. It does not enumerate or validate token scopes. A token that lacks a required permission is rejected by TinyURL when the relevant tool runs, typically as an api_rejected error. Use least privilege and grant only the permissions needed by the tool set you intend to use.

4. Register with an MCP client

Set TINYURL_CONFIG_FILE to the absolute path of the private config file. Use Node.js 20 or newer to launch the server:

{
  "mcpServers": {
    "tinyurl": {
      "command": "node",
      "args": ["/path/to/tinyurl-mcp/main.mjs"],
      "env": {
        "TINYURL_CONFIG_FILE": "/path/to/private/tinyurl-config.json"
      }
    }
  }
}

The server communicates over stdin/stdout using MCP JSON-RPC. It is intended to be launched by an MCP client; running it directly starts a silent server that waits for protocol messages:

TINYURL_CONFIG_FILE=/path/to/private/tinyurl-config.json npm start

Tools

Every call is restricted to the fixed API origin. Link tools address one exact tinyurl.com alias; the optional domain field, where accepted, may only be tinyurl.com. Analytics reports are selected from a fixed set, and analytics date ranges, pages, and bulk IDs are validated.

Tool

Access

Purpose

tinyurl_create

Write

Creates one short link for an exact URL, with an optional alias and expiration. A verified prior result may be reused for the same exact operation.

tinyurl_read

Read-only

Reads one exact alias and returns its destination and available metadata.

tinyurl_update

Write

Updates metadata or renames one exact alias. It cannot change the destination.

tinyurl_change_destination

Write

Changes the destination of one exact alias, redirecting existing traffic to the new URL.

tinyurl_delete

Destructive write

Permanently deletes one exact alias.

tinyurl_archive

Write

Toggles, archives, or unarchives one exact alias and verifies the resulting archive state.

tinyurl_set_expiration

Write

Sets or clears the expiration of one exact alias.

Analytics

Tool

Access

Purpose

tinyurl_analytics_report

Read-only

Reads one fixed analytics report: timeline, general, weekday, hour, top_sources, top_languages, or location.

tinyurl_analytics_raw_logs

Read-only, sensitive

Reads a bounded page of raw analytics JSON over a date range.

tinyurl_analytics_status

Write

Enables or disables analytics collection for one exact alias.

tinyurl_analytics_sharing

Write, privacy-sensitive

Enables or disables public analytics sharing for one exact alias.

Bulk operations

Tool

Access

Purpose

tinyurl_bulk_create

Bulk write

Submits 1-100 typed create, update, change, delete, archive, or unarchive items. A batch can include destructive items.

tinyurl_bulk_status

Read-only

Reads the status of one bulk request.

tinyurl_bulk_report

Read-only

Reads a bounded page of one bulk request report.

Server status

Tool

Access

Purpose

tinyurl_status

Read-only

Checks whether the configuration, token, and state directory appear usable. Does not call TinyURL or write state.

Inputs

  • tinyurl_create requires url and accepts optional alias and expires_at. expires_at is an ISO 8601 date-time or duration accepted by TinyURL, or null for no expiration.

  • tinyurl_read requires alias.

  • tinyurl_update requires alias and at least one of new_alias, new_stats, new_tags, new_expires_at, or new_description.

  • tinyurl_change_destination requires alias and url.

  • tinyurl_delete requires alias.

  • tinyurl_archive requires alias and action (toggle, archive, or unarchive). toggle always performs one toggle; archive and unarchive read the current state first and skip a no-op write.

  • tinyurl_set_expiration requires alias and new_expires_at (an ISO 8601 date-time/duration, or null to clear the expiration).

  • tinyurl_analytics_report requires report and from. Optional filters are to, alias, tag, and domain. interval is valid only for timeline and accepts minute, hour, day, week, or month. region is valid only for location and accepts world or a two-letter country code.

  • tinyurl_analytics_raw_logs requires from and accepts optional to, alias, tag, domain, offset (0-50000), and limit (1-1000, default 100). The report returns total, returned, hasMore, and nextOffset.

  • tinyurl_analytics_status requires alias and boolean enabled.

  • tinyurl_analytics_sharing requires alias and boolean public.

  • tinyurl_bulk_create requires between 1 and 100 items. create requires url; update requires alias and at least one new_* change; change requires alias and url; delete, archive, and unarchive require alias. Items may include up to 20 primitive metadata values.

  • tinyurl_bulk_status requires a positive integer bulkRequestId.

  • tinyurl_bulk_report requires a positive integer bulkRequestId and accepts offset (0-100000) and limit (1-500, default 100).

  • tinyurl_status takes no arguments.

Examples

Placeholder values only. Replace them with the exact values you intend to use.

Create an alias with an optional expiration:

{
  "url": "https://example.com/page",
  "alias": "example-alias",
  "expires_at": "2030-01-01T00:00:00Z"
}

Read an alias:

{ "alias": "example-alias" }

Update metadata without changing the destination:

{
  "alias": "example-alias",
  "new_description": "Example description",
  "new_tags": ["example-tag"]
}

Change the destination of an existing alias:

{
  "alias": "example-alias",
  "url": "https://example.com/new-page"
}

Archive an alias:

{
  "alias": "example-alias",
  "action": "archive"
}

Set an expiration, or use null to clear it:

{
  "alias": "example-alias",
  "new_expires_at": "2030-01-01T00:00:00Z"
}

Read a timeline analytics report:

{
  "report": "timeline",
  "from": "2026-01-01",
  "to": "2026-01-31",
  "interval": "day",
  "alias": "example-alias"
}

Read a page of raw analytics logs:

{
  "from": "2026-01-01",
  "to": "2026-01-31",
  "alias": "example-alias",
  "offset": 0,
  "limit": 100
}

Enable analytics collection and disable public sharing:

{ "alias": "example-alias", "enabled": true }
{ "alias": "example-alias", "public": false }

Submit a bulk batch:

{
  "items": [
    {
      "operation": "create",
      "url": "https://example.com/one",
      "alias": "example-one"
    },
    {
      "operation": "archive",
      "alias": "example-two"
    }
  ]
}

Read bulk status and a report page:

{ "bulkRequestId": 12345 }
{ "bulkRequestId": 12345, "offset": 0, "limit": 100 }

Delete an alias permanently:

{ "alias": "example-alias" }

Safety

Writes affect live TinyURL state. There is no dry-run mode.

  • Confirm before every write. Check the exact alias, URLs, expiration value, analytics flags, and every bulk item before calling a write tool. MCP clients should ask the user for explicit confirmation, with extra scrutiny for deletion, destination changes, expiration changes, public analytics, and bulk batches.

  • Deletion is permanent. tinyurl_delete and delete items inside tinyurl_bulk_create remove short links and cannot be undone. Do not call them on production aliases without confirmation.

  • Bulk batches can combine destructive operations. A single tinyurl_bulk_create call may contain up to 100 changes, including change, delete, and archive items. Review the entire batch before submission.

  • Destination changes redirect live traffic. tinyurl_change_destination and change bulk items are security-sensitive. Verify the new URL before applying them.

  • Archive and expiration change link availability. Confirm the intended archive action and expiration. Use null only when the link should never expire.

  • Analytics sharing can expose data. tinyurl_analytics_sharing with public: true makes analytics publicly accessible. Review whether that is appropriate before changing it.

  • Raw analytics logs are sensitive. tinyurl_analytics_raw_logs can return IP addresses, referrers, devices, languages, countries, browser/OS data, and URLs. This is read-only data, but it should be handled as sensitive personal data and kept out of logs and source control.

  • Ambiguous writes are not retried automatically. On a timeout, network failure, server error, or unreadable provider response, a write may have been applied. The server reports write_outcome_unknown and leaves a private pending marker for the affected alias. Do not retry blindly or clear the state directory. Reconcile the exact alias first, then follow the reported next action.

  • Bulk ambiguity blocks further bulk submissions. A bulk submission is serialized and checkpointed before it is sent. If its outcome is unknown, a private bulk barrier blocks all later bulk submissions until an operator reconciles the batch. An exact repeat of a verified submission returns the stored bulkRequestId; do not submit a modified batch as a retry.

  • Preserve the state directory. It contains durable operation receipts, alias locks, bulk receipts, and mutation-outcome markers. Losing or editing it can make a retry unsafe.

  • Fixed access boundary. The server does not accept a caller-supplied host, path, API endpoint, or analytics endpoint. Reports are selected from a fixed set, aliases and bulk IDs are validated, and there is no anonymous fallback. Destinations must be absolute http or https URLs.

  • Protect the token and use least privilege. The token is read from the private token file and is sent only as a bearer credential to https://api.tinyurl.com. Grant only the scopes needed for the tools you expose, and keep the token out of environment variables, command lines, logs, and source control.

  • File modes are not a complete security boundary. Processes running as the same OS user may still access private files. Restrict host access, mount the configuration read-only where possible, or run the server under a separate identity.

Development

npm test

The implementation is plain ESM using Node.js built-in modules. There is no build step and no dependency installation step.

License

MIT © 2026 Marco Cecconi

Available Tools

15 tools
tinyurl_analytics_raw_logsA

Read bounded raw analytics JSON over GET /analytics/raw/json. from is required; to, alias, domain and tag are passed to the vendor. offset and limit bound the returned page and the report discloses total, returned, hasMore and nextOffset. Token permission: Analytics.

NameRequiredDescriptionDefault
toNoOptional report end; omit for now.
tagNo
fromYesReport start, ISO 8601 date or date-time.
aliasNoExact alias: 1-30 letters, digits, underscore or hyphen.
limitNo
domainNoFixed tinyurl.com domain.
offsetNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the load well: it discloses the HTTP method (read-only GET), the required Analytics token permission, the bounded nature of the result set, and the pagination envelope (total, returned, hasMore, nextOffset). It stops short of rate limits or error behavior, but the safety and auth profile are clearly conveyed.

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?

Three dense clauses, front-loaded with the operation and endpoint, then the parameter contract, then the permission requirement. No sentence is redundant and nothing is buried.

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?

No output schema exists, and the description compensates by enumerating the return envelope's fields and pagination signals; no annotations exist, and it compensates with GET semantics and the token scope. Remaining gaps are minor (no error or rate-limit behavior), so it is nearly complete for a 7-parameter read 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?

Schema coverage is only 57%, yet the description adds functional meaning for the undocumented parameters: offset/limit 'bound the returned page' and tag/alias/domain are 'passed to the vendor'. The required-ness of 'from' is reinforced. It does not explain format or interactions between filter and paging, so not a 5.

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?

States a specific verb and resource ('Read bounded raw analytics JSON') plus the underlying endpoint, which unambiguously identifies a raw-log read operation. It implicitly contrasts with the aggregated tinyurl_analytics_report sibling via the word 'raw', but never names that alternative explicitly.

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?

It does say 'from is required' and that the other filters are 'passed to the vendor', which gives practical invocation context, and it names the required token permission. However there is no explicit when-to-use-this vs tinyurl_analytics_report guidance or any exclusion for when raw logs are inappropriate.

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

tinyurl_analytics_reportB

Read one fixed TinyURL analytics report over GET /analytics/*. report selects timeline, general, weekday, hour, top_sources, top_languages or location. from is required; to, interval, alias, domain, tag and location region are validated and bounded. Token permission: Analytics.

NameRequiredDescriptionDefault
toNoOptional report end; omit for now.
tagNoOnly links with this tag.
fromYesReport start, ISO 8601 date or date-time (for example 2021-08-10T10:00:00-0800).
aliasNoExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.
regionNoLocation report only: world (default) or a two-letter ISO 3166-1 country code.
reportYesFixed report endpoint; no arbitrary path is accepted.
intervalNoTimeline bucket size only.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description usefully discloses the read-only GET nature, the required 'Analytics' token permission, and that optional parameters are 'validated and bounded'. It stops short of return shape, pagination, error behavior, or rate limits, which matter for an analytics endpoint with no output schema.

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?

Three compact sentences, front-loaded with the verb, resource, and endpoint. The dense phrasing ('to, interval, alias, domain, tag and location region are validated and bounded') is efficient, though slightly telegraphic.

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

Completeness3/5

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

Covers endpoint, auth scope, required inputs, and validation, which is solid for a request-side definition. However, with eight parameters, no annotations, and no output schema, an agent still has no picture of what a report returns or how large it might be.

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 coverage is 100%, so all eight parameters are already documented in the schema, including the 'Timeline bucket size only' and 'Location report only' scoping notes. The description largely restates that scoping rather than adding new meaning, so the baseline 3 applies.

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?

States a specific verb and resource ('Read one fixed TinyURL analytics report over GET /analytics/*') and enumerates the seven concrete report types, which separates it from sibling tinyurl_analytics_raw_logs and tinyurl_analytics_status. It does not name those siblings explicitly, so differentiation is implicit rather than spelled out.

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?

The description establishes that report is the selector and that from is required, and it hints at per-report applicability ('location region'). But it never says when to pick this over tinyurl_analytics_raw_logs or tinyurl_analytics_status, nor what happens when an inapplicable parameter is supplied.

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

tinyurl_analytics_sharingA

Enable or disable public analytics sharing for one exact TinyURL through PATCH /analytics/sharing. Requires alias and public. Uses the durable alias mutation barrier and invalidates create receipts. Token permission: Update TinyURL or Analytics settings.

NameRequiredDescriptionDefault
aliasYesExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.
publicYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose non-obvious traits: it is a mutation via PATCH, it goes through the durable alias mutation barrier, it invalidates create receipts, and it requires a specific token permission. Missing only failure/idempotency behavior and the response shape.

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?

Three short sentences, front-loaded with the action and target, then preconditions and side effects. Nothing is repeated and nothing is padding.

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 a 3-parameter mutation with no annotations and no output schema, the description covers endpoint, permissions, and side effects well. It omits error cases and whether repeated calls are idempotent, which would matter for retry logic.

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 coverage is 67% and alias/domain are already documented inline, so the schema does most of the work. The description adds only 'Requires alias and public' and never explains the boolean's direction (public=true enables, false disables), which is the one semantic an agent could misread.

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 verb pair (enable/disable) and resource (public analytics sharing) scoped to 'one exact TinyURL', plus the underlying endpoint. This clearly separates it from siblings like tinyurl_analytics_report, tinyurl_analytics_status, and the bulk variants without needing the schema.

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

Usage Guidelines4/5

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

The 'one exact TinyURL' phrasing and the required alias/public pair give a clear picture of when this applies, and the stated token permission (Update TinyURL or Analytics settings) is a usable precondition. It stops short of naming an alternative tool or stating what to do when the alias doesn't exist.

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

tinyurl_analytics_statusA

Enable or disable analytics collection for one exact TinyURL through PATCH /analytics/status. Requires alias and enabled. Uses the durable alias mutation barrier and invalidates create receipts. Token permission: Update TinyURL or Analytics settings.

NameRequiredDescriptionDefault
aliasYesExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.
enabledYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the disclosure burden and does so well: it names the HTTP method/path, states that it goes through a 'durable alias mutation barrier,' warns that it invalidates create receipts, and specifies the OAuth scope required. Missing only idempotency and reversibility/edge-case behavior (e.g., invalid alias, already-disabled state) to reach a 5.

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?

Three tight sentences with the operation stated first, then side effects, then auth. No filler; the mutation-barrier/receipt language is terse but earns its space as the only source of that behavioral fact.

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 a 3-param mutation with no annotations and no output schema, the description supplies the side effects, auth scope, and endpoint that an agent otherwise could not infer. It stops short of describing the response shape or what an invalid/disabled alias returns, but the essentials are present.

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 coverage is 67%, just under the threshold where the schema fully carries the load. The description restates the two required params but adds no meaning: 'enabled' is undocumented in both places (what does false do to existing data?), and the fixed 'domain' parameter is never acknowledged.

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 verb pair (enable/disable) plus the exact resource (analytics collection on one TinyURL) and even the backing endpoint. It is clearly distinguishable from the analytics siblings (report, raw logs, sharing) which are all read/share oriented.

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?

The phrase 'for one exact TinyURL' implies single-alias scope and implicitly rules out bulk usage, and the token permission line gives context on required auth. However, it never names an alternative or states when-not to call it (e.g., what to do for multiple aliases, or whether this affects reporting retroactively).

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

tinyurl_archiveA

Toggle, archive or unarchive one exact TinyURL through PATCH /archive. The vendor body is only domain+alias, so the endpoint toggles; this tool reads the current state first and toggles only when archive/unarchive requires a change. action=toggle always sends one toggle. Verifies the resulting archived boolean. Token permission: Archive TinyURL.

NameRequiredDescriptionDefault
aliasYesExact alias: 1-30 letters, digits, underscore or hyphen.
actionYestoggle flips once; archive/unarchive are idempotent and skip the write when already in that state.
domainNoFixed tinyurl.com domain.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the internal read-then-write sequence caused by the vendor's domain+alias-only body, states verification of the resulting archived boolean, and names the required token permission (Archive TinyURL). It stops short of describing behavior when the alias doesn't exist or what errors surface.

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?

Four tight sentences, front-loaded with the action and resource before the explanation. The clause on action=toggle partially restates the schema's enum description, a minor redundancy, but otherwise every sentence carries information about behavior the agent would otherwise get wrong.

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?

With no annotations and no output schema, the description fills most of the gap by explaining the read-first/toggle/verify flow and the permission requirement. It omits what the returned payload looks like beyond the verified archived boolean and how failures (unknown alias) are reported.

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%, and the schema already defines alias format, the three-value action enum with idempotency semantics, and the fixed domain. The description only adds backstory on why toggle vs archive differ at the API level, so it sits at the baseline rather than adding new parameter meaning.

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 names a concrete verb set (toggle, archive, unarchive) applied to a precisely scoped resource (one exact TinyURL) and even names the underlying endpoint PATCH /archive. That distinguishes it cleanly from tinyurl_update, tinyurl_delete, and tinyurl_change_destination without the agent needing to open any schema.

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

Usage Guidelines4/5

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

It explains when each action mode applies: archive/unarchive skip the write when already in that state, while toggle always sends one toggle. It does not explicitly route away from siblings (e.g. use tinyurl_update for other field changes), so the when-not-to-use guidance is implied rather than stated.

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

tinyurl_bulk_createA

Submit one bounded batch through POST /bulk (1-100 typed create/update/change/delete/archive/unarchive items). The request is serialized, checkpointed to a durable barrier before sending, and keyed by the canonical payload. A crash or unknown outcome blocks all further bulk submissions until an operator reconciles the batch; an exact repeat of a verified submission returns the stored bulkRequestId. Token permission: Bulk Requests.

NameRequiredDescriptionDefault
itemsYesTyped bulk operations; fields match the vendor BulkRequestItem variants.
domainNoFixed tinyurl.com domain.

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so well: it discloses serialization, durable checkpointing, canonical payload keying, idempotent repeat behavior, and a strong failure mode where unknown outcomes block future submissions until reconciliation. It also states the required token permission.

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 four dense sentences with zero filler, front-loading the operation scope before explaining reliability and permission behavior. Each sentence contributes distinct and necessary information.

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 a complex bulk mutation tool with no annotations or output schema, the description covers operational scope, failure semantics, idempotency, and permissions well. It does not explain the normal success response or direct the agent to tinyurl_bulk_status/tinyurl_bulk_report for results, which leaves a small contextual gap.

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 the items and domain parameters thoroughly. The description adds useful context by restating the allowed operation types and batch size, but it does not add new semantic detail beyond the schema.

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 states a specific verb and resource: submitting a bounded batch through POST /bulk. It names the exact item types (create/update/change/delete/archive/unarchive) and the 1-100 bound, making it straightforward to distinguish from single-operation siblings like tinyurl_create.

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 by 'bounded batch' and the 1-100 item limit, but the description never explicitly says when to use this tool versus tinyurl_create or how to check results via tinyurl_bulk_status/tinyurl_bulk_report. It gives operational constraints rather than direct routing guidance.

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

tinyurl_bulk_reportA

Read a bounded page of one bulk request report through GET /bulk/{bulkRequestId}/report. Requires a positive integer bulkRequestId; offset and limit bound the returned items and the response discloses total, returned, hasMore and nextOffset. Token permission: Bulk Requests.

NameRequiredDescriptionDefault
limitNo
offsetNo
bulkRequestIdYes

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and does well: 'Read' signals a non-mutating operation, the pagination behavior is disclosed (offset and limit bound returned items), and the required token permission ('Bulk Requests') is stated. It stops short of describing rate limits or error behavior for unknown/incomplete bulkRequestId values.

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?

Single dense sentence group with zero filler; the resource and endpoint come first, followed by the parameter and permission facts. Slightly overloaded by cramming pagination response fields and permissions into one sentence, but nothing is wasted.

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 a read-only paginated report endpoint with no output schema, the description supplies what an agent needs: the path, required ID constraint, paging inputs, the response fields (total, returned, hasMore, nextOffset), and the auth scope. The main missing piece is its relationship to the sibling bulk status/report tools.

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 0%, so the description must compensate, and it partly does: it explains that bulkRequestId must be a positive integer and that offset and limit bound the returned items. It omits the defaults (100/0) and the maximums (500, 100000) that the schema enforces and gives no meaning for offset beyond paging, so it does not fully cover the three params.

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?

States a specific verb and resource ('Read a bounded page of one bulk request report') and ties it to the concrete endpoint GET /bulk/{bulkRequestId}/report, so an agent knows exactly what is fetched. It does not explicitly differentiate from the sibling tinyurl_bulk_status, leaving that distinction to be inferred.

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?

The phrase 'one bulk request report' plus the required bulkRequestId implies usage after a bulk request exists, and the token permission requirement is stated. However, there is no explicit guidance on when to use this rather than tinyurl_bulk_status or tinyurl_bulk_create, and no stated preconditions such as whether the bulk request must be complete.

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

tinyurl_bulk_statusA

Read one bulk request status through GET /bulk/{bulkRequestId}/status. Requires a positive integer bulkRequestId. Token permission: Bulk Requests.

NameRequiredDescriptionDefault
bulkRequestIdYes

TDQS

A3.5/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden; it does add real value by disclosing the HTTP method (GET, i.e. read-only) and the required token permission ('Bulk Requests'). It says nothing about error behavior for unknown IDs, whether status transitions are terminal, or any rate limits, which matters for a polling tool.

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?

Two short sentences, front-loaded with the action and resource, with the parameter constraint and permission requirement following. Nothing is padded, though the endpoint path restates what the name already implies.

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

Completeness3/5

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

For a single-parameter read with no output schema and no annotations, the description covers the mechanics (endpoint, ID, token scope) but leaves the return shape unspecified — an agent cannot know what status values to expect or how to interpret them. Adequate but with a clear gap.

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 0% and the schema itself has no field description, so the description must compensate; it does by explaining that bulkRequestId is a positive integer identifying one bulk request, going slightly beyond the raw type/minimum constraint. It still does not say where the ID comes from (e.g., the tinyurl_bulk_create response).

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?

States a specific verb and resource ('Read one bulk request status') plus the underlying endpoint, which clearly separates it from tinyurl_bulk_create and tinyurl_bulk_report by name alone. It stops short of explicitly contrasting itself with those siblings, so it is clear but not fully differentiated.

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 only implied: an agent can infer this is the polling/status-check call for a bulk job, but the description never says when to use it versus tinyurl_bulk_report or tinyurl_status, nor mentions polling or terminal-state behavior.

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

tinyurl_change_destinationA

Change the destination of one exact TinyURL alias through PATCH /change. Requires alias and the exact new absolute http(s) url. Token permission: Update TinyURL.

NameRequiredDescriptionDefault
urlYesExact new absolute http(s) destination URL, preserved byte-for-byte.
aliasYesExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden: it discloses the HTTP verb/endpoint and the required token permission, which help an agent reason about auth and mutation semantics. It does not say whether the previous destination is recoverable, whether the alias must already exist, or what a failure response looks like for a destructive-in-effect operation.

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?

Three short sentences, front-loaded with the action and scope, then requirements, then permission. Every sentence carries distinct information with no filler.

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 a three-parameter mutation tool with complete schema coverage and no output schema, the description covers action, scope, required inputs, and auth. Only edge-case behavior (nonexistent alias, reversibility) is unaddressed, which is a minor gap given no annotations to compensate.

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 alias format, url byte-preservation, and the fixed domain enum are already fully documented. The description only restates 'alias' and 'exact new absolute http(s) url', adding nothing beyond the schema, so the baseline 3 applies.

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?

States a specific verb and field-level resource: changing the destination of one exact TinyURL alias, plus the underlying PATCH /change endpoint. The 'one exact alias' scoping is precise. It does not, however, explicitly distinguish itself from the sibling tinyurl_update, which an agent could reasonably read as also modifying an alias.

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?

Prerequisites are given (needs alias plus exact absolute http(s) url, and token permission 'Update TinyURL'), which implies when the call is valid. But there is no explicit when-to-use-this-vs-tinyurl_update guidance, and no statement about what happens if the alias does not exist.

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

tinyurl_createA

Create one exact TinyURL short link through POST /create. Requires url; domain is fixed to tinyurl.com; alias and expires_at are optional. Reuses durable operation results and never retries an ambiguous write blindly. Token permission: Create TinyURL.

NameRequiredDescriptionDefault
urlYesExact absolute http(s) destination URL, preserved byte-for-byte.
aliasNoExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.
expires_atNoISO 8601 date-time or duration accepted by TinyURL, or null for never.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the required token permission ('Create TinyURL'), the idempotent/durable-result reuse behavior, and the no-blind-retry policy on ambiguous writes. It does not state what happens on alias collision or rate limits, which keeps it from a 5.

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?

Three sentences, front-loaded with the action and endpoint, then requirements, then behavioral caveats. Every clause carries information an agent cannot get from the schema.

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 a write tool with no annotations and no output schema, it covers method, required inputs, auth, and idempotency semantics well. Only the shape of the returned link object is unaddressed, which is a minor gap given the simplicity of the call.

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 parameters are already fully documented; the description only restates that url is required and domain is fixed, which duplicates the single-value enum. No extra format or constraint detail beyond the schema.

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 verb and resource ('Create one exact TinyURL short link') plus the underlying endpoint POST /create. The word 'one exact' scopes it against tinyurl_bulk_create, so an agent can route correctly without opening the schema.

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

Usage Guidelines4/5

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

The single-link framing implicitly excludes bulk creation, and 'Reuses durable operation results and never retries an ambiguous write blindly' tells the agent how to behave on retry. It stops short of naming siblings for follow-up operations (update, change_destination, set_expiration), so the when-not guidance is inferred rather than explicit.

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

tinyurl_deleteB

Delete one exact TinyURL alias through DELETE /alias/{domain}/{alias}. Requires alias; domain is fixed to tinyurl.com. Token permission: Delete TinyURL.

NameRequiredDescriptionDefault
aliasYesExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden; it does disclose the auth requirement (Delete TinyURL token permission) and the exact-match, single-alias scope, which is real value. However, it never says the deletion is permanent/irreversible or what the response looks like, which are the critical behavioral facts for a destructive tool.

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?

A single dense sentence that front-loads the action and endpoint, then appends the permission constraint. Nothing is wasted, though the endpoint path is arguably redundant with the prose.

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

Completeness3/5

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

For a destructive, annotation-free mutation with no output schema, the description covers identity, scope, and auth, but leaves out irreversibility, error behavior for missing aliases, and any return value. An agent could invoke it correctly but not predict its consequences.

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 coverage is 100% and both parameters are documented there (alias format 1-30 chars, domain enum fixed to tinyurl.com). The description only restates required-ness and the fixed domain, adding no syntax or semantics beyond the schema, so the baseline 3 applies.

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?

States a specific verb and resource ('Delete one exact TinyURL alias') plus the underlying endpoint, so the agent knows precisely what happens. It separates cleanly from tinyurl_create/read/update, but it never contrasts itself with the sibling tinyurl_archive, which is the most likely confusion point for a destructive operation.

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?

'Requires alias; domain is fixed to tinyurl.com' plus the required token permission ('Delete TinyURL') tells the agent the preconditions for calling it. There is no guidance on when to prefer tinyurl_archive instead of a hard delete, or what to do when the alias does not exist, so usage is implied rather than directed.

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

tinyurl_readB

Read one exact TinyURL alias through GET /alias/{domain}/{alias}. Requires alias; domain is fixed to tinyurl.com. Token permission: Read TinyURL.

NameRequiredDescriptionDefault
aliasYesExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description does disclose useful behavior: it is a GET-based single-record read and it requires the 'Read TinyURL' token permission, which is real operational context. It does not say what happens on a missing/expired alias, whether the response includes metadata or only the destination, or anything about rate limits — notable gaps for a tool with zero annotation coverage.

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?

Two compact sentences, front-loaded with the core action and endpoint, then the constraint and permission. No filler, though the endpoint path partially duplicates information the schema already conveys.

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

Completeness3/5

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

The tool is simple (2 params, one required, no nesting), but there is no output schema and no annotations, so the description should ideally say what a successful read returns and how a nonexistent alias is signaled. Auth/permission and fixed-domain context are present; return-value and error semantics are absent.

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 coverage is 100% and both parameters are self-documented in the schema (alias format 1-30 chars, domain enum fixed to tinyurl.com). The description restates the same facts ('requires alias', 'domain is fixed') without adding syntax, case-sensitivity, or format meaning beyond the schema. Baseline 3 applies.

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?

States a specific verb and resource — 'Read one exact TinyURL alias' — plus the underlying endpoint GET /alias/{domain}/{alias}, which makes the single-record scope unambiguous against bulk/analytics siblings. It never names a sibling explicitly, so differentiation is inferred from the verb rather than stated.

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?

'Requires alias; domain is fixed to tinyurl.com' gives preconditions but no when-to-use vs alternatives guidance (e.g., vs tinyurl_analytics_report or tinyurl_bulk_status). Usage is implied by 'read one exact alias' rather than spelled out.

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

tinyurl_set_expirationB

Set or clear one exact TinyURL expiration through PATCH /update using new_expires_at, then verify the returned or re-read expiry. Requires alias and new_expires_at (string or null). Token permission: Update TinyURL.

NameRequiredDescriptionDefault
aliasYesExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.
new_expires_atYesISO 8601 date-time or duration accepted by TinyURL, or null for never.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the endpoint (PATCH /update), required token permission ('Update TinyURL'), and a verification step after the write. However, it does not describe mutation side effects, error behavior if the alias is missing, or rate limits.

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 front-loaded and efficient, using two sentences with no wasted framing. There is minor redundancy in restating required parameters already covered by the schema, but overall it stays concise.

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

Completeness3/5

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

There is no output schema and no annotations, so the description must compensate. It explains the operation and verification step but does not describe the return payload or error cases, leaving gaps for an agent invoking a mutation tool.

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 three parameters. The description repeats the two required parameters but adds no extra semantics, and it does not mention the domain parameter at all beyond what the schema provides.

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?

States a specific verb and resource: setting or clearing TinyURL expiration via PATCH /update. It is clearly about expiration rather than general update, though it does not explicitly distinguish itself from the sibling tinyurl_update tool beyond the expiration focus.

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?

The description implies the tool is used when setting or clearing an expiration, but it does not explicitly state when to use this versus tinyurl_update or other sibling tools. No exclusions or alternative routing are provided.

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

tinyurl_statusA

Read-only check for TinyURL connector configuration, token and private state directory. Does not create a link or write state.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are present, so the description carries the full load and it does disclose the critical trait: no link is created and no state is written, i.e. zero side effects. It does not say whether it performs a network/token validation call or what it reports when the token or directory is missing, so a little behavioral surface is left uncovered.

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?

Two short sentences, no filler. The positive scope statement comes first and the negative/guardrail statement second, which is the right front-loading for a status check.

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 a no-argument status tool with no output schema, the description gives the agent enough to know it is safe and non-mutating. It could note what a successful vs. failed check looks like (since no output schema exists), which is the only remaining gap.

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 tool takes zero parameters and the schema is an empty object, so there is nothing for the description to add at the parameter level. Baseline 4 applies.

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 concrete read-only check covering exactly what it inspects: connector configuration, token, and the private state directory. The closing clause ('Does not create a link or write state') explicitly separates it from the sibling set, all of which are link-mutating operations. An agent can route to it without opening any schema.

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

Usage Guidelines4/5

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

The read-only/no-write framing makes the usage context (verify setup or auth before invoking tinyurl_create or other link tools) clear by contrast. It stops short of an explicit 'call this first when configuration is unknown' instruction or naming a specific alternative, which keeps it from a 5.

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

tinyurl_updateA

Update metadata or rename one exact TinyURL alias through PATCH /update. Requires alias and at least one new_* field. Never changes the destination; use tinyurl_change_destination. Token permission: Update TinyURL.

NameRequiredDescriptionDefault
aliasYesExact alias: 1-30 letters, digits, underscore or hyphen.
domainNoFixed tinyurl.com domain.
new_tagsNo
new_aliasNoExact alias: 1-30 letters, digits, underscore or hyphen.
new_statsNoEnable or disable click analytics collection.
new_expires_atNoISO 8601 date-time or duration accepted by TinyURL, or null for never.
new_descriptionNo

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries real weight: it names the HTTP method, states the at-least-one-new-field rule, discloses the required token permission ("Update TinyURL"), and rules out destination mutation. It does not say whether the response echoes the updated record or whether new_tags replaces versus merges the existing tag set.

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?

Three short sentences, no filler: what it does, what it requires, what it does not do plus the alternative, then the permission. The routing hint is front-loaded where an agent will see it.

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 a 7-parameter mutation tool with no annotations and no output schema, the description covers the essentials: endpoint, precondition, permission, and the main sibling boundary. Remaining gaps are the replace-vs-merge semantics of new_tags and the overlap with tinyurl_set_expiration for new_expires_at, both of which could cause misfires.

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

Parameters5/5

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

The schema marks only alias as required, but the description supplies the critical cross-parameter constraint ("at least one new_* field") that the schema does not encode, and "rename" ties new_alias to its purpose. This is meaning that exists nowhere in the structured fields.

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 verb (update metadata / rename) and a specific resource (one exact TinyURL alias), plus the underlying endpoint PATCH /update. It also explicitly distinguishes itself from tinyurl_change_destination, so an agent can route between the two without opening either schema.

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

Usage Guidelines4/5

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

Gives an explicit exclusion ("Never changes the destination; use tinyurl_change_destination") and a precondition (alias plus at least one new_* field). The gap is that new_expires_at overlaps with the sibling tinyurl_set_expiration, and the description never says which to prefer, nor references tinyurl_read before updating.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv1.0.0
    • First observedtinyurl_analytics_raw_logs
    • First observedtinyurl_analytics_report
    • First observedtinyurl_analytics_sharing
    • First observedtinyurl_analytics_status
    • First observedtinyurl_archive
    • First observedtinyurl_bulk_create
    • First observedtinyurl_bulk_report
    • First observedtinyurl_bulk_status
    • First observedtinyurl_change_destination
    • First observedtinyurl_create
    • First observedtinyurl_delete
    • First observedtinyurl_read
    • First observedtinyurl_set_expiration
    • First observedtinyurl_status
    • First observedtinyurl_update

TDQS

A4.1/5.0

Scored across 15 tools

Disambiguation5/5

Each tool has a clearly distinct target action: create/read/update/delete alias operations are separated, and update explicitly excludes destination and expiration changes. Analytics report vs raw logs vs status/sharing are distinct, and bulk create/status/report are cleanly scoped. No pair appears interchangeable.

Naming Consistency5/5

All tools use a consistent tinyurl_ prefix followed by snake_case action/resource names. The naming pattern is predictable throughout, including analytics and bulk subdomains.

Tool Count5/5

Fifteen tools fit the server's scope well: core alias lifecycle, analytics administration, bulk operations, and connector status. Each tool maps to a meaningful operation rather than redundant surface.

Completeness5/5

The tool surface covers TinyURL alias creation, reading, metadata updates, destination changes, deletion, archiving, expiration, analytics collection/sharing/reporting, and bulk operations with status/report retrieval. No obvious lifecycle or administrative gap is apparent for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to create, manage, and analyze short URLs through complete URL shortening functionality. Supports batch operations, custom domains, click statistics, and comprehensive link management.
    6
    6 npm
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables interaction with Linkly's URL shortener and link management platform. Supports creating and managing short links, viewing analytics, configuring custom domains and webhooks, and exporting click data.
    20
    25 npm
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables users to shorten links, bulk create URLs, generate QR codes, manage and disable links, and retrieve click analytics from MCP clients like Claude, ChatGPT, Cursor, and n8n.
    9
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables users to shorten links, bulk-create URLs, generate QR codes, and retrieve click analytics through MCP clients such as Claude, ChatGPT, Cursor, and n8n.
    9
    36 npm
    MIT