Za developere

MCP za AI agente

CodeSensei ima MCP server preko kojeg AI agent (Claude, ChatGPT, Cursor, Claude Code…) u ime učitelja ili autora stvara tečajeve, lekcije, zadatke s testovima, riješene primjere i sadržaj učionica. Sve što agent napravi sprema se kao skica koju pregledaš prije objave.

Spajanje

Adresahttps://www.codesensei.eu/mcp
TransportStreamable HTTP (JSON-RPC 2.0 preko POST)
PrijavaOAuth 2.1 (authorization code + PKCE S256, dinamička registracija klijenta ili Client ID Metadata Document) ili osobni token u zaglavlju Authorization: Bearer …
Tko smijeodobreni učitelji, verificirani autori i administratori
Ograničenje120 zahtjeva u minuti po korisniku

Claude.ai, ChatGPT i ostale aplikacije

Dodaj custom connector s adresom https://www.codesensei.eu/mcp, autentifikacija Sign in now (OAuth). Otvorit će se CodeSensei – prijavi se i klikni Dopusti. Povezane aplikacije vidiš i opozivaš na stranici AI agenti.

Claude Code i skripte (token)

Na stranici AI agenti stvori token pa:

claude mcp add --transport http codesensei https://www.codesensei.eu/mcp \
  --header "Authorization: Bearer TVOJ_TOKEN"

OAuth metapodaci: https://www.codesensei.eu/.well-known/oauth-protected-resource/mcp i https://www.codesensei.eu/.well-known/oauth-authorization-server.

Struktura podataka

Svi ID-jevi su javni, nepredvidivi nizovi (npr. k3j9xq2mw7ab) – nikad brojevi iz baze.

Jezik (Language)            id, name
 └─ Tečaj (Course)          id, title, description, difficulty 1–5, status, visibility
     └─ Lekcija (Lesson)    id, title, description (teorija), video_link, quiz_url, order, status
         └─ Zadatak (Task)  id, title, description, input, output, difficulty 1–5, points 1–100,
                            example (riješeni primjer), status (active | awaiting_approval)
             ├─ Test primjeri   input (stdin) → expected_output (stdout)
             └─ Rješenje        solution (vidi ga samo autor)

Učionica (Classroom)        id, name, timezone
 ├─ Aktivnost (Assignment)  id, title, topic, instructions, editor, mode, max_points,
 │                          available_from, due_at, max_attempts, hints[], reference_solution,
 │                          ai_help_level, ai_review_enabled, teacher_review_required, status
 ├─ Materijal (Material)    id, title, topic, description, resource_url, status
 └─ Objava (Announcement)   id, title, body, povezane aktivnosti i materijali, status

Statusi

  • Tečaj / lekcija: draft → published (objavljuje administrator). Javno su vidljivi samo objavljeni tečajevi s vidljivošću public.
  • Zadatak: awaiting_approval dok ga administrator ne odobri, zatim active. Svaka izmjena ga vraća na čekanje.
  • Sadržaj učionice: draft/hidden dok ga učitelj ne objavi (ili agent s publish=true kad to izričito tražiš).

Editori aktivnosti

  • text – Slobodan odgovor / datoteke
  • python – Python (editor + pokretanje)
  • cpp – C++ (editor + pokretanje)
  • javascript – JavaScript (editor + pokretanje)
  • makecode – MakeCode (rad u Labsu, predaja .hex ili poveznice)

Pravila pristupa

Agent nikad ne vidi više od korisnika koji ga je spojio:

  • Tečajevi: objavljeni javni tečajevi, tvoji vlastiti (i skice) te objavljeni tečajevi koje si otključao kodom. Tuđi privatni tečajevi, tečajevi s kodom koje nisi otključao i tuđe skice nisu dostupni.
  • Lekcije: samo objavljene (neobjavljene vidi samo vlasnik tečaja).
  • Zadaci: aktivni javni zadaci i tvoji vlastiti. Tuđi privatni i neodobreni zadaci nisu dostupni; test primjere i rješenje vidiš samo za svoje zadatke.
  • Pisanje: lekcije samo u tvoje tečajeve, zadaci u tvoje lekcije ili u objavljene javne lekcije, izmjene samo tvojih zadataka.
  • Učionice: samo one u kojima si aktivan učitelj; arhivirane samo za čitanje. Agent ne vidi imena učenika, predaje ni ocjene.
  • Tokeni agenta rade samo na /mcp i ne daju pristup ostatku API-ja.

Alati

Tečajevi, lekcije i zadaci

list_languages čitanje

Popis programskih jezika na CodeSensei (potreban za create_course).

list_courses čitanje

Popis tečajeva: javni tečajevi i tvoji vlastiti (i skice). "mine" označava tečajeve koje smiješ uređivati.

ParametarTipOpis
search string Dio naslova tečaja.
only_mine boolean Samo moji tečajevi.
get_course čitanje

