Skip to main content
Glama

Server Details

Shorten URLs, manage gajo.io short links, and read click analytics. Free account, no credit card.

Ownership verified
Status
Healthy
Uptime
100.0% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A4.2/5.0

Scored across 11 tools

Disambiguation4/5

Most tools are cleanly separated by resource+action, and descriptions explicitly cross-reference near-neighbors (shorten_url vs create_app_link, update_url vs update_app_link, deactivate vs delete vs reactivate). The only residual overlap is the create pair and the update pair, where the difference is app-link-vs-ordinary-link and plan tier rather than distinct operations, but the descriptions resolve this reliably.

Naming Consistency5/5

Uniform snake_case verb_noun pattern throughout: create_app_link, deactivate_url, delete_url, get_url, get_url_stats, get_usage, list_urls, reactivate_url, shorten_url, update_app_link, update_url. The suffixes are consistent and predictable (url/app_link resource, _stats/_usage sub-resources).

Tool Count5/5

Eleven tools is well within a healthy range for a URL shortener with app-link and analytics features. Each tool maps to a concrete operation (create, update, deactivate/reactivate, delete, get, stats, list, quota) with no filler.

Completeness4/5

Full lifecycle is covered for links: create (two flavors), read (single, list, stats), update, deactivate/reactivate, delete, plus quota introspection. Minor gaps exist — no batch/bulk shortening, no way to change a link's expiry, custom code, or tags after creation, and no filtering/search on list beyond paging — but agents can work around these.

Available Tools

11 tools
deactivate_urlDeactivate a short linkA
DestructiveIdempotent
Inspect

Turn off one of your short links so it stops redirecting, keeping its destination and clicks. Generated codes are never reassigned; use reactivate_url to turn the link back on, or delete_url to erase it for good.

NameRequiredDescriptionDefault
codeYesThe link's short code (e.g. AbCdEf, or launch for gajo.io/c/launch). A full short URL also works.

Output Schema

NameRequiredDescription
activeYes
shortCodeYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare non-readOnly, destructive, idempotent, and closed-world. The description adds genuinely new context: the destination and click history survive, and generated codes are never reassigned, which tells the agent this is a reversible soft-disable despite destructiveHint. It stops short of describing auth requirements or rate limits, so a 4 rather than 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?

Two tight sentences with the core action front-loaded and the alternatives packed into the second; nothing is wasted and no filler precedes the useful information.

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

Completeness5/5

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

For a one-parameter, idempotent, reversible operation with output schema present, the description covers effect, data preservation, code-reuse policy, and sibling routing. Nothing an agent needs to invoke it correctly is missing.

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 single 'code' parameter is already fully documented in the schema (format, examples, full-URL acceptance). The description adds no additional parameter guidance, so the baseline 3 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 specific verb and resource ('Turn off one of your short links') plus the concrete effect ('stops redirecting'), which immediately distinguishes it from delete_url and update_url. The preservation clause ('keeping its destination and clicks') further pins down exactly which operation this is.

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

Usage Guidelines5/5

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

Explicitly names both alternatives with the condition that selects each: reactivate_url to turn it back on, delete_url to erase it for good. Combined with the stated effect (stops redirecting but keeps data), an agent has a complete when-to-use / when-to-use-something-else decision rule.

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

delete_urlDelete a short link permanentlyA
DestructiveIdempotent
Inspect

Permanently delete one of your short links: its destination and click history are erased and it stops redirecting. It can't be undone or reactivated, and the code is never given to anyone else. Use it when a destination shouldn't be kept, e.g. a URL with a private token; to just switch a link off, use deactivate_url.

NameRequiredDescriptionDefault
codeYesThe link's short code (e.g. AbCdEf, or launch for gajo.io/c/launch). A full short URL also works.

Output Schema

NameRequiredDescription
deletedYes
shortCodeYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare destructive/idempotent/not-read-only; the description goes well beyond them by disclosing exactly what is destroyed (destination and click history erased, redirect stops), that it is irreversible and non-reactivatable, and that the code is never reissued. This is unusually rich disclosure for a destructive mutation.

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 tight sentences, front-loaded with the irreversible consequence, then the use case, then the alternative. Every clause carries information an agent needs; nothing is padding.

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

Completeness5/5

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

