În arhitectura tradițională client-server, serverul MCP este un executant pasiv: expune unelte (tools), resurse (resources) și prompturi predefinite. Cu toate acestea, apar scenarii avansate în care un server MCP autonom (de exemplu, un manager de baze de date sau un asistent de securitate) are nevoie să ‘gândească’ sau să rezume un volum uriaș de date locale înainte de a trimite răspunsul final.
MCP Sampling (metoda JSON-RPC sampling/createMessage) inversează acest flux: serverul cere clientului (Claude Desktop, Cursor, Antigravity) să invoce modelul de limbaj în numele său. Clientul deține controlul complet: poate inspecta promptul cerut de server, poate alege ce model LLM să folosească și poate cere aprobarea explicită a utilizatorului înainte de apel.
Această capacitate garantează securitatea cheilor API (serverul nu manipulează niciodată credențialele OpenAI sau Anthropic) și permite agenților secundari să proceseze date confidențiale direct în sandbox-ul local al utilizatorului.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
sampling/createMessage |
Metoda JSON-RPC trimisă de la server către client pentru solicitarea unei completări de text. |
messages |
Lista de mesaje de context (rol ‘user’ sau ‘assistant’) furnizate de server pentru interogare. |
modelPreferences |
Preferințele specificate de server privind viteza, costul sau inteligența modelului dorit (ex. ‘costPriority: 0.2’). |
systemPrompt |
Instrucțiunea de sistem opțională aplicată de server pentru sarcina izolată de sampling. |
Human-in-the-Loop Approval |
Dialogul de confirmare prin care clientul solicită acordul utilizatorului înainte de a debita tokeni API. |
Exemple practice și configurații
Exemplul 1: Flux JSON-RPC de sampling inițiat de un server SQLite local
Cum solicită serverul rezumarea a 100 de linii returnate dintr-o interogare SQL.
--> Trimitere de la Server către Client:
{
"jsonrpc": "2.0",
"id": 42,
"method": "sampling/createMessage",
"params": {
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "Sintetizează următoarele loguri de eroare SQL în 2 fraze scurte: [Loguri brute 15KB]"
}
}
],
"modelPreferences": {
"intelligencePriority": 0.8,
"speedPriority": 0.5
},
"maxTokens": 250
}
}
<-- Răspuns de la Client (după apelarea LLM):
{
"jsonrpc": "2.0",
"id": 42,
"result": {
"role": "assistant",
"content": {
"type": "text",
"text": "Baza de date a respins 3 conexiuni concurente din cauza atingerii limitei max_connections la ora 04:12."
},
"model": "claude-3-5-haiku-20241022"
}
}
Rezultat & Impact
Serverul primește sinteza compactă fără ca datele brute să fie stocate pe servere terțe.
Greșeli frecvente și bune practici
- Trimiterea unor volume gigantice de date în `sampling/createMessage` care pot epuiza contextul sau genera costuri neprevăzute utilizatorului.
- Dezactivarea confirmării umane pentru sampling în clienții MCP, permițând serverelor compromise să consume tokeni API fără limită.