Բոլորը MCP- ն դիզայնում են, քանի որ դա AI- ի Rosetta Stone- ը: Diagrams! Whitepapers! Think leaders making TikToks! Բայց որտեղ, իմ սիրելի տվյալների druids, են իրական փաթեթներ: Այստեղ այն է, ինչ է խնամում ինձ: nobody's showing the actual packets. Դա նման է, որ փորձում է ուսուցել սերտիֆիկայի հետ բաղադրիչ պլանտորից: Անհարկե, սերտիֆիկայի պլանտորը *սպատիվ է*, բայց ես ուզում եմ տեսնել քաշը եւ քաշը: Ո՞ր է սերտիֆիկի JSON- ը: Ո՞ր են stdin / stdout բաղադրիչները: Ինչպե՞ս ես պետք է animate իմ ստեղծագործությունը, երբ ես չգիտեմ նույնիսկ լեռը: Դա նման է, որ փորձում է ուսուցել սերտիֆիկայի հետ բաղադրիչ պլանտորից: Անհարկե, սերտիֆիկայի պլանտորը *սպատիվ է*, բայց ես ուզում եմ տեսնել քաշը եւ քաշը: Ո՞ր է սերտիֆիկի JSON- ը: Ո՞ր են stdin / stdout բաղադրիչները: Ինչպե՞ս ես պետք է animate իմ ստեղծագործությունը, երբ ես չգիտեմ նույնիսկ լեռը: Խնդրում ենք սովորել պրոֆիլը առանց մետաղալարների, ինչպիսիք են փորձելով սովորել փաթեթավորման PowerPoint- ից: Give me the electrons or give me death. Այժմ, որ մենք ունենք մեր մանտրա, նստենք! - Ի՞նչ է ձեր բիզնես մոդելը: Ձեր MCP բիզնես պլան: MCP- ի ուսուցում ??? (... մի գեղեցկություն կատարվում է...) Արդյունքները Արդյոք, դա այնպես է, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է այնպես, որ սեղմվում է: Շնորհակալություն... # Դուք չեք միասին։ Նշվում է, որ մանրամասներ մանրամասներ են թռված այս կոչված Model Context Protocol- ում: Բոլորը խոսում են LLM- ների զարգացման մասին, գործիքային զանգահարման մասին, գործառույթային զանգահարման մասին, երկու ուղղակի այս եւ հնարավորության մասին: Ես, իհարկե, ոչ մի տարբերություն եմ: Բայց մեկ բան կանգնած էր իմ բարդը, քանի որ ես նայթել եմ այս երջանիկ փոշի ճանապարհը: "What's this look like ON THE WIRE???" Հավատում է, որ ամբողջ պրոֆիլը գրված է «Ես չգիտեմ, թե ես ուզում եմ Ես ցանկանում եմ զգալ, թե ինչպես է Dr. Frankenstein- ը ցանկանում լինել իմ golem- ում, մուտքի եւ բոլորի հետ: Ես չգիտեմ, թե ինչ է անում մի այլ սենմենտիկ սենմենտային սենմենտը, որը անում է BNF- ի սենմենտային գրասենյակը: ModelContextProtocol.io Վիքիպահեստում see Ոչ, թե ես, պարզապես տունավորը, որը պետք է մոռացվել է, մինչեւ ես այնպիսին բացել եմ: Հիմնական համոզվածություններ սենյակից MCP- ը շատ, շատ նոր է: Մխիթարում է. կարող է դեռ մխիթարել: Հիմա մի օր, ամբողջ գրքեր կգիտեն իր ներքին քաղաքականության մասին, ինչպիսիք են մի տեսակի թվային constitutional convention- ը: Եհովանաբար, այդ գրքերը վաճառվում են որպես NFT- ը: Բայց մի բան, որ ամենից ավելի կարեւոր է: Tool Calling- ը ամեն ինչ պետք է Եթե մենք կոտրում ենք ճանապարհը, ճանապարհը այս միավոր, կարեւոր օգտագործման Case- ում Դուք կարող եք անում a Մենք կարող ենք հեշտացնել, մինչեւ մենք տեսնում ենք համակարգի գեղեցիկ բաղադրիչը: միայն 4 հաղորդագրական տեսակի է արտադրանքի համար, եւ երեք է ներառման համար. (Մենք բացահայտենք, թե ինչու մանրամասները պարզապես չգիտեն միասին մի քիչ հետո.) tool invocation Շատ Հիմնական Հիմնական գործիքներ / List գործիքներ / Call (Այս 3 արդյունքները, որոնք վերադառնալ են) Դուք կարող եք հասկանալ ամբողջ պտուտակը, գիտելով այս 7 հաղորդագրությունների մասին: Արդյոք ժամանակը (տեսանյութ) ) ModelContextProtocol.io Վիքիպահեստում ModelContextProtocol.io Վիքիպահեստում Մենք օգտագործենք — մի պարզ MCP սերվերի օրինակ, որը թույլ է տալիս Ձեզ փոստի նախընտրական եւ վկայական տվյալները. Դուք կարող եք գտնել այն իրենց GitHub այստեղ: [ Արդյոք weather.py https://github.com/modelcontextprotocol/quickstart-resources/blob/main/weather-server-python/weather.py Տեսեք, թե ինչ է տեղի ունենում «Այս գծի վրա», երբ դուք խոսում եք այս բանից: Առաջին: MCP է Դա նշանակում է, որ spec- ը չգիտ է, թե ինչպես դուք կապնեք սերվերի հետ: HTTPS- ը: Web Sockets- ը: Nameed pipes- ը: Արդյոք դուք չգիտեք, թե ինչպես եք կապնվել սերվերի հետ: Տրանսպորտը անգլերեն է։ Հիմնականում, ամենամասնագույն մեթոդը այն է, որ սերվերը սկսել է մի subprocess- ում եւ փոխանցել եւ Այսպիսով, դուք ստանում եք մի գեղեցիկ փոքր անձնական հաղորդագրության canal. (Technically full-duplex, բայց եթե դուք ավելացնել , մենք պետք է կոչենք այն 1.5-duplex, որ լավ է) stdin stdout stderr Ինչպե՞ս են հաղորդագրությունները թռչվում MCP- ը օգտագործում է JSON-RPC 2.0- ում: Այսպիսով դուք կարող եք պահանջել / պատասխանել protocol- ում, ինչպես նաեւ հաղորդագրություններով: Ամեն հաղորդագրությունը ուղարկվում է որպես մեկ JSON- ի գծի համար: Դա նման է թվային հեռախոսային ծառայության վրա, որտեղ յուրաքանչյուր գծը մի ամբողջական նշանակության փաթեթ է: Արդյոք դա spec- ում է, թե ինչ-որ բան, ոչ թե իրականում: spec- ում այն բաց է: Բայց այս newline-delimited JSON- ը ստանդարտ է. «Stdin/Stdout Considered Harmful»-ի մայթը Այո, դուք կարող եք գտնել որոշ բլոգի գրքեր, որոնք հավատում են, որ այս մոդելը «նշավ է» կամ «նշավ չէ»: «STDIN/STDOUT MCP COMMUNICATION CONSIDERED SHARMFUL» Մենք չենք ցանկանում թռչել լաբորատորում, թե՞ մենք: Ինչո՞ւ են մարդիկ ասում այս բան, եթե դա չի ճիշտ: Դուք տեսնում եք, Ye Olden Times- ում, շատ երկար գծեր կարող են պատճառել փոշի վերահսկողություն (հա, Morris Worm)): Շնորհակալաբար, ամենամեծ ժամանակակից ծրագրային ապահովման համար այս խնդիրը չի հասանելի (հա շատ! Աղջիկները վերահսկվում են!). Մոդելային JSON- ի փոստիչները այնպես էլ արագ եւ հզոր են: Դուք ցանկանում եք ուղարկել 256MB ջերմաստիճանի հաղորդագրություն: Գնեք այն համար: պարզապես... կարող եք ոչինչ անել ամեն δευτερο. Այս երաշխիքները սովորաբար ապրում են մարդկանցից, ովքեր manually wiring file descriptors in C. You are not doing that. You are using Python. Մոդուլ, որը ստեղծվել է ճիշտ այս տեսակի աշխատանքների համար: subprocess # fork off an MCP subprocess import subprocess as sp # Redirect stderr to /dev/null stderr = sp.DEVNULL # Start the weather.py process process = sp.Popen( ["uv", "run", "weather.py"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=stderr ) Արդյոք ամեն ինչ անում է Python- ում: Ոչ այլ փաթեթներ: Բաղադրիչները ներառում են: Դա Մոդուլը փոխարինում է երեխաների I/O ռեժիմները խողովակների հետ, այնպես էլ կարող ենք ուղարկել մեր նոր գործընթացային Signals, եթե մենք ուզում ենք: subprocess Այժմ մենք վերջապես պատրաստ ենք գործել protocol science- ը, ինչպիսիք են proper digital necromancer! Հիմնական հոդված՝ «It’s Embarrassingly Simple» MCP- ը, բոլոր իր բիզնեսի կոճի եւ կոճի regalia- ում, պարզապես այս է: YOU: "Hello, I speak robot." SERVER: "Delightful. I also speak robot." YOU: "Excellent, we both can speak robot!" YOU: "What tricks can you do?" SERVER: "I can juggle and summon storms." YOU: "Storm, please!" SERVER: "⛈️ As you wish." Այս ամբողջ протоколը պարզապես շատ ձեւավոր է, թե ինչ-որ բան անել, եւ ստանալ հավասարություն, որ նրանք անել. Արդյոք, ամենը, ինչ պետք է անել, այն է, ինչ պետք է անել այս հեշտ եւ հեշտ բաղադրիչի հետ. 7 Բարձր բարդություն. Դա այն է. Հիմնական հոդված՝ Stitching the Monster Together: A Working Prototype «Մենք պետք է անում ենք ջերմաստիճանի սերվեր եւ հարցնում ենք այն, թե ինչպես պետք է ճշգրտական թվային գիտնական»: Սեղմություն #1: Լավագույն մեթոդը հասկանալ մի պտուտակն է սխալավորել այն, մինչեւ այն վախենում է, ապա սխալավորել այն, մինչեւ այն համագործակցում է. աշխատում է կոդը, տրանսպորտային պտուտակներ, եւ երբեմն հին Subarus. Սեղմություն #1: Լավագույն մեթոդը հասկանալ մի պտուտակն է սխալավորել այն, մինչեւ այն վախենում է, ապա սխալավորել այն, մինչեւ այն համագործակցում է. աշխատում է կոդը, տրանսպորտային պտուտակներ, եւ երբեմն հին Subarus. Tip #2: Եթե դուք վախենում եք ձեր LLMs- ում, ես չգիտեմ, թե ինչ է կատարվում ձեզ համար The After Times When AI Taketh Over- ում: Tip #2: Եթե դուք վախենում եք ձեր LLMs- ում, ես չգիտեմ, թե ինչ է կատարվում ձեզ համար The After Times When AI Taketh Over- ում: Արդյոք, թե ինչ է այն, թե ինչ է այն, թե ինչ է այն: # Behold! We create life! # (fork off an MCP subprocess) import subprocess # Start the weather.py process # Use `uv run` to execute the script in the uv environment # Redirect stdin, stdout to PIPE for communication # Redirect stderr to DEVNULL to suppress error messages process = subprocess.Popen( ["uv", "run", "weather.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=stderr) # Behold! We create life! process = subprocess.Popen( ["uv", "run", "weather.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL # Silence the screams ) Դա Մոդուլը փոխարինում է երեխաների I / O ռեժիմները խողովակների հետ, որը թույլ է տալիս ձեզ ամբողջական վերահսկողությունը խոսքի վրա: Դա գեղեցիկ պարզ է: Դուք այժմ ունեք մասնավոր երեխաների գործընթացը ձեր կանգնածով եւ կանգնածով, պատրաստ է կատարել այն, ինչ դուք կանգնեք այն. subprocess Դուք կարող եք նույնիսկ ուղարկել սխալներ, որոնք իրականում ցույց են տալիս, թե ով է Boss. Լավագույն մասը: Հիմնական պայմաններում, երբ ծննդյան գործընթացը հեռանում է, երեխանը նստում է նավթի հետ, այնպես որ դուք չեք պետք է վախենում ձեր համակարգը (հա, հիմնականում). Դուք կարող եք տեսնել, որ մենք օգտագործում ենք Արդյոք, այն պետք չէ, բայց Արդյոք, եթե դուք դեռ չգիտեք այն, դուք միշտ պետք է - դա խաղային փոխանակիչ. Quick aside uv uv Եթե դուք դեռ օգտագործում եք pip, մենք պետք է խոսել. Եթե դուք դեռ օգտագործում եք Մենք պետք է խոսենք. pip Հիմնական հոդված՝ The Awkward First Date Բոլոր լավ հարաբերություններ սկսվում են միասին identifying.We will begin by announcing ourselves (կամ մի քենդին): # Define the initialize request init_request = { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-03-26", "capabilities": {}, "clientInfo": { "name": "MyMCPClient", "version": "1.0.0" } } } Սա մեր — Առաջին փաթեթը, որը մենք ուղարկել ենք հաղորդագրության ստեղծելու համար: Այն ասում է սերվերին երեք կարեւոր բաները: Մենք խոսում ենք MCP- ի մասին, որ տարբերակը մենք օգտագործում ենք, եւ թե ինչ հզորությունները մենք մտնում ենք սենյակին: Պահպանել է Դա JSON-RPC 2.0- ի ձեւաչափով է, եւ այն կունենա ամբողջ մեր խոսքի ընթացքում սերվերի հետ: Բոլոր հաղորդագրությունները, բոլոր պատասխանները — բոլոր JSON-RPC 2.0- ը: Let's fire it off. import json def send_mcp_request(process, request): """Sends a JSON-RPC request to the subprocess's stdin.""" json_request = json.dumps(request) + '\n' # Add newline delimiter process.stdin.write(json_request.encode('utf-8')) process.stdin.flush() # Ensure the data is sent immediately # 1. Send the initialize request print("Sending initialize request...") send_mcp_request(process, init_request) Մենք պետք է տեսնել այս արտադրանքը: Sending initialize request... Այժմ, լսենք, թե ինչ է ասում սերվերը ամեն ինչից: def read_mcp_response(process): """Reads a JSON-RPC response from the subprocess's stdout.""" # Assuming the server sends one JSON object per line line = process.stdout.readline().decode('utf-8') if line: print(" . . . len is", len(line)) return json.loads(line) return None print("Sending initialized request...") send_mcp_request(process, notified_request) Ծառայողը, քանի որ հագուստ է, վերցնում է իր կյանքը: . . . len is 266 Received response after initialization:{'id': 1, 'jsonrpc': '2.0', 'result': {'capabilities': {'experimental': {}, 'prompts': {'listChanged': False}, 'resources': {'listChanged': False, 'subscribe': False}, 'tools': {'listChanged': False}}, 'protocolVersion': '2025-03-26', 'serverInfo': {'name': 'weather', 'version': '1.9.4'}}} «Ես մի ջերմաստիճանի սերվեր եմ, ես չգիտեմ, որ իմ հզորությունները անմիջապես փոխվի խոսքով, եւ ես Definitely չգիտեմ, որ քեզ չգիտեմ». Translation Այն համատեղում է պտուտակային տարբերակը տեղեկատվություն եւ հիմնական տեղեկություններ, բայց Արդյոք, այն է իրական գինը. So, what's the server actually telling us here? capabilities Մենք չգիտենք այս մոդելային կարողությունները, բայց ստուգեք այս: Մենք Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր / Գլխավոր կարող է «Մենք պետք է անում ենք, թե ինչպես պետք է անում ենք» (տեսանյութ) «Մենք պետք է անում ենք, թե ինչպես պետք է անում ենք» (տեսանյութ) Արդյոք, դուք կարող եք ընտրել եւ ընտրել, թե ինչ մասերը պտուտակ է տեղադրել, բայց եթե դուք ցանկանում եք խաղալ լավ հետ այլ MCP գործիքների, դուք ավելի լավ կանգնեք spec. API separation Alright, we're connected and ready to rock, right? Wrong. Սերվորը դեռ տանում է այնտեղ, կտրում է իր թվային կոճակը, սպասում է մեզ ավարտելու համար: Մենք պետք է ուղարկել «Այս լավը մեր վերջում»: notified_request = { "jsonrpc": "2.0", "method": "notifications/initialized" } Ահա JSON-RPC- ի ձեւը, որը ասում է, որ «դացեք եւ մոռացեք» - ոչ մի պատասխանը, որը կարիքվում է կամ պահանջվում է: Ահա մի քանի տարբերություն, ինչպիսիք են սովորական պահանջ / պատասխանը, որը մենք կատարում ենք: Տեսեք այն, ինչպիսիք են ACK փաթեթը: «Hey server, I’m ready to roll!» Notice the missing id notification No id- ը նշանակում է: «Այս հարցին չեք պատասխանել, ես հավատում եմ, որ դուք գիտեք, թե ինչ պետք է անել այս տեղեկատվության հետ». «Այս հարցին չեք պատասխանել, ես հավատում եմ, որ դուք գիտեք, թե ինչ պետք է անել այս տեղեկատվության հետ»: Ոչ id Երբեմն... վերադառնալ ranch- ում... (բեռնել պատմությունը!) Երբեմն... վերադառնալ ranch- ում... (բեռնել պատմությունը!) Տեսեք, որ սերվերը, քանի որ հարմարավետ է, արդեն պատասխանել է իր հզորության մանրամասով: Մենք ցանկանում ենք հավատալել. Ահա, մենք հավատում ենք: Ահա, մենք պետք է պատրաստ ենք խաղալ. # yes we are indeed ready to party # Acknowledge the server so it knows we approve print("// Sending initialized request...") send_mcp_request(process, notified_request) Այժմ սերվերը գիտի, որ սկսում է սպասել պահանջները: «Տեսեք ինձ, թե ինչ եք ստացել» Ժամանակն է տեսնել, թե ինչ խաղալիքները այս սերտիֆիկը տվել է խաղային տարածքում: tools_list_request = { "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": { } } # 2. Send the tools/list request print("// Sending tools/list request...") send_mcp_request(process, tools_list_request) Մենք ստանում ենք ճիշտ այն արտադրանքը, որ մենք ցանկանում ենք: Perfect! // Sending tools/list request... Այժմ, նայենք վերցնել արտադրանքը... Ժամանակն է տեսնել, թե ինչ բաղադրիչները մենք գտնել ենք: # Read the server's response to the tools/list request tools_list_response = read_mcp_response(process) print("// Received tools list response:", end='') pprint(tools_list_response) Մեր սերտիֆիկը հպարտորեն ցույց է տալիս իր ապրանքները: նախընտրություններ, предупреждения, եւ այլ meteorological սխալներ. . . . len is 732 // Received tools list response:{'id': 2, 'jsonrpc': '2.0', 'result': {'tools': [{'description': 'Get weather alerts for a US state.\n' '\n' ' Args:\n' ' state: Two-letter US state code ' '(e.g. CA, NY)\n' ' ', 'inputSchema': {'properties': {'state': {'title': 'State', 'type': 'string'}}, 'required': ['state'], 'title': 'get_alertsArguments', 'type': 'object'}, 'name': 'get_alerts'}, {'description': 'Get weather forecast for a location.\n' '\n' ' Args:\n' ' latitude: Latitude of the ' 'location\n' ' longitude: Longitude of the ' 'location\n' ' ', 'inputSchema': {'properties': {'latitude': {'title': 'Latitude', 'type': 'number'}, 'longitude': {'title': 'Longitude', 'type': 'number'}}, 'required': ['latitude', 'longitude'], 'title': 'get_forecastArguments', 'type': 'object'}, 'name': 'get_forecast'}]}} Whoa! Դա մի Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված Շատ Դա մեր ալյումինա - յուրաքանչյուր ալյումինա ներառում է մի գործիք, որը LLM- ը կարող է վերցնել: (Մենք կարող ենք վերցնել նրանց, որը ճիշտ է այն, ինչ մենք անում ենք այժմ!) See that tools Խաղատություն: «բացուցման» տարածքները այն են, թե ինչպես ձեր LLM- ը որոշում է, թե ինչ գործառույթը կտա: Տեսեք այն, ինչպես Tinder- ը գործիքների համար, ձեր AI- ը տեսնում է իր հեռախոսը, փորձելով որոշել, թե ինչպես պետք է փնտրել փնտրում կամ ճիշտ: Խաղատություն: «բացուցման» տարածքները այն են, թե ինչպես ձեր LLM- ը որոշում է, թե ինչ գործառույթը կտա: Տեսեք այն, ինչպես Tinder- ը գործիքների համար, ձեր AI- ը տեսնում է իր հեռախոսը, փորձելով որոշել, թե ինչպես պետք է փնտրել փնտրում կամ ճիշտ: OpenAI- ը առաջին անգամ փորձել է այս համար `պակատիվ զանգահարել`, որը... Բայց ցանկացած վայրում ճանապարհի ընթացքում, արդյունաբերությունը միասին որոշել է, որ «սարքավորումներ» խոսում են ավելի գեղեցիկ (կա կարող է լինել ավելի հարմարավետ?), եւ այժմ մենք կոչում ենք ամբողջ դիզայնը «սարքավորումներ calling». One interesting side note տեխնիկական Anatomy of a tool (pay attention, this is where the magic lives): Հիմնական անունը: Այս գործառույթի իրական անունը — այստեղ չի կարող տպագրել: Այս գործառույթի վերջնական, canonical անունը: Մենք օգտագործում ենք այն, որ օգտագործում է այս գործառույթը, երբ մենք կոչում ենք այն: Պարզ անգլերեն է LLM- ի համար (հարկե այն է, ինչ AI- ը տեսնում է, երբ որոշում է, թե ինչպես է օգտագործել ձեր գործիք) inputSchema: JSON Schema- ը որոշում է, թե ինչ պարամետրերը անհրաժեշտ են Արդյոք ամեն ինչ պարզապես վերցնում է «լուսանկարներ» եւ հույս է լավագույնը անունը Նկարագրություն Ապրիլ արտադրանքը Երբ մենք բոլորը հիմնականում JSON- ից վերցնում ենք, որը փաթեթավորվում է սերտիֆիկների մեջ, եւ դադարում ենք, որ դա դիզայնի ընտրություն է: Դա նման է Wild West- ում, բայց ավելի տեսակի անվտանգության վտանգության հետ: Հիմնական գործառույթները կարող են վերադարձնել ցանկացած տեսակը, իսկ Unix- ի գրասենյակային գործառույթները (հարկ է, որ անունը մի քանի անգամ նշանակում է) պարզապես տպագրություն են խմում: Հիմնականապես, այն հիմնականում JSON- ը է կոճի տակ, այնպես որ դեռ կա կառուցվածքը, որը կոճում է ներքեւ տարածքում: Որոշ մոդելները նույնիսկ ունեն փոխանակներ JSON- ի արտադրանքի համար, այնպիսին, այնպիսին, ձեր LLM- ը կարող է կարդալ պլաստակված տվյալները ամեն անգամ: Այնպիսին, գործիքները կարող են վերցնել պարզ տեքստը, CSV- ը, HTML- ը, կամ նույնիսկ ինչ-որ բան: Multi-modal մոդելները կարող են նույնիսկ վերցնել audio, images, video, կամ Live Object Detection feed- ը - հնարավորությունները գեղեցիկ պլաստիկ են: Բարի, մենք ստացել ենք մեր գործիքային կոճակը բեռնել. Տեսեք մեր առաջին MCP գործիքային կոճակը! Ապրիլ 4 - Հավատության ժամանակը Իհարկե, մենք ունենք մի ցուցակ գործիքներ, այժմ ինչ? Մենք ընտրում ենք մի գործիք. Let’s pick Արդյոք, եթե մենք ունենք GPS- ի տվյալները, մենք չենք պետք լայնությունը եւ լայնությունը: Այն կլինի ավելի լավ ընտրություն. get_alerts get_forecast tools_call_request = { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "get_alerts", "arguments": { "state": "TX" } } } Ես ընտրել եմ Teksas- ը, քանի որ այնտեղ ամեն ինչ ավելի մեծ է, այդ թվում, ջերմաստիճանի սխալները: Կարդալ, կանգնեք, թե ինչու է դա «tools/call» եւ ոչ «tool/call»? Մեկ Բացի այդ, «tool/call»- ը անգլերենում ավելի բնական է, բայց, իհարկե, միասնականությունը այլ endpoints- ի հետ հաղթում է: Բացի այդ, spec-ը ասում է «tools/call», այնպես որ... մենք սեղմում ենք, ինչպես լավ փոքր դիզայններ: Երբ բոլոր մեր տվյալների կոճակները միավոր են, մենք կարող ենք տպել Big Red Button- ը: # 3. Send the tools/call request print("// Sending tools/call request...") send_mcp_request(process, tools_call_request) # Read the server's response to the tools/call request tools_call_response = read_mcp_response(process) print("// Received tools call response:", end='') pprint(tools_call_response) [BEEP BEEP BOOP BOOP] (Անհա այն գլուխը, որը Big Red Button-ը կատարում է) ] [Drumroll please Ծառայողը մտածում է... մշակել... եւ... եւ... ] [And the crowd goes wild! Ահա! Real weather data materializes. Alerts, թռիչքներ, թռիչքներ, աշխատում է. Բոլորը փաթեթավորվել է կառուցված JSON- ում, նույնպես, ինչպես ձեր սերտիֆիկը կարգավորել է: (լուծվել է, ոչ ոք չի ուզում տեսնել 11 էջերը JSON- ի բաղադրիչների) // Sending tools/call request... . . . len is 51305 // Received tools call response:{'id': 3, 'jsonrpc': '2.0', 'result': {'content': [{'text': '\n' 'Event: Flood Advisory\n' 'Area: Hidalgo, TX; Willacy, TX\n' 'Severity: Minor\n' 'Description: * WHAT...Flooding caused by ' 'excessive rainfall continues.\n' '\n' '* WHERE...A portion of Deep South Texas, ' 'including the following\n' 'counties, Hidalgo and Willacy.\n' '\n' '* WHEN...Until 245 PM CDT.\n' '\n' '* IMPACTS...Minor flooding in low-lying and ' 'poor drainage areas.\n' '\n' '* ADDITIONAL DETAILS...\n' '- At 205 PM CDT, Doppler radar indicated ' 'heavy rain due to\n' 'thunderstorms. Minor flooding is ongoing or ' 'expected to begin\n' 'shortly in the advisory area. Between 2 and ' '5 inches of rain\n' 'have fallen.\n' '- Additional rainfall amounts up to 1 inch ' 'are expected over\n' 'the area. This additional rain will result ' 'in minor flooding.\n' '- Some locations that will experience ' 'flooding include...\n' 'Harlingen, Elsa, Edcouch, La Villa, Lasara, ' 'La Villa High\n' 'School, Monte Alto, Jose Borrego Middle ' 'School, Satiago\n' 'Garcia Elementary School, Edcouch Police ' 'Department, Edcouch\n' 'City Hall, Edcouch Volunteer Fire ' 'Department, Edcouch-Elsa\n' 'High School, Laguna Seca, Carlos Truan ' 'Junior High School,\n' 'Elsa Police Department, Lyndon B Johnson ' 'Elementary School,\n' 'Elsa Public Library, Olivarez and Lasara ' 'Elementary School.\n' '- http://www.weather.gov/safety/flood\n' "Instructions: Turn around, don't drown when " 'encountering flooded roads. Most flood\n' '\n' 'The next statement will be issued Tuesday ' 'morning at 830 AM CDT.\n', 'type': 'text'}], 'isError': False}} Նշեք, որ —Երբեք ստուգեք այս փաթեթը, եթե դուք չեք սիրում սխալավոր սխալները սխալում 3 AM- ում: Victory! isError: false Դա լավ է: Մենք ստանում ենք clean string տվյալները վերցնել (լուսանկարներ, որպեսզի բաղադրել բաները), որը մեզ առաջարկում է տարբերակներ: Մենք կարող ենք փրկել այս ջերմաստիճանի տվյալները եւ նստել այն համար LLM, կամ պարզապես անցնել սխալ պատասխանը հետ, եւ թույլ տալով մոդելը տեսնել այն. Շատ տեղադրումներ գնում են վերջին նստագրության հետ - ինչու պետք է լրացուցիչ աշխատանք, երբ LLMs շատ լավ են փրկել պտուտակային տեքստը: Բայց եթե դուք ստեղծում եք ինչ-որ բնական բան, սարքավորումների արտադրանքի նախընտրում կարող է լինել շատ հզոր: Դուք կարող եք ձեւավորել այն, սեղմել այն, համատեղել այն այլ տվյալների աղբյուրների հետ, կամ փոխել այն ճիշտ այն է, ինչ ձեր ծրագիրը պետք է: Մենք հաջողությամբ գրանցել ենք MCP սերվեր, սկսել ենք կապը, զանգահարել ենք մի գործիք, եւ մշակել ենք արդյունքները: Բոլոր MCP խաղերը, մանրաթելից մանրաթելից մանրաթելային վերահսկողության համար: Արդյոք ձեր աչքերը դեռ տաք են: And that's a wrap! The Full Monty: Ձեր ամբողջական MCP հաճախորդը Ահա ամբողջ գեղեցիկ սերտիֆիկը մի միասին: import subprocess import json from pprint import pprint def send_mcp_request(process, request): json_request = json.dumps(request) + '\n' process.stdin.write(json_request.encode('utf-8')) process.stdin.flush() def read_mcp_response(process): line = process.stdout.readline().decode('utf-8') return json.loads(line) if line else None requests = { 'init': { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-03-26", "capabilities": {}, "clientInfo": {"name": "MyMCPClient", "version": "1.0.0"} } }, 'initialized': { "jsonrpc": "2.0", "method": "notifications/initialized" }, 'list_tools': { "jsonrpc": "2.0", "id": 2, "method": "tools/list" }, 'call_tool': { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "get_alerts", "arguments": {"state": "TX"}} } } process = subprocess.Popen( ["uv", "run", "weather.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL ) try: send_mcp_request(process, requests['init']) pprint(read_mcp_response(process)) send_mcp_request(process, requests['initialized']) send_mcp_request(process, requests['list_tools']) tools = read_mcp_response(process) print("Available tools:", [t['name'] for t in tools['result']['tools']]) send_mcp_request(process, requests['call_tool']) result = read_mcp_response(process) print("Weather alert received:", len(result['result']['content'][0]['text']), "characters") finally: process.terminate() Մեծ բացահայտությունը You just built an MCP client using nothing but Python's standard library. Ոչ գլուխներ. Ոչ արտաքին բաղադրիչներ. Ոչ գլուխներ. պարզապես subprocess խողովակներ եւ JSON — նույն գործիքները, որոնք դուք ունեք, քանի որ Python 2.7. Դա «պատակարարման պատրաստ» է: Իհարկե? Ոչ շատ — բայց դա խուսափելի է, որ մոտ է. Եթե դա Claude- ը խոսում է ձեր բազայի հետ, GPT-4- ը զանգահարում է ձեր APIs- ում, կամ որոշ startup- ի «պլատֆորմացիայի AI աշխատանքային պլատֆորմացիա» - այն ամենից հետո, դա պարզապես այս է: Spawn process. Send JSON. Read JSON. Repeat. Դա այնպես է, որ գտնել Wizard of Oz- ը պարզապես մի աղջիկ է, որը լավ ալյումային համակարգի է: Դա այնպես է, որ գտնել Wizard of Oz- ը պարզապես մի աղջիկ է, որը լավ ալյումային համակարգի է: Հաջորդը Հաջորդը Հաջորդը Հաջորդը Հաջորդը Հաջորդը Հաջորդը Այժմ, որ դուք տեսել եք ծածկույթը ծածկույթը (կոտում), դուք կարող եք: Բարձրացնել Custom MCP սերվերներ, որոնք կատարում են ձեր առաջարկը (լուսանկարներ) Debug MCP կապներ, ինչպիսիք են ցանցային necromancer- ը, երբ նրանք անհանգստորեն կախված են ամենամեծ հնարավոր ժամանակում Դիզայնել ավելի լավ գործիքներ, գիտելով, թե ինչպես ճիշտ LLMs օգտագործել ձեր մետատանետներ Գրեք ավելի լավ գործիքներ, որոնք այնքան բացահայտված են, որ ձեր LLM-ները սիրում են Optimize the hell out of everything, քանի որ դուք հասկանում եք protocol overhead Արդյոք, դուք պարզապես կոտրեք ձեր սննդի սննդի սննդի: Ես չգիտեմ. Լավագույն բացահայտություն The miracle in step 2 of your business plan? It was you, all along. Արդյոք, ինչպե՞ս է ձեր բիզնես ծրագրի 2-րդ սերտիֆիկը: Դա դուք, ամբողջ ժամանակը. Տեսեք, թե ինչ-որ բան բնական է. Արդյոք դուք ուզում եք տեսնել այս կոդը գործում: The complete example lives here: [https://gitlab.com/-/snippets/4864350] https://gitlab.com/-/snippets/4864350 https://gitlab.com/-/snippets/4864350?embedable=true