import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { z } from 'zod'
import { InferenceClient } from '@huggingface/inference'
// configSchema export - HF_TOKEN 필수
export const configSchema = z.object({
HF_TOKEN: z.string().describe('Hugging Face API token for image generation')
})
// createServer 함수 export
export default function createServer({ config }: { config: z.infer<typeof configSchema> }) {
const server = new McpServer({
name: 'Greeting Server',
version: '1.0.0',
capabilities: {
tools: {},
resources: {},
prompts: {}
}
})
// Define greeting tool
server.tool(
'greeting',
'Greet a user in their specified language',
{
name: z.string().describe('The name of the person to greet'),
language: z.enum(['korean', 'english', 'spanish', 'japanese', 'chinese']).describe('The language for the greeting')
},
async ({ name, language }: { name: string; language: 'korean' | 'english' | 'spanish' | 'japanese' | 'chinese' }) => {
const greetings: Record<string, string> = {
korean: `안녕하세요, ${name}님!`,
english: `Hello, ${name}!`,
spanish: `¡Hola, ${name}!`,
japanese: `こんにちは、${name}さん!`,
chinese: `你好,${name}!`
}
return {
content: [
{
type: 'text',
text: greetings[language]
}
]
}
}
)
// Define calculator tool
server.tool(
'calculator',
'Perform basic arithmetic operations',
{
operation: z.enum(['add', 'subtract', 'multiply', 'divide']).describe('The operation to perform'),
a: z.number().describe('First number'),
b: z.number().describe('Second number')
},
async ({ operation, a, b }: { operation: 'add' | 'subtract' | 'multiply' | 'divide'; a: number; b: number }) => {
let result: number;
switch (operation) {
case 'add':
result = a + b
break
case 'subtract':
result = a - b
break
case 'multiply':
result = a * b
break
case 'divide':
if (b === 0) {
return {
content: [
{
type: 'text',
text: '오류: 0으로 나눌 수 없습니다.'
}
]
}
}
result = a / b
break
}
return {
content: [
{
type: 'text',
text: `결과: ${result}`
}
]
}
}
)
// Define image generation tool
server.tool(
'image_generation',
'Generate an image from a text prompt using AI',
{
prompt: z.string().describe('Text description of the image to generate')
},
async ({ prompt }: { prompt: string }) => {
try {
const client = new InferenceClient(config.HF_TOKEN)
const imageBlob = await client.textToImage({
provider: 'fal-ai',
model: 'black-forest-labs/FLUX.1-schnell',
inputs: prompt,
parameters: { num_inference_steps: 5 }
}) as unknown as Blob
// Convert Blob to base64
const arrayBuffer = await imageBlob.arrayBuffer()
const buffer = Buffer.from(arrayBuffer)
const base64Data = buffer.toString('base64')
return {
content: [
{
type: 'image',
data: base64Data,
mimeType: 'image/png'
}
]
}
} catch (error) {
return {
content: [
{
type: 'text',
text: `이미지 생성 오류: ${error instanceof Error ? error.message : '알 수 없는 오류'}`
}
]
}
}
}
)
// Define code review prompt
server.prompt(
'code_review',
'Generate a detailed code review prompt for the provided code',
{
code: z.string().describe('The code to review'),
language: z.string().optional().describe('Programming language of the code (optional)')
},
async ({ code, language }: { code: string; language?: string }) => {
const langInfo = language ? ` (${language})` : ''
return {
messages: [
{
role: 'user',
content: {
type: 'text',
text: `다음 코드${langInfo}에 대해 상세한 코드 리뷰를 수행해주세요:
\`\`\`${language || ''}
${code}
\`\`\`
다음 항목들을 검토해주세요:
1. 코드 품질 및 가독성
2. 잠재적인 버그나 오류
3. 성능 최적화 가능성
4. 보안 이슈
5. 베스트 프랙티스 준수 여부
6. 개선 제안사항
각 항목에 대해 구체적인 예시와 함께 설명해주세요.`
}
}
]
}
}
)
// Define server info resource
server.resource(
'server-info',
'server://info',
{
description: 'Current MCP server information',
mimeType: 'application/json'
},
async () => {
const serverInfo = {
name: 'Greeting Server',
version: '1.0.0',
description: '다국어 인사말과 계산 기능을 제공하는 MCP 서버',
tools: [
{
name: 'greeting',
description: '지정된 언어로 사용자를 환영합니다',
supportedLanguages: ['korean', 'english', 'spanish', 'japanese', 'chinese']
},
{
name: 'calculator',
description: '기본 산술 연산을 수행합니다',
supportedOperations: ['add', 'subtract', 'multiply', 'divide']
},
{
name: 'image_generation',
description: 'AI를 사용하여 텍스트 프롬프트로부터 이미지를 생성합니다',
model: 'black-forest-labs/FLUX.1-schnell'
}
],
prompts: [
{
name: 'code_review',
description: '코드를 입력받아 상세한 코드 리뷰를 위한 프롬프트를 생성합니다',
arguments: ['code', 'language (optional)']
}
],
capabilities: ['tools', 'resources', 'prompts']
}
return {
contents: [
{
uri: 'server://info',
mimeType: 'application/json',
text: JSON.stringify(serverInfo, null, 2)
}
]
}
}
)
return server.server
}