๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ›ฐ๏ธ MCP ์ง€์›

์ด ๋ฌธ์„œ๋Š” Open WebUI์—์„œ ์ œ๊ณตํ•˜๋Š” MCP (Model Context Protocol)-to-OpenAPI ํ”„๋ก์‹œ ์„œ๋ฒ„ (mcpo)๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค์ •ํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. MCP ๊ธฐ๋ฐ˜ ํˆด ์„œ๋ฒ„๋ฅผ ์ตœ์ข… ์‚ฌ์šฉ์ž์™€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ ํ•ฉํ•œ ํ‘œ์ค€ OpenAPI ์—”๋“œํฌ์ธํŠธ๋กœ ์‰ฝ๊ฒŒ ๋…ธ์ถœ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ MCP ํ”„๋ก์‹œ ์„œ๋ฒ„๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?โ€‹

MCP-to-OpenAPI ํ”„๋ก์‹œ ์„œ๋ฒ„๋Š” MCP (Model Context Protocol)๋กœ ๊ตฌํ˜„๋œ ํˆด ์„œ๋ฒ„๋ฅผ ํ‘œ์ค€ REST/OpenAPI API๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹คโ€”๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์ปค์Šคํ…€ ํ”„๋กœํ† ์ฝœ์„ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๊ฐ•๋ ฅํ•œ MCP ๊ธฐ๋ฐ˜ ๋„๊ตฌ์— REST์™€ ๊ฐ™์€ ์นœ์ˆ™ํ•œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์™œ mcpo๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?โ€‹

MCP ํˆด ์„œ๋ฒ„๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ‘œ์ค€ ์ž…๋ ฅ/์ถœ๋ ฅ(stdio)์œผ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹คโ€”์ด๋Š” ์ข…์ข… ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ์‹คํ–‰๋˜๋ฉฐ ํŒŒ์ผ ์‹œ์Šคํ…œ, ํ™˜๊ฒฝ ๋ฐ ๊ธฐํƒ€ ๋„ค์ดํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ ์€ ๊ฐ•์ ์ด์ง€๋งŒ, ๋™์‹œ์— ์ œํ•œ์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค(์˜ˆ: Open WebUI)๋ฅผ ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: ํด๋ผ์šฐ๋“œ ์ธ์Šคํ„ด์Šค๋Š” ๋กœ์ปฌ ๋จธ์‹ ์—์„œ stdio๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ์ค‘์ธ MCP ์„œ๋ฒ„์™€ ์ง์ ‘ ํ†ต์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ mcpo๊ฐ€ ํš๊ธฐ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

MCP ์„œ๋ฒ„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ raw stdio ํ†ต์‹ ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š”:

  • ๐Ÿ”“ ํ™˜๊ฒฝ ๊ฐ„์— ๋ณธ์งˆ์ ์œผ๋กœ ๋ณด์•ˆ์ด ๋ถ€์กฑํ•จ
  • โŒ ๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€ ๋„๊ตฌ, UI ๋˜๋Š” ํ”Œ๋žซํผ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Œ
  • ๐Ÿงฉ ์ธ์ฆ, ๋ฌธ์„œํ™”, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ ๋ถ€์กฑ

mcpo ํ”„๋ก์‹œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค:

  • โœ… ๊ธฐ์กด OpenAPI ๋„๊ตฌ, SDK, ํด๋ผ์ด์–ธํŠธ์™€ ์ฆ‰์‹œ ํ˜ธํ™˜ ๊ฐ€๋Šฅ
  • ๐Ÿ›ก ๋„๊ตฌ๋ฅผ ๋ณด์•ˆ์„ฑ, ํ™•์žฅ์„ฑ, ํ‘œ์ค€ ๊ธฐ๋ฐ˜ HTTP ์—”๋“œํฌ์ธํŠธ๋กœ ๋ž˜ํ•‘
  • ๐Ÿง  ๋ชจ๋“  ๋„๊ตฌ์— ๋Œ€ํ•ด ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ OpenAPI ๋ฌธ์„œ๋ฅผ ์ž๋™ ์ƒ์„ฑ, ์„ค์ • ํ•„์š” ์—†์Œ
  • ๐Ÿ”Œ ๊ฐ„๋‹จํ•œ HTTP ์‚ฌ์šฉโ€”์†Œ์ผ“ ์„ค์ •, ๋ฐ๋ชฌ ๊ด€๋ฆฌ, ํ”Œ๋žซํผ๋ณ„ glue code ๋ถˆํ•„์š”

