Skip to main content
Glama
wasintoh

line-oa-mcp-ultimate

by wasintoh

LINE OA MCP Ultimate

Operate your LINE Official Account from any AI agent — through natural language.

🛠️ Fixed in 2.2.1: run the MCP on your own server and point any AI agent at one URL — it now holds up through real sessions and full broadcasts (no more instant "Internal server error" in HTTP mode), and hosted pictures now cache properly, so thousands of customers opening your broadcast at once barely touch your machine. Thanks to a production field report by Norapat Limpagan! 🙏

🖼️ New in 2.2: attach a picture, say "send this as a Rich Message" — and it appears in your customers' chats. No hosting. No image resizing. No setup.

CI npm version npm downloads coverage npm provenance License: MIT Node.js MCP

Quick Start · What you can do · Configuration · Security · Documentation

🇹🇭 คู่มือภาษาไทย: เริ่มต้น 5 นาที · Messaging — 37 tools · LINE Shopping — 14 tools


What is this?

line-oa-mcp-ultimate is a Model Context Protocol server that lets AI agents drive your LINE Official Account through natural conversation — no code, no API knowledge required.

Manage one OA or many — a single account needs just one env var, while agencies can register every client OA in one config file and switch between them with a single command (see Configuration).

It works with Claude Cowork, Claude Code, Cursor, Codex, ChatGPT desktop, OpenClaw, Hermes, or any MCP-compatible host.

Disclaimer: This is an independent open-source project. It is not affiliated with or endorsed by LY Corporation / LINE Corp. "LINE" is a registered trademark of LY Corporation, used here in a descriptive sense.


Related MCP server: LINE Bot MCP Server (SSE Support)

Why use it?

LINE OA Manager works well — but it's a web UI you have to log into, click through, and operate manually. With this MCP server, the same operations become natural-language requests in your AI host of choice:

Instead of clicking through LINE OA Manager...

Just say...

Open broadcast composer → pick audience → write text → preview → schedule

"Send a Mother's Day promo to my Bangkok-based 25-44 female audience"

Resize the artwork to 5 sizes → find somewhere to host it → upload → paste URLs into a Rich Message

"ส่งรูปนี้เป็น Rich Message หาลูกค้าทุกคน" (attach the picture — that's the whole job)

Navigate Insight → Delivery → pick date range → screenshot

"Summarize last week's performance"

Open Audience → create from upload → upload CSV → wait

"Create an audience from this CSV: customers_last_month.csv"

Open Rich Menu → design tabs → upload images → set as default

"Build a Mother's Day rich menu and set it as default"

Open Coupon → check usage tab → cross-reference clicks

"How many people redeemed my Mother's Day coupon?"

The MCP server takes care of LINE Messaging API calls, pre-flight validation, quota safety, quiet-hour warnings, and Thai-localized templates. You stay in your AI host and operate your OA the way you think about it — by intent.


🆚 vs the official @line/line-bot-mcp-server

LY Corporation publishes an official LINE Bot MCP server (Apache-2.0, marked preview). It's a clean reference implementation, and ideas from it helped shape this project — if all you need is pushing a text or Flex message to one user from an agent, it may be enough. This project targets running a real OA (or an agency's worth of them) day to day:

line-oa-mcp-ultimate (this project)

official @line/line-bot-mcp-server

Tools

51 (37 messaging + 14 shopping) + 4 resources + 8 guided prompts

12 (push/broadcast text & Flex, profile, quota read, rich-menu basics, follower IDs)

LINE Shopping (MyShop)

✅ 14 opt-in tools — products, stock, orders, parcel labels, settlements, checkout links

Rich Message images

✅ zero-setup (v2.2) — attach a picture, everything else is automatic and verified delivered-able before "success"

❌ bring your own hosted URLs

Multi-OA

✅ one config file for all client OAs + runtime switch (line_use_oa) + fan-out (line_run_on_many_oas)

❌ one OA per server instance

Quota / quiet-hours guardrails

✅ pre-flight Quota Guardian, 22:00–08:00 quiet-hours warnings, dry_run cost estimates

➖ quota read tool (get_message_quota); no pre-flight guardrails

Thai i18n

✅ every user-facing error/warning in Thai, plus full Thai guides

❌ English (Japanese README available)

Rich-menu image generation

✅ pure-JS satori + resvg (~10 MB, no browser), with a preview-before-deploy loop

✅ Marp + Puppeteer (downloads headless Chromium), generate-and-upload in one shot

Transports

stdio + Streamable HTTP with bearer-token auth (MCP_HTTP_TOKEN)

stdio (npx / Docker)

Runtime footprint

browser-free — no headless Chromium download

depends on puppeteer + @marp-team/marp-core for rich-menu images

Based on the official repo's README and package manifest as of 2026-07 — see their repo for the latest.


Who is it for?

  • 🪐 AI-first marketers who run a LINE OA from their AI workspace.

  • 🏪 SMB owners who already use LINE OA as their primary customer channel and want to automate routine work.

  • 🏢 Marketing agencies managing many client OAs from one dashboard.

  • 💻 Developers building LINE-integrated SaaS, automations, or AI bots.

Free-tier ready — no Premium upgrade required for the core feature set.


What you can do

37 messaging tools + 14 LINE Shopping tools (v2.0, opt-in) + 4 resources + 8 guided prompts, grouped by what you actually want to do:

📨 Send messages (2 tools)

One universal send_message covers every LINE transport (reply / push / multicast / narrowcast / broadcast). Three modes: send_now, draft (for scheduling via LINE OA Manager UI), and dry_run (validate + estimate cost without sending). Message shapes: text, Flex (template or raw JSON), sticker, image, video, native LINE coupon ({ coupon_id }), and a message_json passthrough for pre-built Rich/Card messages. Plus Thai-friendly sticker search.

🎨 Rich Menus (9 tools)

Build a rich menu in one call (create + upload image + set as default), list, delete, and diagnose "why doesn't this user see my menu?". Full lifecycle too: link/unlink a menu to specific users or in bulk (auto-chunked at 500), set/clear the account default, manage rich-menu aliases (tab-switching menus), and swap the image on an existing menu. New in v2.1 — Rich Menu Studio: line_design_rich_menu_image generates the menu image itself (Thai-ready layout templates, pure-JS satori + resvg — no headless browser), lets you preview before deploying, then hands off to line_build_rich_menu.

💎 Message Design (5 tools)

Design Flex Messages from 8 Thai-localized templates or raw JSON, build Rich Messages (imagemap — tappable image regions + optional video), and Card Messages (template — buttons / confirm / carousel / image_carousel). Each returns ready-to-send JSON you hand to send_message. New in v2.2: Rich Messages need zero hosting — attach any image and it's resized, hosted, and verified for you (line_prepare_image + line_image_host_status).

🎯 Audiences (5 tools)

Build retargeting audiences from a CSV or from prior broadcast engagement, list, delete — and update an existing audience (add users, rename).

📊 Insights (5 tools)

Quick OA status snapshot (incl. chat mode), weekly markdown reports, per-broadcast engagement stats, pre-flight send-cost estimation, and narrowcast delivery progress ("did my blast finish?").

🎟 Coupons (2 tools)

Create, list, get, and discontinue native LINE coupons with line_manage_coupon, then broadcast a created coupon straight into chats as a native coupon message via send_message ({ coupon_id }). Pull redemption analytics by combining coupon details with click-audience tracking.

🔌 Webhook (2 tools)

Test your OA's webhook URL and surface LINE's signature verification result, plus set/get the webhook endpoint — quick to wire up or diagnose "why isn't my bot responding?".

👤 Operations (5 tools)

User profile lookup, follower listing, multi-OA listing and switching, and run_on_many_oas for agencies that need to run a read-only tool across all client OAs in parallel.

💻 LIFF & Token (2 tools)

Manage LIFF app lifecycle (create / update / delete / list) and verify your channel access token's validity, expiry, and scope.

🛍️ LINE Shopping (14 tools — v2.0, opt-in)

Turn your agent into a storefront operator. These register only when a MyShop API key is configured (see Configuration) — messaging-only users never see them. Powered by the MyShop Open API (X-API-KEY, no webhook/server required).

  • Products (7): list, create, update, delete, change price, show/hide, and manage variants — e.g. "เพิ่มสินค้าเสื้อยืด 299 บาท สต็อก 50", "ลดราคาคอลเลกชันนี้ 15%".

  • Inventory (1): set / increase / decrease stock — "เติมสต็อก V9 อีก 50".

  • Orders (4): list/search (with polling for new orders via a scheduled task), get detail, fulfill (mark shipped + tracking, mark COD paid, print parcel label), and cancel — "ออกใบปะหน้าให้ออเดอร์ที่จ่ายแล้ววันนี้".

  • Settlement + Checkout (2): see real income after fees, and create a checkout link to close the sale in chat"ลูกค้าอยากได้ 2 ชิ้น สร้างลิงก์จ่ายเงิน".

📘 Full Thai guide: docs/myshop-guide-th.md — get the API key, every tool explained, real workflows, safety rules, and troubleshooting.

Resources — auto-refreshing OA snapshot, Flex template catalog, sticker catalog with mood-keyword index, and a Thai festival calendar with marketing promo patterns.

Prompts — guided workflows for daily reports, campaign building, broadcast scheduling, rich menu diagnosis, coupon campaigns, LINE Notify migration, and webhook setup.


Quick Start

Requirements

  • Node.js 20 or later

  • A LINE Official Account with Messaging API enabled

  • A Channel Access Token

No database, no Playwright, no CDN, no public URL, no scheduler infrastructure required.

Step 1 — Get your Channel Access Token

  1. Open the LINE Developers Console.

  2. Pick your provider → open (or create) a Messaging API channel.

  3. Open the Messaging API tab → scroll to Channel access token → click Issue.

  4. Copy the long-lived token. Treat it like a password.

If you don't yet have a LINE Official Account, follow LINE's getting started guide.

Step 2 — Add the MCP server to your AI host

Paste the following block into your host's MCP config file (see table below):

{
  "mcpServers": {
    "line": {
      "command": "npx",
      "args": ["-y", "line-oa-mcp-ultimate"],
      "env": {
        "LINE_CHANNEL_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
      }
    }
  }
}

Where to find the config file:

Host

Where to add it

Claude Cowork

Settings → Developer → Local MCP servers → Edit Config

Claude Desktop (macOS)

~/Library/Application Support/Claude/claude_desktop_config.json

Claude Desktop (Windows)

%APPDATA%\Claude\claude_desktop_config.json

Claude Code

Run claude mcp add line or edit ~/.config/claude/mcp.json

Cursor / Codex / ChatGPT desktop

See your host's MCP setup docs — same JSON shape

⚠️ Don't replace existing MCP servers. Add the "line" entry alongside any existing entries inside mcpServers.

Step 3 — Restart your AI host

Quit completely (Cmd+Q on macOS) and reopen. On first start the host runs npx -y line-oa-mcp-ultimate, downloads the package from npm, and caches it for subsequent starts.

Step 4 — Verify

In a new chat, try:

Show my LINE OA status

or in Thai:

ดูสถานะ OA หน่อย

You should see a health card with friend count, monthly quota, webhook status, and the default rich menu. That's it — you're now operating your LINE OA from your AI agent.

🛍️ Want LINE Shopping too? (optional)

Add LINE_MYSHOP_API_KEY to the same env block (get it from oaplus.line.bizSettings → API keys, Admin role). The full config looks like this:

{
  "mcpServers": {
    "line": {
      "command": "npx",
      "args": ["-y", "line-oa-mcp-ultimate"],
      "env": {
        "LINE_CHANNEL_ACCESS_TOKEN": "YOUR_TOKEN_HERE",
        "LINE_MYSHOP_API_KEY": "YOUR_MYSHOP_API_KEY_HERE"
      }
    }
  }
}

Restart your host — that unlocks 14 shopping tools (products, inventory, orders, parcel labels, settlements, checkout links). Without the key, the server stays messaging-only. See LINE Shopping, the full Thai MyShop guide, and Image hosting.


Configuration

Single-OA mode (default — for most users)

That's the Step 2 snippet above. One environment variable, one OA. Suitable for individual creators, course makers, and most SMB owners.

Multi-OA mode (for agencies)

If you manage several LINE OAs (your own plus client accounts), create a JSON config file at ~/.line-mcp/config.json — the server auto-discovers it, so there's nothing to clone or build:

mkdir -p ~/.line-mcp
nano ~/.line-mcp/config.json     # or: code ~/.line-mcp/config.json

📘 Full walkthrough (two placement options + security notes) in docs/multi-oa-setup-th.md. A ready-to-edit template lives in config.example.json.

Fill in one entry per OA:

{
  "default_oa": "main",
  "oas": {
    "main": {
      "channel_access_token": "TOKEN_1",
      "display_name": "Main OA",
      "region": "TH",
      "myshop_api_key": "MYSHOP_KEY_1"
    },
    "client_a": {
      "channel_access_token": "TOKEN_2",
      "display_name": "Client A — Bangkok Cafe"
    }
  }
}

🛍️ LINE Shopping (v2.0): add "myshop_api_key" to any OA to enable the 14 shopping tools for it (get it from oaplus.line.biz → Settings → API keys, Admin role). In single-OA mode, set the env var LINE_MYSHOP_API_KEY instead. OAs without a key simply keep the messaging tools — the shopping tools never appear and never error.

Then drop the LINE_CHANNEL_ACCESS_TOKEN env var from your MCP config — the server discovers ~/.line-mcp/config.json automatically.

Resolution order:

  1. LINE_MCP_CONFIG env var (custom path)

  2. ~/.line-mcp/config.json

  3. LINE_CHANNEL_ACCESS_TOKEN env var (single-OA fallback)

Switching the active OA at runtime

Ask your AI host:

"Switch to client_a"
→ line_use_oa({ oa_id: "client_a" })

Or override per-call with the oa parameter on any tool.

Advanced — HTTP transport (self-hosted)

For agencies and always-on servers, the server also supports Streamable HTTP — run one instance per agent/teammate (the active OA switched by line_use_oa is shared per instance). See docs/http-transport.md.


🖼️ Images & Rich Messages — zero setup (v2.2)

Before 2.2, sending one Rich Message meant: resize your artwork into five exact sizes, find hosting, upload, paste URLs — the step where most shop owners simply gave up. Now the whole workflow is:

Attach a picture. Say "send this as a Rich Message". Done.

