@zeroheight/mcp-server 1.3.0 → 2.0.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## Release notes
2
2
 
3
+ ## [2.0.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/2.0.0) - 28th November 2025
4
+
5
+ - Remove resources
6
+
3
7
  ## [1.3.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.3.0) - 12th November 2025
4
8
 
5
9
  - Only return published pages, categories and navigations to MCP clients
@@ -1,9 +1,7 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="86e0b46d-45ed-57dd-b85a-47e051420308")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d57a82bf-c137-5cb6-a666-abb0d50639c8")}catch(e){}}();
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import packageJson from "../package.json" with { type: "json" };
5
- import { registerStyleguideListResource, registerStyleguideResource, } from "./resources/styleguide.js";
6
- import { registerListPagesResource, registerPageResource, } from "./resources/page.js";
7
5
  import { registerGetStyleguideTreeTool, registerListStyleguidesTool, } from "./tools/styleguide.js";
8
6
  import { registerGetPageTool, registerListPagesTool } from "./tools/page.js";
9
7
  import { recommendSummarizePagePrompt } from "./prompts/page.js";
@@ -24,16 +22,9 @@ export function createServer() {
24
22
  registerListStyleguidesTool,
25
23
  registerGetStyleguideTreeTool,
26
24
  ].forEach((fn) => fn(server));
27
- // Register all resources
28
- [
29
- registerStyleguideListResource,
30
- registerStyleguideResource,
31
- registerListPagesResource,
32
- registerPageResource,
33
- ].forEach((fn) => fn(server));
34
25
  // Register all prompts
35
26
  [registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) => fn(server));
36
27
  return server;
37
28
  }
38
29
  //# sourceMappingURL=mcp-server.js.map
