@appaflytech/zeyrek-ai-mcp 0.0.7 → 0.0.9

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.
Files changed (54) hide show
  1. package/README.md +27 -21
  2. package/dist/config.js +2 -0
  3. package/dist/knowledge/backendConstraints.js +3 -0
  4. package/dist/knowledge/componentCatalog.js +172 -33
  5. package/dist/knowledge/componentEvents.js +35 -4
  6. package/dist/knowledge/errorPath.js +1 -1
  7. package/dist/knowledge/normalize.js +474 -23
  8. package/dist/knowledge/propTypes.js +5 -4
  9. package/dist/knowledge/rules.js +113 -6
  10. package/dist/knowledge/styleResolve.js +52 -5
  11. package/dist/knowledge/themeResolve.js +936 -0
  12. package/dist/knowledge/themeRules.js +221 -0
  13. package/dist/knowledge/themeSchema.js +335 -0
  14. package/dist/platform/domSummary.js +144 -0
  15. package/dist/platform/http.js +10 -2
  16. package/dist/platform/screenshot.js +492 -29
  17. package/dist/platform/screenshotMemory.js +55 -0
  18. package/dist/platform/strictArguments.js +32 -0
  19. package/dist/platform/writeDiff.js +6 -3
  20. package/dist/resources/examples/layout-app-shell.json +1 -1
  21. package/dist/resources/examples/page-sign-in.json +1 -1
  22. package/dist/resources/examples/theme-brand.json +162 -0
  23. package/dist/resources/guides/component.md +8 -2
  24. package/dist/resources/guides/expressions.md +6 -0
  25. package/dist/resources/guides/getting-started.md +6 -0
  26. package/dist/resources/guides/layout.md +36 -26
  27. package/dist/resources/guides/microservice.md +160 -6
  28. package/dist/resources/guides/page.md +165 -59
  29. package/dist/resources/guides/theme.md +210 -0
  30. package/dist/resources/guides/translation.md +13 -10
  31. package/dist/resources/guides/workflow.md +141 -7
  32. package/dist/resources/schema-fingerprint.json +2 -2
  33. package/dist/resources/schemas/CreateMicroserviceCommand.json +4 -1
  34. package/dist/resources/schemas/CreateWorkflowCommand.json +4 -1
  35. package/dist/resources/schemas/PreviewMicroserviceCommand.json +4 -1
  36. package/dist/resources/schemas/PreviewWorkflowCommand.json +4 -1
  37. package/dist/resources/schemas/StepDto.json +4 -1
  38. package/dist/resources/schemas/UpdateMicroserviceCommand.json +4 -1
  39. package/dist/resources/schemas/UpdateWorkflowCommand.json +4 -1
  40. package/dist/server.js +52 -42
  41. package/dist/tools/components.js +8 -0
  42. package/dist/tools/designSchemaPatch.js +152 -0
  43. package/dist/tools/flows.js +24 -21
  44. package/dist/tools/layouts.js +8 -8
  45. package/dist/tools/microservices.js +74 -10
  46. package/dist/tools/pages.js +275 -332
  47. package/dist/tools/projects.js +66 -9
  48. package/dist/tools/queries.js +72 -6
  49. package/dist/tools/schemaOps.js +280 -0
  50. package/dist/tools/screenWrite.js +2 -1
  51. package/dist/tools/screens.js +0 -7
  52. package/dist/tools/themes.js +163 -0
  53. package/dist/tools/workflows.js +10 -6
  54. package/package.json +1 -1
