@connect-xlab/mcp-server 0.1.0 → 0.1.2
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 +18 -0
- package/dist/tools/createLinkInBioBlock.js +55 -0
- package/dist/tools/deleteLinkInBioBlock.js +31 -0
- package/dist/tools/getLinkInBio.js +29 -0
- package/dist/tools/getStripeConnectStatus.js +32 -0
- package/dist/tools/reorderLinkInBioBlocks.js +37 -0
- package/dist/tools/toggleLinkInBioPublish.js +29 -0
- package/dist/tools/updateLinkInBio.js +61 -0
- package/dist/tools/updateLinkInBioBlock.js +44 -0
- package/package.json +24 -5
package/dist/index.js
CHANGED
|
@@ -83,6 +83,14 @@ import { createPodcastEpisodeTool } from './tools/createPodcastEpisode.js';
|
|
|
83
83
|
import { updatePodcastEpisodeTool } from './tools/updatePodcastEpisode.js';
|
|
84
84
|
import { publishPodcastEpisodeTool } from './tools/publishPodcastEpisode.js';
|
|
85
85
|
import { unpublishPodcastEpisodeTool } from './tools/unpublishPodcastEpisode.js';
|
|
86
|
+
import { getStripeConnectStatusTool } from './tools/getStripeConnectStatus.js';
|
|
87
|
+
import { getLinkInBioTool } from './tools/getLinkInBio.js';
|
|
88
|
+
import { updateLinkInBioTool } from './tools/updateLinkInBio.js';
|
|
89
|
+
import { toggleLinkInBioPublishTool } from './tools/toggleLinkInBioPublish.js';
|
|
90
|
+
import { createLinkInBioBlockTool } from './tools/createLinkInBioBlock.js';
|
|
91
|
+
import { updateLinkInBioBlockTool } from './tools/updateLinkInBioBlock.js';
|
|
92
|
+
import { deleteLinkInBioBlockTool } from './tools/deleteLinkInBioBlock.js';
|
|
93
|
+
import { reorderLinkInBioBlocksTool } from './tools/reorderLinkInBioBlocks.js';
|
|
86
94
|
const tools = [
|
|
87
95
|
listLabsTool,
|
|
88
96
|
listMembersTool,
|
|
@@ -152,6 +160,16 @@ const tools = [
|
|
|
152
160
|
updatePodcastEpisodeTool,
|
|
153
161
|
publishPodcastEpisodeTool,
|
|
154
162
|
unpublishPodcastEpisodeTool,
|
|
163
|
+
// Stripe Connect
|
|
164
|
+
getStripeConnectStatusTool,
|
|
165
|
+
// Link in Bio
|
|
166
|
+
getLinkInBioTool,
|
|
167
|
+
updateLinkInBioTool,
|
|
168
|
+
toggleLinkInBioPublishTool,
|
|
169
|
+
createLinkInBioBlockTool,
|
|
170
|
+
updateLinkInBioBlockTool,
|
|
171
|
+
deleteLinkInBioBlockTool,
|
|
172
|
+
reorderLinkInBioBlocksTool,
|
|
155
173
|
];
|
|
156
174
|
const server = new Server({ name: 'connectxlab', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
157
175
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `create_link_in_bio_block` — ajoute un bloc a la page :
|
|
3
|
+
* - kind=external : lien URL libre (title + action_url obligatoires)
|
|
4
|
+
* - kind=product : reference une offre du Lab (sellable_type + sellable_id)
|
|
5
|
+
* - kind=lab : reference un autre Lab (sellable_type=lab + sellable_id)
|
|
6
|
+
*
|
|
7
|
+
* Position ajoutee automatiquement en fin de liste.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { http, formatApiError } from '../http.js';
|
|
11
|
+
const SELLABLE_TYPES = ['agent_ai', 'group_shop', 'newsletter', 'podcast_show', 'lab_channel'];
|
|
12
|
+
export const createLinkInBioBlockTool = {
|
|
13
|
+
name: 'create_link_in_bio_block',
|
|
14
|
+
description: "Ajoute un bloc a la page Link in Bio. Trois types :\n" +
|
|
15
|
+
"- kind=external : lien URL libre (title + action_url requis)\n" +
|
|
16
|
+
"- kind=product : reference une offre du Lab (sellable_type + sellable_id requis, sellable_type dans agent_ai/group_shop/newsletter/podcast_show/lab_channel)\n" +
|
|
17
|
+
"- kind=lab : reference un autre Lab de l'owner (sellable_id requis)\n" +
|
|
18
|
+
"Champs optionnels : subtitle, image_url. Position en fin de liste (utiliser reorder pour changer).",
|
|
19
|
+
inputSchema: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
properties: {
|
|
22
|
+
lab: { type: 'string' },
|
|
23
|
+
kind: { type: 'string', enum: ['external', 'product', 'lab'] },
|
|
24
|
+
title: { type: 'string', maxLength: 60 },
|
|
25
|
+
subtitle: { type: 'string', maxLength: 120 },
|
|
26
|
+
action_url: { type: 'string' },
|
|
27
|
+
image_url: { type: 'string' },
|
|
28
|
+
sellable_type: { type: 'string', enum: [...SELLABLE_TYPES] },
|
|
29
|
+
sellable_id: { type: 'number', minimum: 1 },
|
|
30
|
+
},
|
|
31
|
+
required: ['lab', 'kind'],
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
},
|
|
34
|
+
zodSchema: z.object({
|
|
35
|
+
lab: z.string(),
|
|
36
|
+
kind: z.enum(['external', 'product', 'lab']),
|
|
37
|
+
title: z.string().max(60).optional(),
|
|
38
|
+
subtitle: z.string().max(120).optional(),
|
|
39
|
+
action_url: z.string().optional(),
|
|
40
|
+
image_url: z.string().optional(),
|
|
41
|
+
sellable_type: z.enum(SELLABLE_TYPES).optional(),
|
|
42
|
+
sellable_id: z.number().int().positive().optional(),
|
|
43
|
+
}),
|
|
44
|
+
async handler(args) {
|
|
45
|
+
const parsed = this.zodSchema.parse(args);
|
|
46
|
+
const { lab, ...body } = parsed;
|
|
47
|
+
try {
|
|
48
|
+
const { data } = await http.post(`/mcp/labs/${encodeURIComponent(lab)}/link-in-bio/blocks`, body);
|
|
49
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `delete_link_in_bio_block` — supprime definitivement un bloc de la
|
|
3
|
+
* page. Pour masquer sans supprimer, utiliser plutot update_link_in_bio_block
|
|
4
|
+
* avec is_active=false.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { http, formatApiError } from '../http.js';
|
|
8
|
+
export const deleteLinkInBioBlockTool = {
|
|
9
|
+
name: 'delete_link_in_bio_block',
|
|
10
|
+
description: "Supprime definitivement un bloc de la page Link in Bio. Pour un masquage temporaire, prefere update_link_in_bio_block avec is_active=false.",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
lab: { type: 'string' },
|
|
15
|
+
block_id: { type: 'number', minimum: 1 },
|
|
16
|
+
},
|
|
17
|
+
required: ['lab', 'block_id'],
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
},
|
|
20
|
+
zodSchema: z.object({ lab: z.string(), block_id: z.number().int().positive() }),
|
|
21
|
+
async handler(args) {
|
|
22
|
+
const parsed = this.zodSchema.parse(args);
|
|
23
|
+
try {
|
|
24
|
+
const { data } = await http.delete(`/mcp/labs/${encodeURIComponent(parsed.lab)}/link-in-bio/blocks/${parsed.block_id}`);
|
|
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,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `get_link_in_bio` — recupere la page Link in Bio du Lab (settings +
|
|
3
|
+
* blocs). Renvoie null dans `page` si aucune page n'a encore ete creee.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { http, formatApiError } from '../http.js';
|
|
7
|
+
export const getLinkInBioTool = {
|
|
8
|
+
name: 'get_link_in_bio',
|
|
9
|
+
description: "Recupere la page Link in Bio d'un Lab : slug, published, display_name, bio, theme, layout (avatar/banner/portrait), desktop_layout (split/centered), avatar/banner/portrait URLs, socials, et la liste ordonnee des blocs (kind = external/product/lab).",
|
|
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)}/link-in-bio`);
|
|
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,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `get_stripe_connect_status` — introspecte le compte Stripe Connect de
|
|
3
|
+
* l'owner du Lab. Utile pour verifier si l'owner peut vendre (charges_enabled)
|
|
4
|
+
* ou s'il doit finir sa configuration.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { http, formatApiError } from '../http.js';
|
|
8
|
+
export const getStripeConnectStatusTool = {
|
|
9
|
+
name: 'get_stripe_connect_status',
|
|
10
|
+
description: "Etat du compte Stripe Connect de l'owner du Lab (encaissement des ventes). Renvoie can_sell (bool), charges_enabled, has_account, requirements_due[]. Passer refresh=true force un rafraichissement depuis Stripe (utile juste apres onboarding). Le super admin plateforme retourne is_platform_owner=true (encaissement direct, pas de Connect).",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
lab: { type: 'string', description: 'Id ou url du Lab' },
|
|
15
|
+
refresh: { type: 'boolean', description: 'Force un round-trip Stripe pour synchroniser (defaut false)' },
|
|
16
|
+
},
|
|
17
|
+
required: ['lab'],
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
},
|
|
20
|
+
zodSchema: z.object({ lab: z.string(), refresh: z.boolean().optional() }),
|
|
21
|
+
async handler(args) {
|
|
22
|
+
const parsed = this.zodSchema.parse(args);
|
|
23
|
+
try {
|
|
24
|
+
const qs = parsed.refresh ? '?refresh=1' : '';
|
|
25
|
+
const { data } = await http.get(`/mcp/labs/${encodeURIComponent(parsed.lab)}/payments/stripe-status${qs}`);
|
|
26
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `reorder_link_in_bio_blocks` — reordonne les blocs. Passer la liste
|
|
3
|
+
* complete des block_ids dans l'ordre voulu (top → bottom).
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { http, formatApiError } from '../http.js';
|
|
7
|
+
export const reorderLinkInBioBlocksTool = {
|
|
8
|
+
name: 'reorder_link_in_bio_blocks',
|
|
9
|
+
description: "Reordonne les blocs de la page Link in Bio. Passer la liste complete des block_ids dans l'ordre souhaite (premier = top de la page). Le back rejette si la liste ne matche pas exactement les blocs existants.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
lab: { type: 'string' },
|
|
14
|
+
block_ids: {
|
|
15
|
+
type: 'array',
|
|
16
|
+
items: { type: 'number', minimum: 1 },
|
|
17
|
+
minItems: 1,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
required: ['lab', 'block_ids'],
|
|
21
|
+
additionalProperties: false,
|
|
22
|
+
},
|
|
23
|
+
zodSchema: z.object({
|
|
24
|
+
lab: z.string(),
|
|
25
|
+
block_ids: z.array(z.number().int().positive()).min(1),
|
|
26
|
+
}),
|
|
27
|
+
async handler(args) {
|
|
28
|
+
const parsed = this.zodSchema.parse(args);
|
|
29
|
+
try {
|
|
30
|
+
const { data } = await http.put(`/mcp/labs/${encodeURIComponent(parsed.lab)}/link-in-bio/blocks/reorder`, { block_ids: parsed.block_ids });
|
|
31
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `toggle_link_in_bio_publish` — publie / depublie la page. Une page
|
|
3
|
+
* depubliee reste editable mais n'est plus accessible via son slug public.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { http, formatApiError } from '../http.js';
|
|
7
|
+
export const toggleLinkInBioPublishTool = {
|
|
8
|
+
name: 'toggle_link_in_bio_publish',
|
|
9
|
+
description: "Publie ou depublie la page Link in Bio. Le back bascule automatiquement l'etat (pas besoin de passer publish=true/false). Retourne l'etat resultant.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
lab: { type: 'string' },
|
|
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.post(`/mcp/labs/${encodeURIComponent(parsed.lab)}/link-in-bio/publish`, {});
|
|
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,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `update_link_in_bio` — upsert des meta de la page (slug, display_name,
|
|
3
|
+
* bio, theme, layout, socials, URLs de photos). Si la page n'existe pas
|
|
4
|
+
* encore, elle est creee. Tous les champs sont optionnels : on ne modifie
|
|
5
|
+
* que ce qui est fourni.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { http, formatApiError } from '../http.js';
|
|
9
|
+
const SOCIAL_KEYS = ['instagram', 'tiktok', 'youtube', 'x', 'linkedin', 'facebook', 'whatsapp', 'telegram'];
|
|
10
|
+
export const updateLinkInBioTool = {
|
|
11
|
+
name: 'update_link_in_bio',
|
|
12
|
+
description: "Upsert de la page Link in Bio (meta). Cree la page si absente. Champs optionnels : slug, display_name, bio, theme (violet/blue/black/pastel), accent_color (#RRGGBB), photo_layout (avatar/banner/portrait), desktop_layout (split/centered), avatar_url, banner_url, portrait_url, socials{instagram, tiktok, youtube, x, linkedin, facebook, whatsapp, telegram}. Attention : changer le slug a un cooldown de 30 jours.",
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
lab: { type: 'string' },
|
|
17
|
+
slug: { type: 'string', maxLength: 40 },
|
|
18
|
+
display_name: { type: 'string', maxLength: 60 },
|
|
19
|
+
bio: { type: 'string', maxLength: 300 },
|
|
20
|
+
theme: { type: 'string', enum: ['violet', 'blue', 'black', 'pastel'] },
|
|
21
|
+
accent_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$' },
|
|
22
|
+
photo_layout: { type: 'string', enum: ['avatar', 'banner', 'portrait'] },
|
|
23
|
+
desktop_layout: { type: 'string', enum: ['split', 'centered'] },
|
|
24
|
+
avatar_url: { type: 'string' },
|
|
25
|
+
banner_url: { type: 'string' },
|
|
26
|
+
portrait_url: { type: 'string' },
|
|
27
|
+
socials: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: Object.fromEntries(SOCIAL_KEYS.map((k) => [k, { type: 'string' }])),
|
|
30
|
+
additionalProperties: false,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
required: ['lab'],
|
|
34
|
+
additionalProperties: false,
|
|
35
|
+
},
|
|
36
|
+
zodSchema: z.object({
|
|
37
|
+
lab: z.string(),
|
|
38
|
+
slug: z.string().max(40).optional(),
|
|
39
|
+
display_name: z.string().max(60).optional(),
|
|
40
|
+
bio: z.string().max(300).optional(),
|
|
41
|
+
theme: z.enum(['violet', 'blue', 'black', 'pastel']).optional(),
|
|
42
|
+
accent_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),
|
|
43
|
+
photo_layout: z.enum(['avatar', 'banner', 'portrait']).optional(),
|
|
44
|
+
desktop_layout: z.enum(['split', 'centered']).optional(),
|
|
45
|
+
avatar_url: z.string().optional(),
|
|
46
|
+
banner_url: z.string().optional(),
|
|
47
|
+
portrait_url: z.string().optional(),
|
|
48
|
+
socials: z.record(z.string()).optional(),
|
|
49
|
+
}),
|
|
50
|
+
async handler(args) {
|
|
51
|
+
const parsed = this.zodSchema.parse(args);
|
|
52
|
+
const { lab, ...body } = parsed;
|
|
53
|
+
try {
|
|
54
|
+
const { data } = await http.post(`/mcp/labs/${encodeURIComponent(lab)}/link-in-bio`, body);
|
|
55
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool `update_link_in_bio_block` — modifie un bloc existant. Tous les champs
|
|
3
|
+
* sont optionnels : seuls ceux fournis sont modifies.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { http, formatApiError } from '../http.js';
|
|
7
|
+
export const updateLinkInBioBlockTool = {
|
|
8
|
+
name: 'update_link_in_bio_block',
|
|
9
|
+
description: "Modifie un bloc existant (identifie par block_id, entier renvoye par get_link_in_bio ou create_link_in_bio_block). Champs modifiables : title, subtitle, action_url, image_url, is_active (afficher/masquer sans supprimer).",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
lab: { type: 'string' },
|
|
14
|
+
block_id: { type: 'number', minimum: 1 },
|
|
15
|
+
title: { type: 'string', maxLength: 60 },
|
|
16
|
+
subtitle: { type: 'string', maxLength: 120 },
|
|
17
|
+
action_url: { type: 'string' },
|
|
18
|
+
image_url: { type: 'string' },
|
|
19
|
+
is_active: { type: 'boolean' },
|
|
20
|
+
},
|
|
21
|
+
required: ['lab', 'block_id'],
|
|
22
|
+
additionalProperties: false,
|
|
23
|
+
},
|
|
24
|
+
zodSchema: z.object({
|
|
25
|
+
lab: z.string(),
|
|
26
|
+
block_id: z.number().int().positive(),
|
|
27
|
+
title: z.string().max(60).optional(),
|
|
28
|
+
subtitle: z.string().max(120).optional(),
|
|
29
|
+
action_url: z.string().optional(),
|
|
30
|
+
image_url: z.string().optional(),
|
|
31
|
+
is_active: z.boolean().optional(),
|
|
32
|
+
}),
|
|
33
|
+
async handler(args) {
|
|
34
|
+
const parsed = this.zodSchema.parse(args);
|
|
35
|
+
const { lab, block_id, ...body } = parsed;
|
|
36
|
+
try {
|
|
37
|
+
const { data } = await http.put(`/mcp/labs/${encodeURIComponent(lab)}/link-in-bio/blocks/${block_id}`, body);
|
|
38
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return { isError: true, content: [{ type: 'text', text: formatApiError(err) }] };
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
};
|
package/package.json
CHANGED
|
@@ -1,19 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@connect-xlab/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Serveur MCP pour piloter ton Lab ConnectXLab depuis Claude Desktop / Cursor / n'importe quel client MCP.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
|
|
7
|
+
"bin": {
|
|
8
|
+
"connectxlab-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/Elmzelji/Xlab-Mcp.git"
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://github.com/Elmzelji/Xlab-Mcp#readme",
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/Elmzelji/Xlab-Mcp/issues"
|
|
20
|
+
},
|
|
9
21
|
"scripts": {
|
|
10
22
|
"build": "tsc",
|
|
11
23
|
"dev": "tsx watch src/index.ts",
|
|
12
24
|
"start": "node dist/index.js",
|
|
13
25
|
"prepublishOnly": "npm run build"
|
|
14
26
|
},
|
|
15
|
-
"engines": {
|
|
16
|
-
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"mcp",
|
|
32
|
+
"model-context-protocol",
|
|
33
|
+
"connectxlab",
|
|
34
|
+
"claude"
|
|
35
|
+
],
|
|
17
36
|
"author": "ConnectXLab",
|
|
18
37
|
"license": "MIT",
|
|
19
38
|
"dependencies": {
|