MCP ад зямлі, частка 3: З’ўязак кліента з вашым серверам
Створыце кліент MCP stdio, які запускае hr_server.py, вызывае функцию search_employee і вяртае рэзультаты — без неабяжнага запуску сервера рукамі.
У пакеце ранейша версія заставіла сервер MCP з адзінай задачай: запростацьваць можлівасць пошуку кадраў.
HR MCP Server
↓
search_employee
Гэты процес пачаўся з:
python hr_server.py
Застала адна незадаць: хто на самай працэ павярzaецца з серверам? Гэтая ролі належы кліенту.
Client
↓
MCP
↓
HR MCP Server
Спрыяйце тэрмінам проста. Сервер запрастацьвае можлівасці. Кліент падключаецца і іх выкарыстоўвае.
Ствараем наш кліент
Праз hr_server.py дадаць ўтолькі іншы модуль:
hr_client.py
Структура проекта становіць:
mcp-hr
│
├── hr_server.py
│
└── hr_client.py
Калі сервер вже напісаны, увага застаецца на кліенты.
Падключаемся да нашага сервера
У hr_client.py разместіць наступнае:
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server = StdioServerParameters(
command="python",
args=["hr_server.py"]
)
async with stdio_client(server) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
asyncio.run(main())
Спачатку спіс выглядае насыценым. Ключоўы фрагмент — гэта:
server = StdioServerParameters(
command="python",
args=["hr_server.py"]
)
Эты параметры паведамляюць кліенту запускаць і прыўязвацца да hr_server.py. Кліент запускае процес сервера і ачынае сэсію stdio з яго.
Тепер запускаймо нашы інструмент
У частцы 2 быў апісаны інструмент пад назвай:
search_employee
Кліент можа шукати Джона так:
await session.initialize()
result = await session.call_tool(
"search_employee",
{"name": "John"}
)
print(result.content[0].text)
Простымі словамі, кліент просіць сэсію запрацаваць функцыю search_employee з іменем Джон. Полны скрыпт кліента ёсць:
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server = StdioServerParameters(
command="python3",
args=["hr_server.py"]
)
async with stdio_client(server) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool(
"search_employee",
{"name": "John"}
)
print(result.content[0].text)
asyncio.run(main())
Эты файл являецца цэлым кліентскім канцэптам дэманстрацыі.
Запускаймо яго
У тэрмінале выконайце:
python hr_client.py
Корыстны факт: hr_server.py не патрабуе окольныя ручныя запускі. Кліент запускае яго через:
command="python",
args=["hr_server.py"]
і пасля чаго прыўязваецца да выконванага процеса.
Што адбываецца?
Кліент выкладзе запит інструменту у такой форме:
Tool:
search_employee
Name:
John
Сервер яго прымае і выкананае:
search_employee("John")
Ён раз’ясняе:
John → Finance
і вяртае гэты рэзультат таму, хто запытаў. У цэлым, шлях выглядае так:
hr_client.py
│
│ search_employee("John")
↓
hr_server.py
│
↓
Search employee list
│
↓
John → Finance
│
↓
hr_client.py
Обе стороны пратаку зараз адбываюць практычна.
Праўе да нашага прыкладу USB
Праўянне клавіатуры да комп’ютера — годны прыклад для парабярання.
Keyboard
↓
USB
↓
Computer
Обе стороны дагадваюцца пра спяльную пратаку кабелю. Хутчэй, кліент выкарыстоўвае MCP, а сервер таксама выкарыстоўвае MCP. Гэтыя спяльныя правілы дазволяюць ім саўместна працаваць.
Але чы не выбраў ён інструмент?
Адна з абмежэнняў лёгка працягнуць. Зноў паглядзім на месца вызову:
session.call_tool(
"search_employee",
{"name": "John"}
)
Хто выбраў search_employee? Автар прыкладнага програма, заўважыўшы назву інструмента у коде. Кліент ніколі не чытаў запит на адгуку ў нейтральнай мове, такі як «Чы гэты Джон працуе ў фінансавай сферы?», і не вялікаварався, які функцыонал запускаць. Наступныя нехваткі — гэта автаматычны выбар інструмента.
Што далей?
Уявіце, што на серверы дадаецца калькі інструментаў:
search_employee
create_employee
get_leave_balance
list_departments
Калі корыстнік спытае, да каго самэўпаўнення належы Джон, трэба ўжо вялікаваравацца, што самэўпаўненне ёсць правым:
search_employee
а не якой-небудзь іншы інструмент. Гэты выбор залежыць ад назв, апісаў і каталогу, які прадстаўляецца. Наступны раздел раскажа, як прыкладная програма выбірае між інструментамі MCP, калі ў наявнасці ёсць многа з іх.
Дакле, важным урокам з гэтага крока ёсць тое, што кліент stdio можа запускать сервер, ініцыяваць сесію, вызываць адпаведны інструмент з параметрамі та выводзіць структураваны адказ — без неабяжнага ручнага запуску окалічныцкага серверскага процэсу.