@ratio-mcp/dev-server 1.4.5 → 1.5.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/README.md +118 -0
- package/dist/schemas/orders.json +4 -4
- package/dist/schemas/products.json +5 -5
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +5 -1
- package/dist/server.js.map +1 -1
- package/dist/services/session-state.d.ts +0 -2
- package/dist/services/session-state.d.ts.map +1 -1
- package/dist/services/session-state.js +6 -7
- package/dist/services/session-state.js.map +1 -1
- package/dist/templates/backend/.env.example +1 -1
- package/dist/tools/codegen.d.ts.map +1 -1
- package/dist/tools/codegen.js +48 -24
- package/dist/tools/codegen.js.map +1 -1
- package/dist/tools/hookdeck.d.ts.map +1 -1
- package/dist/tools/hookdeck.js +161 -90
- package/dist/tools/hookdeck.js.map +1 -1
- package/dist/tools/submission.js +1 -1
- package/dist/tools/submission.js.map +1 -1
- package/dist/tools/webhooks.d.ts.map +1 -1
- package/dist/tools/webhooks.js +19 -3
- package/dist/tools/webhooks.js.map +1 -1
- package/package.json +6 -3
- package/dist/orchestrated-index.d.ts +0 -11
- package/dist/orchestrated-index.d.ts.map +0 -1
- package/dist/orchestrated-index.js +0 -33
- package/dist/orchestrated-index.js.map +0 -1
- package/dist/orchestrated-server.d.ts +0 -21
- package/dist/orchestrated-server.d.ts.map +0 -1
- package/dist/orchestrated-server.js +0 -101
- package/dist/orchestrated-server.js.map +0 -1
- package/dist/services/orchestrator.d.ts +0 -63
- package/dist/services/orchestrator.d.ts.map +0 -1
- package/dist/services/orchestrator.js +0 -845
- package/dist/services/orchestrator.js.map +0 -1
- package/dist/services/response-formatter.d.ts +0 -24
- package/dist/services/response-formatter.d.ts.map +0 -1
- package/dist/services/response-formatter.js +0 -311
- package/dist/services/response-formatter.js.map +0 -1
- package/dist/store/hookdeck-config.d.ts +0 -7
- package/dist/store/hookdeck-config.d.ts.map +0 -1
- package/dist/store/hookdeck-config.js +0 -60
- package/dist/store/hookdeck-config.js.map +0 -1
- package/dist/tools/agent-chat.d.ts +0 -9
- package/dist/tools/agent-chat.d.ts.map +0 -1
- package/dist/tools/agent-chat.js +0 -465
- package/dist/tools/agent-chat.js.map +0 -1
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { DEV_SERVER_NAME, DEV_SERVER_VERSION } from '@ratio-mcp/shared';
|
|
3
|
-
import { allDevTools } from './tools/index.js';
|
|
4
|
-
import { logger } from './utils/logger.js';
|
|
5
|
-
import { checkToolPrerequisites } from './services/tool-guard.js';
|
|
6
|
-
import { recordToolSuccess } from './services/session-state.js';
|
|
7
|
-
/**
|
|
8
|
-
* Create the Tool-First Ratio Dev MCP Server.
|
|
9
|
-
*
|
|
10
|
-
* Exposes all tools individually (not a single agent_chat).
|
|
11
|
-
* Each tool call passes through the prerequisite guard.
|
|
12
|
-
* The LLM decides what to call based on user intent and get_status output.
|
|
13
|
-
*
|
|
14
|
-
* Guard enforcement:
|
|
15
|
-
* - If prerequisites are met → tool executes normally
|
|
16
|
-
* - If prerequisites are NOT met → returns structured error with:
|
|
17
|
-
* - What's missing
|
|
18
|
-
* - The full chain of tools needed to unblock
|
|
19
|
-
* - A hint for the LLM to self-correct
|
|
20
|
-
*
|
|
21
|
-
* Session recording:
|
|
22
|
-
* - On success, tool results are parsed to extract context (appId, scopes, etc.)
|
|
23
|
-
* - This context drives future guard checks
|
|
24
|
-
*/
|
|
25
|
-
export function createOrchestratedServer() {
|
|
26
|
-
const server = new McpServer({
|
|
27
|
-
name: `${DEV_SERVER_NAME}-orchestrated`,
|
|
28
|
-
version: DEV_SERVER_VERSION,
|
|
29
|
-
});
|
|
30
|
-
// Register all tools with guard middleware
|
|
31
|
-
for (const tool of allDevTools) {
|
|
32
|
-
const shape = tool.inputSchema.shape;
|
|
33
|
-
server.tool(tool.name, tool.description, shape, async (args) => {
|
|
34
|
-
logger.toolCall(tool.name, args);
|
|
35
|
-
const startTime = Date.now();
|
|
36
|
-
// ── Guard: check prerequisites before executing ──────────────
|
|
37
|
-
const guard = checkToolPrerequisites(tool.name);
|
|
38
|
-
if (!guard.allowed) {
|
|
39
|
-
const duration = Date.now() - startTime;
|
|
40
|
-
logger.info(`BLOCKED ${tool.name} (${duration}ms): ${guard.message}`);
|
|
41
|
-
return {
|
|
42
|
-
content: [
|
|
43
|
-
{
|
|
44
|
-
type: 'text',
|
|
45
|
-
text: JSON.stringify({
|
|
46
|
-
error: true,
|
|
47
|
-
blocked: true,
|
|
48
|
-
tool: tool.name,
|
|
49
|
-
message: guard.message,
|
|
50
|
-
required_tools: guard.requiredTools,
|
|
51
|
-
chain: guard.chain,
|
|
52
|
-
hint: guard.hint || `Call ${guard.requiredTools?.join(' → ')} first, then retry ${tool.name}.`,
|
|
53
|
-
doc_hint: 'If you are unsure about any platform detail, call lookup_docs or get_status before proceeding.',
|
|
54
|
-
}, null, 2),
|
|
55
|
-
},
|
|
56
|
-
],
|
|
57
|
-
isError: true,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
// ── Execute tool ────────────────────────────────────────────
|
|
61
|
-
try {
|
|
62
|
-
const result = await tool.handler(args);
|
|
63
|
-
const duration = Date.now() - startTime;
|
|
64
|
-
logger.toolResult(tool.name, duration, result);
|
|
65
|
-
// Record success in session state
|
|
66
|
-
recordToolSuccess(tool.name, result);
|
|
67
|
-
return {
|
|
68
|
-
content: [
|
|
69
|
-
{
|
|
70
|
-
type: 'text',
|
|
71
|
-
text: JSON.stringify(result, null, 2),
|
|
72
|
-
},
|
|
73
|
-
],
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
const duration = Date.now() - startTime;
|
|
78
|
-
logger.toolError(tool.name, duration, error);
|
|
79
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
80
|
-
return {
|
|
81
|
-
content: [
|
|
82
|
-
{
|
|
83
|
-
type: 'text',
|
|
84
|
-
text: JSON.stringify({
|
|
85
|
-
error: true,
|
|
86
|
-
message,
|
|
87
|
-
tool: tool.name,
|
|
88
|
-
doc_hint: 'If this error is about an API detail, call lookup_docs to verify the correct usage.',
|
|
89
|
-
}, null, 2),
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
isError: true,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
logger.debug(`Registered tool: ${tool.name}`);
|
|
97
|
-
}
|
|
98
|
-
logger.info(`${DEV_SERVER_NAME}-orchestrated initialized with ${allDevTools.length} tools (tool-first architecture)`);
|
|
99
|
-
return server;
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=orchestrated-server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrated-server.js","sourceRoot":"","sources":["../src/orchestrated-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,GAAG,eAAe,eAAe;QACvC,OAAO,EAAE,kBAAkB;KAC5B,CAAC,CAAC;IAEH,2CAA2C;IAC3C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAI,IAAI,CAAC,WAA0C,CAAC,KAAK,CAAC;QAErE,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,KAAK,EACL,KAAK,EAAE,IAA6B,EAAE,EAAE;YACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,gEAAgE;YAChE,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,KAAK,QAAQ,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAEtE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,KAAK,EAAE,IAAI;gCACX,OAAO,EAAE,IAAI;gCACb,IAAI,EAAE,IAAI,CAAC,IAAI;gCACf,OAAO,EAAE,KAAK,CAAC,OAAO;gCACtB,cAAc,EAAE,KAAK,CAAC,aAAa;gCACnC,KAAK,EAAE,KAAK,CAAC,KAAK;gCAClB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,GAAG;gCAC9F,QAAQ,EAAE,gGAAgG;6BAC3G,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,+DAA+D;YAC/D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACxC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAE/C,kCAAkC;gBAClC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAErC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACxC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAE7C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,KAAK,EAAE,IAAI;gCACX,OAAO;gCACP,IAAI,EAAE,IAAI,CAAC,IAAI;gCACf,QAAQ,EAAE,qFAAqF;6BAChG,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,kCAAkC,WAAW,CAAC,MAAM,kCAAkC,CAAC,CAAC;IACtH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase definitions in the Ratio app development lifecycle.
|
|
3
|
-
* Each phase represents a logical group of activities that must be completed in order.
|
|
4
|
-
*/
|
|
5
|
-
export type Phase = 'auth' | 'app_setup' | 'requirements' | 'webhooks' | 'frontend_build' | 'review_wait' | 'publish_oauth' | 'backend_codegen' | 'complete';
|
|
6
|
-
/**
|
|
7
|
-
* Result returned by the orchestrator showing exactly what to do next.
|
|
8
|
-
* The caller uses this to invoke the correct tool with the right arguments.
|
|
9
|
-
*/
|
|
10
|
-
export interface OrchestratorResult {
|
|
11
|
-
phase: Phase;
|
|
12
|
-
step: string;
|
|
13
|
-
toolToCall: string;
|
|
14
|
-
toolArgs: Record<string, unknown>;
|
|
15
|
-
needsInput: boolean;
|
|
16
|
-
inputPrompt?: string;
|
|
17
|
-
inputFields?: string[];
|
|
18
|
-
message: string;
|
|
19
|
-
phase_description: string;
|
|
20
|
-
progress: {
|
|
21
|
-
current: number;
|
|
22
|
-
total: number;
|
|
23
|
-
percentage: number;
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Main orchestrator function: determines the exact next step based on session state.
|
|
28
|
-
*
|
|
29
|
-
* @param userInput - Optional user input (credentials, selections, configuration details)
|
|
30
|
-
* @returns OrchestratorResult describing what to do next
|
|
31
|
-
*/
|
|
32
|
-
export declare function getNextStep(userInput?: Record<string, unknown>): OrchestratorResult;
|
|
33
|
-
/**
|
|
34
|
-
* Get the current phase without computing the next step details.
|
|
35
|
-
* Useful for status checks and phase-only queries.
|
|
36
|
-
*/
|
|
37
|
-
export declare function getCurrentPhase(): Phase;
|
|
38
|
-
/**
|
|
39
|
-
* Get a human-friendly description of a phase.
|
|
40
|
-
*/
|
|
41
|
-
export declare function getPhaseDescription(phase: Phase): string;
|
|
42
|
-
/**
|
|
43
|
-
* Check if a phase can be skipped by the user.
|
|
44
|
-
* Currently only webhooks is optional.
|
|
45
|
-
*/
|
|
46
|
-
export declare function canSkipPhase(phase: Phase): boolean;
|
|
47
|
-
/**
|
|
48
|
-
* Get the total number of steps across all phases.
|
|
49
|
-
*/
|
|
50
|
-
export declare function getTotalSteps(): number;
|
|
51
|
-
/**
|
|
52
|
-
* Get metadata about a specific phase (description, step count, skippable).
|
|
53
|
-
*/
|
|
54
|
-
export declare function getPhaseMetadata(phase: Phase): {
|
|
55
|
-
description: string;
|
|
56
|
-
skippable: boolean;
|
|
57
|
-
stepCount: number;
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* Helper: Get all phases in order.
|
|
61
|
-
*/
|
|
62
|
-
export declare function getAllPhases(): Phase[];
|
|
63
|
-
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/services/orchestrator.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,MAAM,MAAM,KAAK,GACb,MAAM,GACN,WAAW,GACX,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,UAAU,CAAC;AAEf;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAEjC,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAGvB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAoyBD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CA2CnF;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,KAAK,CAEvC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK;iBAl3B9B,MAAM;eACR,OAAO;eACP,MAAM;EAk3BlB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,EAAE,CAKtC"}
|