@connect-xlab/mcp-server 0.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/config.js +18 -0
- package/dist/http.js +30 -0
- package/dist/index.js +178 -0
- package/dist/tools/addComment.js +31 -0
- package/dist/tools/approveMember.js +29 -0
- package/dist/tools/banMember.js +26 -0
- package/dist/tools/createCategory.js +36 -0
- package/dist/tools/createClass.js +37 -0
- package/dist/tools/createEvent.js +39 -0
- package/dist/tools/createLabLink.js +28 -0
- package/dist/tools/createNewsletterEdition.js +38 -0
- package/dist/tools/createPodcastEpisode.js +38 -0
- package/dist/tools/createPodcastShow.js +34 -0
- package/dist/tools/createPost.js +41 -0
- package/dist/tools/createShopProduct.js +46 -0
- package/dist/tools/deleteCategory.js +26 -0
- package/dist/tools/deleteClass.js +26 -0
- package/dist/tools/deleteEvent.js +26 -0
- package/dist/tools/deleteLabLink.js +26 -0
- package/dist/tools/deletePost.js +26 -0
- package/dist/tools/deleteShopProduct.js +23 -0
- package/dist/tools/demoteAdmin.js +26 -0
- package/dist/tools/getEarnings.js +28 -0
- package/dist/tools/getLabSettings.js +23 -0
- package/dist/tools/getShopSales.js +35 -0
- package/dist/tools/getStats.js +23 -0
- package/dist/tools/kickMember.js +29 -0
- package/dist/tools/listAdmins.js +23 -0
- package/dist/tools/listCategories.js +29 -0
- package/dist/tools/listChannelSubscribers.js +35 -0
- package/dist/tools/listClasses.js +23 -0
- package/dist/tools/listComments.js +31 -0
- package/dist/tools/listEvents.js +33 -0
- package/dist/tools/listInvitations.js +23 -0
- package/dist/tools/listLabLinks.js +23 -0
- package/dist/tools/listLabs.js +32 -0
- package/dist/tools/listLevels.js +23 -0
- package/dist/tools/listMembers.js +49 -0
- package/dist/tools/listNewsletterEditions.js +18 -0
- package/dist/tools/listNewsletterSubscribers.js +31 -0
- package/dist/tools/listPlugins.js +23 -0
- package/dist/tools/listPodcastEpisodes.js +31 -0
- package/dist/tools/listPodcastShows.js +18 -0
- package/dist/tools/listPodcastSubscribers.js +26 -0
- package/dist/tools/listPosts.js +49 -0
- package/dist/tools/listShops.js +28 -0
- package/dist/tools/newsletterDashboard.js +18 -0
- package/dist/tools/pinPost.js +31 -0
- package/dist/tools/promoteAdmin.js +26 -0
- package/dist/tools/publishPodcastEpisode.js +31 -0
- package/dist/tools/rejectMember.js +29 -0
- package/dist/tools/revokeInvitation.js +26 -0
- package/dist/tools/searchMembers.js +33 -0
- package/dist/tools/sendDm.js +35 -0
- package/dist/tools/sendInvitation.js +34 -0
- package/dist/tools/sendNewsletterEdition.js +23 -0
- package/dist/tools/setMetaPixel.js +34 -0
- package/dist/tools/setWelcomeDm.js +38 -0
- package/dist/tools/togglePlugin.js +27 -0
- package/dist/tools/unbanMember.js +26 -0
- package/dist/tools/unpublishPodcastEpisode.js +31 -0
- package/dist/tools/updateCategory.js +38 -0
- package/dist/tools/updateClass.js +42 -0
- package/dist/tools/updateEvent.js +44 -0
- package/dist/tools/updateLabLink.js +34 -0
- package/dist/tools/updateLabSettings.js +46 -0
- package/dist/tools/updateLevel.js +34 -0
- package/dist/tools/updatePodcastEpisode.js +40 -0
- package/dist/tools/updatePost.js +36 -0
- package/dist/tools/updateShopProduct.js +46 -0
- package/dist/tools/updateSlug.js +29 -0
- package/package.json +29 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const deleteCategoryTool = {
|
|
4
|
+
name: 'delete_category',
|
|
5
|
+
description: "Supprime une categorie du Lab. IMPORTANT : les posts existants perdent la reference. Demander confirmation.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
category_id: { type: 'number' },
|
|
11
|
+
},
|
|
12
|
+
required: ['lab', 'category_id'],
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
},
|
|
15
|
+
zodSchema: z.object({ lab: z.string(), category_id: z.number().int().positive() }),
|
|
16
|
+
async handler(args) {
|
|
17
|
+
const parsed = this.zodSchema.parse(args);
|
|
18
|
+
try {
|
|
19
|
+
const { data } = await http.delete(`/mcp/labs/${encodeURIComponent(parsed.lab)}/categories/${parsed.category_id}`);
|
|
20
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const deleteClassTool = {
|
|
4
|
+
name: 'delete_class',
|
|
5
|
+
description: "Supprime une classe/cours du Lab. IMPORTANT : action destructive, demander confirmation avant d'invoquer.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
class_id: { type: 'number', description: "Id de la classe (list_classes data[].id)" },
|
|
11
|
+
},
|
|
12
|
+
required: ['lab', 'class_id'],
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
},
|
|
15
|
+
zodSchema: z.object({ lab: z.string(), class_id: z.number().int().positive() }),
|
|
16
|
+
async handler(args) {
|
|
17
|
+
const parsed = this.zodSchema.parse(args);
|
|
18
|
+
try {
|
|
19
|
+
const { data } = await http.delete(`/mcp/labs/${encodeURIComponent(parsed.lab)}/classes/${parsed.class_id}`);
|
|
20
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const deleteEventTool = {
|
|
4
|
+
name: 'delete_event',
|
|
5
|
+
description: "Supprime un evenement du Lab. IMPORTANT : demander confirmation user avant d'invoquer.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
event_id: { type: 'number', description: "Id (list_events data[].id)" },
|
|
11
|
+
},
|
|
12
|
+
required: ['lab', 'event_id'],
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
},
|
|
15
|
+
zodSchema: z.object({ lab: z.string(), event_id: z.number().int().positive() }),
|
|
16
|
+
async handler(args) {
|
|
17
|
+
const parsed = this.zodSchema.parse(args);
|
|
18
|
+
try {
|
|
19
|
+
const { data } = await http.delete(`/mcp/labs/${encodeURIComponent(parsed.lab)}/events/${parsed.event_id}`);
|
|
20
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const deleteLabLinkTool = {
|
|
4
|
+
name: 'delete_lab_link',
|
|
5
|
+
description: "Supprime un lien sidebar du Lab.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
link_id: { type: 'number' },
|
|
11
|
+
},
|
|
12
|
+
required: ['lab', 'link_id'],
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
},
|
|
15
|
+
zodSchema: z.object({ lab: z.string(), link_id: z.number().int().positive() }),
|
|
16
|
+
async handler(args) {
|
|
17
|
+
const parsed = this.zodSchema.parse(args);
|
|
18
|
+
try {
|
|
19
|
+
const { data } = await http.delete(`/mcp/labs/${encodeURIComponent(parsed.lab)}/links/${parsed.link_id}`);
|
|
20
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const deletePostTool = {
|
|
4
|
+
name: 'delete_post',
|
|
5
|
+
description: "Supprime un post (soft-delete). IMPORTANT : action destructive, demander confirmation avant d'invoquer.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
post_id: { type: 'number' },
|
|
11
|
+
},
|
|
12
|
+
required: ['lab', 'post_id'],
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
},
|
|
15
|
+
zodSchema: z.object({ lab: z.string(), post_id: z.number().int().positive() }),
|
|
16
|
+
async handler(args) {
|
|
17
|
+
const parsed = this.zodSchema.parse(args);
|
|
18
|
+
try {
|
|
19
|
+
const { data } = await http.delete(`/mcp/labs/${encodeURIComponent(parsed.lab)}/posts/${parsed.post_id}`);
|
|
20
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const deleteShopProductTool = {
|
|
4
|
+
name: 'delete_shop_product',
|
|
5
|
+
description: "Supprime un produit de la boutique. IMPORTANT : action destructive, demander confirmation.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: { lab: { type: 'string' }, shop_id: { type: 'number' } },
|
|
9
|
+
required: ['lab', 'shop_id'],
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
},
|
|
12
|
+
zodSchema: z.object({ lab: z.string(), shop_id: z.number().int().positive() }),
|
|
13
|
+
async handler(args) {
|
|
14
|
+
const p = this.zodSchema.parse(args);
|
|
15
|
+
try {
|
|
16
|
+
const { data } = await http.delete(`/mcp/labs/${encodeURIComponent(p.lab)}/shops/${p.shop_id}`);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const demoteAdminTool = {
|
|
4
|
+
name: 'demote_admin',
|
|
5
|
+
description: "Retire les droits admin d'un membre (type 'admin' -> 'basic'). Idempotent. Un super-admin ne peut pas etre modifie via MCP.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
member_id: { type: 'number' },
|
|
11
|
+
},
|
|
12
|
+
required: ['lab', 'member_id'],
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
},
|
|
15
|
+
zodSchema: z.object({ lab: z.string(), member_id: z.number().int().positive() }),
|
|
16
|
+
async handler(args) {
|
|
17
|
+
const parsed = this.zodSchema.parse(args);
|
|
18
|
+
try {
|
|
19
|
+
const { data } = await http.put(`/mcp/labs/${encodeURIComponent(parsed.lab)}/members/${parsed.member_id}/demote`);
|
|
20
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `get_earnings` — snapshot revenus d'un Lab (source : members_payouts).
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { http, formatApiError } from '../http.js';
|
|
6
|
+
export const getEarningsTool = {
|
|
7
|
+
name: 'get_earnings',
|
|
8
|
+
description: "Snapshot revenus d'un Lab payant. Renvoie MTD (mois en cours), mois precedent, YTD, all-time, ainsi que le nombre d'abonnes actifs. Devise EUR.",
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
lab: { type: 'string', description: 'Id ou url du Lab' },
|
|
13
|
+
},
|
|
14
|
+
required: ['lab'],
|
|
15
|
+
additionalProperties: false,
|
|
16
|
+
},
|
|
17
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
18
|
+
async handler(args) {
|
|
19
|
+
const parsed = this.zodSchema.parse(args);
|
|
20
|
+
try {
|
|
21
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/earnings`);
|
|
22
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const getLabSettingsTool = {
|
|
4
|
+
name: 'get_lab_settings',
|
|
5
|
+
description: "Renvoie les settings actuels d'un Lab : name, description, prix, essai, affiliation, images. Utile avant update_lab_settings.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: { lab: { type: 'string' } },
|
|
9
|
+
required: ['lab'],
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
},
|
|
12
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
13
|
+
async handler(args) {
|
|
14
|
+
const parsed = this.zodSchema.parse(args);
|
|
15
|
+
try {
|
|
16
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/settings`);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `get_shop_sales` — historique de ventes d'un produit boutique.
|
|
3
|
+
* shop_url s'obtient via list_shops.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { http, formatApiError } from '../http.js';
|
|
7
|
+
export const getShopSalesTool = {
|
|
8
|
+
name: 'get_shop_sales',
|
|
9
|
+
description: "Historique de ventes d'un produit boutique. shop_url s'obtient via list_shops. Renvoie chaque vente (acheteur, gross, net owner, frais) + total net.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
lab: { type: 'string', description: 'Id ou url du Lab' },
|
|
14
|
+
shop_url: { type: 'string', description: 'shop_url du produit (list_shops)' },
|
|
15
|
+
limit: { type: 'number', minimum: 1, maximum: 100, default: 20 },
|
|
16
|
+
},
|
|
17
|
+
required: ['lab', 'shop_url'],
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
},
|
|
20
|
+
zodSchema: z.object({
|
|
21
|
+
lab: z.string(),
|
|
22
|
+
shop_url: z.string(),
|
|
23
|
+
limit: z.number().int().min(1).max(100).optional(),
|
|
24
|
+
}),
|
|
25
|
+
async handler(args) {
|
|
26
|
+
const parsed = this.zodSchema.parse(args);
|
|
27
|
+
try {
|
|
28
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/shops/${encodeURIComponent(parsed.shop_url)}/sales`, { params: { limit: parsed.limit } });
|
|
29
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const getStatsTool = {
|
|
4
|
+
name: 'get_stats',
|
|
5
|
+
description: "Snapshot dashboard d'un Lab en un seul appel : membres (total/pending/approved/admins/joined 7j), contenu (posts/comments/classes/upcoming events), revenus (MTD/all-time). Tool prefere si l'user demande 'ou j'en suis avec mon Lab' ou 'comment ca va'.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: { lab: { type: 'string' } },
|
|
9
|
+
required: ['lab'],
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
},
|
|
12
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
13
|
+
async handler(args) {
|
|
14
|
+
const parsed = this.zodSchema.parse(args);
|
|
15
|
+
try {
|
|
16
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/stats`);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `kick_member` — retire un membre du Lab (soft-delete).
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { http, formatApiError } from '../http.js';
|
|
6
|
+
export const kickMemberTool = {
|
|
7
|
+
name: 'kick_member',
|
|
8
|
+
description: "Retire un membre du Lab (soft-delete). L'owner ne peut pas se kicker lui-meme. IMPORTANT : action destructive, demande confirmation user avant d'invoquer.",
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
lab: { type: 'string', description: 'Id ou url du Lab' },
|
|
13
|
+
member_id: { type: 'number', description: 'Id du membre' },
|
|
14
|
+
},
|
|
15
|
+
required: ['lab', 'member_id'],
|
|
16
|
+
additionalProperties: false,
|
|
17
|
+
},
|
|
18
|
+
zodSchema: z.object({ lab: z.string(), member_id: z.number().int().positive() }),
|
|
19
|
+
async handler(args) {
|
|
20
|
+
const parsed = this.zodSchema.parse(args);
|
|
21
|
+
try {
|
|
22
|
+
const { data } = await http.delete(`/mcp/labs/${encodeURIComponent(parsed.lab)}/members/${parsed.member_id}`);
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const listAdminsTool = {
|
|
4
|
+
name: 'list_admins',
|
|
5
|
+
description: "Liste les admins d'un Lab (membres promus + owner). Utile pour voir qui a des permissions elevees.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: { lab: { type: 'string' } },
|
|
9
|
+
required: ['lab'],
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
},
|
|
12
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
13
|
+
async handler(args) {
|
|
14
|
+
const parsed = this.zodSchema.parse(args);
|
|
15
|
+
try {
|
|
16
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/admins`);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `list_categories` — categories d'un Lab. A appeler AVANT create_post
|
|
3
|
+
* pour obtenir un category_id valide.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { http, formatApiError } from '../http.js';
|
|
7
|
+
export const listCategoriesTool = {
|
|
8
|
+
name: 'list_categories',
|
|
9
|
+
description: "Liste les categories d'un Lab. A appeler AVANT create_post pour savoir quel category_id utiliser.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
lab: { type: 'string', description: 'Id ou url du Lab' },
|
|
14
|
+
},
|
|
15
|
+
required: ['lab'],
|
|
16
|
+
additionalProperties: false,
|
|
17
|
+
},
|
|
18
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
19
|
+
async handler(args) {
|
|
20
|
+
const parsed = this.zodSchema.parse(args);
|
|
21
|
+
try {
|
|
22
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/categories`);
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const listChannelSubscribersTool = {
|
|
4
|
+
name: 'list_channel_subscribers',
|
|
5
|
+
description: "Liste les abonnes actuels aux canaux payants (Telegram / Discord / WhatsApp) du Lab. Provider filtrable, status filtrable (active/pending_kick/kicked).",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
provider: { type: 'string', enum: ['telegram', 'discord', 'whatsapp'] },
|
|
11
|
+
status: { type: 'string', enum: ['active', 'pending_kick', 'kicked'] },
|
|
12
|
+
limit: { type: 'number', minimum: 1, maximum: 200 },
|
|
13
|
+
},
|
|
14
|
+
required: ['lab'],
|
|
15
|
+
additionalProperties: false,
|
|
16
|
+
},
|
|
17
|
+
zodSchema: z.object({
|
|
18
|
+
lab: z.string(),
|
|
19
|
+
provider: z.enum(['telegram', 'discord', 'whatsapp']).optional(),
|
|
20
|
+
status: z.enum(['active', 'pending_kick', 'kicked']).optional(),
|
|
21
|
+
limit: z.number().int().min(1).max(200).optional(),
|
|
22
|
+
}),
|
|
23
|
+
async handler(args) {
|
|
24
|
+
const p = this.zodSchema.parse(args);
|
|
25
|
+
try {
|
|
26
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(p.lab)}/channel-subscribers`, {
|
|
27
|
+
params: { provider: p.provider, status: p.status, limit: p.limit },
|
|
28
|
+
});
|
|
29
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const listClassesTool = {
|
|
4
|
+
name: 'list_classes',
|
|
5
|
+
description: "Liste les classes/cours d'un Lab.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: { lab: { type: 'string', description: 'Id ou url du Lab' } },
|
|
9
|
+
required: ['lab'],
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
},
|
|
12
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
13
|
+
async handler(args) {
|
|
14
|
+
const parsed = this.zodSchema.parse(args);
|
|
15
|
+
try {
|
|
16
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/classes`);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const listCommentsTool = {
|
|
4
|
+
name: 'list_comments',
|
|
5
|
+
description: "Liste les commentaires d'un post (chronologique, plus vieux d'abord).",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
post_id: { type: 'number' },
|
|
11
|
+
limit: { type: 'number', minimum: 1, maximum: 100, default: 30 },
|
|
12
|
+
},
|
|
13
|
+
required: ['lab', 'post_id'],
|
|
14
|
+
additionalProperties: false,
|
|
15
|
+
},
|
|
16
|
+
zodSchema: z.object({
|
|
17
|
+
lab: z.string(),
|
|
18
|
+
post_id: z.number().int().positive(),
|
|
19
|
+
limit: z.number().int().min(1).max(100).optional(),
|
|
20
|
+
}),
|
|
21
|
+
async handler(args) {
|
|
22
|
+
const parsed = this.zodSchema.parse(args);
|
|
23
|
+
try {
|
|
24
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/posts/${parsed.post_id}/comments`, { params: { limit: parsed.limit } });
|
|
25
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const listEventsTool = {
|
|
4
|
+
name: 'list_events',
|
|
5
|
+
description: "Liste les evenements d'un Lab. upcoming_only=true pour ne renvoyer que les evenements futurs.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
lab: { type: 'string' },
|
|
10
|
+
upcoming_only: { type: 'boolean', default: false },
|
|
11
|
+
limit: { type: 'number', minimum: 1, maximum: 100, default: 50 },
|
|
12
|
+
},
|
|
13
|
+
required: ['lab'],
|
|
14
|
+
additionalProperties: false,
|
|
15
|
+
},
|
|
16
|
+
zodSchema: z.object({
|
|
17
|
+
lab: z.string(),
|
|
18
|
+
upcoming_only: z.boolean().optional(),
|
|
19
|
+
limit: z.number().int().min(1).max(100).optional(),
|
|
20
|
+
}),
|
|
21
|
+
async handler(args) {
|
|
22
|
+
const parsed = this.zodSchema.parse(args);
|
|
23
|
+
try {
|
|
24
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/events`, {
|
|
25
|
+
params: { upcoming_only: parsed.upcoming_only ? '1' : undefined, limit: parsed.limit },
|
|
26
|
+
});
|
|
27
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const listInvitationsTool = {
|
|
4
|
+
name: 'list_invitations',
|
|
5
|
+
description: "Liste les invitations en cours (envoyees mais pas encore acceptees) d'un Lab.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: { lab: { type: 'string' } },
|
|
9
|
+
required: ['lab'],
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
},
|
|
12
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
13
|
+
async handler(args) {
|
|
14
|
+
const parsed = this.zodSchema.parse(args);
|
|
15
|
+
try {
|
|
16
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/invitations`);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const listLabLinksTool = {
|
|
4
|
+
name: 'list_lab_links',
|
|
5
|
+
description: "Liste les liens sidebar custom du Lab (max 5). Trie par position.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: { lab: { type: 'string' } },
|
|
9
|
+
required: ['lab'],
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
},
|
|
12
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
13
|
+
async handler(args) {
|
|
14
|
+
const parsed = this.zodSchema.parse(args);
|
|
15
|
+
try {
|
|
16
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/links`);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `list_labs` — liste les Labs pilotables par le token courant.
|
|
3
|
+
* Correspond a GET /api/v1/mcp/labs cote Laravel.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { http, formatApiError } from '../http.js';
|
|
7
|
+
export const listLabsTool = {
|
|
8
|
+
name: 'list_labs',
|
|
9
|
+
description: 'Liste les Labs (communautes) accessibles avec ce token MCP. Renvoie id, url, nom, description, nombre de membres et prix mensuel.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {},
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
},
|
|
15
|
+
zodSchema: z.object({}),
|
|
16
|
+
async handler(_args) {
|
|
17
|
+
try {
|
|
18
|
+
const { data } = await http.get('/mcp/labs');
|
|
19
|
+
return {
|
|
20
|
+
content: [
|
|
21
|
+
{ type: 'text', text: JSON.stringify(data.data ?? [], null, 2) },
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return {
|
|
27
|
+
isError: true,
|
|
28
|
+
content: [{ type: 'text', text: formatApiError(err) }],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { http, formatApiError } from '../http.js';
|
|
3
|
+
export const listLevelsTool = {
|
|
4
|
+
name: 'list_levels',
|
|
5
|
+
description: "Liste les niveaux XP du Lab (nom + seuil de points requis).",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: { lab: { type: 'string' } },
|
|
9
|
+
required: ['lab'],
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
},
|
|
12
|
+
zodSchema: z.object({ lab: z.string() }),
|
|
13
|
+
async handler(args) {
|
|
14
|
+
const parsed = this.zodSchema.parse(args);
|
|
15
|
+
try {
|
|
16
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/levels`);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|