None
Loading...

๐Ÿš€ [Project] AI ๋‚ด ์ง์› ๋งŒ๋“ค๊ธฐ: MCP ์„œ๋ฒ„์˜ ์™„์„ฑ, ๋ณด์•ˆ๊ณผ ์ธ์ฆ์˜ ์‹ค๋ฌด ์ „๋žต

47 | 2026-01-31 16:48 | AX | FastAPI MCP ์„œ๋ฒ„์— Django REST Framework(DRF) ์ธ์ฆ ์ฒด๊ณ„๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ์‹ค๋ฌด ์ „๋žต์„ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์ธ์ฆ ๊ตฌํ˜„ ํŒ๋ถ€ํ„ฐ, AI์™€ ํ˜‘์—…ํ•  ๋•Œ '์ข‹์€ ์งˆ๋ฌธ์ž'๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ ์ฒ ํ•™๊นŒ์ง€ ํ™•์ธํ•˜์„ธ์š”.


๐Ÿ›ก๏ธ ๋ณด์•ˆ ์ „๋žต: "์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ์„ ํ™œ์šฉํ•˜๋ผ" (DRF Token์˜ ์žฌ๋ฐœ๊ฒฌ)

API๋ฅผ ๋Œ€์ค‘์—๊ฒŒ ๊ณต๊ฐœํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ธ๊ฐ€๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ ๋ณด์•ˆ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ €๋Š” FastAPI์˜ ์ž์ฒด ์ธ์ฆ(OAuth2.0, JWT ๋“ฑ)์„ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ๋Œ€์‹ , ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ์ธ Django REST Framework(DRF)์˜ AuthToken์„ ํ™œ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด์œ  1: ์˜์กด์„ฑ ์ตœ์†Œํ™”: fastapi[all]์„ ์„ค์น˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น„๋Œ€ํ™”๋ฅผ ์ดˆ๋ž˜ํ•˜๊ธฐ๋ณด๋‹ค, ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด์œ  2: ํ†ตํ•ฉ ๊ด€๋ฆฌ: ์‚ฌ์šฉ์ž์˜ ์ธ์ฆํ‚ค๋Š” ์ด๋ฏธ Django DB์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด API ์„œ๋ฒ„์™€ ๋ฉ”์ธ ์„œ๋ฒ„ ๊ฐ„์˜ ์ธ์ฆ ์ฒด๊ณ„๋ฅผ ์ด์ค‘์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์–ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.


 

๐Ÿ’ก ์ธ์‚ฌ์ดํŠธ: ์ข‹์€ ์งˆ๋ฌธ์ž๊ฐ€ AI๋ฅผ ์ด๊ธด๋‹ค

๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ œ๊ฐ€ ๋А๋‚€ ์ ์€, ํด๋กœ๋“œ(Claude)๋‚˜ ์ œ๋ฏธ๋‚˜์ด(Gemini) ๊ฐ™์€ AI๊ฐ€ ์ฝ”๋“œ๋ฅผ ์งœ์ฃผ๋”๋ผ๋„ '์œ ๊ธฐ์  ๊ฒฐํ•ฉ'์€ ์—ฌ์ „ํžˆ ์ธ๊ฐ„์˜ ๋ชซ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ "AI๊ฐ€ ๋ฑ‰์–ด์ฃผ๋Š” ์˜ค๋ฅ˜๋Š” ํ•™์Šต์˜ ๊ธฐํšŒ"๋ผ๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋„ˆ๋ฌด ์™„๋ฒฝํ•˜๊ฒŒ ์งœ์ฃผ๋Š” AI๋Š” ์˜คํžˆ๋ ค ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž์—๊ฒŒ '๋…'์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์ง์ ‘ ๋งˆ์ฃผํ•˜๊ณ , "์™œ ์ด ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”์ง€"๋ฅผ ์ง‘์š”ํ•˜๊ฒŒ ๋ฌป๋Š” ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ์˜ 'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ƒ์‹'์ด ๊ธธ๋Ÿฌ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์ƒ์‹์ด ๋’ท๋ฐ›์นจ๋˜์–ด์•ผ๋งŒ AI์—๊ฒŒ ๋” ์˜ˆ๋ฆฌํ•˜๊ณ  ์ฐฝ์˜์ ์ธ ์งˆ๋ฌธ์„ ๋˜์ง€๋Š” '์ข‹์€ ์งˆ๋ฌธ์ž'๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


 

๐Ÿ’ป ์‹ค์ „ ์ฝ”๋“œ: fastapi-mcp ์ธ์ฆ ๊ตฌํ˜„ (Authorization)

์ด์ œ ์‹ค์ œ ๊ตฌํ˜„๋œ ์ฝ”๋“œ์˜ ํ•ต์‹ฌ์„ ์งš์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒ€์ƒ‰์œผ๋กœ๋Š” ์ฐพ๊ธฐ ํž˜๋“  fastapi-mcp ๊ณต์‹ ๋ฌธ์„œ ๊ธฐ๋ฐ˜์˜ ์„ค์ •์ž…๋‹ˆ๋‹ค.

 