What you get, without doing anything:

  • 📐 Every size LINE requires — prepared automatically.

  • 🌍 Your image made reachable for LINE — automatically, wherever you run: your laptop, a server, anywhere. Nothing to sign up for, nothing to configure.

  • Verified before "success" — the tool checks that LINE can actually pull every size before it ever tells you the send worked. The classic "API said success but customers see a blank image" problem is gone.

  • 🧰 Never a dead end — on locked-down networks where automation isn't possible, you instantly get a ready-made package + 1-minute Thai instructions instead of an error.

One honest rule to remember: LINE collects the image when each customer first opens the message — so keep your machine on until your audience has seen it (the built-in 24-hour window covers a normal broadcast day). Once opened, the image lives on LINE's side permanently.

Full guide + troubleshooting (Thai): docs/image-hosting-th.md

Prefer hosting yourself (agencies, long-running campaigns)? Everything still works the classic way — every image tool accepts a public, direct HTTPS URL to a JPEG/PNG:

  • Recommended: Cloudflare R2, AWS S3 (public bucket), raw.githubusercontent.com, Cloudinary, ImageKit — stable, direct URLs.

  • ⚠️ Avoid: Google Drive / Dropbox share links — they return an HTML preview page, not a direct image. (The source_url input rewrites these to direct-download form automatically.)

Documentation

Doc

What's in it

docs/quickstart-th.md

Thai-language quick start (5-minute walkthrough)

docs/messaging-guide-th.md

📨 Messaging full guide — Thai. The messaging tools explained, transports & send modes, real workflows, safety limits, and troubleshooting

docs/myshop-guide-th.md

🛍️ LINE Shopping (MyShop) full guide — Thai. Get the API key, all 14 tools explained, real end-to-end workflows, safety rules, and troubleshooting

docs/clients-setup-th.md

Per-host MCP setup — Cowork / Claude Desktop / Cursor / Codex (Thai)

docs/image-hosting.md · docs/image-hosting-th.md

🖼️ Images & Rich Messages with zero hosting (v2.2) — EN + Thai: how it works, the first-view rule, troubleshooting

docs/multi-oa-setup-th.md

Multi-OA configuration guide (Thai)

docs/cowork-local-test-th.md

Test a local build in Claude Cowork before publishing (Thai)

docs/http-transport.md

Streamable HTTP transport for self-hosted / remote use

SECURITY.md · docs/security-th.md

Security policy (EN) · threat-model guide for shop owners (Thai)

examples/

Runnable examples


🔐 Security

This server operates with live channel access tokens — whoever holds the token is your shop. Treat your MCP config like a password store.

  • Report vulnerabilities privately via GitHub Security Advisories — see SECURITY.md for scope, response times, and what to include. Please don't open public issues for security problems.

  • Thai threat-model guide for shop owners: docs/security-th.md — what a leaked token can do, per-OA token isolation, and config-file permissions.

  • HTTP transport requires auth beyond localhost: binding to any non-loopback host (e.g. 0.0.0.0) requires MCP_HTTP_TOKEN — every request must then carry Authorization: Bearer <token>. Without the token the server refuses to expose itself beyond 127.0.0.1. Details in docs/http-transport.md.


Versioning

This project follows Semantic Versioning. Current release: v2.2.2 (docs-only republish of 2.2.1) — full history in CHANGELOG.md.

Latest changes (v2.2.1): HTTP transport fixed for real MCP clients — every request now gets its own server instance (overlapping requests no longer 500), non-POST methods answer a clean 405, and self-hosted images serve immutable cache headers + ETag/304 so a reverse proxy or CDN can absorb an entire broadcast wave. Reported from production by Norapat Limpagan — thank you! See CHANGELOG.md.

Previously (v2.2.0): Image Hosting Layer — attach a picture and line_prepare_image resizes it to every size LINE needs, hosts it automatically (own server / quick tunnel / manual-package fallback), and verifies every size is reachable before ever reporting success; line_image_host_status gives a read-only health check.

Previously (v2.0.0): +14 LINE Shopping tools via the MyShop Open API — products, inventory, orders (incl. parcel labels), settlements, and checkout links. API-key only, no webhook/server, fully opt-in (registers only when a MyShop key is set) and non-breaking on the 34 messaging tools. See RELEASE_NOTES_v2.0.0.md.

Previously (v1.1.0): +10 tools completing LINE's token-only Messaging API surface (rich-menu lifecycle, Rich/Card message builders, audience update, webhook set/get, narrowcast progress, token check). See RELEASE_NOTES_v1.1.0.md.


Roadmap

  • v1.x — Full token-only Messaging API coverage: outbound + rich-menu lifecycle + Rich/Card message builders + audiences + insights + coupons.

  • v2.0 — ✅ LINE Shopping (MyShop Open API) shipped — products, inventory, orders, parcel labels, settlements, and checkout links (API-key only, no webhook). See RELEASE_NOTES_v2.0.0.md.

  • v2.1 — ✅ "Trust Release" shipped — Rich Menu Studio (image generation + preview), HTTP bearer auth, security policy + hardening, CI/CD with provenance, coverage-gated test suite. See CHANGELOG.md.

  • v2.2 — ✅ "Zero-Hosting Release" shipped — attach a picture, say send: auto-resize to all 5 Rich Message sizes, automatic hosting (own server / quick tunnel / manual package — nobody dead-ends), every size verified reachable before success. See CHANGELOG.md.

Future direction is guided by real-world usage and community feedback.


Contributing

PRs are welcome. Please open an issue first to discuss substantial changes.

The one rule: a new tool ships with new tests. Every tool is exercised through a real in-memory MCP client with the LINE API mocked at the fetch boundary (see tests/helpers/) — no live token needed to run the suite.

npm ci
npm run typecheck       # strict TypeScript, no `any`
npm test                # vitest run
npm run test:coverage   # coverage — ≥80% lines, enforced in CI
npm run build

When contributing:

  • Tool names: line_{action}_{resource} (snake_case, prefix line_).

  • Tool descriptions: English (for LLMs) — Thai examples encouraged.

  • User-facing strings: Thai-friendly (centralized in src/i18n/th.ts).

  • Pre-flight validation on every send tool.

  • Quota Guardian + Quiet Hours on every consumption tool.

  • Backward compatibility is non-negotiable — never rename or remove existing tools, params, response fields, env vars, or config keys.

PR expectations: CI must be green (test workflow — typecheck, tests with coverage, build on Node 20 & 22), and behavior changes come with a matching CHANGELOG.md line under Unreleased.

Releasing (maintainers)

  1. Move the Unreleased section of CHANGELOG.md to the new version and bump package.json.

  2. git tag vX.Y.Z && git push origin vX.Y.Z.

  3. The release workflow runs the full gate (typecheck + tests + build), publishes to npm with --provenance, and creates a GitHub Release from the matching CHANGELOG section. It needs one repo secret: NPM_TOKEN (npm granular access token with publish rights on this package).


Author