Output schema exists so return values need not be described, and the single required param is fully covered by the schema. The description supplies the full behavioral and routing context, leaving no gap for an agent to fill.

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 the single 'code' parameter is fully documented in the schema (format, examples, full-URL acceptance), so the description adds no syntax or format detail. The note that the code is never given to anyone else touches the parameter's lifecycle but is behavioral rather than semantic, so baseline 3 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 specific verb+resource (permanently delete a short link) with precise scope, and explicitly distinguishes itself from the sibling deactivate_url. An agent can pick this over the other eight siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit use case ('a destination shouldn't be kept, e.g. a URL with a private token') and names the alternative for the softer action ('to just switch a link off, use deactivate_url'). When-to-use and when-not-to-use are both covered.

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

get_urlGet a short linkA
Read-only
Inspect

Look up one of your short links by code: destination, click count, status, and expiry. Use get_url_stats for clicks per day and where they came from.

NameRequiredDescriptionDefault
codeYesThe link's short code (e.g. AbCdEf, or launch for gajo.io/c/launch). A full short URL also works.

Output Schema

NameRequiredDescription
activeNo
appLinkNoApp links only: where iOS and Android go, and the page other devices see.
shortUrlYesReady-to-share short link.
shortCodeYes
clickCountNo
createdDateNoISO-8601 instant.
expiresDateNoISO-8601 instant; null when the link never expires.
fallbackUrlNo
originalUrlYes
isCustomCodeNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that the lookup is scoped to 'your' short links and names the returned fields, but with an output schema present these details are already structured elsewhere, so added behavioral value is modest. No mention of behavior for an unknown code.

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, zero filler, with the core action front-loaded and the disambiguation appended. Every clause earns its place.

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 one-parameter read tool with annotations, a full schema, and an output schema, the description is nearly sufficient. The only gap is unstated behavior for an invalid or nonexistent code, which the agent may want to know before calling.

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?

Single 'code' parameter with 100% schema description coverage, so the schema already explains the format (short code or full short URL). The description only says 'by code', adding nothing beyond the schema, which is the expected baseline here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('look up') and resource ('one of your short links by code') and enumerates the fields returned (destination, click count, status, expiry). This makes it clearly distinguishable from get_url_stats and list_urls 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 Guidelines5/5

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

Explicitly routes the agent: 'Use get_url_stats for clicks per day and where they came from,' naming the alternative and the exact condition that selects it. Nothing about tool choice between these two is left to inference.

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

get_url_statsGet click statsA
Read-only
Inspect

Get click analytics for one of your links, bots excluded: total clicks and clicks per day (7 days on Free, 90 on Basic, every day since the link was created on Pro). Basic and Pro also get referrers, devices, countries, and regions.

NameRequiredDescriptionDefault
codeYesThe link's short code (e.g. AbCdEf, or launch for gajo.io/c/launch). A full short URL also works.

Output Schema

NameRequiredDescription
shortCodeYes
topRegionsNo
clicksByDayYes
historyDaysYesDays of history in clicksByDay.
totalClicksYes
topCountriesNo
topReferrersNo
deviceBreakdownNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds real behavioral context beyond them: bots are excluded from the counts, retention is 7/90/unbounded days by plan, and richer dimensions (referrers, devices, countries, regions) are gated to Basic/Pro. It does not cover error cases or rate limits, but the disclosure load is well carried.

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, front-loaded with the core purpose and the bots-excluded qualifier, followed by the tier breakdown. The stacked clauses and parentheticals make it slightly unwieldy, but no sentence is filler.

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

Completeness5/5

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

An output schema exists, so return values need no explanation, and the description still previews the metric dimensions and their plan gating. For a single-parameter read tool this covers everything an agent needs to invoke it correctly.

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

Parameters3/5

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

With 100% schema description coverage on a single 'code' parameter, the schema already does the heavy lifting, so baseline 3 applies. The description's 'for one of your links' reinforces that it takes exactly one link but adds no format or syntax detail beyond the schema's example values.

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 ('Get click analytics for one of your links') and immediately scopes the result set ('bots excluded: total clicks and clicks per day'). The per-link framing distinguishes it from siblings like get_usage (account-level) and get_url (metadata), so an agent can route 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 Guidelines3/5

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

Usage is implied by the analytics framing and the plan-tier table, but there is no explicit when-to-use-versus-alternatives statement and no named sibling (e.g., get_url for metadata, get_usage for quota). The tier gating tells the agent what it will get, not when it should choose this tool over another.

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

get_usageCheck plan and quotaA
Read-only
Inspect

