Галоўная / Артыкулы

MCP ад зямлі, частка 3: З’ўязак кліента з вашым серверам

MCP ад зямлі, частка 3: кліент stdio, які запускае сам hr_server.py, выклікае інструмент search_employee за дапамою asyncio і вяртае вам рэзультаты.

Выдавец: REACTAPP.TOP3 хв чытання804 слоў

Крыніцы: Part 3: MCP From Scratch — Let’s Connect to Our MCP Server

У пакеце ранейша версія заставіла сервер 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 можа запускаць сервер, ініцыяваць сесію, вызываць адпаведны інструмент з параметрамі і выводзіць структураваны адказ — без неабяжнага ручнага запуску окалічныцкага серверскага процэсу.