VS Code, Cursor 및 Windsurf에서 Google Sheets 사용하기 (MCP 기반)
요약
Model Context Protocol(MCP)을 활용하여 VS Code, Cursor, Windsurf와 같은 AI 코드 에디터에서 Google Sheets 데이터를 직접 읽어오는 방법을 설명합니다. PasteSheet을 통해 복잡한 OAuth 설정 없이 URL 하나로 에이전트에게 시트 데이터를 도구로 제공할 수 있습니다.
핵심 포인트
- MCP를 통해 AI 에이전트가 외부 데이터 소스인 Google Sheets에 직접 접근 가능
- PasteSheet을 사용하면 복잡한 Google Cloud 설정 없이 URL만으로 연결 가능
- VS Code, Cursor, Windsurf 등 주요 에디터의 MCP 설정 방식 차이 안내
- 스키마 정보를 에이전트에게 제공하여 데이터 쿼리 정확도 향상
제가 코딩할 때 필요한 데이터의 절반은 리포지토리에 존재하지 않습니다. 시드 행(Seed rows), 가격표, 작은 기능 플래그 목록, 비기술적인 팀원이 소유한 문구 등 모든 것이 Google Sheet에 들어 있습니다. 그리고 에디터의 에이전트가 이 시트에서 값을 필요로 할 때마다 저는 탭을 넘기거나, 셀 블록을 복사하여 채팅창에 붙여넣는 작업을 해야 했습니다. 처음에는 괜찮습니다. 하지만 네 번째부터는 무언가를 하는 데 드는 세금(tax)처럼 느껴집니다.
해결책은 에디터가 시트 자체를 읽게 하는 것입니다. MCP, 즉 Model Context Protocol은 AI 클라이언트가 외부 데이터 소스에 연결하는 표준 방식입니다. 서버가 에이전트에게 작은 도구 세트를 건네주고, 에이전트는 언제 호출할지 결정합니다. VS Code, Cursor, Windsurf는 모두 이 방식을 네이티브하게 지원하므로, 하나와 통신하기 위해 플러그인이나 로컬 프로세스가 필요하지 않습니다.
그들이 필요한 것은 가리킬 서버일 뿐입니다. PasteSheet은 '링크가 있는 모든 사용자'와 공유한 Google Sheet를 가져와 MCP 엔드포인트로 호스팅하며, 이는 클라이언트가 연결할 수 있는 URL에 불과합니다. Google Cloud 프로젝트도 없고, OAuth 동의 화면도 없으며, 서비스 계정 JSON 파일도 필요 없습니다. 이 게시물은 그 URL을 세 에디터 모두에 넣고, 설정 파일에서 제가 20분을 낭비했던 유일한 차이점을 다룹니다.
하나의 URL과 세 개의 설정 파일
연결된 각 시트는 https://pastesheet.com/mcp/sheets/your-endpoint-id와 같은 자체 MCP URL을 갖게 됩니다. 전송 방식은 일반적인 스트리밍 HTTP이므로, 설치할 것도 없고 기계에서 실행되는 것도 없습니다.
여기서 중요한 틀(framing)은 '연결(connect)'하는 것이 아니라 '게시(publish)'하는 것입니다. 대부분의 도구는 OAuth와 사용자가 직접 설정해야 하는 Cloud 프로젝트를 통해 에디터에 전체 Google 계정을 연결하기를 원하며, 이는 에이전트에게 우리가 신경 쓰는 하나의 시트보다 훨씬 많은 것을 제공합니다. 게시(Publishing)는 반대 방향으로 작동합니다: 하나의 시트가 하나의 엔드포인트가 되고, 에이전트는 그 시트와 드라이브의 다른 어떤 것도 읽을 수 있게 됩니다.
연결되면 에이전트는 세 가지 읽기 전용 도구를 얻게 됩니다. list_tabs는 시트의 탭을 보여주고, get_schema는 각 열의 이름과 추론된 타입을 보여주며, query_rows는 필터링, 정렬 및 페이지네이션이 적용된 행을 읽어옵니다. 이 중 중간 도구가 보이는 것보다 더 큰 중요성을 가집니다. 실제 열 이름을 모르는 에이전트는 이를 추측하고, 쿼리 절반은 빈 결과로 돌아옵니다. 스키마를 먼저 읽을 수 있게 되면, 실제 열에 대해 쿼리를 작성하며 첫 시도에 결과를 얻습니다.
이제 설정들을 보겠습니다. 동일한 서버, 동일한 URL이지만, 설명하는 방식에 있어 서로 다른 세 개의 파일이 있습니다.
VS Code 및 Copilot 에이전트 모드
VS Code는 워크스페이스의 .vscode/mcp.json에서 MCP 서버를 읽거나, 시트를 어디서든 사용할 수 있도록 사용자 레벨 설정에서 읽습니다. 파일을 생성하고 엔드포인트 URL을 붙여넣으세요:
{
"servers": {
"pastesheet": {
...
VS Code에만 특정한 두 가지 사항이 있습니다. 최상위 키는 mcpServers가 아니라 servers이며, 전송 방식(transport)은 `
Windsurf 및 Cascade
Windsurf의 Cascade 에이전트 역시 MCP를 네이티브로 지원합니다. MCP 설정을 열거나 mcp_config.json 파일을 직접 편집하세요:
{
"mcpServers": {
"pastesheet": {
...
자세히 살펴보세요. 키(key)가 url이 아니라 serverUrl입니다. 세 가지 도구 중 Windsurf만이 이 방식으로 철자를 사용하며, 이것이 바로 제가 언급했던 '20분간의 시행착오'입니다. 작동하던 Cursor 블록을 그대로 복사해 붙여넣었지만, 아무것도 변경하지 않았음에도 Cascade는 도구(tools)를 보여주지 않았고 에러도 발생하지 않았습니다. 연결 실패도, 경고도 아니었습니다. 그저 아직 서버가 추가되지 않은 상태와 똑같이 보이는 빈 도구 목록만 나타났습니다. 자신의 설정이 맞는지 확인하고 싶다면 Windsurf 가이드에서 해당 블록의 상세 내용을 확인할 수 있습니다.
이러한 '조용한 실패(silent failure)'가 바로 이 포스트를 작성한 진짜 이유입니다. 세 개의 에디터, 하나의 프로토콜, 그리고 잘못된 키를 입력했을 때 디버깅할 수 있는 아무런 정보도 남기지 않는 세 가지의 JSON 방언(dialects)이 존재합니다. 이러한 차이점들을 일일이 머릿속에 담아두고 싶지 않다면, MCP 설정 생성기 (MCP config generator)를 사용하세요. 각 클라이언트에 맞는 정확한 블록과 파일 경로를 생성해 줍니다. 시트 URL을 붙여넣고, 필요한 것을 복사하기만 하면 됩니다.
실제 사용하기
서버가 등록되면 그저 요청만 하면 됩니다. 그러면 에이전트가 데이터가 필요할 때 도구를 호출합니다. Cursor에서 가격표 시트를 대상으로 수행하는 실제 상호작용 예시입니다:
사용자: Starter 플랜에 검색 위젯이 포함되어 있나요? 가격표를 확인해 보세요.
에이전트: [get_schema 호출, 컬럼 확인: plan, feature, included]
[query_rows 호출, 필터: plan=Starter, feature=search widget]
...
저는 컬럼 이름이나 도구 이름을 명시하지 않았습니다. 유용한 점은 이 과정이 에디터를 벗어나지 않고 작업 중간에 이루어진다는 것입니다. 값을 확인하거나, 설정 테이블을 교차 참조하거나, 코드를 작성하기 전에 특정 필드가 실제로 존재하는지 확인하는 작업 등을 말이죠.
한계점
연결은 읽기 전용(read-only)입니다. 세트 내에 쓰기 도구(write tool)가 없으므로, 에이전트는 시트를 조회하고 분석할 수는 있지만 절대 변경할 수는 없습니다. 만약 결과를 다시 기록하거나 상태 열(status column)을 업데이트하는 에이전트를 원한다면, 이것은 적절한 도구가 아니며 프레이밍(framing)을 바꾼다고 해결될 문제도 아닙니다.
행(Rows)은 사용자가 선택한 기간 동안 캐싱(cached)되므로, 30초 전에 수행한 편집이 캐시가 갱신될 때까지 나타나지 않을 수 있습니다. 이는 에이전트의 열 번째 쿼리가 Google에 직접 요청을 보내지 않도록 유지해 주는 역할을 합니다. 이는 매우 중요한데, Sheets API는 사용자당 분당 60회의 읽기만 허용하며 그 이후에는 429 에러를 반환하기 때문입니다. 이는 여전히 트레이드오프(trade-off) 관계이며, 이러한 특성이 존재한다는 점을 알고 있어야 합니다.
비용 측면에서, MCP는 공개 엔드포인트(public endpoints)의 경우 무료 플랜에 포함됩니다. 프라이빗 엔드포인트(Private endpoints)와 https://pastesheet.com/mcp의 계정 전체 워크스페이스 서버(하나의 커넥터로 소유한 모든 시트를 노출하는 방식)를 사용하려면 월 $9부터 시작하는 Starter 유료 플랜이 필요합니다. query_rows를 통한 전체 텍스트 검색(Full-text search) 및 집계(aggregation)는 Pro 플랜 기능입니다.
마지막 제한 사항은 사람들이 자주 놓치는 부분입니다. 이 접근 방식 전체는 시트가 "링크가 있는 모든 사용자"에게 공유되어 있기 때문에 작동하는 것이며, PasteSheet은 사용자의 Google 계정에 로그인하는 대신 해당 링크를 통해 시트를 읽습니다. 프라이빗 엔드포인트는 PasteSheet URL 앞에 베어러 키(bearer key)를 배치하여 누가 엔드포인트를 쿼리할 수 있는지를 제어합니다. 하지만 이것이 스프레드시트 자체를 제어하는 것은 아닙니다. 시트의 공유 링크를 가진 사람은 여전히 직접 시트를 열 수 있으므로, 링크가 공유된 시트에 진정으로 민감한 데이터를 넣지 마십시오.
팀원이 관리하는 스프레드시트를 에디터가 읽게 하는 일반적인 경우라면, 약 5분 정도의 작업과 하나의 JSON 블록이면 충분합니다. 사용 중인 에디터가 어떤 키(key)를 원하는지만 확인하면 됩니다.
저는 PasteSheet를 만들었습니다. Google 시트를 공유하고 URL을 붙여넣기만 하면, 에디터는 캐싱된 JSON API와 쿼리 가능한 읽기 전용 MCP 서버를 갖게 됩니다. 무료 티어이며, 신용카드나 Google Cloud 프로젝트가 필요하지 않습니다. 만약 고객이 제가 다루지 않은 구성 형태(config shape)를 사용한다면, 댓글로 남겨주세요. 추가하도록 하겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기