mcp-gemini-prd.mdโข10.6 kB
# MCP Gemini ์๋ฒ ๊ตฌ์ถ PRD (Product Requirements Document)
## 1. ๊ฐ์
Model Context Protocol(MCP) ๊ธฐ๋ฐ์ผ๋ก Google์ Gemini API๋ฅผ ํ์ฉํ ์๋ฒ๋ฅผ ๊ตฌ์ถํ์ฌ ์ด๋ฏธ์ง ์์ฑ, ์ ํ๋ธ ๋ถ์, ๊ตฌ๊ธ ๊ฒ์ ๋ฑ์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์์คํ
์
๋๋ค. ์ด ์๋ฒ๋ Claude๋ฅผ ๋น๋กฏํ ๋ค์ํ MCP ํด๋ผ์ด์ธํธ์ ํตํฉ๋์ด ํ์ฅ๋ AI ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
## 2. ๋ฐฐ๊ฒฝ ๋ฐ ๋ชฉ์
MCP(Model Context Protocol)๋ Anthropic์ด ์ฃผ๋ํ์ฌ ๊ฐ๋ฐํ ๊ฐ๋ฐฉํ ํ์ค์ผ๋ก, AI ๋ชจ๋ธ์ด ์ธ๋ถ ๋ฐ์ดํฐ ์์ค ๋ฐ ๋๊ตฌ์ ์์ ํ๊ฒ ์ํธ์์ฉํ ์ ์๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. MCP๋ "AI ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ USB-C ํฌํธ"๋ก ๋น์ ๋๋ฉฐ, ๋ค์ํ AI ์์คํ
๋ค์ด ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ธ๋ถ ๋๊ตฌ์ ํตํฉ๋ ์ ์๋๋ก ํฉ๋๋ค.
๋ณธ ํ๋ก์ ํธ์ ๋ชฉ์ ์:
1. Google์ Gemini API๋ฅผ MCP ํ์ค์ ๋ง์ถฐ ํตํฉํ์ฌ Claude์ ๊ฐ์ MCP ํด๋ผ์ด์ธํธ์์ Gemini ๋ชจ๋ธ์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๊ฒ ํ๋ ๊ฒ์
๋๋ค.
2. ์ด๋ฏธ์ง ์์ฑ, ์ ํ๋ธ ๋ถ์, ๊ตฌ๊ธ ๊ฒ์ ๊ธฐ๋ฅ์ MCP ํ๋กํ ์ฝ์ ํตํด ์ ๊ณตํ๋ ๊ฒ์
๋๋ค.
3. Node.js ๊ธฐ๋ฐ์ผ๋ก ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด MCP ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์
๋๋ค.
## 3. ์ฃผ์ ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ
### 3.1 MCP ์๋ฒ ๊ธฐ๋ณธ ๊ธฐ๋ฅ
- MCP ํ๋กํ ์ฝ v1.0 ์์ ์ง์
- ๋ชจ๋ ํ์ ์๋ํฌ์ธํธ ๊ตฌํ (list-tools, invoke-tool, get-tool-spec)
- ๋ณด์ ์ฐ๊ฒฐ ๋ฐ ์ธ์ฆ ์ฒ๋ฆฌ
- ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ก๊น
- ๋๊ตฌ ํธ์ถ ์๋ต ์๊ฐ ์ต์ ํ
### 3.2 Gemini API ํตํฉ
- Google Gemini Pro, Gemini Ultra, Gemini Flash ๋ชจ๋ธ ์ง์
- ํ
์คํธ ์์ฑ ๋ฐ ๋ถ์ ๊ธฐ๋ฅ
- ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ API ํค ๊ด๋ฆฌ
- ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ์ค์ ๊ธฐ๋ฅ (temperature, top_p ๋ฑ)
- ํ๋กฌํํธ ํ
ํ๋ฆฟ ๊ธฐ๋ฅ
### 3.3 ์ด๋ฏธ์ง ์์ฑ ๊ธฐ๋ฅ
- Gemini 2.0 Flash๋ฅผ ํ์ฉํ ์ด๋ฏธ์ง ์์ฑ
- ํ
์คํธ ํ๋กฌํํธ ๊ธฐ๋ฐ ์ด๋ฏธ์ง ์์ฑ
- ์ด๋ฏธ์ง ํฌ๊ธฐ ๋ฐ ํ์ง ์กฐ์ ์ต์
- ์์ฑ๋ ์ด๋ฏธ์ง์ ๋ก์ปฌ ์ ์ฅ ๋ฐ ๋ฐํ ๊ธฐ๋ฅ
- ์ด๋ฏธ์ง ๋ณํ ๋ฐ ํธ์ง ๊ธฐ๋ฅ
### 3.4 ์ ํ๋ธ ๋ถ์ ๊ธฐ๋ฅ
- ์ ํ๋ธ ๋์์ URL์์ ์๋ง ์ถ์ถ
- ๋์์ ๋ด์ฉ ์์ฝ ๊ธฐ๋ฅ
- ์ฃผ์ ํ ํฝ ์ถ์ถ ๋ฐ ๋ถ์
- ํ์์คํฌํ ๊ธฐ๋ฐ ๋ด์ฉ ๊ตฌ์กฐํ
- ์ฌ๋ฌ ๋์์ ๊ฐ์ ๋น๊ต ๋ถ์
### 3.5 ๊ตฌ๊ธ ๊ฒ์ ๊ธฐ๋ฅ
- ์น ๊ฒ์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ
- ๊ฒ์ ๊ฒฐ๊ณผ ํํฐ๋ง ๋ฐ ์ ์
- ์ปจํ
์คํธ์ ๋ง๋ ์ ๋ณด ์ถ์ถ
- ๊ฒฐ๊ณผ ์์ฝ ๋ฐ ๊ตฌ์กฐํ
- ์ธ์ฉ ๋ฐ ์์ค ์ถ์
## 4. ๊ธฐ์ ์คํ
### 4.1 ๋ฐฑ์๋
- ์ธ์ด: TypeScript/Node.js (v18+)
- MCP SDK: @modelcontextprotocol/mcp-sdk
- ์น ํ๋ ์์ํฌ: Fastify
- ๋น๋๊ธฐ ์ฒ๋ฆฌ: Node.js ๋ด์ฅ Promise, async/await
- API ํตํฉ: @google/generative-ai, youtube-api-v3, google-search-api
### 4.2 ์ธ์ฆ ๋ฐ ๋ณด์
- API ํค ๊ด๋ฆฌ: dotenv
- ๋ณด์ ์ฐ๊ฒฐ: TLS/SSL
- ํ ํฐ ์ธ์ฆ: jsonwebtoken
### 4.3 ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ: sharp, canvas
- ํ
์คํธ ์ฒ๋ฆฌ: natural
- ๋ฐ์ดํฐ ์ง๋ ฌํ: JSON
### 4.4 ํ
์คํธ ๋ฐ ๋ฐฐํฌ
- ํ
์คํธ: Jest, supertest
- ๋ก๊น
: pino
- ์ปจํ
์ด๋ํ: Docker
- ํ๊ฒฝ ๊ด๋ฆฌ: npm
## 5. ์์คํ
์ํคํ
์ฒ
```
[ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
] <--> [MCP ํด๋ผ์ด์ธํธ] <--> [MCP Gemini ์๋ฒ] <--> [Google API]
```
### 5.1 MCP ์๋ฒ ํต์ฌ ์ปดํฌ๋ํธ
1. **์๋ฒ ์ด๊ธฐํ ๋ชจ๋**: MCP ์๋ฒ ์คํ ๋ฐ ์ค์ ๊ด๋ฆฌ
2. **๋๊ตฌ ๊ด๋ฆฌ์**: ์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ตฌ ๋ชฉ๋ก ๊ด๋ฆฌ ๋ฐ ๋
ธ์ถ
3. **์ธ์ฆ ๊ด๋ฆฌ์**: ํด๋ผ์ด์ธํธ ์์ฒญ ์ธ์ฆ ๋ฐ ๊ถํ ๊ด๋ฆฌ
4. **๋๊ตฌ ๊ตฌํ ๋ชจ๋**: ๊ฐ ๊ธฐ๋ฅ๋ณ ๋๊ตฌ ๊ตฌํ (์ด๋ฏธ์ง ์์ฑ, ์ ํ๋ธ ๋ถ์, ๊ตฌ๊ธ ๊ฒ์)
5. **Gemini API ํด๋ผ์ด์ธํธ**: Google Gemini API์์ ํต์ ๊ด๋ฆฌ
6. **๋ก๊น
๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ**: ์์ฒญ ๋ฐ ์๋ต ๋ก๊น
, ์ค๋ฅ ์ถ์
## 6. ํด๋ ๊ตฌ์กฐ
```
mcp-gemini-server/
โโโ .env.example # ํ๊ฒฝ ๋ณ์ ์์
โโโ .gitignore
โโโ Dockerfile
โโโ LICENSE
โโโ README.md
โโโ package.json
โโโ package-lock.json
โโโ tsconfig.json
โโโ src/
โ โโโ index.ts # ์ง์
์
โ โโโ config.ts # ์๋ฒ ์ค์
โ โโโ server.ts # MCP ์๋ฒ ๊ตฌํ
โ โโโ api/
โ โ โโโ gemini.ts # Gemini API ํด๋ผ์ด์ธํธ
โ โ โโโ youtube.ts # YouTube API ํด๋ผ์ด์ธํธ
โ โ โโโ search.ts # ๊ฒ์ API ํด๋ผ์ด์ธํธ
โ โโโ tools/
โ โ โโโ base.ts # ๊ธฐ๋ณธ ๋๊ตฌ ํด๋์ค
โ โ โโโ image-tools.ts # ์ด๋ฏธ์ง ์์ฑ ๋๊ตฌ
โ โ โโโ youtube-tools.ts # ์ ํ๋ธ ๋ถ์ ๋๊ตฌ
โ โ โโโ search-tools.ts # ๊ฒ์ ๋๊ตฌ
โ โโโ types/
โ โ โโโ request.ts # ์์ฒญ ํ์
โ โ โโโ response.ts # ์๋ต ํ์
โ โโโ utils/
โ โโโ auth.ts # ์ธ์ฆ ์ ํธ๋ฆฌํฐ
โ โโโ logging.ts # ๋ก๊น
์ ํธ๋ฆฌํฐ
โ โโโ error.ts # ์ค๋ฅ ์ฒ๋ฆฌ
โโโ tests/
โ โโโ server.test.ts
โ โโโ image-tools.test.ts
โ โโโ youtube-tools.test.ts
โ โโโ search-tools.test.ts
โโโ examples/
โโโ basic-usage.ts
โโโ image-generation.ts
โโโ youtube-analysis.ts
โโโ search-example.ts
```
## 7. MCP ์๋ฒ ๊ตฌ์ถ ๋ฐฉ๋ฒ
### 7.1 ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
```bash
# ์ ์ฅ์ ํด๋ก
git clone https://github.com/yourusername/mcp-gemini-server.git
cd mcp-gemini-server
# ์์กด์ฑ ์ค์น
npm install
# ํ๊ฒฝ ๋ณ์ ์ค์
cp .env.example .env
# .env ํ์ผ์ ํธ์งํ์ฌ ํ์ํ API ํค ์ถ๊ฐ
```
### 7.2 ํต์ฌ ๊ตฌํ ๋จ๊ณ
1. **MCP SDK ์ค์น ๋ฐ ๊ธฐ๋ณธ ์๋ฒ ์ค์ **
```typescript
// src/server.ts
import { MCPServer, Tool, ToolSpec } from '@modelcontextprotocol/mcp-sdk';
import { FastifyInstance } from 'fastify';
class GeminiMCPServer extends MCPServer {
constructor(config: Config) {
super();
this.config = config;
this._registerTools();
}
private _registerTools(): void {
// ๋๊ตฌ ๋ฑ๋ก ๋ก์ง
// ์: this.registerTool(imageGenerationTool);
}
}
```
2. **๋๊ตฌ ๊ตฌํ**
```typescript
// src/tools/image-tools.ts
import { Tool, ToolSpec } from '@modelcontextprotocol/mcp-sdk';
import { GenerativeModel } from '@google/generative-ai';
// ์ด๋ฏธ์ง ์์ฑ ๋๊ตฌ ์ ์
async function generateImage(params: any): Promise<any> {
const { prompt, size = '1024x1024' } = params;
// Gemini API ํธ์ถ
const model = new GenerativeModel({
model: 'gemini-2.0-flash',
apiKey: process.env.GOOGLE_API_KEY
});
const result = await model.generateContent({
prompt,
generationConfig: {
outputModality: 'image'
}
});
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ๋ฐ ๋ฐํ
const imageUrl = result.response.candidates[0].content.parts[0].sourceUri;
return { imageUrl };
}
// ๋๊ตฌ ์คํ ์ ์
export const imageGenerationTool: Tool = {
name: 'image-generation',
description: 'Generate images based on text prompts using Google Gemini 2.0 Flash',
parameters: {
type: 'object',
properties: {
prompt: {
type: 'string',
description: 'Text description of the image to generate'
},
size: {
type: 'string',
description: 'Image size (e.g., "1024x1024")',
default: '1024x1024'
}
},
required: ['prompt']
},
function: generateImage
};
```
3. **๋ฉ์ธ ์ง์
์ ๊ตฌํ**
```typescript
// src/index.ts
import dotenv from 'dotenv';
import { Config } from './config';
import { GeminiMCPServer } from './server';
async function main() {
dotenv.config();
const config = new Config();
const server = new GeminiMCPServer(config);
await server.start();
}
if (require.main === module) {
main().catch(console.error);
}
```
## 8. Claude์ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
Claude ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ด MCP ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์:
1. **์๋ฒ ์คํ**
```bash
cd mcp-gemini-server
npm start
```
2. **Claude ๋ฐ์คํฌํฑ ์ค์ **
Claude ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ ํ์ผ์ ์์ ํ์ฌ ์๋ฒ๋ฅผ ๋ฑ๋กํฉ๋๋ค:
```json
{
"servers": [
{
"name": "Gemini MCP Server",
"command": "npm",
"args": ["start"],
"cwd": "/absolute/path/to/mcp-gemini-server",
"env": {
"GOOGLE_API_KEY": "your-api-key"
}
}
]
}
```
์ค์ ํ์ผ ์์น:
- Mac: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- Linux: `~/.config/Claude/claude_desktop_config.json`
3. **Claude ๋ํ ๋ด์์ ์ฌ์ฉ**
Claude ๋ฐ์คํฌํฑ ์ฑ์ ์ฌ์์ํ ํ, ๋ํ ์ค์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค:
```
์ด๋ฏธ์ง๋ฅผ ์์ฑํด์ค๋? "ํธ๋ฅธ ์ฐ๊ณผ ํธ์๊ฐ ์๋ ํ๊ฒฝ" ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด์ค.
```
Claude๋ MCP ์๋ฒ์ ์ฐ๊ฒฐํ์ฌ ์ด๋ฏธ์ง ์์ฑ ๋๊ตฌ๋ฅผ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ํฉ๋๋ค.
## 9. ์์ ๊ณผ์ ๋ฐ ํด๊ฒฐ ๋ฐฉ์
1. **API ํค ๊ด๋ฆฌ**: ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ ์์ ํ API ํค ๊ด๋ฆฌ ๋ฐ ํค ํ์ ๋ฉ์ปค๋์ฆ ๊ตฌํ
2. **์ค๋ฅ ์ฒ๋ฆฌ**: ๋ค์ํ API ์ค๋ฅ ์ํฉ์ ์ฒ๋ฆฌํ๊ณ ์ฌ์ฉ์์๊ฒ ์ ์ฉํ ํผ๋๋ฐฑ ์ ๊ณต
3. **์ฑ๋ฅ ์ต์ ํ**: ์๋ต ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐ ์บ์ฑ ์ ๋ต
4. **ํ์ฅ์ฑ**: ์๋ก์ด Gemini ๋ชจ๋ธ ๋ฐ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ ๋ชจ๋ํ๋ ์ค๊ณ
5. **๋ณด์**: ์ฌ์ฉ์ ์
๋ ฅ ๊ฒ์ฆ ๋ฐ ์์ ํ API ํต์ ๋ณด์ฅ
## 10. ํฅํ ํ์ฅ ๊ณํ
1. ์น ์ธํฐํ์ด์ค๋ฅผ ํตํ ์๋ฒ ๊ด๋ฆฌ ๋ฐ ๋ชจ๋ํฐ๋ง
2. ์ถ๊ฐ Google API (Maps, Translate ๋ฑ) ํตํฉ
3. ํ์ธํ๋๋ Gemini ๋ชจ๋ธ ์ง์
4. ๋ค์ค ๋ชจ๋ธ ์ฐ๊ณ๋ฅผ ํตํ ๊ณ ๊ธ ์ํฌํ๋ก์ฐ ์ง์
5. ์ด๋ฏธ์ง ๋ถ์ ๋ฐ ๋ฉํฐ๋ชจ๋ฌ ์
๋ ฅ ์ฒ๋ฆฌ ํ์ฅ
## 11. ๊ฒฐ๋ก
์ด PRD๋ MCP ํ๋กํ ์ฝ์ ํ์ฉํ์ฌ Google์ Gemini API๋ฅผ Claude์ ๊ฐ์ ๋ค์ํ MCP ํด๋ผ์ด์ธํธ์ ํตํฉํ๋ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์๊ตฌ์ฌํญ๊ณผ ๊ตฌํ ๋ฐฉ์์ ์ ์ํฉ๋๋ค. Node.js/TypeScript ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์ด JavaScript ์ํ๊ณ์ ํ๋ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ๋ฅผ ํ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ฏธ์ง ์์ฑ, ์ ํ๋ธ ๋ถ์, ๊ตฌ๊ธ ๊ฒ์ ๋ฑ์ ๊ธฐ๋ฅ์ ํ์คํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ณตํ์ฌ AI ๋ชจ๋ธ์ ๊ธฐ๋ฅ์ ํฌ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.