Skip to content

Conversation

@4geru
Copy link
Contributor

@4geru 4geru commented Jun 8, 2025

Hello Maintainers! 👋

Thank you for maintaining this excellent LINE Bot MCP Server project. I'm excited to contribute a new feature that adds dynamic rich menu creation capabilities. I hope this enhancement will be valuable for the community.

Background

The LINE Bot MCP Server needed functionality to create rich menus dynamically. Previously, users had to manually create rich menu images and configure them individually. There was a need for a flexible, text-based approach to generate rich menus programmatically.

Todo

1. Implemented Rich Menu Creation Feature

  • Added new create_rich_menu tool
  • Implemented automatic rich menu generation that accepts chat bar text and action arrays

2. Built Template System

  • Created 6 rich menu templates (Markdown format) supporting 1-6 items
  • Placed templates in richmenu-templates/ directory
  • Added example images in richmenu-examples/ for reference

3. Implemented Image Generation Pipeline

  • Used Marp to convert Markdown templates to HTML
  • Used Puppeteer to convert HTML to PNG images with specified dimensions (1600x910px)
  • Uploaded generated images to LINE Messaging API

4. Defined LINE Bot Action Schema

  • Created src/common/schema/actionSchema.ts with schemas for 9 action types (postback, message, uri, datetimepicker, camera, cameraRoll, location, richmenuswitch, clipboard)
  • Implemented type-safe validation using Zod

5. Added Dependencies

  • @marp-team/marp-core: For Markdown to slide generation
  • @marp-team/marp-cli: Marp command-line tools

Verified

Functionality

  • All templates (1-6 items) work correctly
  • Placeholders (item01 ' ~ ' item06) in Markdown templates are properly replaced with action labels
  • Generated images comply with LINE specifications (1600x910px)
  • Complete workflow from rich menu creation, image upload, to default setting works

Error Handling

  • Proper error responses for invalid action counts (< 1 or > 6)
  • Error catching at each stage: Marp conversion, Puppeteer execution, LINE API calls
  • Proper cleanup of temporary files

Technical Aspects

  • Proper management and deletion of temporary files (HTML, PNG)
  • Proper cleanup of Puppeteer browser instances
  • Correct usage of both LINE Messaging API Client and Blob Client

Result

This implementation enables automatic generation of visually appealing rich menus using only text-based configuration, significantly improving the developer experience for LINE Bot creators.

Usage

https://x.com/_4geru/status/1933793286285898071
https://x.com/_4geru/status/1933890824808632560

@eucyt
Copy link
Contributor

eucyt commented Jun 9, 2025

@4geru
(just in case)
We refactored dir struction to avoid conflict. So check this development flow for detail please 🙇
https://github.com/line/line-bot-mcp-server/blob/ee1196bc33c1d9ca40c75e67fa044734a8d8602b/CONTRIBUTING.md#add-a-new-tool

@4geru
Copy link
Contributor Author

4geru commented Jun 10, 2025

@eucyt Hello Euchi-san. I updated to separate the tools file.
Also, I can generate and upload the rich menu.

However, it cannot open in my app. LINE app stands up many times, and restarts...
Could you support me...? 🙇 🙇

スクリーンショット 2025-06-11 7 58 20

@4geru
Copy link
Contributor Author

4geru commented Jun 10, 2025

Memo

prompt

LINE MCP を使って リッチメニューをなので作成してください
[1] カメラのアクションを設定してください
[2] テンプレートは7です
[3] ボタンは「ポッチっとな」です

result

{
  "richMenuId": "richmenu-6ba77c74ccaf8a1153045f627cc972c3",
  "setImageResponse": {},
  "richMenuImagePath": "/tmp/slide-07-1749597029244.png",
  "params": {
    "name": "ポッチっとな",
    "chatBarText": "ポッチっとな",
    "selected": false,
    "size": {
      "width": 1600,
      "height": 910
    },
    "areas": [
      {
        "bounds": {
          "x": 0,
          "y": 0,
          "width": 1600,
          "height": 900
        },
        "action": {
          "type": "camera",
          "label": "ポッチっとな"
        }
      }
    ]
  }
}

@4geru
Copy link
Contributor Author

4geru commented Jun 11, 2025

I checked image requirements. 👌
https://developers.line.biz/ja/reference/messaging-api/#upload-rich-menu-image-requirements
スクリーンショット 2025-06-11 13 46 16

@4geru 4geru force-pushed the 4geru/generate-rich-menu branch from 9ad75b5 to fd89189 Compare September 6, 2025 07:59
size: 16:9
---
<style>
section {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to separate the common css part. However, it was a difficult. therefore, I'll work the next issue.

Prioritize release over perfection. 🙇 🙇

Comment on lines +50 to +55
const lineBlobClient = new line.messagingApi.MessagingApiBlobClient({
channelAccessToken: channelAccessToken,
defaultHeaders: {
"User-Agent": USER_AGENT,
},
});
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the code is the same with BolbClient.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tested to work well with the Docker.
font issue was too difficult, so I'd taken the time.

import { actionSchema } from "../common/schema/actionSchema.js";
import { promises as fsp } from "fs";

const RICHMENU_HEIGHT = 910;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

10px is for the margin.

@4geru
Copy link
Contributor Author

4geru commented Sep 7, 2025

@eucyt Could you review this PR again?

@4geru 4geru requested a review from eucyt September 7, 2025 07:51
Copy link
Contributor

@eucyt eucyt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@4geru
Sorry for the delay.

It’s mostly LGTM!
I was able to confirm it works with Docker and Node 🎉
I’ve left a few comments on some minor points, so please address those and resolve the conflicts.

@4geru
Copy link
Contributor Author

4geru commented Oct 24, 2025

@eucyt Thanks for reviewing my PR 🙇 I updated. So, please check it again.

@eucyt eucyt enabled auto-merge October 31, 2025 06:59
Copy link
Contributor

@eucyt eucyt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@4geru
LGTM!! Thank you!
(The CI is failing, but it’s just due to a formatting issue, so I’ll fix it and then merge.)

@eucyt eucyt added this pull request to the merge queue Oct 31, 2025
Merged via the queue into line:main with commit 326d8bf Oct 31, 2025
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants