Napregao sam se ceo dan — sa Codex pluginom Markdown za sekundu prebacim u Feishu, slike se automatski konvertuju!
Upravo sam ažurirao Codex i otkrio novu funkciju — plugin.

Po logici stvari, [Skills i aplikacije] trebalo bi da se zovu "Skills i pluginovi", ali ne znam zašto je Codex to preveo u taj ružni oblik — tekstualne sposobnosti GPT-5.4 stvarno su loše, 😄

Obaveštenje o ažuriranju kaže da se preko plugina može povezati sa aplikacijama poput GitHub-a i Notion-a, ali ja trenutno nemam scenarij za te dve.
Ali zaista imam scenario u kom bi pluginski sistem mogao doći do izražaja.
Prvo o scenariju.
Često mi treba da Markdown dokumente copy-paste-am u Feishu, ali Feishu nema automatsku konverziju slika, pa ih moram ručno otpremiti jednu po jednu — muka velika.

Kada ovakvu muku iskusite više puta, počnete da je gadite.
Posebno za blogera poput mene, čiji tekstovi prate slike; često jedan članak ima i po nekoliko desetina slika, pa je ručni copy-paste zaista zamoran. Sadržaj je odavno napisan, a samo obrada slika oduzme pola sata — efikasnost je ispod svake mere.
Mislim da je sistem plugina Codexa prilično pogodan za ovakav scenario.
Zato sam napravio plugin za otpremanje Markdowna u Feishu, koji lokalni Markdown dokument, zajedno sa slikama i tekstom, jednim klikom šalje u Feishu. Sad se završi za nekoliko sekundi, slike se automatski konvertuju, format se savršeno čuva — mnogo bezbrižnije.

Evo, ovo je testni dokument koji se sad diže jednim klikom. Ako i vi imate sličan scenario konverzije Markdowna u Feishu, ovaj plugin je prava blagodet.
Vežite pojaseve, idemo.
Za pravljenje ovog plugina, prvi korak je na platformi Feishu otvorenih aplikacija napraviti enterprise vlastitu aplikaciju.
Feishu razvojački backstage: https://open.feishu.cn/app?lang=zh-CN

Ovaj put pravimo Feishu plugin.
Sledi deo za zahtev dozvola — potrebno je zatražiti dozvole vezane za Feishu Cloud Space i Cloud Docs, inače će otpremanje dokumenata prijaviti grešku dozvole.

Konkretno, dozvola koja se traži je [Pregled, komentarisane, izmena i upravljanje svim fajlovima u Cloud Space-u], ili direktno pretraga po [drive:drive].

U njoj se nalazi funkcija pisanja slika koja nam treba.

Nakon što zatražite dozvole i dobijete App ID i App Secret — to su akreditivi za naredne API pozive.

Treba da App ID i App Secret stavimo u promenljive okruženja, koje će plugin pri pokretanju automatski pročitati.

Jezgro logike plugina zapravo nije komplikovano — uglavnom tri koraka:
Prvi korak: Markdown u DOCX
Plugin je u suštini lokalni MCP stdio server, koji lokalni Markdown pretvara u docx, a zatim pomoću Feishu Cloud Space interfejsa i import-task interfejsa generiše Feishu dokument.

Ulaz plugina i metapodaci nalaze se u plugin.json i .mcp.json, a logika pokretanja u run_server.sh.
{
"mcpServers": {
"feishu-markdown-uploader": {
"type": "stdio",
"command": "/bin/bash",
"args": [
"./scripts/run_server.sh"
],
"cwd": ".",
"env": {
"PYTHONUTF8": "1"
}
}
}
}run_server.sh će prvo učitati .env.local/.env, a zatim pokrenuti Python servis.
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PLUGIN_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
if [[ -f "${PLUGIN_DIR}/.env.local" ]]; then
# shellcheck disable=SC1091
source "${PLUGIN_DIR}/.env.local"
fi
if [[ -f "${PLUGIN_DIR}/.env" ]]; then
# shellcheck disable=SC1091
source "${PLUGIN_DIR}/.env"
fi
cd "${PLUGIN_DIR}"
exec python3 "./scripts/feishu_markdown_uploader_server.py"Zašto prvo u docx?
Zato što ova implementacija ide putem "otpremi fajl + uvezi dokument" u Feishu, a ne direktno pisanje Markdowna u Feishu dokument.

convert_markdown_to_docx vrši konverziju Markdowna u docx pomoću pandoc-a; ključni parametar je --resource-path direktorijum gde se markdown nalazi, što je ujedno razlog zašto se lokalne slike sa relativnim putanjama mogu zapakirati u dokument.
Drugi korak: otpremanje u Feishu Cloud Space
Poziva se interfejs Feishu-a za otpremanje fajlova, koji generisani DOCX fajl otprema u Cloud Space.
curl_upload_file otprema binarni fajl u Feishu Cloud Space pomoću curl --form. Ovde se ne koristi čisti Python multipart, već se prepušta curl-u — implementacija je jednostavna, a kompatibilnost visoka.

Ovde je potrebno iskoristiti ranije dobijene App ID i App Secret za pribavljanje tokena za pristup, a zatim njime pozvati interfejs za otpremanje.

get_access_token menja FEISHU_APP_ID/FEISHU_APP_SECRET za tenant_access_token — to je preduslov za sve Feishu pozive.
Treći korak: uvoz kao Feishu dokument
Nakon što se dobije file token, poziva se interfejs Feishu-a za uvoz dokumenata koji iz Cloud Space-a uvozi DOCX fajl kao novi Feishu dokument. Ovaj interfejs je asinhron, pa je potrebno poll-ovati status uvoza dok se ne završi.