@@ -0,0 +1,163 @@
1
+ import { guid, projectParam, readOnly, updates } from './common.js';
2
+ import { diffCssVars, mergeRadiusScale, mergeSpacingScale, mergeTypeScale, resolveTheme } from '../knowledge/themeResolve.js';
3
+ import { diffThemePaths, mergeTheme, normalizeTheme, readProjectTheme, summarizeTheme, themeInput, unsetThemePaths } from '../knowledge/themeSchema.js';
4
+ import { componentPresetTypeWarnings, themeInputWarnings, unsetWarnings } from '../knowledge/themeRules.js';
5
+ import { attachFindings, enforcePolicy, evaluatePolicy, applyPolicyMode } from '../knowledge/policy.js';
6
+ import { projectUpdateForm } from './projects.js';
7
+ import { withNormalization } from '../knowledge/normalize.js';
8
+ import { PlatformApiError } from '../platform/errors.js';
9
+ import { policyRules } from '../knowledge/rules.js';
10
+ import { handle } from '../platform/responses.js';
11
+ import { z } from 'zod';
12
+ const modeParam = z.enum(['light', 'dark']);
13
+ /**
14
+ * Tema PROJE kaydıdır (`projects.theme` jsonb), ortam başına değil: okuma da yazma da
15
+ * Organization.API'ye gider ve `environment` parametresi YOKTUR. Kayıt her aktif ortamın tenant
16
+ * kopyasına platform tarafından yayılır (`UpdateProjectWhenOrganizationProjectUpdatedEventHandler`).
17
+ */
18
+ async function loadProject(platform, project) {
19
+ const slug = platform.resolveProject(project);
20
+ const payload = await platform.org('GET', `/p/${slug}`);
21
+ const data = (payload?.data ?? {});
22
+ return {
23
+ payload,
24
+ project: { id: data.id, slug: data.slug, name: data.name },
25
+ theme: readProjectTheme(payload)
26
+ };
27
+ }
28
+ const EMPTY_THEME_NOTE = 'Proje TEMASIZ — runtime platformun kendi varsayılanını çizer (accent #0052CC, Inter 14px, '
29
+ + 'radius 4px, spacing 10px). Marka için theme_update; yalnız TEK bir sayfada sapma istiyorsanız '
30
+ + "page_container.style içinde --ng-* değişkenlerini ezin (platform_guide('page') Kural 1h).";
31
+ export function registerThemeTools(server, platform) {
32
+ const config = platform.config;
33
+ server.registerTool('theme_get', {
34
+ title: 'Proje temasını getir',
35
+ description: "Projenin tema kaydını döner: hangi alanlara dokunulmuş (summary), kaydın kendisi (raw) ya da EKRANA İNEN hâli (resolved — tam palet + birleşik ölçekler + runtime'ın bastığı bütün --ng-* değişkenleri). 'Accent'i ezmedim, ekranda hangi mavi çiziliyor' sorusunun cevabı resolved kipidir. Tema PROJE kaydıdır: ortam parametresi yoktur, bütün ortamların runtime'ı aynı temayı çizer.",
36
+ inputSchema: {
37
+ project: projectParam,
38
+ view: z.enum(['summary', 'raw', 'resolved']).optional().describe("summary (varsayılan): dokunulmuş alanların dökümü + preset/bileşen preset listesi. raw: tema kaydı olduğu gibi. resolved: palet, token'lar, gölge kademeleri ve cssVars (--ng-* → değer)"),
39
+ mode: modeParam.optional().describe("Yalnız resolved: hangi mod çözülsün. Verilmezse kaydın kendi mode'u (yoksa light). Palet override'ları mod başına tutulur (palette / paletteDark), bu yüzden iki mod ayrı ayrı çözülür")
40
+ },
41
+ annotations: readOnly
42
+ }, handle(config, async ({ project, view, mode }) => {
43
+ const { project: projectInfo, theme } = await loadProject(platform, project);
44
+ const storedMode = theme?.mode === 'dark' ? 'dark' : 'light';
45
+ const head = { project: projectInfo, hasTheme: theme !== undefined, storedMode };
46
+ if (view === 'raw') {
47
+ return {
48
+ ...head,
49
+ theme: theme ?? {},
50
+ note: theme === undefined
51
+ ? EMPTY_THEME_NOTE
52
+ : "Kayıt olduğu gibi. Ekrana inen değerler için view:'resolved'; kısmi yazma için theme_update."
53
+ };
54
+ }
55
+ if (view === 'resolved') {
56
+ const resolved = resolveTheme(theme, mode);
57
+ return {
58
+ ...head,
59
+ mode: resolved.mode,
60
+ palette: resolved.palette,
61
+ // Alan adı 'tokens' OLAMAZ: `maskSecrets` anahtarında 'token' geçen her değeri '***' ile
62
+ // değiştiriyor (`secretKeyPattern`, platform/secrets.ts) ve yanıt sessizce boşalıyordu —
63
+ // ölçüldü 2026-09-15, tema token'ları tasarım değeri, gizli bilgi değil.
64
+ values: {
65
+ fontFamily: resolved.tokens.fontFamily,
66
+ fontHeading: resolved.tokens.headingFontFamily ?? resolved.tokens.fontFamily,
67
+ fontSize: resolved.tokens.fontSize,
68
+ fontWeight: resolved.tokens.fontWeight,
69
+ spacing: resolved.tokens.spacing,
70
+ borderRadius: resolved.tokens.borderRadius,
71
+ defaultInputSize: resolved.tokens.defaultInputSize,
72
+ typeScale: mergeTypeScale(resolved.tokens.typeScale),
73
+ radiusScale: mergeRadiusScale(resolved.tokens.radiusScale),
74
+ spacingScale: mergeSpacingScale(resolved.tokens.spacingScale),
75
+ shadow: resolved.tokens.shadow
76
+ },
77
+ shadow: resolved.shadow,
78
+ cssVars: resolved.cssVars,
79
+ presets: Object.keys(theme?.presets ?? {}),
80
+ componentPresets: Object.keys(theme?.componentPresets ?? {}),
81
+ note: "cssVars, Theme.svelte'nin her sayfaya bastığı değişkenlerdir; bir sayfanın page_container.style'ı aynı adı yeniden tanımlarsa O SAYFADA o kazanır. Koyu mod için mode:'dark' — ziyaretçinin kendi tercihi (theme-toggle, localStorage) runtime'da projenin modunun önüne geçer."
82
+ };
83
+ }
84
+ if (theme === undefined)
85
+ return { ...head, note: EMPTY_THEME_NOTE };
86
+ const summary = summarizeTheme(theme);
87
+ return {
88
+ ...head,
89
+ ...summary,
90
+ note: "Değerlerin ekrana indiği hâl için view:'resolved'; yazmak için theme_update (kısmi günceller, lint'ten geçirir, hangi CSS değişkeninin değiştiğini söyler). Adlı bir preset'i düğüme bağlamak: style.$preset — platform_guide('theme')."
91
+ };
92
+ }));
93
+ server.registerTool('theme_update', {
94
+ title: 'Proje temasını güncelle',
95
+ description: "Temayı KISMİ günceller: kaydı okur, verdiğiniz alanları derin birleştirir, normalize eder, lint'ten geçirir ve yazar — bir rengi değiştirmek preset'leri ve bileşen preset'lerini düşürmez. Yanıt hangi yolların değiştiğini (changed) ve hangi CSS değişkeninin hangi değerden hangi değere gittiğini (cssVarsChanged) söyler; dryRun ile yazmadan aynı yanıtı alırsınız. DİKKAT: tema PROJE kaydıdır — değişiklik BÜTÜN ortamların runtime'ına iner (production dâhil) ve Studio tema paneli açık ve kaydedilmemişse panelin sonraki Save'i bu yazmayı ezer.",
96
+ inputSchema: {
97
+ project: projectParam,
98
+ theme: themeInput.optional().describe("Yazılacak alanlar — KISMİ. Nesneler derin birleşir, dizi/ilkel değer yerine geçer. Tanınmayan anahtar (ör. 'pallete') istek gitmeden reddedilir: platform temayı doğrulamayan bir jsonb blob'u olarak saklar ve yazım hatası kayıtta sessizce yaşardı"),
99
+ unset: z.array(z.string().min(1)).optional().describe("Silinecek nokta yolları: 'presets.kart', 'componentPresets.button.versions.V2', 'headingFontFamily', 'paletteDark.accent.primary'. Silmenin kanalı budur — null yazmak silmez"),
100
+ replace: z.boolean().optional().describe("true: 'theme' mevcut kaydın YERİNE geçer (birleştirme yok). Temayı sıfırlamak: replace: true, theme: {}"),
101
+ applicationId: guid.optional().describe('Verilirse componentPresets tipleri o uygulamanın kataloğuna göre denetlenir (THEME-011); verilmezse bu kontrol atlanır'),
102
+ dryRun: z.boolean().optional().describe('Yazmadan aynı yanıtı döner: changed + cssVarsChanged + lint bulguları. Yazmadan önce ekranda ne değişeceğini görmenin yolu budur'),
103
+ policyOverride: z.boolean().optional().describe('block bulgularını warn\'a indirir (bilinçli istisna)')
104
+ },
105
+ annotations: updates
106
+ }, handle(config, async ({ project, theme, unset, replace, applicationId, dryRun, policyOverride }) => {
107
+ if (theme === undefined && (unset === undefined || unset.length === 0)) {
108
+ throw new PlatformApiError("theme_update: 'theme' ya da 'unset' parametrelerinden en az biri dolu olmalı. Temayı sıfırlamak için replace: true, theme: {} verin.", 400);
109
+ }
110
+ const { project: projectInfo, payload, theme: base } = await loadProject(platform, project);
111
+ const data = (payload?.data ?? {});
112
+ const name = typeof data.name === 'string' ? data.name : undefined;
113
+ const slug = typeof data.slug === 'string' ? data.slug : undefined;
114
+ if (name === undefined || data.id === undefined) {
115
+ throw new PlatformApiError(`theme_update: '${platform.resolveProject(project)}' projesi okunamadı (ad ya da id yok); project_get ile kontrol edin.`, 400);
116
+ }
117
+ const patch = (theme ?? {});
118
+ const current = base ?? {};
119
+ const merged = replace === true ? patch : mergeTheme(current, patch);
120
+ const removal = unsetThemePaths(merged, unset ?? []);
121
+ const normalized = normalizeTheme(removal.theme);
122
+ const next = normalized.theme;
123
+ const findings = [...enforcePolicy(evaluatePolicy(config, policyRules, 'theme', next, { operation: 'update' }, policyOverride))];
124
+ // Uyarılar `policyRules` dışında üretiliyor (girdiye ve platform okumasına bakıyorlar), bu
125
+ // yüzden POLICY kipini ve policyOverride'ı kendileri uygulamak zorunda — WF-031 ile aynı yol.
126
+ if (config.policyMode !== 'off') {
127
+ const warnings = [
128
+ ...themeInputWarnings(patch, next),
129
+ ...unsetWarnings(current, unset ?? [])
130
+ ];
131
+ if (applicationId !== undefined && Object.keys(next.componentPresets ?? {}).length > 0) {
132
+ const catalog = await platform.tenant('GET', project, `/components/${applicationId}`, { query: { pageIndex: 0, pageLength: 999 } })
133
+ .catch(() => undefined);
134
+ if (catalog?.data)
135
+ warnings.push(...componentPresetTypeWarnings(next, catalog.data));
136
+ }
137
+ findings.push(...applyPolicyMode(config, warnings, policyOverride));
138
+ }
139
+ const before = resolveTheme(current).cssVars;
140
+ const after = resolveTheme(next).cssVars;
141
+ const changed = diffThemePaths(current, next);
142
+ const head = {
143
+ project: projectInfo,
144
+ changed: { ...changed, ...(removal.missing.length > 0 ? { missing: removal.missing } : {}) },
145
+ cssVarsChanged: diffCssVars(before, after),
146
+ theme: summarizeTheme(next)
147
+ };
148
+ const panelWarning = "Studio tema paneli AÇIK ve kaydedilmemişse panelin sonraki Save'i bu yazmayı ezer; panel kapalıyken yazın.";
149
+ const note = `Tema PROJE kaydıdır: bu değişiklik bütün ortamların runtime'ına indi (production dâhil). Kanıt: page_screenshot — ikinci mod için colorScheme:'dark'. ${panelWarning}`;
150
+ if (dryRun === true) {
151
+ return attachFindings(withNormalization({
152
+ ...head,
153
+ dryRun: true,
154
+ // Kuru koşunun notu GELECEK zaman kurar: yazma notunu "YAZILMADI" önekiyle sunmak
155
+ // aynı cümlede iki şey söylüyordu ("yazılmadı" + "indi") — ölçüldü 2026-09-15 canlı koşu.
156
+ note: `YAZILMADI (dryRun) — bu çağrı hiçbir şey değiştirmedi. Yazarsanız değişiklik bütün ortamların runtime'ına iner (production dâhil) ve ekranda page_screenshot ile doğrulanır (ikinci mod için colorScheme:'dark'). ${panelWarning}`
157
+ }, normalized.fixes), findings);
158
+ }
159
+ const form = projectUpdateForm({ name, slug, theme: JSON.stringify(next) });
160
+ const response = await platform.org('PUT', `/projects/${String(data.id)}`, { form });
161
+ return attachFindings(withNormalization({ ...head, updated: true, note, platform: response }, normalized.fixes), findings);
162
+ }));
163
+ }
@@ -4,7 +4,7 @@ import { evaluatePolicy, enforcePolicy, attachFindings } from '../knowledge/poli
4
4
  import { workflowOutline, resolvePart, resolvePatchOperations } from '../knowledge/outlines.js';