39
- //# debugId=86e0b46d-45ed-57dd-b85a-47e051420308
30
+ //# debugId=d57a82bf-c137-5cb6-a666-abb0d50639c8
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sources":["mcp-server.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n registerStyleguideListResource,\n registerStyleguideResource,\n} from \"./resources/styleguide.js\";\nimport {\n registerListPagesResource,\n registerPageResource,\n} from \"./resources/page.js\";\nimport {\n registerGetStyleguideTreeTool,\n registerListStyleguidesTool,\n} from \"./tools/styleguide.js\";\nimport { registerGetPageTool, registerListPagesTool } from \"./tools/page.js\";\nimport { recommendSummarizePagePrompt } from \"./prompts/page.js\";\nimport { registerRecommendPagesPrompt } from \"./prompts/styleguide.js\";\n\nexport function createServer() {\n const server = new McpServer({\n name: \"zeroheight\",\n version: packageJson.version,\n capabilities: {\n resources: {},\n tools: {},\n },\n });\n\n // Register all tools\n [\n registerListPagesTool,\n registerGetPageTool,\n registerListStyleguidesTool,\n registerGetStyleguideTreeTool,\n ].forEach((fn) => fn(server));\n\n // Register all resources\n [\n registerStyleguideListResource,\n registerStyleguideResource,\n registerListPagesResource,\n registerPageResource,\n ].forEach((fn) => fn(server));\n\n // Register all prompts\n [registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) =>\n fn(server)\n );\n\n return server;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEvE,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IAEH,qBAAqB;IACrB;QACE,qBAAqB;QACrB,mBAAmB;QACnB,2BAA2B;QAC3B,6BAA6B;KAC9B,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9B,yBAAyB;IACzB;QACE,8BAA8B;QAC9B,0BAA0B;QAC1B,yBAAyB;QACzB,oBAAoB;KACrB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9B,uBAAuB;IACvB,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAC1E,EAAE,CAAC,MAAM,CAAC,CACX,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","debug_id":"86e0b46d-45ed-57dd-b85a-47e051420308"}
1
+ {"version":3,"file":"mcp-server.js","sources":["mcp-server.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n registerGetStyleguideTreeTool,\n registerListStyleguidesTool,\n} from \"./tools/styleguide.js\";\nimport { registerGetPageTool, registerListPagesTool } from \"./tools/page.js\";\nimport { recommendSummarizePagePrompt } from \"./prompts/page.js\";\nimport { registerRecommendPagesPrompt } from \"./prompts/styleguide.js\";\n\nexport function createServer() {\n const server = new McpServer({\n name: \"zeroheight\",\n version: packageJson.version,\n capabilities: {\n resources: {},\n tools: {},\n },\n });\n\n // Register all tools\n [\n registerListPagesTool,\n registerGetPageTool,\n registerListStyleguidesTool,\n registerGetStyleguideTreeTool,\n ].forEach((fn) => fn(server));\n\n // Register all prompts\n [registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) =>\n fn(server)\n );\n\n return server;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEvE,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IAEH,qBAAqB;IACrB;QACE,qBAAqB;QACrB,mBAAmB;QACnB,2BAA2B;QAC3B,6BAA6B;KAC9B,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9B,uBAAuB;IACvB,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAC1E,EAAE,CAAC,MAAM,CAAC,CACX,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","debug_id":"d57a82bf-c137-5cb6-a666-abb0d50639c8"}
@@ -2,7 +2,7 @@
2
2
  * Page Tools
3
3
  */
4
4
 
5
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c19966f8-0d3f-578e-99c2-e0c61928da53")}catch(e){}}();
5
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7c45ebdb-0077-57f7-b230-be9cb17923b8")}catch(e){}}();
6
6
  import z from "zod";
7
7
  import { getPage, listPages } from "../api/page.js";
8
8
  import { formatPageAsMarkdown, formatPageListItemsAsMarkdown, } from "../common/formatters/page.js";
@@ -15,11 +15,8 @@ export function registerListPagesTool(server) {
15
15
  styleguideId: z.number().int().positive(),
16
16
  releaseId: z.number().int().optional(),
17
17
  searchTerm: z.string().optional(),
18
- responseFormat: z
19
- .enum(["markdown", "resource_links"])
20
- .default("markdown"),
21
18
  },
22
- }, async ({ styleguideId, releaseId, searchTerm, responseFormat }, { authInfo }) => {
19
+ }, async ({ styleguideId, releaseId, searchTerm }, { authInfo }) => {
23
20
  const credentials = await getCredentials(authInfo);
24
21
  if (credentials.type === "jwt" &&
25
22
  credentials.styleguideId !== styleguideId) {
@@ -48,35 +45,13 @@ export function registerListPagesTool(server) {
48
45
  ],
49
46
  };
50
47
  }
51
- if (responseFormat === "markdown") {
52
- return {
53
- content: [
54
- {
55
- type: "text",
56
- text: formatPageListItemsAsMarkdown(pages),
57
- mimeType: "text/markdown",
58
- },
59
- ],
60
- };
61
- }
62
- const resourceLinks = pages.map((page) => ({
63
- type: "resource_link",
64
- uri: `zeroheight://styleguide/${styleguideId}/page/${page.id}`,
65
- name: page.name ?? "Unnamed Page",
66
- _meta: {
67
- createdAt: page.created_at,
68
- id: page.id,
69
- },
70
- mimeType: "text/markdown",
71
- description: "Styleguide page",
72
- }));
73
48
  return {
74
49
  content: [
75
50
  {
76
51
  type: "text",
77
- text: `There are ${pages.length} pages in the styleguide: `,
52
+ text: formatPageListItemsAsMarkdown(pages),
53
+ mimeType: "text/markdown",
78
54
  },
79
- ...resourceLinks,
80
55
  ],
81
56
  };
82
57
  });
@@ -127,4 +102,4 @@ export function registerGetPageTool(server) {
127
102
  });
128
103
  }
129
104
  //# sourceMappingURL=page.js.map