Po uspešnom uvozu, Feishu vraća URL dokumenta — to je konačni link ka Feishu dokumentu koji se može otvoriti u pretraživaču.
Nakon što sam ceo tok proverio, zapakirao sam ga u MCP server sa tri funkcije alata:
import_markdown_to_feishu: kompletan tok iz Markdowna u Feishu dokumentconvert_markdown_to_docx: radi samo lokalnu konverziju, zgodno za debagovanjeget_feishu_root_folder: dobavlja folder token korenog direktorijuma
Naravno, ovakav plugin uopšte nije morao da se pravi ručno.
Jer nam je Codex već obezbedio način za kreiranje plugina — dovoljno je da napišemo prompt.
Plugin Creator, imam ovakav scenario: želim da lokalni Markdown dokument otpremim u Feishu. Trenutno ga copy-paste-am tamo, ali pri lepljenju slike ne mogu da se koriste direktno, već ih moram ručno jedna po jedna preneti. Želim plugin koji se povezuje sa mojim Feishu nalogom, kreira dokument, prekopira sadržaj Markdowna i automatski otprema moje slike.

plugin-creator će nam jednim klikom generisati plugin.

Posle toga Codex može da nam odradi i test.

Ako nešto nije kako treba, može se podesiti.

Nacrtao sam dijagram toka — prilično je jednostavan.

Plugin je napisan, ali ono što me je zaista iznenadilo jeste dizajn pluginskog sistema Codexa.
Codex koristi MCP (Model Context Protocol) — otvoreni standard koji je pokrenuo Anthropic za komunikaciju između AI modela i spoljnih alata.
Jednostavno rečeno, MCP definiše standardni interfejs; dokle god vaš alat implementira taj interfejs, Codex ga može pozivati.

Ovaj dizajn ima nekoliko prednosti:
Prvo, jezički nezavisan.
MCP server može biti napisan u bilo kom jeziku, dovoljno je da podržava standardni ulaz i izlaz. Moj plugin je u Pythonu, ali može i u Node.js-u, Go-u, Rust-u, čak i Javi.
Drugo, izolacija procesa.
Svaki MCP server radi u nezavisnom procesu i sa Codexom komunicira preko standardnog ulaza i izlaza.
Treće, deklarativna konfiguracija.
Mogućnosti plugina se deklarišu kroz JSON fajl, uključujući funkcije alata, definicije parametara, strukturu povratnih vrednosti i sl. Codex pri pokretanju čita te konfiguracije i automatski razume šta plugin radi. Ovaj deklarativni dizajn čini trošak uvođenja plugina veoma niskim — ne mora se menjati kod Codexa, dovoljno je konfiguracioni fajl staviti u zadati direktorijum.

Četvrto, otvoren ekosistem.
MCP je otvoren protokol koji ne podržava samo Codex, već i Claude Code, Claude Desktop i drugi alati.
Konkretno, Codex plugin sadrži sledeće delove:
plugin.json: metapodaci plugina — naziv, verzija, opis, autor, ključne reči i sl. To su uglavnom informacije za prikaz na tržištu plugina.
.mcp.json: konfiguracija MCP servera — komanda za pokretanje, parametri, promenljive okruženja i sl. Codex čita taj fajl da zna kako da pokrene plugin.
MCP server: program koji stvarno pruža funkcionalnost; mora implementirati MCP protokol, obraditi zahteve koje šalje Codex i vratiti rezultate.
Na primeru mog Feishu plugina, struktura direktorijuma je sledeća:
plugins/feishu-markdown-uploader/
├── .codex-plugin/
│ └── plugin.json # Metapodaci plugina
├── .mcp.json # MCP konfiguracija
├── scripts/
│ ├── run_server.sh # Skripta za pokretanje
│ └── feishu_markdown_uploader_server.py # MCP server
├── .env.example # Primer promenljivih okruženja
└── README.md # Uputstvo za upotrebuMCP koristi JSON-RPC 2.0 kao komunikacioni protokol — laki protokol za udaljene pozive.
Codex i plugin razmenjuju poruke preko standardnog ulaza i izlaza; svaka poruka sadrži ID zahteva, ime metode, parametre itd. Plugin primi zahtev, izvrši odgovarajuću operaciju i zatim preko standardnog izlaza vrati rezultat.
Ovakav način komunikacije je jednostavan i pouzdan. Budući da je u pitanju lokalna međuprocesna komunikacija, nema mrežne latencije, pa je odziv veoma brz.
Po završetku razvoja plugina, testirao sam ga u Codexu i iskustvo je zaista dobro.
U razgovoru kažem Codexu: otpremi ovaj sadržaj u Feishu.

Codex automatski prepoznaje moj Feishu plugin, poziva funkciju import_markdown_to_feishu i prosleđuje putanju do Markdown fajla.

Ceo tok je potpuno automatski: konverzija formata, otpremanje fajla, uvoz dokumenta, vraćanje linka. Ja samo čekam konačni URL Feishu dokumenta.
Ono što je ranije zahtevalo pola sata ručnog rada, sad se reši za nekoliko sekundi. A slike se sve automatski obrade, redosled se ne promeša — mnogo bezbrižnije.
Razvoj u AI eri više nije solo. Možemo se osloniti na AI moći da brzo izgradimo alate koji rešavaju stvarne probleme. Ovakav skok efikasnosti tradicionalni način razvoja ne može da parira.
vidimo se u sledećem!
