UNPKG

lokalise-mcp

Version:

The Lokalise MCP Server brings Lokalise's localization power to Claude and AI assistants—manage projects, keys, and translations by chat.

125 lines (124 loc) • 4.48 kB
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; import { Logger } from "../../shared/utils/logger.util.js"; import usergroupsController from "./usergroups.controller.js"; /** * Usergroups MCP resources implementation. * Generated on 2025-08-11 for User groups management for team-based permissions. */ const logger = Logger.forContext("domains/usergroups/usergroups.resource.ts"); /** * Handle usergroups collection resource requests */ async function handleUsergroupsCollectionResource(uri) { const methodLogger = logger.forMethod("handleUsergroupsCollectionResource"); methodLogger.debug("Handling usergroups collection resource request", { uri: uri.toString(), }); try { // Extract team ID from path const pathParts = uri.pathname.split("/").filter(Boolean); if (pathParts.length < 2 || pathParts[0] !== "usergroups") { throw new Error("Invalid resource URI format. Expected: lokalise://usergroups/<team-id>"); } const teamId = pathParts[1]; // Extract query parameters const limit = uri.searchParams.get("limit"); const page = uri.searchParams.get("page"); // Build arguments const args = { teamId, limit: limit ? Number.parseInt(limit, 10) : undefined, page: page ? Number.parseInt(page, 10) : undefined, }; // Call controller const result = await usergroupsController.list(args); return { contents: [ { uri: uri.toString(), mimeType: "text/markdown", text: result.content, }, ], }; } catch (error) { methodLogger.error("Resource handler failed", { error: error.message, }); throw error; } } /** * Handle usergroups detail resource requests */ async function handleUsergroupsDetailResource(uri) { const methodLogger = logger.forMethod("handleUsergroupsDetailResource"); methodLogger.debug("Handling usergroups detail resource request", { uri: uri.toString(), }); try { // Extract team ID and group ID from path const pathParts = uri.pathname.split("/").filter(Boolean); if (pathParts.length < 3 || pathParts[0] !== "usergroups") { throw new Error("Invalid resource URI format. Expected: lokalise://usergroups/<team-id>/<group-id>"); } const teamId = pathParts[1]; const groupId = pathParts[2]; // Build arguments const args = { teamId, groupId, }; // Call controller const result = await usergroupsController.get(args); return { contents: [ { uri: uri.toString(), mimeType: "text/markdown", text: result.content, }, ], }; } catch (error) { methodLogger.error("Resource handler failed", { error: error.message, }); throw error; } } /** * Register all MCP resources for the usergroups domain * @param server The MCP server instance to register resources with */ function registerResources(server) { const registerLogger = Logger.forContext("usergroups.resource.ts", "registerResources"); registerLogger.debug("Registering usergroups domain resources..."); // Register collection resource server.resource("lokalise-usergroups", new ResourceTemplate("lokalise://usergroups/{teamId}", { list: undefined, // No listing of resources needed }), async (uri) => handleUsergroupsCollectionResource(uri)); // Register detail resource server.resource("lokalise-usergroups-details", new ResourceTemplate("lokalise://usergroups/{teamId}/{groupId}", { list: undefined, // No listing of resources needed }), async (uri) => handleUsergroupsDetailResource(uri)); registerLogger.debug("Usergroups domain resources registered successfully"); } /** * Get metadata about the usergroups domain resources */ function getMeta() { return { name: "usergroups", description: "User groups management for team-based permissions MCP resources", version: "1.0.0", resourcesCount: 2, }; } const usergroupsResource = { registerResources, getMeta, }; export default usergroupsResource;