Posteado por:
admin
Administrador



MCP – Golden Key pentru automatizarea AI?

Ce este MCP? Cum se acceseaza LLM-urile prin MCP? Cum func?ioneaz? autorizarea MCP? ?i alte aspecte


MCP arat? ca o cheie de Aur pentru a debloca întregul poten?ial al LLM-urilor. De la Google la Microsoft (MCP pe Windows 11) ?i multe între ele. Model Context Protocol — MCP atrage mult hype ?i pare supra-licitat. Are deja câteva starturi false, cum ar fi SSE (care este depreciat în favoarea HTTP Streaming din cauza costului de g?zduire în cloud).

Cu toate acestea, MCP umple un gol pentru integrarea LLM cu apeluri API ?i este suficient de popular pentru a deveni singurul standard care le guverneaz? pe toate. Este pur ?i simplu o modalitate de a v? publica API-urile, cum ar fi prin Swagger, astfel încât LLM-urile s? le poat? în?elege ?i s? poat? genera invoc?ri ale API-ului cu argumente; aproape ca REST; doar c? acesta este prin JSON-RPC ?i este independent de transport, spre deosebire de REST sau Protobuf/gRPC, care se bazeaz? pe HTTP.

Cu toate acestea, toate serverele MCP de la distan?? sunt bazate pe HTTP, în timp ce cele locale comunic? prin conducte numite de intrare/ie?ire standard STDIO.

MCP cu un exemplu de simplu Calculator MCP Server
Modelele de limbaj mari (LLM-uri) sunt foarte puternice – dar nu sunt concepute pentru a fi calculatoare. Ele se lupt? adesea cu opera?ii aritmetice precise sau logice grele.

Deci, dac? în loc s?-i for??m s? calculeze, le-am oferi instrumentul potrivit ori de câte ori se confrunt? cu o sarcin? de calcul?

Aceast? idee nu este nou?. A fost deja implementat în multe feluri. Pornind de la codul generat de LLM pentru a face calculele ?i apoi extragerea acelui cod ?i rularea acestuia într-un sandbox python ?i oferirea rezultatului; sau LLM generând URL-ul sau JSON pentru apelarea unui alt serviciu prin REST sau GRPC ?i apoi extragerea URL-ului sau JSON ?i invocarea serviciului ?i ob?inerea rezultatului; sau poate într-un alt mod mai complicat de atat.

Cu MCP, acest apel de instrument este standardizat. Se bazeaz? pe JSON-RPC.
Are dou? variante; (1) uneltele locale pot fi apelate prin STDIO (pipes). (2) Unelte de la distan?? prin HTTP.

Un mod simplificat de a gândi MCP prin HTTP este c? este aproape ca in cazul REST API. Dar cea mai mare diferen?? este c? REST este stateless, în timp ce MCP este stateful. ?i asta influenteaz? o mul?ime de decizii de proiectare.

MCP este un concept simplu pe care chiar ?i oamenii non-tehnici îl pot în?elege.

Am g?zduit un server MCP simplu în Python în mod liber prin HuggingFace Spaces folosind Docker. Specifica?ia MCP este complex? ?i ave?i nevoie de un framework precum FastMCP pentru a construi serverul pentru Python.

