figma-mcp-server 2.0.0 → 2.1.1

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.
Files changed (38) hide show
  1. package/LICENSE +1 -2
  2. package/README.md +37 -11
  3. package/bun.lock +80 -34
  4. package/commands/tools.ts +87 -0
  5. package/{index.js → index.ts} +2 -2
  6. package/lib/tools.ts +38 -0
  7. package/mcpServer.ts +186 -0
  8. package/package.json +22 -12
  9. package/preview.webp +0 -0
  10. package/tools/figma/figma-api/{create-dev-resources-for-a-file.js → create-dev-resources-for-a-file.ts} +9 -11
  11. package/tools/figma/figma-api/{create-variable-collections-for-a-file.js → create-variable-collections-for-a-file.ts} +7 -9
  12. package/tools/figma/figma-api/{get-a-published-component-by-key.js → get-a-published-component-by-key.ts} +7 -9
  13. package/tools/figma/figma-api/{get-a-published-component-set-by-key.js → get-a-published-component-set-by-key.ts} +7 -9
  14. package/tools/figma/figma-api/{get-a-published-library-by-id.js → get-a-published-library-by-id.ts} +7 -9
  15. package/tools/figma/figma-api/{get-a-published-style-by-key.js → get-a-published-style-by-key.ts} +7 -9
  16. package/tools/figma/figma-api/{get-current-user.js → get-current-user.ts} +6 -8
  17. package/tools/figma/figma-api/{get-file-nodes.js → get-file-nodes.ts} +7 -9
  18. package/tools/figma/figma-api/{get-file-version-history.js → get-file-version-history.ts} +7 -9
  19. package/tools/figma/figma-api/{get-file.js → get-file.ts} +7 -9
  20. package/tools/figma/figma-api/{get-image-fills.js → get-image-fills.ts} +7 -9
  21. package/tools/figma/figma-api/{get-library-action-analytics.js → get-library-action-analytics.ts} +7 -9
  22. package/tools/figma/figma-api/{get-library-usage-analytics.js → get-library-usage-analytics.ts} +7 -9
  23. package/tools/figma/figma-api/{list-comments-on-a-file.js → list-comments-on-a-file.ts} +8 -10
  24. package/tools/figma/figma-api/{list-component-sets-in-a-file.js → list-component-sets-in-a-file.ts} +7 -9
  25. package/tools/figma/figma-api/{list-components-in-a-file.js → list-components-in-a-file.ts} +7 -9
  26. package/tools/figma/figma-api/{list-dev-resources-for-a-file.js → list-dev-resources-for-a-file.ts} +7 -9
  27. package/tools/figma/figma-api/{list-files-in-a-project.js → list-files-in-a-project.ts} +7 -9
  28. package/tools/figma/figma-api/{list-projects-in-a-team.js → list-projects-in-a-team.ts} +7 -9
  29. package/tools/figma/figma-api/{list-published-libraries.js → list-published-libraries.ts} +6 -8
  30. package/tools/figma/figma-api/{list-styles-in-a-file.js → list-styles-in-a-file.ts} +7 -9
  31. package/tools/figma/figma-api/{list-variables-for-a-file.js → list-variables-for-a-file.ts} +7 -9
  32. package/tools/figma/figma-api/{post-a-comment-to-a-file.js → post-a-comment-to-a-file.ts} +7 -9
  33. package/tools/paths.ts +25 -0
  34. package/tsconfig.json +28 -0
  35. package/commands/tools.js +0 -65
  36. package/lib/tools.js +0 -12
  37. package/mcpServer.js +0 -170
  38. package/tools/paths.js +0 -25
