line-desktop-mcp
Automates LINE Desktop using your logged-in LINE Chrome Extension, providing tools to check login status, list chat rooms, read messages, view unread digests, search messages within selected rooms, and manage the LINE login session.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@line-desktop-mcpShow me my unread LINE messages"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
line-desktop-mcp
Unofficial community project. Not affiliated with, endorsed by, or supported by LINE Corporation or LY Corporation. Uses your own logged-in account through the LINE Chrome Extension. Read tools are side-effect free;
clear_sessionis the only destructive tool and needs explicit confirmation.
FastMCP server for LINE Desktop automation. Wraps line-ext-msg>=1.2 (LINE Chrome Extension reader) as MCP tools.
LINE tools
Read tools are side-effect free (no files written, no media downloaded). Every result uses an ok/data/error envelope; failures carry a next field telling the AI what to ask the user to do. Session tools live in their own domain: probe_session is safe to call any time, clear_session wipes the login and always needs a fresh QR scan afterwards.
Tool | Description |
| 5 readiness checks (Chrome, attach, extension, page, login) |
| Open Chrome and wait up to 3 min for the user to log in |
| Chat rooms, optional |
| Latest messages, optional room ref + date/sender/keyword filters, |
| Unread rooms with latest preview in one call |
| Unread rooms with message bodies, with per-room progress |
| Keyword search inside REQUIRED |
| Login state + redacted storage check, safe any time, no side effects |
| Wipe LINE login only (destructive, needs |
First run opens a separate Chrome profile: call line_status, log in with QR/email in the window that opens, then call wait_login. Chrome runs headless by default and pops a visible window only for the QR scan; the login normally survives restarts. Only clear_session forces a fresh login every time. Room ref accepts index, data-mid, or name substring (prefer data-mid or name: index shifts when rooms reorder). Dates use YYYY-MM-DD. search_messages never scans all rooms: pass candidates from list_rooms first. Message reads backfill by scrolling up to limit (bounded ~8s); pass scroll=false for fast on-screen-only reads. When login looks flaky, call probe_session first; call clear_session with confirm=true only after the user agrees to log out. wait_login accepts up to 600 seconds and always covers it without cutting off early. After a QR login it settles briefly and proves headless reuse inside the same call, so ok:true means later tools can call right away with no manual waiting. search_messages skips refs that match no room (returned as RoomNotFound entries) instead of failing the whole call. Image bubbles are text-only by default; pass include_media=true to get_messages when the AI needs to see pictures.
Related MCP server: nekoro-browser-mcp
Tests
uv run python -m unittest discover -s tests -vBrowser-free unit tests only (room resolving, envelopes, login wait, session gate, CLI defaults). No Chrome needed.
Run (dev)
uv sync
uv run line-desktop-mcp --help
uv run line-desktop-mcpRun with HTTP transport for remote access:
uv run line-desktop-mcp --transport http --port 8000Run via FastMCP CLI:
uv run fastmcp run src/line_desktop_mcp/server.py:mcpUse without cloning (after PyPI release)
uvx line-desktop-mcp --help
pipx install line-desktop-mcp
pipx run line-desktop-mcp --helpTest a local wheel before release:
uv build
uvx --from ./dist/line_desktop_mcp-1.1.0-py3-none-any.whl line-desktop-mcp --helpClaude Desktop config
{
"mcpServers": {
"line-desktop": {
"command": "uvx",
"args": ["line-desktop-mcp"]
}
}
}For a local checkout use uv:
{
"mcpServers": {
"line-desktop": {
"command": "uv",
"args": ["--directory", "D:/path/to/line-desktop-mcp", "run", "line-desktop-mcp"]
}
}
}Structure
src/line_desktop_mcp/
server.py # FastMCP("line-desktop-mcp") wiring only
cli.py # argparse + mcp.run(), installed as `line-desktop-mcp`
tools/line_msg.py # LINE tools (status, login wait, rooms, messages, search)
tools/session.py # Session tools (probe_session read-only, clear_session destructive)Add a new tool domain by creating tools/<domain>.py with a register_<domain>_tools(mcp) function, then calling it from server.py.
Publish
uv build
uv publishRequires requires-python = ">=3.10" and the line-desktop-mcp console script defined in pyproject.toml.
Available Tools
9 toolsclear_sessionClear LINE sessionADestructiveIdempotent
Wipe the LINE login only; extension install stays.
| Name | Required | Description | Default |
|---|---|---|---|
| backup | No | Save a redacted probe to session/ before wiping. | |
| confirm | No | Must be true. Without it the tool refuses safely. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds meaningful context: it wipes only the login and preserves the extension install, and the schema's confirm parameter is described as a safety gate. This goes beyond the annotations and clarifies the destructive scope.
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 a single, front-loaded sentence that conveys the essential scope and limitation. Every word earns its place, and it avoids restating the title or schema details.
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 destructive annotation, the confirm parameter, and the output schema, the description is nearly complete. It could mention that the operation is irreversible or suggest verifying with line_status afterward, but the core safety and scope information is present.
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 both parameters well. The description doesn't add much beyond what the schema says, but the 'confirm' parameter's safety role is reinforced by the description's 'refuses safely' wording. Baseline 3 is appropriate.
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 ('Wipe') and resource ('LINE login'), and distinguishes itself from a broader uninstall by clarifying that the extension install stays. It is clear and concise, though it doesn't explicitly name a sibling tool for comparison.
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 a narrow use case (clearing only the login, not the install), which helps an agent decide when to use it. However, it doesn't explicitly state when not to use it or mention alternatives like probe_session or line_status for checking state before/after.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesRead LINE messagesARead-onlyIdempotent
Read latest messages, opening a room first when room is given.
Side-effect free: no files written. Only rows rendered on screen are visible (virtualized list), so deep history still returns just what the DOM holds.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Single day as YYYY-MM-DD. | |
| room | No | Room index, data-mid, or name substring. None reads the current view. Prefer data-mid or name: index shifts when rooms reorder. | |
| limit | No | ||
| scroll | No | True scrolls up to fill `limit` (bounded ~8s, complete). False reads on-screen rows only (fast). | |
| sender | No | Substring filter on sender name. | |
| date_to | No | Range end as YYYY-MM-DD. | |
| keyword | No | Substring filter on message text. | |
| date_from | No | Range start as YYYY-MM-DD. | |
| include_media | No | True embeds image bubbles as data URIs for AI vision. False (default) keeps reads light: no files, no downloads. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, openWorldHint, and idempotentHint, covering safety and idempotency. The description adds valuable context beyond that: 'Side-effect free: no files written' reinforces read-only, and 'Only rows rendered on screen are visible (virtualized list)' discloses a critical limitation about what data is accessible. This enriches the agent's understanding of the tool's behavior.
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 two concise sentences. The first sentence front-loads the primary action and the optional room behavior, while the second adds critical behavioral caveats. No unnecessary words or redundancy; every sentence earns its place.
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?
The tool has 9 parameters but none required, and an output schema exists to define return values. Annotations cover read-only, idempotent, and open-world aspects. The description explains the core operation and the virtualization limitation, which is the key behavioral constraint. Combined with schema and annotations, the agent has enough information to call the tool 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 description coverage is 89%, so most parameters are already documented in the input schema. The description does not add additional meaning to parameters beyond what the schema provides; it only mentions `room` in passing. Since the schema carries the heavy lifting, a baseline score of 3 is appropriate.
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 action: 'Read latest messages, opening a room first when `room` is given.' This clearly identifies the verb (read) and resource (LINE messages), and the optional room-opening behavior. It distinguishes from siblings like search_messages (search) and unread_digest/unread_full (unread summaries) without needing to name them.
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 for reading messages from the current view or a specified room, but it does not explicitly contrast with sibling tools or state when to prefer this over search_messages or unread_* tools. The context of sibling names suggests differentiation, but the description itself provides no explicit when-to-use guidance or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
line_statusLINE statusARead-onlyIdempotent
Check the 5 readiness steps: Chrome, attach, extension, page, login.
Call this first when unsure the setup works. On failure the result
carries a next field telling the user what to do.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the description's main job is to add operational detail. It does this by listing the 5 readiness steps checked and disclosing that failures return a `next` field with user guidance, which is genuinely useful beyond the structured metadata.
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 two tight sentences: the first names the resource and steps, the second gives invocation priority and failure behavior. There is no filler or repetition of schema/annotation 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?
For a tool with zero parameters and an output schema, the description supplies everything an agent needs: what is checked, when to call it, and what to do with a failed result. The annotations cover safety and idempotency, so nothing important 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?
There are no parameters, and the schema fully documents this with an empty properties object, so the baseline is 4. The description adds no parameter-level detail, but none is needed.
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 uses a specific verb ('Check') and a concrete resource (the 5 readiness steps: Chrome, attach, extension, page, login). It clearly states what the tool does and is easy to distinguish from sibling tools like wait_login or clear_session.
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 explicitly tells the agent to 'Call this first when unsure the setup works', which gives a clear trigger condition. It does not enumerate when-not-to-use cases or alternatives, but the priority guidance is strong enough to route the agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_roomsList LINE roomsARead-onlyIdempotent
List chat rooms with unread counts and last-message preview.
Prefer data-mid or name from the result when calling other tools: index values shift when rooms reorder.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Substring filter on room name. | |
| unread_only | No | True narrows to rooms with unread > 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is established. The description adds value beyond annotations by specifying result contents and warning that index values shift when rooms reorder.
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 two compact sentences with no fluff. The first states the purpose, and the second delivers a practically important stability warning without repeating schema or annotation 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, fully described parameters, and annotations covering read-only/idempotent behavior, the description only needs to add operational context. It supplies the essential guidance: result contents, stable identifiers to pass to other tools, and reorder risk.
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%, with query and unread_only each having clear descriptions and defaults. The tool description adds no parameter-level detail, so the baseline of 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?
The description opens with 'List chat rooms with unread counts and last-message preview,' naming a specific verb, resource, and expected output fields. This clearly distinguishes it from message-level siblings like get_messages and search_messages.
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?
There is no explicit statement of when to use list_rooms versus alternatives like unread_digest or unread_full. The second paragraph gives useful cross-tool guidance about preferring data-mid or name, but selection among sibling tools is still left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
probe_sessionProbe LINE sessionARead-onlyIdempotent
Check login state and redacted storage without changing anything.
Call this before clear_session, or when login looks flaky. Returns key names with type and length only, never secrets.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent, and the description reinforces this with 'without changing anything.' It adds meaningful beyond-annotation context by disclosing the redacted return behavior: 'Returns key names with type and length only, never secrets.' This is valuable safety-relevant detail, though it doesn't cover potential rate limits or auth requirements.
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 compact and front-loaded: purpose first, usage next, return safety last. Every sentence earns its place, and there is no redundant or filler content.
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 zero parameters, an output schema, and annotations covering safety, the description provides all essential context: what the tool checks, when to use it, and what the response will and will not contain. No critical information is missing for an agent to select and invoke it 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?
The tool has zero parameters and the schema fully reflects that with 100% coverage, so there are no parameter semantics for the description to clarify. The description correctly focuses on behavior and return values instead.
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 clearly states a specific verb and resource: 'Check login state and redacted storage without changing anything.' It also signals its non-destructive role relative to clear_session. However, it does not explicitly differentiate itself from the sibling line_status, which likely also reports login state, so full sibling distinction is missing.
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 gives an explicit usage trigger: 'Call this before clear_session, or when login looks flaky.' This tells the agent when to invoke the tool, but it does not mention when not to use it or name alternatives such as line_status for status-only checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesSearch LINE messagesARead-onlyIdempotent
Search a keyword inside the given rooms only.
Returns only rooms with matches, plus error entries for refs that match no room (a bad ref never fails the whole search). Sequential, roughly seconds per room, with progress reported per room.
| Name | Required | Description | Default |
|---|---|---|---|
| rooms | Yes | REQUIRED scope: room index, data-mid, or name substring, at least one. Get candidates from list_rooms first. Unscoped search across all rooms is not offered: it costs seconds per room. | |
| scroll | No | True scrolls up to fill `limit_per_room` (bounded ~8s per room). False reads on-screen rows only (fast). | |
| date_to | No | Range end as YYYY-MM-DD. | |
| keyword | Yes | Substring to search in message text. | |
| date_from | No | Range start as YYYY-MM-DD. | |
| limit_per_room | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description discloses important non-obvious behavior: it is sequential, roughly seconds per room, reports progress per room, returns error entries for unmatched refs, and a bad ref never fails the whole search. This is exactly the kind of behavioral context that helps an agent set expectations and interpret results.
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 compact and front-loaded: one sentence states the core purpose, and a short second paragraph carries the behavioral caveats. Every sentence adds value, with no filler or repetition of schema content.
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 input schema, output schema, and annotations, the description covers the remaining operational essentials: scoping, performance, progress reporting, and partial-failure semantics. Nothing needed to invoke the tool 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 high (83%) and the parameter descriptions are already rich, including room ref types, date formats, and scroll behavior. The tool description itself adds little parameter-level meaning beyond reinforcing the 'per room' concept, so a baseline 3 is appropriate.
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 opens with a specific verb+resource: 'Search a keyword inside the given rooms only.' It clearly defines the scope (given rooms only) and the result shape (only rooms with matches), which distinguishes it from message-retrieval siblings like get_messages and from any unscoped search.
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 main description states that search is restricted to the given rooms, and the rooms parameter explicitly says to 'Get candidates from list_rooms first' and that unscoped search is not offered. This gives solid context and a clear prerequisite, though it does not explicitly name alternative tools for when a different operation should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unread_digestUnread digestARead-onlyIdempotent
Unread rooms with latest preview in one call.
Cheapest "what is unread" check. For full message bodies use unread_full instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
An already carry safe annotations (readOnlyHint, idempotentHint), so the description doesn't need to restate them. It adds useful behavioral context beyond annotations: the tool is designed to be a cheap, single-call digest that returns previews only. This distinguishes it from alternatives and hints at resource characteristics without contradicting any annotation.
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 two concise sentences. The core purpose is front-loaded in the first line, and the second line adds routing guidance without any fluff. Every word earns its place.
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 this is a zero-parameter tool with a full output schema and clear annotations, the description is mostly complete. It covers purpose, usage context, and cost tradeoff. It doesn't detail what constitutes a 'latest preview' or how rooms are sorted, but the output schema are available to an agent, so this is a minor gap rather than a blocking one.
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?
With zero parameters, there is no param information to provide, and the baseline for zero parameters is 4. The description doesn't need to elaborate on param semantics because there are none, and the schema fully covers this aspect at 100% coverage.
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 opens with a clear, specific verb+resource stamenent: 'Unread rooms with latest preview in one call.' It directly distinguishes itself from unread_full by noting that it returns only previews, not full message bodies, which eliminates ambiguity about what the tool does.
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 explicitly frames the tool as the 'Cheapest what is unread check' and instructs users to choose unread_full instead when they need full message bodies. This gives a clear when-to-use and when-not-to-use rule, naming the alternative and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unread_fullUnread messagesARead-onlyIdempotent
Unread rooms with their message bodies, one room at a time.
Opens each unread room, so cost grows with unread count. Progress is reported per room.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Day as YYYY-MM-DD. None means today (local). | |
| scroll | No | True scrolls up to fill `limit_per_room` (bounded ~8s per room). False reads on-screen rows only (fast). | |
| limit_per_room | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, it discloses that the tool opens each unread room sequentially, that cost scales with unread count, and that progress is reported per room. This is useful operational behavior an agent could not infer from the annotations alone.
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 with no filler; the core purpose is front-loaded and the cost/progress notes are each distinct. Minor duplication between 'one room at a time' and 'Opens each unread room' keeps it from a perfect score.
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 that an output schema exists and the parameter schema documents date and scroll well, the description supplies the key behavioral context an agent needs: per-room iteration, cost growth, and progress reporting. It is complete except for missing sibling-vs-alternative guidance, which is more of a usage-guidelines gap.
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 description contains no parameter-level information; date, scroll, and limit_per_room are only documented in the schema. With schema coverage at 67%, limit_per_room is left to its name and constraints, and the tool description adds nothing to clarify 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?
The description names the resource ('unread rooms') and the payload ('message bodies') and adds the scoping qualifier 'one room at a time.' It implies retrieval, though it never uses an explicit verb like 'returns' or 'lists,' and it does not explicitly contrast with sibling unread_digest.
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 cost warning ('cost grows with unread count') gives an agent a reason to pause before using this tool, so some usage context is present. However, it never states when to choose this over unread_digest, get_messages, or other siblings, and doesn't give an exclusion condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_loginWait for LINE loginARead-onlyIdempotent
Open Chrome and wait until the user finishes LINE login.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_sec | No | Max seconds to wait (default 180, max 600). Chrome runs headless and pops a window only for the QR scan; the user logs in there once with QR or email. After login the tool settles briefly and proves headless reuse, so later tools can call right away. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description and parameter schema disclose key behaviors: Chrome runs headless, a window pops only for QR scan, the user can log in via QR or email, and the tool settles briefly to prove headless reuse. It does not contradict the readOnlyHint, since the tool itself waits rather than performing a write.
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 a single concise sentence that names the action and the goal with no filler. The additional behavioral details are placed in the parameter schema where they belong, keeping the main description lean and 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?
For a simple one-parameter wait tool with annotations and an output schema, the description covers the essential purpose and behavior. It does not mention timeout failure behavior or the case of an already-authenticated session, but those are minor gaps given the schema's timeout documentation.
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%, and the timeout_sec parameter has a thorough schema description including default, min, max, and behavioral context. The main description adds no additional parameter meaning, so the baseline of 3 is appropriate.
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 clearly states the verb ('Open Chrome and wait') and the specific goal ('until the user finishes LINE login'). It is distinguishable from sibling tools like line_status or probe_session because it focuses on the interactive login wait, not on querying session state. It does not explicitly name siblings, so it falls just short of 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?
The description gives clear context that this is the prerequisite login step: after login, later tools can call right away. It implies when to use it, but it does not state exclusions (e.g., 'skip if already logged in') or mention alternative session-check tools like probe_session.
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.
9 tool updates
v1.1.0- First observed
clear_session - First observed
get_messages - First observed
line_status - First observed
list_rooms - First observed
probe_session - First observed
search_messages - First observed
unread_digest - First observed
unread_full - First observed
wait_login
TDQS
Scored across 9 tools
Most tools target a distinct concern: setup status, login, rooms, messages, unread digests, search, and session probing/reset. A few pairs overlap slightly—line_status vs probe_session and list_rooms vs unread_digest—but the descriptions give clear guidance on when to use which.
The set mostly follows a verb_noun snake_case pattern like list_rooms, get_messages, clear_session, and search_messages. The deviations are minor: line_status, unread_digest, and unread_full are noun/adjective-led rather than verb-led, but the overall style is consistent and readable.
Nine tools is well within the ideal range for this server's scope. Each tool covers a meaningful piece of the LINE desktop workflow without redundancy or bloat.
The surface is complete for a read-focused LINE automation workflow: setup, login, room listing, message retrieval, unread digest/full views, search, and session clearing are all present. The only notable gaps are send_message and mark-as-read, which suggest the toolset is intentionally read-only but would be needed for broader chat interaction.
Maintenance
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
- LinkMCPOAuthio.linkmcp
Hosted MCP server for LinkedIn: 31 tools for profiles, search, messaging, posts, enrichment.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI tools to read and send messages through LINE Desktop via MCP, supporting manual or automatic sending without official LINE API tokens.23 npm110MIT
- AlicenseCqualityAmaintenanceMCP server for browser automation that drives Chrome via an extension, preserving login state and offering 45 tools for navigation, interaction, scraping, and screenshots.535MIT
- AlicenseNot gradedqualityCmaintenanceEnables interaction with Kakao Channel business chats via MCP tools for checking login status, unread counts, listing chats, reading messages, marking as read, and optionally sending messages when enabled.MIT
- FlicenseNot gradedqualityCmaintenanceEnables sending LINE text messages and Flex Messages to user or group IDs, checking message quota, and receiving group webhooks via a remote MCP endpoint for ChatGPT integration.-