@wanadev/mcp-gitlab 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.
@@ -0,0 +1,92 @@
1
+ import { z } from "zod";
2
+ const groupIdSchema = z.string().describe("ID ou chemin URL du groupe GitLab (ex: '42' ou 'wanadev/kp1'). Si vous n'avez que le nom, appelez d'abord list_groups pour trouver le chemin exact.");
3
+ function formatMR(mr) {
4
+ const draft = mr.draft ? " [DRAFT]" : "";
5
+ const conflicts = mr.has_conflicts ? " [CONFLITS]" : "";
6
+ const assignees = mr.assignees.length > 0
7
+ ? ` — Assignes: ${mr.assignees.map((a) => `@${a.username}`).join(", ")}`
8
+ : "";
9
+ const reviewers = mr.reviewers.length > 0
10
+ ? ` — Reviewers: ${mr.reviewers.map((r) => `@${r.username}`).join(", ")}`
11
+ : "";
12
+ const labels = mr.labels.length > 0 ? ` — Labels: ${mr.labels.join(", ")}` : "";
13
+ return `**${mr.title}** (project:${mr.project_id} !${mr.iid}) — ${mr.state}${draft}${conflicts}${assignees}${reviewers}${labels}\n ${mr.source_branch} → ${mr.target_branch}\n ${mr.web_url}`;
14
+ }
15
+ function formatMRs(mrs) {
16
+ if (mrs.length === 0)
17
+ return "Aucune merge request trouvee.";
18
+ return `${mrs.length} merge request(s) :\n\n${mrs.map(formatMR).join("\n\n")}`;
19
+ }
20
+ function formatMRDetail(mr) {
21
+ const parts = [
22
+ `# ${mr.title} (project:${mr.project_id} !${mr.iid})`,
23
+ `**Etat:** ${mr.state}${mr.draft ? " (draft)" : ""}`,
24
+ `**Auteur:** ${mr.author.name} (@${mr.author.username})`,
25
+ mr.assignees.length > 0
26
+ ? `**Assignes:** ${mr.assignees.map((a) => `${a.name} (@${a.username})`).join(", ")}`
27
+ : null,
28
+ mr.reviewers.length > 0
29
+ ? `**Reviewers:** ${mr.reviewers.map((r) => `${r.name} (@${r.username})`).join(", ")}`
30
+ : null,
31
+ `**Branches:** ${mr.source_branch} → ${mr.target_branch}`,
32
+ `**Merge status:** ${mr.merge_status}${mr.has_conflicts ? " (CONFLITS)" : ""}`,
33
+ mr.labels.length > 0 ? `**Labels:** ${mr.labels.join(", ")}` : null,
34
+ mr.milestone ? `**Milestone:** ${mr.milestone.title}` : null,
35
+ `**Cree le:** ${mr.created_at}`,
36
+ `**Mis a jour:** ${mr.updated_at}`,
37
+ mr.merged_at ? `**Merge le:** ${mr.merged_at}` : null,
38
+ mr.closed_at ? `**Ferme le:** ${mr.closed_at}` : null,
39
+ `**Lien:** ${mr.web_url}`,
40
+ mr.description ? `\n---\n${mr.description}` : null,
41
+ ];
42
+ return parts.filter(Boolean).join("\n");
43
+ }
44
+ export function registerMergeRequestTools(server, client) {
45
+ server.registerTool("list_merge_requests", {
46
+ description: "Lister les merge requests d'un groupe GitLab. Filtrer par etat, auteur, reviewer, labels ou milestone.",
47
+ inputSchema: {
48
+ group_id: groupIdSchema,
49
+ state: z.enum(["opened", "closed", "merged", "all"]).optional().describe("Filtrer par etat (defaut: all)"),
50
+ search: z.string().optional().describe("Recherche textuelle dans le titre"),
51
+ labels: z.string().optional().describe("Labels (separes par virgule)"),
52
+ milestone: z.string().optional().describe("Nom du milestone"),
53
+ author_username: z.string().optional().describe("Nom d'utilisateur de l'auteur"),
54
+ reviewer_username: z.string().optional().describe("Nom d'utilisateur du reviewer"),
55
+ order_by: z.enum(["created_at", "updated_at"]).optional().describe("Trier par champ"),
56
+ sort: z.enum(["asc", "desc"]).optional().describe("Ordre de tri"),
57
+ },
58
+ annotations: { readOnlyHint: true },
59
+ }, async (args) => {
60
+ try {
61
+ const { group_id, ...params } = args;
62
+ const mrs = await client.listGroupMergeRequests(group_id, params);
63
+ return { content: [{ type: "text", text: formatMRs(mrs) }] };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
68
+ isError: true,
69
+ };
70
+ }
71
+ });
72
+ server.registerTool("get_merge_request", {
73
+ description: "Obtenir les details d'une merge request par son projet et son numero (IID).",
74
+ inputSchema: {
75
+ project_id: z.number().describe("ID du projet"),
76
+ mr_iid: z.number().describe("Numero de la merge request (IID)"),
77
+ },
78
+ annotations: { readOnlyHint: true },
79
+ }, async (args) => {
80
+ try {
81
+ const mr = await client.getMergeRequest(args.project_id, args.mr_iid);
82
+ return { content: [{ type: "text", text: formatMRDetail(mr) }] };
83
+ }
84
+ catch (error) {
85
+ return {
86
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
87
+ isError: true,
88
+ };
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=merge_requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge_requests.js","sourceRoot":"","sources":["../../src/tools/merge_requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { GitLabClient } from "../client.js";
3
+ export declare function registerMilestoneTools(server: McpServer, client: GitLabClient): void;
4
+ //# sourceMappingURL=milestones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestones.d.ts","sourceRoot":"","sources":["../../src/tools/milestones.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAyCjD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA6HpF"}
@@ -0,0 +1,162 @@
1
+ import { z } from "zod";
2
+ const groupIdSchema = z.string().describe("ID ou chemin URL du groupe GitLab (ex: '42' ou 'wanadev/kp1'). Si vous n'avez que le nom, appelez d'abord list_groups pour trouver le chemin exact.");
3
+ const dryRunSchema = z.boolean().default(true).describe("Dry run mode (default: true). When true, returns a preview of the action without executing it. Set to false only after user confirmation.");
4
+ function dryRunResponse(action, details) {
5
+ const lines = Object.entries(details)
6
+ .filter(([, v]) => v !== undefined)
7
+ .map(([k, v]) => ` - **${k}:** ${v}`);
8
+ const text = `[DRY RUN] ${action}\n\n${lines.join("\n")}\n\nThis is a preview. Ask the user to confirm in their language before re-calling with dry_run=false.`;
9
+ return { content: [{ type: "text", text }] };
10
+ }
11
+ function formatMilestone(m) {
12
+ const due = m.due_date ? ` — Echeance: ${m.due_date}` : "";
13
+ const start = m.start_date ? ` — Debut: ${m.start_date}` : "";
14
+ const expired = m.expired ? " [EXPIRE]" : "";
15
+ return `**${m.title}** (id:${m.id}) — ${m.state}${start}${due}${expired}\n ${m.web_url}`;
16
+ }
17
+ function formatMilestones(milestones) {
18
+ if (milestones.length === 0)
19
+ return "Aucun milestone trouve.";
20
+ return `${milestones.length} milestone(s) :\n\n${milestones.map(formatMilestone).join("\n\n")}`;
21
+ }
22
+ function formatMilestoneDetail(m) {
23
+ const parts = [
24
+ `# ${m.title} (id:${m.id})`,
25
+ `**Etat:** ${m.state}`,
26
+ m.start_date ? `**Debut:** ${m.start_date}` : null,
27
+ m.due_date ? `**Echeance:** ${m.due_date}` : null,
28
+ m.expired ? `**Expire:** oui` : null,
29
+ `**Cree le:** ${m.created_at}`,
30
+ `**Mis a jour:** ${m.updated_at}`,
31
+ `**Lien:** ${m.web_url}`,
32
+ m.description ? `\n---\n${m.description}` : null,
33
+ ];
34
+ return parts.filter(Boolean).join("\n");
35
+ }
36
+ export function registerMilestoneTools(server, client) {
37
+ server.registerTool("list_milestones", {
38
+ description: "Lister les milestones d'un groupe GitLab. Filtrer par etat ou recherche textuelle.",
39
+ inputSchema: {
40
+ group_id: groupIdSchema,
41
+ state: z.enum(["active", "closed"]).optional().describe("Filtrer par etat"),
42
+ search: z.string().optional().describe("Recherche textuelle dans le titre"),
43
+ },
44
+ annotations: { readOnlyHint: true },
45
+ }, async (args) => {
46
+ try {
47
+ const { group_id, ...params } = args;
48
+ const milestones = await client.listGroupMilestones(group_id, params);
49
+ return { content: [{ type: "text", text: formatMilestones(milestones) }] };
50
+ }
51
+ catch (error) {
52
+ return {
53
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
54
+ isError: true,
55
+ };
56
+ }
57
+ });
58
+ server.registerTool("get_milestone", {
59
+ description: "Obtenir les details d'un milestone par son ID.",
60
+ inputSchema: {
61
+ group_id: groupIdSchema,
62
+ milestone_id: z.number().describe("ID du milestone"),
63
+ },
64
+ annotations: { readOnlyHint: true },
65
+ }, async (args) => {
66
+ try {
67
+ const milestone = await client.getMilestone(args.group_id, args.milestone_id);
68
+ return { content: [{ type: "text", text: formatMilestoneDetail(milestone) }] };
69
+ }
70
+ catch (error) {
71
+ return {
72
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
73
+ isError: true,
74
+ };
75
+ }
76
+ });
77
+ server.registerTool("create_milestone", {
78
+ description: "Creer un nouveau milestone. Par defaut dry_run=true : retourne un apercu sans creer. Passer dry_run=false apres confirmation.",
79
+ inputSchema: {
80
+ group_id: groupIdSchema,
81
+ title: z.string().describe("Titre du milestone"),
82
+ description: z.string().optional().describe("Description du milestone"),
83
+ start_date: z.string().optional().describe("Date de debut (YYYY-MM-DD)"),
84
+ due_date: z.string().optional().describe("Date d'echeance (YYYY-MM-DD)"),
85
+ dry_run: dryRunSchema,
86
+ },
87
+ annotations: { readOnlyHint: false },
88
+ }, async (args) => {
89
+ try {
90
+ const { group_id, dry_run, ...data } = args;
91
+ if (dry_run) {
92
+ return dryRunResponse("Creer un milestone", { groupe: group_id, ...data });
93
+ }
94
+ const milestone = await client.createMilestone(group_id, data);
95
+ return {
96
+ content: [{ type: "text", text: `Milestone cree avec succes !\n\n${formatMilestoneDetail(milestone)}` }],
97
+ };
98
+ }
99
+ catch (error) {
100
+ return {
101
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
102
+ isError: true,
103
+ };
104
+ }
105
+ });
106
+ server.registerTool("update_milestone", {
107
+ description: "Mettre a jour un milestone existant. Par defaut dry_run=true.",
108
+ inputSchema: {
109
+ group_id: groupIdSchema,
110
+ milestone_id: z.number().describe("ID du milestone"),
111
+ title: z.string().optional().describe("Nouveau titre"),
112
+ description: z.string().optional().describe("Nouvelle description"),
113
+ start_date: z.string().optional().describe("Nouvelle date de debut (YYYY-MM-DD)"),
114
+ due_date: z.string().optional().describe("Nouvelle date d'echeance (YYYY-MM-DD)"),
115
+ dry_run: dryRunSchema,
116
+ },
117
+ annotations: { readOnlyHint: false },
118
+ }, async (args) => {
119
+ try {
120
+ const { group_id, milestone_id, dry_run, ...data } = args;
121
+ if (dry_run) {
122
+ return dryRunResponse("Modifier le milestone", { groupe: group_id, milestone_id, ...data });
123
+ }
124
+ const milestone = await client.updateMilestone(group_id, milestone_id, data);
125
+ return {
126
+ content: [{ type: "text", text: `Milestone mis a jour !\n\n${formatMilestoneDetail(milestone)}` }],
127
+ };
128
+ }
129
+ catch (error) {
130
+ return {
131
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
132
+ isError: true,
133
+ };
134
+ }
135
+ });
136
+ server.registerTool("close_milestone", {
137
+ description: "Fermer un milestone. Par defaut dry_run=true.",
138
+ inputSchema: {
139
+ group_id: groupIdSchema,
140
+ milestone_id: z.number().describe("ID du milestone a fermer"),
141
+ dry_run: dryRunSchema,
142
+ },
143
+ annotations: { readOnlyHint: false },
144
+ }, async (args) => {
145
+ try {
146
+ if (args.dry_run) {
147
+ return dryRunResponse("Fermer le milestone", { groupe: args.group_id, milestone_id: args.milestone_id });
148
+ }
149
+ const milestone = await client.closeMilestone(args.group_id, args.milestone_id);
150
+ return {
151
+ content: [{ type: "text", text: `Milestone ferme !\n\n${formatMilestoneDetail(milestone)}` }],
152
+ };
153
+ }
154
+ catch (error) {
155
+ return {
156
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
157
+ isError: true,
158
+ };
159
+ }
160
+ });
161
+ }
162
+ //# sourceMappingURL=milestones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestones.js","sourceRoot":"","sources":["../../src/tools/milestones.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { GitLabClient } from "../client.js";
3
+ export declare function registerUtilTools(server: McpServer, client: GitLabClient): void;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA0EjD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAiJ/E"}
@@ -0,0 +1,207 @@
1
+ import { z } from "zod";
2
+ const groupIdSchema = z.string().describe("ID ou chemin URL du groupe GitLab (ex: '42' ou 'wanadev/kp1'). Si vous n'avez que le nom, appelez d'abord list_groups pour trouver le chemin exact.");
3
+ function formatProject(p) {
4
+ const archived = p.archived ? " [ARCHIVE]" : "";
5
+ return `**${p.name_with_namespace}** (id:${p.id})${archived}\n ${p.web_url}`;
6
+ }
7
+ function formatProjects(projects) {
8
+ if (projects.length === 0)
9
+ return "Aucun projet trouve.";
10
+ return `${projects.length} projet(s) :\n\n${projects.map(formatProject).join("\n\n")}`;
11
+ }
12
+ function accessLevelName(level) {
13
+ const levels = {
14
+ 10: "Guest",
15
+ 20: "Reporter",
16
+ 30: "Developer",
17
+ 40: "Maintainer",
18
+ 50: "Owner",
19
+ };
20
+ return levels[level] ?? `Level ${level}`;
21
+ }
22
+ function formatMember(m) {
23
+ return `**${m.name}** (@${m.username}) — ${accessLevelName(m.access_level)}\n ${m.web_url}`;
24
+ }
25
+ function formatMembers(members) {
26
+ if (members.length === 0)
27
+ return "Aucun membre trouve.";
28
+ return `${members.length} membre(s) :\n\n${members.map(formatMember).join("\n\n")}`;
29
+ }
30
+ function formatUser(u) {
31
+ return `**${u.name}** (@${u.username})\nID: ${u.id}\nEtat: ${u.state}\n${u.web_url}`;
32
+ }
33
+ function formatGroup(g) {
34
+ const parent = g.parent_id ? ` — parent: ${g.parent_id}` : " (top-level)";
35
+ const desc = g.description ? ` — ${g.description}` : "";
36
+ return `**${g.name}** (id:${g.id}, path: ${g.full_path})${parent}${desc}\n ${g.web_url}`;
37
+ }
38
+ function formatGroups(groups) {
39
+ if (groups.length === 0)
40
+ return "Aucun groupe trouve.";
41
+ return `${groups.length} groupe(s) :\n\n${groups.map(formatGroup).join("\n\n")}`;
42
+ }
43
+ function formatLabel(l) {
44
+ const prio = l.priority != null ? ` — Priorite: ${l.priority}` : "";
45
+ const desc = l.description ? ` — ${l.description}` : "";
46
+ return `**${l.name}** (${l.color}) — ${l.open_issues_count} issues ouvertes, ${l.closed_issues_count} fermees, ${l.open_merge_requests_count} MRs${prio}${desc}`;
47
+ }
48
+ function formatLabels(labels) {
49
+ if (labels.length === 0)
50
+ return "Aucun label trouve.";
51
+ return `${labels.length} label(s) :\n\n${labels.map(formatLabel).join("\n\n")}`;
52
+ }
53
+ function formatBoard(b) {
54
+ const milestone = b.milestone ? ` — Milestone: ${b.milestone.title}` : "";
55
+ const lists = b.lists.map((l) => l.label ? ` - ${l.label.name} (position: ${l.position})` : ` - (position: ${l.position})`).join("\n");
56
+ return `**${b.name}** (id:${b.id})${milestone}\n${lists || " (aucune colonne)"}`;
57
+ }
58
+ function formatBoards(boards) {
59
+ if (boards.length === 0)
60
+ return "Aucun board trouve.";
61
+ return `${boards.length} board(s) :\n\n${boards.map(formatBoard).join("\n\n")}`;
62
+ }
63
+ export function registerUtilTools(server, client) {
64
+ server.registerTool("list_groups", {
65
+ description: "Lister les groupes GitLab accessibles. IMPORTANT : appelez ce tool en premier quand l'utilisateur mentionne un groupe par son nom, pour obtenir le group_id (ID ou full_path) a passer aux autres tools.",
66
+ inputSchema: {
67
+ search: z.string().optional().describe("Recherche textuelle dans le nom du groupe"),
68
+ top_level_only: z.boolean().optional().describe("Ne retourner que les groupes de premier niveau"),
69
+ },
70
+ annotations: { readOnlyHint: true },
71
+ }, async (args) => {
72
+ try {
73
+ const groups = await client.listGroups(args);
74
+ return { content: [{ type: "text", text: formatGroups(groups) }] };
75
+ }
76
+ catch (error) {
77
+ return {
78
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
79
+ isError: true,
80
+ };
81
+ }
82
+ });
83
+ server.registerTool("list_projects", {
84
+ description: "Lister les projets d'un groupe GitLab. Filtrer par recherche ou statut d'archivage.",
85
+ inputSchema: {
86
+ group_id: groupIdSchema,
87
+ search: z.string().optional().describe("Recherche textuelle dans le nom du projet"),
88
+ archived: z.enum(["true", "false"]).optional().describe("Filtrer les projets archives"),
89
+ },
90
+ annotations: { readOnlyHint: true },
91
+ }, async (args) => {
92
+ try {
93
+ const { group_id, ...params } = args;
94
+ const projects = await client.listProjects(group_id, params);
95
+ return { content: [{ type: "text", text: formatProjects(projects) }] };
96
+ }
97
+ catch (error) {
98
+ return {
99
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
100
+ isError: true,
101
+ };
102
+ }
103
+ });
104
+ server.registerTool("list_group_members", {
105
+ description: "Lister les membres d'un groupe GitLab avec leur niveau d'acces.",
106
+ inputSchema: {
107
+ group_id: groupIdSchema,
108
+ search: z.string().optional().describe("Recherche par nom ou username"),
109
+ },
110
+ annotations: { readOnlyHint: true },
111
+ }, async (args) => {
112
+ try {
113
+ const { group_id, ...params } = args;
114
+ const members = await client.listGroupMembers(group_id, params);
115
+ return { content: [{ type: "text", text: formatMembers(members) }] };
116
+ }
117
+ catch (error) {
118
+ return {
119
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
120
+ isError: true,
121
+ };
122
+ }
123
+ });
124
+ server.registerTool("list_labels", {
125
+ description: "Lister les labels d'un groupe GitLab avec le nombre d'issues et MRs associees.",
126
+ inputSchema: {
127
+ group_id: groupIdSchema,
128
+ search: z.string().optional().describe("Recherche textuelle dans le nom du label"),
129
+ },
130
+ annotations: { readOnlyHint: true },
131
+ }, async (args) => {
132
+ try {
133
+ const { group_id, ...params } = args;
134
+ const labels = await client.listGroupLabels(group_id, params);
135
+ return { content: [{ type: "text", text: formatLabels(labels) }] };
136
+ }
137
+ catch (error) {
138
+ return {
139
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
140
+ isError: true,
141
+ };
142
+ }
143
+ });
144
+ server.registerTool("list_boards", {
145
+ description: "Lister les boards (tableaux kanban) d'un groupe GitLab avec leurs colonnes.",
146
+ inputSchema: {
147
+ group_id: groupIdSchema,
148
+ },
149
+ annotations: { readOnlyHint: true },
150
+ }, async (args) => {
151
+ try {
152
+ const boards = await client.listGroupBoards(args.group_id);
153
+ return { content: [{ type: "text", text: formatBoards(boards) }] };
154
+ }
155
+ catch (error) {
156
+ return {
157
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
158
+ isError: true,
159
+ };
160
+ }
161
+ });
162
+ server.registerTool("list_iterations", {
163
+ description: "List iterations (sprints) for a GitLab group. Filter by state (upcoming, current, closed) or search by title. Requires GitLab Premium/Ultimate.",
164
+ inputSchema: {
165
+ group_id: groupIdSchema,
166
+ state: z.enum(["upcoming", "current", "closed"]).optional().describe("Filter by state"),
167
+ search: z.string().optional().describe("Search by iteration title"),
168
+ },
169
+ annotations: { readOnlyHint: true },
170
+ }, async (args) => {
171
+ try {
172
+ const { group_id, ...params } = args;
173
+ const iterations = await client.listGroupIterations(group_id, params);
174
+ if (iterations.length === 0) {
175
+ return { content: [{ type: "text", text: "No iterations found." }] };
176
+ }
177
+ const text = iterations.map((it) => {
178
+ const dates = `${it.start_date} → ${it.due_date}`;
179
+ return `**${it.title}** (id:${it.id}) — ${it.state} — ${dates}\n ${it.web_url}`;
180
+ }).join("\n\n");
181
+ return { content: [{ type: "text", text: `${iterations.length} iteration(s) :\n\n${text}` }] };
182
+ }
183
+ catch (error) {
184
+ return {
185
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
186
+ isError: true,
187
+ };
188
+ }
189
+ });
190
+ server.registerTool("get_current_user", {
191
+ description: "Obtenir les informations de l'utilisateur connecte (verifie que le token fonctionne).",
192
+ inputSchema: {},
193
+ annotations: { readOnlyHint: true },
194
+ }, async () => {
195
+ try {
196
+ const user = await client.getCurrentUser();
197
+ return { content: [{ type: "text", text: formatUser(user) }] };
198
+ }
199
+ catch (error) {
200
+ return {
201
+ content: [{ type: "text", text: `Erreur: ${error.message}` }],
202
+ isError: true,
203
+ };
204
+ }
205
+ });
206
+ }
207
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"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"}