package/mcpServer.ts ADDED
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/env node
2
+
3
+ import dotenv from "dotenv";
4
+ import express from "express";
5
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
8
+ import {
9
+ CallToolRequestSchema,
10
+ ErrorCode,
11
+ ListToolsRequestSchema,
12
+ McpError,
13
+ Tool,
14
+ } from "@modelcontextprotocol/sdk/types.js";
15
+ import { discoverTools, type ToolWithDefinition } from "./lib/tools.ts";
16
+
17
+ import path from "path";
18
+ import { fileURLToPath } from "url";
19
+
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = path.dirname(__filename);
22
+
23
+ dotenv.config({ path: path.resolve(__dirname, ".env") });
24
+
25
+ if (!process.env.FIGMA_API_KEY) {
26
+ console.error("Error: FIGMA_API_KEY environment variable is required.");
27
+ process.exit(1);
28
+ }
29
+
30
+ const SERVER_NAME = process.env.SERVER_NAME || "figma-mcp-server";
31
+ const SERVER_VERSION = process.env.SERVER_VERSION || "0.1.2";
32
+ const DEFAULT_PORT = 3001;
33
+
34
+ async function transformTools(tools: ToolWithDefinition[]): Promise<Tool[]> {
35
+ return tools
36
+ .map((tool) => {
37
+ const definitionFunction = tool.definition?.function;
38
+ if (!definitionFunction) return undefined;
39
+ return {
40
+ name: definitionFunction.name,
41
+ description: definitionFunction.description,
42
+ inputSchema: definitionFunction.parameters,
43
+ } as Tool;
44
+ })
45
+ .filter((t): t is Tool => t !== undefined);
46
+ }
47
+
48
+ async function setupServerHandlers(
49
+ server: Server,
50
+ tools: ToolWithDefinition[],
51
+ transformedTools: Tool[]
52
+ ) {
53
+ const toolMap = new Map(
54
+ tools.map((tool) => [tool.definition.function.name, tool])
55
+ );
56
+
57
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
58
+ tools: transformedTools,
59
+ }));
60
+
61
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
62
+ const toolName = request.params.name;
63
+ const tool = toolMap.get(toolName);
64
+ if (!tool) {
65
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${toolName}`);
66
+ }
67
+ const args = request.params.arguments || {};
68
+ const requiredParameters =
69
+ tool.definition?.function?.parameters?.required || [];
70
+ for (const requiredParameter of requiredParameters) {
71
+ if (!(requiredParameter in args)) {
72
+ throw new McpError(
73
+ ErrorCode.InvalidParams,
74
+ `Missing required parameter: ${requiredParameter}`
75
+ );
76
+ }
77
+ }
78
+ try {
79
+ const result = await tool.function(args);
80
+ return {
81
+ content: [
82
+ {
83
+ type: "text",
84
+ text: JSON.stringify(result, null, 2),
85
+ },
86
+ ],
87
+ };
88
+ } catch (error: any) {
89
+ console.error("[Error] Failed to fetch data:", error);
90
+ throw new McpError(
91
+ ErrorCode.InternalError,
92
+ `API error: ${error.message}`
93
+ );
94
+ }
95
+ });
96
+ }
97
+
98
+ async function run() {
99
+ const args = process.argv.slice(2);
100
+ const isSSE = args.includes("--sse");
101
+ const tools = await discoverTools();
102
+ const transformedTools = await transformTools(tools);
103
+
104
+ if (isSSE) {
105
+ const app = express();
106
+ const transports: Record<string, SSEServerTransport> = {};
107
+ const servers: Record<string, Server> = {};
108
+
109
+ app.get("/sse", async (_req, res) => {
110
+ const server = new Server(
111
+ {
112
+ name: SERVER_NAME,
113
+ version: SERVER_VERSION,
114
+ },
115
+ {
116
+ capabilities: {
117
+ tools: {},
118
+ },
119
+ }
120
+ );
121
+ server.onerror = (error) => console.error("[Error]", error);
122
+ await setupServerHandlers(server, tools, transformedTools);
123
+
124
+ const transport = new SSEServerTransport("/messages", res);
125
+ transports[transport.sessionId] = transport;
126
+ servers[transport.sessionId] = server;
127
+
128
+ res.on("close", async () => {
129
+ delete transports[transport.sessionId];
130
+ await server.close();
131
+ delete servers[transport.sessionId];
132
+ });
133
+
134
+ await server.connect(transport);
135
+ });
136
+
137
+ app.post("/messages", async (req, res) => {
138
+ const sessionId = req.query.sessionId;
139
+
140
+ if (typeof sessionId !== "string") {
141
+ res.status(400).send("Invalid or missing sessionId");
142
+ return;
143
+ }
144
+
145
+ const transport = transports[sessionId];
146
+ const server = servers[sessionId];
147
+
148
+ if (transport && server) {
149
+ await transport.handlePostMessage(req, res);
150
+ } else {
151
+ res.status(400).send("No transport/server found for sessionId");
152
+ }
153
+ });
154
+
155
+ const port = process.env.PORT || DEFAULT_PORT;
156
+ app.listen(port, () => {
157
+ console.log(`[SSE Server] running on port ${port}`);
158
+ console.log(`[Server] Name: ${SERVER_NAME}`);
159
+ console.log(`[Server] Version: ${SERVER_VERSION}`);
160
+ });
161
+ } else {
162
+ const server = new Server(
163
+ {
164
+ name: SERVER_NAME,
165
+ version: SERVER_VERSION,
166
+ },
167
+ {
168
+ capabilities: {
169
+ tools: {},
170
+ },
171
+ }
172
+ );
173
+ server.onerror = (error) => console.error("[Error]", error);
174
+ await setupServerHandlers(server, tools, transformedTools);
175
+
176
+ process.on("SIGINT", async () => {
177
+ await server.close();
178
+ process.exit(0);
179
+ });
180
+
181
+ const transport = new StdioServerTransport();
182
+ await server.connect(transport);
183
+ }
184
+ }
185
+
186
+ run().catch(console.error);
package/package.json CHANGED
@@ -1,21 +1,25 @@
1
1
  {
2
2
  "name": "figma-mcp-server",
3
- "version": "2.0.0",
4
- "description": "A simple MCP server for Figma",
5
- "main": "index.js",
3
+ "version": "2.1.1",
4
+ "description": "A comprehensive local MCP server for Figma. Connect Figma with the Gemini CLI, Cursor, and Claude Desktop.",
5
+ "main": "index.ts",
6
6
  "type": "module",
7
7
  "scripts": {
8
- "list-tools": "node index.js tools",
9
- "start": "node mcpServer.js --sse"
8
+ "list-tools": "bun index.ts tools",
9
+ "start": "bun mcpServer.ts --sse",
10
+ "typecheck": "bun x tsc --noEmit"
10
11
  },
11
12
  "dependencies": {
12
- "@modelcontextprotocol/sdk": "^1.12.1",
13
- "commander": "^14.0.0",
14
- "dotenv": "^16.5.0",
15
- "express": "^5.1.0"
13
+ "@clack/prompts": "^0.11.0",
14
+ "@modelcontextprotocol/sdk": "^1.25.1",
15
+ "commander": "^14.0.2",
16
+ "dotenv": "^17.2.3",
17
+ "express": "^5.2.1",
18
+ "picocolors": "^1.1.1"
16
19
  },
17
20
  "engines": {
18
- "node": ">=16.0.0"
21
+ "node": ">=20.0.0",
22
+ "bun": ">=1.1.0"
19
23
  },
20
24
  "keywords": [
21
25
  "figma",
@@ -32,5 +36,11 @@
32
36
  "bugs": {
33
37
  "url": "https://github.com/planetabhi/figma-mcp-server/issues"
34
38
  },
35
- "homepage": "https://github.com/planetabhi/figma-mcp-server#readme"
36
- }
39
+ "homepage": "https://github.com/planetabhi/figma-mcp-server#readme",
40
+ "devDependencies": {
41
+ "@types/express": "^5.0.6",
42
+ "@types/node": "^25.0.3",
43
+ "bun-types": "^1.3.5",
44
+ "typescript": "^5.9.3"
45
+ }
46
+ }
package/preview.webp ADDED
Binary file
@@ -1,8 +1,9 @@
1
- const executeFunction = async ({ file_key, node_id, name, url }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ file_key, node_id, name, url }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
- const url = `${baseUrl}/v1/files/${file_key}/dev_resources`;
6
+ const endpoint = `${baseUrl}/v1/files/${file_key}/dev_resources`;
6
7
 
7
8
  const headers = {
8
9
  'X-Figma-Token': token,
@@ -20,26 +21,23 @@ const executeFunction = async ({ file_key, node_id, name, url }) => {
20
21
  ]
21
22
  });
22
23
 
23
- const response = await fetch(url, {
24
+ const response = await fetch(endpoint, {
24
25
  method: 'POST',
25
26
  headers,
26
27
  body
27
28
  });
28
29
 
29
30
  if (!response.ok) {
30
- const errorData = await response.json();
31
- throw new Error(errorData);
31
+ const errorData = await response.json() as any;
32
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
32
33
  }
33
34
 
34
35
  const data = await response.json();
35
36
  return data;
36
- } catch (error) {
37
- console.error('Error creating development resources:', error);
38
- return { error: 'An error occurred while creating development resources.' };
39
- }
37
+ } catch (error) { throw error; }
40
38
  };
41
39
 
42
- const apiTool = {
40
+ const apiTool: ApiTool = {
43
41
  function: executeFunction,
44
42
  definition: {
45
43
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ file_key, name }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ file_key, name }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = `${baseUrl}/v1/files/${file_key}/variables`;
6
7
 
@@ -25,19 +26,16 @@ const executeFunction = async ({ file_key, name }) => {
25
26
  });
26
27
 
27
28
  if (!response.ok) {
28
- const errorData = await response.json();
29
- throw new Error(errorData);
29
+ const errorData = await response.json() as any;
30
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
30
31
  }
31
32
 
32
33
  const data = await response.json();
33
34
  return data;
34
- } catch (error) {
35
- console.error('Error creating variable collections:', error);
36
- return { error: 'An error occurred while creating variable collections.' };
37
- }
35
+ } catch (error) { throw error; }
38
36
  };
39
37
 
40
- const apiTool = {
38
+ const apiTool: ApiTool = {
41
39
  function: executeFunction,
42
40
  definition: {
43
41
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ key }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ key }: any) => {
2
3
  const baseUrl = 'https://api.figma.com/v1/components';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = `${baseUrl}/${key}`;
6
7
 
@@ -14,19 +15,16 @@ const executeFunction = async ({ key }) => {
14
15
  });
15
16
 
16
17
  if (!response.ok) {
17
- const errorData = await response.json();
18
- throw new Error(errorData);
18
+ const errorData = await response.json() as any;
19
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
19
20
  }
20
21
 
21
22
  const data = await response.json();
22
23
  return data;
23
- } catch (error) {
24
- console.error('Error retrieving component metadata:', error);
25
- return { error: 'An error occurred while retrieving component metadata.' };
26
- }
24
+ } catch (error) { throw error; }
27
25
  };
28
26
 
29
- const apiTool = {
27
+ const apiTool: ApiTool = {
30
28
  function: executeFunction,
31
29
  definition: {
32
30
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ key }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ key }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = `${baseUrl}/v1/component_sets/${key}`;
6
7
 
@@ -14,19 +15,16 @@ const executeFunction = async ({ key }) => {
14
15
  });
15
16
 
16
17
  if (!response.ok) {
17
- const errorData = await response.json();
18
- throw new Error(errorData);
18
+ const errorData = await response.json() as any;
19
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
19
20
  }
20
21
 
21
22
  const data = await response.json();
22
23
  return data;
23
- } catch (error) {
24
- console.error('Error retrieving component set metadata:', error);
25
- return { error: 'An error occurred while retrieving component set metadata.' };
26
- }
24
+ } catch (error) { throw error; }
27
25
  };
28
26
 
29
- const apiTool = {
27
+ const apiTool: ApiTool = {
30
28
  function: executeFunction,
31
29
  definition: {
32
30
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ library_id }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ library_id }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = `${baseUrl}/v1/libraries/${library_id}`;
6
7
 
@@ -14,19 +15,16 @@ const executeFunction = async ({ library_id }) => {
14
15
  });
15
16
 
16
17
  if (!response.ok) {
17
- const errorData = await response.json();
18
- throw new Error(errorData);
18
+ const errorData = await response.json() as any;
19
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
19
20
  }
20
21
 
21
22
  const data = await response.json();
22
23
  return data;
23
- } catch (error) {
24
- console.error('Error retrieving library metadata:', error);
25
- return { error: 'An error occurred while retrieving library metadata.' };
26
- }
24
+ } catch (error) { throw error; }
27
25
  };
28
26
 
29
- const apiTool = {
27
+ const apiTool: ApiTool = {
30
28
  function: executeFunction,
31
29
  definition: {
32
30
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ key }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ key }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = `${baseUrl}/v1/styles/${key}`;
6
7
 
@@ -14,19 +15,16 @@ const executeFunction = async ({ key }) => {
14
15
  });
15
16
 
16
17
  if (!response.ok) {
17
- const errorData = await response.json();
18
- throw new Error(errorData);
18
+ const errorData = await response.json() as any;
19
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
19
20
  }
20
21
 
21
22
  const data = await response.json();
22
23
  return data;
23
- } catch (error) {
24
- console.error('Error retrieving published style:', error);
25
- return { error: 'An error occurred while retrieving the published style.' };
26
- }
24
+ } catch (error) { throw error; }
27
25
  };
28
26
 
29
- const apiTool = {
27
+ const apiTool: ApiTool = {
30
28
  function: executeFunction,
31
29
  definition: {
32
30
  type: 'function',
@@ -1,6 +1,7 @@
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
1
2
  const executeFunction = async () => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const headers = {
6
7
  'X-Figma-Token': token
@@ -12,19 +13,16 @@ const executeFunction = async () => {
12
13
  });
13
14
 
14
15
  if (!response.ok) {
15
- const errorData = await response.json();
16
- throw new Error(errorData);
16
+ const errorData = await response.json() as any;
17
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
17
18
  }
18
19
 
19
20
  const data = await response.json();
20
21
  return data;
21
- } catch (error) {
22
- console.error('Error getting current user information:', error);
23
- return { error: 'An error occurred while getting user information.' };
24
- }
22
+ } catch (error) { throw error; }
25
23
  };
26
24
 
27
- const apiTool = {
25
+ const apiTool: ApiTool = {
28
26
  function: executeFunction,
29
27
  definition: {
30
28
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ file_key, node_id }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ file_key, node_id }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = new URL(`${baseUrl}/v1/files/${file_key}/nodes`);
6
7
  if (node_id) {
@@ -17,19 +18,16 @@ const executeFunction = async ({ file_key, node_id }) => {
17
18
  });
18
19
 
19
20
  if (!response.ok) {
20
- const errorData = await response.json();
21
- throw new Error(errorData);
21
+ const errorData = await response.json() as any;
22
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
22
23
  }
23
24
 
24
25
  const data = await response.json();
25
26
  return data;
26
- } catch (error) {
27
- console.error('Error getting file nodes:', error);
28
- return { error: 'An error occurred while retrieving file nodes.' };
29
- }
27
+ } catch (error) { throw error; }
30
28
  };
31
29
 
32
- const apiTool = {
30
+ const apiTool: ApiTool = {
33
31
  function: executeFunction,
34
32
  definition: {
35
33
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ file_key }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ file_key }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = `${baseUrl}/v1/files/${file_key}/versions`;
6
7
 
@@ -14,19 +15,16 @@ const executeFunction = async ({ file_key }) => {
14
15
  });
15
16
 
16
17
  if (!response.ok) {
17
- const errorData = await response.json();
18
- throw new Error(errorData);
18
+ const errorData = await response.json() as any;
19
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
19
20
  }
20
21
 
21
22
  const data = await response.json();
22
23
  return data;
23
- } catch (error) {
24
- console.error('Error retrieving file version history:', error);
25
- return { error: 'An error occurred while retrieving the file version history.' };
26
- }
24
+ } catch (error) { throw error; }
27
25
  };
28
26
 
29
- const apiTool = {
27
+ const apiTool: ApiTool = {
30
28
  function: executeFunction,
31
29
  definition: {
32
30
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ file_key }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ file_key }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = `${baseUrl}/v1/files/${file_key}`;
6
7
 
@@ -14,19 +15,16 @@ const executeFunction = async ({ file_key }) => {
14
15
  });
15
16
 
16
17
  if (!response.ok) {
17
- const errorData = await response.json();
18
- throw new Error(errorData);
18
+ const errorData = await response.json() as any;
19
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
19
20
  }
20
21
 
21
22
  const data = await response.json();
22
23
  return data;
23
- } catch (error) {
24
- console.error('Error retrieving Figma file:', error);
25
- return { error: 'An error occurred while retrieving the Figma file.' };
26
- }
24
+ } catch (error) { throw error; }
27
25
  };
28
26
 
29
- const apiTool = {
27
+ const apiTool: ApiTool = {
30
28
  function: executeFunction,
31
29
  definition: {
32
30
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ file_key, node_id }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ file_key, node_id }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = new URL(`${baseUrl}/v1/images/${file_key}`);
6
7
  if (node_id) {
@@ -17,19 +18,16 @@ const executeFunction = async ({ file_key, node_id }) => {
17
18
  });
18
19
 
19
20
  if (!response.ok) {
20
- const errorData = await response.json();
21
- throw new Error(errorData);
21
+ const errorData = await response.json() as any;
22
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
22
23
  }
23
24
 
24
25
  const data = await response.json();
25
26
  return data;
26
- } catch (error) {
27
- console.error('Error getting image fills:', error);
28
- return { error: 'An error occurred while getting image fills.' };
29
- }
27
+ } catch (error) { throw error; }
30
28
  };
31
29
 
32
- const apiTool = {
30
+ const apiTool: ApiTool = {
33
31
  function: executeFunction,
34
32
  definition: {
35
33
  type: 'function',
@@ -1,6 +1,7 @@
1
- const executeFunction = async ({ library_file_key }) => {
1
+ import { ApiTool, getFigmaToken } from "../../../lib/tools.ts";
2
+ const executeFunction = async ({ library_file_key }: any) => {
2
3
  const baseUrl = 'https://api.figma.com';
3
- const token = process.env.FIGMA_API_KEY;
4
+ const token = getFigmaToken();
4
5
  try {
5
6
  const url = `${baseUrl}/v1/analytics/libraries/${library_file_key}/actions`;
6
7
 
@@ -14,19 +15,16 @@ const executeFunction = async ({ library_file_key }) => {
14
15
  });
15
16
 
16
17
  if (!response.ok) {
17
- const errorData = await response.json();
18
- throw new Error(errorData);
18
+ const errorData = await response.json() as any;
19
+ throw new Error(`Figma API Error: ${errorData.message || response.statusText}`);
19
20
  }
20
21
 
21
22
  const data = await response.json();
22
23
  return data;
23
- } catch (error) {
24
- console.error('Error retrieving library action analytics:', error);
25
- return { error: 'An error occurred while retrieving library action analytics.' };
26
- }
24
+ } catch (error) { throw error; }
27
25
  };
28
26
 
29
- const apiTool = {
27
+ const apiTool: ApiTool = {
30
28
  function: executeFunction,
31
29
  definition: {
32
30
  type: 'function',