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

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

Створыце кліент MCP stdio, які запускае hr_server.py, вызывае функцию search_employee і вяртае рэзультаты — без неабяжнага запуску сервера рукамі.

804 слоў

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