Shows your plan and quota: links created and remaining this month, maximum link lifetime, and API requests per minute. Call it before creating many links or after a monthly-limit error; the allowance resets on the 1st of each month (UTC).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
planYes
totalUrlsNo
totalClicksNo
urlsRemainingYes
urlsMonthlyLimitYes
requestsPerMinuteYes
maxLinkLifetimeDaysNonull when links never expire.
urlsCreatedThisMonthYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine behavioral context beyond that: the allowance resets on the 1st of each month (UTC) and per-minute API request limits exist. It does not discuss caching or failure modes, but the reset cadence is a meaningful addition.

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 tightly written sentences: the return contents are front-loaded, followed by the call triggers and the reset caveat. Every clause carries information and nothing is redundant.

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

Completeness5/5

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

An output schema exists, so return-value shape need not be restated. Combined with the annotations covering the safety profile, the description supplies everything an agent needs: what it reports, when to call it, and the monthly reset behavior.

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, so there is nothing for the description to clarify; the baseline for a parameterless tool is 4. No parameter gaps exist to compensate for.

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 ('Shows') and resource ('your plan and quota') and enumerates exactly what is returned: links created and remaining this month, maximum link lifetime, and API requests per minute. This clearly separates it from the URL-management siblings (shorten_url, list_urls, get_url_stats), none of which report account-level plan/limit state.

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 gives explicit trigger conditions: 'Call it before creating many links or after a monthly-limit error.' That is clear when-to-use guidance tied to a concrete workflow. It stops short of naming alternatives or an explicit when-not case, so it sits just below the top band.

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

list_urlsList your short linksA
Read-only
Inspect

List your short links, newest first, with click counts. Use it to browse or to find a link's code; for one known code use get_url, and for clicks over time get_url_stats. Returns one page; use page to see more.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
limitNoLinks per page.

Output Schema

NameRequiredDescription
pageYes
limitYes
linksYes
totalYes
hasMoreYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavioral context beyond that: results are ordered newest first, include click counts, and are paginated ("Returns one page; use page to see more"). It does not mention auth requirements or a maximum page depth, 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 short sentences, front-loaded with purpose and immediately followed by routing and pagination constraints. Every sentence carries distinct information with no repetition of the name or title.

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

Completeness5/5

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

An output schema exists, so return values need not be described, and the description still covers the key shape (paged list with click counts). Pagination, ordering, and sibling routing are all addressed, leaving nothing an agent needs in order to call this correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description earns a bump by explaining the intent of the page parameter in context ("Returns one page; use page to see more"), which tells the agent why pagination exists, not just its type. The limit parameter is left entirely to the schema, so it is not a full 5.

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 ("List your short links") plus scope details an agent cannot get from the name: newest-first ordering and click counts included. It explicitly names the sibling tools get_url and get_url_stats as different operations, so the agent can discriminate without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit use cases ("browse or to find a link's code") and explicit alternatives with the condition that selects them: "for one known code use get_url, and for clicks over time get_url_stats." Nothing is left to inference about routing.

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

reactivate_urlReactivate a short linkA
Idempotent
Inspect

Turn a link you deactivated back on, with its same code and destination. Expired links, links disabled as unsafe, and custom codes that were unassigned can't be reactivated; create a new link instead.

NameRequiredDescriptionDefault
codeYesThe link's short code (e.g. AbCdEf, or launch for gajo.io/c/launch). A full short URL also works.

Output Schema

NameRequiredDescription
activeNo
appLinkNoApp links only: where iOS and Android go, and the page other devices see.
shortUrlYesReady-to-share short link.
shortCodeYes
clickCountNo
createdDateNoISO-8601 instant.
expiresDateNoISO-8601 instant; null when the link never expires.
fallbackUrlNo
originalUrlYes
isCustomCodeNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-derivable behavior: which link states are ineligible for reactivation, which is an important failure mode an agent can't infer from the schema. It stops short of describing the return payload or permission requirements.

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 tight sentences: the positive effect first, then the exceptions and the fallback. Every clause carries information and nothing is repeated.

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?

An output schema exists, so return values need no explanation, and the eligibility rules plus the code semantics make the definition callable without further reading. Only the absence of explicit sibling routing and permission/auth notes keeps it from being fully complete.

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 the single `code` parameter is fully documented, including the full-URL fallback. The description only echoes that the code is preserved, adding no new syntax or format guidance beyond the schema, so baseline 3 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 specific verb (reactivate), the resource (a link), and the exact effect — the same code and destination are restored. That distinguishes it immediately from create/shorten and from update_url, which would change a live link rather than revive a dead one.

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?

