Lang2SQL on Chat service - CausalInferenceLab/Lang2SQL GitHub Wiki
Lang2SQL ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๊ณ ์ฑ๋ฅ ํ๋ก ํฐ์ด ๋ชจ๋ธ์ด๋ ๊ฐ๋น์ผ API๋ฅผ ํ์ฉํ์ง ๋ชปํ๋ ์ ์ด ๋ ์์ฌ์ ์ต๋๋ค. ์ด๋ฌํ ๊ณ ๋ฏผ์ "์ด๋ป๊ฒ ํ๋ฉด ๊ฒฝ์ ์ ์ผ๋ก Lang2SQL์ ์ฌ์ฉํ ์ ์์๊น?"๋ผ๋ ์ง๋ฌธ์ผ๋ก ์ด์ด์ก๊ณ , ๋ณ๋์ API ๋น์ฉ ์์ด ๋ง์ ์ฌ๋์ด ์ฌ์ฉํ๋ ์ฑํ ์๋น์ค์์ ๋์ํ๋ค๋ฉด ์ ๋ ดํ๊ฒ ์๋น์ค๋ฅผ ์ด์ํ ์ ์๊ฒ ๋ค๋ ์์ด๋์ด๋ก ๋ฐ์ ํ์ต๋๋ค.
MCP.-.1080WebShareName.mov
#MCP #Supabase #Agentic #MCP_super_assistant
๊ธฐ์กด Lang2SQL์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ ์ ๋ณด๋ฅผ ๊ฒ์ํ ์ ์๋ RAG(Retrieval Augmented Generation) ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ด ์์์ต๋๋ค. ๋น์ RAG์ Vector DB๋ Faiss๋ก ๊ตฌํ๋์์ง๋ง, ์ด๋ฒ ๊ธฐํ์ Supabase์ PostgreSQL์ ํ์ฉํ์ฌ Vector DB๋ฅผ ๊ตฌ์ถํ๊ณ , RAG๋ฅผ ์ํํ๋ ์ฝ๋๋ฅผ MCP(Model Context Protocol)๋ก ๋ง๋ค์ด ํ์ฉ์ฑ์ ๋์์ต๋๋ค.
ํ์ง๋ง ์์ฝ๊ฒ๋ ํ์ฌ MCP๋ฅผ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ ์๋น์ค๋ Anthropic์ Claude๊ฐ ์ ์ผํ์ฌ ChatGPT, Gemini, Grok ๋ฑ ๋ค๋ฅธ LLM ์ฌ์ฉ์๋ค์ MCP์ ์ด์ ์ ๋๋ฆฌ๊ธฐ ์ด๋ ค์ด ์ํฉ์ ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด MCP SuperAssistant ์๋น์ค๊ฐ ๋ฑ์ฅํ์ต๋๋ค.
MCP SuperAssistant๋ Chrome ํ์ฅ ํ๋ก๊ทธ๋จ์ผ๋ก ์ค์นํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ํ์ฅ ํ๋ก๊ทธ๋จ์ ๊ฐ ์ฑํ ์๋น์ค(์: ChatGPT) ๋ด์์ ํด๋ผ์ด์ธํธ ์ญํ ์ ์ํํ๋ฉฐ, ์๋ฒ์์ ์ฌ์ฉ ๊ฐ๋ฅํ MCP ๋๊ตฌ๋ค์ ํ์ธํ๊ณ ์ฐ๋ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋ ์๋ฆฌ๋ฅผ ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด, ์ฑํ ์๋น์ค ๋ด์์ ์ง์ MCP๊ฐ ๋์ํ๋ ๊ฒ์ด ์๋๋ผ, MCP ํ์ฉ์ ์ํ ํ๋กฌํํธ๋ฅผ ์๋์ผ๋ก ํ ์คํธ ํ์ผ ํํ๋ก ์์ฑํ๊ณ ์ด๋ฅผ ์ฑํ ์ ์ฒจ๋ถํ์ฌ MCP ๋๊ตฌ ํธ์ถ(tool calling)์ ์ ๋ํฉ๋๋ค. ์ดํ ๋๊ตฌ ํธ์ถ์ด ๊ฐ์ง๋๋ฉด ํ์ฅ ํ๋ก๊ทธ๋จ์ด ์ด๋ฅผ ์ธ์งํ๊ณ ์ฌ์ฉ์์๊ฒ ํจ์ ์คํ ๊ถํ์ ์์ฒญํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์น์ธํ๋ฉด ํจ์๊ฐ ์คํ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ญ์ ํ๋กฌํํธ ํํ๋ก ๋ณํ๋์ด ๋ค์ ๋ช ๋ น์ผ๋ก ์ด์ด์ ธ ์ต์ข ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์์ฒญํ ๋ด์ฉ์ด ํด๊ฒฐ๋๋ ๋ฐฉ์์ ๋๋ค.
Supabase๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฑ์๋๋ฅผ ์์ฝ๊ฒ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ์ง์ํ๋ ์คํ์์ค ํ๋ซํผ์ ๋๋ค. ๋ฐฑ์๋์ ํต์ฌ ์์์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์์ผ๋ก Edge function, Authentication ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ๋ณ๋์ ์๋ฒ ๊ตฌ์ถ ์์ด ๊ตฌํํ ์ ์๊ฒ ๋์ต๋๋ค. ์ด๋ฒ ํ๋ก์ ํธ์์๋ Supabase์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉฐ, ํนํ PostgreSQL ๊ธฐ๋ฐ์ด๋ฏ๋ก pgvector ํ์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ RAG๋ฅผ ์ํ Vector DB๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
๊ธฐ์กด Vector DB(Faiss)์์ Documents ์ถ์ถ
๊ธฐ์กด์ langchain
์ผ๋ก ์ ์ฅ๋ Faiss Vector DB๋ฅผ ๋ก๋ํ ๋๋ ์๋ฒ ๋ฉ ํจ์๊ฐ ํ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ค์ ์๋ฒ ๋ฉ์ ์ํํ์ง ์๊ณ Document ๊ฐ์ฒด๋ง ์ถ์ถํ๊ธฐ ์ํด fake_embeddings
ํจ์๋ฅผ ์ ์ํ์ฌ ํ์ฉํฉ๋๋ค. ์ดํ ์ถ์ถ๋ Document ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ์ ์ ์ฅํฉ๋๋ค.
from typing import List
from langchain_community.vectorstores import FAISS
from langchain.schema import Document # Document ํ์
์ ๋ช
์์ ์ผ๋ก import
def fake_embeddings(texts: List[str] = None, embeddings: List[float] = None): # ํ๋ผ๋ฏธํฐ๋ช
๊ณผ ํ์
์ ๋ณด๋ค ๋ช
ํํ ์์
# ์ด ํจ์๋ ์ค์ ์๋ฒ ๋ฉ์ ๋ฐํํ์ง ์๊ณ , FAISS ๋ก๋ ์ ํ์์ ์ผ๋ก๋ง ์ฌ์ฉ๋ฉ๋๋ค.
return None
# <vector_db_path>๋ฅผ ์ค์ Faiss DB๊ฐ ์ ์ฅ๋ ๊ฒฝ๋ก๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
index = FAISS.load_local(
"<vector_db_path>", fake_embeddings, allow_dangerous_deserialization=True
)
docstore_dict = index.docstore._dict
docs = list()
for doc_id, document in docstore_dict.items():
docs.append(document)
์ถ์ถ๋ Document๋ฅผ ์๋ฒ ๋ฉํ์ฌ Supabase์ ์ ๋ก๋
๋จผ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
pip install supabase langchain-openai
์ด์ ์ถ์ถํ docs
๋ฅผ OpenAI ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํด ์๋ฒ ๋ฉํ๊ณ Supabase DB documents
Table์ ์
๋ก๋ํฉ๋๋ค.
Supabase์ documents Table์ ์์ฑํ๋ ๋ด์ฉ์ ์๋ ํ์ฅ๋ฒํผ์ ๋๋ฌ ํ์ธํ์ธ์
Supabase ํ๋ก์ ํธ documents ํ ์ด๋ธ ๋ง๋ค๊ธฐ
documents
๋ผ๋ ์ด๋ฆ์ ๊ฐ๋ Table์ ์ ์ํ๋ SQL์ผ๋ก Supabase dashboard์ SQL editor์์ ์๋ SQL์ ์คํํ๋ฉด Table์ด ์์ฑ๋ฉ๋๋ค. ์๋ SQL์๋ Table ๋ฟ๋ง ์๋๋ผ RAG์์ ์ฌ์ฉํ๊ฒ ๋ retrieve ํจ์๋ ๊ฐ์ด ์ ์ํฉ๋๋ค. ํ์์ ๋ฐ๋ผ retrieve ํจ์๋ฅผ ๋ณ๊ฒฝํ์ฌ hybrid search๋ ๊ฐ๋ฅํฉ๋๋ค.
-- Enable the pgvector extension to work with embedding vectors
create extension if not exists vector;
-- Create a table to store your documents
create table
documents (
id uuid primary key,
content text, -- corresponds to Document.pageContent
metadata jsonb, -- corresponds to Document.metadata
embedding vector (1536) -- 1536 works for OpenAI embeddings, change as needed
);
-- Create a function to search for documents
create function match_documents (
query_embedding vector (1536),
filter jsonb default '{}'
) returns table (
id uuid,
content text,
metadata jsonb,
similarity float
) language plpgsql as $$
#variable_conflict use_column
begin
return query
select
id,
content,
metadata,
1 - (documents.embedding <=> query_embedding) as similarity
from documents
where metadata @> filter
order by documents.embedding <=> query_embedding;
end;
$$;
from supabase import create_client, Client # Client ํ์
์ ๋ช
์์ ์ผ๋ก import
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import SupabaseVectorStore
# Supabase ์ ์ ์ ๋ณด (์ค์ ๊ฐ์ผ๋ก ๋์ฒด ํ์)
supabase_url = "<insert_your_supabase_url>"
supabase_key = "<insert_your_supabase_key>"
supabase: Client = create_client(supabase_url, supabase_key)
# OpenAI API ํค (์ค์ ๊ฐ์ผ๋ก ๋์ฒด ํ์)
openai_api_key = "<insert_your_openai_api_key>"
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small", openai_api_key=openai_api_key
)
# Document์ ์๋ฒ ๋ฉ ๊ฐ์ Supabase์ ์
๋ก๋
vectorstore = SupabaseVectorStore.from_documents(
docs,
embeddings,
client=supabase,
table_name="documents", # Supabase์ ์์ฑ๋ ํ
์ด๋ธ๋ช
)
์ ์ ์ฐจ๋ฅผ ๋ง์น๋ฉด Supabase์ Table Editor์์ ์ ๋ก๋๋ ๋ฐ์ดํฐ์ ๋ฒกํฐ๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋ก๋๋ Vector DB๋ฅผ ํ์ฉํ์ฌ RAG์ ๊ฒ์(retrieve) ๊ธฐ๋ฅ์ ์ ์ํ๊ณ , LLM์ด ์ด ํจ์๋ฅผ ๋๊ตฌ๋ก ์ธ์ํ๊ณ ํธ์ถํ ์ ์๋๋ก docstring์ ์์ธํ ์์ฑํฉ๋๋ค. ์ดํ, ์ ์๋ ๋๊ตฌ๋ฅผ ํ์ฑํํ๋ MCP ์๋ฒ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ฉด MCP๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋๋ฉ๋๋ค.
MCP ์๋ฒ ํ๊ฒฝ ์ค์ ์ uv
๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ์์
๊ณต๊ฐ์์ uv init
์ ์คํํ์ฌ ์ด๊ธฐํํ ํ, ๋ค์ ๋ช
๋ น์ด๋ก ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค. uv add "mcp[cli]"
์ด์ธ์ MCP ์ค์น๊ฐ ํ์ํ๋ค๋ฉด uv add langchain
๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ก ์ค์นํ๋ฉด ๊ฐ๋ฅํฉ๋๋ค.
mcp_server.py
from mcp.server.fastmcp import FastMCP
from dotenv import load_dotenv
from supabase import create_client, Client
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import SupabaseVectorStore
import os
from langchain.schema import Document
# .env ํ์ผ์์ ํ๊ฒฝ ๋ณ์ ๋ก๋ (OPENAI_API_KEY, SUPABASE_URL, SUPABASE_KEY ๋ฑ)
load_dotenv()
# MCP ์๋ฒ ์ด๋ฆ (์์ ๋กญ๊ฒ ์ ์ ๊ฐ๋ฅ)
mcp = FastMCP("lang2SQL_MCP")
def docs_to_str(docs: list[Document]) -> str:
"""
๊ฒ์๋ Document ๋ฆฌ์คํธ๋ฅผ ๋จ์ผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค.
"""
return "\n".join([doc.page_content for doc in docs])
@mcp.tool()
async def retrieve_table(question: str) -> str:
"""
RAG ์์คํ
์ ์ผ๋ถ๋ก, SQL ์ฟผ๋ฆฌ ์์ฑ์ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ
์ด๋ธ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
Args:
question: ํ
์ด๋ธ ์ ๋ณด๋ฅผ ๊ฒ์ํ๊ธฐ ์ํ ์ฌ์ฉ์ ์ง๋ฌธ์
๋๋ค.
Returns:
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฒ์๋ ํ
์ด๋ธ ์ ๋ณด ๋ฌธ์์ด์
๋๋ค.
"""
supabase_url: str = os.getenv("SUPABASE_URL")
supabase_key: str = os.getenv("SUPABASE_KEY")
supabase: Client = create_client(supabase_url, supabase_key)
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small",
openai_api_key=os.getenv("OPENAI_API_KEY"), # ํ๊ฒฝ ๋ณ์๋ช
์ผ๊ด์ฑ ์๊ฒ ์์ (OPEN_AI_LLM_KEY -> OPENAI_API_KEY)
)
vector_db = SupabaseVectorStore(
client=supabase, # ํ๋ผ๋ฏธํฐ ์์ ๋ณ๊ฒฝ (client๊ฐ ๋จผ์ )
embedding=embeddings, # ํ๋ผ๋ฏธํฐ๋ช
๋ณ๊ฒฝ (embeddings -> embedding)
table_name="documents",
query_name="match_documents", # Supabase์์ ์ฌ์ฉํ ํจ์๋ช
(pgvector ์ค์น ์ ์๋ ์์ฑ๋๋ ํจ์ ํ์ฉ ๊ฐ๋ฅ)
)
retriever = vector_db.as_retriever()
retrieved_docs = retriever.get_relevant_documents(question) # ๋ณ์๋ช
๋ณ๊ฒฝ (docs -> retrieved_docs)
return docs_to_str(retrieved_docs)
def run_server(transport: str = "stdio"):
"""MCP ์๋ฒ๋ฅผ ์คํํฉ๋๋ค.
Args:
transport: ํต์ ๋ฐฉ์ ("stdio" ๋๋ "sse")
"""
mcp.run(transport=transport)
if __name__ == "__main__":
# ์ผ๋ฐ์ ์ผ๋ก ์น ๊ธฐ๋ฐ ์ํธ์์ฉ์ ์ํด "sse" (Server-Sent Events)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
run_server(transport="sse")
MCP SuperAssistant๋ฅผ ํ์ฉํ๋ ค๋ฉด Chrome ํ์ฅ ํ๋ก๊ทธ๋จ ์ค์น์ ์ฌ์ฉํ๋ ค๋ MCP์ ํ๊ฒฝ ์ค์ (config) ์ ์๊ฐ ํ์ํฉ๋๋ค. ์ค์ ์ด ์๋ฃ๋๋ฉด npx
๋ช
๋ น์ด๋ก ํด๋ผ์ด์ธํธ๋ฅผ ์คํํฉ๋๋ค.
MCP SuperAssistant Chrome Extension ์ค์น ๋งํฌ๋ฅผ ํตํด Chrome์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ถ๊ฐํฉ๋๋ค.
MCP Config๋ JSON ํํ๋ก ์ ์ฅํด์ผ ํ๋ฉฐ, ์ด๋ฒ ๊ธ์์ ์ ์ํ RAG MCP ์ธ์๋ ์ธ๋ถ MCP๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. lang2SQL_MCP
์ ์๋ฅผ ์ํด์๋ MCP ์๋ฒ ์คํฌ๋ฆฝํธ(mcp_server.py
)๊ฐ ์์นํ ๊ฒฝ๋ก(<insert_your_mcp_path>
)๋ฅผ ์ ํํ ๋ช
์ํด์ผ ํฉ๋๋ค.
rag_mcp_config.json
{
"mcpServers": {
"sequential-thinking": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sequential-thinking"
]
},
"lang2SQL_MCP": {
"command": "uv",
"args": [
"--directory",
"<insert_your_mcp_path>",
"run",
"mcp_server.py"
]
}
}
}
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ MCP ํด๋ผ์ด์ธํธ๋ฅผ ์คํํฉ๋๋ค.
npx @srbhptl39/mcp-superassistant-proxy@latest --config ./rag_mcp_config.json
Chrome ํ์ฅ ํ๋ก๊ทธ๋จ ์ค์น ํ Gemini ํํ์ด์ง ๋ฑ์ ์ ์ํ๋ฉด, ์ฑํ ์ ๋ ฅ์ฐฝ ๊ทผ์ฒ์ MCP ๋ฒํผ์ด ์๋กญ๊ฒ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
MCP ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ์ ์ฐฝ์ด ๋ํ๋๋ฉฐ, MCP ๋๊ตฌ ํธ์ถ์ ์ํ ํ๋กฌํํธ๊ฐ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
MCP๋ฅผ ํ์ฉํ๊ธฐ ์ํด "Attach" ๋ฒํผ์ ํด๋ฆญํ๋ฉด, "Instructions" ์๋์ ๋ณด์ด๋ ํ๋กฌํํธ๊ฐ ํ์ฌ ์ฌ์ฉ ์ค์ธ ์ฑํ ์๋น์ค์ ์ ๋ ฅ์ฐฝ์ ์๋์ผ๋ก ์ฒจ๋ถ๋ฉ๋๋ค.
์ด์ ๋ชจ๋ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค. ์ฒจ๋ถ๋ ํ๋กฌํํธ์ ํจ๊ป ์ง๋ฌธ์ ์ ๋ ฅํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ์ ์ํ MCP ๋๊ตฌ(retrieve_table)๊ฐ ํธ์ถ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ํธ์ถ๋ ๋๊ตฌ ์์ "Run" ๋ฒํผ์ ๋๋ฅด๋ฉด ํจ์๊ฐ ์คํ๋๊ณ , ์คํ์ด ์๋ฃ๋๋ฉด ๋ฒํผ์ด "Insert"์ "Attach File" ๋ฒํผ์ด ๋ํ๋ฉ๋๋ค. "Insert" ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ช ๋ น์ด(LLM์๊ฒ ์ ๋ฌ๋๋ ํ๋กฌํํธ)์ ํฌํจํ์ฌ ํ์ฉํ ์ ์์ต๋๋ค.
์์ ๊ฐ์ด ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ ๋ช ๋ น์ ์คํํ๋ฉด, ์๋์ฒ๋ผ ํ์ฌ ์ฌ์ฉ ์ค์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ๋ง๋ SQL ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ณผ๊ฑฐ์๋ Anthropic์ Claude๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ์ง ์์ Cursor ์ธ์๋ MCP๋ฅผ ํ์ฉํ ๊ธฐํ๊ฐ ๋ง์ง ์์ ์์ฌ์์ด ์ปธ์ต๋๋ค. ํ์ง๋ง MCP SuperAssistant ๋๋ถ์ ๋ค์ํ ํ๊ฒฝ์์ MCP๋ฅผ ๊ฒฝํํด๋ณผ ์ ์์์ต๋๋ค. Cursor์์์ MCP ๊ฒฝํ๋ ํ๋ฅญํ์ง๋ง, Cursor๋ '์ฝ๋ฉ'์ด๋ผ๋ ํน์ ์์ ์ ์ด์ ์ ๋ง์ถ ์๋น์ค์ด๊ธฐ์ MCP ๊ธฐ์ ์ ๋ค์ํ ํ์ฉ ๊ฐ๋ฅ์ฑ์ ์ง์ ์ ์ผ๋ก ์ฒด๊ฐํ๊ธฐ์๋ ํ๊ณ๊ฐ ์์์ต๋๋ค. ์ด๋ฒ ๊ธ์ ํตํด MCP๊ฐ ์ฝ๋ฉ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ๋ถ์ผ์ ์๋น์ค์์ ์ ์ฉํ๊ฒ ํ์ฉ๋ ์ ์๋ค๋ ์ ์ฌ๋ ฅ์ ํ์ธํ๊ฒ ๋์ด ๋งค์ฐ ์๋ฏธ ์๋ ๊ฒฝํ์ด์์ต๋๋ค. ์์ผ๋ก MCP ์ํ๊ณ๊ฐ ๋์ฑ ํ์ฅ๋์ด ๋ ๋ง์ ์ฌ์ฉ์๊ฐ ๊ทธ ์ด์ ์ ๋๋ฆด ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.