130
- //# debugId=c19966f8-0d3f-578e-99c2-e0c61928da53
105
+ //# debugId=7c45ebdb-0077-57f7-b230-be9cb17923b8
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sources":["tools/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ResourceLink } from \"@modelcontextprotocol/sdk/types.js\";\nimport z from \"zod\";\n\nimport { getPage, listPages } from \"../api/page.js\";\nimport {\n formatPageAsMarkdown,\n formatPageListItemsAsMarkdown,\n} from \"../common/formatters/page.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListPagesTool(server: McpServer) {\n server.registerTool(\n \"list-pages\",\n {\n title: \"List pages for a styleguide\",\n description: \"List all accessible pages in a styleguide\",\n inputSchema: {\n styleguideId: z.number().int().positive(),\n releaseId: z.number().int().optional(),\n searchTerm: z.string().optional(),\n responseFormat: z\n .enum([\"markdown\", \"resource_links\"])\n .default(\"markdown\"),\n },\n },\n async (\n { styleguideId, releaseId, searchTerm, responseFormat },\n { authInfo },\n ) => {\n const credentials = await getCredentials(authInfo);\n if (\n credentials.type === \"jwt\" &&\n credentials.styleguideId !== styleguideId\n ) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"You do not have access to this styleguide\",\n },\n ],\n };\n }\n\n const pages = await listPages(credentials, styleguideId, {\n releaseId,\n searchTerm,\n });\n\n if (pages.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"There are no pages in this styleguide, check you have the correct styleguide ID\",\n },\n ],\n };\n }\n\n if (responseFormat === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatPageListItemsAsMarkdown(pages),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n const resourceLinks: ResourceLink[] = pages.map((page) => ({\n type: \"resource_link\",\n uri: `zeroheight://styleguide/${styleguideId}/page/${page.id}`,\n name: page.name ?? \"Unnamed Page\",\n _meta: {\n createdAt: page.created_at,\n id: page.id,\n },\n mimeType: \"text/markdown\",\n description: \"Styleguide page\",\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: `There are ${pages.length} pages in the styleguide: `,\n },\n ...resourceLinks,\n ],\n };\n },\n );\n}\n\nexport function registerGetPageTool(server: McpServer) {\n server.registerTool(\n \"get-page\",\n {\n title: \"Get a styleguide page\",\n description: \"Get a page in the requested format\",\n inputSchema: {\n pageId: z.string(),\n releaseId: z.number().int().optional(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n },\n },\n async ({ pageId, responseFormat }, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const page = await getPage(credentials, pageId);\n\n if (!page) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not find the page, check you have the correct page ID and release ID.\",\n },\n ],\n };\n }\n\n if (responseFormat === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatPageAsMarkdown(page),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(page, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"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","debug_id":"c19966f8-0d3f-578e-99c2-e0c61928da53"}
1
+ {"version":3,"file":"page.js","sources":["tools/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport z from \"zod\";\n\nimport { getPage, listPages } from \"../api/page.js\";\nimport {\n formatPageAsMarkdown,\n formatPageListItemsAsMarkdown,\n} from \"../common/formatters/page.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListPagesTool(server: McpServer) {\n server.registerTool(\n \"list-pages\",\n {\n title: \"List pages for a styleguide\",\n description: \"List all accessible pages in a styleguide\",\n inputSchema: {\n styleguideId: z.number().int().positive(),\n releaseId: z.number().int().optional(),\n searchTerm: z.string().optional(),\n },\n },\n async (\n { styleguideId, releaseId, searchTerm },\n { authInfo },\n ) => {\n const credentials = await getCredentials(authInfo);\n if (\n credentials.type === \"jwt\" &&\n credentials.styleguideId !== styleguideId\n ) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"You do not have access to this styleguide\",\n },\n ],\n };\n }\n\n const pages = await listPages(credentials, styleguideId, {\n releaseId,\n searchTerm,\n });\n\n if (pages.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"There are no pages in this styleguide, check you have the correct styleguide ID\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: formatPageListItemsAsMarkdown(pages),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n\nexport function registerGetPageTool(server: McpServer) {\n server.registerTool(\n \"get-page\",\n {\n title: \"Get a styleguide page\",\n description: \"Get a page in the requested format\",\n inputSchema: {\n pageId: z.string(),\n releaseId: z.number().int().optional(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n },\n },\n async ({ pageId, responseFormat }, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const page = await getPage(credentials, pageId);\n\n if (!page) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not find the page, check you have the correct page ID and release ID.\",\n },\n ],\n };\n }\n\n if (responseFormat === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatPageAsMarkdown(page),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(page, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"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","debug_id":"7c45ebdb-0077-57f7-b230-be9cb17923b8"}
@@ -2,21 +2,17 @@
2
2
  * Styleguide Tools
3
3
  */
4
4
 
5
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2a6ef93c-fcbe-5349-83c7-e3ce2646162a")}catch(e){}}();
5
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8e279caa-2a6c-5171-8561-ff4a3a6351e4")}catch(e){}}();
6
6
  import z from "zod";
7
7
  import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
8
- import { DEFAULT_NAME, formatStyleguideListAsMarkdown, formatTreeAsJson, } from "../common/formatters/styleguide.js";
8
+ import { formatStyleguideListAsMarkdown, formatTreeAsJson, } from "../common/formatters/styleguide.js";
9
9
  import { getCredentials } from "../common/credentials.js";
10
10
  export function registerListStyleguidesTool(server) {
11
11
  server.registerTool("list-styleguides", {
12
12
  title: "List styleguides",
13
- description: "List all accessible styleguides as resource links",
14
- inputSchema: {
15
- responseType: z
16
- .enum(["markdown", "resource_links"])
17
- .default("markdown"),
18
- },
19
- }, async ({ responseType }, { authInfo }) => {
13
+ description: "List all accessible styleguides as markdown",
14
+ inputSchema: {},
15
+ }, async (_, { authInfo }) => {
20
16
  const credentials = await getCredentials(authInfo);
21
17
  const styleguides = await listStyleguides(credentials);
22
18
  if (styleguides.length === 0) {
@@ -30,35 +26,13 @@ export function registerListStyleguidesTool(server) {
30
26
  ],
31
27
  };
32
28
  }
33
- if (responseType === "markdown") {
34
- return {
35
- content: [
36
- {
37
- type: "text",
38
- text: formatStyleguideListAsMarkdown(styleguides),
39
- mimeType: "text/markdown",
40
- },
41
- ],
42
- };
43
- }
44
- const resourceLinks = styleguides.map((styleguide) => ({
45
- type: "resource_link",
46
- uri: `zeroheight://styleguide/${styleguide.id}`,
47
- name: styleguide.name ?? DEFAULT_NAME,
48
- _meta: {
49
- shareId: styleguide.share_id,
50
- id: styleguide.id,
51
- },
52
- mimeType: "application/json",
53
- description: "Navigation structure for the styleguide",
54
- }));
55
29
  return {
56
30
  content: [
57
31
  {
58
32
  type: "text",
59
- text: `There are available ${styleguides.length} styleguides`,
33
+ text: formatStyleguideListAsMarkdown(styleguides),
34
+ mimeType: "text/markdown",
60
35
  },
61
- ...resourceLinks,
62
36
  ],
63
37
  };
64
38
  });
@@ -98,4 +72,4 @@ export function registerGetStyleguideTreeTool(server) {
98
72
  });
99
73
  }
100
74
  //# sourceMappingURL=styleguide.js.map
101
- //# debugId=2a6ef93c-fcbe-5349-83c7-e3ce2646162a
75
+ //# debugId=8e279caa-2a6c-5171-8561-ff4a3a6351e4
@@ -1 +1 @@
1
- {"version":3,"file":"styleguide.js","sources":["tools/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ResourceLink } from \"@modelcontextprotocol/sdk/types.js\";\nimport z from \"zod\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatStyleguideListAsMarkdown,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListStyleguidesTool(server: McpServer) {\n server.registerTool(\n \"list-styleguides\",\n {\n title: \"List styleguides\",\n description: \"List all accessible styleguides as resource links\",\n inputSchema: {\n responseType: z\n .enum([\"markdown\", \"resource_links\"])\n .default(\"markdown\"),\n },\n },\n async ({ responseType }, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const styleguides = await listStyleguides(credentials);\n\n if (styleguides.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"There are no accessible styleguides. Check your auth credentials and make sure you have at least one styleguide in zeroheight.\",\n },\n ],\n };\n }\n\n if (responseType === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatStyleguideListAsMarkdown(styleguides),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n const resourceLinks: ResourceLink[] = styleguides.map((styleguide) => ({\n type: \"resource_link\",\n uri: `zeroheight://styleguide/${styleguide.id}`,\n name: styleguide.name ?? DEFAULT_NAME,\n _meta: {\n shareId: styleguide.share_id,\n id: styleguide.id,\n },\n mimeType: \"application/json\",\n description: \"Navigation structure for the styleguide\",\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: `There are available ${styleguides.length} styleguides`,\n },\n ...resourceLinks,\n ],\n };\n },\n );\n}\n\nexport function registerGetStyleguideTreeTool(server: McpServer) {\n server.registerTool(\n \"get-styleguide-tree\",\n {\n title: \"Get styleguide tree\",\n description:\n \"A navigation hierarchy for a styleguide with top-level navigation, categories, pages and tabs\",\n inputSchema: {\n styleguideId: z.number().int().positive(),\n },\n },\n async ({ styleguideId }, { authInfo }) => {\n try {\n const credentials = await getCredentials(authInfo);\n const tree = await getStyleguideTree(credentials, styleguideId);\n const formattedTree = formatTreeAsJson(tree);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(formattedTree, null, 2),\n },\n ],\n };\n } catch {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not get the navigation tree for this styleguide.\",\n },\n ],\n };\n }\n },\n );\n}\n"],"names":[],"mappings":"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","debug_id":"2a6ef93c-fcbe-5349-83c7-e3ce2646162a"}
1
+ {"version":3,"file":"styleguide.js","sources":["tools/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport z from \"zod\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatStyleguideListAsMarkdown,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListStyleguidesTool(server: McpServer) {\n server.registerTool(\n \"list-styleguides\",\n {\n title: \"List styleguides\",\n description: \"List all accessible styleguides as markdown\",\n inputSchema: {},\n },\n async (_, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const styleguides = await listStyleguides(credentials);\n\n if (styleguides.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"There are no accessible styleguides. Check your auth credentials and make sure you have at least one styleguide in zeroheight.\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: formatStyleguideListAsMarkdown(styleguides),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n\nexport function registerGetStyleguideTreeTool(server: McpServer) {\n server.registerTool(\n \"get-styleguide-tree\",\n {\n title: \"Get styleguide tree\",\n description:\n \"A navigation hierarchy for a styleguide with top-level navigation, categories, pages and tabs\",\n inputSchema: {\n styleguideId: z.number().int().positive(),\n },\n },\n async ({ styleguideId }, { authInfo }) => {\n try {\n const credentials = await getCredentials(authInfo);\n const tree = await getStyleguideTree(credentials, styleguideId);\n const formattedTree = formatTreeAsJson(tree);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(formattedTree, null, 2),\n },\n ],\n };\n } catch {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not get the navigation tree for this styleguide.\",\n },\n ],\n };\n }\n },\n );\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAGH,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAEL,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,6CAA6C;QAC1D,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxB,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;QAEvD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gIAAgI;qBACvI;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8BAA8B,CAAC,WAAW,CAAC;oBACjD,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,+FAA+F;QACjG,WAAW,EAAE;YACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;SAC1C;KACF,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAE7C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC7C;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,wDAAwD;qBAC/D;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"8e279caa-2a6c-5171-8561-ff4a3a6351e4"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeroheight/mcp-server",
3
- "version": "1.3.0",
3
+ "version": "2.0.0",
4
4
  "description": "MCP server for zeroheight",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,64 +0,0 @@
1
- /**
2
- * Page Resources
3
- */
4
-
5
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4a5c5d30-f2cc-5f45-9d88-37c63f6066a6")}catch(e){}}();
6
- import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
7
- import { listStyleguideResources } from "./styleguide.js";
8
- import { getPage, listPages } from "../api/page.js";
9
- import { formatPageAsMarkdown } from "../common/formatters/page.js";
10
- import { getCredentials } from "../common/credentials.js";
11
- export function registerListPagesResource(server) {
12
- server.registerResource("styleguide-page-list", new ResourceTemplate("zeroheight://styleguide/{styleguideId}/page-list", {
13
- list: listStyleguideResources,
14
- }), {
15
- title: "List the pages for a styleguide",
16
- description: "List all pages in a styleguide",
17
- mimeType: "text/markdown",
18
- }, async (uri, { styleguideId }, { authInfo }) => {
19
- const selectedId = Array.isArray(styleguideId)
20
- ? styleguideId[0]
21
- : styleguideId;
22
- const parsedStyleguideId = parseInt(selectedId, 10);
23
- const credentials = await getCredentials(authInfo);
24
- const pages = await listPages(credentials, parsedStyleguideId);
25
- return {
26
- contents: [
27
- {
28
- uri: uri.href,
29
- text: pages
30
- .map((page) => `- ${page.name} (id: ${page.id})`)
31
- .join("\n"),
32
- },
33
- ],
34
- };
35
- });
36
- }
37
- export function registerPageResource(server) {
38
- server.registerResource("page", new ResourceTemplate("zeroheight://styleguide/{styleguideId}/page/{pageId}", {
39
- list: undefined,
40
- }), {
41
- title: "Page",
42
- description: "Design system page",
43
- mimeType: "text/markdown",
44
- }, async (uri, { pageId }, { authInfo }) => {
45
- const selectedId = Array.isArray(pageId) ? pageId[0] : pageId;
46
- const parsedPageId = parseInt(selectedId, 10);
47
- const credentials = await getCredentials(authInfo);
48
- const page = await getPage(credentials, parsedPageId);
49
- if (!page) {
50
- throw new Error("Couldn't find the page");
51
- }
52
- return {
53
- contents: [
54
- {
55
- uri: uri.href,
56
- text: formatPageAsMarkdown(page),
57
- mimeType: "text/markdown",
58
- },
59
- ],
60
- };
61
- });
62
- }
63
- //# sourceMappingURL=page.js.map
64
- //# debugId=4a5c5d30-f2cc-5f45-9d88-37c63f6066a6
@@ -1 +0,0 @@
1
- {"version":3,"file":"page.js","sources":["resources/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Resources\n */\n\nimport {\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { listStyleguideResources } from \"./styleguide.js\";\nimport { getPage, listPages } from \"../api/page.js\";\nimport { formatPageAsMarkdown } from \"../common/formatters/page.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListPagesResource(server: McpServer) {\n server.registerResource(\n \"styleguide-page-list\",\n new ResourceTemplate(\"zeroheight://styleguide/{styleguideId}/page-list\", {\n list: listStyleguideResources,\n }),\n {\n title: \"List the pages for a styleguide\",\n description: \"List all pages in a styleguide\",\n mimeType: \"text/markdown\",\n },\n async (uri, { styleguideId }, { authInfo }) => {\n const selectedId = Array.isArray(styleguideId)\n ? styleguideId[0]\n : styleguideId;\n\n const parsedStyleguideId = parseInt(selectedId, 10);\n const credentials = await getCredentials(authInfo);\n const pages = await listPages(credentials, parsedStyleguideId);\n\n return {\n contents: [\n {\n uri: uri.href,\n text: pages\n .map((page) => `- ${page.name} (id: ${page.id})`)\n .join(\"\\n\"),\n },\n ],\n };\n },\n );\n}\n\nexport function registerPageResource(server: McpServer) {\n server.registerResource(\n \"page\",\n new ResourceTemplate(\n \"zeroheight://styleguide/{styleguideId}/page/{pageId}\",\n {\n list: undefined,\n },\n ),\n {\n title: \"Page\",\n description: \"Design system page\",\n mimeType: \"text/markdown\",\n },\n async (uri, { pageId }, { authInfo }) => {\n const selectedId = Array.isArray(pageId) ? pageId[0] : pageId;\n const parsedPageId = parseInt(selectedId, 10);\n const credentials = await getCredentials(authInfo);\n const page = await getPage(credentials, parsedPageId);\n\n if (!page) {\n throw new Error(\"Couldn't find the page\");\n }\n\n return {\n contents: [\n {\n uri: uri.href,\n text: formatPageAsMarkdown(page),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAEH,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,gBAAgB,CACrB,sBAAsB,EACtB,IAAI,gBAAgB,CAAC,kDAAkD,EAAE;QACvE,IAAI,EAAE,uBAAuB;KAC9B,CAAC,EACF;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5C,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,YAAY,CAAC;QAEjB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAE/D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,KAAK;yBACR,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,GAAG,CAAC;yBAChD,IAAI,CAAC,IAAI,CAAC;iBACd;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,gBAAgB,CACrB,MAAM,EACN,IAAI,gBAAgB,CAClB,sDAAsD,EACtD;QACE,IAAI,EAAE,SAAS;KAChB,CACF,EACD;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAEtD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;oBAChC,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"4a5c5d30-f2cc-5f45-9d88-37c63f6066a6"}
@@ -1,81 +0,0 @@
1
- /**
2
- * Styleguide Resources
3
- */
4
-
5
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="522aedc5-1222-58f7-a417-ad02a0f76dbb")}catch(e){}}();
6
- import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
7
- import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
8
- import { DEFAULT_NAME, formatTreeAsJson, } from "../common/formatters/styleguide.js";
9
- import { getCredentials } from "../common/credentials.js";
10
- export function registerStyleguideListResource(server) {
11
- server.registerResource("styleguide-list", "zeroheight://styleguide/list", {
12
- title: "Styleguide list",
13
- description: "List all accessible styleguides",
14
- mimeType: "application/json",
15
- }, async (uri, { authInfo }) => {
16
- const credentials = await getCredentials(authInfo);
17
- const styleguideList = await listStyleguides(credentials);
18
- const styleguideResources = styleguideList.map((styleguide) => ({
19
- id: styleguide.id,
20
- name: styleguide.name ?? DEFAULT_NAME,
21
- }));
22
- return {
23
- contents: [
24
- {
25
- uri: uri.href,
26
- text: JSON.stringify(styleguideResources, null, 2),
27
- mimeType: "application/json",
28
- },
29
- ],
30
- };
31
- });
32
- }
33
- export function registerStyleguideResource(server) {
34
- server.registerResource("styleguide", new ResourceTemplate("zeroheight://styleguide/{styleguideId}", {
35
- list: undefined,
36
- }), {
37
- title: "Styleguide Navigation",
38
- description: "Access the styleguide's navigation including categories, pages and tabs",
39
- }, async (uri, { styleguideId }, { authInfo }) => {
40
- const selectedId = Array.isArray(styleguideId)
41
- ? styleguideId[0]
42
- : styleguideId;
43
- const parsedStyleguideId = parseInt(selectedId, 10);
44
- // TODO: Make endpoint to get basic styleguide info instead
45
- const credentials = await getCredentials(authInfo);
46
- const styleguideList = await listStyleguides(credentials);
47
- const currentStyleguide = styleguideList.find((styleguide) => styleguide.id === parsedStyleguideId);
48
- if (!currentStyleguide) {
49
- return { contents: [] };
50
- }
51
- const tree = await getStyleguideTree(credentials, parsedStyleguideId);
52
- const formattedTree = formatTreeAsJson(tree);
53
- return {
54
- contents: [
55
- {
56
- mimeType: "application/json",
57
- uri: uri.href,
58
- text: JSON.stringify(formattedTree, null, 2),
59
- },
60
- ],
61
- };
62
- });
63
- }
64
- /** Utils */
65
- export const listStyleguideResources = async ({ authInfo, }) => {
66
- const credentials = await getCredentials(authInfo);
67
- const styleguideList = await listStyleguides(credentials);
68
- const resources = styleguideList.map((styleguide) => ({
69
- uri: `zeroheight://styleguide/${styleguide.id}`,
70
- name: `${styleguide.name ?? DEFAULT_NAME}`,
71
- _meta: {
72
- id: styleguide.id,
73
- shareId: styleguide.share_id,
74
- },
75
- }));
76
- return {
77
- resources,
78
- };
79
- };
80
- //# sourceMappingURL=styleguide.js.map
81
- //# debugId=522aedc5-1222-58f7-a417-ad02a0f76dbb
@@ -1 +0,0 @@
1
- {"version":3,"file":"styleguide.js","sources":["resources/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Resources\n */\n\nimport {\n ListResourcesCallback,\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerStyleguideListResource(server: McpServer) {\n server.registerResource(\n \"styleguide-list\",\n \"zeroheight://styleguide/list\",\n {\n title: \"Styleguide list\",\n description: \"List all accessible styleguides\",\n mimeType: \"application/json\",\n },\n async (uri, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n const styleguideResources = styleguideList.map((styleguide) => ({\n id: styleguide.id,\n name: styleguide.name ?? DEFAULT_NAME,\n }));\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(styleguideResources, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n }\n );\n}\n\nexport function registerStyleguideResource(server: McpServer) {\n server.registerResource(\n \"styleguide\",\n new ResourceTemplate(\"zeroheight://styleguide/{styleguideId}\", {\n list: undefined,\n }),\n {\n title: \"Styleguide Navigation\",\n description:\n \"Access the styleguide's navigation including categories, pages and tabs\",\n },\n async (uri, { styleguideId }, { authInfo }) => {\n const selectedId = Array.isArray(styleguideId)\n ? styleguideId[0]\n : styleguideId;\n\n const parsedStyleguideId = parseInt(selectedId, 10);\n\n // TODO: Make endpoint to get basic styleguide info instead\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n\n const currentStyleguide = styleguideList.find(\n (styleguide) => styleguide.id === parsedStyleguideId\n );\n\n if (!currentStyleguide) {\n return { contents: [] };\n }\n\n const tree = await getStyleguideTree(credentials, parsedStyleguideId);\n\n const formattedTree = formatTreeAsJson(tree);\n\n return {\n contents: [\n {\n mimeType: \"application/json\",\n uri: uri.href,\n text: JSON.stringify(formattedTree, null, 2),\n },\n ],\n };\n }\n );\n}\n\n/** Utils */\n\nexport const listStyleguideResources: ListResourcesCallback = async ({\n authInfo,\n}) => {\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n const resources = styleguideList.map((styleguide) => ({\n uri: `zeroheight://styleguide/${styleguide.id}`,\n name: `${styleguide.name ?? DEFAULT_NAME}`,\n _meta: {\n id: styleguide.id,\n shareId: styleguide.share_id,\n },\n }));\n\n return {\n resources,\n };\n};\n"],"names":[],"mappings":"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","debug_id":"522aedc5-1222-58f7-a417-ad02a0f76dbb"}