jaysys/mcp_server_fullstack_with_js_python
If you are the rightful owner of mcp_server_fullstack_with_js_python and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
The MCP Mock Project is designed to practice the Model Context Protocol (MCP) structure using Python (FastAPI) and Node.js (Express) implementations of a multiplication table server, along with a client that integrates with a large language model (LLM).
κ΅¬κ΅¬λ¨ MCP Mock νλ‘μ νΈ
μ΄ νλ‘μ νΈλ MCP ꡬ쑰λ₯Ό μ€μ΅νκΈ° μν μμ λ‘, Python(FastAPI)μ Node.js(Express)λ‘ κ°κ° ꡬνλ κ΅¬κ΅¬λ¨ μλ²μ, LLM(λνμΈμ΄λͺ¨λΈ) μ°λ ν΄λΌμ΄μΈνΈλ₯Ό ν¬ν¨ν©λλ€.
νμ, κ°λ°μ, μ¬μ©μ λͺ¨λκ° μ½κ² λ°λΌν μ μλλ‘ μ 체 ν΄λ ꡬ쑰, μμ€ μ€λͺ , λμ μ리, μ€μ΅ λ°©λ², API μμ, νμ΅ ν¬μΈνΈλ₯Ό μ 리νμ΅λλ€.
λ‘컬μ LM Studioλ₯Ό μ€μΉνμ¬ μ€ννκ³ , llmstudio_client.pyλ₯Ό μ°Έκ³ νμ¬ LLMμ μ§λ¬Έμ 보λ΄λ μ½λλ₯Ό μμ±ν΄λ³΄μΈμ.
1. μ 체 ν΄λ/νμΌ κ΅¬μ‘°
backend/
βββ app/
β βββ mcp_gugudan_server.py # Python κ΅¬κ΅¬λ¨ MCP μλ² (FastAPI)
β βββ client.py # MCP μλ²/LLM μ€λ§νΈ λΌμ°ν
ν΄λΌμ΄μΈνΈ
β βββ lmstudio_client.py # LM Studio(λ‘컬 LLM) μ°λ λͺ¨λ
β βββ __init__.py
βββ js_mcp_gugudan_server/
β βββ server.js # Node.js κ΅¬κ΅¬λ¨ MCP μλ² (Express)
β βββ package.json # Node.js μμ‘΄μ±
β βββ README.md # JS μλ² μ€νλ²
βββ requirements.txt # Python μμ‘΄μ±
βββ .gitignore # λΆνμ νμΌ μ μΈ
βββ .python-version # Python λ²μ μ§μ
βββ README.md # (μ΅μμ) μ 체 νλ‘μ νΈ μ€λͺ
2. μμ€ μ€λͺ λ° μν€ν μ² νλ¦
(1) Python MCP κ΅¬κ΅¬λ¨ μλ²
- mcp_gugudan_server.py
/mcp/gugudan
μλν¬μΈνΈλ‘ 1~9λ¨ κ΅¬κ΅¬λ¨μ κ³μ°ν΄ λ°ν- μ: { "query": "3λ¨ μλ €μ€" } β 3λ¨ κ²°κ³Ό λ°ν
(2) Node.js MCP κ΅¬κ΅¬λ¨ μλ²
- server.js
- Python μλ²μ λμΌνκ² POST
/mcp/gugudan
μ 곡 - Express κΈ°λ°, API μλ΅ νμλ λμΌ
- Python μλ²μ λμΌνκ² POST
(3) μ€λ§νΈ ν΄λΌμ΄μΈνΈ
- client.py
- μ§λ¬Έμ΄ ꡬꡬλ¨μ΄λ©΄ MCP μλ²μ λ¨Όμ μμ², μλλ©΄ LLM(LM Studio)λ‘ μλ fallback
- μ: "9λ¨ μλ €μ€" β MCP μλ², "λνλ―Όκ΅ μΈκ΅¬λ?" β LLM
- lmstudio_client.py
- LM Studio APIμ ν΅μ (λ‘컬 LLM λ΅λ³)
- LM Studioλ PCμμ μ§μ μ€ννλ λ¬΄λ£ LLM μλ²λ‘, OpenAI νΈν REST APIλ₯Ό μ 곡ν©λλ€.
- λ³Έ νλ‘μ νΈλ LM Studioλ₯Ό λ‘컬μμ λμ(
http://localhost:1234/v1/chat/completions
λ±) LLM μλ΅μ λ°λλ‘ μ€κ³λμ΄ μμ΅λλ€.
(4) κΈ°ν
- requirements.txt / package.json : κ° μΈμ΄λ³ μμ‘΄μ±
- .gitignore : Python, Node.js, μλν°, OS μμνμΌ λͺ¨λ ν¬ν¨
μν€ν μ² νλ¦λ
[μ¬μ©μ μ§λ¬Έ]
β
[client.py]
ββ(κ΅¬κ΅¬λ¨ κ΄λ ¨)ββ [MCP μλ²(Python/JS)]
ββ(κΈ°ν μ§λ¬Έ)ββββ [LLM(LM Studio)]
3. λμ λ° μ€μ΅ λ°©λ² (Step by Step)
(A) Python MCP κ΅¬κ΅¬λ¨ μλ² μ€μ΅
- μμ‘΄μ± μ€μΉ
pip install -r requirements.txt
- μλ² μ€ν
python -m app.mcp_gugudan_server # λλ uv run python -m app.mcp_gugudan_server
- ν΄λΌμ΄μΈνΈ μ€ν
python -m app.client
(B) Node.js MCP κ΅¬κ΅¬λ¨ μλ² μ€μ΅
- λλ ν°λ¦¬ μ΄λ λ° μμ‘΄μ± μ€μΉ
cd js_mcp_gugudan_server npm install
- μλ² μ€ν
npm start
(C) API μ§μ ν μ€νΈ
curl -X POST http://localhost:8000/mcp/gugudan -H "Content-Type: application/json" -d '{"query": "3λ¨ μλ €μ€"}'
(D) client.pyλ‘ κΈ°λ₯ ν μ€νΈνκΈ°
1. client.py μ€ν
python -m app.client
# λλ
uv run python -m app.client
2. λμ μμ (μΆλ ₯)
μ§λ¬Έ: 3λ¨ μλ €μ€
[MCP μλ² μλ΅]
3 x 1 = 3
3 x 2 = 6
...
3 x 9 = 27
μ§λ¬Έ: λνλ―Όκ΅μ μΈκ΅¬λ μΌλ§μΌ?
-> μ§λ¬Έλ΄μ©μ΄ μ 곡νλ MCPμλ²μ κ΄λ ¨ μμ. LLMμΌλ‘ λ΅λ³νκ² μ΅λλ€.
[LLM μ§μ μλ΅]
2023λ
12μ 31μΌ κΈ°μ€μΌλ‘, λνλ―Όκ΅μ μΈκ΅¬λ μ½ 51,814,000λͺ
μ
λλ€.
μ§λ¬Έ: 80λ¨ μλ €μ€
-> μ§λ¬Έλ΄μ©μ΄ μ 곡νλ MCPμλ²μ κ΄λ ¨ μμ. LLMμΌλ‘ λ΅λ³νκ² μ΅λλ€.
[LLM μ§μ μλ΅]
80 x 1 = 80
80 x 2 = 160
...
80 x 9 = 720
- MCP μλ²κ° μ²λ¦¬ κ°λ₯ν ꡬꡬλ¨(1~9λ¨) μ§λ¬Έμ μ§μ κ³μ°ν΄μ λ°νν©λλ€.
- κ·Έ μΈμ μ§λ¬Έ(μμ, 80λ¨ λ±)μ LLM(LM Studio)λ‘ μλ fallbackλμ΄ λ΅λ³ν©λλ€.
- client.pyλ₯Ό ν΅ν΄ μ€μ λΌμ°ν /μλ΅ λμμ μ½κ² ν μ€νΈν μ μμ΅λλ€.
4. νμ΅ ν¬μΈνΈ & μ€μ ν
- MCP ꡬ쑰 : μ¬λ¬ μ²λ¦¬ μ»΄ν¬λνΈ(μλ²/LLM)λ₯Ό μν©μ λ°λΌ μ€λ§νΈνκ² λΌμ°ν νλ λ°©λ² μ€μ΅
- API μ€κ³ : Python/Node.js λ μΈμ΄μμ λμΌν REST API μ€κ³ μ€μ΅
- μλ¬ νΈλ€λ§ : μλͺ»λ μμ²(μ: "80λ¨ μλ €μ€")μ gracefulνκ² μλ¬ λ°ν
- νμ₯μ± : κ΅¬κ΅¬λ¨ μ΄μΈμ μν μ°μ°, κΈ°ν AI κΈ°λ₯λ λμΌ κ΅¬μ‘°λ‘ μ½κ² νμ₯ κ°λ₯
- μ€μ μ°λ : curl, ν΄λΌμ΄μΈνΈ μ½λ λ± μ€μ API νμ©λ²κΉμ§ ν¬ν¨
5. μ°Έκ³ /μΆκ° μλ£
.gitignore
λ Python/Node.js/μλν°/OS μμνμΌμ λͺ¨λ ν¬ν¨- LM Studio(Llama3 λ±) API μ°λ μμ λ
app/lmstudio_client.py
μ°Έκ³ - Node.js λ²μ μ
js_mcp_gugudan_server/README.md
μ°Έκ³
[λΆλ‘] LLM(LM Studio) κ΅¬μ± λ° νμ© μλ΄
LM Studioλ?
- LM Studioλ PCμμ μ§μ μ€νν μ μλ λ¬΄λ£ LLM(λνμΈμ΄λͺ¨λΈ) μλ²μ λλ€.
- OpenAI APIμ νΈνλλ REST API(
http://localhost:1234/v1/chat/completions
λ±)λ₯Ό μ 곡ν©λλ€. - GPT-3, Llama3 λ± λ€μν λͺ¨λΈμ λ€μ΄λ‘λνμ¬ λ‘컬μμ νλΌμ΄λΉνκ² μ¬μ©ν μ μμ΅λλ€.
λ³Έ νλ‘μ νΈμμμ νμ©
app/lmstudio_client.py
μμ LM Studio APIλ‘ μ§λ¬Έμ 보λ΄κ³ , LLMμ΄ λ΅λ³μ μμ±ν©λλ€.- ν΄λΌμ΄μΈνΈ(client.py)λ κ΅¬κ΅¬λ¨ λ± MCP μλ²κ° μ²λ¦¬νμ§ λͺ»νλ μ§λ¬Έμ μλμΌλ‘ LM Studioλ‘ λΌμ°ν ν©λλ€.
- LM Studioλ λ°λμ PCμμ μ€ν μ€μ΄μ΄μΌ νλ©°, κΈ°λ³Έ ν¬νΈλ 1234μ λλ€.
LM Studio μ€μ μμ
- LM Studio 곡μ μ¬μ΄νΈμμ λ€μ΄λ‘λ λ° μ€μΉ
- LM Studio μ€ν ν, μνλ λͺ¨λΈ(μ: Llama3) μ ν λ° λ€μ΄λ‘λ
- "OpenAI Compatible API" κΈ°λ₯ νμ±ν (μ€μ μμ ν κΈ)
- μλ²κ° μΌμ§λ©΄
http://localhost:1234/v1/chat/completions
μ£Όμλ‘ API μμ² κ°λ₯
μμ μ½λ (app/lmstudio_client.py)
LMSTUDIO_API_URL = "http://localhost:1234/v1/chat/completions"
# ... μ΄ν μλ΅ ...
μ΄ μλ£λ MCP ꡬ쑰μ μλ²-ν΄λΌμ΄μΈνΈ-LLM μ°λμ μ²μ λ°°μ°λ νμ/κ°λ°μ/μ¬μ©μ λͺ¨λμκ² μ€μ μ μΌλ‘ λμμ΄ λλλ‘ μμ±λμμ΅λλ€. κΆκΈν μ μ΄λ νμ₯ μμ΄λμ΄κ° μμΌλ©΄ μΈμ λ μ§λ¬ΈνμΈμ!