API i MCP

Poveži Sufler sa Claude-om, Cursor-om, n8n-om ili sopstvenim skriptama: čitanje sastanaka, sesija, projekata i kalendara, upravljanje znanjem, kroz REST API, MCP server i CLI.

1. Kako napraviti ključ

API ključ praviš u Podešavanjima, u sekciji API ključevi. Dostupno je na Pro, Unlimited i Ultimate planu; Proba (start) nema API pristup.

  • Ključ dobijaš puni tekst samo jednom, u trenutku kreiranja. Posle toga vidiš samo prefiks (npr. sk_sufler_Ab3xYz), dovoljan da ga prepoznaš u listi.
  • Pri kreiranju biraš dozvole (scope-ove) koje ključ nosi. Ne postoji naknadna izmena dozvola postojećeg ključa; napravi novi sa drugim scope-ovima i opozovi stari.
  • Opoziv ključa važi odmah. Revizija u Podešavanjima beleži REST, CLI i MCP pozive, sa vremenom, operacijom i statusom.

2. Claude Code

Dodaj Sufler kao MCP server jednom komandom:

claude mcp add sufler -- npx -y @ostrichtech/sufler mcp

Claude Code te pita za SUFLER_API_KEY pri prvom pokretanju. Zatim u razgovoru: „šta je zaključeno na poslednjem sastanku?" ili „koja pravila projekta X važe za ovaj kod?".

3. Claude Desktop / Cursor

Oba klijenta pokreću MCP server preko stdio (lokalni proces, npx). Dodaj u konfiguraciju (Claude Desktop: claude_desktop_config.json; Cursor: MCP podešavanja projekta ili globalna):

{
  "mcpServers": {
    "sufler": {
      "command": "npx",
      "args": ["-y", "sufler", "mcp"],
      "env": { "SUFLER_API_KEY": "sk_sufler_..." }
    }
  }
}

4. Remote MCP

Za hostovane klijente sa podrškom za Bearer autorizaciju (npr. n8n) koristi remote MCP umesto stdio procesa:

URL:    https://sufler.rs/api/mcp
Header: Authorization: Bearer sk_sufler_...

5. REST

Svaka MCP operacija postoji i kao REST poziv:

curl -H "Authorization: Bearer sk_sufler_..." \
  "https://sufler.rs/api/v1/meetings?since=7d&limit=10"

GET /api/v1/catalog (uz važeći ključ) vraća spisak operacija filtriran po dozvolama tog ključa - samo ono što taj ključ sme da pozove. GET /api/v1/openapi.json zahteva takođe važeći ključ, ali vraća kompletan, nefiltriran opis celog API-ja (OpenAPI 3.1), bez obzira na dozvole ključa kojim si se autentifikovao - koristan za generisanje klijenata ili uvid u sve operacije bez obzira šta trenutni ključ sme.

GET /api/v1/meetings/:id i GET /api/v1/sessions/:id primaju i ?format=md: odgovor tada nije JSON nego text/markdown - isti zapisnik/transkript, spreman za nalepiti u Obsidian ili beleške, bez ručnog formatiranja. Na svim drugim operacijama format se ignoriše (odgovor ostaje JSON).

Greške su RFC 7807 (application/problem+json): telo nosi type, title, status, i po potrebi detail, scope ili resetAt.

6. CLI

Za terminal i skripte bez pisanja HTTP poziva ručno:

npm install -g @ostrichtech/sufler
sufler login
sufler meetings list --since 7d

sufler login traži API ključ i čuva ga lokalno (SUFLER_API_KEY iz okruženja uvek ima prednost nad sačuvanim ključem, korisno za CI i jednokratne pozive).

sufler meetings export <id> (i isto za sessions) preuzima sastanak ili sesiju kao Markdown fajl - podrazumevano bez transkripta, uz --transcript i sa njim (zahteva transcripts:read); --format json vraća sirov JSON umesto Markdowna.

7. Dozvole (scope-ovi)

