veryfront 0.1.140 → 0.1.142
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/esm/cli/mcp/jsonrpc.d.ts +33 -1
- package/esm/cli/mcp/jsonrpc.d.ts.map +1 -1
- package/esm/cli/mcp/jsonrpc.js +63 -4
- package/esm/cli/mcp/remote-file-tools.d.ts.map +1 -1
- package/esm/cli/mcp/remote-file-tools.js +39 -0
- package/esm/cli/mcp/server.d.ts.map +1 -1
- package/esm/cli/mcp/server.js +57 -34
- package/esm/cli/mcp/standalone.d.ts.map +1 -1
- package/esm/cli/mcp/standalone.js +24 -11
- package/esm/cli/mcp/tools/catalog-tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools/catalog-tools.js +15 -5
- package/esm/cli/mcp/tools/cicd-tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools/cicd-tools.js +8 -0
- package/esm/cli/mcp/tools/dev-tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools/dev-tools.js +32 -10
- package/esm/cli/mcp/tools/introspection-tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools/introspection-tools.js +6 -2
- package/esm/cli/mcp/tools/project-tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools/project-tools.js +12 -4
- package/esm/cli/mcp/tools/scaffold-tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools/scaffold-tools.js +6 -2
- package/esm/cli/mcp/tools/skill-tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools/skill-tools.js +6 -2
- package/esm/cli/mcp/tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools.js +36 -16
- package/esm/deno.js +1 -1
- package/esm/src/agent/runtime/index.js +1 -1
- package/esm/src/agent/runtime/tool-helpers.d.ts.map +1 -1
- package/esm/src/agent/runtime/tool-helpers.js +59 -30
- package/esm/src/agent/schemas/agent.schema.d.ts +4 -4
- package/esm/src/channels/invoke.d.ts +4 -4
- package/esm/src/internal-agents/run-stream.d.ts.map +1 -1
- package/esm/src/internal-agents/run-stream.js +62 -0
- package/esm/src/issues/mcp.d.ts.map +1 -1
- package/esm/src/issues/mcp.js +39 -10
- package/esm/src/mcp/index.d.ts +1 -1
- package/esm/src/mcp/index.d.ts.map +1 -1
- package/esm/src/mcp/server.d.ts.map +1 -1
- package/esm/src/mcp/server.js +85 -25
- package/esm/src/mcp/types.d.ts +22 -0
- package/esm/src/mcp/types.d.ts.map +1 -1
- package/esm/src/server/handlers/request/agent-stream.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/agent-stream.handler.js +30 -0
- package/esm/src/tool/types.d.ts +5 -0
- package/esm/src/tool/types.d.ts.map +1 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/schemas/workflow.schema.d.ts +6 -6
- package/package.json +1 -1
- package/src/cli/mcp/jsonrpc.ts +72 -4
- package/src/cli/mcp/remote-file-tools.ts +39 -0
- package/src/cli/mcp/server.ts +66 -33
- package/src/cli/mcp/standalone.ts +28 -10
- package/src/cli/mcp/tools/catalog-tools.ts +15 -5
- package/src/cli/mcp/tools/cicd-tools.ts +8 -0
- package/src/cli/mcp/tools/dev-tools.ts +34 -10
- package/src/cli/mcp/tools/introspection-tools.ts +7 -2
- package/src/cli/mcp/tools/project-tools.ts +12 -4
- package/src/cli/mcp/tools/scaffold-tools.ts +6 -2
- package/src/cli/mcp/tools/skill-tools.ts +6 -2
- package/src/cli/mcp/tools.ts +52 -16
- package/src/deno.js +1 -1
- package/src/src/agent/runtime/index.ts +1 -1
- package/src/src/agent/runtime/tool-helpers.ts +86 -36
- package/src/src/internal-agents/run-stream.ts +62 -0
- package/src/src/issues/mcp.ts +43 -10
- package/src/src/mcp/index.ts +7 -1
- package/src/src/mcp/server.ts +92 -31
- package/src/src/mcp/types.ts +24 -0
- package/src/src/server/handlers/request/agent-stream.handler.ts +30 -0
- package/src/src/tool/types.ts +7 -0
- package/src/src/utils/version-constant.ts +1 -1
package/esm/cli/mcp/jsonrpc.d.ts
CHANGED
|
@@ -37,6 +37,14 @@ export declare const JSONRPC_ERRORS: {
|
|
|
37
37
|
readonly INVALID_PARAMS: -32602;
|
|
38
38
|
readonly INTERNAL_ERROR: -32603;
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* Error with a JSON-RPC error code attached.
|
|
42
|
+
* Preserves stack traces unlike throwing plain objects.
|
|
43
|
+
*/
|
|
44
|
+
export declare class JsonRpcError extends Error {
|
|
45
|
+
readonly code: number;
|
|
46
|
+
constructor(code: number, message: string);
|
|
47
|
+
}
|
|
40
48
|
/**
|
|
41
49
|
* Create a JSON-RPC parse error response
|
|
42
50
|
*/
|
|
@@ -48,7 +56,31 @@ export declare function successResponse(id: string | number | undefined, result:
|
|
|
48
56
|
/**
|
|
49
57
|
* Create a JSON-RPC error response
|
|
50
58
|
*/
|
|
51
|
-
export declare function errorResponse(id: string | number | undefined, e: unknown, code?:
|
|
59
|
+
export declare function errorResponse(id: string | number | undefined, e: unknown, code?: number): JSONRPCResponse;
|
|
60
|
+
/**
|
|
61
|
+
* Supported MCP protocol versions (newest first).
|
|
62
|
+
* Shared across all CLI MCP servers so the version list is maintained in one place.
|
|
63
|
+
*/
|
|
64
|
+
export declare const MCP_SUPPORTED_VERSIONS: [string, ...string[]];
|
|
65
|
+
/**
|
|
66
|
+
* Safely extract a record from unknown params (mirrors src/mcp toParamsRecord).
|
|
67
|
+
*/
|
|
68
|
+
export declare function toParamsRecord(params: unknown): Record<string, unknown>;
|
|
69
|
+
/**
|
|
70
|
+
* Negotiate MCP protocol version: echo the client's version if supported,
|
|
71
|
+
* otherwise fall back to the newest supported version.
|
|
72
|
+
*/
|
|
73
|
+
export declare function negotiateVersion(params: unknown): string;
|
|
74
|
+
/**
|
|
75
|
+
* Build a complete MCP initialize result with negotiated version,
|
|
76
|
+
* capabilities, serverInfo, and instructions.
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildInitializeResult(params: unknown, serverInfo: {
|
|
79
|
+
name: string;
|
|
80
|
+
title: string;
|
|
81
|
+
version: string;
|
|
82
|
+
description: string;
|
|
83
|
+
}, instructions: string): Record<string, unknown>;
|
|
52
84
|
/**
|
|
53
85
|
* Validate and extract tools/call params
|
|
54
86
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;iBAK/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,eAAe,CAStD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe,CAEjG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAC/B,CAAC,EAAE,OAAO,EACV,IAAI,
|
|
1
|
+
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;iBAK/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX;;;GAGG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,eAAe,CAStD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe,CAEjG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAC/B,CAAC,EAAE,OAAO,EACV,IAAI,CAAC,EAAE,MAAM,GACZ,eAAe,CAgBjB;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAgC,CAAC;AAE1F;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAMxD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACjF,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;iBAGhC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,sBAAsB;;iBAEjC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,yBAAyB;;iBAEpC,CAAC"}
|
package/esm/cli/mcp/jsonrpc.js
CHANGED
|
@@ -23,6 +23,17 @@ export const JSONRPC_ERRORS = {
|
|
|
23
23
|
INVALID_PARAMS: -32602,
|
|
24
24
|
INTERNAL_ERROR: -32603,
|
|
25
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* Error with a JSON-RPC error code attached.
|
|
28
|
+
* Preserves stack traces unlike throwing plain objects.
|
|
29
|
+
*/
|
|
30
|
+
export class JsonRpcError extends Error {
|
|
31
|
+
code;
|
|
32
|
+
constructor(code, message) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.code = code;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
26
37
|
/**
|
|
27
38
|
* Create a JSON-RPC parse error response
|
|
28
39
|
*/
|
|
@@ -45,14 +56,62 @@ export function successResponse(id, result) {
|
|
|
45
56
|
/**
|
|
46
57
|
* Create a JSON-RPC error response
|
|
47
58
|
*/
|
|
48
|
-
export function errorResponse(id, e, code
|
|
59
|
+
export function errorResponse(id, e, code) {
|
|
60
|
+
const errorCode = typeof e === "object" && e !== null && "code" in e
|
|
61
|
+
? e.code
|
|
62
|
+
: undefined;
|
|
63
|
+
const resolvedCode = code ??
|
|
64
|
+
(typeof errorCode === "number" ? errorCode : JSONRPC_ERRORS.INTERNAL_ERROR);
|
|
65
|
+
const message = e instanceof Error
|
|
66
|
+
? e.message
|
|
67
|
+
: typeof e === "object" && e !== null && "message" in e
|
|
68
|
+
? String(e.message)
|
|
69
|
+
: String(e);
|
|
49
70
|
return {
|
|
50
71
|
jsonrpc: "2.0",
|
|
51
72
|
id,
|
|
52
|
-
error: {
|
|
53
|
-
|
|
54
|
-
|
|
73
|
+
error: { code: resolvedCode, message },
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Supported MCP protocol versions (newest first).
|
|
78
|
+
* Shared across all CLI MCP servers so the version list is maintained in one place.
|
|
79
|
+
*/
|
|
80
|
+
export const MCP_SUPPORTED_VERSIONS = ["2025-11-25", "2024-11-05"];
|
|
81
|
+
/**
|
|
82
|
+
* Safely extract a record from unknown params (mirrors src/mcp toParamsRecord).
|
|
83
|
+
*/
|
|
84
|
+
export function toParamsRecord(params) {
|
|
85
|
+
if (params && typeof params === "object" && !Array.isArray(params)) {
|
|
86
|
+
return params;
|
|
87
|
+
}
|
|
88
|
+
return {};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Negotiate MCP protocol version: echo the client's version if supported,
|
|
92
|
+
* otherwise fall back to the newest supported version.
|
|
93
|
+
*/
|
|
94
|
+
export function negotiateVersion(params) {
|
|
95
|
+
const p = toParamsRecord(params);
|
|
96
|
+
const requested = typeof p.protocolVersion === "string" ? p.protocolVersion : undefined;
|
|
97
|
+
return requested && MCP_SUPPORTED_VERSIONS.includes(requested)
|
|
98
|
+
? requested
|
|
99
|
+
: MCP_SUPPORTED_VERSIONS[0];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Build a complete MCP initialize result with negotiated version,
|
|
103
|
+
* capabilities, serverInfo, and instructions.
|
|
104
|
+
*/
|
|
105
|
+
export function buildInitializeResult(params, serverInfo, instructions) {
|
|
106
|
+
return {
|
|
107
|
+
protocolVersion: negotiateVersion(params),
|
|
108
|
+
capabilities: {
|
|
109
|
+
tools: { listChanged: true },
|
|
110
|
+
resources: { listChanged: true },
|
|
111
|
+
prompts: { listChanged: true },
|
|
55
112
|
},
|
|
113
|
+
serverInfo,
|
|
114
|
+
instructions,
|
|
56
115
|
};
|
|
57
116
|
}
|
|
58
117
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-file-tools.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/remote-file-tools.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA6F1C,UAAU,YAAY;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAOD,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8CD,QAAA,MAAM,oBAAoB;;;;;iBAOxB,CAAC;AAEH,KAAK,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEjE,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,oBAAoB,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"remote-file-tools.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/remote-file-tools.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA6F1C,UAAU,YAAY;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAOD,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8CD,QAAA,MAAM,oBAAoB;;;;;iBAOxB,CAAC;AAEH,KAAK,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEjE,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,oBAAoB,EAAE,qBAAqB,CA+BlF,CAAC;AAMF,QAAA,MAAM,kBAAkB;;;;iBAItB,CAAC;AAEH,KAAK,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE7D,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,EAAE,mBAAmB,CA2B5E,CAAC;AAMF,QAAA,MAAM,qBAAqB;;;;;iBAKzB,CAAC;AAEH,KAAK,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEnE,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,qBAAqB,EAAE,sBAAsB,CAiCrF,CAAC;AAMF,QAAA,MAAM,qBAAqB;;;;iBAIzB,CAAC;AAEH,KAAK,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEnE,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,qBAAqB,EAAE,sBAAsB,CAmBrF,CAAC;AAMF,QAAA,MAAM,sBAAsB;;;;;;;;iBAQ1B,CAAC;AAEH,KAAK,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAErE,UAAU,uBAAuB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC,sBAAsB,EAAE,uBAAuB,CAgCxF,CAAC;AAMF,QAAA,MAAM,mBAAmB;;;;;iBAKvB,CAAC;AAEH,KAAK,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAE/D,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,gBAAgB,EAAE,OAAO,CAAC,mBAAmB,EAAE,oBAAoB,CA2B/E,CAAC;AAMF,QAAA,MAAM,uBAAuB;;;;;;;;iBAM3B,CAAC;AAEH,KAAK,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEvE,UAAU,wBAAwB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,OAAO,CAAC,uBAAuB,EAAE,wBAAwB,CAiB3F,CAAC;AAMF,QAAA,MAAM,uBAAuB;;;;iBAM3B,CAAC;AAEH,KAAK,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEvE,UAAU,wBAAwB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,OAAO,CAAC,uBAAuB,EAAE,wBAAwB,CAe3F,CAAC;AAMF,QAAA,MAAM,sBAAsB;;;;iBAM1B,CAAC;AAEH,KAAK,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAErE,UAAU,uBAAuB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC,sBAAsB,EAAE,uBAAuB,CA4BxF,CAAC;AAMF,QAAA,MAAM,uBAAuB;;;iBAG3B,CAAC;AAEH,KAAK,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEvE,UAAU,wBAAwB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,OAAO,CAAC,uBAAuB,EAAE,wBAAwB,CAoB3F,CAAC;AAMF,QAAA,MAAM,wBAAwB;;;;iBAQ5B,CAAC;AAEH,KAAK,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEzE,UAAU,yBAAyB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,wBAAwB,EAAE,yBAAyB,CAe9F,CAAC;AAMF,QAAA,MAAM,uBAAuB;;;;iBAQ3B,CAAC;AAEH,KAAK,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEvE,UAAU,wBAAwB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,OAAO,CAAC,uBAAuB,EAAE,wBAAwB,CA0E3F,CAAC;AAMF,eAAO,MAAM,eAAe,EAAE,OAAO,EAapC,CAAC"}
|
|
@@ -108,6 +108,8 @@ const remoteListFilesInput = z.object({
|
|
|
108
108
|
});
|
|
109
109
|
export const vfRemoteListFiles = {
|
|
110
110
|
name: "vf_remote_list_files",
|
|
111
|
+
title: "List Remote Files",
|
|
112
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
111
113
|
description: "List files in a remote Veryfront project. Returns file paths, types, and sizes. Use this to explore a project's structure.",
|
|
112
114
|
inputSchema: remoteListFilesInput,
|
|
113
115
|
execute: (input) => withSpan("cli.mcp.tool.vf_remote_list_files", async () => {
|
|
@@ -138,6 +140,8 @@ const remoteGetFileInput = z.object({
|
|
|
138
140
|
});
|
|
139
141
|
export const vfRemoteGetFile = {
|
|
140
142
|
name: "vf_remote_get_file",
|
|
143
|
+
title: "Get Remote File",
|
|
144
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
141
145
|
description: "Read the content of a file from a remote Veryfront project. Always use this before modifying a file.",
|
|
142
146
|
inputSchema: remoteGetFileInput,
|
|
143
147
|
execute: (input) => withSpan("cli.mcp.tool.vf_remote_get_file", async () => {
|
|
@@ -165,6 +169,13 @@ const remoteUpdateFileInput = z.object({
|
|
|
165
169
|
});
|
|
166
170
|
export const vfRemoteUpdateFile = {
|
|
167
171
|
name: "vf_remote_update_file",
|
|
172
|
+
title: "Update Remote File",
|
|
173
|
+
annotations: {
|
|
174
|
+
readOnlyHint: false,
|
|
175
|
+
destructiveHint: true,
|
|
176
|
+
idempotentHint: true,
|
|
177
|
+
openWorldHint: false,
|
|
178
|
+
},
|
|
168
179
|
description: "Create or update a file in a remote Veryfront project. Always read the file first before updating to understand its current state.",
|
|
169
180
|
inputSchema: remoteUpdateFileInput,
|
|
170
181
|
execute: (input) => withSpan("cli.mcp.tool.vf_remote_update_file", async () => {
|
|
@@ -191,6 +202,13 @@ const remoteDeleteFileInput = z.object({
|
|
|
191
202
|
});
|
|
192
203
|
export const vfRemoteDeleteFile = {
|
|
193
204
|
name: "vf_remote_delete_file",
|
|
205
|
+
title: "Delete Remote File",
|
|
206
|
+
annotations: {
|
|
207
|
+
readOnlyHint: false,
|
|
208
|
+
destructiveHint: true,
|
|
209
|
+
idempotentHint: true,
|
|
210
|
+
openWorldHint: false,
|
|
211
|
+
},
|
|
194
212
|
description: "Delete a file from a remote Veryfront project.",
|
|
195
213
|
inputSchema: remoteDeleteFileInput,
|
|
196
214
|
execute: async (input) => {
|
|
@@ -215,6 +233,8 @@ const remoteSearchFilesInput = z.object({
|
|
|
215
233
|
});
|
|
216
234
|
export const vfRemoteSearchFiles = {
|
|
217
235
|
name: "vf_remote_search_files",
|
|
236
|
+
title: "Search Remote Files",
|
|
237
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
218
238
|
description: "Search for text patterns within file contents in a remote Veryfront project. Supports regex and glob patterns.",
|
|
219
239
|
inputSchema: remoteSearchFilesInput,
|
|
220
240
|
execute: (input) => withSpan("cli.mcp.tool.vf_remote_search_files", async () => {
|
|
@@ -248,6 +268,8 @@ const remoteMoveFileInput = z.object({
|
|
|
248
268
|
});
|
|
249
269
|
export const vfRemoteMoveFile = {
|
|
250
270
|
name: "vf_remote_move_file",
|
|
271
|
+
title: "Move Remote File",
|
|
272
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
251
273
|
description: "Move or rename a file in a remote Veryfront project.",
|
|
252
274
|
inputSchema: remoteMoveFileInput,
|
|
253
275
|
execute: async (input) => {
|
|
@@ -277,6 +299,8 @@ const remoteListBranchesInput = z.object({
|
|
|
277
299
|
});
|
|
278
300
|
export const vfRemoteListBranches = {
|
|
279
301
|
name: "vf_remote_list_branches",
|
|
302
|
+
title: "List Remote Branches",
|
|
303
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
280
304
|
description: "List branches in a remote Veryfront project.",
|
|
281
305
|
inputSchema: remoteListBranchesInput,
|
|
282
306
|
execute: async (input) => {
|
|
@@ -302,6 +326,8 @@ const remoteCreateBranchInput = z.object({
|
|
|
302
326
|
});
|
|
303
327
|
export const vfRemoteCreateBranch = {
|
|
304
328
|
name: "vf_remote_create_branch",
|
|
329
|
+
title: "Create Remote Branch",
|
|
330
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
305
331
|
description: "Create a new branch in a remote Veryfront project. Branch from main by default, or specify a base branch.",
|
|
306
332
|
inputSchema: remoteCreateBranchInput,
|
|
307
333
|
execute: async (input) => {
|
|
@@ -323,6 +349,8 @@ const remoteMergeBranchInput = z.object({
|
|
|
323
349
|
});
|
|
324
350
|
export const vfRemoteMergeBranch = {
|
|
325
351
|
name: "vf_remote_merge_branch",
|
|
352
|
+
title: "Merge Remote Branch",
|
|
353
|
+
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },
|
|
326
354
|
description: "Merge a branch into the target branch (or main if not specified).",
|
|
327
355
|
inputSchema: remoteMergeBranchInput,
|
|
328
356
|
execute: async (input) => {
|
|
@@ -350,6 +378,13 @@ const remoteDeleteBranchInput = z.object({
|
|
|
350
378
|
});
|
|
351
379
|
export const vfRemoteDeleteBranch = {
|
|
352
380
|
name: "vf_remote_delete_branch",
|
|
381
|
+
title: "Delete Remote Branch",
|
|
382
|
+
annotations: {
|
|
383
|
+
readOnlyHint: false,
|
|
384
|
+
destructiveHint: true,
|
|
385
|
+
idempotentHint: true,
|
|
386
|
+
openWorldHint: false,
|
|
387
|
+
},
|
|
353
388
|
description: "Delete a branch from a remote Veryfront project.",
|
|
354
389
|
inputSchema: remoteDeleteBranchInput,
|
|
355
390
|
execute: async (input) => {
|
|
@@ -369,6 +404,8 @@ const remoteCreateProjectInput = z.object({
|
|
|
369
404
|
});
|
|
370
405
|
export const vfRemoteCreateProject = {
|
|
371
406
|
name: "vf_remote_create_project",
|
|
407
|
+
title: "Create Remote Project",
|
|
408
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
372
409
|
description: "Create a new Veryfront project. Returns the project details including ID and slug.",
|
|
373
410
|
inputSchema: remoteCreateProjectInput,
|
|
374
411
|
execute: async (input) => {
|
|
@@ -391,6 +428,8 @@ const remoteCloneProjectInput = z.object({
|
|
|
391
428
|
});
|
|
392
429
|
export const vfRemoteCloneProject = {
|
|
393
430
|
name: "vf_remote_clone_project",
|
|
431
|
+
title: "Clone Remote Project",
|
|
432
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
394
433
|
description: "Clone a Veryfront project by creating a new project and copying all files from the source.",
|
|
395
434
|
inputSchema: remoteCloneProjectInput,
|
|
396
435
|
execute: (input) => withSpan("cli.mcp.tool.vf_remote_clone_project", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/server.ts"],"names":[],"mappings":"AAgDA,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,UAAU,CAA2B;gBAEjC,MAAM,GAAE,eAAoB;IAWxC,KAAK,IAAI,IAAI;IAeP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,OAAO,CAAC,SAAS;IA6DjB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,mBAAmB;IAuD3B,OAAO,CAAC,mBAAmB;IAqI3B,OAAO,CAAC,iBAAiB;IAiCzB,OAAO,CAAC,gBAAgB;IAyCxB,OAAO,CAAC,eAAe;CA+DxB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CAIrE;AAED,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC"}
|
package/esm/cli/mcp/server.js
CHANGED
|
@@ -13,7 +13,7 @@ import { createIssuesManager } from "../../src/issues/index.js";
|
|
|
13
13
|
import { getErrorCollector, getLogBuffer } from "../../src/observability/index.js";
|
|
14
14
|
import { allTools, getTool, setServerStartTime } from "./tools.js";
|
|
15
15
|
import { startStdioJsonRpc } from "./stdio.js";
|
|
16
|
-
import { errorResponse, JSONRPCRequestSchema, parseError, PromptsGetParamsSchema, ResourcesReadParamsSchema, successResponse, ToolsCallParamsSchema, } from "./jsonrpc.js";
|
|
16
|
+
import { buildInitializeResult, errorResponse, JsonRpcError, JSONRPCRequestSchema, parseError, PromptsGetParamsSchema, ResourcesReadParamsSchema, successResponse, ToolsCallParamsSchema, } from "./jsonrpc.js";
|
|
17
17
|
export class MCPDevServer {
|
|
18
18
|
config;
|
|
19
19
|
running = false;
|
|
@@ -71,6 +71,13 @@ export class MCPDevServer {
|
|
|
71
71
|
headers["Access-Control-Allow-Origin"] = origin;
|
|
72
72
|
if (req.method === "OPTIONS")
|
|
73
73
|
return new dntShim.Response(null, { status: 204, headers });
|
|
74
|
+
if (origin && !isAllowedOrigin) {
|
|
75
|
+
return new dntShim.Response(JSON.stringify({
|
|
76
|
+
jsonrpc: "2.0",
|
|
77
|
+
id: null,
|
|
78
|
+
error: { code: -32600, message: "Forbidden: Origin not allowed" },
|
|
79
|
+
}), { status: 403, headers });
|
|
80
|
+
}
|
|
74
81
|
if (url.pathname !== "/mcp") {
|
|
75
82
|
return new dntShim.Response(JSON.stringify({ error: "Not found. MCP endpoint is at /mcp" }), {
|
|
76
83
|
status: 404,
|
|
@@ -110,6 +117,8 @@ export class MCPDevServer {
|
|
|
110
117
|
switch (method) {
|
|
111
118
|
case "initialize":
|
|
112
119
|
return Promise.resolve(this.handleInitialize(params));
|
|
120
|
+
case "notifications/initialized":
|
|
121
|
+
return Promise.resolve({});
|
|
113
122
|
case "tools/list":
|
|
114
123
|
return Promise.resolve(this.handleToolsList());
|
|
115
124
|
case "tools/call":
|
|
@@ -126,46 +135,60 @@ export class MCPDevServer {
|
|
|
126
135
|
return Promise.reject(new Error(`Unknown method: ${method}`));
|
|
127
136
|
}
|
|
128
137
|
}
|
|
129
|
-
handleInitialize(
|
|
130
|
-
return {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
},
|
|
137
|
-
serverInfo: {
|
|
138
|
-
name: this.config.serverName,
|
|
139
|
-
version: this.config.serverVersion,
|
|
140
|
-
},
|
|
141
|
-
};
|
|
138
|
+
handleInitialize(params) {
|
|
139
|
+
return buildInitializeResult(params, {
|
|
140
|
+
name: this.config.serverName ?? "veryfront-dev",
|
|
141
|
+
title: "Veryfront Dev MCP Server",
|
|
142
|
+
version: this.config.serverVersion ?? "1.0.0",
|
|
143
|
+
description: "Veryfront development server tools for real-time errors, logs, HMR, and scaffolding",
|
|
144
|
+
}, "Veryfront dev MCP server provides development tools. Use vf_get_errors to check for code errors, vf_get_logs for server logs, and vf_trigger_hmr for hot module reload.");
|
|
142
145
|
}
|
|
143
146
|
handleToolsList() {
|
|
144
147
|
return {
|
|
145
|
-
tools: allTools.map((tool) =>
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
tools: allTools.map((tool) => {
|
|
149
|
+
const entry = {
|
|
150
|
+
name: tool.name,
|
|
151
|
+
description: tool.description,
|
|
152
|
+
inputSchema: this.zodToJsonSchema(tool.inputSchema),
|
|
153
|
+
};
|
|
154
|
+
if (tool.title)
|
|
155
|
+
entry.title = tool.title;
|
|
156
|
+
if (tool.annotations)
|
|
157
|
+
entry.annotations = tool.annotations;
|
|
158
|
+
return entry;
|
|
159
|
+
}),
|
|
150
160
|
};
|
|
151
161
|
}
|
|
152
162
|
handleToolsCall(params) {
|
|
153
|
-
const { name, arguments: args } = ToolsCallParamsSchema.parse(params);
|
|
163
|
+
const { name: toolName, arguments: args } = ToolsCallParamsSchema.parse(params);
|
|
164
|
+
const tool = getTool(toolName);
|
|
165
|
+
if (!tool) {
|
|
166
|
+
throw new JsonRpcError(-32602, `Unknown tool: ${toolName}`);
|
|
167
|
+
}
|
|
168
|
+
let input;
|
|
169
|
+
try {
|
|
170
|
+
input = tool.inputSchema.parse(args ?? {});
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
174
|
+
throw new JsonRpcError(-32602, `Invalid arguments for tool ${toolName}: ${message}`);
|
|
175
|
+
}
|
|
154
176
|
return withSpan("cli.mcp.handleToolsCall", async () => {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
},
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
177
|
+
try {
|
|
178
|
+
const result = await tool.execute(input);
|
|
179
|
+
return {
|
|
180
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
181
|
+
isError: false,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
186
|
+
return {
|
|
187
|
+
content: [{ type: "text", text: message }],
|
|
188
|
+
isError: true,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}, { "mcp.tool.name": toolName });
|
|
169
192
|
}
|
|
170
193
|
handleResourcesList() {
|
|
171
194
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/standalone.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/standalone.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8BH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAA4B;gBAEnC,MAAM,GAAE,mBAAwB;IAM5C,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;YAME,aAAa;IAW3B,OAAO,CAAC,cAAc;YAsCR,eAAe;IAqB7B,OAAO,CAAC,mBAAmB;YAyBb,mBAAmB;IA6CjC,OAAO,CAAC,iBAAiB;YAkBX,gBAAgB;IAwB9B,OAAO,CAAC,WAAW;CA8JpB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,GAAE,mBAAwB,GAAG,mBAAmB,CAI/F"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { readTextFile } from "../../src/platform/index.js";
|
|
9
9
|
import { DevServerClient } from "./dev-server-client.js";
|
|
10
10
|
import { startStdioJsonRpc } from "./stdio.js";
|
|
11
|
-
import { errorResponse, JSONRPCRequestSchema, parseError, PromptsGetParamsSchema, ResourcesReadParamsSchema, successResponse, ToolsCallParamsSchema, } from "./jsonrpc.js";
|
|
11
|
+
import { buildInitializeResult, errorResponse, JsonRpcError, JSONRPCRequestSchema, parseError, PromptsGetParamsSchema, ResourcesReadParamsSchema, successResponse, ToolsCallParamsSchema, } from "./jsonrpc.js";
|
|
12
12
|
const DEFAULT_DEV_PORT = 8080;
|
|
13
13
|
const NOT_RUNNING_MSG = "Dev server not running. Start with: veryfront";
|
|
14
14
|
export class StandaloneMCPServer {
|
|
@@ -50,11 +50,12 @@ export class StandaloneMCPServer {
|
|
|
50
50
|
dispatchMethod(method, params) {
|
|
51
51
|
switch (method) {
|
|
52
52
|
case "initialize":
|
|
53
|
-
return Promise.resolve({
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
return Promise.resolve(buildInitializeResult(params, {
|
|
54
|
+
name: "veryfront-mcp",
|
|
55
|
+
title: "Veryfront Standalone MCP Server",
|
|
56
|
+
version: "1.0.0",
|
|
57
|
+
description: "Veryfront standalone MCP server for CLI-based development tools",
|
|
58
|
+
}, "Veryfront standalone MCP server provides development tools. Use vf_get_errors to check for code errors, vf_get_logs for server logs, and vf_get_status for dev server health."));
|
|
58
59
|
case "notifications/initialized":
|
|
59
60
|
return Promise.resolve({});
|
|
60
61
|
case "tools/list":
|
|
@@ -80,12 +81,24 @@ export class StandaloneMCPServer {
|
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
83
|
async handleToolsCall(params) {
|
|
83
|
-
const { name, arguments: args } = ToolsCallParamsSchema.parse(params);
|
|
84
|
-
const tool = this.tools.find((t) => t.name ===
|
|
84
|
+
const { name: toolName, arguments: args } = ToolsCallParamsSchema.parse(params);
|
|
85
|
+
const tool = this.tools.find((t) => t.name === toolName);
|
|
85
86
|
if (!tool)
|
|
86
|
-
throw new
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
throw new JsonRpcError(-32602, `Unknown tool: ${toolName}`);
|
|
88
|
+
try {
|
|
89
|
+
const result = await tool.execute(args ?? {});
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
92
|
+
isError: false,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
97
|
+
return {
|
|
98
|
+
content: [{ type: "text", text: message }],
|
|
99
|
+
isError: true,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
89
102
|
}
|
|
90
103
|
handleResourcesList() {
|
|
91
104
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-tools.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/catalog-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO3C,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqDD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAyCD,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CAChC;AAwJD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AA4CD,QAAA,MAAM,iBAAiB,gCAAe,CAAC;AAEvC,KAAK,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE3D,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,iBAAiB,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"catalog-tools.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/catalog-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO3C,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqDD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAyCD,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CAChC;AAwJD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AA4CD,QAAA,MAAM,iBAAiB,gCAAe,CAAC;AAEvC,KAAK,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE3D,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,iBAAiB,EAAE,WAAW,EAAE,CAQpE,CAAC;AAMF,QAAA,MAAM,kBAAkB,gCAAe,CAAC;AAExC,KAAK,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE7D,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,EAAE,YAAY,EAAE,CAQvE,CAAC;AAMF,QAAA,MAAM,qBAAqB;;;;;;;;;iBAMzB,CAAC;AAEH,KAAK,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEnE,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,qBAAqB,EAAE,eAAe,EAAE,CAYhF,CAAC;AAMF,QAAA,MAAM,iBAAiB,gCAAe,CAAC;AAEvC,KAAK,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE3D,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,iBAAiB,EAAE,WAAW,EAAE,CAQpE,CAAC;AAMF,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;iBAuBtB,CAAC;AAEH,KAAK,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE7D,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,EAAE,mBAAmB,CAiD5E,CAAC"}
|
|
@@ -286,7 +286,9 @@ const USECASES = [
|
|
|
286
286
|
const listExamplesInput = z.object({});
|
|
287
287
|
export const vfListExamples = {
|
|
288
288
|
name: "vf_list_examples",
|
|
289
|
-
|
|
289
|
+
title: "List Examples",
|
|
290
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
291
|
+
description: "Use this when you need to browse example projects that demonstrate Veryfront features and integrations. Returns an array of example info with name, description, and category. Do not use for project templates — use vf_list_templates instead.",
|
|
290
292
|
inputSchema: listExamplesInput,
|
|
291
293
|
execute: () => Promise.resolve(EXAMPLES),
|
|
292
294
|
};
|
|
@@ -296,7 +298,9 @@ export const vfListExamples = {
|
|
|
296
298
|
const listTemplatesInput = z.object({});
|
|
297
299
|
export const vfListTemplates = {
|
|
298
300
|
name: "vf_list_templates",
|
|
299
|
-
|
|
301
|
+
title: "List Templates",
|
|
302
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }, // openWorldHint: templates come from remote catalog API
|
|
303
|
+
description: "Use this when you need to list available project templates for creating new projects. Returns an array of template info with name and description. Do not use for example projects — use vf_list_examples instead.",
|
|
300
304
|
inputSchema: listTemplatesInput,
|
|
301
305
|
execute: () => Promise.resolve(TEMPLATES),
|
|
302
306
|
};
|
|
@@ -312,7 +316,9 @@ const listIntegrationsInput = z.object({
|
|
|
312
316
|
});
|
|
313
317
|
export const vfListIntegrations = {
|
|
314
318
|
name: "vf_list_integrations",
|
|
315
|
-
|
|
319
|
+
title: "List Integrations",
|
|
320
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
321
|
+
description: "Use this when you need to list available service integrations (Gmail, Slack, GitHub, etc.) that can be added to AI projects. Returns an array of integration info with name, category, and description. Do not use for adding integrations to a project — use vf_create_project with the integrations parameter instead.",
|
|
316
322
|
inputSchema: listIntegrationsInput,
|
|
317
323
|
execute: (input) => {
|
|
318
324
|
const { category } = input;
|
|
@@ -327,7 +333,9 @@ export const vfListIntegrations = {
|
|
|
327
333
|
const listUsecasesInput = z.object({});
|
|
328
334
|
export const vfListUsecases = {
|
|
329
335
|
name: "vf_list_usecases",
|
|
330
|
-
|
|
336
|
+
title: "List Use Cases",
|
|
337
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
338
|
+
description: "Use this when you need to browse pre-configured use-case templates with recommended integrations and UI layouts. Returns an array of use-case info with name, integrations, and layout. Do not use for raw templates — use vf_list_templates instead.",
|
|
331
339
|
inputSchema: listUsecasesInput,
|
|
332
340
|
execute: () => Promise.resolve(USECASES),
|
|
333
341
|
};
|
|
@@ -360,7 +368,9 @@ const createProjectInput = z.object({
|
|
|
360
368
|
});
|
|
361
369
|
export const vfCreateProject = {
|
|
362
370
|
name: "vf_create_project",
|
|
363
|
-
|
|
371
|
+
title: "Create Project",
|
|
372
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
373
|
+
description: "Use this when you need to create a new Veryfront project from a template. Returns the project directory and next steps. Do not use for scaffolding individual files — use vf_scaffold instead.",
|
|
364
374
|
inputSchema: createProjectInput,
|
|
365
375
|
execute: (input) => withSpan("cli.mcp.tool.vf_create_project", async () => {
|
|
366
376
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cicd-tools.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/cicd-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"cicd-tools.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/cicd-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAuFzD,eAAO,MAAM,SAAS,EAAE,OAAO,EAK9B,CAAC"}
|
|
@@ -5,6 +5,8 @@ const getPipelineStatusInput = z.object({
|
|
|
5
5
|
});
|
|
6
6
|
const vfGetPipelineStatus = {
|
|
7
7
|
name: "vf_get_pipeline_status",
|
|
8
|
+
title: "Pipeline Status",
|
|
9
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
8
10
|
description: "Get the current build/deploy pipeline state for a project environment.",
|
|
9
11
|
inputSchema: getPipelineStatusInput,
|
|
10
12
|
execute: async (input) => {
|
|
@@ -22,6 +24,8 @@ const getDeployHistoryInput = z.object({
|
|
|
22
24
|
});
|
|
23
25
|
const vfGetDeployHistory = {
|
|
24
26
|
name: "vf_get_deploy_history",
|
|
27
|
+
title: "Deploy History",
|
|
28
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
25
29
|
description: "List recent deployments with status, version, URL, and timestamp.",
|
|
26
30
|
inputSchema: getDeployHistoryInput,
|
|
27
31
|
execute: async (input) => {
|
|
@@ -38,6 +42,8 @@ const getBuildLogsInput = z.object({
|
|
|
38
42
|
});
|
|
39
43
|
const vfGetBuildLogs = {
|
|
40
44
|
name: "vf_get_build_logs",
|
|
45
|
+
title: "Build Logs",
|
|
46
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
41
47
|
description: "Get build logs from an active or recent build/deployment.",
|
|
42
48
|
inputSchema: getBuildLogsInput,
|
|
43
49
|
execute: async (input) => {
|
|
@@ -55,6 +61,8 @@ const triggerDeployInput = z.object({
|
|
|
55
61
|
});
|
|
56
62
|
const vfTriggerDeploy = {
|
|
57
63
|
name: "vf_trigger_deploy",
|
|
64
|
+
title: "Trigger Deploy",
|
|
65
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
58
66
|
description: "Trigger a deployment to an environment. Returns a deployment ID for status tracking.",
|
|
59
67
|
inputSchema: triggerDeployInput,
|
|
60
68
|
execute: async (input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-tools.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/dev-tools.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO3C,QAAA,MAAM,cAAc;;iBAKlB,CAAC;AAEH,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAErD,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"dev-tools.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/dev-tools.ts"],"names":[],"mappings":"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"}
|