← cd ..
ClaudeCodeMCPGeminiAI

Claude Code에서 MCP로 Gemini 연결하기 — 토큰 걱정 없이 두 AI 함께 쓰기

April 21, 20261 min read

Claude Code를 쓰다 보면 어느 순간 이런 메시지를 마주치게 된다.

"컨텍스트 한도에 가까워졌습니다"

대용량 파일 분석, 긴 로그 파싱, 반복적인 단순 작업... Claude는 강력하지만 토큰 소비가 상당하다. 그렇다고 Gemini를 따로 브라우저에서 열어서 복붙하는 건 너무 번거롭다.

이 글에서는 Claude Code 안에서 Gemini를 MCP 툴로 연결해서, 내가 필요할 때 "이건 Gemini한테 맡겨줘"라고 말하면 바로 처리되게 만드는 방법을 공유한다.


MCP가 뭔데?

MCP(Model Context Protocol)는 Claude Code가 외부 도구/서비스를 불러쓸 수 있게 해주는 프로토콜이다. 쉽게 말하면 Claude Code용 플러그인 시스템이다.

MCP 서버를 하나 만들어서 등록해두면, 나(Claude)가 대화 중에 그 서버의 함수를 직접 호출할 수 있다. Gemini API를 감싼 MCP 서버를 만들면, Claude Code 안에서 Gemini를 툴처럼 쓸 수 있는 것이다.

사용자 → Claude Code → (필요시) Gemini MCP 서버 → Gemini API

사전 준비

  • Node.js 20 이상
  • Claude Code CLI 설치됨
  • Google AI Studio에서 발급한 Gemini API 키

Step 1. MCP 서버 디렉토리 만들기

Claude Code 설정 폴더 안에 서버를 두면 어느 프로젝트에서든 사용할 수 있다.

mkdir -p ~/.claude/mcp-servers/gemini
cd ~/.claude/mcp-servers/gemini

Step 2. package.json 작성

{
  "name": "gemini-mcp-server",
  "version": "1.0.0",
  "type": "module",
  "main": "index.js",
  "dependencies": {
    "@google/generative-ai": "^0.24.0",
    "@modelcontextprotocol/sdk": "^1.10.2"
  }
}

"type": "module" — ES Module 방식을 쓰기 위해 반드시 필요하다.


Step 3. MCP 서버 본체 작성 (index.js)

두 가지 툴을 제공한다:

  • ask_gemini — 텍스트 프롬프트만 전달
  • ask_gemini_with_file — 파일 내용을 함께 전달 (대용량 파일 분석용)
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { GoogleGenerativeAI } from "@google/generative-ai";
import fs from "fs";

const apiKey = process.env.GEMINI_API_KEY;
if (!apiKey) {
  console.error("GEMINI_API_KEY 환경변수가 설정되지 않았습니다.");
  process.exit(1);
}

const genAI = new GoogleGenerativeAI(apiKey);

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

// 툴 목록 정의
server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {
      name: "ask_gemini",
      description:
        "Gemini AI에게 질문하거나 작업을 요청합니다. 토큰이 많이 필요한 긴 문서 분석, 대용량 파일 요약, 반복적인 단순 작업에 활용하세요.",
      inputSchema: {
        type: "object",
        properties: {
          prompt: { type: "string", description: "Gemini에게 보낼 프롬프트" },
          model: {
            type: "string",
            description: "사용할 모델 (기본값: gemini-2.0-flash)",
            default: "gemini-2.0-flash",
          },
        },
        required: ["prompt"],
      },
    },
    {
      name: "ask_gemini_with_file",
      description:
        "파일 내용을 포함해 Gemini에게 질문합니다. 대용량 파일 분석에 적합합니다.",
      inputSchema: {
        type: "object",
        properties: {
          prompt: { type: "string", description: "파일과 함께 보낼 프롬프트" },
          file_path: { type: "string", description: "분석할 파일의 절대 경로" },
          model: {
            type: "string",
            description: "사용할 모델 (기본값: gemini-2.0-flash)",
            default: "gemini-2.0-flash",
          },
        },
        required: ["prompt", "file_path"],
      },
    },
  ],
}));