Explicitly enumerates the cases where this tool will not work (expired, disabled as unsafe, unassigned custom codes) and points to the alternative, 'create a new link instead'. It doesn't name the sibling tool (shorten_url/create_app_link) that performs the alternative, so the routing is directional but not pinpoint.

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

shorten_urlShorten a URLAInspect

Create a gajo.io short link for a URL and return it as shortUrl. Links follow your plan's code length and lifetime and count against its monthly quota. Pro plans can pass customCode for a branded gajo.io/c/{code} link, or shorten app deep links (myapp://...) with a web fallbackUrl.

NameRequiredDescriptionDefault
urlYesThe long URL to shorten (http, https, mailto, tel, ftp, sftp; Pro: app deep links).
customCodeNoPro only: custom code (3-50 letters, digits, or hyphens). Can't be combined with lifetimeDays.
fallbackUrlNoPro, deep links only: web URL used when the app isn't installed.
lifetimeDaysNoDays until the link expires; capped at your plan maximum.

Output Schema

NameRequiredDescription
activeNo
appLinkNoApp links only: where iOS and Android go, and the page other devices see.
shortUrlYesReady-to-share short link.
shortCodeYes
clickCountNo
createdDateNoISO-8601 instant.
expiresDateNoISO-8601 instant; null when the link never expires.
fallbackUrlNo
originalUrlYes
isCustomCodeNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare this is a non-readonly, non-idempotent mutation. The description adds important behavioral context beyond annotations: quota consumption, plan-driven link lifetime, and the branded link format for customCode. It doesn't cover failure modes or rate limits, but the added quota and plan constraints are meaningful.

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 compact sentences, with the primary action and return value front-loaded, followed by plan-level behavior and Pro-specific parameter nuances. No filler or repetition.

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?

Given full schema coverage, annotations, and an output schema, the description supplies the missing operational context: quota impact, plan-based lifetime, and Pro-only features. It is largely complete, though it could mention error conditions or whether the short URL is immediately active.

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 fully documents all four parameters. The description reinforces Pro-only usage for customCode and fallbackUrl and mentions the branded URL path, but adds little parameter-level detail beyond what the schema provides. Baseline 3 is appropriate.

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?

The description gives a specific verb and resource ('Create a gajo.io short link for a URL') and states the return field ('shortUrl'). It distinguishes itself from read/delete/update siblings but only partially separates from create_app_link, since it also mentions deep links with fallbackUrl.

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 description provides clear context about plan-based behavior: links follow the plan's code length and lifetime, count against monthly quota, and Pro-only features are called out. It doesn't explicitly exclude or name alternatives like create_app_link, so it stops short of full when-to-use guidance.

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

update_urlChange a link's destinationA
DestructiveIdempotent
Inspect

Pro only: point an existing short link at a new destination URL. Takes effect within a minute.

NameRequiredDescriptionDefault
urlYesThe new destination URL.
codeYesThe link's short code (e.g. AbCdEf, or launch for gajo.io/c/launch). A full short URL also works.

Output Schema

NameRequiredDescription
activeNo
appLinkNoApp links only: where iOS and Android go, and the page other devices see.
shortUrlYesReady-to-share short link.
shortCodeYes
clickCountNo
createdDateNoISO-8601 instant.
expiresDateNoISO-8601 instant; null when the link never expires.
fallbackUrlNo
originalUrlYes
isCustomCodeNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new context — the Pro plan gate and the ~1 minute propagation delay — but does not say the previous destination is permanently replaced or whether the change is reversible, which matters for a destructive op.

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, zero filler, with the plan restriction and the core action front-loaded before the propagation note.

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?