๋”ฐ๋ผ์„œ ์ฒ˜์Œ์—๋Š” mcpo๊ฐ€ "๋‹จ์ง€ ๋˜ ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด"์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒโ€”์‹ค์ œ๋กœ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹จ์ˆœํ™”ํ•˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • ๋” ๋‚˜์€ ํ†ตํ•ฉ โœ…
  • ๋” ๋‚˜์€ ๋ณด์•ˆ โœ…
  • ๋” ๋‚˜์€ ํ™•์žฅ์„ฑ โœ…
  • ๋” ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฐœ๋ฐœ์ž ๋ฐ ์‚ฌ์šฉ์ž โœ…

โœจ mcpo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋กœ์ปฌ ์ „์šฉ AI ๋„๊ตฌ๊ฐ€ ํด๋ผ์šฐ๋“œ ์ค€๋น„ ์™„๋ฃŒ, UI ์นœํ™”์ , ์ฆ‰์‹œ ์ƒํ˜ธ์šด์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹คโ€”ํˆด ์„œ๋ฒ„ ์ฝ”๋“œ ํ•œ ์ค„๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ .

โœ… ๋น ๋ฅธ ์‹œ์ž‘: ๋กœ์ปฌ์—์„œ ํ”„๋ก์‹œ ์‹คํ–‰ํ•˜๊ธฐโ€‹

๊ฐ€๋ณ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ํˆด mcpo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MCP-to-OpenAPI ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‰ฝ๊ฒŒ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (GitHub ๋ ˆํฌ์ง€ํ† ๋ฆฌ):

  1. ์‚ฌ์ „ ์ค€๋น„๋ฌผ

    • pip์ด ์„ค์น˜๋œ Python 3.8+
    • MCP ํ˜ธํ™˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (์˜ˆ: mcp-server-time)
    • (๊ถŒ์žฅ) uv์„ ์„ค์น˜ํ•˜์—ฌ ๋น ๋ฅธ ์‹œ์ž‘ ๋ฐ ์„ค์ • ์—†์ด ๊ฐ„ํŽธํ•œ ์‚ฌ์šฉ.
  2. mcpo ์„ค์น˜ํ•˜๊ธฐ

uv๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜(๊ถŒ์žฅ):

uvx mcpo --port 8000 -- your_mcp_server_command

๋˜๋Š” pip์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜:

pip install mcpo
mcpo --port 8000 -- your_mcp_server_command
  1. ๐Ÿš€ ํ”„๋ก์‹œ ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ

MCP-to-OpenAPI ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด MCP ํ˜ธํ™˜ ํˆด ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์—†์œผ์‹  ๊ฒฝ์šฐ, MCP ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ MCP ์„œ๋ฒ„ ๊ตฌํ˜„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โœจ MCP ์„œ๋ฒ„๋ฅผ ์–ด๋””์„œ ์ฐพ๋‚˜์š”?

๋‹ค์Œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์˜ˆ์ œ์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋Š” MCP ์„œ๋ฒ„๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๊ธฐ ์žˆ๋Š” Time MCP Server๋Š” ์—ฌ๊ธฐ์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ œ๊ณต๋œ MCP ์„ค์ • ๋‚ด์—์„œ README์— ๋ช…ํ™•ํžˆ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค. README์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

Claude ์„ค์ •์— ์ถ”๊ฐ€:

"mcpServers": {   
"time": {
"command": "uvx",
"args": ["mcp-server-time", "--local-timezone=America/New_York"]
}
}

๐Ÿ”‘ MCP ์„ค์ •์„ ๊ฐ„๋‹จํ•œ ๋กœ์ปฌ ํ”„๋ก์‹œ ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜:

๊ถŒ์žฅ MCP ์„œ๋ฒ„ (mcp-server-time)๋ฅผ MCP-to-OpenAPI ํ”„๋ก์‹œ (mcpo)๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

uvx mcpo --port 8000 -- uvx mcp-server-time --local-timezone=America/New_York

์ด๊ฒŒ ๋์ž…๋‹ˆ๋‹ค! ์ด์ œ MCP-to-OpenAPI ํ”„๋ก์‹œ๋ฅผ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ MCP Time ์„œ๋ฒ„๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‘œ์ค€ OpenAPI ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค:

๊ณต์‹ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ MCP ๊ตฌํ˜„์˜ MCP ์„œ๋ฒ„ ๋ช…๋ น์œผ๋กœ uvx mcp-server-time --local-timezone=America/New_York๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋Œ€์ฒดํ•˜์„ธ์š”.

๐Ÿค ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ ํ›„ Open WebUI์™€ ํ†ตํ•ฉํ•˜๋ ค๋ฉด ์ด ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๐Ÿš€ ์ƒ์„ฑ๋œ API ์•ก์„ธ์Šคํ•˜๊ธฐโ€‹

์‹œ์ž‘ํ•˜์ž๋งˆ์ž MCP ํ”„๋ก์‹œ(mcpo)๋Š” ์ž๋™์œผ๋กœ:

  • MCP ๋„๊ตฌ๋ฅผ ๋™์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ  REST ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•˜๊ณ  ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” OpenAPI ๋ฌธ์„œ๋ฅผ ์•„๋ž˜์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
    • http://localhost:8000/docs

