{"server":{"name":"xn--3ds443g.xn--s7y/duan-online","_meta":{"io.modelcontextprotocol.registry/publisher-provided":{"docs":"https://xn--s7y.xn--3ds443g/en/docs/mcp","llms":"https://xn--s7y.xn--3ds443g/llms.txt","slug":"duan-online","brand":"短.在线","stage":"beta","openapi":"https://xn--s7y.xn--3ds443g/openapi.json","auth_note":"Creating links requires a registered account (Bearer API key or OAuth). tools/list, resolve_short_url and begin_registration are public. Never paste permanent secrets into chat.","publisher":"Arasaka Oy","tools_live":["shorten_url","shorten_urls","get_link","resolve_short_url","create_qr","begin_registration"],"create_qr_note":"create_qr returns a scannable QR code (PNG by default, SVG on request) for a link the account owns, plus its qr_tracking_url. Returns the stored link's QR as PNG, or SVG when requested, with a short-lived image URL where available. The QR encodes qr_tracking_url. Where an image is not displayed, image_url (when present) or the short link reaches the same code.","openapi_version":"1.6.2","tools_feature_not_available":["get_links","get_link_analytics","update_link","disable_link"],"tools_feature_not_available_note":"Omitted from ordinary tools/list. Calls still return FEATURE_NOT_AVAILABLE."}},"title":"短.在线","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://xn--s7y.xn--3ds443g/mcp","type":"streamable-http","headers":[{"name":"Authorization","isSecret":true,"description":"Bearer API key or OAuth access token for account tools (shorten_url, shorten_urls, get_link, create_qr). tools/list, resolve_short_url and begin_registration do not need a token. Never paste permanent secrets into chat. See https://xn--s7y.xn--3ds443g/en/docs/mcp"}]}],"version":"1.6.5","websiteUrl":"https://xn--s7y.xn--3ds443g/en/docs/mcp","description":"Short links + QR codes for AI agents. Account required to create links via API or MCP. Public beta."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-10-17T17:24:24.360092Z","publishedAt":"2026-10-17T17:24:24.360092Z","statusChangedAt":"2026-10-17T17:24:24.360092Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://xn--s7y.xn--3ds443g/mcp","transport":"streamable-http","templated":false,"headers":[{"name":"Authorization","required":false,"secret":true,"value":null,"secret_names":["DUAN_ONLINE_TOKEN"]}],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2026-07-28"],"stateless":true},"health":{"reachable":true,"uptime_30d":1,"latency_ms_p50":1613,"consecutive_failures":0,"last_probe_at":"2026-10-19T10:18:55.416Z","last_ok_at":"2026-10-19T10:18:55.416Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"begin_registration","title":"Connect account · 浏览器注册入口（短.在线）","description":"客户端无法启动 OAuth 时的后备入口。返回浏览器注册链接。本工具不创建账号，不接收密码，也不代用户同意条款。 Fallback when the client cannot start OAuth. Returns a browser registration link. This tool does not create an account, accept a password, or accept terms for the user.","annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T10:18:55.416Z"},{"name":"create_qr","title":"QR image · 二维码图片（短.在线）","description":"为已有短链返回可扫描二维码。默认 PNG 512×512，并包含 image/png 图片块。仅当 format 为 svg 时返回 SVG，且不以 image 块返回。二维码中编码的是带有 ?s=qr 来源标记的短链接（使用 ASCII 域名），与 GET /v1/links/{id}/qr 返回的二维码内容一致。需要已注册账号，且必须是该链接的所有者。不新建短链，也不抓取目标地址。PNG 边长仅 256、512、1024，SVG 忽略边长。可能包含短期 image_url 及其到期时间；该链接不是 API 密钥、OAuth 令牌或会话。返回已存储短链的二维码：默认 PNG，请求时为 SVG；可用时附带短期 image_url。二维码编码的是 qr_tracking_url。未显示图片时，可使用 image_url（如有）或短链。 Return a scannable QR for an existing short link. Default PNG is 512×512 and includes an image/png image block. SVG is returned only when format is svg, and not as an image block. The matrix encodes the tracking URL with ?s=qr (ASCII host), the same payload as GET /v1/links/{id}/qr. A registered account that owns the link is required. Does not create a link and does not fetch the destination. PNG size is 256, 512, or 1024. SVG ignores size. A short-lived image_url and its expiry may be included. That URL is not an API key, an OAuth token, or a session. Returns the stored link's QR as PNG, or SVG when requested, with a short-lived image URL where available. The QR encodes qr_tracking_url. Where an image is not displayed, image_url (when present) or the short link reaches the same code.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T10:18:55.416Z"},{"name":"get_link","title":"Get link · 查询单条链接（短.在线）","description":"按 id 查询当前授权账号拥有的链接。需要已注册账号。无需账号的公开状态查询请使用 resolve_short_url。 Fetch one link by id, only a link owned by the signed-in account. A registered account is required. For a public status check, use resolve_short_url.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T10:18:55.416Z"},{"name":"resolve_short_url","title":"Inspect short link · 查询本站短链（短.在线）","description":"查询本站短码或本站短链的已保存状态；仅 active 时返回目标地址。无需账号。不查询其他短链服务；查询结果不是安全检测结论。 Look up a 短.在线 code or short URL and return its saved state. The destination is returned only when active. No account required. Does not look up other shorteners. The result is not a security verdict.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T10:18:55.416Z"},{"name":"shorten_url","title":"Shorten URL · 缩短链接（短.在线）","description":"为 HTTP 或 HTTPS 目标地址创建一条短链。需要已注册账号。返回链接状态；状态为 active 时，同时返回 Unicode 显示地址和 ASCII 地址。创建两条或更多短链时使用 shorten_urls。重试同一操作时，必须复用相同的 idempotency_key。 Create one HTTP or HTTPS short link. A registered account is required. Returns the state, and when active, the Unicode display URL and the ASCII URL. For two or more, use shorten_urls. A retry of the same operation must reuse the same idempotency_key.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T10:18:55.416Z"},{"name":"shorten_urls","title":"Batch shorten · 批量短链（短.在线）","description":"一次同步创建 1 到 100 条短链。按 client_ref 对应结果，允许部分成功。需要已注册账号。批量重试只有三种情况，不要混用。示例：key 为 batch-1，两项 client_ref 分别为 notes（https://example.com/notes）和 draft（https://example.com/draft）。notes 成功，draft 的 retryable 为 true。(1) 传输结果不确定（没有拿到已完成的响应、IDEMPOTENCY_IN_PROGRESS、幂等锁不可用，或因瞬时数据库错误且一条都未创建而返回 503）：用同一个 key 原样重发整批。已完成的批次返回已保存的结果，notes 不会再次创建。key 已被释放时，同一批会重新执行。(2) 已完成且某项 retryable 为 true：重放 batch-1 只返回已保存的结果，不会重试 draft。只用新 key（例如 batch-1-draft）发送 draft，并保留 client_ref draft，不要带上 notes。去掉 notes 后仍用 batch-1 会返回 IDEMPOTENCY_CONFLICT。(3) 校验错误：改正请求，不要把同一份无效请求当作网络重试。key 尚未保存的 400（重复 client_ref、缺少 items、BATCH_TOO_LARGE）改正后可以继续用同一个 key。已完成且 retryable 为 false 的项已保存；修改请求体后继续使用原 key，会返回 IDEMPOTENCY_CONFLICT，改正后的项必须用新 key。 Create 1 to 100 short links in one synchronous request. Match each result by client_ref. Partial success is allowed. A registered account is required. Batch retry has three cases; do not mix them. Worked example: key batch-1 with client_ref notes (https://example.com/notes) and draft (https://example.com/draft). notes succeeds and draft is retryable true. (1) Uncertain transport outcome — no completed body, IDEMPOTENCY_IN_PROGRESS, an unavailable idempotency lock, or 503 because a transient database error created nothing: resend the entire unchanged batch with the same key. A completed batch returns the stored result and notes is not created again. A released key runs that same batch again. (2) Completed batch with retryable true: replaying batch-1 returns the stored body and does not retry draft. Send only draft, keeping client_ref draft, under a new key such as batch-1-draft. Do not include notes. Dropping notes and reusing batch-1 returns IDEMPOTENCY_CONFLICT. (3) Validation error: fix the request. Do not resend the same invalid body as a network retry. A 400 before the key is stored (duplicate client_ref, missing items, BATCH_TOO_LARGE) may reuse the key after the body is corrected. A completed item with retryable false is stored; a changed body on that key returns IDEMPOTENCY_CONFLICT, so send the corrected item with a new key.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T10:18:55.416Z"}],"dev.protogrid/trust":{"score":83,"components":{"hygiene":80,"liveness":100,"freshness":100,"provenance":55},"drivers":["+dns-namespace","+website","+reachable","+uptime-100%","+updated-2d-ago","-no-repository"],"flags":["no-repository"],"blocked":false,"computed_at":"2026-10-19T13:43:43.225Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":76,"label":"good","components":{"auth":null,"hygiene":93,"protocol":88,"stability":25,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"supports 2026-07-28 (server/discover)","status":"pass","category":"protocol"},{"id":"protocol.stateless","detail":"answers without a session","status":"pass","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"tools/list declares ttlMs 0, so clients re-fetch it on every use","status":"warn","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"2 tools have descriptions over 1,024 characters, which crowds the context","status":"warn","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"6 of 6 tools declare readOnlyHint or destructiveHint","status":"pass","category":"hygiene"},{"id":"tools.directory_hints","detail":"every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint","status":"pass","category":"hygiene"},{"id":"tools.token_cost","detail":"about 2,512 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"39 tool changes in 30 days","status":"warn","category":"stability"},{"id":"stability.rug_pull","detail":"7 tools kept their name but changed most of their description in 30 days; review before trusting them","status":"fail","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-stability.rug_pull","~protocol.list_ttl","~tools.description_length","~stability.changes"],"flags":[],"tool_count":6,"token_estimate":2512,"tools_hash":"bf96867c6c353c780697aef8b2ab4ca4","tools_changed_at":"2026-10-17T17:39:26.992Z","computed_at":"2026-10-19T13:37:25.213Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"xn--3ds443g.xn--s7y/duan-online","aliases":[],"alias_count":0,"repository_key":null,"owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/xn--3ds443g.xn--s7y%2Fduan-online/tools","arguments":{"name":"xn--3ds443g.xn--s7y/duan-online"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/xn--3ds443g.xn--s7y%2Fduan-online/connection?target=mcpServers","arguments":{"name":"xn--3ds443g.xn--s7y/duan-online","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}