Construiește un client pentru asistent

Serverul MCP

Endpointul MCP al lui Setherion, pentru când îți construiești propriul client: transport, autentificare, unelte și erori.

POSThttps://www.setherion.com/api/mcp

Plan: Orice plan

Setherion are un server MCP, felul standard în care asistenții AI folosesc alte servicii. Dacă vrei doar să-l folosești din Claude, ChatGPT, Cursor sau VS Code, urmează MCP: conectează un asistent AI. Pagina aceasta e pentru cine își construiește propriul client.

Serverul este API-ul cu altă voce. Fiecare unealtă este un apel către endpointul cu același nume din această referință, făcut cu credențialul celui care apelează, așa că serverul nu poate face niciodată mai mult decât API-ul.

Transport

  • Streamable HTTP, fără stare. Trimite fiecare mesaj ca un singur mesaj JSON-RPC 2.0 în corpul unui POST. Nu există sesiuni și nu e nimic de reluat.
  • Versiunile de protocol 2025-06-18 și 2025-03-26. initialize răspunde cu versiunea pe care ai cerut-o dacă e una dintre acestea, și cu 2025-06-18 în caz contrar. După initialize, trimite versiunea în antetul MCP-Protocol-Version. O valoare diferită este refuzată cu 400.
  • Doar unelte. Serverul nu oferă resurse sau prompturi și nu trimite mesaje de la sine.
  • Un mesaj pe cerere. Un lot este refuzat cu 400.
  • GET și DELETE răspund cu 405 și Allow: POST.
  • Origin. O cerere dintr-o pagină de browser trebuie să vină de la https://www.setherion.com. Orice alt Origin primește 403. Cererile din programe nu poartă niciunul și sunt acceptate.

Păstrează www în adresă. Adresa fără el face o redirecționare, iar redirecționarea pierde credențialul.

Autentificare

Trimite un credențial în antetul Authorization. Merge oricare dintre ele:

  • O cheie API: Authorization: Bearer sth_.... Vezi Autentificare.
  • Un token de acces OAuth, care începe cu sto_, emis pentru acest endpoint și pentru niciun altul. Vezi pagina de autentificare OAuth din această referință.

O cerere fără niciuna, sau cu un credențial greșit, expirat ori revocat, primește 401, cu un indiciu despre unde te autentifici:

http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="Setherion", resource_metadata="https://www.setherion.com/.well-known/oauth-protected-resource/api/mcp"
json
{
  "jsonrpc": "2.0",
  "id": null,
  "error": {
    "code": -32001,
    "message": "Sign in to Setherion to use this server, or send an API key from your account page as \"Authorization: Bearer sth_...\"."
  }
}

Un client fără credențiale urmează resource_metadata ca să găsească autentificarea. Tokenurile merg doar pe acest endpoint: endpointurile REST din această referință primesc o cheie API.

Metode

MetodăRăspuns
initializeVersiunea de protocol, capabilities cu { "tools": { "listChanged": false } }, serverInfo (setherion, Setherion, 1.0.0) și instructions pentru model.
ping{}
tools/listCele șase unelte de mai jos, cu schemele lor de intrare.
tools/callRulează o unealtă.
Notificări și răspunsuri202 cu corpul {}.
Orice altcevaO eroare JSON-RPC -32601, Method not found: <method>.
bash
curl -X POST https://www.setherion.com/api/mcp \
  -H "Authorization: Bearer $SETHERION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }'

Unelte

UnealtăApeleazăArgumenteCredite
list_projectsListează aplicațiile talequery, offset (ambele opționale)Niciunul
edit_projectModifică o aplicațieproject_id, instruction (ambele obligatorii)Aceleași ca în editor
edit_statusUrmărirea unei modificăriproject_id, run_id (ambele obligatorii)Niciunul
publish_projectPublică o aplicațieproject_idNiciunul
store_guidePregătirea pentru magazineproject_id, way (opțional)Niciunul
store_privacy_answersRăspunsuri de confidențialitate pentru magazineproject_id, way (obligatoriu)Niciunul
write_store_listingScrie pagina din magazinproject_idCâteva, de la Pro în sus

instruction se trimite ca prompt al modificării, până la 4.000 de caractere. way este easy sau native. offset este un număr întreg, 0 sau mai mare, și poate fi trimis ca text. edit_project nu primește un model: rulează pe auto.

tools/list dă pentru fiecare unealtă title, description, inputSchema și annotations. Uneltele care doar citesc sunt marcate cu readOnlyHint: true, iar publish_project este marcată ca idempotentă.