์„ ํ˜ธํ•˜๋Š” HTTP ํด๋ผ์ด์–ธํŠธ, AI ์—์ด์ „ํŠธ, ๋˜๋Š” ๊ธฐํƒ€ OpenAPI ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ž๋™ ์ƒ์„ฑ๋œ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์„ธ์š”.

๐Ÿ“– ์ตœ์ข… ์‚ฌ์šฉ์ž์šฉ ์˜ˆ์ œ ์›Œํฌํ”Œ๋กœ์šฐโ€‹

์œ„ ์„œ๋ฒ„ ๋ช…๋ น(uvx mcp-server-time)์„ ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค:

  • ๋กœ์ปฌ API ๋ฌธ์„œ์ธ http://localhost:8000/docs๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.
  • ์ƒ์„ฑ๋œ ์—”๋“œํฌ์ธํŠธ(e.g. /get_current_time)๋ฅผ ์„ ํƒํ•˜๊ณ  ์ œ๊ณต๋œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • "Execute"๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ฆ‰์‹œ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์„ค์ • ์—†์ด, ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ REST API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌํ•˜๊ธฐ (์˜ˆ์ œ)โ€‹

mcpo๋ฅผ ์‚ฌ์šฉํ•œ MCP-to-OpenAPI ํ”„๋ก์‹œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Dockerizeํ•˜๊ณ  ํด๋ผ์šฐ๋“œ ๋˜๋Š” VPS ์†”๋ฃจ์…˜์— ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”:

๐Ÿณ mcpo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ ์„œ๋ฒ„ ๋„์ปคํ™”ํ•˜๊ธฐโ€‹

  1. Dockerfile ์˜ˆ์ œ

๋‹ค์Œ Dockerfile์„ ๋ฐฐํฌ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— ์ž‘์„ฑํ•˜์„ธ์š”:

FROM python:3.11-slim
WORKDIR /app
RUN pip install mcpo uv
# ๋‹น์‹ ์˜ MCP ์„œ๋ฒ„ ๋ช…๋ น์œผ๋กœ ๊ต์ฒดํ•˜์„ธ์š”; ์˜ˆ: uvx mcp-server-time
CMD ["uvx", "mcpo", "--host", "0.0.0.0", "--port", "8000", "--", "uvx", "mcp-server-time", "--local-timezone=America/New_York"]
  1. ๋กœ์ปฌ์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰
docker build -t mcp-proxy-server .
docker run -d -p 8000:8000 mcp-proxy-server
  1. ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ

DockerHub ๋˜๋Š” ๋‹ค๋ฅธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘ธ์‹œํ•˜์„ธ์š”:

docker tag mcp-proxy-server yourdockerusername/mcp-proxy-server:latest
docker push yourdockerusername/mcp-proxy-server:latest

Docker Compose, Kubernetes YAML ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋˜๋Š” ์„ ํ˜ธํ•˜๋Š” ํด๋ผ์šฐ๋“œ ์ปจํ…Œ์ด๋„ˆ ์„œ๋น„์Šค(AWS ECS, Azure Container Instances, Render.com ๋˜๋Š” Heroku)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜์„ธ์š”.

โœ”๏ธ ๋‹น์‹ ์˜ ํ”„๋กœ๋•์…˜ MCP ์„œ๋ฒ„๋Š” ์ด์ œ REST API๋ฅผ ํ†ตํ•ด ์†์‰ฝ๊ฒŒ ์ด์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!

๐Ÿง‘โ€๐Ÿ’ป ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ๊ณผ ๋ฐฐ๊ฒฝโ€‹

๐Ÿƒ ์ž‘๋™ ๋ฐฉ์‹ (๊ธฐ์ˆ ์  ์š”์•ฝ)โ€‹

  • ๋™์  ์Šคํ‚ค๋งˆ ๊ฒ€์ƒ‰ ๋ฐ ์—”๋“œํฌ์ธํŠธ: ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ”„๋ก์‹œ๋Š” MCP ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๋ฅผ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. MCP ๋„๊ตฌ ์Šคํ‚ค๋งˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์œผ๋กœ FastAPI ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•œ REST ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • OpenAPI ์ž๋™ ๋ฌธ์„œํ™”: ์ƒ์„ฑ๋œ ์—”๋“œํฌ์ธํŠธ๋Š” FastAPI์˜ ๋‚ด์žฅ๋œ Swagger UI(/docs)๋ฅผ ํ†ตํ•ด ๋ฌธ์„œํ™”๋˜๊ณ  ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ฌธ์„œ ์ž‘์„ฑ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

  • ๋น„๋™๊ธฐ์‹ ๋ฐ ๋†’์€ ์„ฑ๋Šฅ: ๊ฒฌ๊ณ ํ•œ ๋น„๋™๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌ์ถ•๋˜์–ด ๋™์‹œ์— ์‚ฌ์šฉ์ž์—๊ฒŒ ์†๋„์™€ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“š ์† ๋‚ด๋ถ€:โ€‹

  • FastAPI (์ž๋™ ๋ผ์šฐํŒ… ๋ฐ ๋ฌธ์„œ ์ƒ์„ฑ)
  • MCP ํด๋ผ์ด์–ธํŠธ (ํ‘œ์ค€ MCP ํ†ตํ•ฉ ๋ฐ ์Šคํ‚ค๋งˆ ๊ฒ€์ƒ‰)
  • HTTP๋ฅผ ํ†ตํ•œ ํ‘œ์ค€ JSON (์‰ฌ์šด ํ†ตํ•ฉ)

