@iflow-mcp/ykhli-mcp-vestaboard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,232 @@
1
+ # Vestaboard MCP Server
2
+
3
+ ![64C141F8-7167-4460-AB9F-FA4E4BBDCE19](https://github.com/user-attachments/assets/b33df4ee-2c1d-4682-9741-19f73265aaf1)
4
+
5
+ Give Cursor agent the ability to display messages on your Vestaboard.
6
+
7
+ More examples:
8
+ <img width="1301" height="733" alt="Screenshot 2025-09-12 at 8 22 42 AM" src="https://github.com/user-attachments/assets/993a6153-e100-483a-95a1-1244c04ec7f9" />
9
+
10
+
11
+
12
+ ## Features
13
+
14
+ - **Text Mode**: Send simple text messages that are automatically formatted and centered by Vestaboard
15
+ - **Board Mode**: Full control over the 6×22 character grid with precise positioning
16
+ - **Color Support**: Use Vestaboard's built-in color codes (Red, Orange, Yellow, Green, Blue, Violet, White, Black)
17
+ - **Symbol Support**: Display special characters, numbers, and punctuation
18
+ - **MCP Integration**: Works seamlessly with AI assistants that support the Model Context Protocol
19
+
20
+ ## Installation
21
+
22
+ 1. Clone this repository:
23
+
24
+ ```bash
25
+ git clone <repository-url>
26
+ cd vestaboard-mcp
27
+ ```
28
+
29
+ 2. Install dependencies:
30
+
31
+ ```bash
32
+ npm install
33
+ ```
34
+
35
+ ## Getting Your Vestaboard API Key
36
+
37
+ 1. Visit [Vestaboard Developer Portal](https://web.vestaboard.com/)
38
+ 2. Sign in with your Vestaboard account
39
+ 3. Go to "Read/Write API" section
40
+ 4. Generate a new API key for your board
41
+ 5. Copy the key to your `.env` file
42
+
43
+ ## Usage
44
+
45
+ ### Adding to Cursor as an MCP Server
46
+
47
+ 1. Open Cursor Settings (Cmd/Ctrl + ,)
48
+ 2. Go to "Features" → "Model Context Protocol"
49
+ 3. Add a new MCP server by copying and pasting this JSON configuration:
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "vestaboard": {
55
+ "command": "npx",
56
+ "args": ["-y", "tsx", "path/to/vestaboard-mcp/index.ts"],
57
+ "env": {
58
+ "VESTABOARD_API_KEY": "YOUR_API_KEY"
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ **Important**:
65
+
66
+ - Replace `/absolute/path/to/vestaboard-mcp` with the actual absolute path to your cloned repository
67
+ - Replace `your_vestaboard_api_key_here` with your actual Vestaboard API key
68
+
69
+ 4. Save the configuration and restart Cursor
70
+
71
+ ### Using with Cursor
72
+
73
+ Once configured, you can ask Cursor to display messages on your Vestaboard using natural language. Cursor will automatically use the `display_message` tool to send messages to your Vestaboard.
74
+
75
+ Examples:
76
+
77
+ - "Display 'Good Morning!' on my Vestaboard"
78
+ - "Show a colorful welcome message on the Vestaboard"
79
+ - "Put 'Meeting in 5 mins' on my Vestaboard in red"
80
+ - "Draw a minimal portrait of a Pikachu on my Vestaboard"
81
+
82
+ #### Text Mode (Default)
83
+
84
+ ```json
85
+ {
86
+ "message": "Hello World!",
87
+ "mode": "text"
88
+ }
89
+ ```
90
+
91
+ #### Board Mode (Advanced)
92
+
93
+ ```json
94
+ {
95
+ "mode": "board",
96
+ "board": [
97
+ [0, 0, 8, 5, 12, 12, 15, 0, 23, 15, 18, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
98
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
99
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
100
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
101
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
102
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
103
+ ]
104
+ }
105
+ ```
106
+
107
+ ## Character and Color Codes
108
+
109
+ ### Letters
110
+
111
+ - A-Z: 1-26
112
+
113
+ ### Numbers
114
+
115
+ - 0-9: 36, 27-35
116
+
117
+ ### Special Characters
118
+
119
+ - Blank: 0
120
+ - !: 37
121
+ - @: 38
122
+ - #: 39
123
+ - $: 40
124
+ - (: 41
125
+ - ): 42
126
+ - -: 44
127
+ - +: 46
128
+ - &: 47
129
+ - =: 48
130
+ - ;: 49
131
+ - :: 50
132
+ - ': 52
133
+ - ": 53
134
+ - %: 54
135
+ - ,: 55
136
+ - .: 56
137
+ - /: 59
138
+ - ?: 60
139
+ - °: 62
140
+
141
+ ### Colors
142
+
143
+ - Red: 63
144
+ - Orange: 64
145
+ - Yellow: 65
146
+ - Green: 66
147
+ - Blue: 67
148
+ - Violet: 68
149
+ - White: 69
150
+ - Black: 70
151
+ - Filled: 71
152
+
153
+ ## Project Structure
154
+
155
+ ```
156
+ vestaboard-mcp/
157
+ ├── code.ts # Vestaboard character and color code mappings
158
+ ├── index.ts # Main MCP server implementation
159
+ ├── sendMessage.js # Test utility for sending messages
160
+ ├── package.json # Node.js dependencies
161
+ └── README.md # This file
162
+ ```
163
+
164
+ ## API Reference
165
+
166
+ ### Tool: `display_message`
167
+
168
+ Displays a message on the Vestaboard using either text mode or board mode.
169
+
170
+ #### Parameters
171
+
172
+ - `message` (string, optional): The text message to display (required for text mode)
173
+ - `mode` (enum, optional): Display mode - "text" or "board" (default: "text")
174
+ - `board` (array, optional): 6×22 array of Vestaboard codes (required for board mode)
175
+
176
+ #### Response
177
+
178
+ Returns a success message indicating the content was displayed on the Vestaboard.
179
+
180
+ ## Examples
181
+
182
+ ### Simple Text Message
183
+
184
+ ```javascript
185
+ // When you say: "Display 'Good Morning!' on my Vestaboard"
186
+ // Cursor sends:
187
+ {
188
+ "message": "Good Morning!",
189
+ "mode": "text"
190
+ }
191
+ ```
192
+
193
+ ### Colorful Message with Board Mode
194
+
195
+ ```javascript
196
+ // When you say: "Create a colorful hello world message on my Vestaboard"
197
+ // Cursor sends:
198
+ {
199
+ "mode": "board",
200
+ "board": [
201
+ [63, 63, 8, 5, 12, 12, 15, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
202
+ [66, 66, 23, 15, 18, 12, 4, 66, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
203
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
204
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
205
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
206
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
207
+ ]
208
+ }
209
+ ```
210
+
211
+ ## Requirements
212
+
213
+ - Node.js 16 or higher
214
+ - A Vestaboard device
215
+ - Vestaboard API key
216
+ - Cursor IDE with MCP support
217
+
218
+ ## License
219
+
220
+ This project is open source and available under the MIT License.
221
+
222
+ ## Contributing
223
+
224
+ Contributions are welcome! Please feel free to submit a Pull Request.
225
+
226
+ ## Support
227
+
228
+ For issues related to:
229
+
230
+ - **Vestaboard API**: Check the [Vestaboard Developer Documentation](https://docs.vestaboard.com/)
231
+ - **MCP Protocol**: See the [Model Context Protocol Documentation](https://modelcontextprotocol.io/)
232
+ - **This Project**: Open an issue in this repository
package/code.ts ADDED
@@ -0,0 +1,72 @@
1
+ // Vestaboard character and color codes
2
+ // Format: <Name>: <Code> // <Notes>
3
+ export const VESTABOARD_CODES: Record<string, number> = {
4
+ Blank: 0, // Black on black Vestaboard / white on white Vestaboard
5
+ A: 1,
6
+ B: 2,
7
+ C: 3,
8
+ D: 4,
9
+ E: 5,
10
+ F: 6,
11
+ G: 7,
12
+ H: 8,
13
+ I: 9,
14
+ J: 10,
15
+ K: 11,
16
+ L: 12,
17
+ M: 13,
18
+ N: 14,
19
+ O: 15,
20
+ P: 16,
21
+ Q: 17,
22
+ R: 18,
23
+ S: 19,
24
+ T: 20,
25
+ U: 21,
26
+ V: 22,
27
+ W: 23,
28
+ X: 24,
29
+ Y: 25,
30
+ Z: 26,
31
+ 1: 27,
32
+ 2: 28,
33
+ 3: 29,
34
+ 4: 30,
35
+ 5: 31,
36
+ 6: 32,
37
+ 7: 33,
38
+ 8: 34,
39
+ 9: 35,
40
+ 0: 36,
41
+ "!": 37, // Exclamation Mark
42
+ "@": 38, // At
43
+ "#": 39, // Pound
44
+ $: 40, // Dollar
45
+ "(": 41, // Left Parenthesis
46
+ ")": 42, // Right Parenthesis
47
+ "-": 44, // Hyphen
48
+ "+": 46, // Plus
49
+ "&": 47, // Ampersand
50
+ "=": 48, // Equal
51
+ ";": 49, // Semicolon
52
+ ":": 50, // Colon
53
+ "'": 52, // Single Quote
54
+ '"': 53, // Double Quote
55
+ "%": 54, // Percent
56
+ ",": 55, // Comma
57
+ ".": 56, // Period
58
+ "/": 59, // Slash
59
+ "?": 60, // Question Mark
60
+ "°": 62, // Degree
61
+ Red: 63,
62
+ Orange: 64,
63
+ Yellow: 65,
64
+ Green: 66,
65
+ Blue: 67,
66
+ Violet: 68,
67
+ White: 69, // For the local API this is black on a white Vestaboard
68
+ Black: 70, // For the local API this is white on a white Vestaboard
69
+ Filled: 71, // White on black Vestaboard / black on white Vestaboard, not available for the local API
70
+ };
71
+
72
+ export default VESTABOARD_CODES;
package/index.ts ADDED
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import fetch from "node-fetch";
6
+ import dotenv from "dotenv";
7
+ import { VESTABOARD_CODES } from "./code.js";
8
+ dotenv.config();
9
+
10
+ // Create an MCP server
11
+ const server = new McpServer({
12
+ name: "vestaboard-server",
13
+ version: "1.0.0",
14
+ });
15
+
16
+ server.registerTool(
17
+ "display_message",
18
+ {
19
+ title: "Display Message on Vestaboard",
20
+ description: `Display a message on the Vestaboard using either text mode or board mode.\n\nModes:\n1. TEXT MODE (default): Uses Vestaboard's built-in text display - simply pass a string and Vestaboard handles formatting, centering, and wrapping automatically.\n2. BOARD MODE: Provide a full 6x22 array representation for complete control over each character position.\n\nVestaboard specifications:\n- 6 rows × 22 columns\n- In board mode, use numeric codes for each position\n\nVestaboard code mapping (from code.ts):\n${JSON.stringify(
21
+ VESTABOARD_CODES,
22
+ null,
23
+ 2
24
+ )}\n\nExamples:\n- Text mode: { "message": "Hello World" }\n- Board mode: { "mode": "board", "board": [[0,0,8,5,12,12,15,...], [0,0,0,0,...], ...] }
25
+
26
+ Make the message fun and colorful, liberally use colors and symbols!
27
+
28
+ DOUBLE CHECK EVERYTHING before you send a message, make sure the message is correct according to the code mapping above!`,
29
+ inputSchema: {
30
+ message: z
31
+ .string()
32
+ .optional()
33
+ .describe("The text message to display (for text mode)"),
34
+ mode: z
35
+ .enum(["text", "board"])
36
+ .optional()
37
+ .describe(
38
+ "Display mode: 'text' for simple text display, 'board' for full array control (default: 'text')"
39
+ ),
40
+ board: z
41
+ .array(z.array(z.number()))
42
+ .optional()
43
+ .describe("6x22 array of Vestaboard codes (for board mode)"),
44
+ },
45
+ },
46
+ async ({ message, mode = "text", board }) => {
47
+ const apiKey = process.env.VESTABOARD_API_KEY;
48
+ if (!apiKey)
49
+ throw new Error("VESTABOARD_API_KEY is not set in environment variables");
50
+
51
+ let requestBody;
52
+ let displayText;
53
+
54
+ if (mode === "text") {
55
+ if (!message) throw new Error("Message is required for text mode");
56
+ requestBody = { text: message };
57
+ displayText = `Text "${message}" displayed on Vestaboard using built-in text formatting`;
58
+ } else if (mode === "board") {
59
+ if (!board) throw new Error("Board array is required for board mode");
60
+ if (board.length !== 6) throw new Error("Board must have exactly 6 rows");
61
+ if (!board.every((row) => row.length === 22))
62
+ throw new Error("Each row must have exactly 22 columns");
63
+ requestBody = board;
64
+ displayText = "Custom board layout displayed on Vestaboard";
65
+ } else {
66
+ throw new Error("Invalid mode. Must be 'text' or 'board'");
67
+ }
68
+
69
+ // 在测试环境下,只模拟发送请求,不实际调用API
70
+ if (apiKey === "test_key_for_validation") {
71
+ // 测试模式:模拟成功响应
72
+ return {
73
+ content: [{ type: "text", text: `[TEST MODE] ${displayText}` }],
74
+ };
75
+ }
76
+
77
+ await fetch("https://rw.vestaboard.com/", {
78
+ method: "POST",
79
+ headers: {
80
+ "Content-Type": "application/json",
81
+ "X-Vestaboard-Read-Write-Key": apiKey,
82
+ },
83
+ body: JSON.stringify(requestBody),
84
+ });
85
+
86
+ return {
87
+ content: [{ type: "text", text: displayText }],
88
+ };
89
+ }
90
+ );
91
+
92
+ const transport = new StdioServerTransport();
93
+ server.connect(transport);
package/language.json ADDED
@@ -0,0 +1 @@
1
+ nodejs
package/package.json ADDED
@@ -0,0 +1 @@
1
+ {"name":"@iflow-mcp/ykhli-mcp-vestaboard","version":"1.0.0","description":"MCP server for Vestaboard display integration","type":"module","bin":{"iflow-mcp_ykhli-mcp-vestaboard":"./index.ts"},"dependencies":{"@modelcontextprotocol/sdk":"^1.15.1","dotenv":"^17.2.0","node-fetch":"^3.3.2"},"devDependencies":{"@types/node":"^24.3.1","@types/node-fetch":"^2.6.13","tsx":"^4.21.0","typescript":"^5.9.3"}}
package/package_name ADDED
@@ -0,0 +1 @@
1
+ @iflow-mcp/ykhli-mcp-vestaboard
package/push_info.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "push_platform": "github",
3
+ "fork_url": "https://github.com/iflow-mcp/ykhli-mcp-vestaboard",
4
+ "fork_branch": "iflow"
5
+ }
package/run.sh ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ cd /app/auto-mcp-upload/data/13696
3
+ VESTABOARD_API_KEY=test_key_for_validation npx tsx index.ts
package/run.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import('./index.js');