Dr. Wasin Treesinthuros (พี่โต / Dr. Wasin / #จารโต)

  • CEO at Innovation Vantage

  • Founder at ForgeAI — AI Transformation Studio

  • LINE Certified Coach 2026

  • AI Transformation educator, SaaS builder, university lecturer

This project is part of a broader mission to bring production-grade AI automation to every Thai practitioner — regardless of technical background.

GitHub: @wasintoh


License

MIT © Dr. Wasin Treesinthuros — Innovation Vantage / ForgeAI

Available Tools

37 tools
line_audit_user_menuAudit user's LINE Rich MenuA
Read-onlyIdempotent

Diagnose "why is user X seeing menu Y?" — inspects the rich-menu priority chain: a per-user link (line_link_rich_menu) overrides the account-wide default, and LINE OA Manager-built menus silently override API-built ones. Pass user_id.

Returns { user_id, visible_rich_menu_id?, source:'per_user'|'default'|'none', per_user_link?, default_id?, explanation (Thai) }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
user_idYesLINE user ID to inspect

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds behavioral context beyond annotations by explaining the priority chain (per-user override, OA Manager vs API-built menus) and listing the return fields. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of two sentences. It front-loads the key diagnostic question and then lists the return fields in a structured format. Every sentence adds value without redundancy.

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

Completeness4/5

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

Given no output schema, the description covers the return structure adequately. It addresses purpose, usage context, and behavioral logic. Minor gaps: error cases or prerequisites (like OA token) are not mentioned, but overall it's sufficient for a read-only diagnosis tool.

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

Parameters3/5

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

Schema has 2 parameters: oa (string, not required, no description) and user_id (required, minLength, described). Schema coverage is 50%. The description mentions passing user_id and explains its role, partially compensating for the missing oa description. However, oa remains unexplained, limiting parameter clarity.

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

Purpose5/5

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

The description clearly states the tool's purpose as diagnosing why a user sees a specific menu. It specifies the verb 'Diagnose', the resource 'rich-menu priority chain', and distinguishes itself from sibling tools like line_link_rich_menu and line_set_default_rich_menu by focusing on auditing/debugging.

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

Usage Guidelines4/5

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

The description explains when to use the tool via the diagnostic question 'why is user X seeing menu Y?' and mentions the priority chain logic. It does not explicitly state when not to use it or list alternatives, but the context is clear enough for an agent to infer its diagnostic role.

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

line_build_audience_from_csvBuild LINE audience from user IDsA

Create a LINE audience by uploading user IDs (or IFAs) — the "CSV from Google Sheets → retargeting audience" flow most Thai SMBs need. LINE indexes for ~5-10 min after creation (line_list_audiences shows IN_PROGRESS then READY). user_ids max 10,000/call; is_ifa true for IFA values instead of LINE user IDs. Region-gated to JP/TW/TH OAs (+premium).

Returns { audience_group_id, name, type, created_unix_ms }.

Example: "สร้าง audience ลูกค้าเดือนก่อน" → { name:"buyers_last_month", user_ids:[...] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
nameYesAudience name as shown in LINE OA Manager (≤120 chars).
is_ifaNoTrue if values are Identifiers for Advertisers (IFAs) instead of LINE user IDs.
user_idsYesArray of LINE user IDs. Max 10,000 per call.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond annotations (non-readOnly), the description reveals indexing delay (~5-10 min), status in list endpoint, user_id limit, and region restrictions. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with purpose, followed by timing, limits, region, return format, and example. No unnecessary words.

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

Completeness4/5

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

Covers key aspects: purpose, behavior, limits, region, return format. With no output schema, it explains returns. Lacks prerequisites but acceptable.

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

Parameters3/5

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

Schema coverage is high (75%). Description repeats user_ids limit and is_ifa usage, and adds region context for 'oa'. Does not add new parameter details beyond schema.

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

Purpose5/5

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

The description clearly states the tool creates a LINE audience by uploading user IDs or IFAs, specifically for the CSV-to-retargeting-audience flow. It distinguishes from sibling 'line_build_audience_from_engagement' by focusing on user IDs.

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

Usage Guidelines4/5

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

Provides context on when to use (uploading IDs from CSV, retargeting), indexing time, and region gating. Lacks explicit contrast with siblings but is clear enough for an agent to infer.

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

line_build_audience_from_engagementBuild retargeting audience from prior engagementA

Create a LINE audience from people who clicked or opened a previous broadcast/narrowcast — retarget without a CRM. source_request_id is the request_id returned by a prior line_send_message; type 'clicks' (default, optional click_url filter) or 'opens'. The source message must be ≥24h old before the audience is reliable, needs ~50+ users to be usable in narrowcast, and is region-gated to JP/TW/TH (+premium). Feed the resulting audience back into line_send_message target.audience.

Returns { audience_group_id, name, type }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
nameYes
typeNo'clicks' = audience of users who clicked any link in the source message; 'opens' = users who saw it.clicks
click_urlNoIf 'clicks' and you only want users who clicked a specific URL, set it here.
source_request_idYesThe request_id returned by a prior line_send_message (narrowcast/multicast/push/broadcast).

TDQS

A4.7/5.0
Behavior4/5

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

Annotations indicate mutation and non-idempotency; description adds critical behavioral constraints (age requirement, minimum user count, region gate) and explains return format, going beyond annotation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: front-loaded purpose, then key details, then return format. No redundant words; each sentence adds value.

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

Completeness5/5

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

Given 5 parameters and no output schema, the description covers purpose, parameters, constraints, integration, and return format, making it fully self-contained for an agent.

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

Parameters4/5

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

Schema covers 60% of parameters with descriptions; the description adds context for source_request_id (linking to prior message) and type (specifying default and click_url filter), though 'oa' parameter is not explained.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Create a LINE audience from people who clicked or opened a previous broadcast/narrowcast' and differentiates it from sibling tools like line_build_audience_from_csv by specifying the engagement source.

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

Usage Guidelines5/5

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

Provides explicit guidance: when to use (retarget without CRM), constraints (source message ≥24h old, needs ~50+ users, region-gated), and how to integrate (feed audience into line_send_message).

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

line_build_rich_menuBuild LINE Rich Menu (single panel)A

Create a LINE Rich Menu from an already-hosted image in one call: validate → create → upload image → set as default. Collapses 4 LINE API calls into one, incl. the api-data.line.me domain switch for image upload (the #1 cause of failed implementations). Single-panel menus only. To RENDER the image from labels instead of hosting your own, use line_design_rich_menu_image.

image_url must be public HTTPS JPEG/PNG, width 800–2500px, aspect ≥1.45, ≤1MB (validated client-side before upload). areas are tappable regions with postback/message/uri/richmenuswitch actions and must fit inside the image bounds. size 'large' (2500x1686, default) or 'compact' (2500x843). set_as_default default true. Max 1,000 rich menus per OA.

Returns { rich_menu_id, name, set_as_default, warnings[] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
nameYesInternal name (admin-only).
sizeNocompact (2500x843) for a single row, large (2500x1686) for a full panel. Default 'large'.large
areasYesTappable areas. Coordinates are in image pixels.
selectedNoWhether the rich menu opens by default when chat is opened.
image_urlYesPublic HTTPS URL of the rich menu image. Must be JPEG or PNG, aspect ratio ≥ 1.45, ≤1MB.
chat_bar_textYesThe button label shown in chat bar.
set_as_defaultNoSet this rich menu as the account-wide default. Default true.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate a mutation tool (readOnlyHint=false, destructiveHint=false). The description adds context: it mentions the internal workflow (validate → create → upload image → set as default), the critical domain switch for image upload, and constraints like image requirements and the 1,000-menu limit. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph with clear front-loading of purpose. Each sentence contributes useful information, though it could be slightly more structured (e.g., bullet points for constraints). No wasted words.

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

Completeness4/5

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

Returns values are specified ({ rich_menu_id, name, set_as_default, warnings[] }) despite no output schema. Constraints (image size, aspect ratio, file size) and limits (max 1,000 menus per OA) are provided. Input parameters are covered by the schema, but the description adds operational context.

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

Parameters3/5

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

Schema description coverage is 88%, so the schema already documents most parameters. The description adds minor detail (e.g., 'must fit inside the image bounds' for areas) but largely restates schema info (image_url constraints, size dimensions). Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb 'Create' and the resource 'LINE Rich Menu', distinguishing it from the sibling tool line_design_rich_menu_image which renders images from labels. The title also specifies 'single panel' for precise scope.

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

Usage Guidelines5/5

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

The description explicitly tells when to use ('single-panel menus only') and when not to, directing users to line_design_rich_menu_image for alternate image generation. It also explains the advantage of collapsing 4 API calls.

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

line_check_tokenCheck LINE Token ValidityA
Read-onlyIdempotent

Verify the active OA's channel access token (GET /oauth2/v2.1/verify) — reports bound client_id, remaining lifetime, and granted scope; warns (Thai) when <7 days remain. Run before a campaign: a token expiring mid-send fails silently. An invalid/expired token surfaces a 401 error (no { valid:false } shape).

Returns { valid, client_id, expires_in_seconds, expires_in_days, scope?, warning? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOptional OA id; defaults to active OA.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations indicate readOnlyHint, idempotentHint, and non-destructive behavior. The description adds valuable context beyond annotations: it warns in Thai when less than 7 days remain, describes the 401 error scenario, and clarifies the return shape. No contradictions found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with no wasted words. It front-loads the main purpose and provides all necessary details in a few sentences. Every sentence adds value, making it highly efficient for agent understanding.

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

Completeness5/5

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

Given the tool's simplicity (one optional parameter, no output schema), the description fully covers the input, behavior (thai warning, error handling), and return shape. Annotations cover safety. No gaps remain for an agent to use this tool correctly.

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

Parameters3/5

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

The only parameter (oa) has a schema description stating it's optional and defaults to active OA. The tool description does not add further parameter-level semantics beyond what the schema already provides, so baseline 3 applies.

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

Purpose5/5

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

The description clearly states it verifies the active OA's channel access token and reports bound client_id, remaining lifetime, and granted scope. This purpose is unique among siblings (no other tool checks token validity), so it effectively distinguishes itself.

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

Usage Guidelines4/5

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

The description explicitly advises running before a campaign to avoid silent failure from mid-send expiration. It also explains the 401 error for invalid/expired tokens. However, it lacks explicit guidance on when not to use this tool or mention of alternatives, which would elevate to a 5.

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

line_delete_audienceDelete LINE audienceA
DestructiveIdempotent

Delete an audience group. Irreversible — requires confirm=true. audience_group_id (numeric) from line_list_audiences.

Returns { success, deleted_id }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
confirmNo
audience_group_idYes

TDQS

A4.2/5.0
Behavior4/5

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

The description adds that the action is irreversible and requires confirm=true, which goes beyond the annotations. The annotations already indicate destructiveHint=true and readOnlyHint=false, and the description confirms the destructive nature. It also discloses the return format {success, deleted_id}, adding behavioral context the annotations lack.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences that front-load the key action and provide essential details without redundancy. Every word serves a purpose.

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

Completeness4/5

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

For a simple deletion tool, the description adequately covers the purpose, required parameter source, confirm flag, and return format. No output schema exists, but the return snippet clarifies what to expect. The description is complete enough for an agent to use the tool correctly.

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

Parameters3/5

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

With schema description coverage at 0%, the description must illuminate parameters. It explains audience_group_id (numeric, from line_list_audiences) and highlights the confirm parameter's necessity. However, the 'oa' parameter is left unexplained, and the description does not fully compensate for the missing schema descriptions.

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

Purpose5/5

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

The description starts with 'Delete an audience group', clearly stating the verb 'delete' and the resource 'audience group'. It distinguishes from sibling delete tools like line_delete_rich_menu by specifying 'audience'.

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

Usage Guidelines4/5

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

The description notes that confirm=true is required and that audience_group_id comes from line_list_audiences, providing clear usage context. However, it does not explicitly state when not to use this tool or mention alternatives (e.g., line_update_audience), which would strengthen the guidance.

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

line_delete_rich_menuDelete LINE Rich MenuA
DestructiveIdempotent

Delete a rich menu by ID. Requires confirm=true (guards against prompt drift). If the menu is linked to specific users those links break silently — consider line_audit_user_menu first.

Returns { success, deleted_id }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
confirmNoRequired true. Deletion is irreversible.
rich_menu_idYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate destructive and write operations. Description adds specific side effects: silent breaking of user links, the need for confirm flag, and return shape. This goes beyond annotations, though idempotency is not discussed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no fluff. Nearly every word adds value. Sentences are well-ordered: action, requirement, side-effect/alternative, return. Front-loaded with key info.

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

Completeness4/5

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

Despite no output schema, the description covers return format, side effects, and prerequisite. Missing explanation of 'oa' parameter, but overall complete for a simple deletion tool with good annotations.

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

Parameters2/5

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

Schema coverage is low (33%). The description adds context only for 'confirm' (guards against prompt drift) but does not explain 'oa' or 'rich_menu_id' beyond what schema provides. The return value is mentioned but not parameter semantics.

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

Purpose5/5

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

The description clearly states 'Delete a rich menu by ID' and distinguishes it from siblings like build, list, audit, and link tools. The purpose is specific and unambiguous.

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

Usage Guidelines5/5

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

Provides explicit when-to-use: requires confirm=true. Warns against using when menu is linked to users without auditing, and suggests alternative tool line_audit_user_menu. Excellent guidance.

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

line_design_cardDesign LINE Card Message (Template)A
Read-onlyIdempotent

Build a validated LINE Template message (LINE OA Manager calls it a "Card Message") and return it as JSON to hand to line_send_message via message.message_json. DESIGN ONLY — never calls the LINE API.

kind (required) picks the subtype and enforces LINE limits:

  • buttons → title?, text, thumbnail_image_url?, actions (1..4 buttons; text ≤60 chars with title/thumb, else ≤160)

  • confirm → text + exactly 2 buttons (e.g. ตกลง / ยกเลิก)

  • carousel → columns (≤10, each ≤3 buttons); EVERY column must have the SAME number of buttons (LINE rule)

  • image_carousel → columns of { image_url (HTTPS), action } (≤10) Actions: uri | message | postback; label ≤20 chars. alt_text (1..400) required.

Returns { message, usage_hint }.

Example: "การ์ดยืนยันการจอง ตกลง/ยกเลิก" → { kind:"confirm", alt_text:"ยืนยันการจอง", text:"ยืนยันคิว 14:00 ไหม?", actions:[{type:"postback",label:"ตกลง",data:"confirm=1"},{type:"message",label:"ยกเลิก",text:"ยกเลิก"}] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesCard subtype. Determines which other fields are required.
textNo[buttons] body (≤60 with title/thumb, else ≤160). [confirm] question (required).
titleNo[buttons] Optional card title.
actionsNo[buttons] 1..4 buttons. [confirm] exactly 2 buttons.
columnsNo[carousel] ≤10 columns (same action-count each). [image_carousel] ≤10 columns.
alt_textYesFallback text shown in push notification + chat list (1..400 chars).
thumbnail_image_urlNo[buttons] Optional HTTPS thumbnail.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds further transparency by stating 'DESIGN ONLY — never calls the LINE API' and describing the validation and return format. There is no contradiction with annotations, and the description provides useful behavioral context beyond the safety hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and an example, making it easy to parse. It front-loads the key message about design-only and JSON return. While it is somewhat long, the content is valuable and organized. Minor improvement: could be slightly more concise, but overall efficient.

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

Completeness4/5

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

Given 7 parameters (2 required) and no output schema, the description covers the important aspects: return format ({ message, usage_hint }), key constraints per kind, and an example. The only gap is the lack of detail on the 'usage_hint' field, but overall it provides sufficient context for an AI agent to use the tool correctly.

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

Parameters4/5

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

The input schema covers 100% of parameters, but the description adds significant value by explaining the different kinds (buttons, confirm, etc.) and their specific constraints (e.g., text length limits, action count rules). It also clarifies the required fields per kind and the expected structure of actions. This goes beyond mere schema listings.

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

Purpose5/5

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

The description clearly states the tool's purpose: to build a validated LINE Template message (card message) and return JSON for use with line_send_message. It emphasizes it is design-only and never calls the LINE API, distinguishing it from sibling tools like line_send_message that actually send messages.

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

Usage Guidelines4/5

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

The description explains when to use this tool: to design a card message before sending it via line_send_message. It provides explicit constraints per kind (e.g., buttons, confirm) and notes that the tool is design-only. While it contrasts with line_send_message, it does not explicitly mention other alternative methods (e.g., manual JSON construction), but the guidance is still clear.

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

line_design_flexDesign LINE Flex MessageA
Read-onlyIdempotent

Compose a validated Flex Message for line_send_message. Modes: template mode { template, data } (Thai-localized, recommended; templates: receipt, voucher, shipping_update, order_confirm, appointment_reminder, promo_simple, course_cert, thank_you); raw mode { flex_json, alt_text } (advanced); or { list_templates: true } to get the catalog with Thai descriptions + required fields per template. DESIGN ONLY — never calls the LINE API.

Feed the result to line_send_message via message.flex_json, or pass { template, data } straight to line_send_message (same templates). Returns { flex_json, alt_text, preview_url (Flex Simulator), size_bytes, warnings[] } (warns near the 30KB bubble limit).

Example: "ออกแบบคูปอง 20% หมด 31 ส.ค." → { template:"voucher", data:{ title:"ส่วนลดวันแม่", code:"MOM20", discount:"ส่วนลด 20%", valid_until:"31 ส.ค. 2026" } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoTemplate-specific data fields. Required when template is set.
alt_textNoOptional override for altText. Defaults to a template-derived alt text.
templateNoName of a pre-built Thai-localized Flex template. See catalog below. Mutually exclusive with flex_json.
flex_jsonNoRaw Flex contents (bubble or carousel). Advanced users only. Mutually exclusive with template.
list_templatesNoSet true to return the available template catalog instead of rendering.

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, idempotentHint), the description adds rich behavioral context: it validates, never calls the LINE API, returns a structured response with preview_url, size_bytes, and warnings[], and warns about the 30KB bubble limit. It also notes Thai localization of templates. These details go well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with purpose, then modes, usage, return format, and an example. Every sentence contributes information without fluff. The length is justified by the tool's complexity, and the example aids comprehension without redundant detail.

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

Completeness5/5

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

With no output schema, the description explicitly lists the return fields (flex_json, alt_text, preview_url, size_bytes, warnings[]) and notes the 30KB limit. It explains the two modes, provides integration steps with line_send_message, and includes a Thai-language example. The only omission—detailed required fields per template—is addressed by the list_templates mode, making the description complete for practical use.

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

Parameters5/5

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

Schema coverage is 100%, providing a baseline of 3, but the description adds significant value by grouping parameters into modes (template+data, flex_json+alt_text, list_templates), reinforcing mutual exclusivity, and giving a concrete example with template data fields. This helps the agent understand parameter combinations beyond the schema's individual descriptions.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Compose a validated Flex Message for line_send_message.' It clearly distinguishes itself from siblings like line_design_imagemap and line_design_card by focusing on Flex Messages, and explicitly states 'DESIGN ONLY — never calls the LINE API,' differentiating it from line_send_message.

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

Usage Guidelines5/5

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

It provides explicit guidance on when to use each mode (template mode recommended, raw mode advanced, list_templates for catalog), and explains how to integrate with line_send_message via message.flex_json or direct template/data passthrough. The 'DESIGN ONLY' note clarifies that this tool is not for sending, addressing when-not-to-use.

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

line_design_imagemapDesign LINE Imagemap (Rich Message)A
Read-onlyIdempotent

Build a validated Imagemap message (LINE OA Manager calls it a "Rich Message") and return it as JSON to hand to line_send_message via message.message_json. DESIGN ONLY — never calls the LINE API.

Image hosting — two paths: (1) RECOMMENDED: run line_prepare_image first and pass its prepared_key here (hosting + the 5 size variants + verification all handled; base_height auto-derived). (2) Self-hosted: pass base_url of a public HTTPS host serving ${base_url}/1040, /700, /460, /300, /240 (LINE has NO upload API) plus base_height. Canvas width is always forced to 1040; all area coordinates are px on that 1040-wide canvas and must fit inside 1040 × base_height. Optional video area supported.

Returns { message, usage_hint }.

Example (prepared): "ส่งรูปนี้เป็น Rich Message ครึ่งบน-ครึ่งล่าง" → line_prepare_image first, then { prepared_key:"ab12…", alt_text:"โปรเดือนนี้", areas:[{bounds:{x:0,y:0,width:1040,height:520},action:{type:"uri",uri:"https://shop.example.com/a"}},{bounds:{x:0,y:520,width:1040,height:520},action:{type:"uri",uri:"https://shop.example.com/b"}}] }. Example (self-hosted): same but { base_url:"https://cdn.example.com/promo", base_height:1040 } instead of prepared_key.

ParametersJSON Schema
NameRequiredDescriptionDefault
areasYesAt least 1 tappable area. Bounds are px on the 1040-wide base; must stay in bounds.
videoNoOptional inline video that plays over part of the image.
alt_textYesFallback text shown when the image can't render (≤400 chars).
base_urlNoSelf-hosting path: HTTPS base URL of a pre-hosted image set. LINE requests /1040 /700 /460 /300 /240 from it. Use line_prepare_image + prepared_key instead if the user has no host.
base_heightNoImage height in px WHEN the width is 1040. REQUIRED with base_url; ignored with prepared_key (auto-derived).
prepared_keyNoRECOMMENDED path: key from line_prepare_image (purpose 'imagemap'). base_url and base_height are filled in automatically from the prepared image.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark this as read-only and idempotent, but the description adds substantial behavioral detail beyond that: 'never calls the LINE API,' returns a { message, usage_hint } shape, validates the output, forces canvas width to 1040, and explains the hosting behavior with LINE's lack of upload API. It fully discloses the tool's side-effect-free, design-only nature and its integration with image preparation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but well-structured, opening with the core purpose, then hosting paths, constraints, return value, and examples. It front-loads the most critical info (design-only, never calls API) and includes two examples that are compact and illustrative. Some repetition with schema details exists (e.g., the /1040 size variants), but the examples and flow explanation justify the length.

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

Completeness5/5

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

This is a complex tool with two hosting modes, coordinate constraints, optional video, and integration with other tools. The description covers all of these, including the return value shape (not provided by any output schema), the recommended workflow via line_prepare_image, and the fact that LINE has no upload API. It is complete enough for an agent to select and invoke the tool correctly without missing context.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond individual field docs by explaining the relationship between prepared_key and base_url/base_height, the two mutually exclusive hosting paths, and the coordinate system (all px on a 1040-wide canvas). The illustrative example shows how to combine alt_text, areas, and either prepared_key or base_url, giving the agent a concrete usage template.

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

Purpose5/5

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

The description states a specific verb and resource: 'Build a validated Imagemap message' and 'return it as JSON to hand to line_send_message via message.message_json.' It clearly distinguishes itself from siblings like line_send_message and line_design_flex by noting it only designs and never sends. This makes the tool's purpose unambiguous and distinct.

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

Usage Guidelines5/5

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

The description offers explicit guidance on when to use this tool vs alternatives: it says 'DESIGN ONLY — never calls the LINE API,' implying sending should go through line_send_message. It also gives a recommended vs self-hosted path, explicitly telling the agent to run line_prepare_image first when possible, and when to choose base_url instead. This is clear, actionable usage context.

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

line_design_rich_menu_imageDesign Rich Menu Image (Rich Menu Studio)A

Design a professional LINE rich menu PNG from labels alone — pure-JS renderer with Thai typography (LINE Seed / Prompt / Noto), then optionally deploy to LINE in the same call. No design tool or headless browser.

ALWAYS preview first: mode="preview" (default) returns the PNG as an image block — LOOK at it, iterate with the user, then call again mode="deploy". mode="save" writes the PNG to disk.

Templates (cells filled in reading order; tap areas auto-derived from the same geometry, pixel-perfect):

  • grid_6 (2500x1686, 6 cells): 3×2 grid, 6 equal cells — the classic LINE OA menu

  • grid_4 (2500x1686, 4 cells): 2×2 grid, 4 large cells

  • hero_top_3 (2500x1686, 4 cells): full-width hero banner on top + 3 cells below

  • hero_left_2 (2500x1686, 3 cells): left-half hero + 2 stacked cells on the right

  • split_2 (2500x1686, 2 cells): two tall vertical halves

  • full_1 (2500x1686, 1 cells): one full-canvas cell (single campaign banner)

  • compact_3 (2500x843, 3 cells): compact 1×3 row

  • compact_2 (2500x843, 2 cells): compact 1×2 row

  • compact_1 (2500x843, 1 cells): compact single full-width cell

cells[] length MUST equal the template's cell count; per-cell action is required only for deploy. brand auto-corrects label contrast for readability. deploy needs deploy:{ name, set_default?, alias? } and auto-deletes the orphaned menu on any post-create failure; LINE caps the PNG at <1MB (gradients auto-flatten to solid once).

Returns preview → PNG image block + { width, height, bytes, template, font_used, warnings[] }; deploy → { rich_menu_id, areas_count, set_default, alias? }.

Example: "ทำเมนูร้านกาแฟ 6 ปุ่ม สีเขียว" → { template:"grid_6", brand:{primary:"#06C755"}, cells:[{label:"สั่งเลย", icon_emoji:"☕", action:{type:"uri", uri:"https://shop.line.me/@cafe"}}, ...5 more] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOA id (multi-OA). Omit to use active OA.
modeNopreview (default) returns the PNG for inspection; save writes it; deploy goes live.preview
sizeNoOptional; defaults to the template's native size (large templates → 2500x1686, compact_* → 2500x843). Errors if it contradicts the template.
brandNoBrand kit. Omit for the tasteful default palette.
cellsYesOne entry per template cell, in reading order (left→right, top→bottom)
deployNoRequired when mode='deploy'.
templateYesLayout template. grid_6 is the classic 3×2 LINE OA menu.
output_pathNosave mode: where to write the PNG. Default ./rich-menu-<template>.png
chat_bar_textNoChat-bar button label (≤14 chars). Default "เมนู".

TDQS

A5/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond the annotations: 'auto-deletes the orphaned menu on any post-create failure', 'LINE caps the PNG at <1MB (gradients auto-flatten to solid once)', and 'brand auto-corrects label contrast for readability'. These are important for an agent to understand side effects and constraints. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear overview, workflow steps, template table, important notes, and an example. It is concise without being terse, and every sentence adds value. There is no repetition of schema information that is already clear from the input schema.

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

Completeness5/5

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

Given the tool's complexity (9 parameters, nested objects, multiple modes, no output schema), the description is remarkably complete. It covers all modes, templates, parameter relationships, deployment behavior, and return values. The example at the end ties everything together, leaving no significant gaps.

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

Parameters5/5

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

While schema coverage is 100%, the description adds significant meaning: template enumeration with visual descriptions (e.g., '3×2 grid, 6 equal cells — the classic LINE OA menu'), explanation that cells[] length must equal template's cell count, and that per-cell action is required only for deploy. The example further clarifies usage. This goes well beyond the schema.

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

Purpose5/5

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

The tool's purpose is clearly stated: 'Design a professional LINE rich menu PNG from labels alone'. It distinguishes itself from sibling tools by explaining it is a pure-JS renderer requiring no design tool or headless browser, and mentions optional deployment. The description makes it easy to understand what the tool does and how it differs from related tools like line_build_rich_menu or line_upload_rich_menu_image.

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

Usage Guidelines5/5

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

Explicit workflow guidance is given: 'ALWAYS preview first: mode="preview" (default) returns the PNG as an image block — LOOK at it, iterate with the user, then call again mode="deploy"'. It also explains when to use save mode and deploy mode, and provides template descriptions. This helps the agent decide when and how to invoke the tool.

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

line_estimate_send_costEstimate LINE send costA
Read-onlyIdempotent

Estimate how many quota messages a planned send will consume, without sending. Useful before confirmation, especially for narrowcast/broadcast. target uses the same shapes as line_send_message; message_count (1-5, default 1) — LINE charges message_count × recipients. Recipients are exact for user_id(s), looked up for a numeric audience, and unknown for filter/everyone (recommends a line_send_message dry_run instead).

Returns { estimated_recipients?, estimated_cost_messages?, quota, cost_share_percent?, notes[] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
targetYes
message_countNoNumber of messages in the send (LINE counts each message in a batch). Default 1.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds meaningful behavioral details: it explains the cost formula (message_count × recipients), how recipient counts are derived for different target types, and that results are unknown for filter/everyone. This goes beyond the annotations without contradicting them, though it omits potential edge cases like quota exhaustion behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three well-structured sentences that front-load the primary purpose. Each sentence adds value: the first states what it does, the second explains the key input semantics, the third discloses output format. No word is wasted, and the formatting is easily scannable.

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

Completeness5/5

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

The description covers the essential aspects: purpose, usage context, parameter nuances, and return format. It even mentions the recommended alternative for a specific case. Given the rich schema for target and the explicit output shape, the description is fully adequate for the tool's complexity. Sibling tools are effectively differentiated.

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

Parameters4/5

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

Schema coverage is low (33%), but the description compensates significantly. It explains that 'target uses the same shapes as line_send_message' and clarifies the semantic meaning of message_count ('LINE charges message_count × recipients'). It also describes how the target type affects the accuracy of recipient estimation. The 'oa' parameter is not explained, but the description still adds substantial meaning beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Estimate how many quota messages a planned send will consume, without sending.' It clearly distinguishes itself from the related sibling line_send_message, which actually sends messages. The purpose is unambiguous and includes the key qualifier that it is for estimation only.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool ('before confirmation, especially for narrowcast/broadcast') and when not to ('without sending'). It also provides an alternative for an unsupported case: for filter/everyone targets, it recommends line_send_message dry_run instead. This gives the agent clear decision criteria.

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

line_find_stickerFind LINE sticker by mood/keywordA
Read-onlyIdempotent

Find LINE stickers from a curated catalog by mood or keyword (Thai or English). Bots may only send stickers from LINE's limited official list, so this picks by intent ("celebration", "ขอบคุณ", "sorry") instead of guessing IDs. Pass the chosen package_id + sticker_id to line_send_message via message.sticker.

Returns { query, count, stickers:[{ package_id, sticker_id, moods, keywords_th, keywords_en, description }] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYesMood or keyword (Thai or English). Examples: "ขอบคุณ", "celebration", "sorry", "ดีใจ".
response_formatNomarkdown

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint=true and destructiveHint=false. The description adds useful behavioral context beyond annotations: the curated catalog scope, the limitation to LINE's official sticker list, and the return object shape. No contradiction with annotations is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise and front-loaded: the first sentence states the core purpose, the second adds usage context, and the third provides the return structure. There is no filler or redundant repetition of schema fields, making every sentence valuable.

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

Completeness4/5

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

Despite lacking an output schema, the description provides the exact return shape and integration guidance with line_send_message, covering the main invocation context. The only notable gap is the lack of detail about 'limit' and 'response_format' behavior, but the tool is otherwise sufficiently described for selection and invocation.

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

Parameters3/5

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

Schema description coverage is 33%, with only 'query' having a schema description. The description reinforces query semantics with Thai/English examples and intent-based matching, but it does not explain 'limit' or 'response_format', both of which lack schema descriptions. It partially compensates but leaves parameter behavior under-specified.

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

Purpose5/5

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

The description clearly states the tool's action: 'Find LINE stickers from a curated catalog by mood or keyword.' It specifies the resource (LINE stickers) and distinguishes itself from sibling tools by emphasizing intent-based selection and returning package_id/sticker_id for use with line_send_message, which no other sibling tool does.

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

Usage Guidelines4/5

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

The description explains when to use the tool ('Bots may only send stickers from LINE's limited official list, so this picks by intent... instead of guessing IDs') and the next step ('Pass the chosen package_id + sticker_id to line_send_message via message.sticker'). It does not explicitly list alternative tools or exclusions, but no sticker-search sibling exists, so the context is clear.

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

line_get_coupon_statsGet LINE coupon redemption statsA
Read-onlyIdempotent

Read available stats for a LINE coupon. LINE has no dedicated redemption endpoint, so this combines signals: raw coupon detail (some accounts include usage inline) plus, if you pass click_audience_id, the click-audience size as a clickthrough proxy. coupon_id comes from line_manage_coupon. Caveat (surfaced in notes): click-audience size approximates clickthroughs, NOT actual redemptions — for real counts build the coupon Flex with a postback action and listen via webhook.

Returns { coupon_id, raw, click_audience?, estimated_redemptions?, notes[] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
coupon_idYes
response_formatNomarkdown
click_audience_idNoOptional — if you created a click audience from the coupon broadcast, pass its id to enrich the stats with click-through count.

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses that LINE has no dedicated redemption endpoint and that the tool 'combines signals', including account-dependent behavior ('some accounts include usage inline'). It also prominently warns about the proxy nature of click-audience size, which is critical behavioral context. The description adds value beyond the annotations (readOnly, idempotent) without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but appropriately structured: purpose, mechanism, caveat, and return shape. It is longer than the minimal example but every sentence adds value, including the caveat and return object. A slight reorganization could make it more skimmable, but it remains efficient and front-loaded.

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

Completeness5/5

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

For a tool with no output schema and moderate complexity, the description is very complete. It specifies the return shape ('Returns { coupon_id, raw, click_audience?, estimated_redemptions?, notes[] }'), explains the data source, covers the caveat, and provides an alternative path for exact counts. It also links to line_manage_coupon for coupon_id, making the tool self-contained.

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

Parameters3/5

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

Schema coverage is only 25% (only click_audience_id has a description). The description adds meaning for coupon_id ('comes from line_manage_coupon') and click_audience_id ('enrich the stats with click-through count'), but it does not explain 'oa' or 'response_format', leaving gaps. Given low schema coverage, the description partially compensates but is not fully sufficient.

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

Purpose5/5

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

The description clearly states 'Read available stats for a LINE coupon' with a specific verb and resource. It distinguishes from sibling tools like line_get_message_stats by focusing on coupons, and clarifies that it provides available stats rather than true redemptions. The scope ('for a LINE coupon') is precise, and the mention of coupon_id provenance further disambiguates.

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

Usage Guidelines5/5

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

The description explicitly explains when to use the tool (to read available coupon stats) and provides a clear when-not: 'click-audience size approximates clickthroughs, NOT actual redemptions'. It offers an alternative for real counts ('build the coupon Flex with a postback action and listen via webhook') and instructs that coupon_id comes from line_manage_coupon. This meets the explicit when/when-not/alternatives criterion.

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

line_get_message_statsGet LINE message engagement statsA
Read-onlyIdempotent

Fetch per-broadcast engagement for a request_id (from a prior line_send_message): impressions, opens, clicks, CTR, and per-URL click breakdown. Caveats (in notes): ~24h data lag (stats stabilize ~T+1); below ~20 unique users LINE returns null for privacy; available only for narrowcast/multicast/broadcast, not reply or push-to-single-user.

Returns { request_id, delivered?, unique_impression?, unique_click?, ctr_percent?, per_url_clicks[], notes[] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
request_idYesrequest_id returned by a prior line_send_message (narrowcast/multicast/broadcast).
response_formatNomarkdown

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds behavioral context beyond annotations: data lag, privacy thresholds, broadcast type restrictions, and the shape of the return object. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct, with two paragraphs. The first sentence states the core purpose, and the second paragraph adds caveats. Every sentence is informative with no fluff.

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

Completeness5/5

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

Given the tool has 3 params, no output schema, and annotations indicate safe read-only operation, the description covers all necessary aspects: what it does, the return object structure, important caveats (lag, privacy, broadcast types). It is complete for an agent to decide and invoke correctly.

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

Parameters3/5

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

Schema coverage is low (33%), but the description reinforces the meaning of request_id and its broadcast type requirement. It does not explain oa or response_format beyond what schema provides. Overall, the description adds moderate value to param understanding, but could be more explicit about optional parameters.

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

Purpose5/5

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

The description clearly states it fetches per-broadcast engagement stats for a request_id, listing specific metrics (impressions, opens, clicks, CTR, per-URL click breakdown). It distinguishes from siblings by specifying it's for a prior line_send_message, which is unique among the listed LINE tools.

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

Usage Guidelines5/5

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

The description provides explicit caveats: ~24h data lag, stats stable at T+1; returns null for privacy below ~20 users; only for narrowcast/multicast/broadcast. It also directs to use request_id from a prior line_send_message. This gives clear when-to-use and when-not-to-use context.

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

line_get_narrowcast_progressGet LINE Narrowcast ProgressA
Read-onlyIdempotent

Poll the delivery progress of an async narrowcast (GET /v2/bot/message/progress/narrowcast). Narrowcast runs in the background — the send returns a request_id and this reports how far it got. Pass that request_id.

Returns { request_id, phase (waiting|sending|succeeded|failed), status_text, success_count?, failure_count?, target_count?, error_code?, accepted_time?, completed_time? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOptional OA id; defaults to active OA.
request_idYesThe narrowcast request id returned by a prior narrowcast send.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark it read-only, open-world, idempotent, non-destructive. Description adds polling behavior and return phase details, confirming safe usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two well-structured sentences with front-loaded purpose, zero wasted words, includes return field sketch.

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

Completeness5/5

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

No output schema, but description compensates with a pseudo-schema of return fields and phase enum values. Fully adequate for agent invocation.

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

Parameters4/5

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

Schema coverage is 100%, so baseline 3. Description adds meaning: request_id comes from prior send, oa defaults to active OA.

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

Purpose5/5

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

Clearly states it polls delivery progress of an async narrowcast, naming the endpoint and distinguishing from sibling tools like line_send_message which initiate sends.

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

Usage Guidelines4/5

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

Implicitly instructs to use after a narrowcast send that returns a request_id. No explicit when-not-to, but the context is clear.

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

line_get_oa_reportGet LINE OA Report (multi-day digest)A
Read-onlyIdempotent

Digest of LINE OA performance over a date range — bundles 8+ Insight API calls into one Thai-friendly markdown report. range: a preset ('today'|'yesterday'|'this-week'|'last-week'|'this-month'|'last-month', default 'last-week') or { from, to } as YYYY-MM-DD. LINE insight data lags T-2 (yesterday is the latest reliable date) and is masked below the ~20-user privacy floor; demographics populate only with enough consented friends (report surfaces these in notes).

Returns { oa_id, range, delivery{total,daily[]}, followers, demographic_available, quota, notes[] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
rangeNoDate range. Preset strings or { from: 'YYYY-MM-DD', to: 'YYYY-MM-DD' }.last-week
response_formatNomarkdown

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, destructiveHint, idempotentHint), the description adds critical behavioral details: data lags T-2, a privacy floor of ~20 users, and that demographics require enough consented friends. These are not captured by annotations and significantly help an agent understand data limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, using just three sentences. It is front-loaded with the main purpose, then covers parameter details, behavioral caveats, and the return structure. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given there is no output schema, the description's outline of the return fields ('oa_id, range, delivery{total,daily[]}, followers, demographic_available, quota, notes[]') is sufficient. It also explains key data limitations. The tool has moderate complexity (3 params), and the description covers essential context for use.

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

Parameters4/5

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

The description provides rich context for the 'range' parameter, including all preset strings, default, and custom object format. This compensates for the schema's 33% description coverage. However, it does not describe the 'oa' or 'response_format' parameters, though the response_format is partially covered by mentioning markdown report and the return structure.

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

Purpose5/5

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

The description clearly states it is a 'Digest of LINE OA performance over a date range' and specifies it bundles 8+ API calls into a Thai-friendly report. This differentiates it from sibling tools like line_get_message_stats or line_list_followers, which provide individual metrics. The verb 'get' and resource 'report' are specific.

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

Usage Guidelines3/5

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

The description explains the date range parameter and its formats, including presets and custom ranges, and provides defaults. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention when not to use it. The usage is implied but not guided with exclusions or alternatives.

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

line_get_oa_statusGet LINE OA StatusA
Read-onlyIdempotent

Quick health check of a LINE OA — friend count, monthly quota usage, webhook status, and current default rich menu, aggregating 4 LINE API calls into one card. Good as the first call of a session: current quota and webhook state inform every later decision (send, schedule, switch OA).

Returns { oa, friends?, quota, webhook, default_rich_menu?, region?, health:'OK'|'WARNING'|'ERROR', warnings[] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOptional OA id from the multi-OA config. Omit to use the active/default OA.
response_formatNoOutput format. 'markdown' is human-readable; 'json' is structured.markdown

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the tool as read-only and idempotent. The description adds detail on aggregating 4 API calls and specifies the return structure with fields like health status and warnings, which provides transparency beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each serving a clear purpose: stating the tool's function, providing usage guidance, and detailing the return structure. No unnecessary words.

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

Completeness5/5

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

Despite lacking an output schema, the description provides a complete return structure and explains how the tool aggregates multiple calls. It fits well within the sibling tool set as a standalone health check.

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

Parameters3/5

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

Input schema coverage is 100% with descriptions for both parameters. The description does not add further semantic detail beyond what the schema already provides, meeting the baseline expectation.

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

Purpose5/5

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

The description clearly defines the tool as a quick health check aggregating friend count, monthly quota usage, webhook status, and current default rich menu into one call. It is distinct from sibling tools like line_get_oa_report or line_audit_user_menu, as it provides a high-level status overview.

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

Usage Guidelines4/5

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

The description explicitly recommends using it as the first call of a session because quota and webhook state inform later decisions. It gives clear context but does not list specific exclusions or alternatives.

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

line_get_user_profileGet LINE User ProfileA
Read-onlyIdempotent

Fetch a LINE user's profile (display name, picture, status message, language) by user_id. Only works if the user has added the bot, has not blocked it, and consented to share profile — any failure returns an ambiguous 404, surfaced as a clear Thai explanation.

Returns { user_id, display_name, picture_url?, status_message?, language? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
user_idYesLINE user ID (starts with 'U' for chat users)
response_formatNomarkdown

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds failure behavior context (ambiguous 404) and return structure, going beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose, second states usage conditions and return type. No wasted words, information is front-loaded.

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

Completeness3/5

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

Describes return shape and failure behavior, but does not explain the 'oa' and 'response_format' parameters. With 3 parameters and no output schema, the description should cover all parameters to avoid confusion.

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

Parameters2/5

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

Schema coverage is 33% (only user_id described in schema). The description mentions user_id but adds no new info beyond the schema. Two parameters (oa, response_format) are not addressed in the description, leaving their purpose unclear.

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

Purpose5/5

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

The description clearly states 'Fetch a LINE user's profile' with specific fields (display name, picture, etc.). The tool is distinct from siblings which are about rich menus, sending messages, and other LINE management tasks.

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

Usage Guidelines4/5

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

Explicitly states conditions: user must have added the bot, not blocked it, and consented. Also explains failure behavior (404 returned as Thai explanation). Does not name direct alternatives, but sibling tools are clearly different.

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

line_image_host_statusImage hosting status (providers, tunnel, store)A
Read-onlyIdempotent

Report the Image Hosting Layer's current state: which provider line_prepare_image would use (self / local-tunnel / handoff), whether a cloudflared tunnel is live (URL + expiry), how the cloudflared binary would be obtained, and in-memory store usage. READ-ONLY — never starts a tunnel or downloads anything.

Use when line_prepare_image fell back to handoff, a verify failed, or the user asks "why can't it host automatically?". Returns { providers, tunnel, store }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable context beyond annotations by explicitly stating 'READ-ONLY — never starts a tunnel or downloads anything', reinforcing the safety profile and disclosing the specific side effects it avoids. It also outlines the return shape ({ providers, tunnel, store }). This is more than minimal, though it stops short of deep behavioral details like error scenarios.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise paragraphs, with the first paragraph front-loading the purpose and components, and the second providing usage guidance and return shape. Every sentence carries informational weight; there is no redundant or filler content. It is efficiently structured.

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

Completeness4/5

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

For a read-only status tool with no parameters and no output schema, the description covers the necessary essentials: what state it reports, when to use it, and the top-level return keys. It could optionally detail the nested structure of providers/tunnel/store, but the absence of an output schema makes the current level of detail acceptable. The sibling context and annotations round out the completeness.

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

Parameters4/5

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

The tool has zero parameters, so the schema coverage is trivially 100%. Per the guidelines, a baseline of 4 is appropriate. The description does not need to explain parameters; it instead focuses on what the tool inspects and returns, adding value beyond the empty schema.

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

Purpose5/5

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

The description opens with a specific verb-resource pair: 'Report the Image Hosting Layer's current state'. It enumerates concrete components (provider, tunnel, store) and explicitly names the sibling tool line_prepare_image, distinguishing this diagnostic tool from the action-oriented prepare tool. This is a clear, unambiguous purpose.

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

Usage Guidelines5/5

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

Provides explicit trigger scenarios: 'Use when line_prepare_image fell back to handoff, a verify failed, or the user asks "why can't it host automatically?"'. This gives the agent direct guidance on when to select this tool and implicitly contrasts with line_prepare_image's role, satisfying the 'when' and 'alternatives' criteria.

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

line_list_audiencesList LINE AudiencesA
Read-onlyIdempotent

List audience groups on the OA — including ones created in LINE OA Manager UI (chat-tag, friend-path, web-traffic) that CANNOT be created via Messaging API. status: READY (usable in narrowcast now) | IN_PROGRESS (indexing, wait ~10 min) | FAILED | EXPIRED (both need recreate). Filter with status_filter (default 'all') and name_contains (case-insensitive); paginate with limit/page (default 20).

Returns { total, count, page, audiences:[{ audience_group_id, name, status, audience_count?, created, type? }], has_more }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
pageNoPage number (1-indexed).
limitNoPage size (max 100).
name_containsNoOptional substring filter on audience name (case-insensitive).
status_filterNoFilter audiences by readiness status. Default 'all'.all
response_formatNomarkdown

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds significant behavioral detail: it explains status meanings (READY usable, IN_PROGRESS wait ~10 min, FAILED, EXPIRED need recreate) and how filtering/pagination works. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized, starting with the tool's core purpose, then statuses, filters, and return format. Every sentence adds value with no filler. The structure is logical and easy to parse.

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

Completeness4/5

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

The description covers filtering, pagination, status meanings, and the response structure (shows JSON-like format). However, it does not explain the 'oa' parameter (which OA to use) or the 'response_format' parameter (though the response structure is shown). With no output schema, the description does a good job but could be more explicit about input parameters.

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

Parameters4/5

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

Schema description coverage is 67% (4 of 6 parameters have descriptions). The description adds meaning for status_filter (enum values clarified) and name_contains (case-insensitive), and explains pagination via limit/page. However, the 'oa' parameter is not explained in either schema or description, which is a gap. Overall, it adds useful context beyond the schema.

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

Purpose5/5

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

The description clearly states the tool lists audience groups on the OA, including those created via OA Manager UI. It distinguishes from siblings by noting that some audiences (chat-tag, friend-path, web-traffic) cannot be created via Messaging API, which differentiates this list-only tool from audience creation tools.

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

Usage Guidelines4/5

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

The description provides context on when to use this tool (listing audiences, including those from OA Manager) and explains filtering by status and name. However, it does not explicitly state when not to use it or suggest alternative tools for creation or deletion, leaving some ambiguity for an AI agent.

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

line_list_followersList LINE OA followersA
Read-only

Page through every user that has added the OA as a friend. Region-gated: only TH/JP/TW OAs on premium tier — others get LINE 403. page_size 1-1000 (default 300); continuation_token for cursor pagination. For very large OAs (50k+), prefer an engagement audience via line_build_audience_from_engagement over pulling all IDs.

Returns { user_ids[], count, has_more, next_continuation_token? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
page_sizeNo
response_formatNomarkdown
continuation_tokenNoToken returned by a prior call to page through more results.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, destructiveHint), the description discloses region-gating, pagination with continuation_token, page_size limits, and the return format. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise: three sentences that front-load the main action, cover gating, pagination details, and alternatives. No wasted words.

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

Completeness5/5

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

Complete coverage for a paginated read tool: purpose, when to use, region/tier restrictions, pagination mechanics, return shape (JSON object), and alternative tool. No output schema needed given the description.

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

Parameters3/5

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

The schema has only 25% description coverage. The description adds useful info for page_size and continuation_token, but the 'oa' parameter is not described, and the response_format default ('markdown') conflicts with the described return format (JSON object). Partial compensation.

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

Purpose5/5

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

The description clearly identifies the tool's purpose with a specific verb ('page through') and resource ('every user that has added the OA as a friend'). It distinguishes from siblings by mentioning an alternative for large OAs and specifying region/tier restrictions.

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

Usage Guidelines5/5

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

Explicit guidance on when to use this tool vs. alternatives: 'For very large OAs (50k+), prefer an engagement audience via line_build_audience_from_engagement over pulling all IDs.' Also notes region and tier gates.

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

line_list_oasList LINE OAs configuredA
Read-onlyIdempotent

List all LINE Official Accounts available to this MCP instance (from the multi-OA config file, or single-OA env mode). Call before line_use_oa to discover OA IDs.

Returns { active_oa, oas:[{ id, display_name?, region?, is_premium?, is_active }] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNomarkdown

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, confirming no destructive side effects. The description adds context about the data source (config file or env mode) and the return structure (active_oa, oas array with fields), going beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences plus a line showing return format. It is front-loaded with the core purpose and usage hint, with no wasted words.

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

Completeness4/5

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

Given there is no output schema, the description includes a return structure, which is helpful. It also explains the data source. For a simple list tool with one optional parameter, it is reasonably complete, though it could mention that response_format controls output style.

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

Parameters2/5

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

The only parameter, response_format, is self-explanatory from the schema (enum with default). However, with 0% schema description coverage, the description should compensate by explaining its effect, but it does not mention the parameter at all. The agent must rely solely on the schema, which is sufficient but not enhanced.

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

Purpose5/5

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

The description clearly states the tool lists all LINE Official Accounts available to the MCP instance, specifying the context (multi-OA or single-OA mode). It distinguishes itself from siblings by indicating it should be called before line_use_oa to discover OA IDs.

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

Usage Guidelines4/5

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

The description explicitly advises to call this tool before line_use_oa to discover OA IDs, providing clear when-to-use guidance. However, it does not mention when not to use it or alternatives, preventing a higher score.

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

line_list_rich_menusList LINE Rich MenusA
Read-onlyIdempotent

List all rich menus on an OA and identify the account-wide default. OAs hold up to 1,000 rich menus — run this before line_build_rich_menu to avoid the cap, and line_delete_rich_menu to clean up.

Returns { total, default_id?, rich_menus:[{ rich_menu_id, name, chat_bar_text?, size?, is_default, is_selected }] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
response_formatNomarkdown

TDQS

A4/5.0
Behavior4/5

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

Annotations already confirm read-only, idempotent, and non-destructive nature. Description adds return structure and cap warning, providing additional behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: purpose, usage guidance, return format. Front-loaded with the verb, resource, and key details. No redundancy or fluff.

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

Completeness3/5

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

Covers purpose, usage, and return format adequately for a list tool, but lacks parameter-level descriptions (oa, response_format). Without an output schema, the return format description helps, but parameter ambiguities reduce completeness.

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

Parameters2/5

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

Schema has 0% description coverage. Description does not explain the 'oa' parameter or the 'response_format' parameter, leaving their semantics unclear. The return structure description indirectly implies output, but parameters are not elucidated.

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

Purpose5/5

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

The description clearly states the verb 'list' and the resource 'rich menus on an OA' and adds the specific task of identifying the default. It distinguishes from sibling tools like line_delete_rich_menu and line_build_rich_menu.

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

Usage Guidelines4/5

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

Provides explicit guidance: run before line_build_rich_menu to avoid the 1,000 cap and before line_delete_rich_menu to clean up. Does not include exclusions or when not to use, but context is clear.

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

line_manage_couponManage LINE OA couponsA

Coupon CRUD on a LINE OA (POST /v2/bot/coupon). modes: create (maps friendly inputs to LINE's schema — dates to UNIX seconds, visibility, etc.), list, get (by coupon_id), discontinue (ends a live coupon; irreversible — requires confirm=true). Deliver a created coupon via line_send_message message.coupon_id. Rate limit: shared 200 req/sec bucket with multicast.

create data: title (≤60, required); discount_type 'percentage'(default)|'fixed'|'explicit' with discount_value (or price_before/price_after for explicit); valid_from/valid_to accept UNIX seconds | 'YYYY-MM-DD' | ISO; visibility PUBLIC|UNLISTED (default UNLISTED); acquisition_type normal|lottery.

Example: "Early Bird ลด 20% 1–8 มิ.ย." → { mode:"create", data:{ title:"Early Bird", discount_type:"percentage", discount_value:20, valid_from:"2026-06-01", valid_to:"2026-06-08", coupon_code:"EARLYBIRD" } }. "ปิด coupon C123" → { mode:"discontinue", coupon_id:"C123", confirm:true }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
dataNoRequired for mode='create'.
modeYescreate: make a new coupon; list: list all coupons; get: fetch one; discontinue: end one (irreversible).
confirmNoRequired true for mode='discontinue'.
coupon_idNoRequired for mode='get' or 'discontinue'.
response_formatNomarkdown

TDQS

A4.2/5.0
Behavior1/5

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

Description states discontinue is 'irreversible' and requires confirm, but annotations have destructiveHint=false. This contradiction creates confusion for the agent, resulting in a score of 1 per evaluation rules.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with bullet points and examples; every sentence adds value without redundancy. Front-loaded with core purpose and modes, then details and examples logically follow.

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

Completeness5/5

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

Covers all key aspects: modes, parameter details, side effects (irreversible), rate limit, integration with sibling tools, and includes examples for common use cases. No gaps despite lack of output schema.

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

Parameters5/5

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

Adds significant meaning beyond the input schema: explains default discount type, required fields for explicit mode, date format handling, and provides concrete examples that map friendly inputs to API expectations.

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

Purpose5/5

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

Description explicitly states 'Coupon CRUD on a LINE OA' and enumerates four modes (create, list, get, discontinue), distinguishing it from sibling tools that handle rich menus, audiences, or messaging.

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

Usage Guidelines5/5

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

Provides clear guidance on when to use each mode, includes an example for discontinue requiring confirm, and directs to line_send_message for delivery, effectively differentiating from alternatives.

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

line_manage_liff_appManage LIFF appsA

LIFF app lifecycle CRUD. modes: create (needs config.view {type,url}), list, update (liff_id + partial config), delete (liff_id + confirm=true). Auth note: LIFF Server API uses LINE Login channel tokens; this uses the same Messaging API token — for separate-channel setups see docs.

Example: "สร้าง LIFF tall https://my.app" → { mode:"create", config:{ view:{ type:"tall", url:"https://my.app" } } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
modeYes
configNoRequired for create. Partial for update.
confirmNo
liff_idNoRequired for update / delete.

TDQS

A4.3/5.0
Behavior4/5

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

The description adds valuable behavioral context beyond the annotations: mode-specific parameter requirements, the confirm guard for delete, and the auth token limitation. It does not describe return values or error semantics, but at least it flags the confirm requirement and token ownership issue.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose. It lists modes, highlights key requirements, includes an auth note, and ends with a concrete example. Each sentence adds value without redundancy.

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

Completeness3/5

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

The description covers mode mechanics and parameter requirements, but lacks any mention of return values or response format, which is significant given there is no output schema. It also does not explain the optional 'oa' parameter or behavior when omitted, leaving some gaps for a complex CRUD tool.

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

Parameters4/5

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

With only 40% schema coverage, the description compensates by mapping each mode to its required parameters (e.g., create requires config.view, update requires liff_id + partial config, delete requires liff_id + confirm=true). The concrete example further clarifies how config maps to a real request.

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

Purpose5/5

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

The description explicitly states 'LIFF app lifecycle CRUD' and enumerates all four modes (create, list, update, delete) with specific parameter requirements. This clearly distinguishes it from other LINE management tools that handle rich menus, audiences, or messages.

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

Usage Guidelines4/5

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

The description gives clear context for each mode, specifying required parameters (e.g., 'create needs config.view {type,url}', 'delete (liff_id + confirm=true)') and includes an auth caveat for separate-channel setups. It does not explicitly reference alternative tools, but the mode guidance is sufficiently actionable.

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

line_manage_rich_menu_aliasManage LINE rich menu aliases (tab switching)A

Rich menu alias CRUD. Aliases power tab-switching rich menus: a 'richmenuswitch' action references a richMenuAliasId, and repointing that alias at a different rich menu swaps the displayed panel instantly — no per-user re-linking. modes: create (bind alias_id→rich_menu_id), update (repoint), delete (removes alias, not the underlying menu), get, list. alias_id required except for list; rich_menu_id required for create/update.

Returns create/update/delete → { mode, alias_id, rich_menu_id? }; get → { richMenuAliasId, richMenuId }; list → { aliases[] }.

Example: "เปลี่ยน alias tab-a ไปที่ R456" → { mode:"update", alias_id:"tab-a", rich_menu_id:"R456" }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOptional OA id; defaults to active OA.
modeYescreate: bind a new alias→menu; update: repoint an alias to another menu; delete: remove an alias; get: fetch one; list: list all.
alias_idNoThe rich menu alias ID. Required for all modes except 'list'.
rich_menu_idNoRich menu ID the alias points to. Required for mode='create' and 'update'.

TDQS

A4.6/5.0
Behavior5/5

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

The description adds significant context beyond annotations: it explains the tab-switching mechanism, that delete only removes the alias not the menu, and that create/update require rich_menu_id. It also clarifies the non-idempotent nature (modify) and does not contradict 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections for modes, parameters, return values, and an example. It is slightly verbose but every sentence adds value. The use of Thai example is helpful but could be omitted for brevity.

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

Completeness5/5

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

Given the tool's complexity (4 parameters, 5 modes) and no output schema, the description fully covers the return format for each mode and provides a complete example. It leaves no major gaps for an AI agent to understand invocation and expected outcomes.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds meaning by stating parameter rules (alias_id required except list, rich_menu_id required for create/update) and explaining the role of each mode. It also clarifies that 'oa' is optional and defaults to active OA.

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

Purpose5/5

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

The description clearly states it manages rich menu aliases for tab-switching, with specific verb+resource (CRUD on aliases). It distinguishes from sibling tools by focusing on alias management rather than menu building or linking.

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

Usage Guidelines4/5

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

The description explains when to use each mode (create, update, delete, get, list) and specifies required parameters per mode. It provides practical guidelines but does not explicitly contrast with sibling tools for when-not-to-use.

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

line_prepare_imagePrepare an image for LINE (resize + host + verify)A

Make any image sendable to LINE with ZERO hosting knowledge: resizes to the imagemap widths (1040/700/460/300/240), hosts them via the best available provider, HEAD-verifies every size, and returns a prepared_key that line_design_imagemap / line_send_message accept directly.

Provider chain (auto-selected, user never configures): self (HTTP deployments with MCP_PUBLIC_URL) → local-tunnel (default for stdio installs; free cloudflared quick tunnel, outbound-only so it works behind NAT) → handoff (a zip + Thai step-by-step manual instructions — nobody dead-ends).

Why this exists: LINE has no upload API for message images; they must sit on public HTTPS. IMPORTANT (live-verified 2026-07-31): LINE fetches the image when each recipient FIRST VIEWS the message — NOT at send time. Keep this MCP process (and the machine) running until most recipients have opened the message; once viewed, LINE's cache serves the image permanently (survives host shutdown and even device restarts). Default keep-alive: 24h.

Returns { prepared_key, provider, base_url?, image_url?, preview_image_url?, verified, expires_at?, handoff?, warnings }. NEVER claims false success: every returned URL was verified reachable; if verification fails (e.g. the network blocks the tunnel), the tool automatically tears the tunnel down and returns the handoff package instead.

Example: "ส่งรูปนี้เป็น Rich Message" → 1) line_prepare_image { image: { file_path: "/Users/me/promo.png" } } → 2) line_design_imagemap { prepared_key, alt_text, areas } → 3) line_send_message { message: { message_json } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
imageYesThe source image. Provide EXACTLY ONE of file_path | base64 | source_url.
purposeNo"imagemap" (default) = Rich Message with tappable areas (needs 5 hosted sizes). "image_message" = plain image bubble (needs full + preview).imagemap
keep_alive_hoursNoHow long to keep the hosting alive (default 24h). Must cover the window until recipients FIRST VIEW the message (that's when LINE fetches); hosting also ends if this MCP process exits.

TDQS

A5/5.0
Behavior5/5

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

Annotations are minimal (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false). The description goes far beyond by disclosing the provider chain, auto-teardown on failure, handoff package fallback, keep-alive behavior tied to LINE's fetch-on-first-view timing, and the guarantee that 'NEVER claims false success'. This is rich, non-redundant behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section serves a purpose: a one-sentence overview, provider chain rationale, critical timing caveat, return contract, and a step-by-step example. It is well-structured with clear paragraph breaks and front-loaded with the most important information.

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

Completeness5/5

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

Despite lacking an output schema, the description fully explains the return shape (prepared_key, provider, base_url?, etc.) and failure behavior. It covers operational nuances like process lifetime, NAT traversal, and handoff instructions, making the tool actionable in real-world scenarios.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds substantial value beyond the schema: warns base64 can silently corrupt and produce blank images, recommends file_path, explains Google Drive/Dropbox link rewriting for source_url, and contextualizes keep_alive_hours against the LINE fetch timing. This genuinely helps the agent choose the right input.

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

Purpose5/5

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

The description opens with a specific verb + resource: 'Make any image sendable to LINE with ZERO hosting knowledge' and details the exact pipeline (resize, host, verify, return prepared_key). It clearly distinguishes this tool from sibling tools like line_design_imagemap and line_send_message, which consume the prepared_key.

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

Usage Guidelines5/5

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

Provides explicit usage context: the tool exists because LINE lacks an upload API, and gives a concrete workflow example (ส่งรูปนี้เป็น Rich Message → prepare → design → send). It names the downstream tools that accept prepared_key, effectively guiding when to use this vs alternatives.

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

line_run_on_many_oasRun a tool across many LINE OAsA
Read-onlyIdempotent

Agency feature — run any read-only line_* tool across many OAs in parallel; per-OA errors are isolated (one bad token doesn't break the run). tool must be one of the supported read-only tools below; oa_ids an array or 'all' (default); parallel concurrency 1-10 (default 5).

Supported tools:

  • line_get_oa_status

  • line_get_oa_report

  • line_list_audiences

  • line_list_rich_menus

  • line_test_webhook

Returns { tool, count_ok, count_failed, results[], errors[] }.

Example: "เช็คสถานะทุก OA" → { tool:"line_get_oa_status", oa_ids:"all" }.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolYesRead-only tool to run across all selected OAs. Write tools (send/build/delete) are not supported in bulk mode for safety.
oa_idsNoEither an array of OA ids or 'all' to use every configured OA. Default 'all'.all
parallelNoMax concurrent OAs (1-10). Default 5.
response_formatNomarkdown

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses key behaviors: error isolation per OA, parallel concurrency limits, and return structure. These go beyond the annotations, which already declare read-only and idempotent. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and an example, but it is slightly verbose. It front-loads the main action and key constraints, making it easy to parse.

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

Completeness5/5

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

Given the tool complexity (4 parameters, no output schema), the description covers purpose, parameters, behavior, return format, and example. It is self-contained and aids correct invocation.

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

Parameters5/5

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

The description adds significant context to parameters: it lists supported tools, specifies defaults for oa_ids and parallel, provides concurrency range, and gives an example. Schema description coverage is 75%, but the description compensates fully.

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

Purpose5/5

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

The description clearly states the tool's purpose: run a read-only line_* tool across multiple OAs in parallel. It distinguishes from sibling tools by specifying it's a batch runner for supported read-only tools, and lists those tools explicitly.

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

Usage Guidelines4/5

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

The description explains when to use this tool (running read-only tools across many OAs) and includes an example. However, it does not explicitly advise against using it when a single OA result is needed, relying on implicit understanding that individual tools are for single OAs.

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

line_send_messageSend LINE Message (universal)A

Universal LINE sender. Auto-picks the API (reply/push/multicast/narrowcast/broadcast) from the target shape; message shape selects text/template/flex/sticker/coupon/image/video. Feed pre-built objects from line_design_imagemap/line_design_card/line_design_flex via message.message_json; native coupons from line_manage_coupon via message.coupon_id; images hosted by line_prepare_image via message.image.prepared_key (no URLs needed).

mode: send_now (default) sends immediately; draft returns a LINE OA Manager handoff package (URL + Flex JSON + steps) — use when the user wants to SCHEDULE, since the Messaging API can't schedule but the OA Manager UI can; dry_run validates + estimates cost without sending.

Safety: pre-flight /validate before spending quota; Quota Guardian blocks if projected cost >95% of remaining quota unless confirm=true; broadcast { everyone:true } requires confirm=true; quiet-hours 22:00–08:00 BKK warns unless force=true; quiet_push silences the recipient device; reply tokens expire ~1 min (falls back to a push hint).

Returns send_now → { success, transport, request_id?, recipient_count_estimated, quota, warnings[] }; draft and dry_run return their own shapes. Narrowcast needs ~24h before line_get_message_stats shows engagement.

Example: "ส่งโปรให้ผู้หญิง 25-44 กรุงเทพ" → target.filter { genders:["female"], ages:["age_25","age_30"], areas:["bangkok"] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOA id (multi-OA). Omit to use active OA.
modeNosend_now (default) sends immediately; draft returns a handoff package for LINE OA Manager UI; dry_run validates + estimates without sending.send_now
forceNoOverride quiet-hours warning (22:00–08:00 BKK). Defaults false; LINE Thai customers prefer not to be pinged at night.
targetYesWho to send to. Pick one shape: { reply_to } | { user_id } | { user_ids[] } | { audience } | { filter } | { everyone: true }
confirmNoRequired to be true when projected cost > 95% of remaining quota, or when target.everyone === true.
messageYesWhat to send. Pick one shape: { text } | { template, data } | { flex_json, alt_text } | { sticker } | { coupon_id } | { image: { original_content_url, preview_image_url } or { prepared_key } } | { video: {...} } | { message_json } (pre-built object from the design tools)
quiet_pushNoSuppress push notification on recipient device (silent send). Default false.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations are minimal (readOnlyHint=false, openWorldHint=true), so the description carries the burden and delivers: auto-pick behavior, reply token expiry, quiet-hours warnings, Quota Guardian blocking, and per-mode return shapes. This far exceeds annotation-only knowledge and sets accurate expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though long, the description is well-structured with clear sections: purpose, modes, safety, returns, and an example. Every sentence adds critical operational detail, and the key purpose is front-loaded.

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

Completeness5/5

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

Even without an output schema, the description explicitly outlines the return shape for send_now and mentions draft/dry_run shapes. It covers prerequisites, safety, error-avoidance behaviors, and downstream stats timing, making it thoroughly complete for a tool of this complexity.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description enriches parameter semantics by explaining the mapping from target shapes to API types and from message shapes to content types. It also ties confirm, force, quiet_push, and mode to real-world behaviors, adding value beyond schema descriptions.

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

Purpose5/5

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

The description opens with 'Universal LINE sender' and immediately explains the auto-pick logic for API and message type, which is specific and clear. It also differentiates from siblings by referencing line_design_*, line_manage_coupon, and line_prepare_image as inputs for this tool.

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

Usage Guidelines5/5

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

Explicitly tells when to use draft (for scheduling, because Messaging API can't schedule) versus send_now and dry_run. Includes safety guidance about quota, quiet-hours, and broadcast confirmation, plus references line_get_message_stats for narrowcast follow-up.

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

line_set_default_rich_menuSet / clear the account-wide default LINE rich menuA
Idempotent

Set or clear the OA's default rich menu — shown to every follower without a per-user menu linked (per-user links via line_link_rich_menu override it). mode 'set' (needs rich_menu_id) or 'clear'.

Returns { mode, rich_menu_id? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOptional OA id; defaults to active OA.
modeYesset: make a rich menu the account-wide default; clear: remove the default.
rich_menu_idNoRich menu ID to set as default. Required for mode='set'; ignored for clear.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate idempotentHint=true and destructiveHint=false. Description adds that setting a new default replaces the previous one (implied by 'set or clear'), but does not explicitly state that. Still sufficient for a non-destructive, idempotent operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with clear front-loading. Every sentence provides essential information without redundancy. Very efficient.

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

Completeness5/5

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

Given the tool's simplicity, good annotations, and full schema coverage, the description covers purpose, modes, prerequisites, return format, and relation to sibling tool. No gaps.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. Description adds value by clarifying mode behavior ('set' needs rich_menu_id, 'clear' ignores it) and the optionality of oa. Provides more context than schema descriptions alone.

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

Purpose5/5

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

Description clearly states the tool sets or clears the account-wide default rich menu and explains its scope (shown to every follower without per-user menu). It distinguishes from sibling line_link_rich_menu by mentioning override behavior.

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

Usage Guidelines5/5

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

Description explicitly covers both modes ('set' and 'clear') and their prerequisites (rich_menu_id required for set). It also notes that per-user links override the default, guiding when not to use this tool for per-user customization.

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

line_set_webhook_endpointSet LINE Webhook EndpointA
Idempotent

Read or write the LINE OA's webhook URL (PUT/GET /v2/bot/channel/webhook/endpoint). mode 'set' (needs endpoint: public HTTPS, ≤500 chars) or 'get'. Complements line_test_webhook — set here, then ping with line_test_webhook.

Returns { endpoint, active } (re-read after a 'set' to confirm).

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOptional OA id; defaults to active OA.
modeYesset: write a new webhook URL; get: read the currently configured one.
endpointNoRequired for mode='set'. Public HTTPS URL (must start with https://, ≤500 chars).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations indicate idempotent and non-destructive behavior. The description adds that it makes PUT/GET requests and returns { endpoint, active } after a set, which gives the agent behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. The first sentence front-loads the purpose and endpoints, and the second provides key details and a sibling reference.

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

Completeness4/5

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

Given no output schema, the description explains the return format. It covers both modes and references the sibling tool. Slight lack of error handling details, but sufficient for this simple tool.

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

Parameters4/5

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

Schema coverage is 100%, but the description reinforces constraints (HTTPS, ≤500 chars) and explains the mode parameter's effect. It adds value by clarifying the 'endpoint' requirement only for 'set'.

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

Purpose5/5

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

The description clearly states it reads or writes the webhook URL, specifies the API endpoints, and distinguishes between the two modes ('set' and 'get'). It also mentions the sibling tool line_test_webhook, providing context for its use.

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

Usage Guidelines5/5

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

Explicitly states when to use 'set' (requires a public HTTPS URL ≤500 chars) and when to use 'get'. It also explains how it complements line_test_webhook, guiding the agent on a typical workflow.

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

line_test_webhookTest LINE Webhook EndpointA
Idempotent

Ping the OA's webhook URL from LINE servers and report HTTP status + latency; LINE checks it returns 200 within timeout and that signature verification works. Use this FIRST whenever a bot stops responding, before debugging anything else. Pass override_endpoint to test a URL other than the configured one. reason surfaces LINE's result: INVALID_REPLY | UNAUTHORIZED (bad channel_secret signature) | SERVER_ERROR (5xx) | TIMEOUT (>10s) | SSL_ERROR.

Returns { success, status_code, latency_ms?, reason, configured_endpoint?, tested_endpoint }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNo
override_endpointNoTest a specific URL instead of the OA's currently configured webhook URL.

TDQS

A4.9/5.0
Behavior5/5

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

Goes beyond annotations by detailing the LINE server's verification process (200, timeout, signature), error reasons (INVALID_REPLY, UNAUTHORIZED, etc.), and timeout of 10s. Annotations only indicate idempotency and non-destructiveness; the description adds rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences plus a clear return structure line. All information is front-loaded and every sentence adds value. No redundant or vague phrasing.

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

Completeness5/5

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

Given 2 parameters, no output schema, and good annotations, the description fully covers purpose, usage, behavior, parameters, and return values. The agent can select and invoke this tool correctly without additional context.

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

Parameters4/5

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

The description explains the 'override_endpoint' parameter explicitly ('test a URL other than the configured one'). The 'oa' parameter is implied by context ('Ping the OA's webhook URL') but not defined in the description. Schema coverage is 50% due to the undocumented 'oa', so the description partially compensates.

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

Purpose5/5

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

The description clearly states it pings the OA's webhook URL and reports HTTP status and latency, with specific checks by LINE. This verb+resource combo is distinct from all sibling tools, which focus on other LINE operations.

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

Usage Guidelines5/5

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

Explicitly says 'Use this FIRST whenever a bot stops responding, before debugging anything else.' This provides clear when-to-use guidance and implies it's the initial diagnostic step. No alternative tool exists among siblings for this specific task.

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

line_update_audienceUpdate LINE AudienceA

Mutate an existing LINE audience group. modes: add_users (append user_ids) | rename (set description). audience_group_id from line_list_audiences. Only Messaging-API-created (upload) audiences accept mutation — audiences built in LINE OA Manager UI (chat-tag, friend-path, web-traffic) are read-only and LINE will reject changes.

Returns add_users → { mode, audience_group_id, added_count }; rename → { mode, audience_group_id, new_description }.

Example: "เพิ่ม 3 คนเข้า audience 12345" → { mode:"add_users", audience_group_id:12345, user_ids:["U1","U2","U3"] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOptional OA id; defaults to active OA.
modeYesadd_users: append user IDs to an existing upload audience; rename: change an audience's display name.
user_idsNoRequired for mode='add_users'. LINE user IDs to append.
descriptionNoRequired for mode='rename'. The new audience name (≤120 chars).
audience_group_idYesTarget audience group id (from line_list_audiences).

TDQS

A4.5/5.0
Behavior4/5

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

Discloses return structure per mode, example usage, and that LINE will reject non-upload audience mutations. Annotations already indicate mutation (readOnlyHint=false) and no destructiveness, so description adds context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with two paragraphs and example. Front-loaded with main purpose. Every sentence is informative, though example could be slightly more compact.

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

Completeness4/5

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

Despite no output schema, description specifies return types per mode. Covers behavioral nuances (read-only audiences) and provides example. Sufficient for agent to invoke correctly.

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

Parameters4/5

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

Schema coverage is 100%, but description adds value by linking audience_group_id to line_list_audiences, explaining required parameters per mode, and providing an example that clarifies usage patterns.

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

Purpose5/5

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

Explicitly states 'mutate an existing LINE audience group' with two specific modes. Distinguishes from sibling tools like line_list_audiences and line_delete_audience by focusing on mutation rather than listing or deletion.

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

Usage Guidelines5/5

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

Provides clear when and when-not to use: only for Messaging-API-created upload audiences; audiences from OA Manager UI are read-only. Also tells where to get the audience_group_id (from line_list_audiences).

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

line_upload_rich_menu_imageUpload / replace a LINE rich menu imageA
Idempotent

Replace the image on an EXISTING rich menu without recreating it — richMenuId, tappable areas, and per-user links are preserved. Downloads from a public HTTPS URL, validates JPEG/PNG ≤1MB, then uploads to the api-data.line.me content endpoint (the domain switch that trips up most implementations). Private/internal addresses are blocked by an SSRF guard.

Returns { rich_menu_id, uploaded, bytes }.

Example: "เปลี่ยนรูป rich menu R123" → { rich_menu_id:"R123", image_url:"https://.../banner.png" }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oaNoOptional OA id; defaults to active OA.
image_urlYesPublic HTTPS URL of the new image. Must be JPEG or PNG, ≤1MB.
rich_menu_idYesID of the existing rich menu whose image will be replaced.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds context beyond annotations: it details the download-and-upload process, the SSRF guard, the validation of JPEG/PNG and <=1MB, the domain switch, and the return format. This extra info helps an agent understand side effects and requirements, though rate limits or authentication details are omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences plus a one-line example. Every sentence is informative and earned its place. The purpose is front-loaded, and the structure is efficient with no wasted words.

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

Completeness4/5

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

Given the tool is a mutation with no output schema, the description covers key aspects: what it does, constraints (public URL, format, size), what is preserved (richMenuId, tappable areas), and the return values. The example adds practical context. It is mostly complete, though error scenarios are not addressed, but the core is well-covered.

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

Parameters3/5

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

Input schema has 100% description coverage, so each parameter is already documented. The description does not add new semantic meaning beyond what the schema provides; it only reiterates the validation rules for image_url. With full schema coverage, a score of 3 is appropriate as no extra value is contributed by the description.

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

Purpose5/5

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

The description clearly states the tool replaces the image on an existing rich menu without recreating it, preserving richMenuId, tappable areas, and per-user links. This specific verb+resource combination distinguishes it from siblings like line_build_rich_menu (which creates a new menu) and line_design_rich_menu_image (which designs images).

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

Usage Guidelines5/5

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

The description explicitly advises when to use this tool: to replace an image on an EXISTING rich menu, and implies that if you need to change layout or other aspects, you should use different tools. It also mentions the SSRF guard and domain switch, guiding users on prerequisites (public HTTPS URL, valid format and size). The example further clarifies usage.

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

line_use_oaSwitch active LINE OAA
Idempotent

Switch which OA all subsequent tool calls default to (until changed or process restart). In-memory only — does not edit config.json. oa_id from line_list_oas.

Returns { active_oa, display_name }.

ParametersJSON Schema
NameRequiredDescriptionDefault
oa_idYesOA id from line_list_oas

TDQS

A4.2/5.0
Behavior4/5

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

Annotations include idempotentHint=true and no destructive hint. Description adds that the change is only in-memory and persistent only for the session, which is valuable beyond annotations. It also specifies the return value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences clearly stating purpose and behavior, plus a return description. No unnecessary words. Front-loaded with the main action.

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

Completeness4/5

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

For a simple state-switching tool with one parameter, the description covers the action, side effects, parameter source, and return value. It is complete for the complexity level, though could note error handling briefly.

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

Parameters3/5

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

The only parameter oa_id has 100% schema coverage with a description stating it comes from line_list_oas. The tool description repeats this but adds no extra meaning. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool switches the active LINE OA for subsequent calls, using the verb 'switch' and specifying the resource 'active OA'. It distinguishes from siblings like line_list_oas which lists OAs.

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

Usage Guidelines4/5

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

The description explains when to use: to set the default OA for all following tools. It provides important context like in-memory only and the source for oa_id (from line_list_oas). Does not explicitly exclude scenarios but is clear enough.

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. Dates show when Glama detected each change.

  1. 9 tool updatesv2.2.0
    • Addedline_design_flex
    • Changedline_design_imagemap4 fields changed
      • changedInput schema / properties / base_height / description
        Previous value: -"Image height in px WHEN the width is 1040 (width is always forced to 1040)."New value: +"Image height in px WHEN the width is 1040. REQUIRED with base_url; ignored with prepared_key (auto-derived)."
      • changedInput schema / properties / base_url / description
        Previous value: -"HTTPS base URL of the pre-hosted image set. LINE requests /1040 /700 /460 /300 /240 from it. No upload API — you must host the images yourself."New value: +"Self-hosting path: HTTPS base URL of a pre-hosted image set. LINE requests /1040 /700 /460 /300 /240 from it. Use line_prepare_image + prepared_key instead if the user has no host."
      • addedInput schema / properties / prepared_key
        Added value: +{
        +  "description": "RECOMMENDED path: key from line_prepare_image (purpose 'imagemap'). base_url and base_height are filled in automatically from the prepared image.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "base_url",
        -  "alt_text",
        -  "base_height",
        -  "areas"
        -]New value: +[
        +  "alt_text",
        +  "areas"
        +]
    • Addedline_estimate_send_cost
    • Addedline_find_sticker
    • Addedline_get_coupon_stats
    • Addedline_image_host_status
    • Addedline_manage_liff_app
    • Addedline_prepare_image
    • Changedline_send_message2 fields changed
      • changedInput schema / properties / message / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "text": {
        -        "maxLength": 5000,
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alt_text": {
        -        "maxLength": 400,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "data": {
        -        "additionalProperties": {},
        -        "default": {},
        -        "type": "object"
        -      },
        -      "template": {
        -        "enum": [
        -          "receipt",
        -          "voucher",
        -          "shipping_update",
        -          "order_confirm",
        -          "appointment_reminder",
        -          "promo_simple",
        -          "course_cert",
        -          "thank_you"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "template"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alt_text": {
        -        "maxLength": 400,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "flex_json": {
        -        "additionalProperties": {},
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "flex_json",
        -      "alt_text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "sticker": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "package_id": {
        -            "type": "string"
        -          },
        -          "sticker_id": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "package_id",
        -          "sticker_id"
        -        ],
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "sticker"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "coupon_id": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "delivery_tag": {
        -        "description": "Insight path label (≤30, [A-Za-z0-9_]).",
        -        "maxLength": 30,
        -        "pattern": "^[A-Za-z0-9_]+$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "coupon_id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "image": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "original_content_url": {
        -            "description": "HTTPS JPEG/PNG, the full-size image",
        -            "format": "uri",
        -            "type": "string"
        -          },
        -          "preview_image_url": {
        -            "description": "HTTPS JPEG/PNG, the preview thumbnail",
        -            "format": "uri",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "original_content_url",
        -          "preview_image_url"
        -        ],
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "image"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "video": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "original_content_url": {
        -            "description": "HTTPS mp4, ≤200MB, host must support range requests",
        -            "format": "uri",
        -            "type": "string"
        -          },
        -          "preview_image_url": {
        -            "description": "HTTPS JPEG/PNG preview",
        -            "format": "uri",
        -            "type": "string"
        -          },
        -          "tracking_id": {
        -            "description": "Optional; fires the videoPlayComplete webhook when the user finishes the video",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "original_content_url",
        -          "preview_image_url"
        -        ],
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "video"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "message_json": {
        -        "additionalProperties": {},
        -        "description": "A complete LINE message object with a `type` field (imagemap | template | flex | text | sticker | image | video)",
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "message_json"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "text": {
        +        "maxLength": 5000,
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alt_text": {
        +        "maxLength": 400,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "data": {
        +        "additionalProperties": {},
        +        "default": {},
        +        "type": "object"
        +      },
        +      "template": {
        +        "enum": [
        +          "receipt",
        +          "voucher",
        +          "shipping_update",
        +          "order_confirm",
        +          "appointment_reminder",
        +          "promo_simple",
        +          "course_cert",
        +          "thank_you"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "template"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alt_text": {
        +        "maxLength": 400,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "flex_json": {
        +        "additionalProperties": {},
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "flex_json",
        +      "alt_text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "sticker": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "package_id": {
        +            "type": "string"
        +          },
        +          "sticker_id": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "package_id",
        +          "sticker_id"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "sticker"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "coupon_id": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "delivery_tag": {
        +        "description": "Insight path label (≤30, [A-Za-z0-9_]).",
        +        "maxLength": 30,
        +        "pattern": "^[A-Za-z0-9_]+$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "coupon_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "image": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "original_content_url": {
        +                "description": "HTTPS JPEG/PNG, the full-size image",
        +                "format": "uri",
        +                "type": "string"
        +              },
        +              "preview_image_url": {
        +                "description": "HTTPS JPEG/PNG, the preview thumbnail",
        +                "format": "uri",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "original_content_url",
        +              "preview_image_url"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "prepared_key": {
        +                "description": "Key returned by line_prepare_image (purpose 'image_message') — URLs are filled in automatically",
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "prepared_key"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      }
        +    },
        +    "required": [
        +      "image"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "video": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "original_content_url": {
        +            "description": "HTTPS mp4, ≤200MB, host must support range requests",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "preview_image_url": {
        +            "description": "HTTPS JPEG/PNG preview",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "tracking_id": {
        +            "description": "Optional; fires the videoPlayComplete webhook when the user finishes the video",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "original_content_url",
        +          "preview_image_url"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "video"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "message_json": {
        +        "additionalProperties": {},
        +        "description": "A complete LINE message object with a `type` field (imagemap | template | flex | text | sticker | image | video)",
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "message_json"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / message / description
        Previous value: -"What to send. Pick one shape: { text } | { template, data } | { flex_json, alt_text } | { sticker } | { coupon_id }"New value: +"What to send. Pick one shape: { text } | { template, data } | { flex_json, alt_text } | { sticker } | { coupon_id } | { image: { original_content_url, preview_image_url } or { prepared_key } } | { video: {...} } | { message_json } (pre-built object from the design tools)"
  2. 9 tool updatesv2.1.0
    • Addedline_build_rich_menu
    • Removedline_design_flex
    • Removedline_estimate_send_cost
    • Removedline_get_coupon_stats
    • Addedline_get_oa_report
    • Removedline_manage_liff_app
    • Addedline_manage_rich_menu_alias
    • Addedline_set_default_rich_menu
    • Addedline_upload_rich_menu_image
  3. 7 tool updatesv2.1.0
    • Removedline_build_rich_menu
    • Addedline_design_rich_menu_image
    • Removedline_find_sticker
    • Removedline_get_oa_report
    • Removedline_manage_rich_menu_alias
    • Removedline_set_default_rich_menu
    • Removedline_upload_rich_menu_image
  4. 15 tool updatesv1.1.0
    • Addedline_check_token
    • Addedline_design_card
    • Addedline_design_imagemap
    • Removedline_emit_liff_code
    • Removedline_emit_login_snippet
    • Addedline_get_narrowcast_progress
    • Addedline_link_rich_menu
    • Changedline_manage_coupon19 fields changed
      • addedInput schema / properties / data / properties / acquisition_type
        Added value: +{
        +  "enum": [
        +    "normal",
        +    "lottery"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / data / properties / barcode_image_url
        Added value: +{
        +  "format": "uri",
        +  "type": "string"
        +}
      • changedInput schema / properties / data / properties / coupon_code / maxLength
        Previous value: -20New value: +16
      • changedInput schema / properties / data / properties / description / maxLength
        Previous value: -300New value: +1000
      • addedInput schema / properties / data / properties / discount_type
        Added value: +{
        +  "description": "percentage (default) | fixed (amount off) | explicit (before→after price).",
        +  "enum": [
        +    "percentage",
        +    "fixed",
        +    "explicit"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / data / properties / discount_value
        Added value: +{
        +  "description": "Percent (1–100) when percentage; currency amount when fixed.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / data / properties / lottery_probability
        Added value: +{
        +  "maximum": 99,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / data / properties / max_acquire_count
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "type": "integer"
        +}
      • removedInput schema / properties / data / properties / max_redemptions
        Removed value: -{
        -  "exclusiveMinimum": 0,
        -  "type": "integer"
        -}
      • addedInput schema / properties / data / properties / max_use_per_ticket
        Added value: +{
        +  "description": "1 = once per user (default); -1 = unlimited.",
        +  "enum": [
        +    1,
        +    -1
        +  ],
        +  "type": "number"
        +}
      • addedInput schema / properties / data / properties / price_after
        Added value: +{
        +  "description": "Explicit only.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / data / properties / price_before
        Added value: +{
        +  "description": "Explicit only.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • removedInput schema / properties / data / properties / terms_url
        Removed value: -{
        -  "format": "uri",
        -  "type": "string"
        -}
      • addedInput schema / properties / data / properties / timezone
        Added value: +{
        +  "description": "LINE timezone enum, default ASIA_BANGKOK.",
        +  "type": "string"
        +}
      • changedInput schema / properties / data / properties / valid_from / description
        Previous value: -"ISO datetime."New value: +"UNIX seconds, 'YYYY-MM-DD', or ISO datetime."
      • changedInput schema / properties / data / properties / valid_from / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "number"
        +]
      • changedInput schema / properties / data / properties / valid_to / description
        Previous value: -"ISO datetime."New value: +"UNIX seconds, 'YYYY-MM-DD', or ISO datetime."
      • changedInput schema / properties / data / properties / valid_to / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "number"
        +]
      • addedInput schema / properties / data / properties / visibility
        Added value: +{
        +  "description": "PUBLIC = listed in LY services; UNLISTED (default) = link/broadcast only.",
        +  "enum": [
        +    "PUBLIC",
        +    "UNLISTED"
        +  ],
        +  "type": "string"
        +}
    • Addedline_manage_rich_menu_alias
    • Changedline_send_message2 fields changed
      • changedInput schema / properties / message / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "text": {
        -        "maxLength": 5000,
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alt_text": {
        -        "maxLength": 400,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "data": {
        -        "additionalProperties": {},
        -        "default": {},
        -        "type": "object"
        -      },
        -      "template": {
        -        "enum": [
        -          "receipt",
        -          "voucher",
        -          "shipping_update",
        -          "order_confirm",
        -          "appointment_reminder",
        -          "promo_simple",
        -          "course_cert",
        -          "thank_you"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "template"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alt_text": {
        -        "maxLength": 400,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "flex_json": {
        -        "additionalProperties": {},
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "flex_json",
        -      "alt_text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "sticker": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "package_id": {
        -            "type": "string"
        -          },
        -          "sticker_id": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "package_id",
        -          "sticker_id"
        -        ],
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "sticker"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "text": {
        +        "maxLength": 5000,
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alt_text": {
        +        "maxLength": 400,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "data": {
        +        "additionalProperties": {},
        +        "default": {},
        +        "type": "object"
        +      },
        +      "template": {
        +        "enum": [
        +          "receipt",
        +          "voucher",
        +          "shipping_update",
        +          "order_confirm",
        +          "appointment_reminder",
        +          "promo_simple",
        +          "course_cert",
        +          "thank_you"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "template"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alt_text": {
        +        "maxLength": 400,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "flex_json": {
        +        "additionalProperties": {},
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "flex_json",
        +      "alt_text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "sticker": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "package_id": {
        +            "type": "string"
        +          },
        +          "sticker_id": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "package_id",
        +          "sticker_id"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "sticker"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "coupon_id": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "delivery_tag": {
        +        "description": "Insight path label (≤30, [A-Za-z0-9_]).",
        +        "maxLength": 30,
        +        "pattern": "^[A-Za-z0-9_]+$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "coupon_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "image": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "original_content_url": {
        +            "description": "HTTPS JPEG/PNG, the full-size image",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "preview_image_url": {
        +            "description": "HTTPS JPEG/PNG, the preview thumbnail",
        +            "format": "uri",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "original_content_url",
        +          "preview_image_url"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "image"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "video": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "original_content_url": {
        +            "description": "HTTPS mp4, ≤200MB, host must support range requests",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "preview_image_url": {
        +            "description": "HTTPS JPEG/PNG preview",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "tracking_id": {
        +            "description": "Optional; fires the videoPlayComplete webhook when the user finishes the video",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "original_content_url",
        +          "preview_image_url"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "video"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "message_json": {
        +        "additionalProperties": {},
        +        "description": "A complete LINE message object with a `type` field (imagemap | template | flex | text | sticker | image | video)",
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "message_json"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / message / description
        Previous value: -"What to send. Pick one shape: { text } | { template, data } | { flex_json, alt_text } | { sticker }"New value: +"What to send. Pick one shape: { text } | { template, data } | { flex_json, alt_text } | { sticker } | { coupon_id }"
    • Addedline_set_default_rich_menu
    • Addedline_set_webhook_endpoint
    • Removedline_show_typing
    • Addedline_update_audience
    • Addedline_upload_rich_menu_image
  5. 27 tool updatesv1.0.2
    • First observedline_audit_user_menu
    • First observedline_build_audience_from_csv
    • First observedline_build_audience_from_engagement
    • First observedline_build_rich_menu
    • First observedline_delete_audience
    • First observedline_delete_rich_menu
    • First observedline_design_flex
    • First observedline_emit_liff_code
    • First observedline_emit_login_snippet
    • First observedline_estimate_send_cost
    • First observedline_find_sticker
    • First observedline_get_coupon_stats
    • First observedline_get_message_stats
    • First observedline_get_oa_report
    • First observedline_get_oa_status
    • First observedline_get_user_profile
    • First observedline_list_audiences
    • First observedline_list_followers
    • First observedline_list_oas
    • First observedline_list_rich_menus
    • First observedline_manage_coupon
    • First observedline_manage_liff_app
    • First observedline_run_on_many_oas
    • First observedline_send_message
    • First observedline_show_typing
    • First observedline_test_webhook
    • First observedline_use_oa

TDQS

A4.2/5.0
Disambiguation5/5

Each tool targets a specific LINE OA operation with no functional overlap. For example, audience management is split into distinct tools for listing, creating from CSV, creating from engagement, updating, and deleting, each with unambiguous purpose. Design tools for flex, imagemap, and card are clearly separated by message type.

Naming Consistency5/5

All tools follow a strict `line_verb_noun` pattern (e.g., line_list_audiences, line_send_message, line_delete_rich_menu). The verb is consistently descriptive and the naming convention is uniform across all 29 tools, making it easy to predict tool names.

Tool Count2/5

With 29 tools, the server exceeds the recommended range of 3-15 and falls into the 'too many' category (25+). While the LINE OA API is broad, this number feels heavy and some tools could be consolidated (e.g., design tools or audience creation variants might be merged).

Completeness4/5

The tool set covers core LINE OA workflows: messaging, audience management, rich menus, coupons, LIFF apps, webhooks, and OA switching. Minor gaps exist (e.g., no tool for retrieving message content or managing rich menu aliases), but the surface is largely complete for common operations.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to send messages, manage rich menus, and interact with users through LINE Official Accounts via the LINE Messaging API. Supports both individual messaging and broadcasting to all followers with text and customizable flex messages.
    18
    630
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Integrates the LINE Messaging API with AI agents via the Model Context Protocol, supporting both stdio and SSE transport protocols. It allows agents to send messages, manage rich menus, and retrieve user profile information for LINE Official Accounts.
    10
    630
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    AI-powered MCP server for managing LINE Official Accounts. Send broadcasts, push messages, check analytics, manage rich menus — all through natural language via Claude, ChatGPT, or Cursor. 10 tools included: * Account info, friend count, message quota * Broadcast, push message, multicast * Delivery stats, user profiles, follower list * Rich menu management Supports 95M+ LINE users across Jap
    10
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server that integrates the LINE Messaging API to enable AI agents to send messages and manage LINE Official Accounts.
    12
    630
    773
    Apache 2.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wasintoh/line-oa-mcp-ultimate'

If you have feedback or need assistance with the MCP directory API, please join our Discord server