Svaki ključ nosi jednu ili više dozvola:

  • meetings:read - lista i detalji sastanaka, pretraga po zapisniku.
  • projects:read - lista i detalji projekata, pretraga znanja.
  • projects:write - dodavanje i potvrda znanja, zamena odluka, kreiranje projekata; zahteva i projects:read.
  • sessions:read - lista i detalji sesija intervju-kopilota.
  • profile:read - profesionalni profil (uloga, industrija, sažetak CV-ja).
  • calendar:read - predstojeći događaji iz povezanog kalendara.
  • transcripts:read - sirov transkript sastanka ili sesije. Posebna dozvola, podrazumevano isključena jer sadržaj transkripta tada napušta aplikaciju. Zahteva i meetings:read ili sessions:read (isti obrazac zavisnosti kao kod projects:write): sama za sebe ne otvara nijedan poziv. Bez nje, include_transcript u pozivu vraća odgovor sa transcriptOmitted: "scope" umesto transkripta - ostatak odgovora (zapisnik, učesnici, teme) i dalje stiže normalno.

Pretraga sastanaka (search_meetings) i čitanje sastanka pokrivaju zapisnik (naslov, sažetak, odluke, moja zaduženja, tuđa zaduženja, rizici, otvorena pitanja), ne sirovi transkript - meetings:read je dovoljan za to, transkript je odvojen.

Upravljanje znanjem ima jedan tok bez izuzetka: add_knowledge uvek upisuje stavku sa statusom draft - ne postoji confirm parametar koji bi je odmah potvrdio pri dodavanju. Potvrda ide isključivo naknadnim pozivom confirm_knowledge. Nacrti (draft) ulaze u sažetak projekta, ali samo potvrđena stavka ulazi doslovno u prompt kopilota.

Spoljni izvor koji se sinhronizuje redovno (Jira, tiketi, skripta pre sastanka) šalje origin_key, npr. jira:PROJ-123: ponovni poziv sa istim ključem menja istu stavku umesto da pravi duplikat. Takav poziv ne dira status (potvrda ostaje), a pin menja samo kad je izričito poslat. Naslov mora biti jedinstven u projektu: sudar sa drugom stavkom vraća 409, pa spoljni izvor u naslov stavlja svoj identifikator (npr. [Jira] PROJ-123 …).

Tekući fokus je odvojen od znanja: jedan živi tekst po projektu (cilj, šta treba da se promeni, kako, šta se očekuje od tebe, otvoreno) koji asistent prepisuje posle sastanaka i iz materijala. add_material ubacuje spec, mejl od menadžera ili opis tiketa u inbox fokusa (ne u znanje, ne doslovno u prompt); refresh_focus ga odmah sažme u nov fokus; set_focus ga prepisuje ručno. get_project vraća focus, pa Claude Code ili Cursor mogu da rade u skladu sa onim što se u sprintu traži, a prompt prepare_for_meeting ga koristi kao okvir.

8. Limiti i kvote

  • 60 poziva u minutu po ključu, bez obzira na operaciju.
  • Dnevni limit po planu: Pro 500, Unlimited 2000, Ultimate 5000 poziva dnevno.
  • Kvotni dan je UTC dan: dnevni limit se resetuje u ponoć po UTC-u (u srpskom lokalnom vremenu to je 01:00 zimi, odnosno 02:00 leti).
  • Autentifikacija ide pre rutiranja: i poziv na nepostojeću putanju troši i minutni i dnevni limit po ključu (i probing kapu po IP adresi), ne samo poziv na postojeću operaciju. Isto važi i za pozive na /catalog i /openapi.json - i oni prolaze kroz punu autentifikaciju, uključujući dnevni brojač, pre nego što se obrade.
  • Prekoračenje bilo kog limita vraća 429 sa retry-after i, za dnevni limit, resetAt u telu greške.
  • Svaki uspešan odgovor nosi X-RateLimit-Limit, X-RateLimit-Remaining i X-RateLimit-Reset (Unix vreme sledećeg resetovanja) - stanje dnevne kvote bez posebnog poziva.

9. Kontakt

Pitanja i prijave problema sa API-jem ili MCP serverom: info@ostrichtech.rs.