5
5
  import { patchResult, baseVersionOf } from '../platform/patch.js';
6
6
  import { writeDiff, withWriteDiff } from '../platform/writeDiff.js';
7
- import { policyRules, microfunctionStepFindings } from '../knowledge/rules.js';
7
+ import { policyRules, microfunctionStepFindings, undefinedInputFieldFindings } from '../knowledge/rules.js';
8
8
  import { languageHeader } from '../knowledge/languageCodes.js';
9
9
  import { handle } from '../platform/responses.js';
10
10
  import fastJsonPatch from 'fast-json-patch';
@@ -118,7 +118,8 @@ export function registerWorkflowTools(server, platform) {
118
118
  const normalized = normalizeWorkflowDefinition(definition);
119
119
  const findings = enforcePolicy([
120
120
  ...evaluatePolicy(config, policyRules, 'workflow', definition, { operation: 'create', workflowKind: definition.type }, policyOverride),
121
- ...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride)
121
+ ...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride),
122
+ ...await undefinedInputFieldFindings(platform, project, environment, definition, definition.type, policyOverride)
122
123
  ]);
123
124
  const drift = unmappedMembers('CreateWorkflowCommand', definition);
124
125
  const payload = await platform.tenant('POST', project, `/workflows/${applicationId}`, { environment, body: definition });
