Bài 18 · Nâng cao · 22 phút
MCP: cho Claude xem báo cáo
Biên soạn bởi Nguyễn Anh Tuấn
Mở một MCP server (Model Context Protocol) read-only cho web bán hàng để chủ shop hỏi Claude bằng lời và xem báo cáo: doanh thu, đơn, tồn kho giftcard, audit. Hiểu MCP là chuẩn mở kết nối Claude với dữ liệu của bạn; phân biệt tool và resource; vì sao chỉ expose tool ĐỌC (least privilege, tách hẳn hành động admin); xác thực OAuth để chỉ chủ shop kết nối được; cách thêm remote MCP server làm connector trên Claude.ai/Desktop hoặc claude mcp add ở Claude Code sau khi deploy lên domain công khai.
Mèo con vừa dựng metrics, audit log & báo cáo - "đôi mắt" của shop. Nhưng để xem, phải mở dashboard và tự nhìn. Sẽ tiện hơn nhiều nếu mèo con hỏi Claude bằng lời: "doanh thu hôm nay bao nhiêu?", "SKU giftcard nào sắp hết kho?", "có giao dịch nạp tiền nào lạ không?" - và Claude trả lời từ số liệu của chính shop.
Cây cầu nối Claude với dữ liệu shop là MCP (Model Context Protocol). Bài này dựng một MCP server read-only cho shop - một cửa sổ chỉ-đọc, có xác thực, để mèo con (qua Claude) xem báo cáo mà không bao giờ đụng được vào tiền hay đơn.
MCP là một chuẩn mở do Anthropic khởi xướng, cho Claude kết nối tới dữ liệu và công cụ bên ngoài theo một cách chuẩn hoá. Nó thường được ví như cổng USB-C cho AI: thay vì mỗi nguồn dữ liệu một kiểu cắm riêng, mọi thứ nói chung một chuẩn. Web của mèo con mở một remote MCP server - một endpoint HTTPS - và Claude (trên claude.ai, Claude Desktop, hay Claude Code) cắm vào đó.
- ▸MCP (Model Context Protocol): chuẩn mở để Claude kết nối dữ liệu/công cụ bên ngoài.
- ▸Remote MCP server = một endpoint HTTPS shop tự mở ra; Claude là phía kết nối tới.
- ▸Mục tiêu bài này: một MCP server CHỈ ĐỌC báo cáo, có xác thực - không phải cổng điều khiển shop.
MCP server phơi ra hai thứ cho Claude. Tool là một hành động có tên và tham số mà Claude gọi được; resource là một mẩu dữ liệu Claude đọc trực tiếp. Cho việc xem báo cáo, mèo con chủ yếu định nghĩa vài tool đọc:
các tool ĐỌC của MCP server báo cáo (mô tả; Claude viết hộ phần implementation)
get_doanh_thu(tu_ngay, den_ngay) -> tổng tiền, số đơn trong khoảng
get_ton_kho_thap(nguong) -> các SKU giftcard tồn dưới ngưỡng
get_don_gan_day(so_luong) -> vài đơn mới nhất (đã ẩn bớt thông tin)
get_su_kien_audit(tu_ngay) -> nhật ký thao tác đáng chú ý
# KHÔNG có tool nào: tạo đơn, đổi giá, hoàn tiền, sửa kho... - ▸Tool = hành động Claude gọi (có tên + tham số); resource = dữ liệu Claude đọc.
- ▸Báo cáo ⇒ chỉ định nghĩa tool ĐỌC, tuyệt đối không có tool ghi/sửa.
- ▸Mỗi tool trả số liệu tổng hợp đã lọc, không đổ nguyên bảng dữ liệu thô ra ngoài.
Tách bạch với hành động admin
Một remote MCP server là một endpoint trên internet. Không khoá thì số liệu shop lộ cho bất kỳ ai biết URL. Vì vậy MCP server bắt buộc có xác thực: Claude kết nối qua OAuth - chủ shop đăng nhập một lần, Claude giữ token và đính kèm cho mỗi lần gọi. Cùng họ "đúng người mới xem được" với bài Đăng nhập Better-auth.
- ▸Remote MCP server công khai trên internet ⇒ phải có xác thực, không để trống.
- ▸MCP dùng OAuth: chủ shop đăng nhập một lần, Claude giữ token và gửi kèm mỗi request.
- ▸Token cấp đúng phạm vi ĐỌC BÁO CÁO - không kèm quyền chạm tiền/đơn/kho.
Mô tả cho Claude khá gọn: một MCP server phơi ra vài tool đọc ở Step 3, mỗi tool truy vấn báo cáo từ database (tái dùng đúng các hàm đã viết ở bài metrics), bọc xác thực, và không có tool ghi.
gõ trong ô Claude Code
Dựng cho shop một remote MCP server read-only để xem báo cáo, dùng package
@modelcontextprotocol/sdk. Đặt route ở app/mcp/route.ts (Next.js App Router).
Expose đúng 4 tool ĐỌC sau, mỗi tool tái dùng các hàm truy vấn báo cáo đã viết
ở bài metrics (đừng viết query mới, import lại hàm cũ trong lib/reports):
- get_doanh_thu(tu_ngay, den_ngay): trả tổng tiền và số đơn trong khoảng.
- get_ton_kho_thap(nguong): trả các SKU giftcard tồn dưới ngưỡng.
- get_don_gan_day(so_luong): trả vài đơn mới nhất, đã ẩn bớt PII (không trả
email, số điện thoại khách).
- get_su_kien_audit(tu_ngay): trả các dòng audit log đáng chú ý.
Mỗi tool chỉ trả số liệu tổng hợp đã lọc, KHÔNG đổ nguyên bảng dữ liệu thô.
TUYỆT ĐỐI không tạo tool nào ghi/sửa (tạo đơn, đổi giá, hoàn tiền, sửa kho).
Bọc xác thực OAuth bằng Better-auth: mỗi request tới MCP server phải có token
hợp lệ thuộc phạm vi đọc báo cáo, không có token thì trả 401. Tái dùng cấu hình
Better-auth đã có ở bài đăng nhập, đừng dựng hệ xác thực mới.
Xong khi: server chạy được ở localhost, gọi thử 4 tool đều trả số, và không có
tool nào sửa được dữ liệu. Tới lượt mèo con
Trung thực: vẫn là một cửa ra dữ liệu
Có server rồi, nối Claude vào. Vì remote MCP cần một URL công khai, mèo con làm bước này sau khi đã deploy shop lên domain (bài kế). Lúc phát triển, test trước bằng Claude Code trỏ vào localhost.
kết nối Claude tới MCP server của shop
# Claude.ai / Claude Desktop: thêm một "connector"
# → dán URL MCP server của shop → đăng nhập OAuth
# Claude Code (test khi phát triển hoặc dùng thật):
claude mcp add bao-cao-shop https://meoshop.vn/mcp
# Rồi hỏi bằng lời:
# "Doanh thu 7 ngày qua thế nào?"
# "SKU giftcard nào tồn dưới 10?" Tới lượt mèo con
Mèo con vừa cho shop một cách trò chuyện với số liệu: hỏi Claude bằng lời, nhận câu trả lời từ chính báo cáo của shop - qua một cửa read-only, có xác thực, không đụng được tiền hay đơn.
- ▸MCP server báo cáo = chỉ tool ĐỌC + xác thực OAuth + trả số tổng hợp (không PII thô).
- ▸Tách hẳn khỏi hành động admin; least privilege; subagent bảo mật rà lại.
- ▸Remote MCP cần URL công khai ⇒ kết nối Claude.ai sau khi deploy + có domain.
Bước tiếp theo
Câu hỏi thường gặp
MCP (Model Context Protocol) là một chuẩn mở do Anthropic khởi xướng, cho phép trợ lý AI như Claude kết nối tới dữ liệu và công cụ bên ngoài theo một cách chuẩn hoá. Nó thường được ví như "cổng USB-C cho AI": thay vì mỗi app một kiểu cắm, mọi thứ nói chung một chuẩn. Web của mèo con mở một MCP server, Claude cắm vào để đọc báo cáo.
Dashboard admin là để mèo con nhìn bằng mắt. MCP là để HỎI BẰNG LỜI: "doanh thu hôm nay bao nhiêu?", "SKU nào sắp hết kho?", "có giao dịch lạ không?" - Claude gọi tool đọc của MCP server rồi trả lời. Tiện khi đang đi ngoài, hỏi nhanh trên điện thoại, hoặc muốn Claude tổng hợp/so sánh số liệu giúp.
Tool là một HÀNH ĐỘNG Claude gọi được, có tên và tham số - vd get_doanh_thu(tu_ngay, den_ngay). Resource là một mẩu DỮ LIỆU Claude đọc trực tiếp - vd một báo cáo có sẵn. Cho mục đích xem báo cáo, mèo con chủ yếu expose vài tool ĐỌC; điểm cốt lõi là chúng chỉ đọc, không có tool nào ghi/sửa.
Vì Claude (và bất cứ ai chiếm được kết nối) chỉ nên XEM được số, không bao giờ đổi được tiền, đơn hay kho qua đường này. Tách bạch: hành động thay đổi dữ liệu nằm ở trang admin có phân quyền (bài Trang quản trị); MCP server chỉ là một cửa sổ chỉ-đọc nhìn vào báo cáo. Least privilege - cấp đúng mức quyền tối thiểu.
BẮT BUỘC có xác thực. Một remote MCP server là một endpoint trên internet; không khoá thì số liệu shop lộ cho bất kỳ ai biết URL. MCP dùng OAuth: chủ shop đăng nhập một lần, Claude giữ token và dùng nó cho mỗi lần gọi. Cấp token chỉ phạm vi đọc báo cáo, không hơn.
Remote MCP server là một endpoint HTTPS công khai. Trên Claude.ai hoặc Claude Desktop, mèo con thêm nó như một "connector" (dán URL, đăng nhập OAuth). Với Claude Code thì dùng lệnh claude mcp add. Vì cần URL công khai, bước này làm sau khi đã deploy shop lên domain ở các bài kế; lúc phát triển thì test bằng Claude Code trỏ vào localhost.