L Harness MCP Server
Run a self-hosted L Harness LINE Official Account CRM from an MCP client: friends, tags, scenarios, broadcasts
Connects an AI agent to a LINE Official Account to send messages and manage rich menus
Official · LINE TypeScript Local · stdio CommunicationCRM and sales
76 popularity score ★ 797 ↓ 2.6k/wk
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs CHANNEL_ACCESS_TOKEN. Replace each <NAME> with your value.
claude mcp add line-bot -e CHANNEL_ACCESS_TOKEN=<CHANNEL_ACCESS_TOKEN> -- npx -y @line/line-bot-mcp-server{
"mcpServers": {
"line-bot": {
"command": "npx",
"args": [
"-y",
"@line/line-bot-mcp-server"
],
"env": {
"CHANNEL_ACCESS_TOKEN": "<CHANNEL_ACCESS_TOKEN>"
}
}
}
}{
"mcpServers": {
"line-bot": {
"command": "npx",
"args": [
"-y",
"@line/line-bot-mcp-server"
],
"env": {
"CHANNEL_ACCESS_TOKEN": "<CHANNEL_ACCESS_TOKEN>"
}
}
}
}{
"servers": {
"line-bot": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@line/line-bot-mcp-server"
],
"env": {
"CHANNEL_ACCESS_TOKEN": "<CHANNEL_ACCESS_TOKEN>"
}
}
}
}[mcp_servers.line-bot]
command = "npx"
args = ["-y", "@line/line-bot-mcp-server"]
[mcp_servers.line-bot.env]
CHANNEL_ACCESS_TOKEN = "<CHANNEL_ACCESS_TOKEN>"gemini mcp add --scope user -e CHANNEL_ACCESS_TOKEN=<CHANNEL_ACCESS_TOKEN> line-bot npx -- -y @line/line-bot-mcp-serverOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs CHANNEL_ACCESS_TOKEN. Replace each <NAME> with your value.
git clone https://github.com/line/line-bot-mcp-server.git
cd line-bot-mcp-server
docker build -t line/line-bot-mcp-server .claude mcp add line-bot -e CHANNEL_ACCESS_TOKEN=<CHANNEL_ACCESS_TOKEN> -- docker run -i --rm -e CHANNEL_ACCESS_TOKEN line/line-bot-mcp-server{
"mcpServers": {
"line-bot": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"CHANNEL_ACCESS_TOKEN",
"line/line-bot-mcp-server"
],
"env": {
"CHANNEL_ACCESS_TOKEN": "<CHANNEL_ACCESS_TOKEN>"
}
}
}
}{
"mcpServers": {
"line-bot": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"CHANNEL_ACCESS_TOKEN",
"line/line-bot-mcp-server"
],
"env": {
"CHANNEL_ACCESS_TOKEN": "<CHANNEL_ACCESS_TOKEN>"
}
}
}
}{
"servers": {
"line-bot": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"CHANNEL_ACCESS_TOKEN",
"line/line-bot-mcp-server"
],
"env": {
"CHANNEL_ACCESS_TOKEN": "<CHANNEL_ACCESS_TOKEN>"
}
}
}
}[mcp_servers.line-bot]
command = "docker"
args = ["run", "-i", "--rm", "-e", "CHANNEL_ACCESS_TOKEN", "line/line-bot-mcp-server"]
[mcp_servers.line-bot.env]
CHANNEL_ACCESS_TOKEN = "<CHANNEL_ACCESS_TOKEN>"gemini mcp add --scope user -e CHANNEL_ACCESS_TOKEN=<CHANNEL_ACCESS_TOKEN> line-bot docker -- run -i --rm -e CHANNEL_ACCESS_TOKEN line/line-bot-mcp-serverCHANNEL_ACCESS_TOKEN |
Required: Channel access token of the LINE Official Account's Messaging API channel; the server exits without it. |
|---|---|
DESTINATION_USER_ID |
Optional: Default user ID for push and profile tools when no userId is passed. |
NPM_CONFIG_IGNORE_SCRIPTS |
Optional: Set to true in the README's npx example so npm skips package install scripts. |
PUPPETEER_EXECUTABLE_PATH |
Optional: Path to Chrome or Chromium used by create_rich_menu to render menu images. |
LINE_MESSAGING_API_BASE_URL |
Optional: Overrides the Messaging API base URL; not in the README. |
In a container, a setting goes in with -e NAME=value after docker run.
LINE Bot MCP Server is LINE's own bridge between an AI agent and the LINE Messaging API. It runs on your machine over stdio and acts as one LINE Official Account, identified by that channel's access token. Through it an agent can send plain text or Flex (JSON layout) messages to a single user or broadcast them to every follower, look up a user's profile, list follower IDs, check how much of the monthly message quota is used, and list, create, delete or set the default rich menu (the tappable menu under a chat).
The create_rich_menu tool does more than call the API: it renders a menu image from up to six actions with Marp and a headless Chromium through Puppeteer, uploads it and makes the new menu the default. A default recipient can be set with DESTINATION_USER_ID so push and profile tools work without naming a user each time.
The release on npm (0.5.0) registers 12 tools (src/index.ts at tag v0.5.0). The README lists a 13th, get_group_summary, which so far exists only on the main branch. The code also reads LINE_MESSAGING_API_BASE_URL to point the client at another API base URL, a setting the README does not mention. LINE marks the project as a preview offered for experimental use that may lack complete functionality or support.
| Runtime | Node.js 22+orDocker |
|---|
Node.js 22 or later for the npx way, or Docker for the image you build yourself from the repository. A LINE Official Account with the Messaging API enabled, and its channel access token. create_rich_menu needs a Chrome or Chromium that Puppeteer can launch; the README's npx snippet skips install scripts, so set PUPPETEER_EXECUTABLE_PATH to an installed browser (the Docker image ships Chromium).
Version 0.5.0 has 12 tools; get_group_summary is on main but not yet released. It reads no incoming chats: there is no webhook, so it cannot see what users send the account. create_rich_menu takes 1 to 6 actions and always sets the new menu as the default. Messages count against the account's LINE message quota. The makers call it a preview for experimental use without complete functionality or support. The Docker image is not published; you build it from a clone.
Suits someone who runs a LINE Official Account and wants an agent to send announcements or one-to-one pushes, check quota and manage rich menus from a desktop client. Because it can broadcast to every follower with one call, it fits a test account or close supervision better than unattended use. It does not fit anyone who needs the agent to read and answer incoming user messages, since it has no webhook, or who needs a personal LINE account rather than a business one.
push_text_messagepush_flex_messagebroadcast_text_messagebroadcast_flex_messageget_profileget_message_quotaget_rich_menu_listdelete_rich_menuset_rich_menu_defaultcancel_rich_menu_defaultcreate_rich_menuget_follower_ids