MCP 서버를 구축해서 Excel 데이터를 수동으로 가져올 필요가 없게 만들었다

발행: (2026년 2월 10일 오후 01:55 GMT+9)
10 분 소요
원문: Dev.to

I’m happy to help translate the content, but I don’t have the article text available. Could you please paste the text you’d like translated (excluding the source line you already provided)? Once I have the content, I’ll translate it into Korean while preserving the original formatting, markdown, and any code blocks.

The Problem That Started It All

Picture this: you’re running a small café. You’ve got your menu in an Excel spreadsheet (because that’s what everyone uses, right?). Now you need to get that data into MongoDB for your new web app.

Your options

  • Copy‑paste each item manually (soul‑crushing)
  • Write a one‑off Node.js script (works once, breaks next time)
  • Ask ChatGPT to write the script (gets you 80 % there, then you’re on your own)

I wanted option 4: Talk to Claude like a human and have it just… work.

That’s where MCP (Model Context Protocol) comes in.

MCP란 무엇인가?

MCP는 기본적으로 Claude(또는 어떤 AI든)에게 초능력을 부여하는 방법입니다. Claude가 단순히 질문에 답하는 것이 아니라 실제로 작업을 수행할 수 있게 합니다—예를 들어 파일을 읽거나, API를 호출하거나, 제 경우에는 Excel 데이터를 데이터베이스에 가져오는 것 등입니다.

Without MCPWith MCP
Claude는 조언만 할 수 있는 정말 똑똑한 친구입니다.Claude는 실제로 서버에 SSH 접속하여 문제를 해결할 수 있는 정말 똑똑한 친구입니다.

문제는? 실제 작업을 수행할 “서버”를 직접 구축해야 한다는 점입니다.

MindfulMapper 구축

비전

다음과 같이 말하고 싶었습니다:

“Claude, menu.xlsx 파일을 내 products 컬렉션에 가져와줘. ‘Name (EN)’name.en 그리고 ‘Name (TH)’name.th 로 매핑하고, ID는 ‘spb’ 접두사로 자동 생성해줘.”

그리고 바로 동작했으면 좋겠었습니다.

현실 (즉, 문제점)

문제점 #1 – Dotenv 재난

첫 번째 버전에서는 dotenv 로 환경 변수를 로드했습니다:

import dotenv from 'dotenv';
dotenv.config();

dotenv 가 표준 출력에 유용한 메시지를 출력합니다:

[dotenv@17.2.4] injecting env (4) from .env

Claude Desktop 은 이 메시지를 보고 JSON 으로 파싱하려 했고 (MCP 가 JSON‑RPC 를 사용하기 때문에), 바로 죽어버렸습니다. 이를 알아내는 데 너무 오래 걸렸습니다.

해결책: 메시지를 억제하거나 Claude Desktop 설정에 환경 변수를 하드코딩합니다. 저는 후자를 선택했습니다.

문제점 #2 – SDK 버전 지옥

MCP SDK 는 정말 빠르게 진화합니다. 버전 1.26.0 은 온라인 예제와 완전히 다른 문법을 사용합니다.

예제에 나와 있던 방식 (버전 1.26.0 이전):

server.addTool({
  name: "my_tool",
  description: "Does a thing",
  parameters: z.object({ /* … */ }),
  execute: async ({ /* … */ }) => { /* … */ }
});

버전 1.26.0 에서 실제로 동작하는 방식:

const server = new Server(
  { name: "my-server", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [/* … */]
}));

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  // Handle tool calls
});

완전히 다른 구조입니다. 이 문제에만 몇 시간을 허비했습니다.

문제점 #3 – ID 자동 생성

spb-0001, spb-0002 와 같은 ID 가 필요했습니다. 핵심은 MongoDB 에서 카운터를 관리하는 것이었습니다:

async function getNextId(prefix = 'spb') {
  const counterCollection = db.collection('counters');
  const result = await counterCollection.findOneAndUpdate(
    { _id: 'item_id' },
    { $inc: { seq: 1 } },
    { upsert: true, returnDocument: 'after' }
  );
  const num = result.seq || 1;
  return `${prefix}-${String(num).padStart(4, '0')}`;
}

이렇게 하면 다음을 보장합니다:

  • 동일 파일을 여러 번 가져와도 중복 ID 방지
  • 순차적인 번호 부여
  • 다양한 아이템 타입에 대해 커스텀 접두사 사용 가능

멋진 부분

1. 유연한 컬럼 매핑

엑셀 컬럼을 중첩된 MongoDB 객체에 매핑하고 싶나요? 간단합니다:

// Excel columns: "Name (EN)", "Name (TH)"
// Mapping: { "name.en": "Name (EN)", "name.th": "Name (TH)" }

// Result in MongoDB:
{
  id: "spb-0001",
  name: {
    en: "Americano",
    th: "อเมริกาโน่"
  }
}

매퍼가 점 표기법을 자동으로 처리합니다.

2. 자연어 인터페이스

매번 코드를 작성하는 대신, 저는 Claude에게 이렇게 말합니다:

“Import menu.xlsx into products collection. Use prefix ‘spb’. Clear existing data.”

Claude는 올바른 매개변수와 함께 적절한 MCP 도구 호출로 변환합니다. 마치 데이터 가져오기에 절대 지치지 않는 매우 인내심 있는 조수와 같습니다.

3. 실제 프로덕션에서도 작동합니다

저는 실제 카페 메뉴 시스템을 위해 MongoDB Atlas(클라우드)와 함께 이를 사용하고 있습니다. 프로덕션에 충분히 신뢰할 수 있게 작동한다는 사실이 아직도 놀랍습니다.

Source:

사용 방법

1. 설치

git clone https://github.com/kie-sp/mindful-mapper.git
cd mindful-mapper
npm install

2. Claude Desktop 설정

~/Library/Application Support/Claude/claude_desktop_config.json 파일에 다음을 추가합니다 (경로와 값은 환경에 맞게 조정하세요):

{
  "mcpServers": {
    "mindful-mapper": {
      "command": "node",
      "args": ["/full/path/to/mindful-mapper/upload-excel.js"],
      "env": {
        "MONGODB_URI": "your-mongodb-connection-string",
        "MONGODB_DB_NAME": "your_db",
        "ID_PREFIX": "spb"
      }
    }
  }
}

3. 사용하기

  1. Claude Desktop을 재시작합니다.

  2. 예를 들어 다음과 같이 말합니다:

    /path/to/menu.xlsx 파일을 products 컬렉션에 가져와 주세요. 접두사 ‘spb’를 사용합니다.”

그게 전부입니다.

MindfulMapper demo

MCP illustration

교훈

1. MCP는 아직 초기 단계입니다

SDK는 빠르게 변합니다. 두 달 전까지 작동하던 코드가 오늘은 깨질 수 있습니다. 사용 중인 버전을 항상 확인하세요.

2. MCP 서버 디버깅은… 흥미롭습니다

서버가 조용히 충돌하면 Claude에서 스택 트레이스를 볼 수 없습니다. 가장 좋은 친구가 됩니다:

node your-server.js 2>&1

그리고 로그는 다음 위치에 있습니다:

~/Library/Logs/Claude/mcp*.log

3. 보상이 그만한 가치가 있습니다

작동하기 시작하면, 그것은 마법과 같습니다. 데이터 가져오기를 두려워하던 제가 실제로 즐기게 되었습니다 (적어도 더 이상 두려워하지는 않게 되었습니다).

What’s Next?

Current limitations I want to fix:

  • No schema validation – 쓰레기 데이터를 기꺼이 가져옵니다.
  • No update/upsert mode – “삽입” 또는 “전체 삭제 후 삽입”만 가능합니다.
  • MongoDB only – PostgreSQL 지원이 존재하지만 손길이 필요합니다.
  • No multi‑sheet support – 첫 번째 시트만 처리됩니다.

하지만 솔직히 말해서, 내 사용 사례의 약 90 %에 대해서는 그대로 완벽하게 작동합니다.

직접 해보기

  • GitHub:
  • 요구 사항: Node.js 18+, MongoDB, Claude Desktop
  • 라이선스: MIT (원하는 대로 사용하세요)

멋진 무언가를 만들면 알려 주세요! 혹은 저와 같은 어려움을 겪었다면, 이제 혼자가 아니라는 걸 알게 될 거예요.

최종 생각

MCP 서버를 구축하는 것은 이상합니다. 백엔드 개발도, AI 엔지니어링도 아닌 – AI가 대신 사용할 수 있도록 새로운 종류의 도구를 만드는 것입니다.

작동하면, 커피를 만들러 가는 사이에 Claude에게 데이터 가져오기를 맡기라고 편하게 말할 수 있습니다. 정말 멋지죠.

이것을 사용하거나 비슷한 것을 만들게 된다면, 알려주세요! GitHub에 이슈를 열거나 연락 주세요.

행복한 가져오기! 🎉

Built with: Node.js, MongoDB, MCP SDK, and an unreasonable amount of trial and error

Back to Blog

관련 글

더 보기 »