An output schema exists, so return values need no explanation, and with only two fully documented params the surface is small. What's missing is the destructive consequence — that the old destination is lost — which an agent might want to confirm before calling.

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 docs both params well, including the short-code format example. The description adds nothing about parameter formats or constraints beyond what the schema already provides, so the baseline 3 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 precise verb+resource: point an existing short link at a new destination URL. This is clearly distinct from shortening a new link (shorten_url) or toggling state (deactivate_url/reactivate_url), so an agent can route without opening a schema.

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 'Pro only' qualifier gives a real precondition, and 'existing short link' implies the tool is for links that already exist rather than new ones. However, no alternatives are named and there is no explicit statement of when not to use it versus shorten_url or update_app_link.

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. 2 tool updates
    • Changedcreate_app_link3 fields changed
      • changedInput schema / properties / androidUrl / description
        Previous value: -"The app's Google Play URL (https://play.google.com/store/apps/details?id=...). Android devices go here."New value: +"Where Android devices go: the app's Google Play page (https://play.google.com/store/apps/details?id=...) or a Google Play test link (https://play.google.com/apps/internaltest/... or /apps/testing/...)."
      • changedInput schema / properties / iosUrl / description
        Previous value: -"The app's App Store URL (https://apps.apple.com/...). iPhones and iPads go here."New value: +"Where iPhones and iPads go: the app's App Store page (https://apps.apple.com/.../id...) or, for a beta, its TestFlight link (https://testflight.apple.com/join/...)."
      • changedInput schema / properties / otherwise / description
        Previous value: -"The page every other device (such as a desktop) sees, always with a QR code of the link to scan with a phone: mobile_only says the link must be opened in a mobile browser; store_links lists both store URLs; store_badges shows the official App Store and Google Play badges under \"Click below to download {appName}\"."New value: +"The page every other device (such as a desktop) sees, always with a QR code of the link to scan with a phone: mobile_only says the link must be opened in a mobile browser; store_links lists both store URLs; store_badges shows the official App Store and Google Play badges under \"Click below to download {appName}\" and is only for apps published in both stores (use store_links or mobile_only for TestFlight and Google Play test links)."
    • Changedupdate_app_link3 fields changed
      • changedInput schema / properties / androidUrl / description
        Previous value: -"The app's Google Play URL (https://play.google.com/store/apps/details?id=...). Android devices go here."New value: +"Where Android devices go: the app's Google Play page (https://play.google.com/store/apps/details?id=...) or a Google Play test link (https://play.google.com/apps/internaltest/... or /apps/testing/...)."
      • changedInput schema / properties / iosUrl / description
        Previous value: -"The app's App Store URL (https://apps.apple.com/...). iPhones and iPads go here."New value: +"Where iPhones and iPads go: the app's App Store page (https://apps.apple.com/.../id...) or, for a beta, its TestFlight link (https://testflight.apple.com/join/...)."
      • changedInput schema / properties / otherwise / description
        Previous value: -"The page every other device (such as a desktop) sees, always with a QR code of the link to scan with a phone: mobile_only says the link must be opened in a mobile browser; store_links lists both store URLs; store_badges shows the official App Store and Google Play badges under \"Click below to download {appName}\"."New value: +"The page every other device (such as a desktop) sees, always with a QR code of the link to scan with a phone: mobile_only says the link must be opened in a mobile browser; store_links lists both store URLs; store_badges shows the official App Store and Google Play badges under \"Click below to download {appName}\" and is only for apps published in both stores (use store_links or mobile_only for TestFlight and Google Play test links)."
  2. 7 tool updates
    • Addedcreate_app_link
    • Changedget_url1 field changed
      • addedOutput schema / properties / appLink
        Added value: +{
        +  "description": "App links only: where iOS and Android go, and the page other devices see.",
        +  "properties": {
        +    "androidUrl": {
        +      "type": "string"
        +    },
        +    "appName": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iconUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iosUrl": {
        +      "type": "string"
        +    },
        +    "otherwise": {
        +      "enum": [
        +        "mobile_only",
        +        "store_links",
        +        "store_badges"
        +      ],
        +      "type": "string"
        +    },
        +    "qrCodeUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "iosUrl",
        +    "androidUrl",
        +    "otherwise"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_urls1 field changed
      • addedOutput schema / properties / links / items / properties / appLink
        Added value: +{
        +  "description": "App links only: where iOS and Android go, and the page other devices see.",
        +  "properties": {
        +    "androidUrl": {
        +      "type": "string"
        +    },
        +    "appName": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iconUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iosUrl": {
        +      "type": "string"
        +    },
        +    "otherwise": {
        +      "enum": [
        +        "mobile_only",
        +        "store_links",
        +        "store_badges"
        +      ],
        +      "type": "string"
        +    },
        +    "qrCodeUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "iosUrl",
        +    "androidUrl",
        +    "otherwise"
        +  ],
        +  "type": "object"
        +}
    • Changedreactivate_url1 field changed
      • addedOutput schema / properties / appLink
        Added value: +{
        +  "description": "App links only: where iOS and Android go, and the page other devices see.",
        +  "properties": {
        +    "androidUrl": {
        +      "type": "string"
        +    },
        +    "appName": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iconUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iosUrl": {
        +      "type": "string"
        +    },
        +    "otherwise": {
        +      "enum": [
        +        "mobile_only",
        +        "store_links",
        +        "store_badges"
        +      ],
        +      "type": "string"
        +    },
        +    "qrCodeUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "iosUrl",
        +    "androidUrl",
        +    "otherwise"
        +  ],
        +  "type": "object"
        +}
    • Changedshorten_url1 field changed
      • addedOutput schema / properties / appLink
        Added value: +{
        +  "description": "App links only: where iOS and Android go, and the page other devices see.",
        +  "properties": {
        +    "androidUrl": {
        +      "type": "string"
        +    },
        +    "appName": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iconUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iosUrl": {
        +      "type": "string"
        +    },
        +    "otherwise": {
        +      "enum": [
        +        "mobile_only",
        +        "store_links",
        +        "store_badges"
        +      ],
        +      "type": "string"
        +    },
        +    "qrCodeUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "iosUrl",
        +    "androidUrl",
        +    "otherwise"
        +  ],
        +  "type": "object"
        +}
    • Addedupdate_app_link
    • Changedupdate_url1 field changed
      • addedOutput schema / properties / appLink
        Added value: +{
        +  "description": "App links only: where iOS and Android go, and the page other devices see.",
        +  "properties": {
        +    "androidUrl": {
        +      "type": "string"
        +    },
        +    "appName": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iconUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "iosUrl": {
        +      "type": "string"
        +    },
        +    "otherwise": {
        +      "enum": [
        +        "mobile_only",
        +        "store_links",
        +        "store_badges"
        +      ],
        +      "type": "string"
        +    },
        +    "qrCodeUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "iosUrl",
        +    "androidUrl",
        +    "otherwise"
        +  ],
        +  "type": "object"
        +}
  3. 1 tool update
    • Addeddelete_url
  4. 1 tool update
    • Addedreactivate_url
  5. 7 tool updates
    • Changeddeactivate_url1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "active": {
        +      "type": "boolean"
        +    },
        +    "shortCode": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shortCode",
        +    "active"
        +  ],
        +  "type": "object"
        +}
    • Changedget_url1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "active": {
        +      "type": "boolean"
        +    },
        +    "clickCount": {
        +      "type": "integer"
        +    },
        +    "createdDate": {
        +      "description": "ISO-8601 instant.",
        +      "type": "string"
        +    },
        +    "expiresDate": {
        +      "description": "ISO-8601 instant; null when the link never expires.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "fallbackUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "isCustomCode": {
        +      "type": "boolean"
        +    },
        +    "originalUrl": {
        +      "type": "string"
        +    },
        +    "shortCode": {
        +      "type": "string"
        +    },
        +    "shortUrl": {
        +      "description": "Ready-to-share short link.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shortUrl",
        +    "shortCode",
        +    "originalUrl"
        +  ],
        +  "type": "object"
        +}
    • Changedget_url_stats1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "clicksByDay": {
        +      "items": {
        +        "properties": {
        +          "clicks": {
        +            "type": "integer"
        +          },
        +          "date": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "date",
        +          "clicks"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "deviceBreakdown": {
        +      "items": {
        +        "properties": {
        +          "device": {
        +            "type": "string"
        +          },
        +          "percentage": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "device",
        +          "percentage"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "historyDays": {
        +      "description": "Days of history in clicksByDay.",
        +      "type": "integer"
        +    },
        +    "shortCode": {
        +      "type": "string"
        +    },
        +    "topCountries": {
        +      "items": {
        +        "properties": {
        +          "count": {
        +            "type": "integer"
        +          },
        +          "country": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "country",
        +          "count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "topReferrers": {
        +      "items": {
        +        "properties": {
        +          "count": {
        +            "type": "integer"
        +          },
        +          "source": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "topRegions": {
        +      "items": {
        +        "properties": {
        +          "count": {
        +            "type": "integer"
        +          },
        +          "region": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "region",
        +          "count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "totalClicks": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "shortCode",
        +    "totalClicks",
        +    "historyDays",
        +    "clicksByDay"
        +  ],
        +  "type": "object"
        +}
    • Changedget_usage1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "maxLinkLifetimeDays": {
        +      "description": "null when links never expire.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "plan": {
        +      "type": "string"
        +    },
        +    "requestsPerMinute": {
        +      "type": "integer"
        +    },
        +    "totalClicks": {
        +      "type": "integer"
        +    },
        +    "totalUrls": {
        +      "type": "integer"
        +    },
        +    "urlsCreatedThisMonth": {
        +      "type": "integer"
        +    },
        +    "urlsMonthlyLimit": {
        +      "type": "integer"
        +    },
        +    "urlsRemaining": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "plan",
        +    "urlsCreatedThisMonth",
        +    "urlsMonthlyLimit",
        +    "urlsRemaining",
        +    "requestsPerMinute"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_urls1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hasMore": {
        +      "type": "boolean"
        +    },
        +    "limit": {
        +      "type": "integer"
        +    },
        +    "links": {
        +      "items": {
        +        "properties": {
        +          "active": {
        +            "type": "boolean"
        +          },
        +          "clickCount": {
        +            "type": "integer"
        +          },
        +          "createdDate": {
        +            "description": "ISO-8601 instant.",
        +            "type": "string"
        +          },
        +          "expiresDate": {
        +            "description": "ISO-8601 instant; null when the link never expires.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "fallbackUrl": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "isCustomCode": {
        +            "type": "boolean"
        +          },
        +          "originalUrl": {
        +            "type": "string"
        +          },
        +          "shortCode": {
        +            "type": "string"
        +          },
        +          "shortUrl": {
        +            "description": "Ready-to-share short link.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "shortUrl",
        +          "shortCode",
        +          "originalUrl"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page": {
        +      "type": "integer"
        +    },
        +    "total": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "links",
        +    "page",
        +    "limit",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
    • Changedshorten_url1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "active": {
        +      "type": "boolean"
        +    },
        +    "clickCount": {
        +      "type": "integer"
        +    },
        +    "createdDate": {
        +      "description": "ISO-8601 instant.",
        +      "type": "string"
        +    },
        +    "expiresDate": {
        +      "description": "ISO-8601 instant; null when the link never expires.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "fallbackUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "isCustomCode": {
        +      "type": "boolean"
        +    },
        +    "originalUrl": {
        +      "type": "string"
        +    },
        +    "shortCode": {
        +      "type": "string"
        +    },
        +    "shortUrl": {
        +      "description": "Ready-to-share short link.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shortUrl",
        +    "shortCode",
        +    "originalUrl"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_url1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "active": {
        +      "type": "boolean"
        +    },
        +    "clickCount": {
        +      "type": "integer"
        +    },
        +    "createdDate": {
        +      "description": "ISO-8601 instant.",
        +      "type": "string"
        +    },
        +    "expiresDate": {
        +      "description": "ISO-8601 instant; null when the link never expires.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "fallbackUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "isCustomCode": {
        +      "type": "boolean"
        +    },
        +    "originalUrl": {
        +      "type": "string"
        +    },
        +    "shortCode": {
        +      "type": "string"
        +    },
        +    "shortUrl": {
        +      "description": "Ready-to-share short link.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shortUrl",
        +    "shortCode",
        +    "originalUrl"
        +  ],
        +  "type": "object"
        +}
  6. 7 tool updates
    • First observeddeactivate_url
    • First observedget_url
    • First observedget_url_stats
    • First observedget_usage
    • First observedlist_urls
    • First observedshorten_url
    • First observedupdate_url

Publisher details

Operator
Core Dump Software LLC
Operator website
https://gajo.io
Vendor relationship
First-party
Trust center
Not available
Restrictions
Free Gajo account required (sign in with OAuth, no custom OAuth app needed). update_url, custom codes, and app deep links need the Pro plan; monthly link quotas depend on plan.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    User can create short urls, edit short urls, get click analytics, generate qr codes and much more.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Free URL shortener with a hosted MCP server. Create, update, and bulk-create short links with custom aliases and QR codes, and read click analytics (countries, cities, devices, browsers, referrers, UTM) from Claude, Cursor, or any MCP client. Unlimited links on the free plan; read-only and write scopes are assigned per API key.
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Affilio.link URL shortener — shorten affiliate links, get QR codes, powered by Affilio's affiliate link management platform.
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to create, update, organize, and delete short links; render styled QR codes; route visitors by device or country; and read click and scan statistics. Agents can also manage groups and custom domains while changing destinations without breaking printed QR codes or shared short URLs.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources