·

Google Sheets MCP với Cursor

Cài đặt Google Sheets MCP trong Cursor để AI agent có thể đọc và ghi dữ liệu bảng tính ngay trong trình soạn thảo.

Cursor đưa Google Sheets MCP vào ngay Agent Mode của IDE — nghĩa là bạn có thể yêu cầu agent vừa đọc dữ liệu từ một sheet cấu hình test, vừa sinh code dùng chính dữ liệu đó, trong cùng một luồng làm việc không phải chuyển tab sang trình duyệt. Đây là điểm khác biệt lớn nhất so với các client CLI thuần: Cursor có context của cả codebase đang mở, nên nó có thể nối dữ liệu từ Sheets với schema, model, hay test fixture đã tồn tại trong project một cách tự nhiên hơn. Bài này đi qua kết nối, hai use case đặc trưng của IDE (sinh code từ config trong sheet, và sync dữ liệu sheet vào fixture ứng dụng), và các hạn chế thực tế bạn sẽ gặp.

Kết Nối Google Sheets MCP vào Cursor Agent Mode

Cursor đọc cấu hình MCP từ .cursor/mcp.json ở cấp project hoặc ~/.cursor/mcp.json ở cấp global — global là lựa chọn tốt hơn cho Sheets MCP trong đa số trường hợp, vì bạn thường muốn quyền truy cập Sheets khả dụng ở mọi repo, không phải re-auth theo từng project.

{
  "mcpServers": {
    "sheets": {
      "command": "uvx",
      "args": ["--from", "mcp-google-sheets", "mcp-google-sheets"],
      "env": {
        "SERVICE_ACCOUNT_PATH": "/Users/you/.config/sheets-mcp/service-account.json"
      }
    }
  }
}

Chuẩn bị service account như các bài trước: tạo trong Cloud Console, bật Sheets API + Drive API, tải JSON key, và share từng spreadsheet cần dùng với email service account. Sau khi lưu mcp.json, mở Cursor Settings → MCP để xác nhận server hiện trạng thái đã kết nối (dấu tick xanh) trước khi thử gọi từ Agent Mode.

Trong Agent Mode, gõ thử: "Liệt kê các tab trong spreadsheet ID 1AbCxyz..."
Nếu Cursor trả về danh sách tab thật, kết nối đã hoạt động đúng.

Một điểm khác với Claude Code/OpenCode: Cursor không có lệnh CLI riêng để "get resolved config" như claude mcp get. Cách kiểm tra thực tế nhất là chạy chính command trong args ở terminal ngoài Cursor trước, xác nhận nó chạy được độc lập, rồi mới tin vào việc Cursor gọi đúng cùng command đó.

Mẹo: Đăng ký server ở --scope global (tức file ~/.cursor/mcp.json) trừ khi credentials chỉ nên dùng riêng cho một project cụ thể — hầu hết người dùng muốn truy cập Sheets khả dụng ở mọi repo họ mở trong Cursor, không phải cấu hình lại từng project.

Sinh Code Từ Config và Test Data Được Định Nghĩa Trong Spreadsheet

Đây là use case rất đặc trưng cho IDE mà CLI thuần không tận dụng tốt bằng: nhiều team lưu bảng cấu hình (feature flag, mapping mã lỗi, bảng giá theo tier) trong Google Sheets vì nó dễ chỉnh cho người không code, rồi cần convert sang code thật trong repo.

Đọc tab "Error-Codes" trong spreadsheet ID 1AbCxyz... (cột: code, message_en, message_vi, http_status).
Sinh file src/constants/errorCodes.ts, export một object TypeScript
map từ code sang { messageEn, messageVi, httpStatus }, giữ đúng thứ tự dòng trong sheet.
Dùng đúng convention naming hiện có trong file src/constants/ (camelCase cho key object).

Vì Cursor có context toàn bộ codebase đang mở, nó có thể tự phát hiện convention naming, import style, và thậm chí kiểu test hiện có — điều này giảm đáng kể lượng chi tiết bạn cần viết ra trong prompt so với khi làm việc thuần trên CLI không có ngữ cảnh code.

Với test data (ví dụ bảng các trường hợp test edge-case được QA maintain trong Sheets), pattern tương tự áp dụng cho việc sinh test file:

Đọc tab "Login-Test-Cases" (cột: description, input_email, input_password, expected_result).
Sinh test case Jest trong file tests/login.spec.ts, mỗi dòng sheet thành một it() block,
dùng description của dòng đó làm tên test, giữ nguyên input và expected_result.

Mẹo: Khi sinh code từ dữ liệu sheet, luôn yêu cầu agent giữ nguyên thứ tự dòng gốc trong output code — nếu QA hay product cần đối chiếu ngược lại "dòng số mấy trong sheet ứng với test nào trong code", thứ tự nhất quán giúp việc đối chiếu bằng mắt nhanh hơn nhiều so với để agent tự sắp xếp lại theo logic riêng của nó.