bash
curl -X POST https://www.setherion.com/api/mcp \
  -H "Authorization: Bearer $SETHERION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call",
        "params": { "name": "list_projects", "arguments": { "query": "coffee" } } }'

Rezultatul unei unelte

O unealtă răspunde cu JSON-ul endpointului ei, în două forme, pentru orice fel de client:

json
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [{ "type": "text", "text": "{ \"ok\": true, \"total\": 1, ... }" }],
    "structuredContent": { "ok": true, "total": 1, "truncated": false, "offset": 0, "nextOffset": null, "projects": [] },
    "isError": false
  }
}

(projects este scurtat aici. Are intrările descrise la Listează aplicațiile tale.)

Când endpointul refuză, isError este true, structuredContent lipsește, iar content conține doar propoziția error a endpointului, pe care s-o citească modelul. O modificare care se termină cu ok: false este și ea o eroare în sensul acesta.

Modificări lungi

O modificare durează minute. Trimite cererea cu Accept: text/event-stream și răspunsul vine în flux:

  • La fiecare 10 secunde serverul trimite un eveniment notifications/progress, cu progress setat la secundele trecute și mesajul Still editing, 30s so far, dacă ai pus un progressToken în params._meta. Fără token trimite o linie de comentariu, : still editing. Oricare dintre ele ține conexiunea vie și lasă clientul să-și reia cronometrul.
  • Ultimul eveniment este rezultatul uneltei, ca event: message, cu răspunsul JSON-RPC în data.
text
event: message
data: {"jsonrpc":"2.0","method":"notifications/progress","params":{"progressToken":"t1","progress":10,"message":"Still editing, 10s so far"}}

event: message
data: {"jsonrpc":"2.0","id":3,"result":{"content":[...],"structuredContent":{"ok":true,"runId":"..."},"isError":false}}

Fără antetul Accept, cererea rămâne deschisă și răspunde cu un singur obiect JSON.

O modificare încă în lucru după patru minute

edit_project așteaptă cel mult vreo patru minute, pentru că unii asistenți renunță la o unealtă care tace de cinci. O modificare care încă lucrează atunci răspunde cu ok: true, status: "running" și runId-ul ei:

json
{
  "ok": true,
  "status": "running",
  "runId": "b3f0e2d1-6a47-4c8e-9d15-0f2b7a3c8e61",
  "projectId": "7c1e4a52-9b0d-4f3e-8a61-2d5f0c9e7b14",
  "message": "Still editing. It carries on in Setherion without you: do not send it again. Call edit_status with this runId in a minute or so, until it says \"done\"."
}

Modificarea merge mai departe în Setherion. Apelează edit_status cu project_id și run_id cam din minut în minut. Răspunde ca la Urmărirea unei modificări, până când status este done.

Închiderea conexiunii nu oprește modificarea

Un client care închide conexiunea sau trimite o notificare de anulare lasă modificarea să ruleze, și ea rămâne plătită. Ajunge în aplicație ca și cum ai fi așteptat. Ca s-o oprești, apasă Stop în editorul Setherion, pe cardul care arată modificarea în lucru.

Erori

UndeEroare
HTTP 401Cod JSON-RPC -32001. Vezi Autentificare mai sus.
HTTP 403{ "error": "Origin not allowed" }
HTTP 405Codul -32000, Method not allowed. This server answers POST only.
HTTP 400Codul -32700 Parse error pentru un corp care nu e JSON; -32600 pentru un lot, un mesaj care nu e JSON-RPC 2.0 sau un MCP-Protocol-Version neacceptat.
Eroare JSON-RPC-32601 pentru o metodă care nu există; -32602 pentru argumente greșite ale uneltei.
Propozițiile pentru argumente greșite ale uneltei

Toate vin cu codul -32602.

  • Unknown tool: <name>
  • Arguments must be an object.
  • Missing "project_id". (sau orice alt argument obligatoriu)
  • Unknown argument "<name>".
  • "<name>" must be a string.
  • "way" must be one of: easy, native.
  • "offset" must be a whole number, 0 or more.

Refuzurile venite de la unelte, cum ar fi o aplicație negăsită sau o limită atinsă, sunt rezultate de unealtă cu isError: true. Propozițiile lor sunt cele din Erori și limite.

Ți-a fost de folos această pagină?

Alătură-te comunității

Întrebări, idei și ce construiesc alții.