็ฌฌไธ็ซ ๏ผๆ ไบๅผๅง โโ ไธๅฎถ"ๆฒกๆ่ๅ"็้คๅ
ๆณ่ฑกไฝ ๅผไบไธๅฎถ้คๅ ๏ผ่ฏทไบไธไธช่ถ ็บง่ชๆไฝไปไน้ฝไธ่ฎฐๅพ็ๅจๅธ๏ผ่ฟๅฐฑๆฏ AI ๆจกๅ๏ผใ
ๅจๅธ๏ผโไฝ ่ฆๆๅไปไน่๏ผโ
ไฝ ๏ผโๅไธช็บข็ง่ใโ
ๅจๅธ๏ผโ็บข็ง่ๆฏไปไน๏ผ็จไปไนๆๆ๏ผๆไนๅ๏ผๆๅ จไธ็ฅ้ใโ
ๅจๅธๅพ่ชๆ๏ผๅญฆไปไน้ฝๅฟซ๏ผไฝไปๅฎๅ จไธไบ่งฃๅค้ข็ไธ็ย โโ ไธ็ฅ้ไฝ ็ๅฐ็ฎฑ้ๆไปไนใไธ็ฅ้ๆไนๆฅ่่ฐฑใไธ็ฅ้ๆไนๅผ็ซใ
ไปฅๅ๏ผๆฏไธช้คๅ ่ๆฟ้ฝๅๆ่ชๅทฑ็ๆนๆณๆฅ่ทๅจๅธๆฒ้๏ผ
- ๅผ ๅฎถ็จ็บธๆกไผ ้
- ๆๅฎถ็จๅฏน่ฎฒๆบๅ่ฏ
- ็ๅฎถ่ชๅทฑ้ ไบไธๅฅๆ่ฏญ
็ปๆๅฐฑๆฏ๏ผๆฏไธชๅจๅธ็"ๅคๆ"้ฝไธ้็จ๏ผๆขไธช้คๅ ๅฐฑๅพ้ๆฐๅญฆไธๅฅใ
็ดๅฐๆไธๅคฉ๏ผๆดไธช้ค้ฅฎ็็ปไธไบไธไธชๅ่ฎฎ โโย MCP๏ผModel Context Protocol๏ผๆจกๅไธไธๆๅ่ฎฎ๏ผ ใ
็ฌฌไบ็ซ ๏ผๆ ธๅฟๆถๆ โโ ๅไธช่ง่ฒๅๅธๅ ถ่
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ไฝ ็็ต่/ๆๆบ โ
โ โ
โ โโโโโโโโโโโโโโโโ โ
โ โ Host ๅฎฟไธป โ โ ๆฏๅฆ Claude DesktopใVS Code ๆไปถ โ
โ โ (้คๅ
ๅคงๅ ) โ โ
โ โโโโโโโโฌโโโโโโโโ โ
โ โ 1ๅฏน1 ๅๅปบ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Client ๅฎขๆท็ซฏ โโโโโโถโ Server ๆๅก็ซฏ โ โ ๅคฉๆฐๅๅจ โ
โ โ (ๆๅกๅA) โโโโโโโ (ไธญ้คๅๅจ) โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Client ๅฎขๆท็ซฏ โโโโโโถโ Server ๆๅก็ซฏ โ โ ๆไปถๅๅจ โ
โ โ (ๆๅกๅB) โโโโโโโ (่ฅฟ้คๅๅจ) โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Client ๅฎขๆท็ซฏ โโโโโโถโ Server ๆๅก็ซฏ โ โ ๆฐๆฎๅบๅๅจ โ
โ โ (ๆๅกๅC) โโโโโโโ (็็นๅๅจ) โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐จ ็จ้คๅ ๆฏ่ฏญ็่งฃ
| MCP ๆฆๅฟต | ้คๅ ๆฏๅป | ็ๅฎ่ง่ฒ | ไธพไพ |
|---|---|---|---|
| Host | ้คๅ ๅคงๅ | ่ฟ่ก AI ็ไธป็จๅบ | Claude DesktopใCursor |
| Client | ๆๅกๅ | ๅ่ฎฎ็ฟป่ฏๅฎ๏ผHost ่ชๅจๅๅปบ๏ผ | ๆฏไธช Server ๅฏนๅบไธไธช Client |
| Server | ๅๅจ | ๆไพ่ฝๅ็็จๅบ | ๅคฉๆฐๆๅกใๆไปถ็ณป็ปใๆฐๆฎๅบ |
| Tool | ๅจๅธๆ่ฝ | ๆจกๅๅฏ่ฐ็จ็ๅฝๆฐ | get_weather()ใread_file() |
| Resource | ้ฃๆๅบ | ๆๅกๅจๆด้ฒ็ๆฐๆฎ | ๅคฉๆฐๆฐๆฎใๆไปถๅ ๅฎนใๆฐๆฎๅบ่ฎฐๅฝ |
| Prompt | ๅฅ้ค่ๅ | ้ขๅฎไน็ๆ็คบๆจกๆฟ | โๅๆๅคฉๆฐๅนถ็ปๅปบ่ฎฎโ |
ๅ ณ้ฎ่งๅ๏ผ
- ไธไธช Host ๅฏไปฅๆๅคไธชย Client
- ไธไธช Client ๅช่ฟๆฅไธไธชย Server๏ผไธๅฏนไธ๏ผ
- Host ่ด่ดฃ็ฎก็ๆๆ Client ็็ๅฝๅจๆ๏ผๅฏๅจใๅ ณ้ญ๏ผ
- Client ๅ Server ไน้ด็จย JSON-RPC 2.0ย ้ไฟก๏ผๅฐฑๅๆๅกๅ็จๆ ๅๆ ผๅผๅ็น่ๅ๏ผ
็ฌฌไธ็ซ ๏ผไธๅคง่ฝๅ โโ ๅๅจ่ฝๅไปไน๏ผ
๐ง Tool๏ผๅทฅๅ ท๏ผโโ ๅจๅธ็"ๅจๆ่ฝๅ"
ๅทฅๅ ทๅฐฑๆฏๆจกๅๅฏไปฅไธปๅจ่ฐ็จ็ๅฝๆฐใๅฐฑๅๅจๅธ่ฏด๏ผโๆ่ฆ็่๏ผๅธฎๆๅผ็ซ๏ผโ
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("kitchen-server")
@mcp.tool()
def stir_fry(ingredient: str, duration: int) -> str:
"""
็่ๅทฅๅ
ท
Args:
ingredient: ้ฃๆๅ็งฐ
duration: ็ๅถๆถ้ด๏ผๅ้๏ผ
Returns:
็่็ปๆๆ่ฟฐ
"""
return f"็จๅคง็ซ็ฟป็{ingredient}๏ผ{duration}ๅ้ๅๅบ้
๏ผ้ฆๆฐๅๆบข๏ผ"
@mcp.tool()
def check_fridge(item: str) -> str:
"""ๆฃๆฅๅฐ็ฎฑ้ๆๆฒกๆๆไธช้ฃๆ"""
fridge = ["้ธก่", "่ฅฟ็บขๆฟ", "็่", "่ฑๅง่"]
if item in fridge:
return f"ๅฐ็ฎฑ้ๆ{item}๏ผๆฐ้ฒๅบฆ่ฏๅฅฝ โ"
return f"ๅฐ็ฎฑ้ๆฒกๆ{item} โ"
ๆจกๅ็ๆ่่ฟ็จ๏ผ
็จๆท: "ๅธฎๆๅไธช่ฅฟ็บขๆฟ็่"
ๆจกๅๅ
ๅฟ: ๆ้่ฆ๏ผ
1. ๅ
check_fridge("่ฅฟ็บขๆฟ") โ "ๅฐ็ฎฑ้ๆ่ฅฟ็บขๆฟ โ"
2. ๅ check_fridge("้ธก่") โ "ๅฐ็ฎฑ้ๆ้ธก่ โ"
3. ็ถๅ stir_fry("่ฅฟ็บขๆฟ้ธก่", 5) โ "็จๅคง็ซ็ฟป็..."
4. ็ปผๅไปฅไธ็ปๆๅๅค็จๆท
๐ฆ Resource๏ผ่ตๆบ๏ผโโ ้ฃๆๅบ
่ตๆบๆฏๆๅกๅจๆด้ฒ็้ๆๆๅจๆๆฐๆฎใๆจกๅไธ่ฝไฟฎๆน๏ผๅช่ฝ่ฏปๅใ
@mcp.resource("menu://today") # URI ๆ ผๅผ็่ตๆบๆ ่ฏ
def get_today_menu() -> str:
"""่ทๅไปๆฅ่ๅ"""
return """
ไปๆฅ็น่ฒ่๏ผ
1. ็บข็ง่ - ยฅ68
2. ๆธ
่ธ้ฒ้ฑผ - ยฅ88
3. ๅฎซไฟ้ธกไธ - ยฅ48
"""
@mcp.resource("recipe://{dish_name}") # ๅธฆๅๆฐ็่ตๆบ
def get_recipe(dish_name: str) -> str:
"""่ทๅ่่ฐฑ"""
recipes = {
"็บข็ง่": "ไบ่ฑ่500gใๅฐ็ณ30gใ้
ฑๆฒน2ๅบใๆ้
1ๅบ...",
"ๅฎซไฟ้ธกไธ": "้ธก่ธ่300gใ่ฑ็็ฑณ50gใๅนฒ่พฃๆค10ไธช..."
}
return recipes.get(dish_name, "ๆๆ ๆญค่่ฐฑ")
Tool ๅ Resource ็ๅบๅซ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Tool๏ผๅทฅๅ
ท๏ผ Resource๏ผ่ตๆบ๏ผ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ๐ฏ ๆจกๅไธปๅจ่ฐ็จ ๐ ๆจกๅๆ้่ฏปๅ โ
โ โก ๆๅฏไฝ็จ๏ผๆนๅ็ถๆ๏ผ ๐ ๅช่ฏป๏ผๆ ๅฏไฝ็จ๏ผ โ
โ ๐ง ๆง่กๆไฝ ๐ฆ ๆไพๆฐๆฎ โ
โ ๐ ้่ฆ Host ๆนๅ ๐ ็ดๆฅๆด้ฒ็ปๆจกๅ โ
โ ๐ฐ ็่ใไธๅใๅ้ฎไปถ ๐ฐ ่ๅใ่่ฐฑใๅบๅญๆธ
ๅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ Prompt๏ผๆ็คบๆจกๆฟ๏ผโโ ๅบๅฎๅฅ้ค
Prompt ๆฏๆๅกๅจ้ขๅฎไน็ๆ็คบ่ฏๆจกๆฟ๏ผๅฏไปฅๅธฆๅๆฐใ
@mcp.prompt()
def daily_recommendation(preference: str) -> str:
"""ๆฏๆฅๆจ่ๆ็คบๆจกๆฟ"""
return f"""
ไฝ ๆฏไธไฝ็ฑณๅ
ถๆไธๆไธปๅจใๆ นๆฎ้กพๅฎขๅๅฅฝ"{preference}"๏ผ
ไปไปๆฅ่ๅไธญๆจ่3้่๏ผๅนถ่ฏดๆๆจ่็็ฑใ
่ฏท็จๆธฉๆไผ้
็่ฏญๆฐๅ็ญ๏ผๆฏ้่้
ไธๅฅ่ฏๆ็ๆ่ฟฐใ
"""
็ฌฌๅ็ซ ๏ผ้ไฟกๆบๅถ โโ ๆๅกๅๆไนๅ็น่ๅ๏ผ
MCP ๅบๅฑไฝฟ็จย JSON-RPC 2.0๏ผ่ฟๆฏไธ็ง้ๅธธ็ฎๆด็ๆถๆฏๆ ผๅผใ
ๆถๆฏๆไธ็ง็ฑปๅ
// 1๏ธโฃ ่ฏทๆฑ โโ ๆๅกๅๅๅๅจไธๅ
{
"jsonrpc": "2.0",
"id": 1, // ่ฏทๆฑ็ผๅท๏ผ็จไบๅน้
ๅๅบ
"method": "tools/call", // ่ฆ่ฐ็จ็ๆนๆณ
"params": { // ๅๆฐ
"name": "stir_fry",
"arguments": {
"ingredient": "่ฅฟ็บขๆฟ้ธก่",
"duration": 5
}
}
}
// 2๏ธโฃ ๅๅบ โโ ๅๅจๅ่ฏๆๅกๅ็ปๆ
{
"jsonrpc": "2.0",
"id": 1, // ๅฏนๅบ่ฏทๆฑ็็ผๅท
"result": {
"content": [{
"type": "text",
"text": "็จๅคง็ซ็ฟป็่ฅฟ็บขๆฟ้ธก่๏ผ5ๅ้ๅๅบ้
๏ผ้ฆๆฐๅๆบข๏ผ"
}]
}
}
// 3๏ธโฃ ้็ฅ โโ ๅๅจไธปๅจๅนฟๆญ๏ผไธ้่ฆๅๅบ๏ผ
{
"jsonrpc": "2.0",
"method": "notifications/resources/updated", // ่ตๆบๆดๆฐไบ
"params": {
"uri": "menu://today"
}
}
ไผ ่พๆนๅผ๏ผๆๅกๅๆไนไผ ๅๅญ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ ๐ก stdio๏ผๆ ๅ่พๅ
ฅ่พๅบ๏ผ โ
โ โโโโโโโโโโโโ stdin/stdout โโโโโโโโโโโโ โ
โ โ Host โโโโโโโโโโโโโโโโโโโโบโ Server โ โ
โ โโโโโโโโโโโโ ๏ผๅไธๅฐ็ต่๏ผ โโโโโโโโโโโโ โ
โ ๅบๆฏ๏ผClaude Desktop ่ฐ็จๆฌๅฐ MCP Server โ
โ ็น็น๏ผๆ็ฎๅใๆๅฟซใๆๅธธ็จ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ๐ Streamable HTTP๏ผๅฏๆตๅผHTTP๏ผ โ
โ โโโโโโโโโโโโ HTTP ่ฏทๆฑ/ๅๅบ โโโโโโโโโโโโ โ
โ โ Host โโโโโโโโโโโโโโโโโโโโโโบโ Server โ โ
โ โโโโโโโโโโโโ ๏ผๅฏไปฅ่ทจ็ฝ็ป๏ผ โโโโโโโโโโโโ โ
โ ๅบๆฏ๏ผ่ฟ็จ MCP Serverใไบๆๅก โ
โ ็น็น๏ผๆฏๆ่ฟ็จใๆฏๆๆตๅผใๆฏๆๆ ็ถๆ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
็ฌฌไบ็ซ ๏ผๅฎๆดๆถๅบๅพ โโ ไป็จๆท่ฏด่ฏๅฐๅพๅฐ็ปๆ
ไธ้ขๆฏไธไธชๅฎๆด็ MCP ่ฐ็จๆถๅบ๏ผ็จๆท่ฏดย โๅธฎๆๆฅไธไธๅไบฌๅคฉๆฐ๏ผ็ถๅ็ปๆๅบ่กๅปบ่ฎฎโ ๏ผ
็ฌฌๅ ญ็ซ ๏ผๅจๆๅไธไธชๅฎๆด็ MCP Server
ๆไปฌๆฅๅไธไธชๅๅกๅบ MCP Server๏ผๅ ๅซๅ จ้จไธๅคง่ฝๅ๏ผ
้กน็ฎ็ปๆ
coffee-mcp-server/
โโโ pyproject.toml # ้กน็ฎ้
็ฝฎ
โโโ server.py # ๆๅก็ซฏไปฃ็
pyproject.toml
[project]
name = "coffee-mcp-server"
version = "0.1.0"
description = "ไธไธชๅๅกๅบ MCP Server ็คบไพ"
requires-python = ">=3.10"
dependencies = [
"mcp[cli]>=1.0.0",
]
[project.scripts]
coffee-server = "server:main"
server.py๏ผๅฎๆดไปฃ็ ๏ผ
"""
โ ๅๅกๅบ MCP Server
ๅ
ๅซ๏ผTools๏ผๅทฅๅ
ท๏ผใResources๏ผ่ตๆบ๏ผใPrompts๏ผๆ็คบๆจกๆฟ๏ผ
"""
from mcp.server.fastmcp import FastMCP
from datetime import datetime
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐๏ธ ๅๅปบ Server ๅฎไพ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
mcp = FastMCP(
name="coffee-shop",
version="0.1.0",
instructions="ไฝ ๆฏไธๅฎถ็ฒพๅๅๅกๅบ็ๆบ่ฝๅฉๆ๏ผๅฏไปฅๅธฎ้กพๅฎข็นๅใๆฅ่ๅใๆจ่้ฅฎๅใ"
)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐ฆ ๆจกๆๆฐๆฎ๏ผๅฎ้
้กน็ฎไธญไผ่ฟๆฅๆฐๆฎๅบ๏ผ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
MENU = {
"็พๅผๅๅก": {"price": 18, "stock": 50, "category": "็ปๅ
ธ"},
"ๆฟ้": {"price": 24, "stock": 30, "category": "็ปๅ
ธ"},
"ๅกๅธๅฅ่ฏบ": {"price": 26, "stock": 25, "category": "็ปๅ
ธ"},
"ๆฉๅก": {"price": 28, "stock": 20, "category": "้ฃๅณ"},
"็ฆ็ณ็ๅฅๆต": {"price": 32, "stock": 15, "category": "้ฃๅณ"},
"ๆน่ถๆฟ้": {"price": 28, "stock": 18, "category": "็น่ฐ"},
"ๅฐๅๅ
": {"price": 35, "stock": 10, "category": "็น่ฐ"},
}
ORDERS = [] # ๅญๅจๆๆ่ฎขๅ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐ง TOOLS โโ ๅจๅธ็"ๅจๆ่ฝๅ"
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
@mcp.tool()
def order_drink(drink_name: str, size: str = "ไธญๆฏ", quantity: int = 1) -> str:
"""
ไธๅ่ดญไนฐ้ฅฎๅ
Args:
drink_name: ้ฅฎๅๅ็งฐ๏ผๅฆ"ๆฟ้"ใ"็พๅผๅๅก"
size: ๆฏๅ๏ผๅฏ้"ๅฐๆฏ"ใ"ไธญๆฏ"ใ"ๅคงๆฏ"
quantity: ่ดญไนฐๆฐ้
Returns:
ไธๅ็ปๆ๏ผๅ
ๅซ่ฎขๅๅทๅๆปไปท
"""
# 1. ๆฃๆฅ้ฅฎๅๆฏๅฆๅญๅจ
if drink_name not in MENU:
available = "ใ".join(MENU.keys())
return f"โ ๆฑๆญ๏ผๆไปฌๆฒกๆ{drink_name}ใ\n๐ ๅฏ้้ฅฎๅ๏ผ{available}"
# 2. ๆฃๆฅๅบๅญ
item = MENU[drink_name]
if item["stock"] < quantity:
return f"โ {drink_name}ๅบๅญไธ่ถณ๏ผๅฉไฝ{item['stock']}ๆฏใ"
# 3. ่ฎก็ฎไปทๆ ผ๏ผๅคงๆฏ+4ๅ
๏ผๅฐๆฏ-3ๅ
๏ผ
size_extra = {"ๅฐๆฏ": -3, "ไธญๆฏ": 0, "ๅคงๆฏ": 4}
unit_price = item["price"] + size_extra.get(size, 0)
total = unit_price * quantity
# 4. ๆฃๅๅบๅญ
item["stock"] -= quantity
# 5. ๅๅปบ่ฎขๅ
order = {
"id": f"COF-{len(ORDERS) + 1:04d}",
"drink": drink_name,
"size": size,
"quantity": quantity,
"unit_price": unit_price,
"total": total,
"time": datetime.now().strftime("%H:%M:%S"),
}
ORDERS.append(order)
# 6. ่ฟๅ็ปๆ
return (
f"โ
ไธๅๆๅ๏ผ\n"
f"๐ฆ ่ฎขๅๅท๏ผ{order['id']}\n"
f"โ {size}{drink_name} x {quantity}\n"
f"๐ฐ ๅไปท๏ผยฅ{unit_price} ๆป่ฎก๏ผยฅ{total}\n"
f"โฐ ๆถ้ด๏ผ{order['time']}\n"
f"๐ฆ {drink_name}ๅฉไฝๅบๅญ๏ผ{item['stock']}ๆฏ"
)
@mcp.tool()
def check_stock(drink_name: str = "") -> str:
"""
ๆฅ่ฏข้ฅฎๅๅบๅญ
Args:
drink_name: ๅฏ้๏ผๆๅฎ้ฅฎๅๅ็งฐใไธบ็ฉบๅๆฅ่ฏขๆๆใ
Returns:
ๅบๅญไฟกๆฏ
"""
if drink_name:
if drink_name not in MENU:
return f"โ ๆฒกๆ่ฟๆฌพ้ฅฎๅ๏ผ{drink_name}"
item = MENU[drink_name]
status = "๐ข ๅ
่ถณ" if item["stock"] > 20 else "๐ก ๅๅฐ" if item["stock"] > 5 else "๐ด ็ดงๅผ "
return f"โ {drink_name}๏ผๅบๅญ {item['stock']}ๆฏ {status}"
# ๆฅ่ฏขๆๆ
lines = ["๐ ๅ
จ้จ้ฅฎๅๅบๅญ๏ผ\n"]
for name, info in MENU.items():
status = "๐ข" if info["stock"] > 20 else "๐ก" if info["stock"] > 5 else "๐ด"
lines.append(f" {status} {name}๏ผ{info['stock']}ๆฏ (ยฅ{info['price']})")
return "\n".join(lines)
@mcp.tool()
def get_daily_sales() -> str:
"""
่ทๅไปๆฅ้ๅฎ็ป่ฎก
"""
if not ORDERS:
return "๐ ไปๆฅๆๆ ่ฎขๅๆฐๆฎใ"
total_orders = len(ORDERS)
total_revenue = sum(o["total"] for o in ORDERS)
total_cups = sum(o["quantity"] for o in ORDERS)
# ๆ็
้
from collections import Counter
best_seller = Counter(o["drink"] for o in ORDERS).most_common(1)[0]
return (
f"๐ ไปๆฅ้ๅฎ็ป่ฎก\n"
f"{'โ' * 25}\n"
f"๐งพ ่ฎขๅๆฐ๏ผ{total_orders} ๅ\n"
f"โ ๆปๆฏๆฐ๏ผ{total_cups} ๆฏ\n"
f"๐ฐ ๆป่ฅๆถ๏ผยฅ{total_revenue}\n"
f"๐ ็
้ๆฌพ๏ผ{best_seller[0]} ({best_seller[1]}ๆฏ)\n"
f"{'โ' * 25}"
)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐ฆ RESOURCES โโ ้ฃๆๅบ๏ผๅช่ฏปๆฐๆฎ๏ผ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
@mcp.resource("coffee://menu")
def get_full_menu() -> str:
"""
ๅฎๆด่ๅ๏ผ่ตๆบ๏ผ
URI: coffee://menu
"""
lines = ["โ ็ฒพๅๅๅกๅบ ยท ๅฎๆด่ๅ\n" + "โ" * 35]
# ๆๅ็ฑปๅ็ป
categories = {}
for name, info in MENU.items():
cat = info["category"]
if cat not in categories:
categories[cat] = []
categories[cat].append((name, info))
for cat, items in categories.items():
lines.append(f"\nใ{cat}ใ")
for name, info in items:
lines.append(f" {name} ยฅ{info['price']} ๅบๅญ:{info['stock']}ๆฏ")
lines.append(f"\n{'โ' * 35}")
lines.append(f"ๅ
ฑ {len(MENU)} ๆฌพ้ฅฎๅ")
return "\n".join(lines)
@mcp.resource("coffee://drink/{drink_name}")
def get_drink_detail(drink_name: str) -> str:
"""
ๅไธช้ฅฎๅ่ฏฆๆ
๏ผๅธฆๅๆฐ็่ตๆบ๏ผ
URI: coffee://drink/ๆฟ้
"""
if drink_name not in MENU:
return f"ๆชๆพๅฐ้ฅฎๅ๏ผ{drink_name}"
info = MENU[drink_name]
# ๆจกๆ่ฏฆ็ปๆ่ฟฐ
descriptions = {
"็พๅผๅๅก": "ๆต็ผฉๅๅกๅ ็ญๆฐด๏ผๅฃๆ้ๅ๏ผ่ฆๅณๆๆพ๏ผ้ๅๅๆฌข็บฏ็ฒนๅๅกๅณ็ไบบใ",
"ๆฟ้": "ๆต็ผฉๅๅกๅ ๅคง้่ธๆฑฝ็ๅฅถ๏ผๅฅถ้ฆๆต้๏ผๅฃๆๆๅ๏ผๅ
ฅ้จ้ฆ้ใ",
"ๅกๅธๅฅ่ฏบ": "ๆต็ผฉๅๅกๅ ็ญ้ๅฅถๆณกๅ็ๅฅถ๏ผๅฑๆฌกๅๆ๏ผๅฃๆ็ปตๅฏใ",
"ๆฉๅก": "ๆต็ผฉๅๅกๅ ๅทงๅ
ๅ้
ฑๅ็ๅฅถ๏ผ็็พๆต้๏ผๅๆถฒไฝๅทงๅ
ๅ่็ณใ",
"็ฆ็ณ็ๅฅๆต": "ๆต็ผฉๅๅกๅ ้ฆ่็ณๆตๅ็ฆ็ณ้
ฑ๏ผ็่ๆตชๆผซ๏ผ้ขๅผๆ
ๅฝใ",
"ๆน่ถๆฟ้": "ๆฅๆฌๆน่ถๅ ่ธๆฑฝ็ๅฅถ๏ผๆธ
ๆฐๅ็๏ผไธๅๅๅกไน่ฝ้ใ",
"ๅฐๅๅ
": "ๅทๅปๆ็บฏ็ๅฅถๅ ๆต็ผฉๅๅก๏ผๅฅถๅณ่ถ
็บงๆต้๏ผๅๅก็็็ฑ้ฉฌไปใ",
}
desc = descriptions.get(drink_name, "ไธๆฌพ็ฒพ้้ฅฎๅใ")
return (
f"โ {drink_name}\n"
f"{'โ' * 30}\n"
f"๐ฐ ไปทๆ ผ๏ผยฅ{info['price']}\n"
f"๐ ๅ็ฑป๏ผ{info['category']}\n"
f"๐ฆ ๅบๅญ๏ผ{info['stock']}ๆฏ\n"
f"๐ ๆ่ฟฐ๏ผ{desc}\n"
f"{'โ' * 30}\n"
f"ๆฏๅๅ ไปท๏ผๅฐๆฏ -3ๅ
/ ๅคงๆฏ +4ๅ
"
)
@mcp.resource("coffee://orders/today")
def get_today_orders() -> str:
"""
ไปๆฅ่ฎขๅ่ฎฐๅฝ
URI: coffee://orders/today
"""
if not ORDERS:
return "ไปๆฅๆๆ ่ฎขๅใ"
lines = [f"๐ ไปๆฅ่ฎขๅ่ฎฐๅฝ ({len(ORDERS)}ๅ)\n" + "โ" * 50]
for o in ORDERS:
lines.append(
f" {o['id']} {o['time']} "
f"{o['size']}{o['drink']} x{o['quantity']} "
f"ยฅ{o['total']}"
)
return "\n".join(lines)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐ PROMPTS โโ ๅบๅฎๅฅ้ค๏ผๆ็คบๆจกๆฟ๏ผ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
@mcp.prompt()
def recommend_drink(preference: str = "", budget: int = 0) -> str:
"""
้ฅฎๅๆจ่ๆ็คบๆจกๆฟ
Args:
preference: ้กพๅฎขๅฃๅณๅๅฅฝ๏ผๅฆ"ๅๆฌข็็"ใ"ไธ่ฆๅคช่ฆ"
budget: ้ข็ฎไธ้๏ผ0่กจ็คบไธ้
"""
prompt = "ไฝ ๆฏไธไฝไธไธ็ๅๅกๅธ๏ผ่ฏทๆ นๆฎ้กพๅฎข้ๆฑๆจ่้ฅฎๅใ\n\n"
prompt += "้กพๅฎข้ๆฑ๏ผ\n"
if preference:
prompt += f"- ๅฃๅณๅๅฅฝ๏ผ{preference}\n"
if budget > 0:
prompt += f"- ้ข็ฎไธ้๏ผยฅ{budget}\n"
if not preference and budget == 0:
prompt += "- ๆฒกๆ็นๆฎ่ฆๆฑ๏ผ่ฏทๆจ่ๆๅๆฌข่ฟ็\n"
prompt += "\n่ฏทๅ
ๆฅ็ๅฎๆด่ๅ(coffee://menu)๏ผ็ถๅๆจ่2-3ๆฌพๅ้็้ฅฎๅ๏ผ"
prompt += "่ฏดๆๆจ่็็ฑ๏ผ็จๆธฉๆไบฒๅ็่ฏญๆฐใ"
return prompt
@mcp.prompt()
def barista_guide(drink_name: str) -> str:
"""
ๅๅกๅถไฝๆๅๆ็คบๆจกๆฟ
Args:
drink_name: ้ฅฎๅๅ็งฐ
"""
return f"""
่ฏทไปฅไธไธๅๅกๅธ็่บซไปฝ๏ผ่ฏฆ็ปไป็ปๅฆไฝๅถไฝไธๆฏๅฎ็พ็{drink_name}ใ
่ฆๆฑ๏ผ
1. ๅ
ๆฅ็่ฏฅ้ฅฎๅ็่ฏฆๆ
(coffee://drink/{drink_name})
2. ๅๅบๆ้ๆๆๅๅทฅๅ
ท
3. ๅๆญฅ้ชค่ฎฒ่งฃๅถไฝ่ฟ็จ
4. ็ปๅบไธไธๅฐๆๅทง
5. ็จไผ้
ไฝๆๆ็่ฏญ่จ
"""
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐ ๅฏๅจ Server
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
def main():
mcp.run(transport="stdio")
if __name__ == "__main__":
main()
็ฌฌไธ็ซ ๏ผ่ฎฉ Claude Desktop ่ฟๆฅไฝ ็ Server
ๅจ Claude Desktop ็้ ็ฝฎๆไปถไธญๆทปๅ ๏ผ
macOS:ย ~/Library/Application Support/Claude/claude_desktop_config.json
Windows:ย %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"coffee-shop": {
"command": "python",
"args": ["/path/to/coffee-mcp-server/server.py"],
"env": {}
}
}
}
ๅฆๆๆฏ npm ๅ ๏ผๆฏๅฆ็คพๅบๅทฒๆ็ Server๏ผ๏ผ
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/you/documents"
]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx"
}
},
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost:5432/mydb"
]
}
}
}
็ฌฌๅ ซ็ซ ๏ผๆไฝณๅฎ่ทต๏ผ่ตๆทฑๆถๆๅธ็็ป้ชไน่ฐ๏ผ
โ DO โโ ๅบ่ฏฅๅ็
# โโโ 1. ๅทฅๅ
ทๆ่ฟฐ่ฆๅ็ปไบบ็็ไธๆ ทๅๆธ
ๆฅ โโโ
# โ ๅ็คบ่
@mcp.tool()
def calc(a: int, b: int) -> int:
"""่ฎก็ฎ"""
return a + b
# โ
ๅฅฝ็คบ่
@mcp.tool()
def calculate_order_total(
subtotal: float,
discount_code: str = "",
tax_rate: float = 0.06
) -> float:
"""
่ฎก็ฎ่ฎขๅๆ็ปๆปไปท๏ผๅซ็จๅๆๆฃ๏ผ
Args:
subtotal: ๅๅๅฐ่ฎก้้ข๏ผ็จๅ๏ผๅไฝ๏ผๅ
๏ผ
discount_code: ๆๆฃ็ ๏ผๅฏ้ใ็ฉบๅญ็ฌฆไธฒ่กจ็คบๆ ๆๆฃใ
ๆฏๆ็ๆๆฃ็ ๏ผSAVE10(9ๆ)ใSAVE20(8ๆ)ใNEWUSER(7ๆ)
tax_rate: ็จ็๏ผ้ป่ฎค6%๏ผไธญๅฝ้ค้ฅฎๅขๅผ็จ๏ผ
Returns:
ๆ็ปๅบไป้้ข๏ผๅ่ไบๅ
ฅๅฐๅ๏ผ
Examples:
calculate_order_total(100, "SAVE10") โ 95.4
calculate_order_total(100) โ 106.0
"""
discount_map = {"SAVE10": 0.9, "SAVE20": 0.8, "NEWUSER": 0.7}
rate = discount_map.get(discount_code, 1.0)
return round(subtotal * rate * (1 + tax_rate), 2)
# โโโ 2. ็จ JSON Schema ็บฆๆๅๆฐ โโโ
from pydantic import BaseModel, Field
class OrderRequest(BaseModel):
drink_name: str = Field(
...,
description="้ฅฎๅๅ็งฐ",
pattern=r"^[\u4e00-\u9fa5a-zA-Z]+$" # ๅชๅ
่ฎธไธญ่ฑๆ
)
size: str = Field(
default="ไธญๆฏ",
description="ๆฏๅ",
json_schema_extra={"enum": ["ๅฐๆฏ", "ไธญๆฏ", "ๅคงๆฏ"]}
)
quantity: int = Field(
default=1,
ge=1, # ๆๅฐๅผ 1
le=20, # ๆๅคงๅผ 20
description="่ดญไนฐๆฐ้๏ผ1-20ๆฏ"
)
@mcp.tool()
def place_order(req: OrderRequest) -> str:
"""ไธๅ่ดญไนฐ้ฅฎๅ"""
# req ๅทฒ็ป็ป่ฟ Pydantic ้ช่ฏ๏ผ็ฑปๅๅฎๅ
จ
...
# โโโ 3. ่ฟๅ็ปๆๅๅ
ๅฎน โโโ
@mcp.tool()
def search_drinks(keyword: str) -> list[dict]:
"""
ๆ็ดข้ฅฎๅ๏ผ่ฟๅ็ปๆๅๆฐๆฎ๏ผๆนไพฟๆจกๅ่งฃๆ๏ผ
"""
results = []
for name, info in MENU.items():
if keyword in name:
results.append({
"name": name,
"price": info["price"],
"stock": info["stock"],
"available": info["stock"] > 0
})
return results
# โโโ 4. ้่ฏฏๅค็่ฆๅๅฅฝ โโโ
@mcp.tool()
def cancel_order(order_id: str) -> str:
"""
ๅๆถ่ฎขๅ
"""
# ๆพไธๅฐ่ฎขๅ
order = next((o for o in ORDERS if o["id"] == order_id), None)
if not order:
return f"โ ๆชๆพๅฐ่ฎขๅ {order_id}ใ่ฏทๆฃๆฅ่ฎขๅๅทๆฏๅฆๆญฃ็กฎใ"
# ่ถ
ๆถไธๅฏๅๆถ
if datetime.now().minute - int(order["time"].split(":")[1]) > 5:
return f"โ ่ฎขๅ {order_id} ๅทฒ่ถ
่ฟ5ๅ้๏ผๆ ๆณๅๆถใ่ฏท่็ณป้จๅบใ"
# ๆญฃๅธธๅๆถ
MENU[order["drink"]]["stock"] += order["quantity"]
ORDERS.remove(order)
return f"โ
่ฎขๅ {order_id} ๅทฒๅๆถ๏ผ{order['quantity']}ๆฏ{order['drink']}ๅทฒ้ๅๅบๅญใ"
# โโโ 5. ่ตๆบ URI ่ฆๆ่ฏญไน โโโ
# โ
ๅฅฝ็ URI ่ฎพ่ฎก
@mcp.resource("coffee://menu") # ่ๅ
@mcp.resource("coffee://drink/{name}") # ๅไธช้ฅฎๅ
@mcp.resource("coffee://orders/{date}") # ๆๅคฉ่ฎขๅ
@mcp.resource("coffee://stats/sales/{period}") # ้ๅฎ็ป่ฎก
# โ ๅ็ URI ่ฎพ่ฎก
@mcp.resource("data/1") # ๆ ่ฏญไน
@mcp.resource("api/get-all") # ๅ REST ่ไธๅ่ตๆบ
@mcp.resource("test") # ๆ ๆไน
โ DONโT โโ ๅไธๅซๅ็
# โโโ 1. ไธ่ฆๅจๅทฅๅ
ท้ๅๅคงๆจกๅ็ๅทฅไฝ โโโ
# โ ๅ็คบ่๏ผๅทฅๅ
ท่ชๅทฑๅๆป็ป
@mcp.tool()
def get_weather_with_analysis(city: str) -> str:
"""่ทๅๅคฉๆฐๅนถๅๆ"""
weather = fetch_weather(city)
analysis = f"ๅคฉๆฐๆฏ{weather}๏ผๅปบ่ฎฎ{'ๅธฆไผ' if '้จ' in weather else 'ๅบ่ก'}"
return analysis # ๆจกๅๅบ่ฏฅ่ชๅทฑๅๆ๏ผไฝ ๅฅๅคบไบๅฎ็่ฝๅ
# โ
ๅฅฝ็คบ่๏ผๅช่ฟๅๅๅงๆฐๆฎ
@mcp.tool()
def get_weather(city: str) -> dict:
"""่ทๅๅๅธๅคฉๆฐๅๅงๆฐๆฎ"""
return fetch_weather(city) # ่ฎฉๆจกๅๆฅๅๆๅๅปบ่ฎฎ
# โโโ 2. ไธ่ฆ่ฎฉๅทฅๅ
ทๅๅคชๅคไบ โโโ
# โ ๅ็คบ่๏ผไธไธชๅทฅๅ
ทๅนฒๆๆไบ
@mcp.tool()
def coffee_operation(
action: str, # "order" / "cancel" / "check" / "recommend"
**kwargs
) -> str:
"""ๅๅกๆไฝ๏ผไธ่ฝๅทฅๅ
ท๏ผ"""
if action == "order": ...
elif action == "cancel": ...
elif action == "check": ...
# ๆจกๅๅพ้พๅ็กฎ้ๆฉ action
# โ
ๅฅฝ็คบ่๏ผๆฏไธชๆไฝไธไธชๅทฅๅ
ท
@mcp.tool()
def order_drink(...): ...
@mcp.tool()
def cancel_order(...): ...
@mcp.tool()
def check_stock(...): ...
# โโโ 3. ไธ่ฆๅฟฝ็ฅๅฎๅ
จๆง โโโ
# โ ๅ็คบ่๏ผ็ดๆฅๆง่กไปปๆ SQL
@mcp.tool()
def query_database(sql: str) -> str:
"""ๆง่กSQLๆฅ่ฏข"""
return db.execute(sql) # ๅฑ้ฉ๏ผๆจกๅๅฏ่ฝๅ้ DROP TABLE
# โ
ๅฅฝ็คบ่๏ผ้ๅถๆฅ่ฏข่ๅด
@mcp.tool()
def query_orders(
date_from: str,
date_to: str,
status: str = ""
) -> str:
"""ๆฅ่ฏข่ฎขๅ่ฎฐๅฝ๏ผๅช่ฏป๏ผ้ๅฎ่ๅด๏ผ"""
# ไฝฟ็จๅๆฐๅๆฅ่ฏข๏ผๅชๅ
่ฎธๆฅ่ฏข orders ่กจ
return db.query_orders(date_from, date_to, status)
# โโโ 4. ไธ่ฆ่ฟๅๆตท้ๆฐๆฎ โโโ
# โ ๅ็คบ่
@mcp.tool()
def get_all_logs() -> str:
"""่ทๅๆๆๆฅๅฟ""" # ๅฏ่ฝ่ฟๅ 100MB ๆฐๆฎ๏ผๆจกๅ็ดๆฅๅดฉๆบ
return open("/var/log/everything.log").read()
# โ
ๅฅฝ็คบ่
@mcp.tool()
def search_logs(
keyword: str,
limit: int = Field(default=20, le=100),
start_time: str = "",
) -> str:
"""ๆ็ดขๆฅๅฟ๏ผๆๅค่ฟๅ100ๆก๏ผ"""
...
็ฌฌไน็ซ ๏ผ้ซ็บงๆๅทง โโ ่ตๆบ่ฎข้ ไธ่ฟๅบฆ้็ฅ
# โโโ ่ตๆบ่ฎข้
๏ผๅๅจ้ฃๆๅไบ๏ผไธปๅจ้็ฅ๏ผ โโโ
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("smart-kitchen")
# ๅฎไนไธไธชๅฏๆดๆฐ็่ตๆบ
@mcp.resource("kitchen://stock/{ingredient}")
async def get_stock(ingredient: str) -> str:
"""่ทๅ้ฃๆๅบๅญ"""
stock = await db.get_stock(ingredient)
return f"{ingredient}: ๅฉไฝ {stock} ไปฝ"
# ๅฝๅบๅญๅๅๆถ๏ผ้็ฅๆๆ่ฎข้
่
async def on_stock_changed(ingredient: str, new_stock: int):
"""ๅบๅญๅๅๅ่ฐ"""
if new_stock < 10:
# ้็ฅ่ตๆบๆดๆฐไบ
await mcp.request_context.session.send_resource_updated(
"kitchen://stock/" + ingredient
)
# ่ฟๅฏไปฅไธปๅจๅๆฅๅฟ้็ฅ
await mcp.request_context.session.send_log_message(
level="warning",
data=f"โ ๏ธ {ingredient} ๅบๅญไธ่ถณ๏ผไป
ๅฉ {new_stock} ไปฝ๏ผ"
)
# โโโ ่ฟๅบฆ้็ฅ๏ผ้ฟๆถ้ดๆไฝ๏ผๆฅๅ่ฟๅบฆ๏ผ โโโ
import asyncio
@mcp.tool()
async def batch_brew(drinks: list[str]) -> str:
"""
ๆน้ๅถไฝ้ฅฎๅ๏ผ่ๆถๆไฝ๏ผไผๆฅๅ่ฟๅบฆ๏ผ
"""
total = len(drinks)
for i, drink in enumerate(drinks):
# ๆจกๆๅถไฝ่ฟ็จ
await asyncio.sleep(1)
# ๅ้่ฟๅบฆ้็ฅ
await mcp.request_context.session.send_progress(
progress_token="batch-brew-001",
progress=i + 1,
total=total,
message=f"ๆญฃๅจๅถไฝ {drink} ({i+1}/{total})"
)
return f"โ
{total}ๆฏ้ฅฎๅๅ
จ้จๅถไฝๅฎๆ๏ผ"
็ฌฌๅ็ซ ๏ผ่ฐ่ฏๆๅทง โโ MCP Inspector
MCP ๅฎๆนๆไพไบไธไธช่ถ ๅฅฝ็จ็่ฐ่ฏๅทฅๅ ทย MCP Inspector๏ผ
# ็ดๆฅๅฏๅจ๏ผไผๆๅผไธไธช Web ็้ข
npx @modelcontextprotocol/inspector python server.py
# ๆ่
่ฐ่ฏ่ฟ็จ Server
npx @modelcontextprotocol/inspector --transport streamable-http http://localhost:8080/mcp
Inspector ็้ขๅฏไปฅ๏ผ
- ๐ ๆฅ็ๆๆ Tools / Resources / Prompts
- ๐งช ๆๅจ่ฐ็จไปปๆๅทฅๅ ท๏ผๅกซๅๆฐ โ ็็ปๆ๏ผ
- ๐ก ๅฎๆถๆฅ็ๆๆ JSON-RPC ๆถๆฏ๏ผๅๆๅ ไธๆ ท๏ผ
- ๐ ่ฐ่ฏ่ฟๆฅ้ฎ้ข
็ฌฌๅไธ็ซ ๏ผๅธธ่ง้ฎ้ขๆๆฅ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ้ฎ้ข็ฐ่ฑก โ ๅฏ่ฝๅๅ โ ่งฃๅณๆนๆก โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ Claude ็ไธๅฐๅทฅๅ
ท โ Serverๆฒกๅฏๅจ โ ๆฃๆฅ้
็ฝฎJSON โ
โ โ ๅๅงๅๅคฑ่ดฅ โ ็stderrๆฅๅฟโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ ๆจกๅไธ่ฐ็จๅทฅๅ
ท โ ๆ่ฟฐไธๆธ
ๆฅ โ ไผๅdocstringโ
โ โ ๅๆฐๅๆจก็ณ โ ๅ enum็บฆๆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ ๅทฅๅ
ท่ฐ็จๆฅ้ โ ๅๆฐ็ฑปๅ้่ฏฏ โ ๅ Pydantic โ
โ โ ็ผบๅฐๅฟ
ๅกซๅๆฐ โ ่ฎพ้ป่ฎคๅผ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ ่ฟๆฅ่ถ
ๆถ โ stdio้ปๅก โ ไธ่ฆ็จinput()โ
โ โ ๅฏๅจๅคชๆ
ข โ ๆๅ ่ฝฝ่ตๆบ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ ่ฟๅๆฐๆฎ่ขซๆชๆญ โ ่ถ
่ฟtoken้ๅถ โ ๅ้กต/ๆ่ฆ โ
โ โ ๆ ผๅผ้่ฏฏ โ ่ฟๅ็บฏๆๆฌ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
็ป็ซ ๏ผไธๅผ ๅพๆป็ป MCP ๅ จ่ฒ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ MCP ๅ่ฎฎๅ
จๆฏๅพ โ
โ โ
โ ็จๆท โโโถ Host โโโถ AIๆจกๅ โโโ โ
โ โ โ
โ โโโโโโโโดโโโโโโโ โ
โ โ ้่ฆๅค้จ่ฝๅ๏ผโ โ
โ โโโโโโโโฌโโโโโโโ โ
โ Yes โ No โ
โ โโโโโโโโโโดโโโโโโโโโ โ
โ โผ โผ โ
โ โโโโโโโโโโโโโโโ ็ดๆฅๅ็ญ็จๆท โ
โ โ ้ๆฉๅทฅๅ
ท/่ตๆบ โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโผโโโโโโโโโโ โ
โ โผ โผ โผ โ
โ โโโโโโโโ โโโโโโโโ โโโโโโโโ โ
โ โTool โ โResrc โ โPromptโ โ ไธๅคง่ฝๅ โ
โ โๅจๆๅโ โ่ฏปๆฐๆฎโ โๆจกๆฟๅโ โ
โ โโโโฌโโโโ โโโโฌโโโโ โโโโฌโโโโ โ
โ โ โ โ โ
โ โโโโโโโโโโผโโโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ โ
โ โ Client โ โ JSON-RPC 2.0 โ
โ โ (ๅ่ฎฎ็ฟป่ฏ) โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโผโโโโโโโโโ โ
โ โผ โผ โผ โ
โ stdio HTTP (ๆชๆฅๆดๅค) โ ไผ ่พๅฑ โ
โ โ โ โ
โ โผ โผ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ Server โ โ ไฝ ็ไปฃ็ ่ฟ่กๅจ่ฟ้ โ
โ โ (่ฝๅๆไพ่
) โ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ ๆ ธๅฟไปทๅผ๏ผไธๆฌก็ผๅ๏ผๅฐๅคไฝฟ็จ๏ผไปปไฝ MCP Host ้ฝ่ฝ่ฐ็จไฝ ็Server๏ผ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๆๅ็ไธๅฅ่ฏๆป็ป
MCP ๅฐฑๆฏ AI ไธ็้็ USB ๆฅๅฃๆ ๅใ
ไปฅๅๆฏไธช AI ๅบ็จ่ฆ่ฟๆฅๅค้จๅทฅๅ ท๏ผ้ฝๅพ่ชๅทฑๅไธๅฅ"้ฉฑๅจ็จๅบ"ใMCP ๅบ็ฐๅ๏ผๅทฅๅ ทๅผๅ่ ๅช่ฆๆๆ ๅๅไธไธช Server๏ผๆๆๆฏๆ MCP ็ AI ๅบ็จ้ฝ่ฝ็ดๆฅ็จ โโย ๅฐฑๅ U ็ๆไธไปปไฝ็ต่้ฝ่ฝ็จไธๆ ท็ฎๅใ
ๅธๆ่ฟไธชๆ ไบๅไปฃ็ ่ฝ่ฎฉไฝ ๅฝปๅบ็่งฃ MCP๏ผๅฆๆไฝ ๆณๆๅๅกๅบ Serverย ่ท่ตทๆฅ๏ผๆ่ ๆณไบ่งฃๆด้ซ็บง็็จๆณ๏ผๆฏๅฆๅค Server ๅไฝใ่ฟ็จ้จ็ฝฒ๏ผ๏ผ้ๆถ้ฎๆ โ