Skip to main content

MCP (Master Control Program)

MCP๋Š” ์ธ๊ณต์ง€๋Šฅ ์‹œ์Šคํ…œ์˜ ์ค‘์•™ ์ œ์–ด ํ”„๋กœ๊ทธ๋žจ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ AI ๋ชจ๋ธ๊ณผ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ฉํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

MCP์˜ ์ฃผ์š” ๊ธฐ๋Šฅโ€‹

  1. ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

    • AI ๋ชจ๋ธ์˜ ์ž์› ํ• ๋‹น ๋ฐ ๊ด€๋ฆฌ
    • ์ปดํ“จํŒ… ํŒŒ์›Œ์˜ ํšจ์œจ์  ๋ถ„๋ฐฐ
    • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
  2. ์ž‘์—… ์Šค์ผ€์ค„๋ง

    • AI ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •
    • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๊ด€๋ฆฌ
    • ์ž‘์—… ํ ๊ด€๋ฆฌ
  3. ๋ชจ๋ธ ํ†ตํ•ฉ

    • ๋‹ค์–‘ํ•œ AI ๋ชจ๋ธ์˜ ํ†ตํ•ฉ
    • ๋ชจ๋ธ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ ๊ด€๋ฆฌ
    • API ํ†ตํ•ฉ
  4. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…

    • ์‹œ์Šคํ…œ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง
    • ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘
    • ์—๋Ÿฌ ๋กœ๊น… ๋ฐ ์•Œ๋ฆผ

MCP์˜ ์žฅ์ โ€‹

  • ํšจ์œจ์„ฑ: ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์‚ฌ์šฉ
  • ํ™•์žฅ์„ฑ: ์ƒˆ๋กœ์šด ๋ชจ๋ธ๊ณผ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€
  • ์•ˆ์ •์„ฑ: ์‹œ์Šคํ…œ ์žฅ์• ์— ๋Œ€ํ•œ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  • ์œ ์—ฐ์„ฑ: ๋‹ค์–‘ํ•œ AI ๋ชจ๋ธ๊ณผ ์„œ๋น„์Šค ํ†ตํ•ฉ ๊ฐ€๋Šฅ

๊ฐ„๋‹จํ•œ MCP ์„œ๋ฒ„ ์˜ˆ์ œโ€‹

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import asyncio
from typing import Dict, Any, Callable
import uvicorn

app = FastAPI(title="MCP Server", description="Master Control Program API")

class Task(BaseModel):
model: str
data: Any

class ModelRegistration(BaseModel):
name: str
model: Callable

class MCP:
def __init__(self):
self.models: Dict[str, Callable] = {}
self.task_queue = asyncio.Queue()

async def register_model(self, name: str, model: Callable):
self.models[name] = model

async def process_task(self, task: Task):
if task.model not in self.models:
raise HTTPException(status_code=404, detail="Model not found")
return await self.models[task.model](task.data)

mcp = MCP()

async def worker():
while True:
try:
task = await mcp.task_queue.get()
if task is None:
break
result = await mcp.process_task(task)
print(f"Task processed: {result}")
mcp.task_queue.task_done()
except Exception as e:
print(f"Error processing task: {e}")

@app.post("/task")
async def add_task(task: Task):
await mcp.task_queue.put(task)
return {"status": "Task added to queue"}

@app.post("/register")
async def register_model(registration: ModelRegistration):
await mcp.register_model(registration.name, registration.model)
return {"status": "Model registered"}

@app.on_event("startup")
async def startup_event():
# ์›Œ์ปค ํƒœ์Šคํฌ ์‹œ์ž‘
for _ in range(3):
asyncio.create_task(worker())

if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)

์‚ฌ์šฉ ์˜ˆ์‹œโ€‹

import httpx
import asyncio

async def simple_model(data):
await asyncio.sleep(1) # ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ๋ฎฌ๋ ˆ์ด์…˜
return {"result": f"Processed: {data}"}

async def main():
async with httpx.AsyncClient() as client:
# ๋ชจ๋ธ ๋“ฑ๋ก
response = await client.post(
'http://localhost:8000/register',
json={"name": "simple", "model": str(simple_model)}
)
print(response.json())

# ์ž‘์—… ์ถ”๊ฐ€
response = await client.post(
'http://localhost:8000/task',
json={"model": "simple", "data": "Hello MCP"}
)
print(response.json())

if __name__ == "__main__":
asyncio.run(main())

๊ฒฐ๋ก โ€‹

MCP๋Š” ํ˜„๋Œ€ AI ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ, ๋‹ค์–‘ํ•œ AI ๋ชจ๋ธ๊ณผ ์„œ๋น„์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์šด์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„๋ถ€ํ„ฐ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ๊นŒ์ง€, MCP์˜ ๊ฐœ๋…์€ AI ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.