gitlab-issue-creator-mcp 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/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # GitLab Issue Creator (MCP Server)
2
+
3
+ An MCP server that creates GitLab issues, compatible with self-hosted instances (default: <https://gitlab.org>).
4
+
5
+ ## Tools
6
+
7
+ - `create_gitlab_issue`
8
+ - Required: `title`, `projectId`
9
+ - Optional: `description`, `labels`, `assigneeIds`, `milestoneId`, `dueDate`, `confidential`
10
+ - Optional overrides: `gitlabUrl`, `gitlabToken` (prefer env vars)
11
+
12
+ ## Configuration
13
+
14
+ Set env vars (recommended):
15
+
16
+ - `GITLAB_URL` (defaults to `https://gitlab.org`)
17
+ - `GITLAB_TOKEN` (required)
18
+
19
+ See [.env.example](.env.example).
20
+
21
+ ## Team setup
22
+
23
+ Recommended flow for teammates:
24
+
25
+ 1. Clone this repo
26
+ 2. Install + build: `npm install && npm run build`
27
+ 3. Open the repo folder in VS Code
28
+ 4. Start the MCP server (Chat tool picker or `MCP: List Servers`)
29
+
30
+ VS Code will prompt for:
31
+
32
+ - GitLab base URL (defaults to `https://gitlab.org`)
33
+ - GitLab access token (stored securely by VS Code)
34
+
35
+ ## Develop / Build
36
+
37
+ - Install: `npm install`
38
+ - Build: `npm run build`
39
+ - Run: `GITLAB_TOKEN=... npm start`
40
+
41
+ ## MCP client config (example)
42
+
43
+ ## VS Code MCP setup
44
+
45
+ This repo includes a workspace MCP configuration at [.vscode/mcp.json](.vscode/mcp.json).
46
+
47
+ 1. Build the server: `npm install && npm run build`
48
+ 2. In VS Code, run `MCP: List Servers` (or open the Chat view tool picker)
49
+ 3. Start/trust the `gitlabIssueCreator` server when prompted
50
+
51
+ VS Code will prompt for the GitLab URL (defaulting to `https://gitlab.org`) and the token (stored securely via input variables).
52
+
53
+ Most MCP clients expect a stdio server:
54
+
55
+ ```json
56
+ {
57
+ "mcpServers": {
58
+ "gitlab-issue-creator": {
59
+ "command": "node",
60
+ "args": ["/absolute/path/to/gitlab-issue-creator/dist/index.js"],
61
+ "env": {
62
+ "GITLAB_URL": "https://gitlab.org",
63
+ "GITLAB_TOKEN": "<your_token>"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ## Notes
71
+
72
+ - Prefer a Project Access Token or a PAT scoped as narrowly as possible.
73
+ - This server prints no secrets, but your MCP client should keep tokens out of logs.
package/dist/gitlab.js ADDED
@@ -0,0 +1,56 @@
1
+ function requiredEnv(name) {
2
+ const value = process.env[name];
3
+ if (!value || value.trim().length === 0) {
4
+ throw new Error(`Missing required environment variable: ${name}`);
5
+ }
6
+ return value;
7
+ }
8
+ function normalizeBaseUrl(url) {
9
+ return url.replace(/\/$/, "");
10
+ }
11
+ export async function createGitLabIssue(params) {
12
+ const baseUrl = normalizeBaseUrl(params.gitlabUrl ??
13
+ process.env.GITLAB_URL ??
14
+ "https://git.bethelservice.org");
15
+ const token = params.gitlabToken ?? requiredEnv("GITLAB_TOKEN");
16
+ const projectId = params.projectId;
17
+ const apiUrl = `${baseUrl}/api/v4/projects/${encodeURIComponent(projectId)}/issues`;
18
+ const body = new URLSearchParams();
19
+ body.set("title", params.title);
20
+ if (params.description)
21
+ body.set("description", params.description);
22
+ if (params.labels?.length)
23
+ body.set("labels", params.labels.join(","));
24
+ if (params.assigneeIds?.length) {
25
+ for (const id of params.assigneeIds)
26
+ body.append("assignee_ids[]", String(id));
27
+ }
28
+ if (typeof params.milestoneId === "number")
29
+ body.set("milestone_id", String(params.milestoneId));
30
+ if (params.dueDate)
31
+ body.set("due_date", params.dueDate);
32
+ if (typeof params.confidential === "boolean")
33
+ body.set("confidential", params.confidential ? "true" : "false");
34
+ const res = await fetch(apiUrl, {
35
+ method: "POST",
36
+ headers: {
37
+ "PRIVATE-TOKEN": token,
38
+ "Content-Type": "application/x-www-form-urlencoded",
39
+ },
40
+ body,
41
+ });
42
+ const text = await res.text();
43
+ if (!res.ok) {
44
+ throw new Error(`GitLab API error (${res.status} ${res.statusText}) while creating issue: ${text}`);
45
+ }
46
+ const data = JSON.parse(text);
47
+ return {
48
+ id: data.id,
49
+ iid: data.iid,
50
+ projectId: data.project_id,
51
+ title: data.title,
52
+ state: data.state,
53
+ webUrl: data.web_url,
54
+ };
55
+ }
56
+ //# sourceMappingURL=gitlab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../src/gitlab.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
4
+ import { createGitLabIssueTool, handleCreateGitLabIssue, } from "./tools/createGitLabIssue.js";
5
+ const server = new Server({
6
+ name: "gitlab-issue-creator",
7
+ version: "0.1.0",
8
+ }, {
9
+ capabilities: {
10
+ tools: {},
11
+ },
12
+ });
13
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
14
+ return {
15
+ tools: [createGitLabIssueTool],
16
+ };
17
+ });
18
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
19
+ switch (request.params.name) {
20
+ case createGitLabIssueTool.name:
21
+ return handleCreateGitLabIssue(request.params.arguments ?? {});
22
+ default:
23
+ throw new Error(`Unknown tool: ${request.params.name}`);
24
+ }
25
+ });
26
+ const transport = new StdioServerTransport();
27
+ await server.connect(transport);
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE,CAAC,qBAAqB,CAAC;KAC/B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,QAAQ,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,qBAAqB,CAAC,IAAI;YAC7B,OAAO,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACjE;YACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,125 @@
1
+ function requiredEnv(name) {
2
+ const value = process.env[name];
3
+ if (!value || value.trim().length === 0) {
4
+ throw new Error(`Missing required environment variable: ${name}`);
5
+ }
6
+ return value;
7
+ }
8
+ function normalizeBaseUrl(url) {
9
+ return url.replace(/\/$/, "");
10
+ }
11
+ async function createGitLabIssue(params) {
12
+ const baseUrl = normalizeBaseUrl(params.gitlabUrl ?? process.env.GITLAB_URL ?? "https://gitlab.org");
13
+ const token = params.gitlabToken ?? requiredEnv("GITLAB_TOKEN");
14
+ const projectId = params.projectId;
15
+ const apiUrl = `${baseUrl}/api/v4/projects/${encodeURIComponent(projectId)}/issues`;
16
+ const body = new URLSearchParams();
17
+ body.set("title", params.title);
18
+ if (params.description)
19
+ body.set("description", params.description);
20
+ if (params.labels?.length)
21
+ body.set("labels", params.labels.join(","));
22
+ if (params.assigneeIds?.length) {
23
+ for (const id of params.assigneeIds)
24
+ body.append("assignee_ids[]", String(id));
25
+ }
26
+ if (typeof params.milestoneId === "number")
27
+ body.set("milestone_id", String(params.milestoneId));
28
+ if (params.dueDate)
29
+ body.set("due_date", params.dueDate);
30
+ if (typeof params.confidential === "boolean")
31
+ body.set("confidential", params.confidential ? "true" : "false");
32
+ const res = await fetch(apiUrl, {
33
+ method: "POST",
34
+ headers: {
35
+ "PRIVATE-TOKEN": token,
36
+ "Content-Type": "application/x-www-form-urlencoded",
37
+ },
38
+ body,
39
+ });
40
+ const text = await res.text();
41
+ if (!res.ok) {
42
+ throw new Error(`GitLab API error (${res.status} ${res.statusText}) while creating issue: ${text}`);
43
+ }
44
+ const data = JSON.parse(text);
45
+ return {
46
+ id: data.id,
47
+ iid: data.iid,
48
+ projectId: data.project_id,
49
+ title: data.title,
50
+ state: data.state,
51
+ webUrl: data.web_url,
52
+ };
53
+ }
54
+ export const createGitLabIssueTool = {
55
+ name: "create_gitlab_issue",
56
+ description: "Create a GitLab issue in a project on a self-hosted (or gitlab.com) instance.",
57
+ inputSchema: {
58
+ type: "object",
59
+ additionalProperties: false,
60
+ required: ["title", "projectId"],
61
+ properties: {
62
+ title: { type: "string", description: "Issue title" },
63
+ projectId: {
64
+ type: "string",
65
+ description: "GitLab project numeric ID or project path (e.g. group/project)",
66
+ },
67
+ description: { type: "string", description: "Issue description/body" },
68
+ labels: {
69
+ type: "array",
70
+ description: "List of labels to apply",
71
+ items: { type: "string" },
72
+ },
73
+ assigneeIds: {
74
+ type: "array",
75
+ description: "Assignee user IDs",
76
+ items: { type: "number" },
77
+ },
78
+ milestoneId: { type: "number", description: "Milestone ID" },
79
+ dueDate: {
80
+ type: "string",
81
+ description: "Due date in YYYY-MM-DD format",
82
+ },
83
+ confidential: { type: "boolean", description: "Create as confidential" },
84
+ gitlabUrl: {
85
+ type: "string",
86
+ description: "Optional override for GitLab base URL. Otherwise uses GITLAB_URL env var (defaults to https://gitlab.org).",
87
+ },
88
+ gitlabToken: {
89
+ type: "string",
90
+ description: "Optional override for GitLab token. Otherwise uses GITLAB_TOKEN env var.",
91
+ },
92
+ },
93
+ },
94
+ };
95
+ function assertString(value, field) {
96
+ if (typeof value !== "string" || value.trim().length === 0) {
97
+ throw new Error(`${field} must be a non-empty string`);
98
+ }
99
+ }
100
+ export async function handleCreateGitLabIssue(rawArgs) {
101
+ const args = rawArgs;
102
+ assertString(args.title, "title");
103
+ assertString(args.projectId, "projectId");
104
+ const result = await createGitLabIssue({
105
+ title: args.title,
106
+ description: args.description,
107
+ labels: args.labels,
108
+ assigneeIds: args.assigneeIds,
109
+ milestoneId: args.milestoneId,
110
+ dueDate: args.dueDate,
111
+ confidential: args.confidential,
112
+ projectId: args.projectId,
113
+ gitlabUrl: args.gitlabUrl,
114
+ gitlabToken: args.gitlabToken,
115
+ });
116
+ return {
117
+ content: [
118
+ {
119
+ type: "text",
120
+ text: JSON.stringify(result, null, 2),
121
+ },
122
+ ],
123
+ };
124
+ }
125
+ //# sourceMappingURL=createGitLabIssue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createGitLabIssue.js","sourceRoot":"","sources":["../../src/tools/createGitLabIssue.ts"],"names":[],"mappings":"AA4BA,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAA6B;IAC5D,MAAM,OAAO,GAAG,gBAAgB,CAC9B,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,oBAAoB,CACnE,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,WAAW,CAAC,cAAc,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAEnC,MAAM,MAAM,GAAG,GAAG,OAAO,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC;IAEpF,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,WAAW;QAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM;QAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAC/B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,WAAW;YACjC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;QACxC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,SAAS;QAC1C,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEnE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;QAC9B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,2BAA2B,IAAI,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwB,CAAC;IACrD,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,OAAO;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAS;IACzC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,+EAA+E;IACjF,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;QAChC,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;YACrD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,gEAAgE;aACnE;YACD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;YACtE,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,yBAAyB;gBACtC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,mBAAmB;gBAChC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B;YACD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;YAC5D,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+BAA+B;aAC7C;YACD,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wBAAwB,EAAE;YACxE,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,4GAA4G;aAC/G;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,0EAA0E;aAC7E;SACF;KACF;CACF,CAAC;AAEF,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAgB;IAC5D,MAAM,IAAI,GAAG,OAAyC,CAAC;IACvD,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "gitlab-issue-creator-mcp",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "MCP server for creating GitLab issues (self-hosted compatible).",
6
+ "main": "./dist/index.js",
7
+ "exports": {
8
+ ".": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "license": "UNLICENSED",
15
+ "engines": {
16
+ "node": ">=18"
17
+ },
18
+ "scripts": {
19
+ "prepublishOnly": "npm run build",
20
+ "build": "tsc -p tsconfig.json",
21
+ "start": "node dist/index.js",
22
+ "dev": "node --enable-source-maps dist/index.js",
23
+ "typecheck": "tsc -p tsconfig.json --noEmit"
24
+ },
25
+ "publishConfig": {
26
+ "registry": "https://registry.npmjs.org/"
27
+ },
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^20.11.30",
33
+ "typescript": "^5.5.4"
34
+ }
35
+ }