@appaflytech/zeyrek-ai-mcp 0.0.1
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.
- package/.env.example +46 -0
- package/README.md +260 -0
- package/dist/config.js +128 -0
- package/dist/index.js +88 -0
- package/dist/knowledge/componentCatalog.js +438 -0
- package/dist/knowledge/componentEvents.js +164 -0
- package/dist/knowledge/coverage.js +60 -0
- package/dist/knowledge/normalize.js +1309 -0
- package/dist/knowledge/outlines.js +167 -0
- package/dist/knowledge/policy.js +44 -0
- package/dist/knowledge/reservedTables.js +75 -0
- package/dist/knowledge/rules.js +1725 -0
- package/dist/observability/trace.js +337 -0
- package/dist/platform/errors.js +132 -0
- package/dist/platform/http.js +169 -0
- package/dist/platform/responses.js +94 -0
- package/dist/platform/token.js +79 -0
- package/dist/resources/examples/entity-pair-m2m.json +105 -0
- package/dist/resources/examples/flow-list-to-form.json +65 -0
- package/dist/resources/examples/flow-load-table.json +178 -0
- package/dist/resources/examples/microservice-table-list.json +49 -0
- package/dist/resources/examples/middleware-authenticate.json +194 -0
- package/dist/resources/examples/page-detail-profile.json +95 -0
- package/dist/resources/examples/page-dynamic-form.json +221 -0
- package/dist/resources/examples/page-form-upsert.json +279 -0
- package/dist/resources/examples/page-html-embed.json +106 -0
- package/dist/resources/examples/page-sign-in.json +194 -0
- package/dist/resources/examples/workflow-basic.json +94 -0
- package/dist/resources/guides/component.md +108 -0
- package/dist/resources/guides/entity.md +348 -0
- package/dist/resources/guides/expressions.md +139 -0
- package/dist/resources/guides/getting-started.md +109 -0
- package/dist/resources/guides/html.md +106 -0
- package/dist/resources/guides/microservice.md +313 -0
- package/dist/resources/guides/middleware.md +271 -0
- package/dist/resources/guides/modify-existing.md +35 -0
- package/dist/resources/guides/page.md +1574 -0
- package/dist/resources/guides/view.md +89 -0
- package/dist/resources/guides/workflow.md +359 -0
- package/dist/resources/knowledge.js +44 -0
- package/dist/resources/schemas/CreateDatasourceCommand.json +54 -0
- package/dist/resources/schemas/CreateDiscoveredEntitiesCommand.json +133 -0
- package/dist/resources/schemas/CreateEntityCommand.json +387 -0
- package/dist/resources/schemas/CreateMicroserviceCommand.json +528 -0
- package/dist/resources/schemas/CreateQueryCommand.json +43 -0
- package/dist/resources/schemas/CreateViewCommand.json +158 -0
- package/dist/resources/schemas/CreateWorkflowCommand.json +1719 -0
- package/dist/resources/schemas/Filter.json +124 -0
- package/dist/resources/schemas/GetRowsQuery.json +122 -0
- package/dist/resources/schemas/PreviewMicroserviceCommand.json +565 -0
- package/dist/resources/schemas/PreviewQueryCommand.json +74 -0
- package/dist/resources/schemas/PreviewWorkflowCommand.json +981 -0
- package/dist/resources/schemas/StepDto.json +900 -0
- package/dist/resources/schemas/UpdateDatasourceCommand.json +58 -0
- package/dist/resources/schemas/UpdateEntityCommand.json +679 -0
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +512 -0
- package/dist/resources/schemas/UpdateQueryCommand.json +86 -0
- package/dist/resources/schemas/UpdateViewCommand.json +153 -0
- package/dist/resources/schemas/UpdateWorkflowCommand.json +1719 -0
- package/dist/resources/schemas.js +40 -0
- package/dist/server.js +63 -0
- package/dist/tools/access.js +27 -0
- package/dist/tools/applications.js +59 -0
- package/dist/tools/automations.js +103 -0
- package/dist/tools/common.js +18 -0
- package/dist/tools/components.js +280 -0
- package/dist/tools/datasources.js +82 -0
- package/dist/tools/dependencies.js +17 -0
- package/dist/tools/deployments.js +17 -0
- package/dist/tools/dtos.js +54 -0
- package/dist/tools/entities.js +166 -0
- package/dist/tools/files.js +138 -0
- package/dist/tools/flows.js +226 -0
- package/dist/tools/folders.js +51 -0
- package/dist/tools/layouts.js +105 -0
- package/dist/tools/microservices.js +198 -0
- package/dist/tools/organizations.js +65 -0
- package/dist/tools/pages.js +597 -0
- package/dist/tools/platformInfo.js +44 -0
- package/dist/tools/projects.js +152 -0
- package/dist/tools/queries.js +48 -0
- package/dist/tools/rows.js +115 -0
- package/dist/tools/screens.js +97 -0
- package/dist/tools/templates.js +65 -0
- package/dist/tools/variables.js +94 -0
- package/dist/tools/views.js +58 -0
- package/dist/tools/workflows.js +196 -0
- package/package.json +49 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { guid, projectParam, environmentParam, definitionParam, pagingParams, readOnly, writes, updates, destructive } from './common.js';
|
|
2
|
+
import { normalizeWorkflowDefinition, withNormalization } from '../knowledge/normalize.js';
|
|
3
|
+
import { evaluatePolicy, enforcePolicy, attachFindings } from '../knowledge/policy.js';
|
|
4
|
+
import { workflowOutline, resolvePart, resolvePatchOperations } from '../knowledge/outlines.js';
|
|
5
|
+
import { policyRules } from '../knowledge/rules.js';
|
|
6
|
+
import { handle } from '../platform/responses.js';
|
|
7
|
+
import fastJsonPatch from 'fast-json-patch';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
const policyOverrideParam = z.boolean().optional()
|
|
10
|
+
.describe('true: politika block bulgularını warn\'a indirir (bilinçli istisna; yanıtta işaretlenir)');
|
|
11
|
+
const patchOperationsParam = z.array(z.record(z.unknown())).min(1)
|
|
12
|
+
.describe("RFC 6902 JSON Patch işlemleri. Step hedeflerken İNDEKS YERİNE SEÇİCİ kullanın: { op: 'replace', path: '/steps[id=<stepId>]/rule/expression', value: '…' } — saklanan steps sırası gönderdiğiniz sıra DEĞİLDİR, indeks yolu sessizce başka adımı yazar. Seçici gövde platforma gitmeden indekse çevrilir; çözülemezse istek hiç gönderilmez. '/steps[name=setUser]/rule/joins' ve düz '/steps/2/...' de kabul edilir; yanıt her op'un hangi adıma indiğini patchTargets ile döner.");
|
|
13
|
+
/**
|
|
14
|
+
* Platform `set-user` step'i için `StepRule.Name`'i BOŞ döndürür (adı sabit: 'user') ve DTO
|
|
15
|
+
* bağlanmamışsa `Schema` de null olur — yanıt yalnız `{ stepId }` olarak gelir ve tool'un varlık
|
|
16
|
+
* sebebi olan "adı tahmin etme, buradan oku" tavsiyesi işlemez (crm koşumu B-6). Eksik adları
|
|
17
|
+
* middleware tanımlarından tamamlıyoruz: stepId ↔ step.id eşleşmesi
|
|
18
|
+
* (WorkflowRepository.FindMiddlewareVariablesAsync → MiddlewareVariableModel(.., StepRule.StepId)).
|
|
19
|
+
*/
|
|
20
|
+
async function enrichMiddlewareVariables(platform, project, environment, applicationId, entries) {
|
|
21
|
+
const stepsById = new Map();
|
|
22
|
+
try {
|
|
23
|
+
const list = await platform.tenant('GET', project, `/workflows/${applicationId}`, {
|
|
24
|
+
environment,
|
|
25
|
+
query: { type: 'middleware', pageLength: 100 }
|
|
26
|
+
});
|
|
27
|
+
for (const middleware of (list?.data ?? []).slice(0, 20)) {
|
|
28
|
+
const detail = await platform.tenant('GET', project, `/workflows/${applicationId}/${String(middleware.id)}`, { environment });
|
|
29
|
+
const definition = (detail?.data ?? detail);
|
|
30
|
+
for (const step of (Array.isArray(definition.steps) ? definition.steps : [])) {
|
|
31
|
+
if (!step || typeof step !== 'object')
|
|
32
|
+
continue;
|
|
33
|
+
const record = step;
|
|
34
|
+
const rule = (record.rule ?? {});
|
|
35
|
+
const type = String(record.type ?? '');
|
|
36
|
+
if (type !== 'set-user' && type !== 'variable')
|
|
37
|
+
continue;
|
|
38
|
+
stepsById.set(String(record.id ?? ''), {
|
|
39
|
+
name: type === 'set-user' ? 'user' : String(rule.name ?? record.name ?? '?'),
|
|
40
|
+
type,
|
|
41
|
+
workflowId: String(definition.id ?? middleware.id ?? ''),
|
|
42
|
+
workflowName: String(definition.name ?? middleware.name ?? '?')
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return entries;
|
|
49
|
+
}
|
|
50
|
+
// Gateway yanıtta null alan taşımaz (responses.prune) — şemanın YOKLUĞU bu yüzden not olarak söylenir.
|
|
51
|
+
const missingSchemaNote = "Bu step'e DTO bağlı değil; platform şema (alan listesi) döndüremez — yalnız değişken ADI kesin. Alanları sözleşmeye bağlamak için step'in rule.dataTransferObjectId'sini doldurun.";
|
|
52
|
+
return entries.map(entry => {
|
|
53
|
+
const resolved = stepsById.get(String(entry.stepId ?? ''));
|
|
54
|
+
if (!resolved)
|
|
55
|
+
return entry.schema ? entry : { ...entry, note: missingSchemaNote };
|
|
56
|
+
return {
|
|
57
|
+
...entry,
|
|
58
|
+
name: typeof entry.name === 'string' && entry.name !== '' ? entry.name : resolved.name,
|
|
59
|
+
stepType: resolved.type,
|
|
60
|
+
middlewareId: resolved.workflowId,
|
|
61
|
+
middlewareName: resolved.workflowName,
|
|
62
|
+
...(entry.schema ? {} : { note: missingSchemaNote })
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
export function registerWorkflowTools(server, platform) {
|
|
67
|
+
const config = platform.config;
|
|
68
|
+
server.registerTool('workflow_list', {
|
|
69
|
+
title: 'Workflow listele',
|
|
70
|
+
description: 'Application altındaki workflow\'ları listeler.',
|
|
71
|
+
inputSchema: {
|
|
72
|
+
project: projectParam,
|
|
73
|
+
environment: environmentParam,
|
|
74
|
+
applicationId: guid,
|
|
75
|
+
searchTerm: z.string().optional(),
|
|
76
|
+
type: z.string().optional().describe('workflow | middleware | automation'),
|
|
77
|
+
entityId: guid.optional(),
|
|
78
|
+
isDefault: z.boolean().optional(),
|
|
79
|
+
...pagingParams
|
|
80
|
+
},
|
|
81
|
+
annotations: readOnly
|
|
82
|
+
}, handle(config, ({ project, environment, applicationId, ...query }) => platform.tenant('GET', project, `/workflows/${applicationId}`, { environment, query })));
|
|
83
|
+
server.registerTool('workflow_get', {
|
|
84
|
+
title: 'Workflow getir',
|
|
85
|
+
description: "Workflow'u getirir. Büyük workflow'da önce view:'outline' (step+branch grafı), sonra view:'part' ile tek parça çekin; full gövdeyi bağlama almak son çaredir.",
|
|
86
|
+
inputSchema: {
|
|
87
|
+
project: projectParam,
|
|
88
|
+
environment: environmentParam,
|
|
89
|
+
applicationId: guid,
|
|
90
|
+
id: guid,
|
|
91
|
+
view: z.enum(['full', 'outline', 'part']).optional().describe('varsayılan full'),
|
|
92
|
+
part: z.string().optional().describe("view:'part' için yol, ör. steps[id=abc] veya steps[2].rule")
|
|
93
|
+
},
|
|
94
|
+
annotations: readOnly
|
|
95
|
+
}, handle(config, async ({ project, environment, applicationId, id, view, part }) => {
|
|
96
|
+
const payload = await platform.tenant('GET', project, `/workflows/${applicationId}/${id}`, { environment });
|
|
97
|
+
const definition = (payload?.data ?? payload);
|
|
98
|
+
if (view === 'outline')
|
|
99
|
+
return workflowOutline(definition);
|
|
100
|
+
if (view === 'part') {
|
|
101
|
+
if (!part)
|
|
102
|
+
throw new Error("view:'part' için 'part' parametresi zorunlu.");
|
|
103
|
+
return { part, value: resolvePart(definition, part) };
|
|
104
|
+
}
|
|
105
|
+
return payload;
|
|
106
|
+
}));
|
|
107
|
+
server.registerTool('workflow_create', {
|
|
108
|
+
title: 'Workflow oluştur',
|
|
109
|
+
description: "Yeni workflow tanımlar (definition = CreateWorkflowCommand). type: 'workflow' | 'automation' | 'middleware'. İlk kullanımdan önce platform_guide('workflow') okuyun: DTO-önce akışı, branch bağlama (branches[].nextStepId), tip×step matrisi. Middleware (istek öncesi koşan guard/setter, user değişkeni, alfabetik sıra) için platform_guide('middleware') + ngapps://examples/middleware-authenticate. Gövde politika kontrolünden geçer.",
|
|
110
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, definition: definitionParam, policyOverride: policyOverrideParam },
|
|
111
|
+
annotations: writes
|
|
112
|
+
}, handle(config, async ({ project, environment, applicationId, definition, policyOverride }) => {
|
|
113
|
+
const normalized = normalizeWorkflowDefinition(definition);
|
|
114
|
+
const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'workflow', definition, { operation: 'create', workflowKind: definition.type }, policyOverride));
|
|
115
|
+
const payload = await platform.tenant('POST', project, `/workflows/${applicationId}`, { environment, body: definition });
|
|
116
|
+
return attachFindings(withNormalization(payload, normalized), findings);
|
|
117
|
+
}));
|
|
118
|
+
server.registerTool('workflow_update', {
|
|
119
|
+
title: 'Workflow güncelle',
|
|
120
|
+
description: 'Workflow tanımını günceller (definition = UpdateWorkflowCommand, tam gövde). Hedefli değişiklik için workflow_patch tercih edin. Gövde politika kontrolünden geçer.',
|
|
121
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid, definition: definitionParam, policyOverride: policyOverrideParam },
|
|
122
|
+
annotations: updates
|
|
123
|
+
}, handle(config, async ({ project, environment, applicationId, id, definition, policyOverride }) => {
|
|
124
|
+
const normalized = normalizeWorkflowDefinition(definition);
|
|
125
|
+
const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'workflow', definition, { operation: 'update', workflowKind: definition.type }, policyOverride));
|
|
126
|
+
const payload = await platform.tenant('PUT', project, `/workflows/${applicationId}/${id}`, { environment, body: definition });
|
|
127
|
+
return attachFindings(withNormalization(payload, normalized), findings);
|
|
128
|
+
}));
|
|
129
|
+
server.registerTool('workflow_patch', {
|
|
130
|
+
title: 'Workflow\'a patch uygula',
|
|
131
|
+
description: 'Tam gövdeyi bağlama almadan hedefli değişiklik: gateway mevcut workflow\'u çeker, JSON Patch işlemlerini uygular, politika kontrolünden geçirir, tam gövdeyi geri yazar. Yanıt outline özetidir.',
|
|
132
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid, operations: patchOperationsParam, policyOverride: policyOverrideParam },
|
|
133
|
+
annotations: updates
|
|
134
|
+
}, handle(config, async ({ project, environment, applicationId, id, operations, policyOverride }) => {
|
|
135
|
+
const current = await platform.tenant('GET', project, `/workflows/${applicationId}/${id}`, { environment });
|
|
136
|
+
const definition = structuredClone((current?.data ?? current));
|
|
137
|
+
const resolved = resolvePatchOperations(definition, operations);
|
|
138
|
+
const patched = fastJsonPatch.applyPatch(definition, resolved.operations, true, false).newDocument;
|
|
139
|
+
const normalized = normalizeWorkflowDefinition(patched);
|
|
140
|
+
const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'workflow', patched, { operation: 'update', workflowKind: patched.type }, policyOverride));
|
|
141
|
+
await platform.tenant('PUT', project, `/workflows/${applicationId}/${id}`, { environment, body: patched });
|
|
142
|
+
return attachFindings(withNormalization({
|
|
143
|
+
applied: operations.length,
|
|
144
|
+
patchTargets: resolved.targets,
|
|
145
|
+
outline: workflowOutline(patched)
|
|
146
|
+
}, [...normalized, ...resolved.notes.map(note => `patch yolu seçiciden indekse çözüldü: ${note}`)]), findings);
|
|
147
|
+
}));
|
|
148
|
+
server.registerTool('workflow_delete', {
|
|
149
|
+
title: 'Workflow sil',
|
|
150
|
+
description: 'Workflow\'u siler; önce workflow_dependencies ile bağımlılıklarını kontrol edin.',
|
|
151
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid },
|
|
152
|
+
annotations: destructive
|
|
153
|
+
}, handle(config, ({ project, environment, applicationId, id }) => platform.tenant('DELETE', project, `/workflows/${applicationId}/${id}`, { environment })));
|
|
154
|
+
server.registerTool('workflow_clone', {
|
|
155
|
+
title: 'Workflow klonla',
|
|
156
|
+
description: 'Workflow\'un kopyasını oluşturur.',
|
|
157
|
+
inputSchema: { project: projectParam, environment: environmentParam, id: guid },
|
|
158
|
+
annotations: writes
|
|
159
|
+
}, handle(config, ({ project, environment, id }) => platform.tenant('POST', project, `/workflows/clone/${id}`, { environment })));
|
|
160
|
+
server.registerTool('workflow_preview', {
|
|
161
|
+
title: 'Workflow önizle',
|
|
162
|
+
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. Preview kuru çalıştırma değildir: table create/update step'leri kalıcı satır yazar.",
|
|
163
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, definition: definitionParam, policyOverride: policyOverrideParam },
|
|
164
|
+
annotations: writes
|
|
165
|
+
}, handle(config, async ({ project, environment, applicationId, definition, policyOverride }) => {
|
|
166
|
+
const normalized = normalizeWorkflowDefinition(definition);
|
|
167
|
+
const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'workflow', definition, { operation: 'preview', workflowKind: definition.type }, policyOverride));
|
|
168
|
+
const payload = await platform.tenant('POST', project, `/workflows/${applicationId}/preview`, { environment, body: definition });
|
|
169
|
+
return attachFindings(withNormalization(payload, normalized), findings);
|
|
170
|
+
}));
|
|
171
|
+
server.registerTool('workflow_step_schema', {
|
|
172
|
+
title: 'Step şeması üret',
|
|
173
|
+
description: 'Verilen step tanımı için çıktı şemasını üretir; step yazarken definition\'ı doğrulamanın en hızlı yolu.',
|
|
174
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid, step: definitionParam },
|
|
175
|
+
annotations: readOnly
|
|
176
|
+
}, handle(config, ({ project, environment, applicationId, id, step }) => platform.tenant('POST', project, `/workflows/${applicationId}/${id}/steps/schema`, { environment, body: step })));
|
|
177
|
+
server.registerTool('workflow_middleware_variables', {
|
|
178
|
+
title: 'Middleware değişkenleri',
|
|
179
|
+
description: "Application'ın middleware'lerinin kurduğu değişkenleri listeler (set-user → 'user', variable step'leri → rule.name adları) ve DTO bağlıysa şemasıyla birlikte döner. Expression'da (filtre value:'user.id', step ifadeleri) kullanılacak değişken adı/alanı TAHMİN EDİLMEZ — buradan okunur. DTO bağlanmamış step'lerde platform yalnız stepId döndürdüğü için gateway adı/tipi middleware tanımından tamamlar (schema: null olur). Ayrıntı: platform_guide('middleware').",
|
|
180
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid },
|
|
181
|
+
annotations: readOnly
|
|
182
|
+
}, handle(config, async ({ project, environment, applicationId }) => {
|
|
183
|
+
const payload = await platform.tenant('GET', project, `/workflows/${applicationId}/variables`, { environment });
|
|
184
|
+
const entries = (Array.isArray(payload?.data) ? payload.data : [])
|
|
185
|
+
.filter((entry) => Boolean(entry) && typeof entry === 'object');
|
|
186
|
+
if (entries.length === 0 || entries.every(entry => typeof entry.name === 'string' && entry.name !== ''))
|
|
187
|
+
return payload;
|
|
188
|
+
return { ...payload, data: await enrichMiddlewareVariables(platform, project, environment, applicationId, entries) };
|
|
189
|
+
}));
|
|
190
|
+
server.registerTool('workflow_dependencies', {
|
|
191
|
+
title: 'Workflow bağımlılıkları',
|
|
192
|
+
description: 'Workflow\'a bağımlı kayıtların grafiğini döner.',
|
|
193
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid },
|
|
194
|
+
annotations: readOnly
|
|
195
|
+
}, handle(config, ({ project, environment, applicationId, id }) => platform.tenant('GET', project, `/workflows/${applicationId}/${id}/dependencies`, { environment })));
|
|
196
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@appaflytech/zeyrek-ai-mcp",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "MCP gateway exposing the NgApps platform APIs as tools",
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=20"
|
|
9
|
+
},
|
|
10
|
+
"bin": {
|
|
11
|
+
"zeyrek-mcp": "dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
".env.example",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "tsx watch src/index.ts",
|
|
23
|
+
"start": "tsx src/index.ts",
|
|
24
|
+
"start:stdio": "tsx src/index.ts --stdio",
|
|
25
|
+
"build": "tsc -p tsconfig.build.json && tsx scripts/copy-assets.ts",
|
|
26
|
+
"prepack": "npm run build",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"test": "vitest run",
|
|
29
|
+
"generate-schemas": "tsx scripts/generate-schemas.ts",
|
|
30
|
+
"generate-reserved-tables": "tsx scripts/generate-reserved-tables.ts",
|
|
31
|
+
"harvest-examples": "tsx scripts/harvest-examples.ts"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
35
|
+
"dotenv": "^16.4.5",
|
|
36
|
+
"express": "^4.21.0",
|
|
37
|
+
"fast-json-patch": "^3.1.1",
|
|
38
|
+
"pino": "^9.5.0",
|
|
39
|
+
"undici": "^7.3.0",
|
|
40
|
+
"zod": "^3.24.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/express": "^4.17.21",
|
|
44
|
+
"@types/node": "^22.10.0",
|
|
45
|
+
"tsx": "^4.19.2",
|
|
46
|
+
"typescript": "^5.7.2",
|
|
47
|
+
"vitest": "^3.0.0"
|
|
48
|
+
}
|
|
49
|
+
}
|