UNPKG

seatalk-mcp-server

Version:

A Model Context Protocol server for SeaTalk Open Platform integration

604 lines (512 loc) 11.4 kB
# SeaTalk MCP Server This server provides [Model Context Protocol (MCP)](https://github.com/anthropics/anthropic-model-context-protocol) tools to interact with the SeaTalk API. It enables AI assistants to send and retrieve messages, access employee information, and interact with group chats via SeaTalk. ## Setup 1. Install dependencies: ```bash npm install ``` 2. Create a `.env` file with your SeaTalk credentials: ``` SEATALK_APP_ID=your_app_id SEATALK_APP_SECRET=your_app_secret ``` 3. Build the server: ```bash npm run build ``` 4. Start the server: ```bash npm start ``` ## Installation You can install this package via npm: ```bash # Install globally npm install -g seatalk-mcp-server # Or use directly with npx (auto-install without prompts) npx -y seatalk-mcp-server ``` ## NPX Usage This package can be used directly via `npx` without installing it globally. The `-y` flag automatically accepts installation prompts for seamless automation. ### Configuration in MCP Settings Configure the SeaTalk server in your MCP settings by providing the required environment variables: ```json { "mcpServers": { "seatalk-mcp-server": { "command": "npx", "args": ["-y", "seatalk-mcp-server"], "env": { "SEATALK_APP_ID": "your_app_id_here", "SEATALK_APP_SECRET": "your_app_secret_here" }, "disabled": false } } } ``` Required environment variables: - `SEATALK_APP_ID`: Your SeaTalk application ID - `SEATALK_APP_SECRET`: Your SeaTalk application secret ### Using with Cursor or other MCP-compatible tools After configuring the server in your MCP settings, SeaTalk tools will be available for use in Cursor or other MCP-compatible environments. ## Local Development & Manual Build If you prefer to clone the repository and build the server yourself, follow these steps: ### Prerequisites - Node.js 16.0.0 or higher - npm or yarn package manager ### Clone and Build 1. **Clone the repository:** ```bash git clone https://github.com/muhammad-iqbal/seatalk-mcp-server.git cd seatalk-mcp-server/seatalk-server ``` 2. **Install dependencies:** ```bash npm install ``` 3. **Create environment configuration:** ```bash # Create .env file with your credentials echo "SEATALK_APP_ID=your_app_id_here" > .env echo "SEATALK_APP_SECRET=your_app_secret_here" >> .env ``` 4. **Build the project:** ```bash npm run build ``` 5. **Run the server directly:** ```bash node build/index.js ``` ### Configuration in MCP Settings (Local Build) When using the locally built version, configure your MCP settings to point to the built file: ```json { "mcpServers": { "seatalk-mcp-server": { "command": "node", "args": ["/path/to/your/seatalk-mcp-server/seatalk-server/build/index.js"], "env": { "SEATALK_APP_ID": "your_app_id_here", "SEATALK_APP_SECRET": "your_app_secret_here" }, "disabled": false } } } ``` **Note:** Replace `/path/to/your/seatalk-mcp-server/seatalk-server/build/index.js` with the actual absolute path to your built index.js file. ### Development Workflow For active development, you can use the watch mode: ```bash # Build and watch for changes npm run watch # In another terminal, run the server node build/index.js ``` This approach is useful for: - Contributing to the project - Customizing the server for specific needs - Testing unreleased features - Running in environments where npx is not available ## Available Tools ### Employee Information #### `get_employee_profile` Get an employee's profile by employee code. **Example:** ```json { "employee_code": "EMP123" } ``` **Response:** ```json { "code": 0, "employee": { "employee_code": "EMP123", "name": "John Doe", "company_email": "john.doe@company.com", "department": { "department_code": "DEP001", "department_name": "Engineering" } } } ``` #### `get_employee_code_with_email` Get employee codes by email addresses. **Example:** ```json { "emails": ["john.doe@company.com", "jane.smith@company.com"] } ``` **Response:** ```json { "code": 0, "results": [ { "email": "john.doe@company.com", "employee_code": "EMP123", "exists": true }, { "email": "jane.smith@company.com", "employee_code": "EMP456", "exists": true } ] } ``` #### `check_employee_existence` Verify whether employees exist in the organization via SeaTalk ID. **Example:** ```json { "id": "ST12345" } ``` **Response:** ```json { "code": 0, "exists": true } ``` #### `get_user_language_preference` Get a user's language preference. **Example:** ```json { "employee_code": "EMP123" } ``` **Response:** ```json { "code": 0, "language": "en" } ``` ### Group Chat Management #### `get_joined_group_chat_list` Obtain group chats the bot joined. **Example:** ```json { "page_size": 10 } ``` **Response:** ```json { "code": 0, "groups": [ { "group_id": "group123", "group_name": "Engineering Team", "member_count": 15 }, { "group_id": "group456", "group_name": "Project Alpha", "member_count": 8 } ], "has_more": true, "next_cursor": "cursor_token_for_next_page" } ``` #### `get_group_info` Get information about a group chat, including member list. **Example:** ```json { "group_id": "group456" } ``` **Response:** ```json { "code": 0, "group_info": { "group_id": "group456", "group_name": "Project Alpha", "description": "Group for Project Alpha discussion", "created_at": 1615000000, "owner": { "employee_code": "EMP123", "name": "John Doe" } }, "members": [ { "employee_code": "EMP123", "name": "John Doe", "is_admin": true }, { "employee_code": "EMP456", "name": "Jane Smith", "is_admin": false } ], "has_more": false } ``` ### Messaging #### `get_thread_by_thread_id` Retrieve all messages within a thread of a group chat. **Example:** ```json { "group_id": "group456", "thread_id": "thread123", "page_size": 20 } ``` **Response:** ```json { "code": 0, "messages": [ { "message_id": "msg001", "sender": { "employee_code": "EMP123", "name": "John Doe" }, "tag": "text", "text": { "plain_text": "Hello team!" }, "created_at": 1615456789 } ], "has_more": false } ``` #### `get_message_by_message_id` Retrieve a message by its message ID. **Example:** ```json { "message_id": "msg001" } ``` **Response:** ```json { "code": 0, "message_id": "msg001", "sender": { "employee_code": "EMP123", "name": "John Doe" }, "tag": "text", "text": { "plain_text": "Hello team!" }, "created_at": 1615456789 } ``` #### `get_chat_history` Obtain the group chat history (messages sent within 7 days). **Example:** ```json { "group_id": "group456", "page_size": 50 } ``` **Response:** ```json { "code": 0, "messages": [ { "message_id": "msg001", "sender": { "employee_code": "EMP123", "name": "John Doe" }, "tag": "text", "text": { "plain_text": "Hello team!" }, "created_at": 1615456789 }, { "message_id": "msg002", "sender": { "employee_code": "EMP456", "name": "Jane Smith" }, "tag": "image", "image": { "content": "https://example.com/image.jpg" }, "created_at": 1615456890 } ], "has_more": true, "next_cursor": "next_page_cursor" } ``` #### `send_message_to_group_chat` Send a message to a group chat which the bot has been added to. **Example (Text Message):** ```json { "group_id": "group456", "message": { "tag": "text", "text": { "content": "Hello everyone! This is an announcement.", "format": 1 } } } ``` **Example (Image Message):** ```json { "group_id": "group456", "message": { "tag": "image", "image": { "content": "base64_encoded_image_data" } } } ``` **Response:** ```json { "code": 0, "message_id": "msg123" } ``` #### `send_message_to_bot_user` Send a message to a user via the bot. **Example (Text Message):** ```json { "employee_code": "EMP123", "message": { "tag": "text", "text": { "content": "Hi there! Just checking in.", "format": 1 } } } ``` **Example (Interactive Message):** ```json { "employee_code": "EMP123", "message": { "tag": "interactive_message", "interactive_message": { "elements": [ { "tag": "header", "text": { "content": "Task Assignment", "tag": "plain_text" } }, { "tag": "section", "text": { "content": "You have been assigned a new task.", "tag": "plain_text" } }, { "tag": "action", "elements": [ { "tag": "button", "text": { "content": "Accept", "tag": "plain_text" }, "value": "accept_task" } ] } ] } } } ``` **Response:** ```json { "code": 0, "message_id": "msg125" } ``` ## Error Codes All API responses include a `code` field that indicates the status of the request: | Code | Description | |------|-------------| | 0 | Success | | 2 | Server error | | 5 | Resource not found | | 8 | Server error | | 100 | App access token is expired or invalid | | 101 | API is rejected due to rate limit control | | 102 | Request body contains invalid input | | 103 | App permission denied | | 104 | Bot capability is not turned on | | 105 | App is not online | ### Auth-specific errors | Code | Description | |------|-------------| | 1000 | App Secret is invalid | | 2000 | Single Sign-On Token is expired or invalid | | 2001 | User is not an employee of the current company | | 2002 | Token belongs to another app | | 2003 | Cursor invalid | | 2004 | Cursor expired | ### User-specific errors | Code | Description | |------|-------------| | 3000 | User not found with the current email | | 3001 | User not found with the current code | | 3002 | User is not a subscriber of the bot | | 3003 | User is not signed in to SeaTalk | | 3004 | Invalid custom field name | ### Message-specific errors | Code | Description | |------|-------------| | 4000 | Message type is invalid | | 4001 | Message exceeds the maximum length | | 4002 | Message sending failed | | 4003 | Message cannot be empty | | 4004 | Fail to fetch the quoted message due to SeaTalk's internal error | | 4005 | The quoted message cannot be found | | 4009 | Message cannot be found via the message id provided | | 4010 | The thread cannot be found | | 4011 | Mention everyone (@all) is not allowed in thread replies | | 4012 | No permission to update this message | ### App-specific errors | Code | Description | |------|-------------| | 5000 | appID mismatch | | 5001 | linkID expired | | 5002 | App not released yet | | 5003 | App link amount has reached the upper limit | ### Group chat errors | Code | Description | |------|-------------| | 7000 | Group chat not found with the current code | | 7001 | Bot is not a member of the group chat | ## License MIT