Detalji tečaja s popisom lekcija redom.

ParametarTipOpis
course_id* string ID tečaja (iz list_courses).
get_lesson čitanje

Lekcija s tekstom (teorijom) i zadacima. Kod tvojih zadataka vidiš i test primjere i rješenje.

ParametarTipOpis
lesson_id* string ID lekcije (iz get_course).
create_course pisanje

Novi tečaj kao skica (draft). Objavljuje ga administrator nakon pregleda.

ParametarTipOpis
language_id* string ID jezika iz list_languages.
title* string Naslov tečaja.
description string Kratki opis tečaja.
difficulty integer Težina 1–5.
create_lesson pisanje

Nova lekcija (skica) na kraju tvog tečaja. "description" je tekst lekcije – teorija i objašnjenja.

ParametarTipOpis
course_id* string ID tvog tečaja.
title* string Naslov lekcije (do 100 znakova).
description* string Tekst lekcije u Markdownu: naslovi (##), objašnjenja, liste, tablice, blokovi koda (```python) i ```mermaid dijagrami.
video_link string Poveznica na video (neobavezno).
quiz_url string Poveznica na kviz (neobavezno).
update_lesson pisanje

Izmjena lekcije u tvom tečaju. Šalji samo polja koja mijenjaš.

ParametarTipOpis
lesson_id* string ID lekcije.
title string
description string Novi tekst lekcije u Markdownu (zamjenjuje stari).
video_link string|null
quiz_url string|null
create_task pisanje

Novi programerski zadatak u lekciji, s test primjerima (ulaz → očekivani izlaz) i neobaveznim točnim rješenjem. Za riješeni primjer postavi example=true i pošalji solution. Zadatak čeka odobrenje administratora prije nego ga učenici vide.

ParametarTipOpis
lesson_id* string ID lekcije.
title* string Naslov (do 100 znakova).
description* string Tekst zadatka u Markdownu (liste, `kod`, blokovi koda, tablice, ```mermaid).
input string Opis ulaza.
output string Opis izlaza.
difficulty* integer Težina 1–5.
points* integer Bodovi 1–100.
example boolean true = riješeni primjer, ne zadatak za bodove.
solution string Točno rješenje (vidi ga samo autor i administrator).
test_cases* array<object> Barem jedan test primjer.
Svaki element: input, expected_output
update_task pisanje

Izmjena tvog zadatka. Šalji samo polja koja mijenjaš; test_cases zamjenjuje sve postojeće. Nakon izmjene zadatak ponovno čeka odobrenje administratora.

ParametarTipOpis
task_id* string ID zadatka.
title string Naslov (do 100 znakova).
description string Tekst zadatka u Markdownu (liste, `kod`, blokovi koda, tablice, ```mermaid).
input string Opis ulaza.
output string Opis izlaza.
difficulty integer Težina 1–5.
points integer Bodovi 1–100.
example boolean true = riješeni primjer, ne zadatak za bodove.
solution string Točno rješenje (vidi ga samo autor i administrator).
test_cases array<object> Ako ga pošalješ, zamjenjuje sve postojeće test primjere.
Svaki element: input, expected_output

Učionice

list_classrooms čitanje

Učionice u kojima si učitelj.

get_classroom čitanje

Sadržaj učionice: teme, zadaci (aktivnosti), materijali i zadnje obavijesti. Vremena su u vremenskoj zoni učionice.

ParametarTipOpis
classroom_id* string ID učionice (iz list_classrooms).
create_classroom_assignment pisanje

Nova aktivnost (zadatak) u učionici za sve učenike. Tekst zadatka ide u "instructions"; editor određuje gdje učenici rade (python, cpp, javascript, makecode ili text za slobodan odgovor). Dodaj savjete (hints) i točno rješenje (reference_solution) – AI pomoć i AI procjena ih koriste. Po defaultu se sprema kao skica koju učitelj pregleda i objavi; publish=true je odmah objavljuje učenicima.

ParametarTipOpis
classroom_id* string ID učionice.
title* string Naslov aktivnosti.
topic string Tema u „Zadaci” (npr. "Petlje"); postojeće teme vidi u get_classroom.
instructions string Tekst zadatka za učenike u Markdownu (liste, blokovi koda, tablice).
editor string Gdje učenik radi. Zadano: text.
Vrijednosti: text, python, cpp, javascript, makecode
mode string practice = vježba, assessment = provjera, manual_quiz = kviz koji učitelj ručno boduje. Zadano: practice.
Vrijednosti: practice, assessment, manual_quiz
max_points integer Najviše bodova. Zadano: 10.
available_from string Dostupno od, "YYYY-MM-DD HH:MM" u zoni učionice.
due_at string Rok, "YYYY-MM-DD HH:MM" u zoni učionice.
max_attempts integer Najviše predaja (prazno = neograničeno).
hints array<string> Savjeti redom, od blažeg prema konkretnijem (do 10).
reference_solution string Točno rješenje – vidi ga samo učitelj i AI procjena.
ai_help_level string AI pomoć učenicima. Zadano: inherit (postavka učionice).
Vrijednosti: inherit, off, guidance, hints, explain, full
ai_review_enabled boolean AI procjena predaja.
teacher_review_required boolean Bodovi tek nakon što učitelj pregleda.
task_id string Neobavezno: postojeći odobreni CodeSensei zadatak (ID iz get_lesson).
publish boolean true = odmah objavi i obavijesti učenike. Zadano: false (skica).
update_classroom_assignment pisanje

Izmjena aktivnosti u učionici. Šalji samo polja koja mijenjaš; hints zamjenjuje sve savjete.

ParametarTipOpis
classroom_id* string ID učionice.
assignment_id* string ID aktivnosti (iz get_classroom).
title string Naslov aktivnosti.
topic string Tema u „Zadaci” (npr. "Petlje"); postojeće teme vidi u get_classroom.
instructions string Tekst zadatka za učenike u Markdownu (liste, blokovi koda, tablice).
editor string Gdje učenik radi. Zadano: text.
Vrijednosti: text, python, cpp, javascript, makecode
mode string practice = vježba, assessment = provjera, manual_quiz = kviz koji učitelj ručno boduje. Zadano: practice.
Vrijednosti: practice, assessment, manual_quiz
max_points integer Najviše bodova. Zadano: 10.
available_from string Dostupno od, "YYYY-MM-DD HH:MM" u zoni učionice.
due_at string Rok, "YYYY-MM-DD HH:MM" u zoni učionice.
max_attempts integer Najviše predaja (prazno = neograničeno).
hints array<string> Savjeti redom, od blažeg prema konkretnijem (do 10).
reference_solution string Točno rješenje – vidi ga samo učitelj i AI procjena.
ai_help_level string AI pomoć učenicima. Zadano: inherit (postavka učionice).
Vrijednosti: inherit, off, guidance, hints, explain, full
ai_review_enabled boolean AI procjena predaja.
teacher_review_required boolean Bodovi tek nakon što učitelj pregleda.
task_id string Neobavezno: postojeći odobreni CodeSensei zadatak (ID iz get_lesson).
publish boolean true = odmah objavi i obavijesti učenike. Zadano: false (skica).
create_classroom_material pisanje

Novi materijal u učionici (tekst i/ili poveznica). Po defaultu je skriven („Pripremljeno”) dok ga učitelj ne prikaže; publish=true ga odmah prikazuje.

ParametarTipOpis
classroom_id* string ID učionice.
title* string Naslov materijala.
topic string Tema.
description string Opis ili kratki tekst (do 2000 znakova).
resource_url string Poveznica (video, članak, dokument).
publish boolean true = odmah vidljivo učenicima. Zadano: false.
create_classroom_announcement pisanje

Nova objava na naslovnici učionice. Može biti grupna objava s naslovom i povezanim aktivnostima/materijalima (npr. radionica). Po defaultu je skica; publish=true je objavljuje i šalje obavijest članovima.

ParametarTipOpis
classroom_id* string ID učionice.
body* string Tekst objave.
title string Naslov (za grupnu objavu).
assignment_ids array<string> Aktivnosti povezane u objavi (ID-jevi iz get_classroom).
material_ids array<string> Materijali povezani u objavi.
is_pinned boolean Prikvači na vrh.
publish boolean true = objavi i obavijesti članove. Zadano: false (skica).

* obavezan parametar

Primjeri

Upute agentu

  • „Na CodeSenseiju napravi tečaj Python za početnike s 5 lekcija; u svakoj objasni gradivo, dodaj 1 riješeni primjer i 3 zadatka s test primjerima.”
  • „U učionici 2.b pripremi radionicu o petljama: materijal s objašnjenjem, 3 Python zadatka sa savjetima i točnim rješenjem i grupnu objavu koja ih povezuje. Ništa ne objavljuj.”

Poziv alata (JSON-RPC)

POST https://www.codesensei.eu/mcp
Authorization: Bearer TVOJ_TOKEN
Content-Type: application/json

{"jsonrpc": "2.0", "id": 1, "method": "tools/call",
 "params": {"name": "create_task", "arguments": {
   "lesson_id": "k3j9xq2mw7ab",
   "title": "Zbroj dva broja",
   "description": "Učitaj dva cijela broja i ispiši njihov zbroj.",
   "difficulty": 1, "points": 10,
   "solution": "a = int(input())\nb = int(input())\nprint(a + b)",
   "test_cases": [
     {"input": "2\n3", "expected_output": "5"},
     {"input": "-4\n4", "expected_output": "0"}
   ]}}}