None
Loading...

๐Ÿš€ [Project] AI ๋‚ด ์ง์› ๋งŒ๋“ค๊ธฐ: MCP ๋กœ์ปฌ ์„œ๋ฒ„ ๊ตฌ์ถ•๊ณผ ์˜ค๋ฅ˜์˜ ์ •์„

193 | 2026-01-30 16:35 | AX | fastapi-mcp๋ฅผ ํ™œ์šฉํ•œ MCP ๋กœ์ปฌ ์„œ๋ฒ„ ๊ตฌ์ถ• ์ค‘ ๋งˆ์ฃผํ•œ Not Acceptable ๋ฐ 405 Method Not Allowed ์—๋Ÿฌ ํ•ด๊ฒฐ ๊ณผ์ •์„ ์ƒ์„ธํžˆ ๋‹ด์•˜์Šต๋‹ˆ๋‹ค. MCP์™€ Function Calling์˜ ํฌํ•จ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•˜๊ณ , ์™œ AI ์ง์›์„ ์œ„ํ•ด ๋กœ์ปฌ์ด ์•„๋‹Œ ์›๊ฒฉ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•œ ์ „๋žต์  ๊ฒฐ๋ก ์„ ํ™•์ธํ•˜์„ธ์š”.


๐Ÿ› ๏ธ ์‹ค์ „ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: fastapi-mcp์™€ ๋ณด๋‚ธ 48์‹œ๊ฐ„์˜ ๊ธฐ๋ก

Django์— ์ต์ˆ™ํ•œ ์ €์—๊ฒŒ FastAPI๋Š” ๋งค๋ ฅ์ ์ธ ์‹ ์„ธ๊ณ„์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 'Zero Configuration'์„ ํ‘œ๋ฐฉํ•˜๋Š” fastapi-mcp ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋‚˜๋ฉด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋‚œ๊ด€์— ๋ถ€๋”ชํ˜”์Šต๋‹ˆ๋‹ค.

 

1. mount() ๋ฉ”์†Œ๋“œ์˜ Deprecation ๊ฒฝ๊ณ 

๋Œ€๋ถ€๋ถ„์˜ ์ฐธ์กฐ ๋ฌธ์„œ์—์„œ๋Š” mcp.mount(app)๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ์‹  ๋ฒ„์ „(25๋…„ ํ•˜๋ฐ˜๊ธฐ ๊ธฐ์ค€)์—์„œ๋Š” ์ด ๋ฉ”์†Œ๋“œ์— ์ทจ์†Œ์„ ์ด ๊ทธ์–ด์ง€๋ฉฐ Deprecated ๊ฒฝ๊ณ ๊ฐ€ ๋œน๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ์ฑ…: ์ด์ œ๋Š” ์ „์†ก ๋ฐฉ์‹์— ๋”ฐ๋ผ mount_http() ๋˜๋Š” mount_sse()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”๋œ mount_http()๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

 

2. "Client must accept text/event-stream" ์„œ๋ฒ„ ์—๋Ÿฌ์˜ ๊ณตํฌ

๊ถŒ์žฅ ๋ฐฉ์‹์ธ mount_http()๋ฅผ ์ ์šฉํ•˜๊ณ  /mcp ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ–ˆ์„ ๋•Œ, ์ €๋ฅผ ๋ฐ˜๊ธด ๊ฒƒ์€ ํ™”๋ คํ•œ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ ์•„๋ž˜์˜ ์ฐจ๊ฐ€์šด JSON ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜€์Šต๋‹ˆ๋‹ค.

{"jsonrpc":"2.0","id":"server-error","error":{"code":-32600,"message":"Not Acceptable: Client must accept text/event-stream"}}

์ด ๋ฉ”์‹œ์ง€ ๋•Œ๋ฌธ์— ์ €๋Š” "์„œ๋ฒ„ ์„ธํŒ…์ด ์ž˜๋ชป๋˜์—ˆ๋‹ค"๊ณ  ํŒ๋‹จํ•˜๊ณ  ์ˆ˜ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ฐ˜์ „์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด์ด๋Š” ์ด ์—๋Ÿฌ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‹ค์ œ MCP ํด๋ผ์ด์–ธํŠธ(TradeNPU_AI)์—์„œ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” text/event-stream์„ ์ˆ˜๋ฝํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์ผ ๋ฟ, ์„œ๋ฒ„๋Š” ์ด๋ฏธ ์ค€๋น„๋œ ์ƒํƒœ์˜€๋˜ ๊ฒƒ์ด์ฃ .

 

3. mount_sse()์˜ ํ•จ์ •๊ณผ 405 ์—๋Ÿฌ

์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์—†์• ๋ณด๋ ค๊ณ  mount_sse()๋กœ ์šฐํšŒํ–ˆ์„ ๋•Œ, ๊ฒ‰์œผ๋กœ๋Š” ํ•‘(Ping)์ด ์˜ค๊ฐ€๋ฉฐ ์ •์ƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜์ž 405 Method Not Allowed ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช… POST๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„ ๋กœ๊ทธ์—๋„ POST๋กœ ์ฐํžˆ๋Š”๋ฐ, ์›์ธ ๋ชจ๋ฅผ ๊ฑฐ๋ถ€ ๋ฐ˜์‘์ด ์ผ์–ด๋‚œ ๊ฒƒ์ด์ฃ .