โšก๏ธ MCP-to-OpenAPI ํ”„๋ก์‹œ์˜ ์šฐ์›”์„ฑโ€‹

ํ”„๋ก์‹œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด MCP ์„œ๋ฒ„๋ฅผ OpenAPI๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™œ ํ›จ์”ฌ ๋” ์šฐ์›”ํ•œ์ง€์™€ Open WebUI๊ฐ€ ์ด๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ์ด์œ ๋ฅผ ์•„๋ž˜์—์„œ ํ™•์ธํ•˜์„ธ์š”:

  • ์‚ฌ์šฉ์ž ์นœํ™”์ ์ด๊ณ  ์ต์ˆ™ํ•œ ์ธํ„ฐํŽ˜์ด์Šค: HTTP REST ์—”๋“œํฌ์ธํŠธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ณ„๋„์˜ ์ปค์Šคํ…€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์ฆ‰๊ฐ์ ์ธ ํ†ตํ•ฉ: ์ˆ˜์ฒœ ๊ฐœ์˜ ๊ธฐ์กด REST/OpenAPI ๋„๊ตฌ, SDK, ์„œ๋น„์Šค์™€ ์ฆ‰์‹œ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ•๋ ฅํ•˜๊ณ  ์ž๋™ํ™”๋œ ๋ฌธ์„œํ™”: ๋‚ด์žฅ Swagger UI ๋ฌธ์„œ๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ํ•ญ์ƒ ์ •ํ™•ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ ํ”„๋กœํ† ์ฝœ ๋ถ€๋‹ด ์—†์Œ: MCP ํŠน์ • ํ”„๋กœํ† ์ฝœ ๋ณต์žก์„ฑ๊ณผ ์†Œ์ผ“ ํ†ต์‹  ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌํ•  ํ•„์š”์„ฑ์„ ์—†์•ฑ๋‹ˆ๋‹ค.
  • ๊ฒ€์ฆ๋œ ๋ณด์•ˆ ๋ฐ ์•ˆ์ •์„ฑ: HTTPS ์ „์†ก, ํ‘œ์ค€ ์ธ์ฆ ๋ฐฉ๋ฒ•(JWT, API ํ‚ค), ๊ฒฌ๊ณ ํ•œ ๋น„๋™๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ FastAPI์˜ ์ž…์ฆ๋œ ๊ฐ•๊ฑดํ•จ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฏธ๋ž˜ ๋Œ€๋น„: MCP ํ”„๋ก์‹œ๋Š” ์•ˆ์ •์ ์ด๊ณ  ํ‘œ์ค€์ ์ธ REST/OpenAPI ํฌ๋งท์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ๊ธฐ์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›๊ณผ ์ง„ํ™”๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ ๊ฒฐ๋ก : MCP-to-OpenAPI๋Š” ๊ฐ•๋ ฅํ•œ MCP ๊ธฐ๋ฐ˜ AI ๋„๊ตฌ๋ฅผ ์ง๊ด€์ ์ด๊ณ  ์‹ ๋ขฐ์„ฑ๊ณผ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ REST ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋„๋ฆฌ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Open WebUI๋Š” ์ด ์ตœ์šฐ์ˆ˜ ์ ‘๊ทผ๋ฒ•์„ ์ž๋ž‘์Šค๋Ÿฝ๊ฒŒ ์ง€์›ํ•˜๊ณ  ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ข ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฐ ์ง€์›โ€‹

  • ์งˆ๋ฌธ, ์ œ์•ˆ ๋˜๋Š” ๊ธฐ๋Šฅ ์š”์ฒญ์€ GitHub Issue tracker๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Community Discussions์— ์ฐธ์—ฌํ•˜์„ธ์š”.

์„ฑ๊ณต์ ์ธ ํ†ตํ•ฉ์„ ๊ธฐ์›ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŒŸ๐Ÿš€