@wanadev/mcp-gitlab 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -12,39 +12,93 @@ import { registerIssueTools } from "./tools/issues.js";
12
12
  import { registerMilestoneTools } from "./tools/milestones.js";
13
13
  import { registerMergeRequestTools } from "./tools/merge_requests.js";
14
14
  import { registerUtilTools } from "./tools/utils.js";
15
- function getEnvOrExit(name, description) {
16
- const value = process.env[name];
17
- if (!value) {
18
- console.error(`Erreur: la variable d'environnement ${name} est requise.\n` +
19
- `${description}\n` +
20
- `Exemple: ${name}=xxx npx @wanadev/mcp-gitlab`);
21
- process.exit(1);
22
- }
23
- return value;
24
- }
15
+ const SETUP_MESSAGE = `GITLAB_TOKEN is not set. The GitLab MCP server needs a Personal Access Token to connect.
16
+
17
+ Setup steps:
18
+ 1. Go to GitLab > Settings > Access Tokens
19
+ 2. Create a token with the "api" scope
20
+ 3. Set it as an environment variable:
21
+ - Linux/macOS: export GITLAB_TOKEN=glpat-xxxx (add to ~/.bashrc or ~/.zshrc)
22
+ - Windows: set GITLAB_TOKEN=glpat-xxxx (or use System Environment Variables)
23
+ 4. Restart Claude Code or Claude Desktop
24
+
25
+ Tell the user these steps in their language. Be friendly and concise.`;
25
26
  async function main() {
26
- const token = getEnvOrExit("GITLAB_TOKEN", "Token d'acces personnel GitLab (PAT) avec les scopes api ou read_api.");
27
+ const token = process.env["GITLAB_TOKEN"] ?? "";
27
28
  const baseUrl = process.env["GITLAB_BASE_URL"] ?? "https://gitlab.com";
28
29
  const readOnly = process.env["GITLAB_READ_ONLY"] === "true";
29
- const client = new GitLabClient({ baseUrl, token, readOnly });
30
30
  const server = new McpServer({
31
31
  name: pkg.name,
32
32
  version: pkg.version,
33
33
  });
34
- registerEpicTools(server, client);
35
- registerIssueTools(server, client);
36
- registerMilestoneTools(server, client);
37
- registerMergeRequestTools(server, client);
38
- registerUtilTools(server, client);
34
+ if (!token) {
35
+ // No token: register a single setup tool that guides the user
36
+ console.error("@wanadev/mcp-gitlab: GITLAB_TOKEN not set — starting in setup mode");
37
+ server.registerTool("gitlab_setup", {
38
+ description: "GitLab MCP is not configured yet. Call this tool to show the user how to set up their GitLab token.",
39
+ inputSchema: {},
40
+ annotations: { readOnlyHint: true },
41
+ }, async () => {
42
+ return { content: [{ type: "text", text: SETUP_MESSAGE }] };
43
+ });
44
+ }
45
+ else {
46
+ // Validate base URL
47
+ try {
48
+ new URL(baseUrl);
49
+ }
50
+ catch {
51
+ console.error(`@wanadev/mcp-gitlab: invalid GITLAB_BASE_URL "${baseUrl}"`);
52
+ server.registerTool("gitlab_setup", {
53
+ description: "GitLab MCP has an invalid GITLAB_BASE_URL. Call this tool to help the user fix it.",
54
+ inputSchema: {},
55
+ annotations: { readOnlyHint: true },
56
+ }, async () => {
57
+ return { content: [{ type: "text", text: `GITLAB_BASE_URL is invalid: "${baseUrl}". It must be a valid URL (e.g. https://gitlab.com or https://gitlab.mycompany.com). Tell the user to fix it in their language and restart.` }] };
58
+ });
59
+ const transport = new StdioServerTransport();
60
+ await server.connect(transport);
61
+ return;
62
+ }
63
+ // Token + URL present: validate connection then register tools
64
+ const client = new GitLabClient({ baseUrl, token, readOnly });
65
+ // Test the connection at startup and detect access level
66
+ try {
67
+ const user = await client.getCurrentUser();
68
+ const mode = readOnly ? "read-only (forced by GITLAB_READ_ONLY=true)" : "read-write";
69
+ console.error(`@wanadev/mcp-gitlab: connected as @${user.username} on ${baseUrl} [${mode}]`);
70
+ }
71
+ catch (error) {
72
+ const msg = error.message;
73
+ if (msg.includes("401")) {
74
+ console.error("@wanadev/mcp-gitlab: GITLAB_TOKEN is invalid or expired. Tools will register but all calls will fail.");
75
+ }
76
+ else if (msg.includes("403")) {
77
+ console.error("@wanadev/mcp-gitlab: GITLAB_TOKEN has insufficient permissions. Make sure it has the 'api' scope.");
78
+ }
79
+ else {
80
+ console.error(`@wanadev/mcp-gitlab: connection check failed — ${msg}`);
81
+ console.error("Tools will still register but API calls may fail. Check your GITLAB_TOKEN and GITLAB_BASE_URL.");
82
+ }
83
+ }
84
+ registerEpicTools(server, client);
85
+ registerIssueTools(server, client);
86
+ registerMilestoneTools(server, client);
87
+ registerMergeRequestTools(server, client);
88
+ registerUtilTools(server, client);
89
+ }
39
90
  const transport = new StdioServerTransport();
40
91
  await server.connect(transport);
41
- console.error("@wanadev/mcp-gitlab demarre (stdio)");
42
- if (readOnly) {
43
- console.error("Mode lecture seule actif (GITLAB_READ_ONLY=true)");
92
+ console.error(`@wanadev/mcp-gitlab v${pkg.version} started (stdio)`);
93
+ if (!token) {
94
+ console.error("Setup mode run gitlab_setup for configuration help");
95
+ }
96
+ else if (readOnly) {
97
+ console.error("Read-only mode active (GITLAB_READ_ONLY=true)");
44
98
  }
45
99
  }
46
100
  main().catch((error) => {
47
- console.error("Erreur fatale:", error);
101
+ console.error("Fatal error:", error);
48
102
  process.exit(1);
49
103
  });
50
104
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAsC,CAAC;AAC5H,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,SAAS,YAAY,CAAC,IAAY,EAAE,WAAmB;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,uCAAuC,IAAI,iBAAiB;YAC1D,GAAG,WAAW,IAAI;YAClB,YAAY,IAAI,8BAA8B,CACjD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,YAAY,CACxB,cAAc,EACd,uEAAuE,CACxE,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,oBAAoB,CAAC;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,MAAM,CAAC;IAE5D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wanadev/mcp-gitlab",
3
- "version": "1.0.5",
3
+ "version": "1.1.0",
4
4
  "description": "MCP server for GitLab epics, issues, and milestones management",
5
5
  "type": "module",
6
6
  "bin": {