1. MCP ์„œ๋ฒ„ ์ธก: ์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)

์„œ๋ฒ„๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ €์žฅ๋œ AUTH_TOKEN๊ณผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ํ—ค๋”๋ฅผ ๋Œ€์กฐํ•ฉ๋‹ˆ๋‹ค. FastApiMCP ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ auth_config ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ƒ์‹œ ๊ฒ€์ฆํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Python
 
# MCP ์„œ๋ฒ„์ธก ์„ค์ • ์˜ˆ์‹œ from fastapi import Depends, Header, HTTPException from fastapi_mcp import FastApiMCP, AuthConfig  def validate_drf_token(authorization: str = Header(...)):     # "Token <your_token>" ํ˜•์‹์—์„œ ํ† ํฐ๊ฐ’ ์ถ”์ถœ ๋ฐ ๊ฒ€์ฆ ๋กœ์ง     if not authorization == f"Token {MY_AUTH_TOKEN}":         raise HTTPException(status_code=401, detail="Invalid Token")  mcp = FastApiMCP(     app,     auth_config=AuthConfig(         dependencies=[Depends(validate_drf_token)],     ), ) mcp.mount_http(mount_path="/mcp") 

 

2. MCP ํด๋ผ์ด์–ธํŠธ ์ธก: ํ—ค๋” ์‹ค์–ด ๋ณด๋‚ด๊ธฐ

ํด๋ผ์ด์–ธํŠธ(TradeNPU_AI)์—์„œ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ StreamableHttpTransport์˜ headers ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์•„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

Python
 
# MCP ํด๋ผ์ด์–ธํŠธ์ธก ์„ค์ • ์˜ˆ์‹œ from mcp import Client from mcp.client.http import StreamableHttpTransport  transport = StreamableHttpTransport(     url=MCP_SERVER_URL,     headers={         "Authorization": f"Token {drf_token}",     } )  mcp_client = Client(transport=transport) 

 

๐Ÿงญ ๊ฒฐ๋ก : ๋กœ์ปฌ์„ ๋„˜์–ด ์›๊ฒฉ์œผ๋กœ ๊ฐ€๋Š” ์ง•๊ฒ€๋‹ค๋ฆฌ

์ธ์ฆ ๊ณผ์ •๊นŒ์ง€ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ตํ•ฉํ•˜๋ฉฐ, ์ด์ œ '๋‚ด ์ง์›'์€ ํ—ˆ๋ฝ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ๋ฐ˜์‘ํ•˜๋Š” ๋“ ๋“ ํ•œ ๊ฐ€๋“œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์žฅ์€ ์ €๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์ด์ง€๋งŒ, ์ด ๊ตฌ์กฐ๋Š” ์–ธ์ œ๋“  ์›๊ฒฉ ์„œ๋ฒ„๋กœ ํ™•์žฅํ•˜์—ฌ ์ „์ฒด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐœ๋ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ๊ทœ๊ฒฉ์ด ๋ฉ๋‹ˆ๋‹ค.

 

๊ธฐ์ˆ ์  ๋‚œ๊ด€์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ป์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ทผ์œก์€ ๋‹ค์Œ ๋‹จ๊ณ„์ธ '๋” ๋ณต์žกํ•œ ๋„๊ตฌ(Tool) ๊ฐœ๋ฐœ'์„ ์œ„ํ•œ ์†Œ์ค‘ํ•œ ์ž์‚ฐ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 


๐Ÿ’ก ์•ˆ๋‚ด: ์ด ํฌ์ŠคํŒ…์€ ๊ธฐ์กด ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ์˜ '๊ฐœ๋ฐœ์šฉ MCP ๋กœ์ปฌ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ' 3, 4ํšŒ์ฐจ๋ฅผ ํ†ตํ•ฉํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. FastAPI ๊ธฐ๋ฐ˜ MCP ์„œ๋ฒ„์— DRF ์ธ์ฆํ‚ค๋ฅผ ์ ‘๋ชฉํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, AI์™€ ํ˜‘์—…ํ•˜๋Š” 'ํ˜„๋ช…ํ•œ ์งˆ๋ฌธ์ž'์˜ ํƒœ๋„์— ๋Œ€ํ•ด ๋‹ค๋ฃน๋‹ˆ๋‹ค.







๐Ÿ’ก TradeNPU|Knowledge Basket์—์„œ
์‚ฌ์•ˆ์— ๋Œ€ํ•œ ๋” ๊นŠ์ด ์žˆ๋Š” ๋ฒ•๋ฅ  ๋ถ„์„๊ณผ ์‹ค๋ฌด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๋ณด์„ธ์š”.