from fastmcp import FastMCP
mcp = FastMCP()
# S? presupunem c? acesta este instrumentul pe care dori?i s?-l expune?i
# Treceti toate tipurile ?i descrierea lor
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
if __name__ == "__main__":
# take host and port from command line
import argparse
parser = argparse.ArgumentParser(description="Run FastMCP server"
parser.add_argument("--host", type=str, default="0.0.0.0", help="Host address (default: 0.0.0.0)"
parser.add_argument("--port", type=int, default=7860, help="Port number (default: 7860)"
args = parser.parse_args()
mcp.run(
transport="streamable-http", # https://github.com/modelcontextprotocol/python-sdk/?tab=readme-ov-file#streamable-http-transport
host=args.host,
port=args.port,
path="/mcp",
log_level="debug",
)
Se expune metoda add

Am facut si un client MCP g?zduit prin Colab, pe care ar trebui s?-l pute?i rula ?i testa.

Este mai u?or de inteles fluxul pe partea de client. În primul rând, ne conect?m la serverul MCP ?i îi cerem s? listeze instrumentele.

async with Client("https://alexcpn-mcpserver-demo.hf.space/mcp/" as client:
await client.ping()
# List available tools
tools = await client.list_tools()
print("Available tools:", tools)
tool_result = await client.call_tool("add", {"a": "1", "b": "2"})
print("Tool result:", tool_result)

Rezultatul este urm?torul.

Available tools: [Tool(name='add', description='Add two numbers', inputSchema={'properties': {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}, 'required': ['a', 'b'], 'type': 'object'}, annotations=None)]
F?r? un framework, acesta este modul în care expunem detaliile instrumentului pe server ?i este posibil s? fi observat c? asta este ceea ce prime?te Clientul. Framework-uri precum FastMCP deduc acest lucru din tipul informa?iilor.

@app.list_tools()
async def list_tools() -> list[types.Tool]:
return [
types.Tool(
name="add",
description=(
"add two numbers and return the result. "

),
inputSchema={
"type": "object",
"required": ["a", "b"],
"properties": {
"a": {
"type": "integer",
"description": "The first number to add",
},
"b": {
"type": "integer",
"description": "The second number to add",
...

Apoi, d?m aceast? ie?ire „tool_result” LLM-ului ?i îi cerem s? genereze o ie?ire JSON adecvat? pentru apelul instrumentului cu argumentele relevante.

a = 123124522
b= 865734234
question = f"Using the tools available {tool_result} frame the JSON RPC call to the tool add with a={a} and b={b}, do not add anything else to the output" + \
"here is the JSON RPC call format {{\"method\": \"<method name>\", \"params\": {{\"<param 1 name>\": {<param 1 value>}, \"<param 2 name>\": {<param 2 value>} etc }}}}"

# Use a simple model like gpt-3.5-turbo
completion = openai_client.chat.completions.create(
model="gpt-3.5-turbo", messages=[
{"role": "user", "content":question }
]
)
# Print the response
print("LLM response:", tool_call)
print(tool_call["method"], tool_call["params"])

Am obtinut JSON-ul de mai jos:

LLM response: {'method': 'add', 'params': {'a': 123124522, 'b': 865734234}}
add {'a': 123124522, 'b': 865734234}
Trimitem acest JSON c?tre serverul LLM prin API-ul de apel al instrumentului MCP Client.

tool_result = await client.call_tool(tool_call["method"], tool_call["params"])
print("Tool result:", tool_result)
Rezultatul de la serverul MCP este mai jos.

Tool result: [TextContent(type='text', text='988858756', annotations=None)]
Simplu si corect – LLM apeleaz? un instrument – mai degrab? LLM ob?ine informa?ii despre un instrument ?i genereaz? semn?tura de apel în format JSON, iar programul nostru folose?te clientul MCP pentru a apela efectiv serverul MCP.

Autorizarea în MCP
MCP utilizeaz? fluxul OAuth2 pentru autorizare. Aceasta înseamn? c? nu trebuie s? v? partaja?i numele de utilizator ?i/sau parola cu niciun client MCP. MCP Client v? redirec?ioneaz? c?tre serverul de resurse, s? zicem un magazin foto sau Gmail sau orice alt serviciu, ?i v? conecta?i la server cu datele de conectare.

Client MCP –> s? spunem Gmail MCP Server (stabili?i o conexiune nesigur?)
Solicita?i login(), serverul MCP trimite un link pentru a face clic cu sessionid-ul de mai sus
Utilizatorul face clic pe link (sau browserul se deschide cu linkul) la serverul Gmail
Utilizatorul introduce acredit?rile Gmail ?i i se arat? c? este conectat
Intern, serverele Gmail apeleaz? serverul Gmail MCP cu ID-ul sesiunii (ro?u ?i îi spune serverului MCP c? ID-ul sesiunii este autentificat
Acum MCP Client –> sesiunea MCP Server este autentificat?
Alte apeluri care au nevoie de autentificare nu au nevoie de niciun token sau cheie secret?, clientul MCP poate solicita utilizatorilor e-mailuri etc
Odat? autentificat, serverul MCP prime?te un apel invers de la serverul de resurse, s? zicem Gmail, prin adresa URL de redirec?ionare ?i marcheaz? intern c? sesiunea SSE sau HTTP Streaming este autentificat?. Restul apelurilor pot fi apoi procesate fiind autentificate.

Otros posts que te van a interesar:

0 Comentarios


Cargando comentarios espera un momento...
No tienes permisos para comentar.

Para poder comentar necesitas estar Registrado. O.. ya tienes usuario? Logueate!
Ir al cielo