Commit dd237c8
authored
feat: add support for using as a CLI via
* test: add result serialization behavior tests
Verify YAML and JSON serialization behavior matching the inline logic
in get-figma-data-tool.ts. Tests cover the performance-critical YAML
options (noRefs, lineWidth, noCompatMode, JSON_SCHEMA) and round-trip
correctness for both formats. These tests will anchor a future
extraction of serialization into a shared function.
* test(config): add unit tests for config resolution helpers
Export resolve, envStr, envInt, envBool (and Source, Resolved types)
from config.ts and add 13 unit tests covering the priority chain
and environment variable parsing. These are safety-net tests before
an upcoming config refactor.
* test: add process-level CLI startup tests
Pin current binary startup behavior before rewriting bin.ts:
- Verify NODE_ENV=cli triggers stdio mode without --stdio flag
- Verify HTTP mode starts via bin.ts and accepts MCP requests
* test: add edge case coverage for config resolution and YAML schema
Add falsy-value preservation test for resolve() (false, 0 must not fall
through to env/default). Add YAML schema quoting test verifying
JSON_SCHEMA skips unnecessary quoting of ambiguous strings like "yes"
and "2024-01-01".
* docs: update plan with Phase 1 completion and simplifications
* feat(utils): add Figma URL parser for fetch subcommand
Parses Figma URLs into fileKey and nodeId components, handling
/file/ and /design/ path formats and converting URL-style node IDs
(dashes) to API-style (colons).
* refactor(utils): extract serializeResult to shared utility
Move YAML/JSON serialization logic from get-figma-data-tool.ts into
utils/serialize.ts so it can be reused by the upcoming CLI fetch command.
Update serialization tests to import from the new module.
* refactor: restructure CLI as router with parameterized config
Move CLI parsing (cleye) from config.ts to bin.ts, making bin.ts the
entry-point router that dispatches to the server path or fetch
subcommand. config.ts becomes a toolkit of composable helpers:
getServerConfig(flags), resolveAuth(), loadEnvFile().
startServer() now accepts a ServerConfig object instead of calling
getServerConfig() internally, completing the separation of parsing
from execution.
* feat: implement CLI fetch subcommand
Add `figma-developer-mcp fetch` that performs a one-off Figma data
fetch to stdout. Supports positional URL argument or explicit
--file-key/--node-id flags, with flags overriding URL-derived values.
Pipeline: parse URL → load .env → resolve auth → FigmaService →
getRawNode/getRawFile → simplifyRawFigmaObject → serializeResult →
stdout.
* chore: address review feedback and mark plan complete
- Invert empty if-branch in bin.ts for clarity
- Narrow mcp-server.ts public API to only getServerConfig/ServerConfig
(loadEnvFile, resolveAuth, ServerFlags are internal utilities)
- Mark Phase 2 done in plan document
* fix: handle malformed URL when file-key flag is provided
parseFigmaUrl() threw before flags could override URL-derived values.
Now URL parsing failures are non-fatal when --file-key is already set.
Also tighten hostname validation to reject lookalike domains like
notfigma.com (check exact match or .figma.com subdomain).
* chore: remove plan doc from branchfetch subcommand to retrieve design data directly (#331)1 parent 309c60e commit dd237c8
13 files changed
Lines changed: 574 additions & 134 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | 5 | | |
7 | 6 | | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
15 | | - | |
16 | 14 | | |
17 | 15 | | |
18 | | - | |
| 16 | + | |
19 | 17 | | |
20 | 18 | | |
21 | 19 | | |
22 | | - | |
23 | | - | |
| 20 | + | |
24 | 21 | | |
25 | 22 | | |
26 | 23 | | |
27 | | - | |
28 | | - | |
| 24 | + | |
29 | 25 | | |
30 | 26 | | |
31 | 27 | | |
32 | | - | |
| 28 | + | |
33 | 29 | | |
34 | 30 | | |
35 | 31 | | |
36 | | - | |
37 | 32 | | |
38 | 33 | | |
39 | | - | |
| 34 | + | |
40 | 35 | | |
41 | 36 | | |
42 | 37 | | |
43 | | - | |
44 | 38 | | |
45 | 39 | | |
46 | | - | |
| 40 | + | |
47 | 41 | | |
48 | 42 | | |
49 | 43 | | |
50 | | - | |
51 | | - | |
52 | | - | |
53 | | - | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
54 | 47 | | |
55 | 48 | | |
56 | 49 | | |
57 | | - | |
58 | | - | |
59 | | - | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
60 | 53 | | |
61 | 54 | | |
62 | 55 | | |
63 | | - | |
64 | 56 | | |
65 | 57 | | |
66 | | - | |
| 58 | + | |
67 | 59 | | |
68 | 60 | | |
69 | 61 | | |
70 | | - | |
71 | 62 | | |
72 | 63 | | |
73 | | - | |
| 64 | + | |
74 | 65 | | |
75 | 66 | | |
76 | 67 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
3 | 5 | | |
| 6 | + | |
4 | 7 | | |
5 | | - | |
6 | | - | |
7 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
8 | 55 | | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
0 commit comments