В предыдущей части этой серии я представил основные концепции протокола контекста модели (MCP) — открытый стандарт, предназначенный для оптимизации того, как модели ИИ взаимодействуют с внешними инструментами, источниками данных и ресурсами. В этом рассрочке я проведу вам пошаговый процесс создания сервера MCP и интеграции его с настольным компьютером Claude.
Мы будем использовать Python и FastMCP 2.0 для создания сервера MCP, который использует API FlightAware. Для получения дополнительной информации о Flightaware обратитесь к предыдущему учебному пособию, где я интегрировал его с инструментами крупной языковой модели (LLM). Убедитесь, что у вас есть действующий ключ API Flightaware, прежде чем продолжить.
В последующих частях этой серии я продемонстрирую, как расширить это, чтобы работать с агентами искусственного интеллекта, построенным с набором Dopenai Agents SDK и Google Agent Development (ADK).
Шаг 1: Настройка среды
Давайте начнем с создания виртуальной среды и установкой необходимых модулей Python:
Python -m venv venv source venv/bin/activate 12 python -m venvsource venv/bin/activate
Запросы на установку PIP FASTMCP PYTZ 1 PIP УСТАНОВКА запросы FASTMCP PYTZ
Шаг 2: Создание сервера MCP
Во -первых, импортируйте необходимые модули Python в коде:
Импорт JSON Import OS OS -запросы на импорт Import Pytz из DateTime Import -Time, TimeDelta от Typing Import Any, Callable, SET, DICT, List, необязательно от MCP.Server.fastmcp Import Fastmcp 1234567 Import jsonimport OS -запросы на Importsimport pytzfrom intoortmem mcp.server.fastmcp import fastmcp
Следующим шагом является создание объекта MCP из FASTMCP:
MCP = FASTMCP («Сервер полета») 1 MCP = FASTMCP («Сервер полета»)
Затем мы создадим функцию и украсим ее аннотацией @mcp.tool (), чтобы явно определить ее как инструмент:
@mcp.tool () def get_flight_status (Flight): «» «возвращает информацию о полете» «» aeroapi_base_url = «aeroapi_key =» your_api_key «def get_api_session (): session = requests.session () session.headers.update ({» x-apikey «: aeroApi_ceen () session. fetch_flight_data (flight_id, session): if «flight_id =» in flight_id: flight_id = flight_id.split («flight_id =»)[1]
start_date = datetime.now (). date (). strftime (‘%y-%m-%d’) end_date = (dateTime.now (). date () + timedelta (days = 1)). strftime (‘%y-%m-%d’) api_resource = f «/flights/{flight_id}? start = {start_date} & amp; end = {end_date}» # фиксированный & amp; to & amp; try: response = session.get (f «{aeroapi_base_url} {api_resource}») response.raise_for_status () json_data = response.json () # print respens Лен (json_data[‘flights’]) == 0: вернуть нет возврата json_data[‘flights’][0]
За исключением исключения как e: print (f «Ftching Fetching Data: {e}») return none def utc_to_local (utc_date_str, local_timezone_str): utc_datetime = datetime.strptime (utc_date_str, ‘%y-%m-%dt%h:%m:%sz’). local_timezone = pytz.timezone (local_timezone_str) local_datetime = utc_datetime.astimezone (local_timezone) return local_datetime.strftime (‘%y-%m-%d%h:%m:%s’) session = get_api_session () flight_data = fetch_data_data_data_data_data_data_data_data_data_daTa None: return json.dumps ({‘error’: ‘не удалось получить данные полета. Проверьте ключ API и идентификатор полета.’, ‘Flight’: Flight}) try: dep_key = ‘out outed_out’, если ‘outsed_out’ in flight_data и flight_data[‘estimated_out’] else \ ‘actual_out’ if ‘actual_out’ в flight_data и flight_data[‘actual_out’] else \ ‘graduled_out’ arr_key = ‘out outed_in’ if ‘out outed_in’ в flight_data и flight_data[‘estimated_in’] else \ ‘actual_in’ if ‘actual_in’ in flight_data и flight_data[‘actual_in’] else \ ‘preduled_in’ flight_details = f «» «Flight: {Flight} Источник: {flight_data[‘origin’][‘city’]} Назначение: {flight_data[‘destination’][‘city’]} Время отправления: {utc_to_local (flight_data[dep_key]flight_data[‘origin’][‘timezone’])} Время прибытия: {utc_to_local (flight_data[arr_key]flight_data[‘destination’][‘timezone’])} Статус: {Flight_Data[‘status’]} «» «return flight_details, кроме исключения как e: print (f reeping обработка ошибок. 123456789101112131415161718192021222324252627282930313233343536373839 4041424344454647484950515253545556575859606162636465666768697071727374 @mcp.tool () def get_flight_status (Flight): «» «возвращает информацию о полете» «» aeroapi_base_url = «aeroapi_key =» your_api_key «def get_api_session (): session = requests.session () session.headers.update ({» x-apikey «: aeroApi_ceen () session. fetch_flight_data (flight_id, session): if «flight_id =» in flight_id: flight_id = flight_id.split («flight_id =»)[1] start_date = datetime.now (). date (). strftime (‘%y-%m-%d’) end_date = (dateTime.now (). date () + timedelta (days = 1)). strftime (‘%y-%m-%d’) api_resource = f «/flights/{flight_id}? start = {start_date} & amp; end = {end_date}» # фиксированный & amp; to & amp; try: response = session.get (f «{aeroapi_base_url} {api_resource}») response.raise_for_status () json_data = response.json () # print respens Лен (json_data[‘flights’]) == 0: вернуть нет возврата json_data[‘flights’][0] За исключением исключения как e: print (f «Ftching Fetching Data: {e}») return none def utc_to_local (utc_date_str, local_timezone_str): utc_datetime = datetime.strptime (utc_date_str, ‘%y-%m-%dt%h:%m:%sz’). local_timezone = pytz.timezone (local_timezone_str) local_datetime = utc_datetime.astimezone (local_timezone) return local_datetime.strftime (‘%y-%m-%d%h:%m:%s’) session = get_api_session () flight_data = fetch_data_data_data_data_data_data_data_data_data_daTa None: return json.dumps ({‘error’: ‘не удалось получить данные полета. Проверьте ключ API и идентификатор полета.’, ‘Flight’: Flight}) try: dep_key = ‘out outed_out’, если ‘outsed_out’ in flight_data и flight_data[‘estimated_out’] else \ ‘actual_out’ if ‘actual_out’ в flight_data и flight_data[‘actual_out’] else \ ‘graduled_out’ arr_key = ‘out outed_in’ if ‘out outed_in’ в flight_data и flight_data[‘estimated_in’] else \ ‘actual_in’ if ‘actual_in’ in flight_data и flight_data[‘actual_in’] else \ ‘preduled_in’ flight_details = f «» «Flight: {Flight} Источник: {flight_data[‘origin’][‘city’]} Назначение: {flight_data[‘destination’][‘city’]} Время отправления: {utc_to_local (flight_data[dep_key]flight_data[‘origin’][‘timezone’])} Время прибытия: {UTC_TO_LOCAL (FLERS_DATA[arr_key]flight_data[‘destination’][‘timezone’])} Статус: {Flight_Data[‘status’]} «» «return flight_details, кроме исключения как e: print (f reeping обработка ошибок.
Последний шаг — создать основную функцию для запуска сервера, если он выполняется напрямую:
Если __name__ == «__main__»: mcp.run () 12, если __name__ == «__main__»: mcp.run ()
Вот и все! Мы закончили построить наш первый сервер MCP. Пришло время проверить его, интегрируя его с настольным компьютером Claude.
Шаг 3: Интеграция с настольным компьютером Claude
Убедитесь, что у вас есть последняя версия Claude Desktop. Откройте меню «Настройки», чтобы получить доступ к вкладке разработчика:
Нажмите на кнопку «Редактировать конфигурацию», чтобы получить доступ к файлу настроек MCP с именем CLAUDE_DESKTOP_CONFIG.JSON.
Откройте файл в своем любимом редакторе и добавьте следующий контент:
{«mcpervers»: {«Flight»: {«command»: «/users/janakiramm/demo/venv/bin/python», «args»: [
«/Users/janakiramm/Demo/flight_server.py»
]
}}} 12345678910 ay [ «/Users/janakiramm/Demo/flight_server.py» ] }}}
Замените путь на абсолютный путь к вашей среде Python и MCP Server и сохраните файл.
Перезапустите Claude, и теперь вы должны найти свой MCP -сервер в опции «Настройки».
Убедитесь, что он включен. Теперь мы все готовы использовать наш сервер MCP от Claude.
Пришло время протестировать сервер MCP, спросив Клода о расписании полета. Клод попросит вашего разрешения получить доступ к сторонней службе.
Как только вы это позволите, Claude вызовет сервер MCP и получает данные, которые действуют как контекст в исходной подсказке.
Как мы видим из вывода, Клод призвал сервер MCP, чтобы получить статус в реальном времени. Обратите внимание, что мы используем транспорт stdio.
Вы можете найти весь код в сути ниже:
В предстоящих статьях этой серии мы рассмотрим, как использовать другие транспортные протоколы, в том числе транспорт HTTP. Следите за обновлениями!
Trending Stories youtube.com/thenewstack Tech движется быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Janakiram MSV является основным аналитиком в Janakiram & Associates и адъюнкт -преподавателем Международного института информационных технологий. Он также является квалифицированным Google Cloud Developer, сертифицированным архитектором решений Amazon, сертифицированным разработчиком Amazon, … Подробнее от Janakiram MSV