@@ -133,7 +134,8 @@ export function registerWorkflowTools(server, platform) {
133
134
  const normalized = normalizeWorkflowDefinition(definition);
134
135
  const findings = enforcePolicy([
135
136
  ...evaluatePolicy(config, policyRules, 'workflow', definition, { operation: 'update', workflowKind: definition.type }, policyOverride),
136
- ...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride)
137
+ ...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride),
138
+ ...await undefinedInputFieldFindings(platform, project, environment, definition, definition.type, policyOverride)
137
139
  ]);
138
140
  const drift = unmappedMembers('UpdateWorkflowCommand', definition);
139
141
  const payload = await platform.tenant('PUT', project, `/workflows/${applicationId}/${id}`, { environment, body: definition });
@@ -153,7 +155,8 @@ export function registerWorkflowTools(server, platform) {
153
155
  const normalized = normalizeWorkflowDefinition(patched);
154
156
  const findings = enforcePolicy([
155
157
  ...evaluatePolicy(config, policyRules, 'workflow', patched, { operation: 'update', workflowKind: patched.type }, policyOverride),
156
- ...await microfunctionStepFindings(platform, project, environment, patched, patched.type, policyOverride)
158
+ ...await microfunctionStepFindings(platform, project, environment, patched, patched.type, policyOverride),
159
+ ...await undefinedInputFieldFindings(platform, project, environment, patched, patched.type, policyOverride)
157
160
  ]);
158
161
  const drift = introducedUnmappedMembers('UpdateWorkflowCommand', (current?.data ?? current), patched);
159
162
  // Gövde değil FARK gönderilir: gateway normalizasyonları da op'a çevrilsin diye net diff
@@ -185,7 +188,7 @@ export function registerWorkflowTools(server, platform) {
185
188
  }, handle(config, ({ project, environment, id }) => platform.tenant('POST', project, `/workflows/clone/${id}`, { environment })));
