@mostajs/orm-mcp 0.1.0
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/LICENSE +17 -0
- package/README.md +66 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +202 -0
- package/llms.txt +34 -0
- package/package.json +63 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
@mostajs/orm-mcp
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 Dr Hamid MADANI <drmdh@msn.com>
|
|
4
|
+
|
|
5
|
+
This program is free software: you can redistribute it and/or modify it under
|
|
6
|
+
the terms of the GNU Affero General Public License as published by the Free
|
|
7
|
+
Software Foundation, either version 3 of the License, or (at your option) any
|
|
8
|
+
later version.
|
|
9
|
+
|
|
10
|
+
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
+
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
12
|
+
PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
|
|
13
|
+
|
|
14
|
+
You should have received a copy of the GNU Affero General Public License along
|
|
15
|
+
with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
|
|
17
|
+
For commercial / proprietary licensing of @mostajs/orm, contact drmdh@msn.com.
|
package/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# @mostajs/orm-mcp
|
|
2
|
+
|
|
3
|
+
> MCP server for **[@mostajs/orm](https://www.npmjs.com/package/@mostajs/orm)** — lets AI dev tools (Claude, Cursor, Cline…) **generate `EntitySchema`s, lint them (24 rules), and produce SQL migrations** directly from a prompt.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@mostajs/orm-mcp)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
## Tools
|
|
9
|
+
|
|
10
|
+
| Tool | What it does |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `mostajs_generate_schema` | Build a typed `EntitySchema` (TS) from an entity name + fields (+ relations). Runs the validator on the result. |
|
|
13
|
+
| `mostajs_validate` | Lint one or more `EntitySchema`s with the built-in conceptual validator (24 rules). |
|
|
14
|
+
| `mostajs_create_migration` | Diff two schema sets → SQL migration (`diffSchemas` + `generateMigrationSQL`). |
|
|
15
|
+
|
|
16
|
+
All three reuse `@mostajs/orm`'s public API — no logic is reinvented.
|
|
17
|
+
|
|
18
|
+
## Use it (hosted)
|
|
19
|
+
|
|
20
|
+
A public instance runs at **`https://orm-mcp.amia.fr/mcp`** (Streamable HTTP). Add it to your MCP client:
|
|
21
|
+
|
|
22
|
+
```jsonc
|
|
23
|
+
{
|
|
24
|
+
"mcpServers": {
|
|
25
|
+
"mostajs-orm": { "url": "https://orm-mcp.amia.fr/mcp" }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Clients that only speak stdio can bridge it:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx mcp-remote https://orm-mcp.amia.fr/mcp
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
> Visiting `https://orm-mcp.amia.fr/mcp` in a browser returns a JSON-RPC `405` — that is expected (MCP is POST-only). The human-readable info page is the root `/`.
|
|
37
|
+
|
|
38
|
+
## Run it (local, stdio)
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx @mostajs/orm-mcp # stdio transport — the AI tool spawns this process
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Local MCP config (Claude Desktop / Cursor / Cline):
|
|
45
|
+
|
|
46
|
+
```jsonc
|
|
47
|
+
{
|
|
48
|
+
"mcpServers": {
|
|
49
|
+
"mostajs-orm": { "command": "npx", "args": ["-y", "@mostajs/orm-mcp"] }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
In stdio mode, `mostajs_validate` also accepts a `sourceRoot` to enable cross-file rules (it reads the local filesystem — disabled on the hosted server for safety).
|
|
55
|
+
|
|
56
|
+
## Run it (self-hosted HTTP)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
PORT=14510 npx @mostajs/orm-mcp # or: npx @mostajs/orm-mcp --http
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Serves the MCP endpoint at `/mcp` (POST) and a health/info page at `/`.
|
|
63
|
+
|
|
64
|
+
## License
|
|
65
|
+
|
|
66
|
+
**AGPL-3.0-or-later** — © Dr Hamid MADANI. Commercial licensing for `@mostajs/orm`: drmdh@msn.com.
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @mostajs/orm-mcp — Model Context Protocol server exposing @mostajs/orm's
|
|
4
|
+
* schema tooling to AI dev tools (Claude, Cursor, Cline…).
|
|
5
|
+
*
|
|
6
|
+
* Tools:
|
|
7
|
+
* - mostajs_generate_schema : build an EntitySchema (TS) from name + fields
|
|
8
|
+
* - mostajs_validate : lint EntitySchemas with the 24-rule validator
|
|
9
|
+
* - mostajs_create_migration : diff two schema sets → SQL migration
|
|
10
|
+
*
|
|
11
|
+
* All three REUSE @mostajs/orm's public API (validateSchemas, diffSchemas,
|
|
12
|
+
* generateMigrationSQL) — no logic is reinvented here.
|
|
13
|
+
*
|
|
14
|
+
* Transports:
|
|
15
|
+
* - stdio (default) : local use; the AI tool spawns this process.
|
|
16
|
+
* - Streamable HTTP (--http : remote/hosted (e.g. https://orm-mcp.amia.fr/mcp),
|
|
17
|
+
* or PORT env set) behind a reverse proxy.
|
|
18
|
+
*
|
|
19
|
+
* Security: the `sourceRoot` option of `mostajs_validate` reads the filesystem.
|
|
20
|
+
* It is ALLOWED in stdio mode (runs on the user's machine) but DISABLED in HTTP
|
|
21
|
+
* mode (a hosted server must not read arbitrary server paths).
|
|
22
|
+
*
|
|
23
|
+
* @author Dr Hamid MADANI <drmdh@msn.com>
|
|
24
|
+
*/
|
|
25
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
26
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
27
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
28
|
+
import { z } from 'zod';
|
|
29
|
+
import { diffSchemas, generateMigrationSQL } from '@mostajs/orm';
|
|
30
|
+
import { validateSchemas } from '@mostajs/orm/validator';
|
|
31
|
+
const VERSION = '0.1.0';
|
|
32
|
+
const TOOL_NAMES = ['mostajs_generate_schema', 'mostajs_validate', 'mostajs_create_migration'];
|
|
33
|
+
const FIELD_TYPES = ['string', 'text', 'number', 'boolean', 'date', 'json', 'array'];
|
|
34
|
+
const RELATION_TYPES = ['one-to-one', 'one-to-many', 'many-to-one', 'many-to-many'];
|
|
35
|
+
const ON_DELETE = ['cascade', 'set-null', 'restrict', 'no-action'];
|
|
36
|
+
const fieldShape = z.object({
|
|
37
|
+
name: z.string(),
|
|
38
|
+
type: z.enum(FIELD_TYPES),
|
|
39
|
+
required: z.boolean().optional(),
|
|
40
|
+
unique: z.boolean().optional(),
|
|
41
|
+
default: z.any().optional(),
|
|
42
|
+
});
|
|
43
|
+
const relationShape = z.object({
|
|
44
|
+
name: z.string(),
|
|
45
|
+
target: z.string(),
|
|
46
|
+
type: z.enum(RELATION_TYPES),
|
|
47
|
+
required: z.boolean().optional(),
|
|
48
|
+
mappedBy: z.string().optional(),
|
|
49
|
+
onDelete: z.enum(ON_DELETE).optional(),
|
|
50
|
+
});
|
|
51
|
+
function buildSchema(input) {
|
|
52
|
+
const fields = {};
|
|
53
|
+
for (const f of input.fields) {
|
|
54
|
+
fields[f.name] = {
|
|
55
|
+
type: f.type,
|
|
56
|
+
...(f.required ? { required: true } : {}),
|
|
57
|
+
...(f.unique ? { unique: true } : {}),
|
|
58
|
+
...(f.default !== undefined ? { default: f.default } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const relations = {};
|
|
62
|
+
for (const r of input.relations ?? []) {
|
|
63
|
+
relations[r.name] = {
|
|
64
|
+
target: r.target,
|
|
65
|
+
type: r.type,
|
|
66
|
+
...(r.required ? { required: true } : {}),
|
|
67
|
+
...(r.mappedBy ? { mappedBy: r.mappedBy } : {}),
|
|
68
|
+
...(r.onDelete ? { onDelete: r.onDelete } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
name: input.name,
|
|
73
|
+
collection: input.collection ?? `${input.name.toLowerCase()}s`,
|
|
74
|
+
fields,
|
|
75
|
+
relations,
|
|
76
|
+
indexes: [],
|
|
77
|
+
timestamps: input.timestamps ?? true,
|
|
78
|
+
...(input.softDelete ? { softDelete: true } : {}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function toTypeScript(schema) {
|
|
82
|
+
return (`import type { EntitySchema } from '@mostajs/orm';\n\n` +
|
|
83
|
+
`export const ${schema.name}Schema: EntitySchema = ${JSON.stringify(schema, null, 2)};\n`);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Build a fresh McpServer with the three tools.
|
|
87
|
+
* @param allowFsAccess if false, `mostajs_validate.sourceRoot` is ignored
|
|
88
|
+
* (hosted HTTP mode — never read the server's filesystem).
|
|
89
|
+
*/
|
|
90
|
+
function createServer(allowFsAccess) {
|
|
91
|
+
const server = new McpServer({ name: 'mostajs-orm', version: VERSION });
|
|
92
|
+
server.tool('mostajs_generate_schema', 'Generate a @mostajs/orm EntitySchema (TypeScript) from an entity name + fields (+ optional relations). Returns ready-to-paste TS and runs the 24-rule validator on the result.', {
|
|
93
|
+
name: z.string().describe('Entity name in PascalCase, e.g. "Post"'),
|
|
94
|
+
collection: z.string().optional().describe('Table/collection name; defaults to lowercased name + "s"'),
|
|
95
|
+
fields: z.array(fieldShape).describe('Field definitions'),
|
|
96
|
+
relations: z.array(relationShape).optional().describe('Relations to other entities'),
|
|
97
|
+
timestamps: z.boolean().optional().describe('Auto-manage createdAt/updatedAt (default true)'),
|
|
98
|
+
softDelete: z.boolean().optional().describe('Enable soft delete (deletedAt + auto-filter)'),
|
|
99
|
+
}, async (args) => {
|
|
100
|
+
const schema = buildSchema(args);
|
|
101
|
+
const report = await validateSchemas([schema]);
|
|
102
|
+
const ts = toTypeScript(schema);
|
|
103
|
+
const findings = report.findings.length
|
|
104
|
+
? report.findings.map((f) => `- [${f.severity}] ${f.ruleId}: ${f.message}`).join('\n')
|
|
105
|
+
: '- none';
|
|
106
|
+
return {
|
|
107
|
+
content: [
|
|
108
|
+
{ type: 'text', text: `${ts}\n/* Validator — ${report.findings.length} finding(s):\n${findings}\n*/` },
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
server.tool('mostajs_validate', 'Lint one or more @mostajs/orm EntitySchemas with the built-in conceptual validator (24 rules). Pass schemas as JSON. (sourceRoot cross-file rules are only available in local/stdio mode.)', {
|
|
113
|
+
schemas: z.array(z.any()).describe('Array of EntitySchema objects (JSON)'),
|
|
114
|
+
sourceRoot: z.string().optional().describe('Project src root for cross-file rules — IGNORED on the hosted server'),
|
|
115
|
+
}, async ({ schemas, sourceRoot }) => {
|
|
116
|
+
const useRoot = allowFsAccess && sourceRoot ? { sourceRoot } : undefined;
|
|
117
|
+
const report = await validateSchemas(schemas, useRoot);
|
|
118
|
+
const note = !allowFsAccess && sourceRoot
|
|
119
|
+
? '\n\n(note: sourceRoot was ignored — cross-file rules require the local stdio server)'
|
|
120
|
+
: '';
|
|
121
|
+
return { content: [{ type: 'text', text: JSON.stringify(report, null, 2) + note }] };
|
|
122
|
+
});
|
|
123
|
+
server.tool('mostajs_create_migration', 'Diff two sets of @mostajs/orm EntitySchemas and produce SQL migration statements (diffSchemas + generateMigrationSQL).', {
|
|
124
|
+
oldSchemas: z.array(z.any()).describe('Previous EntitySchema[] (JSON) — [] for a fresh database'),
|
|
125
|
+
newSchemas: z.array(z.any()).describe('Target EntitySchema[] (JSON)'),
|
|
126
|
+
}, async ({ oldSchemas, newSchemas }) => {
|
|
127
|
+
const ops = diffSchemas(oldSchemas, newSchemas);
|
|
128
|
+
const sql = generateMigrationSQL(ops);
|
|
129
|
+
return {
|
|
130
|
+
content: [{ type: 'text', text: sql.length ? sql.join('\n') : '-- no schema changes detected' }],
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
return server;
|
|
134
|
+
}
|
|
135
|
+
// --- stdio transport (local) ------------------------------------------------
|
|
136
|
+
async function startStdio() {
|
|
137
|
+
const server = createServer(/* allowFsAccess */ true);
|
|
138
|
+
await server.connect(new StdioServerTransport());
|
|
139
|
+
// stdout is reserved for the protocol — log to stderr only.
|
|
140
|
+
console.error(`@mostajs/orm-mcp v${VERSION} on stdio (tools: ${TOOL_NAMES.join(', ')})`);
|
|
141
|
+
}
|
|
142
|
+
// --- Streamable HTTP transport (hosted, e.g. orm-mcp.amia.fr) ----------------
|
|
143
|
+
async function startHttp(port) {
|
|
144
|
+
const { default: express } = await import('express');
|
|
145
|
+
const app = express();
|
|
146
|
+
app.use(express.json({ limit: '1mb' }));
|
|
147
|
+
// Minimal CORS (lets browser-based MCP clients connect).
|
|
148
|
+
app.use((req, res, next) => {
|
|
149
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
150
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id, mcp-protocol-version');
|
|
151
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
152
|
+
if (req.method === 'OPTIONS') {
|
|
153
|
+
res.sendStatus(204);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
next();
|
|
157
|
+
});
|
|
158
|
+
// Human/health endpoint.
|
|
159
|
+
app.get('/', (_req, res) => {
|
|
160
|
+
res.json({
|
|
161
|
+
name: '@mostajs/orm-mcp',
|
|
162
|
+
version: VERSION,
|
|
163
|
+
transport: 'streamable-http',
|
|
164
|
+
endpoint: '/mcp',
|
|
165
|
+
tools: TOOL_NAMES,
|
|
166
|
+
docs: 'https://mostajs.dev',
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
// Stateless MCP endpoint: a fresh server + transport per request.
|
|
170
|
+
app.post('/mcp', async (req, res) => {
|
|
171
|
+
const server = createServer(/* allowFsAccess */ false);
|
|
172
|
+
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
173
|
+
res.on('close', () => {
|
|
174
|
+
transport.close();
|
|
175
|
+
server.close();
|
|
176
|
+
});
|
|
177
|
+
try {
|
|
178
|
+
await server.connect(transport);
|
|
179
|
+
await transport.handleRequest(req, res, req.body);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
if (!res.headersSent) {
|
|
183
|
+
res.status(500).json({ jsonrpc: '2.0', error: { code: -32603, message: 'Internal error' }, id: null });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
// Stateless server: no server-initiated streams / sessions.
|
|
188
|
+
const notAllowed = (_req, res) => res.status(405).json({ jsonrpc: '2.0', error: { code: -32000, message: 'Method not allowed (stateless server)' }, id: null });
|
|
189
|
+
app.get('/mcp', notAllowed);
|
|
190
|
+
app.delete('/mcp', notAllowed);
|
|
191
|
+
app.listen(port, () => {
|
|
192
|
+
console.error(`@mostajs/orm-mcp v${VERSION} on http://localhost:${port}/mcp (tools: ${TOOL_NAMES.join(', ')})`);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// --- Boot -------------------------------------------------------------------
|
|
196
|
+
const httpMode = process.argv.includes('--http') || !!process.env.PORT;
|
|
197
|
+
if (httpMode) {
|
|
198
|
+
await startHttp(Number(process.env.PORT) || 8930);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
await startStdio();
|
|
202
|
+
}
|
package/llms.txt
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# @mostajs/orm-mcp — fiche LLM
|
|
2
|
+
> Serveur MCP exposant le tooling schéma de @mostajs/orm aux IA de dev.
|
|
3
|
+
|
|
4
|
+
- Version: 0.1.0 · Licence: AGPL-3.0-or-later · Auteur: Dr Hamid MADANI <drmdh@msn.com>
|
|
5
|
+
- Instance hébergée: https://orm-mcp.amia.fr/mcp (Streamable HTTP). Health humain: https://orm-mcp.amia.fr/
|
|
6
|
+
|
|
7
|
+
## RÔLE
|
|
8
|
+
Donne aux IA (Claude, Cursor, Cline…) trois outils pour travailler avec @mostajs/orm
|
|
9
|
+
sans relire son code. Réutilise l'API publique de l'ORM (validateSchemas, diffSchemas,
|
|
10
|
+
generateMigrationSQL) — aucune logique réimplémentée.
|
|
11
|
+
|
|
12
|
+
## OUTILS (MCP tools)
|
|
13
|
+
- `mostajs_generate_schema(name, fields[], collection?, relations[]?, timestamps?, softDelete?)`
|
|
14
|
+
→ EntitySchema TypeScript prêt à coller, déjà passé au validator (24 règles).
|
|
15
|
+
- field = { name, type: string|text|number|boolean|date|json|array, required?, unique?, default? }
|
|
16
|
+
- relation = { name, target, type: one-to-one|one-to-many|many-to-one|many-to-many, required?, mappedBy?, onDelete? }
|
|
17
|
+
- `mostajs_validate(schemas[], sourceRoot?)`
|
|
18
|
+
→ rapport { schemaCount, findings[], countBySeverity, countByRule, durationMs }.
|
|
19
|
+
`sourceRoot` (règles cross-file R005/R007/R008/R019…) actif UNIQUEMENT en mode stdio local ;
|
|
20
|
+
ignoré sur le serveur HTTP hébergé (sécurité : pas de lecture FS arbitraire).
|
|
21
|
+
- `mostajs_create_migration(oldSchemas[], newSchemas[])`
|
|
22
|
+
→ instructions SQL de migration (diffSchemas + generateMigrationSQL). oldSchemas=[] pour une base neuve.
|
|
23
|
+
|
|
24
|
+
## TRANSPORTS
|
|
25
|
+
- stdio (défaut) : `npx @mostajs/orm-mcp` — l'outil IA lance le process. FS autorisé (local).
|
|
26
|
+
- Streamable HTTP : `--http` ou `PORT` env → endpoint POST `/mcp`, health `GET /`. FS désactivé.
|
|
27
|
+
|
|
28
|
+
## CONNEXION CLIENT
|
|
29
|
+
- HTTP hébergé : `{ "mcpServers": { "mostajs-orm": { "url": "https://orm-mcp.amia.fr/mcp" } } }`
|
|
30
|
+
- stdio local : `{ "mcpServers": { "mostajs-orm": { "command": "npx", "args": ["-y","@mostajs/orm-mcp"] } } }`
|
|
31
|
+
- pont stdio→HTTP : `npx mcp-remote https://orm-mcp.amia.fr/mcp`
|
|
32
|
+
|
|
33
|
+
## DÉPENDANCES
|
|
34
|
+
@modelcontextprotocol/sdk, @mostajs/orm (>=2.5.1), express, zod. Aucun secret, sans état.
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mostajs/orm-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for @mostajs/orm — lets AI dev tools (Claude, Cursor, Cline) generate EntitySchemas, lint them (24 rules), and produce SQL migrations.",
|
|
5
|
+
"license": "AGPL-3.0-or-later",
|
|
6
|
+
"author": "Dr Hamid MADANI <drmdh@msn.com>",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"mostajs-orm-mcp": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md",
|
|
21
|
+
"llms.txt",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"keywords": [
|
|
25
|
+
"mcp",
|
|
26
|
+
"model-context-protocol",
|
|
27
|
+
"mostajs",
|
|
28
|
+
"orm",
|
|
29
|
+
"schema",
|
|
30
|
+
"migration",
|
|
31
|
+
"validator",
|
|
32
|
+
"ai-tools",
|
|
33
|
+
"code-generation"
|
|
34
|
+
],
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/apolocine/mosta-orm-mcp.git"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://mostajs.dev",
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18.18.0"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc",
|
|
45
|
+
"dev": "tsc --watch",
|
|
46
|
+
"prepublishOnly": "npm run build"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
50
|
+
"@mostajs/orm": "^2.5.1",
|
|
51
|
+
"express": "^4.21.0",
|
|
52
|
+
"zod": "^3.23.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/express": "^4.17.21",
|
|
56
|
+
"@types/node": "^22.0.0",
|
|
57
|
+
"typescript": "^5.6.0"
|
|
58
|
+
},
|
|
59
|
+
"funding": {
|
|
60
|
+
"type": "github",
|
|
61
|
+
"url": "https://github.com/sponsors/apolocine"
|
|
62
|
+
}
|
|
63
|
+
}
|