Đồng Bộ Dữ Liệu Sheet với Fixture Ứng Dụng Từ Cursor

Ngược hướng với việc trên: đôi khi bạn cần đẩy dữ liệu từ fixture trong code (JSON/YAML seed data) lên Sheets để người không code (PM, QA, support) review hoặc chỉnh sửa, rồi đồng bộ ngược lại.

Đọc file fixtures/products.json trong repo hiện tại.
Ghi nội dung đó vào tab "Products-Review" trong spreadsheet ID 1AbCxyz...,
mỗi field JSON thành một cột, mỗi object thành một dòng, dòng 1 là tên field.
Nếu tab đã tồn tại, xóa nội dung cũ trước khi ghi (nhưng hỏi tôi xác nhận trước khi xóa).

Và chiều ngược lại, sau khi PM đã chỉnh sửa trên Sheets:

Đọc tab "Products-Review" hiện tại trong spreadsheet ID 1AbCxyz...
So sánh với fixtures/products.json hiện có trong repo.
Chỉ ra rõ những dòng đã bị thay đổi giá trị (không chỉ liệt kê toàn bộ),
và hỏi tôi xác nhận trước khi ghi đè lại file fixtures/products.json.

Đây là một vòng lặp review rất thực tế: code → sheet (để người không code review) → sheet đã sửa → code (agent merge lại), và bước "chỉ ra rõ dòng nào thay đổi" quan trọng hơn bước ghi — bạn cần biết chính xác cái gì đã đổi trước khi để agent overwrite file fixture trong repo.

Mẹo: Luôn yêu cầu agent diff rõ ràng (dòng nào thay đổi, giá trị cũ và mới) trước khi ghi đè file fixture trong repo từ dữ liệu sheet — đừng để agent overwrite trực tiếp mà không cho bạn thấy được đúng những gì đã thay đổi, vì fixture sai lệch âm thầm là loại lỗi rất khó phát hiện qua code review thông thường.

Hạn Chế Đã Biết và Cách Xử Lý Khi Dùng Google Sheets MCP Trong Cursor

Vài hạn chế thực tế bạn cần biết trước khi phụ thuộc vào workflow này:

  • Cursor Agent Mode có giới hạn số tool-call trong một turn ở một số phiên bản/plan — với workflow cần đọc nhiều tab lớn liên tiếp (ví dụ đọc 5 tab để join dữ liệu), agent có thể dừng giữa đường và cần bạn "tiếp tục" thủ công. Chia nhỏ yêu cầu thành từng bước rõ ràng (đọc tab A, sau đó đọc tab B, sau đó xử lý) giúp giảm rủi ro này hơn là gộp hết vào một prompt lớn.
  • Không có UI riêng để xem trước diff của write_range như một số extension Git có — bạn phải dựa vào mô tả bằng lời của agent hoặc tự mở tab Sheets trong trình duyệt để double-check sau khi ghi.
  • Service account credentials path tuyệt đối trong .cursor/mcp.json không portable giữa máy của các thành viên team — nếu commit file này, dùng biến môi trường tham chiếu, không hardcode đường dẫn máy cá nhân.
Workaround cho giới hạn tool-call: chia prompt lớn thành các bước tuần tự rõ ràng,
xác nhận từng bước hoàn thành trước khi yêu cầu bước tiếp theo, thay vì
"đọc 5 tab rồi join tất cả rồi ghi kết quả" trong một câu.

Mẹo: Với bất kỳ workflow Sheets nào cần đọc nhiều tab hoặc ghi nhiều range trong Cursor, chủ động chia nhỏ prompt thành từng bước tuần tự có xác nhận trung gian — điều này không chỉ tránh giới hạn tool-call mà còn cho bạn nhiều điểm dừng để phát hiện lỗi sớm hơn là chờ đến cuối một chuỗi thao tác dài.

Tips

  • Đăng ký server Sheets MCP ở scope global trong Cursor trừ khi có lý do cụ thể cần scope theo project.
  • Tận dụng context codebase của Cursor khi sinh code từ dữ liệu sheet — nó tự bám convention hiện có, giảm chi tiết cần viết trong prompt.
  • Luôn yêu cầu diff rõ ràng trước khi để agent ghi đè fixture trong repo từ dữ liệu sheet.
  • Chia nhỏ workflow nhiều tab thành các bước tuần tự để tránh giới hạn tool-call trong một turn.

Mẹo: Trước khi tin tưởng một pipeline sync sheet-fixture chạy tự động, tự chạy tay ít nhất một vòng đầy đủ (code → sheet → sửa → sheet → code) và kiểm tra kỹ từng bước diff — pipeline hai chiều luôn có nhiều điểm lỗi ẩn hơn pipeline một chiều, và Cursor không có safety net tích hợp nào bù đắp cho việc bạn bỏ qua bước kiểm tra này.