186
189
  server.registerTool('workflow_preview', {
187
190
  title: 'Workflow önizle',
188
- description: "Kaydedilmemiş workflow tanımını çalıştırır; kaydetmeden önce her akışı preview ile doğrulayın. definition = PreviewWorkflowCommand gövdesi. Test girdisi 'previewPayload' anahtarıyla verilir ('parameters'/'input' ÇALIŞMAZ), değişkenler 'previewVariables'. previewPayload STRING olmalıdır (JSON.stringify(...) ya da \"({ id: 1 })\") — nesne gönderilirse platform 'Unexpected end of input' ile 500 döner. Akışın parameterDtoId'si YOKSA previewPayload verilmez (platform 400 döner; gateway alanı düşürüp gatewayNormalized ile bildirir). Preview tek transaction'da koşar ve sonunda ROLLBACK edilir: table create/update step'leri kalıcı satır YAZMAZ (ölçüldü, İK koşusu W-1). Tek istisna code step içindeki dış HTTP çağrılarıdır — onlar geri alınamaz. Davranış kuralları: platform_guide('workflow'). " + constraintSummary('PreviewWorkflowCommand'),
191
+ description: "Kaydedilmemiş workflow tanımını çalıştırır; kaydetmeden önce her akışı preview ile doğrulayın. definition = PreviewWorkflowCommand gövdesi. Test girdisi 'previewPayload' anahtarıyla verilir ('parameters'/'input' ÇALIŞMAZ), değişkenler 'previewVariables'. previewPayload STRING olmalıdır (JSON.stringify(...) ya da \"({ id: 1 })\") — nesne gönderilirse platform 'Unexpected end of input' ile 500 döner. Akışın parameterDtoId'si YOKSA previewPayload verilmez (platform 400 döner; gateway alanı düşürüp gatewayNormalized ile bildirir). Preview tek transaction'da koşar ve sonunda ROLLBACK edilir: table create/update step'leri kalıcı satır YAZMAZ (ölçüldü, İK koşusu W-1). Tek istisna code step içindeki dış HTTP çağrılarıdır — onlar geri alınamaz. Yanıt WorkflowPreviewDto: steps[] (her adım: step{id,name,type}, input[] ifade→değer, output, hasError, errorType, errorMessage, errorDetail, elapsedMilliseconds, nextStep, children[] loop/alt akış, automations[]), input, output, executionSuccess. executionSuccess YALNIZ son adıma bakar; gateway tüm ağacı tarayıp hata bulursa yanıta 'runtimeErrors' ekler — HTTP 200 akışın geçtiği anlamına gelmez, ÖNCE bu alana bakın; 'input' boşsa girdi hiç bağlanmamıştır. Kayıtlı bir akışı çalıştırmadan sınamak için workflow_get gövdesini (steps + kayıtlı previewPayload/previewVariables) olduğu gibi verin — Studio'nun Önizleme düğmesi de bunu yapar. Zamanlanmış işin akışında previewPayload vermeyin (iş girdisiz koşar); job geçmişi hatayı mesaj olarak yazar, adım izini burada görün (platform_guide('microservice') §Zamanlanmış işin gerçek sonucunu görmek). Okuma rehberi: platform_guide('workflow') §Önizleme çıktısını okumak. " + constraintSummary('PreviewWorkflowCommand'),
189
192
  inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, definition: definitionParam, policyOverride: policyOverrideParam, language: languageParam },
190
193
  annotations: writes
191
194
  }, handle(config, async ({ project, environment, applicationId, definition, policyOverride, language }) => {
@@ -198,7 +201,8 @@ export function registerWorkflowTools(server, platform) {
198
201
  }
199
202
  const findings = enforcePolicy([
200
203
  ...evaluatePolicy(config, policyRules, 'workflow', definition, { operation: 'preview', workflowKind: definition.type }, policyOverride),
201
- ...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride)
204
+ ...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride),
205
+ ...await undefinedInputFieldFindings(platform, project, environment, definition, definition.type, policyOverride)
202
206
  ]);
203
207
  const payload = await platform.tenant('POST', project, `/workflows/${applicationId}/preview`, { environment, body: definition, headers: languageHeader(language, normalized) });
204
208
  return attachFindings(withNormalization(payload, normalized), findings);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appaflytech/zeyrek-ai-mcp",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "description": "Zeyrek (NgApps) platform APIs as MCP tools — data, logic and Studio design surface in one gateway",
6
6
  "license": "UNLICENSED",