line-oa-mcp-ultimate
The line-oa-mcp-ultimate server lets AI agents manage a LINE Official Account through natural language. Key capabilities include:
📨 Messaging
Send text, Flex, sticker, image, video, or coupon messages to any target (reply, push, multicast, narrowcast, broadcast)
Three send modes:
send_now,draft(for scheduling), anddry_run(validate + estimate cost only)Built-in quota guardian, quiet-hours warnings, pre-flight validation, and retry-key handling
Find stickers by mood or keyword
🎨 Rich Menus
Create, list, delete, link/unlink (bulk up to 500 users), set/clear default, and upload images
Audit why a specific user sees a particular menu (priority chain inspection)
Manage rich menu aliases for tab-switching
💎 Message Design
Design Flex Messages from templates or raw JSON with preview URLs
Design Imagemap (Rich Messages) with tappable regions and optional inline video
Design Card Messages (buttons, confirm, carousel, image carousel)
🎯 Audiences
Build audiences from CSV (user ID upload) or prior broadcast engagement (clicks/opens)
List, update (add users or rename), and delete audience groups
📊 Insights & Reporting
Get OA status (friend count, quota, webhook status, default rich menu)
Get multi-day OA reports (delivery stats, follower trends, quota usage)
Get per-broadcast engagement stats (impressions, opens, clicks, CTR, per-URL breakdown)
Estimate send cost and monitor narrowcast delivery progress
🎟 Coupons
Create (percentage/fixed/explicit discount), list, get, discontinue native LINE coupons
Get coupon redemption stats and send coupons as messages
🔌 Webhook
Test the webhook endpoint (ping, HTTP status, latency, signature result)
Set or retrieve the webhook URL
👤 User & Operations
Fetch individual user profiles and list followers (cursor-paginated, region-gated)
List all configured OAs, switch the active OA at runtime
Run read-only tools across multiple OAs in parallel (agency bulk reporting)
💻 LIFF & Token
Manage LIFF apps (create, list, update, delete)
Verify access token expiry, bound client ID, and granted scope
🛍 LINE Shopping (Optional, opt-in)
Manage products (create, update, inventory, pricing)
Process orders (list, detail, fulfill, cancel, print parcel labels)
Generate checkout links and manage settlements
Allows AI agents to operate a LINE Official Account through natural language, including sending messages, managing rich menus, audiences, coupons, and more via LINE's Messaging API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@line-oa-mcp-ultimateSummarize last week's LINE OA performance"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LINE 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.
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:
| official | |
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 ( | ❌ one OA per server instance |
Quota / quiet-hours guardrails | ✅ pre-flight Quota Guardian, 22:00–08:00 quiet-hours warnings, | ➖ quota read tool ( |
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 ( | stdio (npx / Docker) |
Runtime footprint | browser-free — no headless Chromium download | depends on |
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
Open the LINE Developers Console.
Pick your provider → open (or create) a Messaging API channel.
Open the Messaging API tab → scroll to Channel access token → click Issue.
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) |
|
Claude Desktop (Windows) |
|
Claude Code | Run |
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 insidemcpServers.
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 statusor 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.biz → Settings → 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 inconfig.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 fromoaplus.line.biz→ Settings → API keys, Admin role). In single-OA mode, set the env varLINE_MYSHOP_API_KEYinstead. 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:
LINE_MCP_CONFIGenv var (custom path)~/.line-mcp/config.jsonLINE_CHANNEL_ACCESS_TOKENenv 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_urlinput rewrites these to direct-download form automatically.)
Documentation
Doc | What's in it |
Thai-language quick start (5-minute walkthrough) | |
📨 Messaging full guide — Thai. The messaging tools explained, transports & send modes, real workflows, safety limits, and troubleshooting | |
🛍️ LINE Shopping (MyShop) full guide — Thai. Get the API key, all 14 tools explained, real end-to-end workflows, safety rules, and troubleshooting | |
Per-host MCP setup — Cowork / Claude Desktop / Cursor / Codex (Thai) | |
🖼️ Images & Rich Messages with zero hosting (v2.2) — EN + Thai: how it works, the first-view rule, troubleshooting | |
Multi-OA configuration guide (Thai) | |
Test a local build in Claude Cowork before publishing (Thai) | |
Streamable HTTP transport for self-hosted / remote use | |
Security policy (EN) · threat-model guide for shop owners (Thai) | |
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) requiresMCP_HTTP_TOKEN— every request must then carryAuthorization: Bearer <token>. Without the token the server refuses to expose itself beyond127.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 buildWhen contributing:
Tool names:
line_{action}_{resource}(snake_case, prefixline_).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)
Move the Unreleased section of CHANGELOG.md to the new version and bump
package.json.git tag vX.Y.Z && git push origin vX.Y.Z.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 toolsline_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:[...] }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| name | Yes | Audience name as shown in LINE OA Manager (≤120 chars). | |
| is_ifa | No | True if values are Identifiers for Advertisers (IFAs) instead of LINE user IDs. | |
| user_ids | Yes | Array of LINE user IDs. Max 10,000 per call. |
TDQS
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.
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.
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.
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.
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.
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| name | Yes | ||
| type | No | 'clicks' = audience of users who clicked any link in the source message; 'opens' = users who saw it. | clicks |
| click_url | No | If 'clicks' and you only want users who clicked a specific URL, set it here. | |
| source_request_id | Yes | The request_id returned by a prior line_send_message (narrowcast/multicast/push/broadcast). |
TDQS
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.
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.
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.
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.
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.
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_check_tokenCheck LINE Token ValidityARead-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? }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | Optional OA id; defaults to active OA. |
TDQS
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.
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.
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.
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.
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.
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 audienceADestructiveIdempotent
Delete an audience group. Irreversible — requires confirm=true. audience_group_id (numeric) from line_list_audiences.
Returns { success, deleted_id }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| confirm | No | ||
| audience_group_id | Yes |
TDQS
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.
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.
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.
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.
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.
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_design_cardDesign LINE Card Message (Template)ARead-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:"ยกเลิก"}] }.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Card subtype. Determines which other fields are required. | |
| text | No | [buttons] body (≤60 with title/thumb, else ≤160). [confirm] question (required). | |
| title | No | [buttons] Optional card title. | |
| actions | No | [buttons] 1..4 buttons. [confirm] exactly 2 buttons. | |
| columns | No | [carousel] ≤10 columns (same action-count each). [image_carousel] ≤10 columns. | |
| alt_text | Yes | Fallback text shown in push notification + chat list (1..400 chars). | |
| thumbnail_image_url | No | [buttons] Optional HTTPS thumbnail. |
TDQS
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.
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.
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.
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.
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.
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 MessageARead-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" } }.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Template-specific data fields. Required when template is set. | |
| alt_text | No | Optional override for altText. Defaults to a template-derived alt text. | |
| template | No | Name of a pre-built Thai-localized Flex template. See catalog below. Mutually exclusive with flex_json. | |
| flex_json | No | Raw Flex contents (bubble or carousel). Advanced users only. Mutually exclusive with template. | |
| list_templates | No | Set true to return the available template catalog instead of rendering. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| areas | Yes | At least 1 tappable area. Bounds are px on the 1040-wide base; must stay in bounds. | |
| video | No | Optional inline video that plays over part of the image. | |
| alt_text | Yes | Fallback text shown when the image can't render (≤400 chars). | |
| base_url | No | 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. | |
| base_height | No | Image height in px WHEN the width is 1040. REQUIRED with base_url; ignored with prepared_key (auto-derived). | |
| prepared_key | No | RECOMMENDED path: key from line_prepare_image (purpose 'imagemap'). base_url and base_height are filled in automatically from the prepared image. |
TDQS
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.
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.
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.
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.
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.
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_estimate_send_costEstimate LINE send costARead-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[] }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| target | Yes | ||
| message_count | No | Number of messages in the send (LINE counts each message in a batch). Default 1. |
TDQS
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.
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.
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.
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.
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.
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/keywordARead-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 }] }.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Mood or keyword (Thai or English). Examples: "ขอบคุณ", "celebration", "sorry", "ดีใจ". | |
| response_format | No | markdown |
TDQS
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.
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.
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.
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.
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.
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 statsARead-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[] }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| coupon_id | Yes | ||
| response_format | No | markdown | |
| click_audience_id | No | Optional — if you created a click audience from the coupon broadcast, pass its id to enrich the stats with click-through count. |
TDQS
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.
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.
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.
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.
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.
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 statsARead-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[] }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| request_id | Yes | request_id returned by a prior line_send_message (narrowcast/multicast/broadcast). | |
| response_format | No | markdown |
TDQS
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.
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.
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.
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.
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.
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 ProgressARead-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? }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | Optional OA id; defaults to active OA. | |
| request_id | Yes | The narrowcast request id returned by a prior narrowcast send. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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[] }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| range | No | Date range. Preset strings or { from: 'YYYY-MM-DD', to: 'YYYY-MM-DD' }. | last-week |
| response_format | No | markdown |
TDQS
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.
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.
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.
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.
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.
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 StatusARead-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[] }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | Optional OA id from the multi-OA config. Omit to use the active/default OA. | |
| response_format | No | Output format. 'markdown' is human-readable; 'json' is structured. | markdown |
TDQS
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.
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.
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.
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.
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.
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 ProfileARead-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? }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| user_id | Yes | LINE user ID (starts with 'U' for chat users) | |
| response_format | No | markdown |
TDQS
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.
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.
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.
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.
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.
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)ARead-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 }.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 AudiencesARead-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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| page | No | Page number (1-indexed). | |
| limit | No | Page size (max 100). | |
| name_contains | No | Optional substring filter on audience name (case-insensitive). | |
| status_filter | No | Filter audiences by readiness status. Default 'all'. | all |
| response_format | No | markdown |
TDQS
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.
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.
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.
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.
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.
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 followersARead-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? }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| page_size | No | ||
| response_format | No | markdown | |
| continuation_token | No | Token returned by a prior call to page through more results. |
TDQS
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.
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.
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.
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.
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.
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 configuredARead-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 }] }.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
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.
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.
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.
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.
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.
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_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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| data | No | Required for mode='create'. | |
| mode | Yes | create: make a new coupon; list: list all coupons; get: fetch one; discontinue: end one (irreversible). | |
| confirm | No | Required true for mode='discontinue'. | |
| coupon_id | No | Required for mode='get' or 'discontinue'. | |
| response_format | No | markdown |
TDQS
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.
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.
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.
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.
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.
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" } } }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| mode | Yes | ||
| config | No | Required for create. Partial for update. | |
| confirm | No | ||
| liff_id | No | Required for update / delete. |
TDQS
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.
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.
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.
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.
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.
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_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 } }.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | The source image. Provide EXACTLY ONE of file_path | base64 | source_url. | |
| purpose | No | "imagemap" (default) = Rich Message with tappable areas (needs 5 hosted sizes). "image_message" = plain image bubble (needs full + preview). | imagemap |
| keep_alive_hours | No | How 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
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.
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.
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.
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.
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.
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 OAsARead-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" }.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | Read-only tool to run across all selected OAs. Write tools (send/build/delete) are not supported in bulk mode for safety. | |
| oa_ids | No | Either an array of OA ids or 'all' to use every configured OA. Default 'all'. | all |
| parallel | No | Max concurrent OAs (1-10). Default 5. | |
| response_format | No | markdown |
TDQS
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.
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.
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.
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.
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.
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"] }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | OA id (multi-OA). Omit to use active OA. | |
| mode | No | send_now (default) sends immediately; draft returns a handoff package for LINE OA Manager UI; dry_run validates + estimates without sending. | send_now |
| force | No | Override quiet-hours warning (22:00–08:00 BKK). Defaults false; LINE Thai customers prefer not to be pinged at night. | |
| target | Yes | Who to send to. Pick one shape: { reply_to } | { user_id } | { user_ids[] } | { audience } | { filter } | { everyone: true } | |
| confirm | No | Required to be true when projected cost > 95% of remaining quota, or when target.everyone === true. | |
| message | Yes | 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) | |
| quiet_push | No | Suppress push notification on recipient device (silent send). Default false. |
TDQS
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.
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.
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.
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.
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.
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_webhook_endpointSet LINE Webhook EndpointAIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | Optional OA id; defaults to active OA. | |
| mode | Yes | set: write a new webhook URL; get: read the currently configured one. | |
| endpoint | No | Required for mode='set'. Public HTTPS URL (must start with https://, ≤500 chars). |
TDQS
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.
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.
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.
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.
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.
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 EndpointAIdempotent
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | ||
| override_endpoint | No | Test a specific URL instead of the OA's currently configured webhook URL. |
TDQS
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.
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.
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.
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.
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.
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"] }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa | No | Optional OA id; defaults to active OA. | |
| mode | Yes | add_users: append user IDs to an existing upload audience; rename: change an audience's display name. | |
| user_ids | No | Required for mode='add_users'. LINE user IDs to append. | |
| description | No | Required for mode='rename'. The new audience name (≤120 chars). | |
| audience_group_id | Yes | Target audience group id (from line_list_audiences). |
TDQS
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.
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.
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.
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.
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.
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_use_oaSwitch active LINE OAAIdempotent
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| oa_id | Yes | OA id from line_list_oas |
TDQS
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.
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.
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.
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.
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.
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.
9 tool updates
v2.2.0- Added
line_design_flex - Changed
line_design_imagemap4 fields changed- changed
Input schema / properties / base_height / descriptionPrevious 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)." - changed
Input schema / properties / base_url / descriptionPrevious 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." - added
Input schema / properties / prepared_keyAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "base_url", - "alt_text", - "base_height", - "areas" -]New value: +[ + "alt_text", + "areas" +]
- Added
line_estimate_send_cost - Added
line_find_sticker - Added
line_get_coupon_stats - Added
line_image_host_status - Added
line_manage_liff_app - Added
line_prepare_image - Changed
line_send_message2 fields changed- changed
Input schema / properties / message / anyOfPrevious 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" + } +] - changed
Input schema / properties / message / descriptionPrevious 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)"
9 tool updates
v2.1.0- Added
line_build_rich_menu - Removed
line_design_flex - Removed
line_estimate_send_cost - Removed
line_get_coupon_stats - Added
line_get_oa_report - Removed
line_manage_liff_app - Added
line_manage_rich_menu_alias - Added
line_set_default_rich_menu - Added
line_upload_rich_menu_image
7 tool updates
v2.1.0- Removed
line_build_rich_menu - Added
line_design_rich_menu_image - Removed
line_find_sticker - Removed
line_get_oa_report - Removed
line_manage_rich_menu_alias - Removed
line_set_default_rich_menu - Removed
line_upload_rich_menu_image
15 tool updates
v1.1.0- Added
line_check_token - Added
line_design_card - Added
line_design_imagemap - Removed
line_emit_liff_code - Removed
line_emit_login_snippet - Added
line_get_narrowcast_progress - Added
line_link_rich_menu - Changed
line_manage_coupon19 fields changed- added
Input schema / properties / data / properties / acquisition_typeAdded value: +{ + "enum": [ + "normal", + "lottery" + ], + "type": "string" +} - added
Input schema / properties / data / properties / barcode_image_urlAdded value: +{ + "format": "uri", + "type": "string" +} - changed
Input schema / properties / data / properties / coupon_code / maxLengthPrevious value: -20New value: +16 - changed
Input schema / properties / data / properties / description / maxLengthPrevious value: -300New value: +1000 - added
Input schema / properties / data / properties / discount_typeAdded value: +{ + "description": "percentage (default) | fixed (amount off) | explicit (before→after price).", + "enum": [ + "percentage", + "fixed", + "explicit" + ], + "type": "string" +} - added
Input schema / properties / data / properties / discount_valueAdded value: +{ + "description": "Percent (1–100) when percentage; currency amount when fixed.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / data / properties / lottery_probabilityAdded value: +{ + "maximum": 99, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / data / properties / max_acquire_countAdded value: +{ + "exclusiveMinimum": 0, + "type": "integer" +} - removed
Input schema / properties / data / properties / max_redemptionsRemoved value: -{ - "exclusiveMinimum": 0, - "type": "integer" -} - added
Input schema / properties / data / properties / max_use_per_ticketAdded value: +{ + "description": "1 = once per user (default); -1 = unlimited.", + "enum": [ + 1, + -1 + ], + "type": "number" +} - added
Input schema / properties / data / properties / price_afterAdded value: +{ + "description": "Explicit only.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / data / properties / price_beforeAdded value: +{ + "description": "Explicit only.", + "exclusiveMinimum": 0, + "type": "number" +} - removed
Input schema / properties / data / properties / terms_urlRemoved value: -{ - "format": "uri", - "type": "string" -} - added
Input schema / properties / data / properties / timezoneAdded value: +{ + "description": "LINE timezone enum, default ASIA_BANGKOK.", + "type": "string" +} - changed
Input schema / properties / data / properties / valid_from / descriptionPrevious value: -"ISO datetime."New value: +"UNIX seconds, 'YYYY-MM-DD', or ISO datetime." - changed
Input schema / properties / data / properties / valid_from / typePrevious value: -"string"New value: +[ + "string", + "number" +] - changed
Input schema / properties / data / properties / valid_to / descriptionPrevious value: -"ISO datetime."New value: +"UNIX seconds, 'YYYY-MM-DD', or ISO datetime." - changed
Input schema / properties / data / properties / valid_to / typePrevious value: -"string"New value: +[ + "string", + "number" +] - added
Input schema / properties / data / properties / visibilityAdded value: +{ + "description": "PUBLIC = listed in LY services; UNLISTED (default) = link/broadcast only.", + "enum": [ + "PUBLIC", + "UNLISTED" + ], + "type": "string" +}
- Added
line_manage_rich_menu_alias - Changed
line_send_message2 fields changed- changed
Input schema / properties / message / anyOfPrevious 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" + } +] - changed
Input schema / properties / message / descriptionPrevious 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 }"
- Added
line_set_default_rich_menu - Added
line_set_webhook_endpoint - Removed
line_show_typing - Added
line_update_audience - Added
line_upload_rich_menu_image
27 tool updates
v1.0.2- First observed
line_audit_user_menu - First observed
line_build_audience_from_csv - First observed
line_build_audience_from_engagement - First observed
line_build_rich_menu - First observed
line_delete_audience - First observed
line_delete_rich_menu - First observed
line_design_flex - First observed
line_emit_liff_code - First observed
line_emit_login_snippet - First observed
line_estimate_send_cost - First observed
line_find_sticker - First observed
line_get_coupon_stats - First observed
line_get_message_stats - First observed
line_get_oa_report - First observed
line_get_oa_status - First observed
line_get_user_profile - First observed
line_list_audiences - First observed
line_list_followers - First observed
line_list_oas - First observed
line_list_rich_menus - First observed
line_manage_coupon - First observed
line_manage_liff_app - First observed
line_run_on_many_oas - First observed
line_send_message - First observed
line_show_typing - First observed
line_test_webhook - First observed
line_use_oa
TDQS
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.
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.
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).
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
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
Run WhatsApp Business campaigns from any AI assistant: contacts, segments, and broadcasts.
Give your AI agents a real WhatsApp number to send and receive messages.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Build and send email, SMS, and push straight from your AI agent.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables 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.18630Apache 2.0
- AlicenseAqualityDmaintenanceIntegrates 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.10630Apache 2.0
- AlicenseAqualityDmaintenanceAI-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 Jap10MIT

LINE Bot MCP Serverofficial
AlicenseAqualityAmaintenanceMCP server that integrates the LINE Messaging API to enable AI agents to send messages and manage LINE Official Accounts.12630773Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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