@ratio-mcp/dev-server 1.0.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/dist/api/developer.d.ts +13 -0
- package/dist/api/developer.d.ts.map +1 -0
- package/dist/api/developer.js +66 -0
- package/dist/api/developer.js.map +1 -0
- package/dist/api/oauth.d.ts +36 -0
- package/dist/api/oauth.d.ts.map +1 -0
- package/dist/api/oauth.js +77 -0
- package/dist/api/oauth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +57 -0
- package/dist/server.js.map +1 -0
- package/dist/store/requirements-store.d.ts +8 -0
- package/dist/store/requirements-store.d.ts.map +1 -0
- package/dist/store/requirements-store.js +67 -0
- package/dist/store/requirements-store.js.map +1 -0
- package/dist/store/token-store.d.ts +12 -0
- package/dist/store/token-store.d.ts.map +1 -0
- package/dist/store/token-store.js +94 -0
- package/dist/store/token-store.js.map +1 -0
- package/dist/templates/backend/.env.example +20 -0
- package/dist/templates/backend/nest-cli.json +5 -0
- package/dist/templates/backend/package.json +26 -0
- package/dist/templates/backend/src/app.module.ts +10 -0
- package/dist/templates/backend/src/main.ts +12 -0
- package/dist/templates/backend/tsconfig.json +21 -0
- package/dist/templates/frontend/.env.example +6 -0
- package/dist/templates/frontend/index.html +13 -0
- package/dist/templates/frontend/package.json +24 -0
- package/dist/templates/frontend/src/App.tsx +32 -0
- package/dist/templates/frontend/src/components/Layout.tsx +53 -0
- package/dist/templates/frontend/src/context/AuthContext.tsx +59 -0
- package/dist/templates/frontend/src/index.css +48 -0
- package/dist/templates/frontend/src/main.tsx +16 -0
- package/dist/templates/frontend/src/pages/Callback.tsx +53 -0
- package/dist/templates/frontend/src/pages/Dashboard.tsx +24 -0
- package/dist/templates/frontend/src/pages/Login.tsx +42 -0
- package/dist/templates/frontend/src/services/api.ts +48 -0
- package/dist/templates/frontend/tsconfig.json +21 -0
- package/dist/templates/frontend/vite.config.ts +15 -0
- package/dist/tools/app-management.d.ts +3 -0
- package/dist/tools/app-management.d.ts.map +1 -0
- package/dist/tools/app-management.js +132 -0
- package/dist/tools/app-management.js.map +1 -0
- package/dist/tools/auth.d.ts +3 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +164 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/build.d.ts +3 -0
- package/dist/tools/build.d.ts.map +1 -0
- package/dist/tools/build.js +178 -0
- package/dist/tools/build.js.map +1 -0
- package/dist/tools/codegen.d.ts +3 -0
- package/dist/tools/codegen.d.ts.map +1 -0
- package/dist/tools/codegen.js +315 -0
- package/dist/tools/codegen.js.map +1 -0
- package/dist/tools/developer-auth.d.ts +3 -0
- package/dist/tools/developer-auth.d.ts.map +1 -0
- package/dist/tools/developer-auth.js +87 -0
- package/dist/tools/developer-auth.js.map +1 -0
- package/dist/tools/index.d.ts +16 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lifecycle.d.ts +3 -0
- package/dist/tools/lifecycle.d.ts.map +1 -0
- package/dist/tools/lifecycle.js +95 -0
- package/dist/tools/lifecycle.js.map +1 -0
- package/dist/tools/requirements.d.ts +3 -0
- package/dist/tools/requirements.d.ts.map +1 -0
- package/dist/tools/requirements.js +169 -0
- package/dist/tools/requirements.js.map +1 -0
- package/dist/tools/scaffold.d.ts +3 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +209 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/tools/submission.d.ts +3 -0
- package/dist/tools/submission.d.ts.map +1 -0
- package/dist/tools/submission.js +138 -0
- package/dist/tools/submission.js.map +1 -0
- package/dist/utils/errors.d.ts +34 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +81 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +29 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +74 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/zod-to-json.d.ts +7 -0
- package/dist/utils/zod-to-json.d.ts.map +1 -0
- package/dist/utils/zod-to-json.js +63 -0
- package/dist/utils/zod-to-json.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* Base error class for Ratio MCP
|
|
4
|
+
*/
|
|
5
|
+
export class RatioMCPError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'RatioMCPError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class AuthenticationError extends RatioMCPError {
|
|
12
|
+
details;
|
|
13
|
+
constructor(message, details) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.details = details;
|
|
16
|
+
this.name = 'AuthenticationError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class RatioAPIError extends RatioMCPError {
|
|
20
|
+
endpoint;
|
|
21
|
+
method;
|
|
22
|
+
statusCode;
|
|
23
|
+
details;
|
|
24
|
+
constructor(message, endpoint, method, statusCode, details) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.endpoint = endpoint;
|
|
27
|
+
this.method = method;
|
|
28
|
+
this.statusCode = statusCode;
|
|
29
|
+
this.details = details;
|
|
30
|
+
this.name = 'RatioAPIError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class ToolExecutionError extends RatioMCPError {
|
|
34
|
+
toolName;
|
|
35
|
+
constructor(toolName, message) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.toolName = toolName;
|
|
38
|
+
this.name = 'ToolExecutionError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class BuildError extends RatioMCPError {
|
|
42
|
+
details;
|
|
43
|
+
constructor(message, details) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.details = details;
|
|
46
|
+
this.name = 'BuildError';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Extract a human-readable message from an Axios error response
|
|
51
|
+
*/
|
|
52
|
+
export function extractAxiosMessage(error) {
|
|
53
|
+
if (axios.isAxiosError(error)) {
|
|
54
|
+
const data = error.response?.data;
|
|
55
|
+
if (typeof data === 'string')
|
|
56
|
+
return data;
|
|
57
|
+
if (data?.message)
|
|
58
|
+
return String(data.message);
|
|
59
|
+
if (data?.error)
|
|
60
|
+
return String(data.error);
|
|
61
|
+
return error.message;
|
|
62
|
+
}
|
|
63
|
+
if (error instanceof Error)
|
|
64
|
+
return error.message;
|
|
65
|
+
return String(error);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Handle axios errors with consistent formatting
|
|
69
|
+
*/
|
|
70
|
+
export function handleAxiosError(error, endpoint, method) {
|
|
71
|
+
if (axios.isAxiosError(error)) {
|
|
72
|
+
const status = error.response?.status;
|
|
73
|
+
const message = extractAxiosMessage(error);
|
|
74
|
+
if (status === 401) {
|
|
75
|
+
throw new AuthenticationError('Authentication failed. Please login again.', error.response?.data);
|
|
76
|
+
}
|
|
77
|
+
throw new RatioAPIError(message, endpoint, method, status, error.response?.data);
|
|
78
|
+
}
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAChB;IAApC,YAAY,OAAe,EAAS,OAAiB;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,YAAO,GAAP,OAAO,CAAU;QAEnD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAGrC;IACA;IACA;IACA;IALT,YACE,OAAe,EACR,QAAgB,EAChB,MAAc,EACd,UAAmB,EACnB,OAAiB;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QALR,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAS;QACnB,YAAO,GAAP,OAAO,CAAU;QAGxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAChC;IAAnB,YAAmB,QAAgB,EAAE,OAAe;QAClD,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,aAAQ,GAAR,QAAQ,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,aAAa;IACP;IAApC,YAAY,OAAe,EAAS,OAAiB;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,YAAO,GAAP,OAAO,CAAU;QAEnD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;QAClC,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,IAAI,EAAE,OAAO;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,IAAI,EAAE,KAAK;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAc,EACd,QAAgB,EAChB,MAAc;IAEd,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;QACtC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE3C,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,mBAAmB,CAC3B,4CAA4C,EAC5C,KAAK,CAAC,QAAQ,EAAE,IAAI,CACrB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,aAAa,CACrB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,MAAM,EACN,KAAK,CAAC,QAAQ,EAAE,IAAI,CACrB,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple logger that writes to stderr (MCP servers use stdout for protocol messages).
|
|
3
|
+
* Timestamps included for tracing tool execution duration.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Safely stringify objects for logging, truncating to maxLen to avoid flooding stderr.
|
|
7
|
+
* Redacts sensitive fields (passwords, tokens, secrets).
|
|
8
|
+
*/
|
|
9
|
+
declare function safeStringify(obj: unknown, maxLen?: number): string;
|
|
10
|
+
export declare const logger: {
|
|
11
|
+
info: (message: string, ...args: unknown[]) => void;
|
|
12
|
+
warn: (message: string, ...args: unknown[]) => void;
|
|
13
|
+
error: (message: string, ...args: unknown[]) => void;
|
|
14
|
+
debug: (message: string, ...args: unknown[]) => void;
|
|
15
|
+
/** Log an incoming tool call with its input parameters */
|
|
16
|
+
toolCall: (toolName: string, input: unknown) => void;
|
|
17
|
+
/** Log a successful tool result */
|
|
18
|
+
toolResult: (toolName: string, durationMs: number, result: unknown) => void;
|
|
19
|
+
/** Log a failed tool execution */
|
|
20
|
+
toolError: (toolName: string, durationMs: number, error: unknown) => void;
|
|
21
|
+
/** Log an outgoing API request to the backend */
|
|
22
|
+
apiRequest: (method: string, url: string, data?: unknown) => void;
|
|
23
|
+
/** Log a successful API response */
|
|
24
|
+
apiResponse: (method: string, url: string, status: number, durationMs: number) => void;
|
|
25
|
+
/** Log a failed API response */
|
|
26
|
+
apiError: (method: string, url: string, status: number | undefined, durationMs: number, errorBody?: unknown) => void;
|
|
27
|
+
};
|
|
28
|
+
export { safeStringify };
|
|
29
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,iBAAS,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,SAAO,GAAG,MAAM,CAgB1D;AAED,eAAO,MAAM,MAAM;oBACD,MAAM,WAAW,OAAO,EAAE;oBAG1B,MAAM,WAAW,OAAO,EAAE;qBAGzB,MAAM,WAAW,OAAO,EAAE;qBAG1B,MAAM,WAAW,OAAO,EAAE;IAM3C,0DAA0D;yBACrC,MAAM,SAAS,OAAO;IAI3C,mCAAmC;2BACZ,MAAM,cAAc,MAAM,UAAU,OAAO;IAIlE,kCAAkC;0BACZ,MAAM,cAAc,MAAM,SAAS,OAAO;IAMhE,iDAAiD;yBAC5B,MAAM,OAAO,MAAM,SAAS,OAAO;IAKxD,oCAAoC;0BACd,MAAM,OAAO,MAAM,UAAU,MAAM,cAAc,MAAM;IAI7E,gCAAgC;uBACb,MAAM,OAAO,MAAM,UAAU,MAAM,GAAG,SAAS,cAAc,MAAM,cAAc,OAAO;CAG5G,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple logger that writes to stderr (MCP servers use stdout for protocol messages).
|
|
3
|
+
* Timestamps included for tracing tool execution duration.
|
|
4
|
+
*/
|
|
5
|
+
function timestamp() {
|
|
6
|
+
return new Date().toISOString();
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Safely stringify objects for logging, truncating to maxLen to avoid flooding stderr.
|
|
10
|
+
* Redacts sensitive fields (passwords, tokens, secrets).
|
|
11
|
+
*/
|
|
12
|
+
function safeStringify(obj, maxLen = 2000) {
|
|
13
|
+
const REDACTED_KEYS = ['password', 'token', 'secret', 'client_secret', 'access_token', 'refresh_token', 'authorization'];
|
|
14
|
+
try {
|
|
15
|
+
const str = JSON.stringify(obj, (key, value) => {
|
|
16
|
+
if (REDACTED_KEYS.includes(key.toLowerCase()) && typeof value === 'string') {
|
|
17
|
+
return value.length > 8 ? `${value.substring(0, 4)}...REDACTED` : '***REDACTED***';
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
});
|
|
21
|
+
if (str && str.length > maxLen) {
|
|
22
|
+
return str.substring(0, maxLen) + `...[truncated, total ${str.length} chars]`;
|
|
23
|
+
}
|
|
24
|
+
return str || '';
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return String(obj);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export const logger = {
|
|
31
|
+
info: (message, ...args) => {
|
|
32
|
+
console.error(`[ratio-dev] ${timestamp()} INFO: ${message}`, ...args);
|
|
33
|
+
},
|
|
34
|
+
warn: (message, ...args) => {
|
|
35
|
+
console.error(`[ratio-dev] ${timestamp()} WARN: ${message}`, ...args);
|
|
36
|
+
},
|
|
37
|
+
error: (message, ...args) => {
|
|
38
|
+
console.error(`[ratio-dev] ${timestamp()} ERROR: ${message}`, ...args);
|
|
39
|
+
},
|
|
40
|
+
debug: (message, ...args) => {
|
|
41
|
+
if (process.env.DEBUG) {
|
|
42
|
+
console.error(`[ratio-dev] ${timestamp()} DEBUG: ${message}`, ...args);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
/** Log an incoming tool call with its input parameters */
|
|
46
|
+
toolCall: (toolName, input) => {
|
|
47
|
+
console.error(`[ratio-dev] ${timestamp()} TOOL_CALL: ▶ ${toolName} | input: ${safeStringify(input)}`);
|
|
48
|
+
},
|
|
49
|
+
/** Log a successful tool result */
|
|
50
|
+
toolResult: (toolName, durationMs, result) => {
|
|
51
|
+
console.error(`[ratio-dev] ${timestamp()} TOOL_RESULT: ✓ ${toolName} | ${durationMs}ms | output: ${safeStringify(result)}`);
|
|
52
|
+
},
|
|
53
|
+
/** Log a failed tool execution */
|
|
54
|
+
toolError: (toolName, durationMs, error) => {
|
|
55
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
56
|
+
const details = error?.details;
|
|
57
|
+
console.error(`[ratio-dev] ${timestamp()} TOOL_ERROR: ✗ ${toolName} | ${durationMs}ms | error: ${message}${details ? ` | details: ${safeStringify(details, 500)}` : ''}`);
|
|
58
|
+
},
|
|
59
|
+
/** Log an outgoing API request to the backend */
|
|
60
|
+
apiRequest: (method, url, data) => {
|
|
61
|
+
const body = data ? ` | body: ${safeStringify(data, 500)}` : '';
|
|
62
|
+
console.error(`[ratio-dev] ${timestamp()} API_REQ: → ${method} ${url}${body}`);
|
|
63
|
+
},
|
|
64
|
+
/** Log a successful API response */
|
|
65
|
+
apiResponse: (method, url, status, durationMs) => {
|
|
66
|
+
console.error(`[ratio-dev] ${timestamp()} API_RES: ← ${method} ${url} | ${status} | ${durationMs}ms`);
|
|
67
|
+
},
|
|
68
|
+
/** Log a failed API response */
|
|
69
|
+
apiError: (method, url, status, durationMs, errorBody) => {
|
|
70
|
+
console.error(`[ratio-dev] ${timestamp()} API_ERR: ✗ ${method} ${url} | ${status || 'NO_RESPONSE'} | ${durationMs}ms | body: ${safeStringify(errorBody, 500)}`);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
export { safeStringify };
|
|
74
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Simple Zod-to-JSON-Schema converter for MCP tool registration.
|
|
4
|
+
* Handles the common cases used in our tool definitions.
|
|
5
|
+
*/
|
|
6
|
+
export declare function zodToJsonSchema(schema: z.ZodType): Record<string, unknown>;
|
|
7
|
+
//# sourceMappingURL=zod-to-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-to-json.d.ts","sourceRoot":"","sources":["../../src/utils/zod-to-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE1E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Zod-to-JSON-Schema converter for MCP tool registration.
|
|
3
|
+
* Handles the common cases used in our tool definitions.
|
|
4
|
+
*/
|
|
5
|
+
export function zodToJsonSchema(schema) {
|
|
6
|
+
return convertZodType(schema);
|
|
7
|
+
}
|
|
8
|
+
function convertZodType(schema) {
|
|
9
|
+
const def = schema._def;
|
|
10
|
+
const typeName = def.typeName;
|
|
11
|
+
switch (typeName) {
|
|
12
|
+
case 'ZodObject': {
|
|
13
|
+
const shape = schema.shape;
|
|
14
|
+
const properties = {};
|
|
15
|
+
const required = [];
|
|
16
|
+
for (const [key, value] of Object.entries(shape)) {
|
|
17
|
+
const fieldDef = value._def;
|
|
18
|
+
const isOptional = fieldDef.typeName === 'ZodOptional';
|
|
19
|
+
const innerType = isOptional ? fieldDef.innerType : value;
|
|
20
|
+
properties[key] = convertZodType(innerType);
|
|
21
|
+
// Add description from .describe()
|
|
22
|
+
const desc = fieldDef.description || innerType._def.description;
|
|
23
|
+
if (desc) {
|
|
24
|
+
properties[key].description = desc;
|
|
25
|
+
}
|
|
26
|
+
if (!isOptional) {
|
|
27
|
+
required.push(key);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const result = { type: 'object', properties };
|
|
31
|
+
if (required.length > 0)
|
|
32
|
+
result.required = required;
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
case 'ZodString':
|
|
36
|
+
return { type: 'string' };
|
|
37
|
+
case 'ZodNumber':
|
|
38
|
+
return { type: 'number' };
|
|
39
|
+
case 'ZodBoolean':
|
|
40
|
+
return { type: 'boolean' };
|
|
41
|
+
case 'ZodArray': {
|
|
42
|
+
const itemType = def.type || def.innerType;
|
|
43
|
+
return { type: 'array', items: convertZodType(itemType) };
|
|
44
|
+
}
|
|
45
|
+
case 'ZodEnum': {
|
|
46
|
+
const values = def.values;
|
|
47
|
+
return { type: 'string', enum: values };
|
|
48
|
+
}
|
|
49
|
+
case 'ZodOptional': {
|
|
50
|
+
const inner = def.innerType;
|
|
51
|
+
return convertZodType(inner);
|
|
52
|
+
}
|
|
53
|
+
case 'ZodDefault': {
|
|
54
|
+
const inner = def.innerType;
|
|
55
|
+
const result = convertZodType(inner);
|
|
56
|
+
result.default = def.defaultValue;
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
default:
|
|
60
|
+
return { type: 'string' };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=zod-to-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-to-json.js","sourceRoot":"","sources":["../../src/utils/zod-to-json.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,MAAiB;IACvC,MAAM,GAAG,GAAI,MAAuD,CAAC,IAAI,CAAC;IAC1E,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAkB,CAAC;IAExC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAI,MAAiD,CAAC,KAAK,CAAC;YACvE,MAAM,UAAU,GAA4B,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;YAE9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAI,KAAsD,CAAC,IAAI,CAAC;gBAC9E,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,KAAK,aAAa,CAAC;gBACvD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,QAAQ,CAAC,SAAuB,CAAC,CAAC,CAAE,KAAmB,CAAC;gBAExF,UAAU,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;gBAE5C,mCAAmC;gBACnC,MAAM,IAAI,GAAI,QAAQ,CAAC,WAAsB,IAAM,SAA0D,CAAC,IAAI,CAAC,WAAsB,CAAC;gBAC1I,IAAI,IAAI,EAAE,CAAC;oBACR,UAAU,CAAC,GAAG,CAA6B,CAAC,WAAW,GAAG,IAAI,CAAC;gBAClE,CAAC;gBAED,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;YACvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACpD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAE5B,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAE5B,KAAK,YAAY;YACf,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAE7B,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAI,GAAG,CAAC,IAAkB,IAAK,GAAG,CAAC,SAAuB,CAAC;YACzE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,GAAG,CAAC,MAAkB,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1C,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAsB,CAAC;YACzC,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAsB,CAAC;YACzC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC;YAClC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED;YACE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ratio-mcp/dev-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"files": ["dist"],
|
|
7
|
+
"bin": {
|
|
8
|
+
"ratio-dev-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc && npm run copy-templates",
|
|
12
|
+
"copy-templates": "rm -rf dist/templates && cp -r src/templates dist/templates 2>/dev/null || true",
|
|
13
|
+
"dev": "node --loader ts-node/esm src/index.ts",
|
|
14
|
+
"start": "node dist/index.js",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"prepublishOnly": "pnpm build"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
20
|
+
"@ratio-mcp/shared": "workspace:^",
|
|
21
|
+
"axios": "^1.7.0",
|
|
22
|
+
"zod": "^3.23.0",
|
|
23
|
+
"archiver": "^7.0.0",
|
|
24
|
+
"form-data": "^4.0.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^20.0.0",
|
|
28
|
+
"@types/archiver": "^6.0.0",
|
|
29
|
+
"typescript": "^5.4.0"
|
|
30
|
+
}
|
|
31
|
+
}
|