๊ฒฐ๋ก : ๋ฐค์ž ์„ ์„ค์ณ๊ฐ€๋ฉฐ ๋‚ด๋ฆฐ ํ•ด๋‹ต์€ "์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฏฟ์ง€ ๋ง๊ณ  ๊ถŒ์žฅ ์„ธํŒ…(mount_http)์œผ๋กœ ๋ฐ€์–ด๋ถ™์—ฌ๋ผ"์˜€์Šต๋‹ˆ๋‹ค. ๊ฒ‰๋ชจ์Šต(๋ธŒ๋ผ์šฐ์ € ๊ฒฐ๊ณผ)์— ์†์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ด๋ฒˆ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์˜ ํ•ต์‹ฌ์ด์—ˆ์Šต๋‹ˆ๋‹ค.


 

๐Ÿง  ๊นจ๋‹ฌ์Œ์˜ ๊ธฐ๋ก: MCP์™€ Function Calling์˜ '์ง„์งœ' ๊ด€๊ณ„

์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด๋ฉฐ ์ด์ „์— ์ œ๊ฐ€ ๊ฐ€์กŒ๋˜ ์˜คํ•ด๋“ค์„ ๋ฐ”๋กœ์žก๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

1. MCP vs Function Calling? (๋น„๊ต ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค)

๊ณผ๊ฑฐ์˜ ์ €๋Š” ๋‘ ๊ฐœ๋…์„ ๋Œ€๋“ฑํ•œ ์„ ํƒ์ง€๋กœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ๋“ค์–ด๋ณด๋‹ˆ ์ด ๋‘˜์€ ํฌํ•จ ๊ด€๊ณ„์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

  • Function Calling: AI๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ–‰์œ„์™€ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค.

  • MCP (Model Context Protocol): ๊ทธ ํ˜ธ์ถœ ๊ณผ์ •์„ ๊ทœ๊ฒฉํ™”ํ•˜๊ณ  ํ‘œ์ค€ํ™”ํ•œ ๊ทœ์•ฝ(Protocol)์ž…๋‹ˆ๋‹ค. ์ฆ‰, MCP ์„œ๋ฒ„ ์•ˆ์—์„œ๋„ ๊ฒฐ๊ตญ Function Calling์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. "์–ด๋–ค ๋ฐฉ์‹์ด ๋” ํ’ˆ์งˆ์ด ์ข‹์„๊นŒ?"๋ผ๋Š” ๊ณ ๋ฏผ์€ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๋‚ด๋†“๋Š” ๊ฒฐ๊ณผ๊ฐ’์˜ ์ œ์•ฝ์ด ํ’ˆ์งˆ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

2. ๋กœ์ปฌ vs ์›๊ฒฉ? (๊ฒฐ๊ตญ์€ '์›๊ฒฉ'์ด ๋‹ต์ด๋‹ค)

"ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์ผ ๋‹ค"๋Š” ์ดˆ๊ธฐ ๋ฐœ์ƒ์€ '24์‹œ๊ฐ„ ์ƒ์ฃผํ•˜๋Š” AI ์ง์›'์ด๋ผ๋Š” ๋ชฉ์ ์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํ˜„์‹ค์  ๋ฌธ์ œ: ์œ ๋™ IP ๋ฌธ์ œ, ๋ฐฉํ™”๋ฒฝ ๊ฐœ๋ฐฉ์˜ ์œ„ํ—˜์„ฑ, 24์‹œ๊ฐ„ ๊ฐ€๋™์˜ ๋ถˆ์•ˆ์ •์„ฑ.

  • ๋‚˜์•„๊ฐˆ ๋ฐฉํ–ฅ: ์ œ๋Œ€๋กœ ๋œ ์—…๋ฌด ์œ„์ž„์„ ์œ„ํ•ด์„œ๋Š” MCP ์„œ๋ฒ„ ์—ญ์‹œ ์›๊ฒฉ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ •์ ์œผ๋กœ ํ˜ธ์ŠคํŒ…๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "๋ชจ๋‘์—๊ฒŒ ์ด๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ฒ ๋‹ค"๋Š” ๊ด€์ ์—์„œ๋„ ์›๊ฒฉ ๋ฐฐํฌ๋Š” ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.


 

โญ ๋‹ค์Œ ๋‹จ๊ณ„: ์‹ค์งˆ์ ์ธ '๋„๊ตฌ'์˜ ๊ตฌํ˜„

์ด์ œ ์•„ํ‚คํ…์ฒ˜์™€ ์„œ๋ฒ„ ์„ธํŒ…์— ๋Œ€ํ•œ ์ง€๋ฃจํ•œ(?) ์”จ๋ฆ„์€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์‹ค์ œ๋กœ AI ์ง์›์ด ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก DRF(Django REST Framework)๋ฅผ ํ™œ์šฉํ•ด ๊ตฌ์ฒด์ ์ธ CRUD ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 


๐Ÿ’ก ์•ˆ๋‚ด: ์ด ํฌ์ŠคํŒ…์€ ๊ธฐ์กด ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ์˜ '๊ฐœ๋ฐœ์šฉ MCP ๋กœ์ปฌ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ' ์‹œ๋ฆฌ์ฆˆ๋ฅผ ํ†ตํ•ฉํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. fastapi-mcp ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฒช์€ ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๋“ค๊ณผ, ์ด๋ฅผ ํ†ตํ•ด ์ •๋ฆฝํ•œ MCP์™€ Function Calling์˜ ์˜ฌ๋ฐ”๋ฅธ ๊ด€๊ณ„๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.







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