Put It Online
Server Details
Publish AI-made web pages and share files as short links from any MCP client.
- Status
- Healthy
- Uptime
- 99.9% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- kitsunde/putit-mcp
- GitHub Stars
- 0
TDQS
Scored across 10 tools
Each tool targets a distinct action or resource, with clear separation between upload_file, publish_site, and create_upload_session. The only mild overlap is that upload_file can also produce a website from .html or .zip, but descriptions clarify the intended use cases.
Most tools follow a consistent verb_noun pattern (e.g., create_upload_session, delete_link, get_account, list_links, make_permanent, publish_site, set_password, upload_file). The single verb 'extend' is a minor deviation, but overall naming is predictable.
10 tools is well-scoped for a file/link hosting service, covering upload, management, account, and settings without redundancy. Each tool earns its place by addressing a specific need.
The surface covers core CRUD and lifecycle operations: creating links (upload_file, create_upload_session, publish_site), reading (get_link, list_links), deleting (delete_link), and updating (set_password, extend, make_permanent). Minor gaps exist, such as renaming or editing link metadata, but core workflows are fully supported.
Available Tools
10 toolscreate_upload_sessionGet an upload URL for a large fileAInspect
For files too large to send inline: reserves a link and returns a one-time upload_url. PUT the raw bytes there (e.g. give the user the returned curl command), then poll get_link with the slug (and manage_token) until status is "live".
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Custom link name (3-40 letters, digits, dashes); available on plans with custom names. | |
| filename | Yes | Name of the file that will be uploaded, including extension. | |
| password | No | Visitors must enter this password to open the link; available on plans with password protection. | |
| size_bytes | No | Expected size, checked against your plan limit up front. |
Output Schema
| Name | Required | Description |
|---|---|---|
| curl | Yes | Ready-to-run command for the user. |
| link | Yes | |
| method | Yes | |
| headers | Yes | |
| max_bytes | Yes | |
| expires_at | Yes | |
| upload_url | Yes | One-time URL: PUT the raw file bytes here (no auth header needed). |
| complete_url | No | When present: POST here (no body) after the PUT finishes. The curl command already does it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the coarse safety profile (readOnlyHint=false, idempotentHint=false, openWorldHint=true). The description adds the operationally critical traits: the URL is one-time, the bytes go via PUT at that URL, and completion must be confirmed by polling for status 'live'. This is exactly the extra context the annotations cannot supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the scoping condition, then the create→PUT→poll flow in order. No filler sentences; the parenthetical curl hint is genuinely actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is unnecessary, and the description covers the full lifecycle an agent must drive: reserve, upload, poll. Nothing needed to invoke and follow through is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so slug, filename, password and size_bytes are already documented inline. The description only references slug and manage_token (the latter not even an input parameter) in the polling step, adding workflow context but no new parameter meaning. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (reserves a link, returns a one-time upload_url) and scopes it precisely to 'files too large to send inline', which implicitly separates it from the inline sibling upload_file. An agent can identify the job 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use it ('too large to send inline') and an explicit post-call workflow: PUT bytes, then poll get_link with slug/manage_token until status is 'live'. It stops short of naming upload_file as the small-file alternative, so the exclusion 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.
delete_linkDelete a linkADestructiveIdempotentInspect
Permanently delete a link and its files. Account owners can delete their links; anonymous callers need the manage_token. This cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The link name, e.g. "k3x9pq" (a full https://putit.online/<name> URL also works). | |
| manage_token | No | Secret manage token returned when the link was created (lets anonymous callers manage it). |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds material context beyond them: the cascade to associated files, the irreversibility ('cannot be undone'), and the permission/manage_token model. It does not mention rate limits or error behavior, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the destructive action and its scope, then authorization, then irreversibility. No filler and nothing repeated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile. The description supplies the remaining essentials an agent needs: scope (link plus files), authorization path, and irreversibility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both slug and manage_token are already documented with format examples in the schema. The description reinforces why manage_token exists (anonymous callers) but adds no syntax or format detail beyond the schema, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete), resource (link), scope of effect (and its files), and permanence. No sibling tool performs deletion, so an agent can distinguish it from get_link/list_links/make_permanent without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the authorization context that governs use: account owners can delete their links, anonymous callers must supply the manage_token. There is no competing delete tool to route against, so no alternative is named, but the conditions for legitimate use are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extendExtend a linkAInspect
Restart an expiring link's expiry clock (also brings back a recently expired link). Permanent links are unaffected. Requires a connected account whose plan includes extending.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The link name, e.g. "k3x9pq" (a full https://putit.online/<name> URL also works). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The public link to share. |
| kind | Yes | html | site | file | bundle | pending |
| slug | Yes | |
| title | Yes | |
| views | Yes | View count; null when the link's account plan has no view counts, or the link has no account. |
| status | Yes | checking = not live yet (poll get_link); live = shareable; unpublished = not published; publishing = will be live soon (poll get_link); in_review = not available right now; removed = removed by moderation (see removed_reason, appeal_url). |
| permanent | Yes | |
| appeal_url | No | Only with status removed: mailto link to appeal to abuse@putit.online. |
| created_at | Yes | |
| expires_at | Yes | ISO time the link stops working; null for permanent links. |
| file_count | Yes | |
| manage_url | No | Private page to manage/delete the link. Only returned on creation; keep it secret. |
| size_bytes | Yes | |
| content_url | No | Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works. |
| checkout_url | No | Only with status unpublished: the page where the uploader can publish this link. |
| manage_token | No | Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead. |
| removed_reason | No | Only with status removed: why, in plain words. |
| status_message | Yes | |
| removed_category | No | Only with status removed: the moderation category (malware, phishing, explicit, …); null when not disclosed. |
| password_protected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent mutation, so the bar is lower; the description adds real value by explaining what happens (expiry clock restarts, expired links return) and what is untouched (permanent links), plus a plan-level prerequisite. It omits rate-limit or repeated-call behavior, but covers the mutation's effect well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the effect, then the eligibility constraint. Each sentence carries distinct information with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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. The description covers the action, its effect on expired vs permanent links, and the account/plan prerequisite — everything needed to invoke an annotated mutation correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100% with an example format ('k3x9pq' or a full URL). The description adds no syntax or format detail 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('extend', "link's expiry clock") and clarifies scope: it applies to expiring/recently expired links only. The note that 'Permanent links are unaffected' implicitly separates it from the sibling make_permanent, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('Requires a connected account whose plan includes extending') and an exclusion ('Permanent links are unaffected'), which tells the agent when this tool is not the right choice. It does not explicitly name make_permanent as the alternative for permanent links, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountGet my planBRead-onlyIdempotentInspect
The connected account's plan, permanent-link slots used/available, size limit and features.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | |
| Yes | ||
| features | Yes | |
| plan_name | Yes | |
| subscribed | Yes | |
| total_links | Yes | |
| upgrade_url | Yes | |
| dashboard_url | Yes | |
| free_link_days | Yes | |
| permanent_links | Yes | |
| max_upload_bytes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, covering the safety profile. The description adds no behavioral context beyond that — no auth/permission requirements, no freshness or caching behavior, no note on latency. What it does add (the returned fields) duplicates the existing output schema, so it earns little credit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded noun phrase with no filler. It is a sentence fragment rather than a complete sentence, which slightly weakens it, but every word carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and with no parameters and read-only annotations there is little else an agent requires. The only remaining gap is the absence of any usage context, which is minor for a parameterless account-info call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 disambiguate; the baseline for a parameterless tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely ("the connected account's plan") and enumerates the returned data points (slots used/available, size limit, features), so an agent can tell it apart from link-management siblings. The verb is implicit rather than stated, but the title plus read-only annotations make the retrieval operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the content — an agent would call this when it needs account-level limits or feature availability. There is no explicit when-to-use statement, no mention of prerequisites, and no pointer to any sibling tool, so it stops short of real guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_linkGet link statusARead-onlyIdempotentInspect
Status of a link: live, checking, publishing, unpublished, in_review, removed (by moderation: removed_reason + appeal_url), expired or awaiting_upload; plus expiry, size and views (null when the account’s plan has no view counts). Anonymous callers pass the manage_token they got on creation.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The link name, e.g. "k3x9pq" (a full https://putit.online/<name> URL also works). | |
| manage_token | No | Secret manage token returned when the link was created (lets anonymous callers manage it). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The public link to share. |
| kind | Yes | html | site | file | bundle | pending |
| slug | Yes | |
| title | Yes | |
| views | Yes | View count; null when the link's account plan has no view counts, or the link has no account. |
| status | Yes | checking = not live yet (poll get_link); live = shareable; unpublished = not published; publishing = will be live soon (poll get_link); in_review = not available right now; removed = removed by moderation (see removed_reason, appeal_url). |
| permanent | Yes | |
| appeal_url | No | Only with status removed: mailto link to appeal to abuse@putit.online. |
| created_at | Yes | |
| expires_at | Yes | ISO time the link stops working; null for permanent links. |
| file_count | Yes | |
| manage_url | No | Private page to manage/delete the link. Only returned on creation; keep it secret. |
| size_bytes | Yes | |
| content_url | No | Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works. |
| checkout_url | No | Only with status unpublished: the page where the uploader can publish this link. |
| manage_token | No | Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead. |
| removed_reason | No | Only with status removed: why, in plain words. |
| status_message | Yes | |
| removed_category | No | Only with status removed: the moderation category (malware, phishing, explicit, …); null when not disclosed. |
| password_protected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and closed-world behavior, so the safety profile is covered. The description adds real context: views are null when the account plan has no view counts, removed links carry removed_reason and appeal_url, and anonymous callers need the manage_token. It stops short of describing pagination or output shape, which is acceptable here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the status enumeration and appends the secondary facts about moderation, views and tokens. No filler, though the packed clause list makes it slightly hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not define return values, yet it usefully previews the status set and the null-views edge case. Combined with the auth note for anonymous callers, an agent has everything required to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description adds only the context that manage_token comes from creation and is used by anonymous callers, echoing what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (link status) and enumerates the concrete status values returned, so the agent knows exactly what it retrieves. It does not explicitly contrast itself with siblings such as list_links or delete_link, which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is for checking one link's state, and it notes that anonymous callers must supply the manage_token they got at creation. There is no explicit when-to-use/when-not or routing to an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_linksList my linksARead-onlyIdempotentInspect
List the links in the connected Put It Online account (newest first, permanent first). Requires a connected account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | Yes | |
| total | Yes | |
| next_offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered; the description adds genuinely new behavior (newest-first, permanent-first ordering) plus an auth precondition. It still says nothing about result size limits or pagination behavior, which is a modest gap rather than a serious one.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence in two clauses: what it returns with its ordering, then the precondition. Nothing is padding and the key scoping facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 ordering/precondition are stated. However, for a paginated list tool whose two paging parameters have zero schema documentation, the description leaves the practical mechanics of retrieval unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, so limit and offset are completely undocumented in the schema, and the description does not mention paging, defaults, or the 200 cap at all. The ordering sentence does not map onto either parameter, leaving an agent to guess how to page through results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('List the links') scoped to the connected Put It Online account, which cleanly separates it from get_link (singular) and delete_link. It does not explicitly name any sibling, so it falls short of a 5 despite the plural framing doing useful disambiguation work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the precondition 'Requires a connected account' and the ordering contract, which implies when the tool is usable, but it never says when to prefer this over alternatives (e.g. get_link for a single link) or whether the list is paginated/filterable. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_permanentKeep a link online permanentlyAIdempotentInspect
Turn an expiring link into a permanent one (uses one of the plan's permanent slots; see get_account). Requires a connected account whose plan includes permanent links.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The link name, e.g. "k3x9pq" (a full https://putit.online/<name> URL also works). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The public link to share. |
| kind | Yes | html | site | file | bundle | pending |
| slug | Yes | |
| title | Yes | |
| views | Yes | View count; null when the link's account plan has no view counts, or the link has no account. |
| status | Yes | checking = not live yet (poll get_link); live = shareable; unpublished = not published; publishing = will be live soon (poll get_link); in_review = not available right now; removed = removed by moderation (see removed_reason, appeal_url). |
| permanent | Yes | |
| appeal_url | No | Only with status removed: mailto link to appeal to abuse@putit.online. |
| created_at | Yes | |
| expires_at | Yes | ISO time the link stops working; null for permanent links. |
| file_count | Yes | |
| manage_url | No | Private page to manage/delete the link. Only returned on creation; keep it secret. |
| size_bytes | Yes | |
| content_url | No | Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works. |
| checkout_url | No | Only with status unpublished: the page where the uploader can publish this link. |
| manage_token | No | Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead. |
| removed_reason | No | Only with status removed: why, in plain words. |
| status_message | Yes | |
| removed_category | No | Only with status removed: the moderation category (malware, phishing, explicit, …); null when not disclosed. |
| password_protected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/idempotency/destructive profile, and the description adds two things they don't: the operation consumes one of the plan's finite permanent slots (a quota side effect) and it requires an eligible connected account. It still doesn't say what happens when slots are exhausted or whether the action is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences that front-load the action and then the resource prerequisite; the cross-reference to get_account is inline and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one well-documented parameter, a rich annotation set, an output schema, and an explicit account/plan precondition, the description is nearly self-sufficient. Only the edge case of slot exhaustion is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single slug parameter, so the schema already documents format and accepted URL/name forms. The description adds no additional meaning about the parameter, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Turn an expiring link into a permanent one.' An agent can tell this is a one-way conversion rather than the time-window tweak implied by the sibling 'extend', though the description never names that sibling to make the contrast explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions (requires a connected account whose plan includes permanent links) and points to get_account for checking slot availability. It does not state when to prefer this over extend or what to do if no slots remain, so exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_sitePublish a web page or siteAInspect
Put a web page or small static site you created online instantly. Pass {"files": {"index.html": "…", "style.css": "…", "app.js": "…"}} (paths relative to the site root; index.html required). Images can go in base64_files. Returns the public URL. Pages are served sandboxed on their own link.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Custom link name (3-40 letters, digits, dashes); available on plans with custom names. | |
| files | Yes | Map of path -> text content, e.g. {"index.html": "<!doctype html>…", "style.css": "body{…}"}. Must include index.html. | |
| title | No | Name for the site (shown in the dashboard). | |
| password | No | Visitors must enter this password to open the link; available on plans with password protection. | |
| base64_files | No | Optional map of path -> base64 content for binary assets such as images. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The public link to share. |
| kind | Yes | html | site | file | bundle | pending |
| slug | Yes | |
| title | Yes | |
| views | Yes | View count; null when the link's account plan has no view counts, or the link has no account. |
| status | Yes | checking = not live yet (poll get_link); live = shareable; unpublished = not published; publishing = will be live soon (poll get_link); in_review = not available right now; removed = removed by moderation (see removed_reason, appeal_url). |
| permanent | Yes | |
| appeal_url | No | Only with status removed: mailto link to appeal to abuse@putit.online. |
| created_at | Yes | |
| expires_at | Yes | ISO time the link stops working; null for permanent links. |
| file_count | Yes | |
| manage_url | No | Private page to manage/delete the link. Only returned on creation; keep it secret. |
| size_bytes | Yes | |
| content_url | No | Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works. |
| checkout_url | No | Only with status unpublished: the page where the uploader can publish this link. |
| manage_token | No | Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead. |
| removed_reason | No | Only with status removed: why, in plain words. |
| status_message | Yes | |
| removed_category | No | Only with status removed: the moderation category (malware, phishing, explicit, …); null when not disclosed. |
| password_protected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring the write/non-destructive/open-world profile, the description adds useful behavioral details: pages are served sandboxed on their own link, the public URL is returned, and index.html is required. It still omits auth needs, rate limits, and what happens on republish, but the added context is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, and every sentence earns its place by covering the required file structure, binary assets, return value, and serving behavior. It is appropriately sized with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema (100% coverage), annotations, and an output schema, the description covers the essential call behavior: what it does, required index.html, optional base64 files, and where the content is served. It does not address optional parameters like slug, title, or password, but those are fully documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 five parameters thoroughly. The description repeats the files example and says images can go in base64_files, but adds no syntax or format details beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Put ... online instantly') and resource ('a web page or small static site you created'). It does not distinguish this tool from siblings like upload_file or create_upload_session, so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have a page or site you created, but provides no explicit when-to-use conditions, prerequisites, or alternatives. No guidance on when to choose this over upload_file or create_upload_session is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_passwordSet or remove a link passwordAIdempotentInspect
Protect a link with a password (visitors must enter it), or pass null to remove it. Requires a connected account whose plan includes passwords; otherwise returns a subscription_required error.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The link name, e.g. "k3x9pq" (a full https://putit.online/<name> URL also works). | |
| password | Yes | New password, or null to remove protection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The public link to share. |
| kind | Yes | html | site | file | bundle | pending |
| slug | Yes | |
| title | Yes | |
| views | Yes | View count; null when the link's account plan has no view counts, or the link has no account. |
| status | Yes | checking = not live yet (poll get_link); live = shareable; unpublished = not published; publishing = will be live soon (poll get_link); in_review = not available right now; removed = removed by moderation (see removed_reason, appeal_url). |
| permanent | Yes | |
| appeal_url | No | Only with status removed: mailto link to appeal to abuse@putit.online. |
| created_at | Yes | |
| expires_at | Yes | ISO time the link stops working; null for permanent links. |
| file_count | Yes | |
| manage_url | No | Private page to manage/delete the link. Only returned on creation; keep it secret. |
| size_bytes | Yes | |
| content_url | No | Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works. |
| checkout_url | No | Only with status unpublished: the page where the uploader can publish this link. |
| manage_token | No | Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead. |
| removed_reason | No | Only with status removed: why, in plain words. |
| status_message | Yes | |
| removed_category | No | Only with status removed: the moderation category (malware, phishing, explicit, …); null when not disclosed. |
| password_protected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the mutation profile (readOnlyHint false, idempotentHint true, destructiveHint false). The description adds value beyond them by disclosing the subscription_required error path and the semantics of null as removal rather than clearing a value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences; the set/remove duality is front-loaded and the prerequisite follows, with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explained, and the description still covers both operation modes, the plan prerequisite, and the failure error. Nothing needed to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the null-to-remove behavior already documented in the schema and adds no length or format detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (protect/set) and resource (link password) plus the dual mode: set a password or pass null to remove it. This is clearly distinguishable from siblings like delete_link or make_permanent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for both use modes (protect vs. remove via null) and a prerequisite (plan must include passwords, else subscription_required). It does not name an alternative tool, but for this unique operation none exists among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileUpload a fileAInspect
Put a file online and get a short public link. Pass text directly, or base64 with encoding="base64" for binary files (images, PDFs, zips). An .html file becomes a web page; a .zip containing index.html becomes a website. Returns the URL, expires_at and a manage_token (shown once; anonymous callers need it to check or delete the link). Status may be "checking"/"publishing" (call get_link before sharing) or "unpublished" (not published). Limit 20 MB inline; use create_upload_session for bigger files.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Custom link name (3-40 letters, digits, dashes); available on plans with custom names. | |
| content | Yes | File content: plain text, or base64 when encoding is "base64" (use base64 for any binary file). | |
| encoding | No | How `content` is encoded. | text |
| filename | Yes | File name including extension, e.g. "report.pdf" or "index.html". The extension decides how the link renders. | |
| password | No | Visitors must enter this password to open the link; available on plans with password protection. | |
| mime_type | No | Optional MIME type; used to add a missing file extension. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The public link to share. |
| kind | Yes | html | site | file | bundle | pending |
| slug | Yes | |
| title | Yes | |
| views | Yes | View count; null when the link's account plan has no view counts, or the link has no account. |
| status | Yes | checking = not live yet (poll get_link); live = shareable; unpublished = not published; publishing = will be live soon (poll get_link); in_review = not available right now; removed = removed by moderation (see removed_reason, appeal_url). |
| permanent | Yes | |
| appeal_url | No | Only with status removed: mailto link to appeal to abuse@putit.online. |
| created_at | Yes | |
| expires_at | Yes | ISO time the link stops working; null for permanent links. |
| file_count | Yes | |
| manage_url | No | Private page to manage/delete the link. Only returned on creation; keep it secret. |
| size_bytes | Yes | |
| content_url | No | Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works. |
| checkout_url | No | Only with status unpublished: the page where the uploader can publish this link. |
| manage_token | No | Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead. |
| removed_reason | No | Only with status removed: why, in plain words. |
| status_message | Yes | |
| removed_category | No | Only with status removed: the moderation category (malware, phishing, explicit, …); null when not disclosed. |
| password_protected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-idempotent, non-destructive write; the description goes well beyond them by disclosing the 20 MB inline limit, the one-time manage_token, the possible "checking"/"publishing"/"unpublished" statuses, and the returned fields. This is exactly the behavioral context an agent needs before calling a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and link result, then layered with encoding, rendering, return value, status, and size limit in a dense but waste-free sequence. Every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description helpfully names the key returns (URL, expires_at, manage_token) and covers limits, status handling, and the sibling for large files. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description still adds real meaning beyond it: base64 for binary files, and the rendering semantics of filename extensions (.html becomes a web page, .zip with index.html becomes a website), plus the inline size ceiling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Put a file online and get a short public link" states a specific verb and resource, and the description distinguishes this from create_upload_session (bigger files) and get_link (status checks). An agent can tell it apart from its siblings without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use create_upload_session for files above 20 MB, and call get_link when status is "checking"/"publishing". It also notes the manage_token requirement for anonymous callers to check or delete. When-to-use and when-to-use-something-else are both present.
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.
8 tool updates
- Changed
create_upload_session1 field changed- changed
Output schema / properties / link / properties / manage_token / descriptionPrevious value: -"Secret token for get_link/delete_link without an account. Only returned on creation."New value: +"Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead."
- Changed
extend1 field changed- changed
Output schema / properties / manage_token / descriptionPrevious value: -"Secret token for get_link/delete_link without an account. Only returned on creation."New value: +"Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead."
- Changed
get_link1 field changed- changed
Output schema / properties / manage_token / descriptionPrevious value: -"Secret token for get_link/delete_link without an account. Only returned on creation."New value: +"Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead."
- Changed
list_links1 field changed- changed
Output schema / properties / links / items / properties / manage_token / descriptionPrevious value: -"Secret token for get_link/delete_link without an account. Only returned on creation."New value: +"Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead."
- Changed
make_permanent1 field changed- changed
Output schema / properties / manage_token / descriptionPrevious value: -"Secret token for get_link/delete_link without an account. Only returned on creation."New value: +"Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead."
- Changed
publish_site1 field changed- changed
Output schema / properties / manage_token / descriptionPrevious value: -"Secret token for get_link/delete_link without an account. Only returned on creation."New value: +"Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead."
- Changed
set_password1 field changed- changed
Output schema / properties / manage_token / descriptionPrevious value: -"Secret token for get_link/delete_link without an account. Only returned on creation."New value: +"Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead."
- Changed
upload_file1 field changed- changed
Output schema / properties / manage_token / descriptionPrevious value: -"Secret token for get_link/delete_link without an account. Only returned on creation."New value: +"Secret token returned on creation for every new link (keep it secret). Anonymous callers pass it to get_link/delete_link; a link in an account is managed by that account instead."
8 tool updates
- Changed
create_upload_session1 field changed- added
Output schema / properties / link / properties / content_urlAdded value: +{ + "description": "Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works.", + "type": "string" +}
- Changed
extend1 field changed- added
Output schema / properties / content_urlAdded value: +{ + "description": "Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works.", + "type": "string" +}
- Changed
get_link1 field changed- added
Output schema / properties / content_urlAdded value: +{ + "description": "Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works.", + "type": "string" +}
- Changed
list_links1 field changed- added
Output schema / properties / links / items / properties / content_urlAdded value: +{ + "description": "Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works.", + "type": "string" +}
- Changed
make_permanent1 field changed- added
Output schema / properties / content_urlAdded value: +{ + "description": "Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works.", + "type": "string" +}
- Changed
publish_site1 field changed- added
Output schema / properties / content_urlAdded value: +{ + "description": "Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works.", + "type": "string" +}
- Changed
set_password1 field changed- added
Output schema / properties / content_urlAdded value: +{ + "description": "Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works.", + "type": "string" +}
- Changed
upload_file1 field changed- added
Output schema / properties / content_urlAdded value: +{ + "description": "Only when live, for sites and single files: where the content itself is served (https://<slug>.putitcdn.com/…). Share `url` instead; it always works.", + "type": "string" +}
10 tool updates
- First observed
create_upload_session - First observed
delete_link - First observed
extend - First observed
get_account - First observed
get_link - First observed
list_links - First observed
make_permanent - First observed
publish_site - First observed
set_password - First observed
upload_file
Related MCP Connectors
Publish AI-generated HTML & Markdown to a hosted, shareable URL via MCP.
Publish HTML, Markdown, and multi-file sites as shareable URLs instantly via MCP.
Publish and share access-controlled Markdown documents from any MCP-enabled AI tool.
Publish HTML, files, or a URL to a permanent public URL, then update it — from any MCP agent.
Related MCP Servers
AlicenseAqualityAmaintenancePublish content (HTML, files, or URLs) and get a permanent public URL from any MCP-compatible agent, with local and remote connection options.29244 npmMIT- AlicenseNot gradedqualityBmaintenanceEnables AI agents to publish live, stateful HTML pages over MCP, providing shareable URLs, per-viewer data, and version history.MIT
- AlicenseNot gradedqualityAmaintenanceEnables coding agents to publish HTML pages and small sites over MCP, returning a stable link and keeping every version, with access limited to specific people, an organization, or anyone with the link.1AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceEnables AI chat clients to publish markdown content to an mdshare service and retrieve previously published pastes via MCP tools, without manual file uploads or curl requests.69 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.