@akredit/acik-mcp 0.8.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -956,7 +956,7 @@ const taslakDenetleAraci = arac({
|
|
|
956
956
|
sonuc: {
|
|
957
957
|
bicimdenGecenler: sonuclar.filter((x) => x.bicimDenetimi === "geçti").map((x) => x.etiket),
|
|
958
958
|
secenekler: sonuclar,
|
|
959
|
-
not:
|
|
959
|
+
not: taslakNotu(sonuclar),
|
|
960
960
|
resmiDayanak: RESMI_DAYANAK,
|
|
961
961
|
},
|
|
962
962
|
kaynak: [KAYNAK_KURALLAR],
|
|
@@ -1075,6 +1075,17 @@ export function ayristirOnAyikla(g) {
|
|
|
1075
1075
|
...ek,
|
|
1076
1076
|
};
|
|
1077
1077
|
}
|
|
1078
|
+
/** Taslak denetiminin notu sonuca göre: hiçbiri geçmediyse "geçti" denmez. */
|
|
1079
|
+
function taslakNotu(xs) {
|
|
1080
|
+
const gecen = xs.filter((x) => x.bicimDenetimi === "geçti").map((x) => x.etiket);
|
|
1081
|
+
if (!gecen.length)
|
|
1082
|
+
return "Biçim denetiminden geçmeyen alanlar var; düzeltip yeniden denetleyin. İçerik teyidi: hoca.";
|
|
1083
|
+
const kismi = gecen.length < xs.length
|
|
1084
|
+
? ` Yalnız şu seçenekler geçti: ${gecen.join(", ")}; öbürlerinde geçmeyen alanlar var.`
|
|
1085
|
+
: "";
|
|
1086
|
+
return `Biçim denetiminden geçti; içerik teyidi: hoca.${kismi} Sonuç yalnız Akredit'in biçim kurallarına uyulduğunu söyler; içeriğin doğruluğuna ve derse uygunluğuna hoca karar verir.`;
|
|
1087
|
+
}
|
|
1088
|
+
const TUL_TEYIDI = "Haftalık ders saatleri (teori + uygulama + laboratuvar)";
|
|
1078
1089
|
/**
|
|
1079
1090
|
* Ayrıştırmanın hemen ardından denetim: tarama sırasında ders başına iki çağrı yerine bir çağrı yeter.
|
|
1080
1091
|
* Girdi denetimin şemasından geçmezse (sayfa eksik okunduysa) denetim atlanır, asistan bologna_denetle'yi çağırır.
|
|
@@ -1095,6 +1106,8 @@ function gomuluDenetim(ders, b) {
|
|
|
1095
1106
|
teyitSorulacak: [
|
|
1096
1107
|
...(d.degerlendirme.length ? [] : ["Değerlendirme yöntem ve yüzdeleri"]),
|
|
1097
1108
|
...(d.kaynaklar?.length || d.kaynakSayisi ? [] : ["Kullanılan kaynaklar"]),
|
|
1109
|
+
// T+U+L yoksa ya da 0+0+0 ise (kayıt yok) iş yükü hesaplanamaz; haftalık saatler hocaya sorulur.
|
|
1110
|
+
...((tulSaati(d.tul) ?? 0) > 0 ? [] : [TUL_TEYIDI]),
|
|
1098
1111
|
],
|
|
1099
1112
|
};
|
|
1100
1113
|
}
|
|
@@ -1116,11 +1129,14 @@ function prolizMetniSonucu(ham, ek, b) {
|
|
|
1116
1129
|
const kaynaklar = [...ek.kaynaklar, ...p.kaynaklar];
|
|
1117
1130
|
const yetkililer = [...ek.yetkililer, ...p.yetkililer];
|
|
1118
1131
|
const ad = d.ad ?? ek.dersIpucu?.ad;
|
|
1132
|
+
// 0+0+0 kayıt yok demektir: sayfadaki ya da ipucundaki sıfırdan büyük T+U+L kullanılır, yoksa alan boş kalır.
|
|
1133
|
+
const tul = [d.tul, ek.dersIpucu?.tul].find((t) => (tulSaati(t) ?? 0) > 0);
|
|
1134
|
+
const tulYok = tul === undefined;
|
|
1119
1135
|
const ders = {
|
|
1120
1136
|
kod: d.kod ?? ek.dersIpucu?.kod ?? "DERS",
|
|
1121
1137
|
...(ad ? { ad } : {}),
|
|
1122
1138
|
yariyil: d.yariyil,
|
|
1123
|
-
...(
|
|
1139
|
+
...(tul ? { tul } : {}),
|
|
1124
1140
|
kredi: d.kredi,
|
|
1125
1141
|
akts: d.akts ?? ek.dersIpucu?.akts ?? null,
|
|
1126
1142
|
...(d.guncelleme ? { guncelleme: d.guncelleme } : {}),
|
|
@@ -1143,11 +1159,14 @@ function prolizMetniSonucu(ham, ek, b) {
|
|
|
1143
1159
|
])),
|
|
1144
1160
|
};
|
|
1145
1161
|
const bosPaket = p.bulunan.length === 0 || (!d.amac && !d.icerik && !d.ciktilar.length && !d.degerlendirme.length);
|
|
1146
|
-
const
|
|
1162
|
+
const tulNotu = tulYok
|
|
1163
|
+
? " T+U+L yok ya da 0+0+0: haftalık ders saatleri (teori + uygulama + laboratuvar) aynı TEK mesajda sorulur; peşin onayda sorulmaz, iş yükü EKSİK kalır."
|
|
1164
|
+
: "";
|
|
1165
|
+
const sonrakiAdim = `${bosPaket
|
|
1147
1166
|
? "Boş paket: sayfadaki bütün alanlar boş (denetim.doldurulacak). Hepsini öneriyle doldurun (bologna_alan_rehberi, bologna_taslak_denetle) ve 'öneri' etiketiyle son özette gösterin. Değerlendirme yöntem ve yüzdeleri ile kullanılan kaynaklar hocaya TEK mesajda sorulur; peşin onayda sorulmaz, EKSİK bırakılır. Uydurmayın."
|
|
1148
1167
|
: d.degerlendirme.length
|
|
1149
1168
|
? "Yanıttaki denetim alanı hazırdır; bologna_denetle'yi ayrıca çağırmayın. Değerlendirme sayfadan okundu: hocaya sormayın; taslakta degerlendirmeDayanagi: 'sayfa' ve degerlendirmeKaniti olarak bu yanıttaki degerlendirmeKaniti metnini aynen verin. Yalnız denetim.teyitSorulacak'taki bilgiler hocaya TEK mesajda sorulur. Sonraki çağrılarda ingilizce değerini aynen verin."
|
|
1150
|
-
: "Yanıttaki denetim alanı hazırdır; bologna_denetle'yi ayrıca çağırmayın. Değerlendirme yöntem ve yüzdeleri sayfada yok: hocaya TEK mesajda sorun (peşin onayda EKSİK bırakın), tahmin etmeyin. Sonraki çağrılarda ingilizce değerini aynen verin."
|
|
1169
|
+
: "Yanıttaki denetim alanı hazırdır; bologna_denetle'yi ayrıca çağırmayın. Değerlendirme yöntem ve yüzdeleri sayfada yok: hocaya TEK mesajda sorun (peşin onayda EKSİK bırakın), tahmin etmeyin. Sonraki çağrılarda ingilizce değerini aynen verin."}${tulNotu}`;
|
|
1151
1170
|
return {
|
|
1152
1171
|
sonuc: {
|
|
1153
1172
|
tur: "ders",
|
|
@@ -1176,7 +1195,7 @@ const ayristirAraci = arac({
|
|
|
1176
1195
|
ad: "bologna_ayristir",
|
|
1177
1196
|
baslik: "Bologna sayfasını ayrıştır",
|
|
1178
1197
|
aciklama: "Yapıştırılan Bologna ders sayfasını ya da program çıktıları sayfasını çözer. Önce Proliz biçimini dener, olmazsa her OBS için genel ayrıştırıcı çalışır (HTML ya da düz metin, Türkçe ya da İngilizce etiketler). Bulunan ve bulunamayan alanları, güven düzeyini söyler. Adres çekmez.",
|
|
1179
|
-
sonrakiAdim: "Yanıttaki denetim alanı varsa bologna_denetle'yi ayrıca çağırmayın: eksikler (denetim.doldurulacak) ve teyit sorulacaklar (denetim.teyitSorulacak) hazırdır. Denetim alanı yoksa ders verisini bologna_denetle'ye verin (girdi hazır: bolognaDenetleGirdisi). Sonraki çağrılarda ingilizce değerini aynen verin. Sayfada değerlendirme yüzdeleri ya da kaynaklar yoksa yalnız bunları hocaya TEK mesajda sorun; yüzdeyi tahmin etmeyin. Uygulama/lab T+U+L'den okunur (U+L > 0 ise var), sorulmaz. Amaç ve içerik sayfada yoksa önden sorulmaz; 'öneri' olarak yazılıp son özette teyide sunulur.",
|
|
1198
|
+
sonrakiAdim: "Yanıttaki denetim alanı varsa bologna_denetle'yi ayrıca çağırmayın: eksikler (denetim.doldurulacak) ve teyit sorulacaklar (denetim.teyitSorulacak) hazırdır. Denetim alanı yoksa ders verisini bologna_denetle'ye verin (girdi hazır: bolognaDenetleGirdisi). Sonraki çağrılarda ingilizce değerini aynen verin. Sayfada değerlendirme yüzdeleri ya da kaynaklar yoksa yalnız bunları hocaya TEK mesajda sorun; yüzdeyi tahmin etmeyin. Uygulama/lab T+U+L'den okunur (U+L > 0 ise var), sorulmaz; T+U+L yok ya da 0+0+0 ise haftalık ders saatleri (teori + uygulama + laboratuvar) aynı TEK mesajda sorulur (peşin onayda sorulmaz, iş yükü EKSİK kalır). Amaç ve içerik sayfada yoksa önden sorulmaz; 'öneri' olarak yazılıp son özette teyide sunulur.",
|
|
1180
1199
|
kisiselVeriKapsami: BOLOGNA_KAPSAMI,
|
|
1181
1200
|
kunyeAlanlari: BOLOGNA_KUNYE_ALANLARI,
|
|
1182
1201
|
onAyikla: ayristirOnAyikla,
|
|
@@ -1196,9 +1215,15 @@ const ayristirAraci = arac({
|
|
|
1196
1215
|
kod: z.string().trim().min(1).max(30),
|
|
1197
1216
|
ad: z.string().trim().max(200).optional(),
|
|
1198
1217
|
akts: z.number().min(0).max(60).optional(),
|
|
1218
|
+
tul: z
|
|
1219
|
+
.string()
|
|
1220
|
+
.trim()
|
|
1221
|
+
.max(20)
|
|
1222
|
+
.optional()
|
|
1223
|
+
.describe("Ders listesindeki T+U+L, ör. '2+1+0'. 0+0+0 kayıt yok demektir."),
|
|
1199
1224
|
})
|
|
1200
1225
|
.optional()
|
|
1201
|
-
.describe("Ders listesinden bilinen kod, ad ve
|
|
1226
|
+
.describe("Ders listesinden bilinen kod, ad, AKTS ve T+U+L (obs_ders_listesi taramaPlani). Sayfada yoksa bunlar kullanılır; boş pakette ders kodu ve adı sayfada görünmez."),
|
|
1202
1227
|
sayfaIpucu: z
|
|
1203
1228
|
.object({ prolizMetni: z.boolean(), ingilizce: z.boolean() })
|
|
1204
1229
|
.optional()
|
|
@@ -127,11 +127,13 @@ export function yazarEslesir(sorgu, yazarlar) {
|
|
|
127
127
|
});
|
|
128
128
|
}
|
|
129
129
|
// ---------------------------------------------------------------- Güvenli istek
|
|
130
|
-
async function getir(f, adres) {
|
|
130
|
+
async function getir(f, adres, hata) {
|
|
131
131
|
if (adres.protocol !== "https:" || !IZINLI_HOSTLAR.includes(adres.hostname))
|
|
132
132
|
throw new Error("İzinsiz host");
|
|
133
133
|
if (adres.hostname === "www.googleapis.com" && !adres.pathname.startsWith("/books/"))
|
|
134
134
|
throw new Error("İzinsiz yol");
|
|
135
|
+
if (adres.hostname === "openlibrary.org" && !OPENLIBRARY_YOLLARI.includes(adres.pathname))
|
|
136
|
+
throw new Error("İzinsiz yol");
|
|
135
137
|
return sinirli(async () => {
|
|
136
138
|
let y;
|
|
137
139
|
try {
|
|
@@ -142,10 +144,13 @@ async function getir(f, adres) {
|
|
|
142
144
|
});
|
|
143
145
|
}
|
|
144
146
|
catch {
|
|
147
|
+
hata?.();
|
|
145
148
|
return null;
|
|
146
149
|
}
|
|
147
|
-
if (!y.ok)
|
|
150
|
+
if (!y.ok) {
|
|
151
|
+
hata?.();
|
|
148
152
|
return null;
|
|
153
|
+
}
|
|
149
154
|
const uzunluk = Number(y.headers.get("content-length") ?? "0");
|
|
150
155
|
if (uzunluk > EN_BUYUK_YANIT)
|
|
151
156
|
return null;
|
|
@@ -211,6 +216,18 @@ const OpenLibraryKitap = z.object({
|
|
|
211
216
|
publish_date: z.string().optional(),
|
|
212
217
|
});
|
|
213
218
|
const OpenLibraryYanit = z.record(z.string(), OpenLibraryKitap);
|
|
219
|
+
const OpenLibraryAramaYanit = z.object({
|
|
220
|
+
docs: z
|
|
221
|
+
.array(z.object({
|
|
222
|
+
key: z.string().regex(/^\/works\/OL\d+W$/u),
|
|
223
|
+
title: z.string(),
|
|
224
|
+
author_name: z.array(z.string()).optional(),
|
|
225
|
+
publish_year: z.array(z.number().int()).optional(),
|
|
226
|
+
publisher: z.array(z.string()).optional(),
|
|
227
|
+
isbn: z.array(z.string()).optional(),
|
|
228
|
+
}))
|
|
229
|
+
.optional(),
|
|
230
|
+
});
|
|
214
231
|
const GoogleCilt = z.object({
|
|
215
232
|
id: z.string(),
|
|
216
233
|
volumeInfo: z.object({
|
|
@@ -301,6 +318,8 @@ function googleKunye(c) {
|
|
|
301
318
|
// ---------------------------------------------------------------- Sorgular
|
|
302
319
|
const CROSSREF = "https://api.crossref.org/works";
|
|
303
320
|
const OPENLIBRARY = "https://openlibrary.org/api/books";
|
|
321
|
+
const OPENLIBRARY_ARAMA = "https://openlibrary.org/search.json";
|
|
322
|
+
const OPENLIBRARY_YOLLARI = ["/api/books", "/search.json"];
|
|
304
323
|
const GOOGLE = "https://www.googleapis.com/books/v1/volumes";
|
|
305
324
|
const KAYIT_ADI = {
|
|
306
325
|
kitap: "kitap",
|
|
@@ -366,18 +385,12 @@ async function isbnIle(f, isbn) {
|
|
|
366
385
|
: undefined;
|
|
367
386
|
return c ? googleKunye(c) : null;
|
|
368
387
|
}
|
|
388
|
+
/**
|
|
389
|
+
* Başlık+yazar araması. Sıra: Crossref (makale), Open Library (kitap), Google Books (son çare).
|
|
390
|
+
* Google'a ulaşılamazsa (kota, HTTP hatası) o katalog atlanır ve bu durum bildirilir.
|
|
391
|
+
*/
|
|
369
392
|
async function baslikIle(f, baslik, yazar, s) {
|
|
370
393
|
const uygun = (k) => baslikEslesir(baslik, k.baslik) && yazarEslesir(yazar, k.yazarlar) && ekDenetim(k, s) === null;
|
|
371
|
-
const g = new URL(GOOGLE);
|
|
372
|
-
g.searchParams.set("q", `intitle:${baslik} inauthor:${yazar}`);
|
|
373
|
-
g.searchParams.set("maxResults", "5");
|
|
374
|
-
const gy = GoogleYanit.safeParse(await getir(f, g));
|
|
375
|
-
if (gy.success)
|
|
376
|
-
for (const x of gy.data.items ?? []) {
|
|
377
|
-
const k = googleKunye(x);
|
|
378
|
-
if (baslikEslesir(baslik, x.volumeInfo.title) && uygun(k))
|
|
379
|
-
return k;
|
|
380
|
-
}
|
|
381
394
|
const cr = new URL(CROSSREF);
|
|
382
395
|
cr.searchParams.set("query.bibliographic", baslik);
|
|
383
396
|
cr.searchParams.set("query.author", yazar);
|
|
@@ -387,9 +400,47 @@ async function baslikIle(f, baslik, yazar, s) {
|
|
|
387
400
|
for (const e of cy.data.message.items) {
|
|
388
401
|
const k = crossrefKunye(e);
|
|
389
402
|
if (k && uygun(k))
|
|
390
|
-
return k;
|
|
403
|
+
return { k, googleUlasilamadi: false };
|
|
391
404
|
}
|
|
392
|
-
|
|
405
|
+
if (s.tur === undefined || s.tur === "kitap" || s.tur === "herhangi") {
|
|
406
|
+
const ol = new URL(OPENLIBRARY_ARAMA);
|
|
407
|
+
ol.searchParams.set("title", baslik);
|
|
408
|
+
ol.searchParams.set("author", yazar);
|
|
409
|
+
ol.searchParams.set("limit", "10");
|
|
410
|
+
ol.searchParams.set("fields", "key,title,author_name,publish_year,publisher,isbn");
|
|
411
|
+
const oy = OpenLibraryAramaYanit.safeParse(await getir(f, ol));
|
|
412
|
+
if (oy.success)
|
|
413
|
+
for (const d of oy.data.docs ?? []) {
|
|
414
|
+
// Yıl verildiyse kaydın baskı yılları (publish_year) arasında geçmeli; ilk yayın yılı tek başına yetmez.
|
|
415
|
+
// Yıl verilmediyse künyeye yıl yazılmaz (hangi baskı olduğu bilinmez).
|
|
416
|
+
const yil = s.yil !== undefined && (d.publish_year ?? []).includes(s.yil) ? s.yil : undefined;
|
|
417
|
+
if (s.yil !== undefined && yil === undefined)
|
|
418
|
+
continue;
|
|
419
|
+
const k = kur({
|
|
420
|
+
tur: "kitap",
|
|
421
|
+
yazarlar: d.author_name ?? [],
|
|
422
|
+
baslik: d.title,
|
|
423
|
+
...(yil ? { yil } : {}),
|
|
424
|
+
...(d.publisher?.length === 1 && d.publisher[0] ? { yayinevi: d.publisher[0] } : {}),
|
|
425
|
+
}, `https://openlibrary.org${d.key}`, "Open Library");
|
|
426
|
+
if (uygun(k))
|
|
427
|
+
return { k, googleUlasilamadi: false };
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
let googleUlasilamadi = false;
|
|
431
|
+
const g = new URL(GOOGLE);
|
|
432
|
+
g.searchParams.set("q", `intitle:${baslik} inauthor:${yazar}`);
|
|
433
|
+
g.searchParams.set("maxResults", "5");
|
|
434
|
+
const gy = GoogleYanit.safeParse(await getir(f, g, () => {
|
|
435
|
+
googleUlasilamadi = true;
|
|
436
|
+
}));
|
|
437
|
+
if (gy.success)
|
|
438
|
+
for (const x of gy.data.items ?? []) {
|
|
439
|
+
const k = googleKunye(x);
|
|
440
|
+
if (baslikEslesir(baslik, x.volumeInfo.title) && uygun(k))
|
|
441
|
+
return { k, googleUlasilamadi: false };
|
|
442
|
+
}
|
|
443
|
+
return { k: null, googleUlasilamadi };
|
|
393
444
|
}
|
|
394
445
|
const KaynakSorgusu = z
|
|
395
446
|
.object({
|
|
@@ -421,11 +472,15 @@ export async function kaynakDogrula(f, k) {
|
|
|
421
472
|
return bulunamadi("ISBN geçersiz (sağlama basamağı tutmuyor).");
|
|
422
473
|
return sonla(await isbnIle(f, i), "isbn", { ...ek, tur: k.tur ?? "kitap" }, "Bu ISBN Open Library ve Google Books'ta bulunamadı.");
|
|
423
474
|
}
|
|
424
|
-
|
|
475
|
+
const b = await baslikIle(f, k.baslik ?? "", k.yazar ?? "", ek);
|
|
476
|
+
return sonla(b.k, "baslik_yazar", ek, b.googleUlasilamadi
|
|
477
|
+
? "Bu başlık ve yazarla (tam soyad, verildiyse tür ve yıl) eşleşen eser Crossref ve Open Library kataloglarında bulunamadı; Google Books'a ulaşılamadı (kota ya da bağlantı sorunu), orada aranamadı. Daha sonra yeniden deneyin ya da ISBN ile arayın."
|
|
478
|
+
: "Bu başlık ve yazarla (tam soyad, verildiyse tür ve yıl) eşleşen eser Crossref, Open Library ve Google Books kataloglarında bulunamadı. Türkçe kitapların çoğu bu kataloglarda yoktur.");
|
|
425
479
|
}
|
|
426
480
|
const KATALOG_KAYNAKLARI = [
|
|
427
481
|
{ ad: "Crossref REST API", adres: "https://api.crossref.org" },
|
|
428
482
|
{ ad: "Open Library Books API", adres: "https://openlibrary.org/developers/api" },
|
|
483
|
+
{ ad: "Open Library Search API", adres: "https://openlibrary.org/dev/docs/api/search" },
|
|
429
484
|
{ ad: "Google Books API", adres: "https://developers.google.com/books" },
|
|
430
485
|
];
|
|
431
486
|
export const kaynakDogrulaAraci = arac({
|
|
@@ -2,7 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
import { type AcikArac, type AracBaglami } from "./araclar.ts";
|
|
3
3
|
import { type AcikIstem } from "./promptlar.ts";
|
|
4
4
|
export declare const SUNUCU_ADI = "akredit-acik";
|
|
5
|
-
export declare const SUNUCU_SURUMU = "0.8.
|
|
5
|
+
export declare const SUNUCU_SURUMU = "0.8.2";
|
|
6
6
|
export declare const SUNUCU_TALIMATI: string;
|
|
7
7
|
/** Her araç yanıtında yinelenen kısa kural: uzun sohbette son okunan metin de aynı şeyi söyler. */
|
|
8
8
|
export declare const SORMADAN_DEVAM = "Bu ad\u0131mda hocaya soru sormay\u0131n ve onay beklemeyin; do\u011Frudan sonrakiAdim'\u0131 uygulay\u0131n.";
|
|
@@ -6,7 +6,7 @@ import { ACIK_ARACLAR, AKREDIT_NOTU, AracHatasi, DEPO, } from "./araclar.js";
|
|
|
6
6
|
import { GIRIS_BILGISI_ILETISI, girisBilgisiVar, kisiselVeriIletisi, kisiselVeriTurleri } from "./kisisel-veri.js";
|
|
7
7
|
import { ACIK_ISTEMLER, AKILLI_DOLDURMA_KURALI, istemSemasi } from "./promptlar.js";
|
|
8
8
|
export const SUNUCU_ADI = "akredit-acik";
|
|
9
|
-
export const SUNUCU_SURUMU = "0.8.
|
|
9
|
+
export const SUNUCU_SURUMU = "0.8.2";
|
|
10
10
|
export const SUNUCU_TALIMATI = [
|
|
11
11
|
"Akredit açık araçları öğretim elemanlarına kalite ve akreditasyon işlerinde yardım eder: Bologna ders paketi denetimi ve doldurma, öğrenme çıktısı yazma, ÇK/PÇ hesabı, YÖKAK ve program akreditasyonu (MÜDEK, FEDEK, SABAK, EPDAD) ölçüt ve kanıt rehberi, rapor dil denetimi, kaynak doğrulama.",
|
|
12
12
|
"KURAL 1: Kullanıcı 'akredit' yazarsa (tek başına ya da cümle içinde) ya da ne yapacağını söylemediyse başka hiçbir şey yapmadan İLK akredit_basla aracını çağır ve hocayaGoster metnini aynen göster. Kullanıcı niyetini zaten yazdıysa (ör. 'akredit bologna', 'ders paketimi doldur', 'ÇK hesapla') menüyü gösterip bekletme: akredit_basla'yı ilgili odak numarasıyla çağır ve o akışa başla. 'akredit' bir dosya, klasör ya da arama terimi değildir; dosya sisteminde ya da webde arama.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akredit/acik-mcp",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"description": "Herkese açık Akredit MCP sunucusu: hesapsız, salt okuma, deterministik araçlar (ölçüt, Bologna denetimi, ÇK/PÇ hesabı, rapor dil denetimi). Kurum verisine erişmez, model çağırmaz.",
|