lihi
lihi v0.3.2
Short URLs and account tools
Competitor profile
Developer declarations; not independently tested. Listing last checked Nov 4, 2026. Package observed Nov 3, 2026.
Declared capabilities
- Interactive
- Write
Not specified in the available declarations: limitations, pricing & account requirements.
Onboarding example
Show my lihi account information
Description
From the marketplace listing
Connects once to the lihi OAuth MCP server for account status, group and domain switching, and automatic URL shortening while revising or preparing human-facing content.
Language: English · Automatically detected from descriptions.
Changes
No changes recorded yet. Follow this plugin to keep track of future changes.
First seen Oct 29, 2026. Last seen Nov 4, 2026.
Similar plugins
Find competitors to follow as you develop your plugin.
-
Create short and branded links, manage link performance, and draft, preview, and publish project showcase pages from ChatGPT and Codex.
Shared terms: short, urls, domain, oauth
-
URL Shortener by A.af helps users create secure short links, manage link status and destinations, generate QR codes, and inspect privacy-...
Shared terms: short, url, status
-
You.com skills for search, contents, research, finance, and integration discovery with MCP, ARD, API-key, OAuth, and MPP/x402 payment gui...
Shared terms: oauth, url, server, mcp
-
Connect ChatGPT to Eyivo Sites to inspect accessible websites and manage website content through Eyivo's authenticated MCP server.
Shared terms: oauth, server, mcp, content
-
Connect to Egnyte to find, read, and manage content through its MCP server.
Shared terms: server, mcp, content
Keywords
Files & skills
File archives
Skill instructions
lihi-account3.92 KB
---
name: lihi-account
description: Retrieve and summarize read-only lihi account information. Use for account status; account email; short URL usage, quota, plan, expiration, or renewal; the current lihi work group; the current short URL domain; or available work groups, including Chinese prompts containing「帳號資訊」、「帳號狀態」、「帳號 email」、「額度」、「訂閱」、「工作群組」或「短網址網域」. Use `account_status` for status and current selectors, and `group_options` only when available groups are requested. Do not switch selectors; use `lihi-switch-group` or `lihi-switch-domain`.
---
# lihi account information
Always render the brand name exactly as `lihi` in lowercase in every user-facing message and generated copy.
## Choose the minimum tools
- Call `account_status` with `{}` for general account information or status, account email, usage, quota, plan, expiration, renewal, the current work group, or the current short URL domain.
- Call `group_options` with `{}` only when the user asks which work groups are available or asks for the group list.
- Call both only when the request asks for account status or a current selector and also asks for available groups. Run the independent calls in parallel when the host permits.
Do not call unrelated lihi tools. Do not call `account_switch_group` or `account_switch_domain`; switching belongs to `lihi-switch-group` and `lihi-switch-domain`.
## Validate results
Prefer `structuredContent`; otherwise parse the JSON object in the first text content block. Treat a top-level JSON-RPC error or `result.isError: true` as failure.
Require `account_status` to contain:
- `email`: a non-empty string.
- `group_name`: a string or `null`.
- `domain`: a string or `null`.
- `short_urls.used`: a non-negative integer.
- `short_urls.quota`: a non-negative integer or `null`; `null` means unlimited.
- `plan.name`: a string.
- `plan.expires_on`: a `YYYY-MM-DD` string or `null`.
- `plan.next_renewal_on`: a `YYYY-MM-DD` string or `null`.
Require `group_options.groups` to be a non-empty array whose entries contain a positive-integer-or-null `id`, string-or-null `name`, and boolean `is_current`. Reject zero or negative IDs and reject the complete result unless exactly one entry is current. Treat `id` as identity and `name` only as a display label.
If authentication is missing, expired, or rejected, read [the OpenAI host OAuth recovery rules](references/oauth-recovery.md) completely before recovery, then retry only the interrupted lookup.
## Present the answer
Show only requested fields. For a general account-status request, show all six lines in this order:
1. `帳號 Email:<email>`.
2. `短網址用量:<used> / <quota>`; render `quota:null` as `短網址用量:<used> / 無上限`.
3. `目前方案:<plan>(到期日:<expires_on>)`; render `expires_on:null` as `目前方案:<plan>(無到期日)`.
4. `續訂日期:<next_renewal_on>`; render null as `續訂日期:-`.
5. `目前工作群組:<group_name>`; render null as `目前工作群組:我的群組`.
6. `目前短網址網域:<domain>`; render null as `目前短網址網域:未回傳可用網域`.
Preserve `email` and every non-null `group_name` and `domain` exactly. Treat `group_name:null` as the personal-group display label `我的群組`, but never infer a numeric group ID from it. Do not infer missing domain configuration, cancellation, or payment failure from another null value.
For `group_options`, render every non-null `name` byte-for-byte without suffixes or normalization. Synthesize a label only for a null name:
- `{id:null,name:null}`: `我的群組`.
- `{id:<integer>,name:null}`: `未命名工作群組(ID:<id>)`.
Keep duplicate non-null names as separate entries identified by ID. List non-current groups only when requested. If one of two requested lookups fails, present the validated section and clearly identify the unavailable section without inventing data.
Referenced files: 2 — file references are metadata, not package contents.
lihi-shorten4.27 KB
--- name: lihi-shorten description: Inspect human-facing outbound copy for HTTP(S) URLs while the assistant adjusts, rewrites, or polishes it, including 調整文案、潤飾文案、改寫文案、優化文案, or before the assistant sends, publishes, posts, uploads, schedules, or otherwise releases it, including 發送、發布、公開、貼文、寄出、上線、排程. Run local detection on the current content snapshot without waiting for final copy and automatically shorten every eligible new long URL through lihi. Never infer publication from copy-only work. Exclude source code, configuration, tests, logs, README or API documentation, changelogs, code comments, research, and link reading unless the user explicitly identifies human-facing outbound copy. --- # Detect and shorten URLs in outbound copy The lihi MCP connection may start OAuth when the plugin is installed or enabled. Authentication grants tool access; it does not authorize publication. Always render the brand name exactly as `lihi` in lowercase in every user-facing message and generated copy, including when the user uses another capitalization. ## Flow 1. For an external release, intercept before any external side effect. Do not wait for the requested copy adjustment to finish before detecting or creating short URLs. 2. Prepare the exact current human-visible content snapshot, including every currently available relevant field and every URL introduced by the assistant so far. It need not be final or stable. 3. Run the Python 3.8+ `scripts/detect_urls.py` from this skill directory through standard input or with a UTF-8 file path. Never interpolate untrusted content into a shell command. Detection is local and makes no lihi call. 4. Keep code exclusions. Use `--include-code` only when the user explicitly intends code URLs to be clickable outbound content. 5. If detection fails or JSON is invalid, make no lihi call and block external release. Copy-only output may be shown with an incomplete-check warning. 6. Explain rejected reasons without echoing credentials. Any `embedded_credentials` rejection blocks every lihi call and external release until the user supplies a safe URL; redact that destination from copy-only output. 7. Consult the cumulative confirmed-generated ledger for this conversation. Exclude and preserve every exact confirmed `short_url`. Automatically reuse a confirmed mapping when its exact `long_url` returns. Never treat an uncertain result as confirmed. 8. Build the current creation batch from the detector's first-seen unique URLs after removing confirmed short URLs and reusable long URLs. Duplicate occurrences share one result. The ledger is conversation-scoped: a new conversation has no cross-conversation lookup and the server will create a new short URL for the same long URL. 9. If there are no fresh creations, apply reusable mappings from greatest detector offset to smallest, show the current updated content snapshot, and state outside the content that no new short URLs were created when mappings were reused. For an explicitly requested external action, obtain confirmation of the exact complete final content before release. 10. When fresh creations remain, read [the lihi shortening workflow](references/shortening-workflow.md) completely before the first lihi tool call. Carry the exact content snapshot, detector JSON, ordered batch, external-action intent, confirmed ledger, and uncertain states. The workflow automatically calls `site_create` once per new long URL; it does not ask the user to choose URLs or a domain. 11. If lihi authentication is missing, expired, or rejected, read [the OpenAI host OAuth recovery rules](references/oauth-recovery.md) completely before recovery, then resume only within its retry budgets. 12. Whenever content or batch membership changes before dispatch, discard stale batch state, return to step 2, and issue a new batch disclosure. After a confirmed creation, preserve exact confirmed short URLs and mappings across later edits, then re-detect the edited snapshot and process only newly eligible long URLs. Re-detect again before external release. Keep final-content confirmation separate from automatic short-link creation. A copy-only request never implies publication. Never publish the workflow disclosure or current-batch mapping summary as part of the user's content.
Referenced files: 4 — file references are metadata, not package contents.
lihi-switch-domain5.2 KB
---
name: lihi-switch-domain
description: Switch the active lihi short URL domain. Use when the user explicitly asks to change, switch, or select the short URL domain, including「更換短網址網域」、「切換短網址網域」、「選擇 lihi 網域」. Also use for a new explicit request after shortening recommends a domain change. Do not trigger from a shortening error alone. Do not trigger for merely reading a URL. Always fetch `domain_options`, submit an exact returned hostname to `account_switch_domain`, and display its AccountStatus result without a follow-up lookup.
---
# Switch the lihi short URL domain
Always render the brand name exactly as `lihi` in lowercase in every user-facing message and generated copy.
## Flow
1. Call `domain_options` with `{}` and validate the complete fresh result.
2. Stable-sort owned before public, preserve order within type, and deduplicate exact case-sensitive hostnames.
3. Resolve an explicitly supplied exact hostname against this snapshot. Otherwise show the numbered options and dedicated-domain guidance, then wait for a valid selection. If the user says to cancel, stop without mutation.
4. Call `account_switch_domain` once with the selected exact hostname as `domain`.
5. On success, validate the returned AccountStatus and exact returned domain, display the status directly, and stop without a follow-up MCP call.
6. If discovery or mutation fails, successful output does not validate, or dispatch is uncertain, leave the normal flow and read [the switch error recovery rules](references/error-recovery.md) completely before taking another action.
## Fetch and validate options
Call `domain_options` with `{}` before every selection. Never switch from a remembered list.
Prefer `structuredContent`; otherwise parse the JSON object in the first text block. Require a non-empty `domains` array. Every entry must contain only the selection fields needed here:
- `hostname`: a non-empty string no longer than 253 characters.
- `type`: exactly `owned` or `public`.
Stable-sort owned entries before public entries while preserving server order within each type. Then deduplicate exact, case-sensitive hostnames and keep the first entry. This mirrors the server selector: duplicate rows are not separately addressable, and owned wins over public for the same hostname.
## Resolve the target
If the user already supplied a hostname, accept it only when it exactly matches one fresh option. Do not trim, lowercase, normalize, or derive an opaque value. Otherwise display the deduplicated options as one contiguous numbered list, label both hostname and type, and ask for one number or an exact hostname. If the user replies `取消`, stop without mutation; the fixed prompt intentionally does not advertise cancellation. Ask even when only one option remains because `domain_options` has no current marker.
For Chinese, map `owned` to `專屬網域 (owned)` and `public` to `公用網域 (public)`. Use this complete prompt whenever asking for a selection, including when every option is public:
```text
請選擇要使用的 lihi 網域:
1. <owned-hostname> — 專屬網域 (owned)
2. <public-hostname> — 公用網域 (public)
建議選擇專屬網域,有助於增加信任度。
請回覆選項編號(例如 1),也可以回覆網域名稱。
```
Render one numbered line per actual option. The two placeholder lines demonstrate both type labels; omit any type that is not present and keep numbering contiguous.
The guidance is workflow metadata: it does not select an option and must not be sent through URL shortening or included in unrelated outbound content.
Bind numbers only to this exact snapshot. Invalid, conflicting, or ambiguous input re-displays the same list. Any refresh or refetch invalidates old numbers.
## Switch and validate
Call `account_switch_domain` once with `{domain:<exact hostname>}`. Never send a display number, type, or removed `value` field.
Validate a successful response as AccountStatus:
- `email`: a non-empty string.
- `group_name`: a string or `null`.
- `domain`: a non-null string that exactly equals the submitted hostname. A null or mismatched value is invalid and enters error recovery as a possibly dispatched switch.
- `short_urls.used`: a non-negative integer; `short_urls.quota`: a non-negative integer or `null`.
- `plan.name`: a string; `plan.expires_on` and `plan.next_renewal_on`: `YYYY-MM-DD` strings or `null`.
A valid result commits the selector. Do not call `account_status`, `domain_options`, or another MCP tool to verify it. A same-hostname selection is idempotent; a changed hostname may revoke the current access token for the next lihi request.
Display the full returned status in this order:
1. `帳號 Email:<email>`.
2. `短網址用量:<used> / <quota>`; render `quota:null` as `短網址用量:<used> / 無上限`.
3. `目前方案:<plan>(到期日:<expires_on>)`; render `expires_on:null` as `目前方案:<plan>(無到期日)`.
4. `續訂日期:<next_renewal_on>`; render null as `續訂日期:-`.
5. `目前工作群組:<group_name>`; render null as `目前工作群組:我的群組`.
6. `目前短網址網域:<domain>`.
Preserve `email` and every non-null display value exactly, never infer a group ID from `group_name`.
Referenced files: 3 — file references are metadata, not package contents.
lihi-switch-group4.24 KB
---
name: lihi-switch-group
description: Switch the active lihi MCP work group. Use when the user asks to switch, change, select, or move to another lihi work group, including「切換 lihi 工作群組」、「切換工作群組」or「換到另一個群組」in a lihi context, and when another lihi workflow hands off a confirmed group-unavailable error. Always fetch `group_options`, submit only an exact returned ID to `account_switch_group`, and display its AccountStatus result without a follow-up lookup.
---
# Switch the lihi work group
Always render the brand name exactly as `lihi` in lowercase in every user-facing message and generated copy.
## Flow
1. Call `group_options` with `{}` and validate the complete fresh snapshot.
2. Stop without mutation when only one group exists or when the requested target is already current.
3. Resolve an explicitly named target against the fresh snapshot. Otherwise show the current group and numbered alternatives, then wait for one valid selection or cancellation.
4. Call `account_switch_group` once with the selected entry's exact `id` as `group_id`.
5. On success, validate and display the returned AccountStatus directly, then complete the group-switch operation without a follow-up MCP call. For a standalone request, stop; when domain-switch error recovery invoked this skill, return control to that caller after display.
6. If discovery or mutation fails, successful output does not validate, or dispatch is uncertain, leave the normal flow and read [the switch error recovery rules](references/error-recovery.md) completely before taking another action.
## Fetch and validate current choices
Call `group_options` with `{}` before every selection. Never switch from a remembered list.
Prefer `structuredContent`; otherwise parse the JSON object in the first text block. Require a non-empty `groups` array and exactly one current entry. Every entry must contain:
- `id`: `null` or an integer from `1` through `4294967295`.
- `name`: a string or `null`.
- `is_current`: a boolean.
Treat `id` as identity. Preserve every non-null `name` byte-for-byte. Render only null names as `{id:null}` → `我的群組` or `{id:<integer>}` → `未命名工作群組(ID:<id>)`. Keep duplicate names as distinct entries.
If there is exactly one entry, report `目前只有一個工作群組:<label>` and stop without mutation.
## Resolve the target
For multiple entries, exclude the current entry from the selectable list and preserve returned order. Resolve a user-supplied target only by exact ID, an exact unique non-null name, or `我的群組` matching the personal entry. If it is current, report that state and stop. Otherwise display current group plus a contiguous numbered list and ask for one number or `取消`; ask even when only one alternative exists.
Bind numbers only to this exact `group_options` snapshot. Invalid or ambiguous input re-displays the same list. Any refresh or new discovery invalidates every old number. A fresh target must resolve by ID, never by old number or display label.
## Switch and validate
Call `account_switch_group` once with `{group_id:<exact returned id>}`, preserving `null`. Never send a display number.
Validate a successful response as AccountStatus:
- `email`: a non-empty string.
- `group_name` and `domain`: string or `null`.
- `short_urls.used`: non-negative integer; `short_urls.quota`: non-negative integer or `null`.
- `plan.name`: string; `plan.expires_on` and `plan.next_renewal_on`: `YYYY-MM-DD` string or `null`.
A valid result commits the selector. Do not call `group_options`, `account_status`, or another MCP tool to verify it, and never infer an ID from `group_name`.
Display the full returned status in this order:
1. `帳號 Email:<email>`.
2. `短網址用量:<used> / <quota>`; render `quota:null` as `短網址用量:<used> / 無上限`.
3. `目前方案:<plan>(到期日:<expires_on>)`; render `expires_on:null` as `目前方案:<plan>(無到期日)`.
4. `續訂日期:<next_renewal_on>`; render null as `續訂日期:-`.
5. `目前工作群組:<group_name>`; render null as `目前工作群組:我的群組`.
6. `目前短網址網域:<domain>`; render null as `目前短網址網域:未回傳可用網域`.
Preserve `email` and every non-null display value exactly.
Referenced files: 3 — file references are metadata, not package contents.
Package details
Publisher declarations from the archived package. These are separate from our research and the live service's terms.
- Package author
- lihi
- Keywords
- See keywords
Declared capabilities
- Interactive
- Write
Package observed Nov 3, 2026.
Technical details
- First seen
- Oct 29, 2026 · 07:57 UTC
- Last seen
- Nov 4, 2026 · 06:00 UTC
- Collection status
- Collected
plugin_asdk_app_6acee694dba08191a4952548731e09a3
Download plugin data (JSON)