Практычныя прытамулі: Чым ёсць MCP? Стварэнне спецыяльнага сервера MCP на Python
Практычныя прыказкі: Чаму ёсць MCP? Как стварыць спецыяльны сервер MCP на Python: контракты, перакананні та шаблоны коду для команд, якія викорыстоўваюць гэты патэрн.
Існавайце гэта як перапрацоўаны варыянт ідэй з статті «Што такое MCP? Створыце спецыяльны сервер MCP на Python» для аператараў: чыстыя этапы, арганізаваныя блакі коду і прыметкі з восстанавлення, якія застаюцца пасля перадачы. Этап «Агульныя відомасці» найэфектывней працюе, калі яго розглядаць як вимерную плошчу. Запісайце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі з вярнення да пачатковага стану прычым расшырэнню масштаба. Запісвайце часы виконання і косты токеноў або запытак праза функцыйнае рэзультат. Відразлівае паказанне костаў з’являецца прычыной адсутнасці неспакою, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.
MCP за 90 секунд
Для ўрагану MCP за 90 секундакоў неабходна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзеі коду. Аперацыйныя працавнікі павінны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічыць паза кодам прыкладнення. Файлы сераўніка, хранільнікі секрэтных данных і флагі функцыйяў павінны знаходзіцца ў адном месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф. Аддзельнае стварэнне кліента ад цыклу паведамленняяў дазволяе змініць прадаўцоў без перапісвання машыны стану размовы.
Чаму кожная інтэграцыя з AI раней коштавала у тры разы больш
У кожным этапе інтеграцыі AI неабходна чыстая прычына: перад змянайом коду трэба визначыць даны, адпавядающага за шаг адпаведальнага, і крэтарыя для завершэння. Аперацыйныя працавнікі должны магчымае запускаць шаг з вядомай точкі контролю, не падозрываючы схованы стан. Неабходна адночасная документацыя як успішнаг, так і варыянтага падходу. Перапрыбуткі, людзкія перакрыцця та обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Трэба аддзеліць стварэнне кліента ад цыклу паведамленняў, каб можна было змяніць прадаўцоў без перапісвання машыны стану размовы.
Стварэнне дапаможніка Standup у адным файле
Для стадіі «Стварэнне дапаможніка для Standup» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтырыя завершэння пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеляйце стварэнне кліента ад цыклу перадачы паведамленняў, каб можна было змяніць прадаўцаў без перапісвання машыны стану размовы. Для стадіі «Стварэнне дапаможніка для Standup» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтырыя завершэння пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісвайце час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльнае сераўерское сэрא.
менты.pip install fastmcp
# standup_server.py
import subprocess
from typing import TypedDict
from fastmcp import FastMCP
mcp = FastMCP("standup-helper")
class StandupSummary(TypedDict):
branch: str
since: str
commit_count: int
commits: list[str]
@mcp.tool()
def summarize_standup(
branch: str = "main",
since: str = "yesterday",
) -> StandupSummary:
"""Summarize recent git activity for a standup.
Reads the local git log on the given branch since the
given time window. Returns commit count and one-line
subjects for each commit. Used by AI clients via MCP.
"""
try:
result = subprocess.run(
[
"git", "log",
f"--since={since}",
"--pretty=format:%h %s",
branch,
],
capture_output=True,
text=True,
timeout=5,
check=True,
)
except (subprocess.CalledProcessError,
subprocess.TimeoutExpired) as exc:
return {
"branch": branch,
"since": since,
"commit_count": 0,
"commits": [f"git error: {exc}"],
}
lines = [
line for line in result.stdout.splitlines() if line
]
return {
"branch": branch,
"since": since,
"commit_count": len(lines),
"commits": lines,
}
# resources and prompts come next
# standup_server.py (continued)
@mcp.resource("recent_commits://main")
def recent_commits_main() -> str:
"""Last 10 commits on the main branch, plain text.
Resources are pulled by the host opportunistically.
They are not invoked by the model the way tools are.
"""
result = subprocess.run(
[
"git", "log",
"-n", "10",
"--pretty=format:%h %ad %s",
"--date=short",
"main",
],
capture_output=True,
text=True,
timeout=5,
)
return result.stdout or "(no commits found)"
@mcp.prompt("standup_template")
def standup_template(focus: str = "shipping work") -> str:
"""Reusable standup question exposed as a prompt
template. Surfaces as a slash command in clients that
expose prompts (e.g. /standup_template in Claude Code).
"""
return (
f"Summarize what I worked on yesterday, focusing on "
f"{focus}. Use the summarize_standup tool to get the "
f"git log, then write a one-paragraph standup note."
)
if __name__ == "__main__":
mcp.run()
Транспорты і аутэнтыкацыя
Калі працуеце над стадзіяй Транспорты і аутэнтыкацыя, спачатку запісайце угоду: неабяжлівыя данні, сигнал працэйскага успеху і тое, што выканаецца у разы частковага абярэння. Такі список контроля дапамагае заліцварыць пазнейшыя змены ў кодзе. Зберагаюце настройкі праза код аплікацыі. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Запісвайце ID запытку, ID модэлю і час адклікання праз кожны вызов. Без такога лёгку, інтэрмітантных абярэнняў прадаўцы выглядаюць як багі аплікацыі.
# bottom of standup_server.py
if __name__ == "__main__":
# Default transport is stdio. The host (Claude Code,
# Cursor, Claude Desktop, etc.) launches this script
# as a subprocess and talks to it over stdin/stdout.
# No port, no TLS, no auth. The trust boundary is
# whoever launched the host.
mcp.run()
# To expose the same server over the network instead,
# use Streamable HTTP. SSE was deprecated in the
# March 2025 spec update. Do not use it for new code.
#
# Production HTTP also needs an auth layer in front.
# OAuth 2.1 with Dynamic Client Registration is the
# current pattern. See Week 22 for the full flow.
#
# mcp.run(
# transport="streamable-http",
# host="0.0.0.0",
# port=8000,
# )
Цыкл локальнага развіцця
Калі працуеце над стадзіяй Цыклу локальнага развіцця, спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі список пераканаецца ў тым, што пазнейшыя змены коду будуць чыстымі. Документавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць частью продукту, а не пазнейшым дапрацоўкам. Зявляйце логі з ідэнтыфікаторам запиту, ідэнтыфікаторам моделі і часам затрымкі праз кожны вызов. Без такога следу періодычныя памылкі прадастаўця выглядаюць як багі ў прыемніку.
npx @modelcontextprotocol/inspector python standup_server.py
Той самы сэрвер, трое кліентаў
Калі працуеце над стадзіяй «Аднаковы сервер, трохі кліентаў», спачатку запісайце угоду: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковага абякання. Такі список дапамагае залічыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок абякаецца, абяканне павінна вказваць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Запісвайце ID запиту, ID модэлю і час адпаведзі на кожны вызов. Без такога лёгкага стэйта нерегулярныя кантакты з прадаўцам выглядаюць як багі ў самай аплікацыі. Калі працуеце над стадзіяй «Аднаковы сервер, трохі кліентаў», спачатку запісайце угоду: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковага абякання. Такі список дапамагае залічыць пазнейшыя змены ў кодзе. Запісвайце часы выканання, а таксама кост токенаў чыю запытаў разам з функцыйнальнымі рэзултатамі. Відразувыя даны пра косцы запобегаюць неспакойным рахункам, калі праця пераходзіць з дэмаверсіі ў спакульнаныя сераўры.
{
"mcpServers": {
"standup-helper": {
"command": "python",
"args": ["/Users/you/code/standup_server.py"]
}
}
}
{
"mcpServers": {
"standup-helper": {
"command": "python",
"args": ["/Users/you/code/standup_server.py"]
}
}
}
{
"mcpServers": {
"standup-helper": {
"command": "python",
"args": ["/Users/you/code/standup_server.py"]
}
}
}
Для чаго не трэба вжываць MCP
Этап «Для чаго не трэба вжываць» работае найкраща, калі яго спрыяваць як меркаваную плошчу. Запісаце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па поверненню да пачатковага стану пры розширэнні сферы дзеяння. Зберагаце настройкі пазначыта ўнутрь коду прыемліка. Файлы сераўнавання сяродовысці, хранілішча секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх элементаў. Закрепіце інтерпрэтара і файл з блокірацыяю залежнасцей пры пачатку роботы з цікламі. Разніця межу лептапам і системай CI ёсць найчастэйшым таямным факторам, які спрабоўвае зламаць дэманстрацыі API.
Пратакол маленькі. Змяны — великія.
Протакол «Small stage» работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна «золатая» транскрыпцыя, адин прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваце сферу дзейнасці. Дакументаваце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не наступным этапам дорабачання. Зафіксавайце інтэрпретара і файл з блокірацыяй залежнасцей пры тлумачэнні цикла. Разлік межаў між ноутбукам і системай CI є найпашыльнейшым таямным абрывам дэманстрацый API.
Чытаць даўжэй
Этап «Продзец чытаць далей» працюе найэфектывней, калі яго спрыяваць як меравальную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Волійце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Зафіксавайце версію інтэрпретара і файл з правиламі залежнасцяў пры тым, як выучаеце цикл. Разніця ў версіях межу лептапам і сервісам CI — гэта найчыстае, але частае выключэнне працы дэманстрацый API. Этап «Продзец чытаць далей» працюе найэфектывней, калі яго спрыяваць як меравальную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Запісвайце час выканання і вартасць токенаў або запытак разам з функцыйнальнымі рэзултатамі. Відразувыя даны пра вартасці запобегаюць неспакойным рахункам, калі праця пераходзіць з дэманстрацыі ў спяльныя среды.
Чэрніца кантролю
Калі працюеце над стадзіяй Кантрольнага списку, спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага абярэння. Шыры кантрольны список дапамагае заліцьварыць змяны коду пазнейша.
Спрыятлівайце гэтую стадзію як контракт межа данымі і перакананымі выходамі. Дайце назвы артыкулам, задаце перакананні успеху і адмовіцеся ад тыхоўскага частковага завершэння.
Зявляйце логі з ідэнтыфікаторам запиту, ідэнтыфікаторам моделі і часам затрымкі праз кожны вызов. Без гэтага следу періодычныя абярэння прадаўцоў выглядаюць як багі ў прыемніку.
Адкройце інструменты з вузкімі схемамі і чыткімі пазначэннямі парадуктываў. Хостам неабходна знать, якія вызовы мутуюць стан, перш чым яны автаматычна затвердзяюць.
Калі бюджэт дазволяе, дадаце тест на працяснасць, які перабірае критычны шлях у CI з фіксатрамі, а не з рэальнымі платнымі API.
Запісвайце адно і шлях успеху, і шлях вярнення. Перапрыбуткі, людзкія контраліны і обработка некоректных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
Перш чым пераводзіць стак, заморозьце версіі, зафіксавайце ідеальны транскрыпт для критычнага шляху і паказвайце крокі для атрыбутавання назад. У спяльных средах патрэбны ліміты частоты запытоў, перакананні ў правах на выкарыстоўванне ресурсоў і чысткі власнік для змены секрэтных даных. Валіце надзейнасць, якая не выклікае сумневаў, прыгожэй чым хітрыя разовыя дамастанты.
Прымітка для пакету 91ba71830d6a: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токеноў на кожную сесію і зберагайце транскрыпты празаўсёды разам з фіксатрамі для ацэнкі, каб пазнейшыя замены модэляў заставаліся пораўнанымі.
Калі працуеце над першым этапам зміцнення, спачатку запісайте умовы: неабяцковыя даны, сигнал успеху і тое, што выходзіць па частый неякосці. Такі список дапамагае залічваць пазнейшыя змены коду чыста і прозрачна. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неякосць должна вказваць на адзін конкрэтны элемент, а не на заплутаны ланцюг задач.
Дзеянне зміцнення 0/811: вымерыце час выканання, класію памылак і колькасць токенаў, якія былі выкарыстоўаны для гэтага пункту, а потым выявіце, чы рашыцца застаўляць змену на адной фіксаванай базе пытанняў, а не на адзінственных прыкладах.
Этап зміцнення 1 працюе лепей, калі яго рассматрываць як параметры, якія можна вымерыць. Запісайце адзін ідеальны прыклад работы, адзін кейс неякосці і прыказку па адваротным запуску, перш чым расширваць сферу дзеяння. Запісвайце часы выканання і кост токенаў або запытаў разам з функцыйнальнымі рэзультатамі. Відразувыя даны пра косцы запобегаюць неспакойным рашчыткам, калі працэс пераходзіць з дэмаверсіі ў спяльныя среды.
Дзеянне паўжасткі 1/811: звярніце увагу на час выканання, клас памылак і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшыцца застаўіць змяну.
Для 2-й стадзіі паўжасткі неабходна перад змянай коду чытко апісаць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыйныя працавнікі должны магчымае перадзвануць гэты крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Таксама неабходна апісаць як шлях успеху, так і шлях вярнення да нормальнага стану. Практыкі павтарэння спроб, людзкія перакрыцця і обработка некоректных паведамленняў є частью самага продукту, а не чымсь, што дадаецца пазней.
Дзеянне паўжасткі 2/811: звярніце увагу на час выканання, клас памылак і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшыцца застаўіць змяну.