UNPKG

@zeplin/mcp-server

Version:

Zeplin’s official MCP server for AI-assisted UI development

75 lines (74 loc) 3.17 kB
import { ZeplinApi, Configuration } from "@zeplin/sdk"; import { pruneLayersForTargetLayer } from "../utils/api-utils.js"; import { preProcess, preProcessDesignTokens } from "../utils/preprocessing.js"; /** * Initialize the Zeplin API client */ export const api = new ZeplinApi(new Configuration({ accessToken: process.env.ZEPLIN_ACCESS_TOKEN })); /** * Fetches design tokens for a project * @param projectId The ID of the project * @returns The design tokens data */ export async function fetchProjectDesignTokens(projectId) { const designTokens = await api.designTokens.getProjectDesignTokens(projectId, { includeLinkedStyleguides: true }); return { designTokens: preProcessDesignTokens(designTokens.data), }; } /** * Fetches design tokens for a styleguide * @param styleguideId The ID of the styleguide * @returns The design tokens data */ export async function fetchStyleguideDesignTokens(styleguideId) { const designTokens = await api.designTokens.getStyleguideDesignTokens(styleguideId, { includeLinkedStyleguides: true }); return { designTokens: preProcessDesignTokens(designTokens.data), }; } /** * Processes screen versions and annotations to create screen variants * @param projectId The project ID * @param screenIds Array of screen IDs * @param variantNames Array of variant names * @param targetLayerName Optional layer name to extract * @returns Array of processed screen variants */ export async function processScreenVersionsAndAnnotations(projectId, screenIds, variantNames, targetLayerName) { const screenVersionResponses = await Promise.all(screenIds.map(async (screenId) => { const response = await api.screens.getLatestScreenVersion(projectId, screenId); const processedData = preProcess(response.data); return { ...response, data: processedData }; })); const screenAnnotationsResponse = await Promise.all(screenIds.map((screenId) => api.screens.getScreenAnnotations(projectId, screenId))); const screenAnnotations = screenAnnotationsResponse.map((response, index) => { const annotations = response.data; const screenVersion = screenVersionResponses[index]; return annotations.map((annotation) => ({ type: annotation.type.name, text: annotation.content, position: { x: annotation.position.x * (screenVersion.data.width || 0), y: annotation.position.y * (screenVersion.data.height || 0), }, })); }); return screenVersionResponses.map((response, index) => { const screenVersion = response.data; // If targetLayerName is provided, prune the layers. // Otherwise, use all layers from the screenVersion. const layersToInclude = targetLayerName ? pruneLayersForTargetLayer(screenVersion.layers || [], targetLayerName) : screenVersion.layers || []; return { name: variantNames[index], annotations: screenAnnotations[index], layers: layersToInclude, assets: screenVersion.assets, }; }); }