{"id":442,"date":"2025-06-06T11:45:01","date_gmt":"2025-06-06T11:45:01","guid":{"rendered":"https:\/\/reduceri.la\/blog\/?p=442"},"modified":"2025-06-06T11:45:02","modified_gmt":"2025-06-06T11:45:02","slug":"mcp-golden-key-pentru-automatizarea-ai","status":"publish","type":"post","link":"https:\/\/reduceri.la\/blog\/agenti-ai\/mcp-golden-key-pentru-automatizarea-ai\/","title":{"rendered":"MCP \u2013 Golden Key pentru automatizarea AI?"},"content":{"rendered":"\n<p>Ce este MCP? Cum se&nbsp;<a href=\"https:\/\/mersi.ai\/\">acceseaza LLM-urile prin MCP<\/a>? Cum func\u021bioneaz\u0103 autorizarea MCP? \u0219i alte aspecte<\/p>\n\n\n\n<p>MCP arat\u0103 ca o cheie de Aur pentru a debloca \u00eentregul poten\u021bial al LLM-urilor. De la Google la Microsoft (<strong>MCP pe Windows 11<\/strong>) \u0219i multe \u00eentre ele.&nbsp;<strong>Model Context Protocol<\/strong>&nbsp;\u2014 MCP atrage mult hype \u0219i pare supra-licitat. Are deja c\u00e2teva starturi false, cum ar fi&nbsp;<a href=\"https:\/\/www.reddit.com\/r\/mcp\/comments\/1jsx438\/mcp_on_cloudflare_is_too_expensive\/\">SSE<\/a>&nbsp;(care este depreciat \u00een favoarea HTTP Streaming din cauza costului de g\u0103zduire \u00een cloud).<\/p>\n\n\n\n<p>Cu toate acestea, MCP umple un gol pentru integrarea LLM cu apeluri API \u0219i este suficient de popular pentru a deveni singurul standard care le guverneaz\u0103 pe toate. Este pur \u0219i simplu o modalitate de a v\u0103 publica API-urile,&nbsp;<a href=\"https:\/\/binance.github.io\/binance-api-swagger\/\">cum ar fi prin Swagger,<\/a>&nbsp;astfel \u00eenc\u00e2t LLM-urile s\u0103 le poat\u0103 \u00een\u021belege \u0219i s\u0103 poat\u0103 genera invoc\u0103ri ale API-ului cu argumente; aproape ca REST; doar c\u0103 acesta este prin JSON-RPC \u0219i este independent de transport, spre deosebire de REST sau Protobuf\/gRPC, care se bazeaz\u0103 pe HTTP.<\/p>\n\n\n\n<p>Cu toate acestea, toate serverele MCP de la distan\u021b\u0103 sunt bazate pe HTTP, \u00een timp ce cele locale comunic\u0103 prin conducte numite de intrare\/ie\u0219ire standard STDIO.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">MCP cu un exemplu de simplu Calculator MCP Server<\/h4>\n\n\n\n<p><em>Modelele de limbaj mari (LLM-uri) sunt foarte puternice \u2013 dar nu sunt concepute pentru a fi calculatoare.<\/em>&nbsp;Ele se lupt\u0103 adesea cu opera\u021bii aritmetice precise sau logice grele.<\/p>\n\n\n\n<p>Deci, dac\u0103 \u00een loc s\u0103-i for\u021b\u0103m s\u0103 calculeze,&nbsp;<strong>le-am oferi instrumentul potrivit&nbsp;<\/strong>ori de c\u00e2te ori se confrunt\u0103 cu o sarcin\u0103 de calcul?<\/p>\n\n\n\n<p>Aceast\u0103 idee nu este nou\u0103. A fost deja implementat \u00een multe feluri. Pornind de la codul generat de LLM pentru a face calculele \u0219i apoi extragerea acelui cod \u0219i rularea acestuia \u00eentr-un sandbox python \u0219i oferirea rezultatului; sau LLM gener\u00e2nd URL-ul sau JSON pentru apelarea unui alt serviciu prin REST sau GRPC \u0219i apoi extragerea URL-ului sau JSON \u0219i invocarea serviciului \u0219i ob\u021binerea rezultatului; sau poate \u00eentr-un alt mod mai complicat de atat.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Cu MCP, acest apel de instrument este standardizat. Se bazeaz\u0103 pe JSON-RPC.<\/h5>\n\n\n\n<p>Are dou\u0103 variante; (1) uneltele locale pot fi apelate prin STDIO (pipes). (2) Unelte de la distan\u021b\u0103 prin HTTP.<\/p>\n\n\n\n<p>Un mod simplificat de a g\u00e2ndi MCP prin HTTP este c\u0103 este aproape ca in cazul REST API. Dar cea mai mare diferen\u021b\u0103 este c\u0103 REST este stateless, \u00een timp ce&nbsp;<strong>MCP este stateful.<\/strong>&nbsp;\u0218i asta influenteaz\u0103 o mul\u021bime de decizii de proiectare.<\/p>\n\n\n\n<p><strong>MCP este un concept simplu pe care chiar \u0219i oamenii non-tehnici \u00eel pot \u00een\u021belege.<\/strong><\/p>\n\n\n\n<p>Am g\u0103zduit un&nbsp;<a href=\"https:\/\/huggingface.co\/spaces\/doreloprisan\/mcpserver-demo\/tree\/main\">server MCP simplu<\/a>&nbsp;\u00een Python \u00een mod liber prin&nbsp;<a href=\"https:\/\/huggingface.co\/new-space\">HuggingFace Spaces<\/a>&nbsp;folosind Docker. Specifica\u021bia MCP este complex\u0103 \u0219i ave\u021bi nevoie de un framework precum&nbsp;<a href=\"https:\/\/fastapi-mcp.tadata.com\/getting-started\/welcome\">FastMCP<\/a>&nbsp;pentru a construi serverul pentru Python.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from fastmcp import FastMCP\nmcp = FastMCP()\n# S\u0103 presupunem c\u0103 acesta este instrumentul pe care dori\u021bi s\u0103-l expune\u021bi\n# Treceti toate tipurile \u0219i descrierea lor\n@mcp.tool()\ndef add(a: int, b: int) -&gt; int:\n    \"\"\"Add two numbers\"\"\"\n    return a + b\nif __name__ == \"__main__\":\n    # take host and port from command line\n    import argparse\n    parser = argparse.ArgumentParser(description=\"Run FastMCP server\")\n    parser.add_argument(\"--host\", type=str, default=\"0.0.0.0\", help=\"Host address (default: 0.0.0.0)\")\n    parser.add_argument(\"--port\", type=int, default=7860, help=\"Port number (default: 7860)\")\n    args = parser.parse_args()\n    mcp.run(\n        transport=\"streamable-http\", # https:\/\/github.com\/modelcontextprotocol\/python-sdk\/?tab=readme-ov-file#streamable-http-transport\n        host=args.host,\n        port=args.port,\n        path=\"\/mcp\",\n        log_level=\"debug\",\n    )<\/code><\/pre>\n\n\n\n<p><em>Se expune metoda<\/em>&nbsp;<strong>add<\/strong><\/p>\n\n\n\n<p>Am facut si un client&nbsp;<a href=\"https:\/\/colab.research.google.com\/drive\/15UNUlT_Rd0VTT-KozBSu93Q9EzrJU5eZ#scrollTo=aA-Tz-9d5wsz\">MCP g\u0103zduit prin Colab<\/a>, pe care ar trebui s\u0103-l pute\u021bi rula \u0219i testa.<\/p>\n\n\n\n<p>Este mai u\u0219or de inteles fluxul pe partea de client. \u00cen primul r\u00e2nd, ne conect\u0103m la serverul MCP \u0219i \u00eei cerem s\u0103 listeze instrumentele.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>async with Client(\"https:\/\/alexcpn-mcpserver-demo.hf.space\/mcp\/\") as client:\n        await client.ping()\n        # List available tools\n        tools = await client.list_tools()\n        print(\"Available tools:\", tools)\n        tool_result = await client.call_tool(\"add\", {\"a\": \"1\", \"b\": \"2\"})\n        print(\"Tool result:\", tool_result)\n\nRezultatul este urm\u0103torul.\n\nAvailable tools: &#91;Tool(name='add', description='Add two numbers', inputSchema={'properties': {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}, 'required': &#91;'a', 'b'], 'type': 'object'}, annotations=None)]<\/code><\/pre>\n\n\n\n<p>F\u0103r\u0103 un framework,&nbsp;<a href=\"https:\/\/huggingface.co\/spaces\/doreloprisan\/mcpserver-demo\/blob\/main\/mcp_server_starlette.py\">acesta este<\/a>&nbsp;modul \u00een care expunem detaliile instrumentului pe server \u0219i este posibil s\u0103 fi observat c\u0103 asta este ceea ce prime\u0219te Clientul. Framework-uri precum FastMCP deduc acest lucru din tipul informa\u021biilor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.list_tools()\nasync def list_tools() -&gt; list&#91;types.Tool]:\n    return &#91;\n        types.Tool(\n            name=\"add\",\n            description=(\n                \"add two numbers and return the result. \"\n                \n            ),\n            inputSchema={\n                \"type\": \"object\",\n                \"required\": &#91;\"a\", \"b\"],\n                \"properties\": {\n                    \"a\": {\n                        \"type\": \"integer\",\n                        \"description\": \"The first number to add\",\n                    },\n                    \"b\": {\n                        \"type\": \"integer\",\n                        \"description\": \"The second number to add\",\n...\n\n<\/code><\/pre>\n\n\n\n<p>Apoi, d\u0103m aceast\u0103 ie\u0219ire \u201etool_result\u201d LLM-ului \u0219i \u00eei cerem s\u0103 genereze o ie\u0219ire JSON adecvat\u0103 pentru apelul instrumentului cu argumentele relevante.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>a = 123124522\nb= 865734234\nquestion = 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\" + \\\n    \"here is the JSON RPC call format {{\\\"method\\\": \\\"&lt;method name&gt;\\\", \\\"params\\\": {{\\\"&lt;param 1 name&gt;\\\": {&lt;param 1 value&gt;}, \\\"&lt;param 2 name&gt;\\\": {&lt;param 2 value&gt;} etc }}}}\"\n\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Use a simple model like gpt-3.5-turbo\n  completion = openai_client.chat.completions.create(\n      model=\"gpt-3.5-turbo\", messages=&#91;\n         {\"role\": \"user\", \"content\":question }\n      ]\n  )\n  # Print the response\n  print(\"LLM response:\", tool_call)\n  print(tool_call&#91;\"method\"], tool_call&#91;\"params\"])\n\n<\/code><\/pre>\n\n\n\n<p>Am obtinut JSON-ul de mai jos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>LLM response: {'method': 'add', 'params': {'a': 123124522, 'b': 865734234}}\nadd {'a': 123124522, 'b': 865734234}<\/code><\/pre>\n\n\n\n<p>Trimitem acest JSON c\u0103tre serverul LLM prin API-ul de apel al instrumentului MCP Client.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tool_result = await client.call_tool(tool_call&#91;\"method\"], tool_call&#91;\"params\"])\nprint(\"Tool result:\", tool_result)\n<\/code><\/pre>\n\n\n\n<p>Rezultatul de la serverul MCP este mai jos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Tool result: &#91;TextContent(type='text', text='988858756', annotations=None)]\n<\/code><\/pre>\n\n\n\n<p>Simplu si corect \u2013 LLM apeleaz\u0103 un instrument \u2013 mai degrab\u0103 LLM ob\u021bine informa\u021bii despre un instrument \u0219i genereaz\u0103 semn\u0103tura de apel \u00een format JSON, iar programul nostru folose\u0219te clientul MCP pentru a apela efectiv serverul MCP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Autorizarea \u00een MCP<\/h2>\n\n\n\n<p>MCP utilizeaz\u0103 fluxul OAuth2 pentru autorizare. Aceasta \u00eenseamn\u0103 c\u0103 nu trebuie s\u0103 v\u0103 partaja\u021bi numele de utilizator \u0219i\/sau parola cu niciun client MCP. MCP Client v\u0103 redirec\u021bioneaz\u0103 c\u0103tre serverul de resurse, s\u0103 zicem un magazin foto sau Gmail sau orice alt serviciu, \u0219i v\u0103 conecta\u021bi la server cu datele de conectare.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Client MCP \u2013&gt; s\u0103 spunem Gmail MCP Server (stabili\u021bi o conexiune nesigur\u0103)<\/li>\n\n\n\n<li>Solicita\u021bi login(), serverul MCP trimite un link pentru a face clic cu sessionid-ul de mai sus<\/li>\n\n\n\n<li>Utilizatorul face clic pe link (sau browserul se deschide cu linkul) la serverul Gmail<\/li>\n\n\n\n<li>Utilizatorul introduce acredit\u0103rile Gmail \u0219i i se arat\u0103 c\u0103 este conectat<\/li>\n\n\n\n<li>Intern, serverele Gmail apeleaz\u0103 serverul Gmail MCP cu ID-ul sesiunii (ro\u0219u \u0219i \u00eei spune serverului MCP c\u0103 ID-ul sesiunii este autentificat<\/li>\n\n\n\n<li>Acum MCP Client \u2013&gt; sesiunea MCP Server este autentificat\u0103<\/li>\n\n\n\n<li>Alte apeluri care au nevoie de autentificare nu au nevoie de niciun token sau cheie secret\u0103, clientul MCP poate solicita utilizatorilor e-mailuri etc<\/li>\n<\/ol>\n\n\n\n<p>Odat\u0103 autentificat, serverul MCP prime\u0219te un apel invers de la serverul de resurse, s\u0103 zicem Gmail, prin adresa URL de redirec\u021bionare \u0219i marcheaz\u0103 intern c\u0103 sesiunea SSE sau HTTP Streaming este autentificat\u0103. Restul apelurilor pot fi apoi procesate fiind autentificate.<\/p>\n\n\n\n<p>sursa: https:\/\/b<a href=\"https:\/\/blog.mersi.ai\/2025\/06\/06\/mcp-golden-key-pentru-automatizarea-ai\/\" data-type=\"URL\" data-id=\"https:\/\/blog.mersi.ai\/2025\/06\/06\/mcp-golden-key-pentru-automatizarea-ai\/\">log.mersi.ai<\/a>\/2025\/06\/06\/mcp-golden-key-pentru-automatizarea-ai\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce este MCP? Cum se&nbsp;acceseaza LLM-urile prin MCP? Cum func\u021bioneaz\u0103 autorizarea MCP? \u0219i alte aspecte MCP arat\u0103 ca o cheie de Aur pentru a debloca \u00eentregul poten\u021bial al LLM-urilor. De la Google la Microsoft (MCP pe Windows 11) \u0219i multe \u00eentre ele.&nbsp;Model Context Protocol&nbsp;\u2014 MCP atrage mult hype \u0219i pare supra-licitat. Are deja c\u00e2teva starturi <span class=\"ellipsis\">&hellip;<\/span> <span class=\"more-link-wrap\"><a href=\"https:\/\/reduceri.la\/blog\/agenti-ai\/mcp-golden-key-pentru-automatizarea-ai\/\" class=\"more-link\"><span>Continue Reading<\/span><\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[288],"tags":[292,289,291,290],"class_list":["post-442","post","type-post","status-publish","format-standard","hentry","category-agenti-ai","tag-agenti-ai","tag-mcp-server","tag-mersi-ai","tag-model-context-protocol"],"_links":{"self":[{"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/posts\/442","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/comments?post=442"}],"version-history":[{"count":1,"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/posts\/442\/revisions"}],"predecessor-version":[{"id":443,"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/posts\/442\/revisions\/443"}],"wp:attachment":[{"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/media?parent=442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/categories?post=442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/reduceri.la\/blog\/wp-json\/wp\/v2\/tags?post=442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}