import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { sendCommandToFigma } from "../communication";
import { logger } from "../logger";
import { filterFigmaNode } from "../utils/node-filter";
/**
* Register node-related MCP tools
*/
export function registerNodeTools(server: McpServer): void {
// Read My Design
server.tool(
"read_my_design",
"Get detailed information about the current selection in Figma, including all node details",
{},
async () => {
try {
const result = await sendCommandToFigma("read_my_design", {});
return {
content: [
{
type: "text",
text: JSON.stringify(result),
},
],
};
} catch (error) {
logger.error("Error reading design", error);
return {
content: [
{
type: "text",
text: `Error reading design: ${
error instanceof Error ? error.message : String(error)
}`,
},
],
};
}
},
);
// Get Node Info
server.tool(
"get_node_info",
"Get detailed information about a specific node in Figma by its ID",
{
nodeId: z
.string()
.describe("The ID of the node to get information about"),
},
async ({ nodeId }) => {
try {
const result = await sendCommandToFigma("get_node_info", { nodeId });
return {
content: [
{
type: "text",
text: JSON.stringify(filterFigmaNode(result)),
},
],
};
} catch (error) {
logger.error("Error getting node info", error);
return {
content: [
{
type: "text",
text: `Error getting node info: ${
error instanceof Error ? error.message : String(error)
}`,
},
],
};
}
},
);
// Get Nodes Info (multiple)
server.tool(
"get_nodes_info",
"Get detailed information about multiple nodes in Figma by their IDs",
{
nodeIds: z
.array(z.string())
.describe("Array of node IDs to get information about"),
},
async ({ nodeIds }) => {
try {
const results = await Promise.all(
nodeIds.map(async (nodeId) => {
const result = await sendCommandToFigma("get_node_info", {
nodeId,
});
return { nodeId, info: result };
}),
);
return {
content: [
{
type: "text",
text: JSON.stringify(
results.map((result) => filterFigmaNode(result.info)),
),
},
],
};
} catch (error) {
logger.error("Error getting nodes info", error);
return {
content: [
{
type: "text",
text: `Error getting nodes info: ${
error instanceof Error ? error.message : String(error)
}`,
},
],
};
}
},
);
}