Blogger MCP Server

by niyonabil
Verified
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { ServerConfig, BloggerBlog, BloggerPost, BloggerLabel } from './types'; import { BloggerService } from './bloggerService'; import { z } from 'zod'; /** * Initialise le serveur MCP avec tous les outils pour Blogger * @param bloggerService Service Blogger pour interagir avec l'API * @param config Configuration du serveur * @returns Instance du serveur MCP */ export function initMCPServer(bloggerService: BloggerService, config: ServerConfig): McpServer { // Créer une nouvelle instance du serveur MCP avec les informations du serveur const server = new McpServer({ name: "Blogger MCP Server", version: "1.0.1", vendor: "mcproadev" }); // Outil pour lister les blogs server.tool('list_blogs', 'Liste tous les blogs accessibles', {}, async (_args, _extra) => { try { const blogs = await bloggerService.listBlogs(); return { content: [ { type: 'text', text: JSON.stringify({ blogs }, null, 2) } ] }; } catch (error) { console.error('Erreur lors de la récupération des blogs:', error); return { content: [ { type: 'text', text: `Erreur lors de la récupération des blogs: ${error}` } ], isError: true }; } } ); // Outil pour obtenir les détails d'un blog server.tool('get_blog', 'Récupère les détails d\'un blog spécifique', { blogId: z.string().describe('ID du blog') }, async (args, _extra) => { try { const blog = await bloggerService.getBlog(args.blogId); return { content: [ { type: 'text', text: JSON.stringify({ blog }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la récupération du blog ${args.blogId}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la récupération du blog: ${error}` } ], isError: true }; } } ); // Outil pour créer un nouveau blog (non supporté par l'API Blogger) server.tool('create_blog', 'Crée un nouveau blog (non supporté par l\'API Blogger)', { name: z.string().describe('Nom du blog'), description: z.string().optional().describe('Description du blog') }, async (_args, _extra) => { return { content: [ { type: 'text', text: 'La création de blogs n\'est pas supportée par l\'API Blogger. Veuillez créer un blog via l\'interface web de Blogger.' } ], isError: true }; } ); // Outil pour lister les posts d'un blog server.tool('list_posts', 'Liste tous les posts d\'un blog', { blogId: z.string().describe('ID du blog'), maxResults: z.number().optional().describe('Nombre maximum de résultats à retourner') }, async (args, _extra) => { try { const posts = await bloggerService.listPosts(args.blogId, args.maxResults); return { content: [ { type: 'text', text: JSON.stringify({ posts }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la récupération des posts du blog ${args.blogId}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la récupération des posts: ${error}` } ], isError: true }; } } ); // Outil pour rechercher des posts server.tool('search_posts', 'Recherche des posts dans un blog', { blogId: z.string().describe('ID du blog'), query: z.string().describe('Terme de recherche'), maxResults: z.number().optional().describe('Nombre maximum de résultats à retourner') }, async (args, _extra) => { try { const posts = await bloggerService.searchPosts(args.blogId, args.query, args.maxResults); return { content: [ { type: 'text', text: JSON.stringify({ posts }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la recherche de posts dans le blog ${args.blogId}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la recherche de posts: ${error}` } ], isError: true }; } } ); // Outil pour obtenir les détails d'un post server.tool('get_post', 'Récupère les détails d\'un post spécifique', { blogId: z.string().describe('ID du blog'), postId: z.string().describe('ID du post') }, async (args, _extra) => { try { const post = await bloggerService.getPost(args.blogId, args.postId); return { content: [ { type: 'text', text: JSON.stringify({ post }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la récupération du post ${args.postId}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la récupération du post: ${error}` } ], isError: true }; } } ); // Outil pour créer un nouveau post server.tool('create_post', 'Crée un nouveau post dans un blog', { blogId: z.string().describe('ID du blog'), title: z.string().describe('Titre du post'), content: z.string().describe('Contenu du post'), labels: z.array(z.string()).optional().describe('Labels à associer au post') }, async (args, _extra) => { try { const post = await bloggerService.createPost(args.blogId, { title: args.title, content: args.content, labels: args.labels }); return { content: [ { type: 'text', text: JSON.stringify({ post }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la création d'un post dans le blog ${args.blogId}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la création du post: ${error}` } ], isError: true }; } } ); // Outil pour mettre à jour un post existant server.tool('update_post', 'Met à jour un post existant', { blogId: z.string().describe('ID du blog'), postId: z.string().describe('ID du post'), title: z.string().optional().describe('Nouveau titre du post'), content: z.string().optional().describe('Nouveau contenu du post'), labels: z.array(z.string()).optional().describe('Nouveaux labels à associer au post') }, async (args, _extra) => { try { const post = await bloggerService.updatePost(args.blogId, args.postId, { title: args.title, content: args.content, labels: args.labels }); return { content: [ { type: 'text', text: JSON.stringify({ post }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la mise à jour du post ${args.postId}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la mise à jour du post: ${error}` } ], isError: true }; } } ); // Outil pour supprimer un post server.tool('delete_post', 'Supprime un post', { blogId: z.string().describe('ID du blog'), postId: z.string().describe('ID du post') }, async (args, _extra) => { try { await bloggerService.deletePost(args.blogId, args.postId); return { content: [ { type: 'text', text: JSON.stringify({ success: true }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la suppression du post ${args.postId}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la suppression du post: ${error}` } ], isError: true }; } } ); // Outil pour lister les labels d'un blog server.tool('list_labels', 'Liste tous les labels d\'un blog', { blogId: z.string().describe('ID du blog') }, async (args, _extra) => { try { const labels = await bloggerService.listLabels(args.blogId); return { content: [ { type: 'text', text: JSON.stringify({ labels }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la récupération des labels du blog ${args.blogId}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la récupération des labels: ${error}` } ], isError: true }; } } ); // Outil pour obtenir les détails d'un label server.tool('get_label', 'Récupère les détails d\'un label spécifique', { blogId: z.string().describe('ID du blog'), labelName: z.string().describe('Nom du label') }, async (args, _extra) => { try { const label = await bloggerService.getLabel(args.blogId, args.labelName); return { content: [ { type: 'text', text: JSON.stringify({ label }, null, 2) } ] }; } catch (error) { console.error(`Erreur lors de la récupération du label ${args.labelName}:`, error); return { content: [ { type: 'text', text: `Erreur lors de la récupération du label: ${error}` } ], isError: true }; } } ); return server; }