OpenCode là một agentic coding CLI mã nguồn mở, terminal-based, hỗ trợ nhiều provider model (Anthropic, OpenAI, Gemini, model local qua Ollama...) và có hệ thống MCP client riêng khai báo qua file config JSON/JSONC của project. Vì OpenCode không giới hạn bạn vào một model cố định, Sequential Thinking MCP ở đây đặc biệt hữu ích để chuẩn hoá chất lượng lập luận bất kể bạn đang chạy model nào — model yếu hơn cũng được "ép" đi qua từng bước rõ ràng thay vì trả lời cụt lủn. Bài này hướng dẫn cấu hình server, cách chạy một session phân tích có cấu trúc, một ví dụ lập kế hoạch database migration, và các hạn chế cần biết.
Cài Đặt và Kết Nối Sequential Thinking MCP Vào OpenCode
OpenCode đọc cấu hình MCP từ file opencode.json (hoặc opencode.jsonc) ở root project, dưới key mcp. Thêm Sequential Thinking như một local MCP server chạy qua stdio:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"sequential-thinking": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-sequential-thinking"],
"enabled": true
}
}
}
Lưu ý khác biệt so với format mcpServers của Claude Desktop/Claude Code: OpenCode dùng key mcp (không phải mcpServers), field command là một array gồm cả executable và args gộp chung (không tách command/args riêng), và có field type: "local" để phân biệt với type: "remote" (server chạy qua HTTP/SSE, dùng field url thay cho command).
Sau khi lưu file, khởi động OpenCode trong project đó:
opencode
Trong TUI (terminal UI), gõ /mcp hoặc kiểm tra phần status bar để xác nhận sequential-thinking đang ở trạng thái connected. Nếu muốn debug sâu hơn, chạy OpenCode với flag verbose để xem log giao tiếp MCP:
opencode --log-level debug
Nếu bạn không muốn commit config MCP vào repo chung (ví dụ đang thử nghiệm cá nhân), đặt file cấu hình ở ~/.config/opencode/opencode.json — OpenCode merge config global với config project, config project override config global khi trùng key.
Mẹo: Khi mới thêm một MCP server vào OpenCode, luôn kiểm tra bằng
/mcptrong TUI trước khi giao task thật — OpenCode fail âm thầm (silent fail) khá nhiều lần nếu binarynpxkhông nằm trong PATH mà OpenCode process nhìn thấy, đặc biệt khi chạy OpenCode dưới một session tmux/nohup không load đủ shell profile.
Chạy Các Session Phân Tích Có Cấu Trúc Trong OpenCode
Vì OpenCode hỗ trợ chuyển model linh hoạt (opencode --model anthropic/claude-sonnet-4-5 hoặc đổi ngay trong TUI), một thực hành hữu ích là dùng Sequential Thinking để bù lại sự khác biệt về chất lượng suy luận giữa các model. Ví dụ, khi chạy với một model nhỏ hơn cho task cần phân tích nhiều bước, ép nó đi qua tool này giúp giảm đáng kể tình trạng trả lời hời hợt.
Ví dụ prompt mở một session phân tích:
Dùng sequential thinking để phân tích: hệ thống hiện tại dùng REST polling
mỗi 5s để check trạng thái job, gây tải cao lên DB khi có 200+ client cùng lúc.
Hãy so sánh 3 hướng: WebSocket, Server-Sent Events, và message queue + webhook.
Với mỗi hướng, đánh giá theo 4 tiêu chí: độ phức tạp triển khai, chi phí hạ tầng,
khả năng scale, và mức độ thay đổi cần ở client hiện tại.
Trong suốt session, mỗi lần agent gọi sequentialthinking, bạn sẽ thấy nội dung thought hiện ra trực tiếp trong TUI (OpenCode hiển thị tool call inline, không ẩn đi như một số client khác) — đây là lợi thế của OpenCode cho việc học cách model suy luận: bạn theo dõi real-time thay vì chỉ nhận kết quả cuối.
Một thực hành tốt là kết thúc mỗi session phân tích bằng yêu cầu tường minh:
Kết thúc chuỗi suy luận, tóm tắt lại bằng bảng so sánh 3 hướng theo 4 tiêu chí trên,
và đưa ra khuyến nghị cuối cùng kèm lý do ngắn gọn.
Mẹo: Bật chế độ "share session" của OpenCode (
opencode --sharehoặc lệnh share trong TUI) khi làm phân tích kiến trúc quan trọng — link session share giữ lại toàn bộ chuỗi thought, tiện để paste vào ticket hoặc gửi cho reviewer thay vì copy-paste tay từng đoạn.
Ví Dụ Thực Tế: Lập Kế Hoạch Database Migration Từng Bước
Bài toán cụ thể: migrate một bảng users 40 triệu row từ Postgres single-instance sang một schema mới có thêm cột tenant_id để chuẩn bị multi-tenant, không được downtime quá 5 phút.
Prompt kích hoạt Sequential Thinking cho task này:
Dùng sequential thinking để lập plan migrate bảng users (40M rows) sang schema
mới có thêm cột tenant_id (NOT NULL, default suy ra từ bảng accounts hiện có).
Yêu cầu: downtime dưới 5 phút, có rollback plan cho mỗi bước, migration chạy
trên Postgres 15. Liệt kê rõ từng bước migration kèm câu lệnh SQL cụ thể.
Chuỗi thought thực tế thường triển khai theo hướng dùng kỹ thuật zero/low-downtime migration kinh điển — thêm cột nullable trước, backfill theo batch, rồi mới thêm constraint:
{"thought": "Bước 1: Thêm cột tenant_id nullable, KHÔNG kèm NOT NULL để tránh full table lock. ALTER TABLE users ADD COLUMN tenant_id uuid;", "thoughtNumber": 1, "totalThoughts": 5, "nextThoughtNeeded": true}
{"thought": "Bước 2: Backfill theo batch 10k rows dùng UPDATE ... WHERE id BETWEEN để tránh lock lâu, chạy qua script ngoài giờ cao điểm, có sleep giữa batch để giảm tải replication lag.", "thoughtNumber": 2, "totalThoughts": 5, "nextThoughtNeeded": true}
{"thought": "Bước 3: Sau khi backfill 100%, verify bằng SELECT count(*) FROM users WHERE tenant_id IS NULL = 0, sau đó mới ADD CONSTRAINT NOT NULL — thao tác này chỉ full-scan validate, không lock viết nếu dùng NOT VALID trước rồi VALIDATE CONSTRAINT sau (Postgres 12+ hỗ trợ tách 2 bước này).", "thoughtNumber": 3, "totalThoughts": 5, "nextThoughtNeeded": true}
Điểm giá trị nhất ở đây: agent tự "nhớ" ràng buộc downtime 5 phút xuyên suốt các bước, và ở bước 3 áp dụng đúng kỹ thuật NOT VALID + VALIDATE CONSTRAINT để tránh full table lock — một chi tiết dễ bị bỏ qua nếu hỏi một câu duy nhất "viết cho tôi migration script".
Mẹo: Với migration liên quan production database, luôn yêu cầu thêm ở cuối prompt: "kèm câu lệnh kiểm tra (verification query) sau mỗi bước và câu lệnh rollback tương ứng" — Sequential Thinking sẽ tự nhiên sinh ra các cặp forward/rollback theo từng bước nếu bạn yêu cầu rõ ngay từ đầu.
Các Hạn Chế Đã Biết Của Sequential Thinking MCP Trong OpenCode
Một vài giới hạn cần lưu ý khi dùng kết hợp OpenCode và Sequential Thinking trong thực tế:
- Phụ thuộc model đang chọn: OpenCode cho đổi model tự do, nhưng chất lượng thought sinh ra khác biệt rất lớn giữa các model — model nhỏ có thể gọi tool đúng cú pháp nhưng nội dung thought hời hợt, không thực sự "suy luận" sâu hơn so với trả lời thẳng.
- Không có UI tổng hợp branch/revision đẹp: khác với một số IDE có thể render cây branching trực quan, OpenCode TUI hiện thought tuần tự dạng text — nếu agent tạo nhiều branchId, bạn phải tự đọc kỹ để tránh nhầm nhánh.
- Server state không persist qua session mới: mỗi lần bạn mở session OpenCode mới (không phải resume session cũ), server Sequential Thinking bắt đầu lại từ đầu — không có cơ chế lưu lại chuỗi thought cũ để tiếp tục nếu bạn tắt rồi mở lại mà không dùng tính năng resume của OpenCode.
- Không tự dừng đúng lúc nếu prompt mơ hồ: nếu bạn không giới hạn rõ số bước tối đa mong muốn, một số model có xu hướng kéo dài chuỗi thought hơn cần thiết khi task không có tiêu chí "hoàn thành" rõ ràng.
Mẹo: Khi cần giữ lại một chuỗi phân tích quan trọng để tham chiếu sau, đừng phụ thuộc vào việc resume session — export toàn bộ nội dung ra file markdown ngay sau khi session kết thúc (copy trực tiếp từ TUI hoặc dùng session share) và commit vào thư mục docs/decisions của repo.