OpenCode là một trong những coding agent CLI mã nguồn mở phát triển nhanh, và cách nó quản lý MCP server có vài điểm khác biệt đáng chú ý so với Claude Code — đặc biệt ở cấu trúc file config và cách xử lý provider. Bài này hướng dẫn cấu hình Slack MCP cho OpenCode, cùng một workflow thực tế: broadcast release note tới stakeholder mà không cần rời khỏi terminal.
Cài Đặt và Kết Nối Slack MCP Với OpenCode
OpenCode dùng file cấu hình opencode.json (thường đặt ở root project hoặc ~/.config/opencode/opencode.json cho cấu hình global). Khai báo MCP server trong mục mcp:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"slack": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-slack"],
"environment": {
"SLACK_BOT_TOKEN": "{env:SLACK_BOT_TOKEN}",
"SLACK_TEAM_ID": "{env:SLACK_TEAM_ID}"
},
"enabled": true
}
}
}
Khác với Claude Code, OpenCode dùng cú pháp {env:VAR_NAME} để nội suy biến môi trường thay vì ${VAR_NAME} — nếu bạn copy config từ Claude Code sang mà không đổi cú pháp này, server sẽ fail âm thầm (token rỗng) mà không báo lỗi rõ ràng.
Set biến môi trường trước khi chạy:
export SLACK_BOT_TOKEN="xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx"
export SLACK_TEAM_ID="T0XXXXXXX"
opencode
Trong session OpenCode, kiểm tra server đã kết nối qua lệnh:
/mcp
Lệnh này in ra danh sách server và trạng thái (connected / error / disabled). Nếu thấy error, thường là do thiếu token hoặc npx không tải được package (kiểm tra kết nối mạng, hoặc pre-install package bằng npm install -g @modelcontextprotocol/server-slack rồi đổi command thành đường dẫn binary trực tiếp).
Mẹo: Nếu team dùng OpenCode với nhiều provider LLM khác nhau (Anthropic, OpenAI, local model qua Ollama), hãy test Slack MCP tool-calling riêng với từng provider — không phải model nào cũng tuân thủ tool schema tốt như nhau, đặc biệt với model nhỏ chạy local.
Đọc Channel và Đăng Message Từ OpenCode
Sau khi kết nối, bạn tương tác với Slack hoàn toàn bằng ngôn ngữ tự nhiên trong session chat của OpenCode. Ví dụ đọc channel:
Liệt kê 10 message gần nhất trong #backend-team, cho tôi biết
ai đang thảo luận về việc migrate database.
OpenCode sẽ gọi tool tương ứng (list_channels để tìm đúng channel ID nếu bạn chỉ nhớ tên, sau đó get_channel_info hoặc method đọc lịch sử) và trả về bản tóm tắt bằng tiếng Việt (hoặc ngôn ngữ bạn dùng để hỏi).
Đăng message:
Đăng vào #backend-team: "Đã hoàn thành migration script cho bảng
orders, đang chờ review PR #482 trước khi chạy trên production."
Với OpenCode, một điểm cần lưu ý là cách agent xử lý permission cho tool call: theo mặc định, OpenCode có thể yêu cầu xác nhận (approve) trước mỗi lần gọi tool có tác dụng phụ (side effect) như post_message, tuỳ vào cấu hình permission trong opencode.json:
{
"permission": {
"tool": {
"slack_post_message": "ask",
"slack_search_messages": "allow"
}
}
}
Với "ask", OpenCode sẽ dừng lại và hỏi bạn trước khi thực sự đăng — đây là default nên giữ cho các action có tác động ra ngoài hệ thống, chỉ nên set "allow" sau khi đã tin tưởng agent qua một thời gian sử dụng.
Mẹo: Giữ
"ask"cho mọi action viết (post/update/delete message) trong ít nhất 2-3 tuần đầu để quan sát agent hành xử đúng ý chưa, chỉ chuyển sang"allow"cho channel nội bộ ít rủi ro (ví dụ channel log riêng của bạn).
Ví Dụ Thực Tế: Broadcast Release Note Tới Stakeholder
Đây là workflow tiết kiệm thời gian rõ rệt: thay vì tự viết release note rồi copy sang nhiều channel, để agent tổng hợp từ changelog/git log và đăng đồng loạt theo đúng tone cho từng đối tượng.
Đọc git log từ tag v2.3.0 đến HEAD. Tạo release note ngắn gọn
(không quá 6 dòng, ngôn ngữ business, tránh thuật ngữ kỹ thuật sâu)
và đăng vào #product-updates.
Sau đó tạo một bản kỹ thuật hơn (kèm breaking changes nếu có)
và đăng vào #eng-all.
OpenCode sẽ chạy git log v2.3.0..HEAD --oneline qua tool shell, phân loại commit theo convention (feat/fix/breaking), soạn hai bản nội dung khác tone, rồi gọi post_message hai lần vào hai channel khác nhau. Đây là minh chứng rõ cho giá trị "một agent, nhiều tool phối hợp" — kết hợp git tool và Slack MCP tool trong cùng một tác vụ.
Mẹo: Luôn yêu cầu agent hiển thị (preview) cả hai bản nội dung trước khi đăng thật, đặc biệt bản đăng vào channel business — sai một từ chuyên ngành dịch sang "ngôn ngữ thường" có thể gây hiểu lầm cho stakeholder không rành kỹ thuật.
Hạn Chế Đã Biết Của Slack MCP Trong OpenCode
Vài hạn chế thực tế bạn nên biết trước khi đưa vào production workflow:
- Không tự động retry khi rate limit. Một số version OpenCode chưa xử lý tốt response
429 Too Many Requeststừ Slack API — agent có thể báo lỗi tool call thay vì tự chờ và retry. Giải pháp tạm: giảm số lần gọi tool liên tiếp, hoặc thêm delay giữa các action trong prompt. - Threading đôi khi bị lệch. Khi yêu cầu "trả lời vào đúng thread", một số OpenCode version cũ (trước khi cập nhật tool schema cho
thread_ts) có thể tạo message mới thay vì reply — luôn kiểm tra lại kết quả, đừng tin tuyệt đối lần đầu dùng. - Không hỗ trợ upload file đính kèm qua MCP tool chuẩn — nếu cần gửi file (log, screenshot), bạn vẫn phải làm thủ công qua Slack UI hoặc dùng script riêng gọi
files.uploadngoài phạm vi MCP. - Giới hạn context khi đọc thread cực dài tương tự các client khác — cần chia nhỏ nếu vượt quá vài chục nghìn token.
Mẹo: Luôn chạy một lệnh
/mcpkiểm tra trạng thái server đầu mỗi session dài, và test bằng một action "đọc" vô hại (như list channel) trước khi giao agent các action "viết" quan trọng — phát hiện sớm lỗi kết nối trước khi nó gây hậu quả thật trên channel công khai.
Lưu Ý Thêm Khi Vận Hành Lâu Dài
Vài kinh nghiệm rút ra sau khi dùng Slack MCP với OpenCode trong workflow hàng ngày:
- Đặt alias cho các prompt lặp lại. Nếu ngày nào cũng yêu cầu agent tổng hợp digest buổi sáng từ vài channel cố định, lưu prompt đó thành một custom command trong OpenCode (
.opencode/commands/) để gọi bằng một dòng lệnh ngắn thay vì gõ lại toàn bộ yêu cầu. - Theo dõi chi phí token. Mỗi lần agent đọc một channel lớn qua
search_messageshoặc lấy lịch sử dài, lượng token tiêu tốn có thể tăng đáng kể — nên giới hạn phạm vi thời gian (after:,before:) trong query mặc định. - Đồng bộ config giữa các máy trong team. Nếu nhiều kỹ sư cùng dùng OpenCode với Slack MCP, hãy commit
opencode.json(không chứa token) vào repo để mọi người có cùng bộ tool và permission, tránh tình trạng "máy tôi hoạt động, máy bạn không".
Mẹo: Định kỳ (ví dụ hàng tháng) rà soát lại danh sách channel mà bot đã được invite vào — loại bỏ quyền truy cập channel không còn cần thiết, giảm diện tấn công (attack surface) nếu token bị lộ.