#!/usr/bin/env node
/**
* Gemini MCP Server
*
* Claude Code에서 Gemini AI 기능을 사용하기 위한 MCP 서버
*/
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
import { isGeminiAvailable, getDefaultProvider } from './services/gemini.js';
import { isCliAvailable } from './services/gemini-cli.js';
import { analyzePdf, analyzePdfSchema } from './tools/analyze-pdf.js';
import { analyzeImage, analyzeImageSchema } from './tools/analyze-image.js';
import { generateText, generateTextSchema } from './tools/generate-text.js';
import { analyzeCode, analyzeCodeSchema } from './tools/analyze-code.js';
import { geminiChat, geminiChatSchema, geminiListSessions, listSessionsSchema } from './tools/gemini-chat.js';
// ============================================================
// Server Setup
// ============================================================
const server = new McpServer({
name: 'gemini-mcp',
version: '1.0.0',
});
// ============================================================
// Tool Registration
// ============================================================
server.tool(
'analyze_pdf',
'PDF 문서를 분석합니다. URL 또는 로컬 파일 경로를 지원합니다.',
analyzePdfSchema.shape,
async (args) => {
const input = analyzePdfSchema.parse(args);
return analyzePdf(input);
}
);
server.tool(
'analyze_image',
'이미지를 분석합니다. 스크린샷, 차트, 다이어그램, 사진 등을 지원합니다. (JPEG, PNG, GIF, WebP)',
analyzeImageSchema.shape,
async (args) => {
const input = analyzeImageSchema.parse(args);
return analyzeImage(input);
}
);
server.tool(
'generate_text',
'텍스트를 생성합니다. 요약, 번역, 창작 등에 활용할 수 있습니다.',
generateTextSchema.shape,
async (args) => {
const input = generateTextSchema.parse(args);
return generateText(input);
}
);
server.tool(
'analyze_code',
'코드를 분석합니다. 리뷰(review), 설명(explain), 개선(improve) 중 선택할 수 있습니다.',
analyzeCodeSchema.shape,
async (args) => {
const input = analyzeCodeSchema.parse(args);
return analyzeCode(input);
}
);
server.tool(
'gemini_chat',
'세션 기반 대화입니다. 이전 대화를 이어가거나 새 대화를 시작합니다. 코드 리뷰, 토론, 질의응답에 활용하세요. (CLI 전용)',
geminiChatSchema.shape,
async (args) => {
const input = geminiChatSchema.parse(args);
return geminiChat(input);
}
);
server.tool(
'gemini_sessions',
'현재 프로젝트의 Gemini 대화 세션 목록을 조회합니다. (CLI 전용)',
listSessionsSchema.shape,
async () => {
return geminiListSessions();
}
);
// ============================================================
// Server Start
// ============================================================
async function main() {
// Check availability
if (!isGeminiAvailable()) {
console.error('[gemini-mcp] Gemini를 사용할 수 없습니다.');
console.error('[gemini-mcp] GEMINI_API_KEY를 설정하거나 Gemini CLI를 설치하세요.');
process.exit(1);
}
const provider = getDefaultProvider();
const cliAvailable = isCliAvailable();
console.error('[gemini-mcp] 서버 시작...');
console.error(`[gemini-mcp] 기본 백엔드: ${provider === 'cli' ? 'CLI (높은 쿼터)' : 'API'}`);
if (cliAvailable) {
console.error('[gemini-mcp] CLI 사용 가능: 60 RPM, 1000 RPD');
console.error('[gemini-mcp] 세션 기능 활성화: gemini_chat, gemini_sessions');
}
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('[gemini-mcp] 서버 준비 완료');
}
main().catch((error) => {
console.error('[gemini-mcp] 서버 오류:', error);
process.exit(1);
});