// 툴 실행 핸들러
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;

  try {
    if (name === "ask_gemini") {
      const model = genAI.getGenerativeModel({
        model: args.model || "gemini-2.0-flash",
      });
      const result = await model.generateContent(args.prompt);
      return { content: [{ type: "text", text: result.response.text() }] };
    }

    if (name === "ask_gemini_with_file") {
      const fileContent = fs.readFileSync(args.file_path, "utf-8");
      const model = genAI.getGenerativeModel({
        model: args.model || "gemini-2.0-flash",
      });
      const prompt = `${args.prompt}\n\n---파일 내용 (${args.file_path})---\n${fileContent}`;
      const result = await model.generateContent(prompt);
      return { content: [{ type: "text", text: result.response.text() }] };
    }
  } catch (error) {
    return {
      content: [{ type: "text", text: `오류 발생: ${error.message}` }],
      isError: true,
    };
  }
});

const transport = new StdioServerTransport();
await server.connect(transport);

Step 4. 의존성 설치

npm install

Step 5. Claude Code에 MCP 서버 등록

주의: ~/.claude/settings.json에 직접 mcpServers 필드를 추가하면 스키마 검증 오류가 난다. 반드시 claude mcp add 명령어를 사용해야 한다.

claude mcp add gemini -s user \
  -e GEMINI_API_KEY=여기에_API_키_입력 \
  -- node ~/.claude/mcp-servers/gemini/index.js

옵션 설명:

옵션설명
-s user사용자 전체 범위 등록 (모든 프로젝트에서 사용 가능)
-e KEY=VALUE서버 실행 시 주입할 환경변수
--이후가 실행 명령어임을 구분하는 구분자

Step 6. 연결 확인

claude mcp list

출력 결과:

gemini: node ~/.claude/mcp-servers/gemini/index.js - ✓ Connected

✓ Connected가 보이면 성공이다. Claude Code를 재시작하면 대화 중에 바로 Gemini를 쓸 수 있다.


실제 사용 예시

Claude Code 대화창에서 이렇게 요청하면 된다:

이 파일은 Gemini한테 분석시켜줘: /path/to/large-log.txt
이 긴 문서 요약은 Gemini 써줘
반복적인 텍스트 변환 작업이라서 Gemini로 처리해줘

Claude가 판단해서 ask_gemini 또는 ask_gemini_with_file 툴을 호출한다.


언제 Gemini를 쓰면 좋을까?

작업추천 모델
대용량 로그/파일 분석Gemini (컨텍스트 1M 토큰)
긴 문서 요약Gemini
단순 반복 텍스트 처리Gemini
코드 구현/수정Claude
아키텍처 설계Claude
복잡한 디버깅Claude

트러블슈팅

settings.json에 직접 mcpServers를 추가했더니 오류남

Settings validation failed: Unrecognized field: mcpServers

Claude Code의 settings.json 스키마는 mcpServers 필드를 허용하지 않는다. 반드시 claude mcp add 명령어를 사용해야 하며, 실제 설정은 ~/.claude.json에 저장된다.

429 Too Many Requests

RESOURCE_EXHAUSTED: Free Tier 요청 한도 초과

Gemini API 무료 티어는 일일/분당 요청 한도가 있다. 해결 방법:

  1. 내일 재시도 — 무료 티어는 매일 리셋
  2. 새 API 키 발급 — Google AI Studio에서 새 프로젝트로 발급
  3. 유료 전환 — Google AI Studio에서 결제 연동

API 키를 바꿀 때는 기존 서버를 제거하고 재등록:

claude mcp remove gemini
claude mcp add gemini -s user -e GEMINI_API_KEY=새_API_키 -- node ~/.claude/mcp-servers/gemini/index.js

Connected인데 툴 호출이 안 됨

Claude Code 세션을 완전히 재시작해야 새로 등록된 MCP 서버가 인식된다.


전체 흐름 정리

[1] 디렉토리 생성
    mkdir -p ~/.claude/mcp-servers/gemini
            ↓
[2] package.json + index.js 작성
            ↓
[3] npm install
            ↓
[4] claude mcp add 명령어로 등록
    (settings.json 직접 수정 금지!)
            ↓
[5] claude mcp list로 Connected 확인
            ↓
[6] Claude Code 재시작 후 사용
    "이건 Gemini한테 맡겨줘"

한 번 설정해두면 어느 프로젝트에서든 Gemini를 바로 불러쓸 수 있다. Claude의 섬세한 코드 작업과 Gemini의 넉넉한 컨텍스트를 상황에 맞게 나눠 쓰면 토큰 걱정이 한결 줄어든다.

PM

backtodev

40대 PM, 다시 개발자로 돌아갑니다. 실패하고 배우며 성장하는 기록.

Claude Code에서 MCP로 Gemini 연결하기 — 토큰 걱정 없이 두 AI 함께 쓰기 | backtodev