@zeroheight/mcp-server 1.1.0 → 1.3.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 +7 -0
- package/dist/api/api.js +48 -11
- package/dist/api/api.js.map +1 -1
- package/dist/api/page.js +7 -8
- package/dist/api/page.js.map +1 -1
- package/dist/api/sentry.js +8 -3
- package/dist/api/sentry.js.map +1 -1
- package/dist/api/styleguide.js +11 -8
- package/dist/api/styleguide.js.map +1 -1
- package/dist/common/credentials.js +17 -2
- package/dist/common/credentials.js.map +1 -1
- package/dist/common/formatters/styleguide.js +31 -19
- package/dist/common/formatters/styleguide.js.map +1 -1
- package/dist/{index.js → mcp-server.js} +4 -25
- package/dist/mcp-server.js.map +1 -0
- package/dist/resources/page.js +10 -24
- package/dist/resources/page.js.map +1 -1
- package/dist/resources/styleguide.js +14 -24
- package/dist/resources/styleguide.js.map +1 -1
- package/dist/stdio.js +27 -0
- package/dist/stdio.js.map +1 -0
- package/dist/tools/page.js +24 -6
- package/dist/tools/page.js.map +1 -1
- package/dist/tools/styleguide.js +9 -6
- package/dist/tools/styleguide.js.map +1 -1
- package/package.json +16 -6
- package/dist/api/api.test.js +0 -16
- package/dist/api/api.test.js.map +0 -1
- package/dist/common/formatters/styleguide.test.js +0 -28
- package/dist/common/formatters/styleguide.test.js.map +0 -1
- package/dist/index.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
## Release notes
|
|
2
2
|
|
|
3
|
+
## [1.3.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.3.0) - 12th November 2025
|
|
4
|
+
|
|
5
|
+
- Only return published pages, categories and navigations to MCP clients
|
|
6
|
+
|
|
7
|
+
## [1.2.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.2.0) - 9th September 2025
|
|
8
|
+
|
|
9
|
+
- Reduce number of tokens used by `get-styleguide-tree`
|
|
3
10
|
|
|
4
11
|
## [1.1.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.1.0) - 20th August 2025
|
|
5
12
|
|
package/dist/api/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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]="
|
|
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]="f5f62ed6-e304-59a4-a788-c025be616649")}catch(e){}}();
|
|
3
3
|
import * as Sentry from "@sentry/node";
|
|
4
4
|
import { IncorrectScopeError, MaxRetriesError, UnauthorizedError, UnknownError, } from "./errors.js";
|
|
5
5
|
import packageJson from "../../package.json" with { type: "json" };
|
|
@@ -36,18 +36,24 @@ export async function request(path, credentials, init, search) {
|
|
|
36
36
|
}
|
|
37
37
|
const maxRetries = 3;
|
|
38
38
|
let retries = 0;
|
|
39
|
+
const headers = {
|
|
40
|
+
"X-API-CLIENT-NAME": "mcp-server",
|
|
41
|
+
"X-API-CLIENT-VERSION": packageJson.version,
|
|
42
|
+
"User-Agent": USER_AGENT,
|
|
43
|
+
"Content-Type": "application/json",
|
|
44
|
+
Accept: "application/json",
|
|
45
|
+
};
|
|
46
|
+
if (credentials.type === "jwt") {
|
|
47
|
+
headers["Authorization"] = `Bearer ${credentials.jwt}`;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
headers["X-API-CLIENT"] = credentials.client;
|
|
51
|
+
headers["X-API-KEY"] = credentials.token;
|
|
52
|
+
}
|
|
39
53
|
while (retries < maxRetries) {
|
|
40
54
|
const response = await fetch(url, {
|
|
41
55
|
...init,
|
|
42
|
-
headers
|
|
43
|
-
"X-API-CLIENT-NAME": "mcp-server",
|
|
44
|
-
"X-API-CLIENT": credentials.client,
|
|
45
|
-
"X-API-KEY": credentials.token,
|
|
46
|
-
"X-API-CLIENT-VERSION": packageJson.version,
|
|
47
|
-
"User-Agent": USER_AGENT,
|
|
48
|
-
"Content-Type": "application/json",
|
|
49
|
-
Accept: "application/json",
|
|
50
|
-
},
|
|
56
|
+
headers,
|
|
51
57
|
});
|
|
52
58
|
if (response.status === 401) {
|
|
53
59
|
console.error("Unauthorized response from API", {
|
|
@@ -79,5 +85,36 @@ export async function request(path, credentials, init, search) {
|
|
|
79
85
|
}
|
|
80
86
|
throw new MaxRetriesError();
|
|
81
87
|
}
|
|
88
|
+
export async function internalRequest(path, method, body) {
|
|
89
|
+
const url = getZeroheightURL();
|
|
90
|
+
url.pathname = "/api" + path;
|
|
91
|
+
if (process.env["NODE_ENV"] === "dev") {
|
|
92
|
+
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0";
|
|
93
|
+
}
|
|
94
|
+
const response = await fetch(url, {
|
|
95
|
+
method,
|
|
96
|
+
headers: {
|
|
97
|
+
"Content-Type": "application/json",
|
|
98
|
+
Accept: "application/json",
|
|
99
|
+
"User-Agent": USER_AGENT,
|
|
100
|
+
"X-API-KEY": process.env["INTERNAL_API_KEY"] || "",
|
|
101
|
+
},
|
|
102
|
+
body: JSON.stringify(body),
|
|
103
|
+
});
|
|
104
|
+
if (response.status < 200 || response.status >= 300) {
|
|
105
|
+
console.error("Internal API request failed", {
|
|
106
|
+
response: { status: response.status, body: await response.text() },
|
|
107
|
+
});
|
|
108
|
+
if (response.status === 401) {
|
|
109
|
+
throw new UnauthorizedError();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
Sentry.captureMessage(`Unknown error occurred making internal request to: ${url}`);
|
|
113
|
+
throw new UnknownError();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const responseJson = await response.json();
|
|
117
|
+
return responseJson;
|
|
118
|
+
}
|
|
82
119
|
//# sourceMappingURL=api.js.map
|
|
83
|
-
//# debugId=
|
|
120
|
+
//# debugId=f5f62ed6-e304-59a4-a788-c025be616649
|
package/dist/api/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":["api/api.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport {\n IncorrectScopeError,\n MaxRetriesError,\n UnauthorizedError,\n UnknownError,\n} from \"./errors.js\";\n\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nimport { Credentials } from \"../common/credentials.js\";\n\nconst API_PATH = \"/open_api/v2\";\nconst USER_AGENT = `zeroheight-mcp-server/${packageJson.version}`;\n\nexport enum ResponseStatus {\n Success = \"success\",\n Error = \"error\",\n Fail = \"fail\",\n}\n\n/**\n * Open API V2 Response format\n */\n\ninterface BaseResponse<T> {\n status: ResponseStatus;\n message: string;\n data: T;\n}\n\ninterface SuccessResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Success;\n}\n\ninterface FailResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Fail;\n}\n\ninterface ErrorResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Error;\n}\n\nexport type APIResponse<S = {}, F = {}, E = {}> =\n | SuccessResponse<S>\n | FailResponse<F>\n | ErrorResponse<E>;\n\n/**\n * Get the correct URL for production of development depending on the environment variable\n */\nexport function getZeroheightURL() {\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n return new URL(\"https://zeroheight.dev\");\n } else {\n return new URL(\"https://zeroheight.com\");\n }\n}\n\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function request<R>(\n path: string,\n credentials: Credentials,\n init: RequestInit,\n search?: URLSearchParams,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = API_PATH + path;\n if (search) {\n url.search = \"?\" + search.toString();\n }\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const maxRetries = 3;\n let retries = 0;\n\n
|
|
1
|
+
{"version":3,"file":"api.js","sources":["api/api.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport {\n IncorrectScopeError,\n MaxRetriesError,\n UnauthorizedError,\n UnknownError,\n} from \"./errors.js\";\n\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nimport { Credentials } from \"../common/credentials.js\";\n\nconst API_PATH = \"/open_api/v2\";\nconst USER_AGENT = `zeroheight-mcp-server/${packageJson.version}`;\n\nexport enum ResponseStatus {\n Success = \"success\",\n Error = \"error\",\n Fail = \"fail\",\n}\n\n/**\n * Open API V2 Response format\n */\n\ninterface BaseResponse<T> {\n status: ResponseStatus;\n message: string;\n data: T;\n}\n\ninterface SuccessResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Success;\n}\n\ninterface FailResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Fail;\n}\n\ninterface ErrorResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Error;\n}\n\nexport type APIResponse<S = {}, F = {}, E = {}> =\n | SuccessResponse<S>\n | FailResponse<F>\n | ErrorResponse<E>;\n\n/**\n * Get the correct URL for production of development depending on the environment variable\n */\nexport function getZeroheightURL() {\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n return new URL(\"https://zeroheight.dev\");\n } else {\n return new URL(\"https://zeroheight.com\");\n }\n}\n\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function request<R>(\n path: string,\n credentials: Credentials,\n init: RequestInit,\n search?: URLSearchParams,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = API_PATH + path;\n if (search) {\n url.search = \"?\" + search.toString();\n }\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const maxRetries = 3;\n let retries = 0;\n\n const headers: Record<string, string> = {\n \"X-API-CLIENT-NAME\": \"mcp-server\",\n \"X-API-CLIENT-VERSION\": packageJson.version,\n \"User-Agent\": USER_AGENT,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n if (credentials.type === \"jwt\") {\n headers[\"Authorization\"] = `Bearer ${credentials.jwt}`;\n } else {\n headers[\"X-API-CLIENT\"] = credentials.client;\n headers[\"X-API-KEY\"] = credentials.token;\n }\n\n while (retries < maxRetries) {\n const response = await fetch(url, {\n ...init,\n headers,\n });\n\n if (response.status === 401) {\n console.error(\"Unauthorized response from API\", {\n response: { status: response.status, body: await response.text() },\n });\n throw new UnauthorizedError();\n } else if (response.status === 429) {\n retries++;\n const responseData = await response.json();\n const waitTime = responseData.data.reset_time * 1000 - Date.now();\n await sleep(waitTime);\n continue;\n } else if (response.status < 200 || response.status >= 300) {\n console.error(\"API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 403) {\n throw new IncorrectScopeError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n }\n\n throw new MaxRetriesError();\n}\n\nexport async function internalRequest<R>(\n path: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n body: any,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = \"/api\" + path;\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": USER_AGENT,\n \"X-API-KEY\": process.env[\"INTERNAL_API_KEY\"] || \"\",\n },\n body: JSON.stringify(body),\n });\n\n if (response.status < 200 || response.status >= 300) {\n console.error(\"Internal API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 401) {\n throw new UnauthorizedError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making internal request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n}\n"],"names":[],"mappings":"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","debug_id":"f5f62ed6-e304-59a4-a788-c025be616649"}
|
package/dist/api/page.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
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]="
|
|
3
|
-
import { getCredentialsFromEnvironment } from "../common/credentials.js";
|
|
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]="97ac3c8e-e27e-5358-8ee5-253e2b44406b")}catch(e){}}();
|
|
4
3
|
import { request } from "./api.js";
|
|
5
4
|
import { UnknownError } from "./errors.js";
|
|
6
5
|
import { captureException } from "../common/errors.js";
|
|
7
|
-
export async function listPages(styleguideId, optionalParams = {}) {
|
|
6
|
+
export async function listPages(credentials, styleguideId, optionalParams = {}) {
|
|
8
7
|
try {
|
|
9
|
-
const
|
|
10
|
-
|
|
8
|
+
const searchParams = new URLSearchParams({
|
|
9
|
+
show_hidden: "false",
|
|
10
|
+
});
|
|
11
11
|
if (optionalParams.releaseId) {
|
|
12
12
|
searchParams.set("release_id", optionalParams.releaseId.toString());
|
|
13
13
|
}
|
|
@@ -27,9 +27,8 @@ export async function listPages(styleguideId, optionalParams = {}) {
|
|
|
27
27
|
return [];
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
export async function getPage(pageId, optionalParams = {}) {
|
|
30
|
+
export async function getPage(credentials, pageId, optionalParams = {}) {
|
|
31
31
|
try {
|
|
32
|
-
const credentials = getCredentialsFromEnvironment();
|
|
33
32
|
const searchParams = new URLSearchParams();
|
|
34
33
|
if (optionalParams.releaseId) {
|
|
35
34
|
searchParams.set("release_id", optionalParams.releaseId.toString());
|
|
@@ -48,4 +47,4 @@ export async function getPage(pageId, optionalParams = {}) {
|
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
//# sourceMappingURL=page.js.map
|
|
51
|
-
//# debugId=
|
|
50
|
+
//# debugId=97ac3c8e-e27e-5358-8ee5-253e2b44406b
|
package/dist/api/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sources":["api/page.ts"],"sourceRoot":"/","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"page.js","sources":["api/page.ts"],"sourceRoot":"/","sourcesContent":["import {\n Credentials,\n} from \"../common/credentials.js\";\nimport { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport { Page, PageListItem } from \"./types/page.js\";\nimport { captureException } from \"../common/errors.js\";\n\ninterface PageListSuccessResponse {\n pages: PageListItem[];\n}\n\ninterface PageListOptionalParams {\n searchTerm: string;\n releaseId: number;\n}\n\nexport async function listPages(\n credentials: Credentials,\n styleguideId: number,\n optionalParams: Partial<PageListOptionalParams> = {},\n) {\n try {\n const searchParams = new URLSearchParams({\n show_hidden: \"false\",\n });\n\n if (optionalParams.releaseId) {\n searchParams.set(\"release_id\", optionalParams.releaseId.toString());\n }\n\n if (optionalParams.searchTerm) {\n searchParams.set(\"search\", optionalParams.searchTerm);\n }\n\n const response = await request<\n APIResponse<PageListSuccessResponse, {}, {}>\n >(\n `/styleguides/${styleguideId}/pages`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n );\n\n if (\"pages\" in response.data) {\n return response.data.pages;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n\ninterface PageSuccessResponse {\n page: Page;\n}\n\ninterface PageOptionalParams {\n releaseId: number;\n}\n\nexport async function getPage(\n credentials: Credentials,\n pageId: number | string,\n optionalParams: Partial<PageOptionalParams> = {},\n) {\n try {\n const searchParams = new URLSearchParams();\n\n if (optionalParams.releaseId) {\n searchParams.set(\"release_id\", optionalParams.releaseId.toString());\n }\n\n const response = await request<APIResponse<PageSuccessResponse, {}, {}>>(\n `/pages/${pageId}`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n );\n\n if (\"page\" in response.data) {\n return response.data.page;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return null;\n }\n}\n"],"names":[],"mappings":";;AAGA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAWvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,WAAwB,EACxB,YAAoB,EACpB,iBAAkD,EAAE;IAEpD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;YACvC,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QAEH,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;YAC9B,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,YAAY,QAAQ,EACpC,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,WAAwB,EACxB,MAAuB,EACvB,iBAA8C,EAAE;IAEhD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAE3C,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,UAAU,MAAM,EAAE,EAClB,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","debug_id":"97ac3c8e-e27e-5358-8ee5-253e2b44406b"}
|
package/dist/api/sentry.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
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]="
|
|
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]="0eb379a8-8e6d-5b39-b1bb-86921b7d2d15")}catch(e){}}();
|
|
3
3
|
import * as Sentry from "@sentry/node";
|
|
4
4
|
export function initSentry() {
|
|
5
|
+
const sentryDSN = process.env.SENTRY_DSN;
|
|
6
|
+
if (!sentryDSN) {
|
|
7
|
+
console.error("Sentry DSN is not set");
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
5
10
|
Sentry.init({
|
|
6
11
|
environment: process.env.NODE_ENV ?? "production",
|
|
7
|
-
dsn:
|
|
12
|
+
dsn: sentryDSN,
|
|
8
13
|
sendDefaultPii: true,
|
|
9
14
|
tracesSampleRate: 1.0,
|
|
10
15
|
});
|
|
11
16
|
}
|
|
12
17
|
//# sourceMappingURL=sentry.js.map
|
|
13
|
-
//# debugId=
|
|
18
|
+
//# debugId=0eb379a8-8e6d-5b39-b1bb-86921b7d2d15
|
package/dist/api/sentry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry.js","sources":["api/sentry.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\n\nexport function initSentry() {\n Sentry.init({\n environment: process.env.NODE_ENV ?? \"production\",\n dsn:
|
|
1
|
+
{"version":3,"file":"sentry.js","sources":["api/sentry.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\n\nexport function initSentry() {\n const sentryDSN = process.env.SENTRY_DSN;\n\n if (!sentryDSN) {\n console.error(\"Sentry DSN is not set\");\n return;\n }\n\n Sentry.init({\n environment: process.env.NODE_ENV ?? \"production\",\n dsn: sentryDSN,\n sendDefaultPii: true,\n tracesSampleRate: 1.0,\n });\n}\n"],"names":[],"mappings":";;AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,UAAU;IACxB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAEzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC;QACV,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,YAAY;QACjD,GAAG,EAAE,SAAS;QACd,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,GAAG;KACtB,CAAC,CAAC;AACL,CAAC","debug_id":"0eb379a8-8e6d-5b39-b1bb-86921b7d2d15"}
|
package/dist/api/styleguide.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
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]="
|
|
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]="e5eec58f-0a29-5ede-91ca-d9450e4f4bc2")}catch(e){}}();
|
|
3
3
|
import { request } from "./api.js";
|
|
4
4
|
import { UnknownError } from "./errors.js";
|
|
5
|
-
import { getCredentialsFromEnvironment } from "../common/credentials.js";
|
|
6
5
|
import { captureException } from "../common/errors.js";
|
|
7
|
-
export async function listStyleguides() {
|
|
6
|
+
export async function listStyleguides(credentials) {
|
|
8
7
|
try {
|
|
9
|
-
const credentials = getCredentialsFromEnvironment();
|
|
10
8
|
const response = await request("/styleguides", credentials, {
|
|
11
9
|
method: "GET",
|
|
12
10
|
});
|
|
13
11
|
if ("styleguides" in response.data) {
|
|
12
|
+
if (credentials.type === "jwt") {
|
|
13
|
+
return response.data.styleguides.filter((sg) => sg.id === credentials.styleguideId);
|
|
14
|
+
}
|
|
14
15
|
return response.data.styleguides;
|
|
15
16
|
}
|
|
16
17
|
throw new UnknownError();
|
|
@@ -20,12 +21,14 @@ export async function listStyleguides() {
|
|
|
20
21
|
return [];
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
|
-
export async function getStyleguideTree(id) {
|
|
24
|
+
export async function getStyleguideTree(credentials, id) {
|
|
24
25
|
try {
|
|
25
|
-
const
|
|
26
|
+
const searchParams = new URLSearchParams({
|
|
27
|
+
show_hidden: "false",
|
|
28
|
+
});
|
|
26
29
|
const response = await request(`/styleguides/${id}/tree`, credentials, {
|
|
27
30
|
method: "GET",
|
|
28
|
-
});
|
|
31
|
+
}, searchParams);
|
|
29
32
|
if ("tree" in response.data) {
|
|
30
33
|
return response.data.tree;
|
|
31
34
|
}
|
|
@@ -38,4 +41,4 @@ export async function getStyleguideTree(id) {
|
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
//# sourceMappingURL=styleguide.js.map
|
|
41
|
-
//# debugId=
|
|
44
|
+
//# debugId=e5eec58f-0a29-5ede-91ca-d9450e4f4bc2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styleguide.js","sources":["api/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["api/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport { Credentials } from \"../common/credentials.js\";\nimport {\n CategoryNode,\n NavigationNode,\n PageNode,\n Styleguide,\n} from \"./types/styleguide.js\";\nimport { captureException } from \"../common/errors.js\";\n\ninterface StyleguideListSuccessResponse {\n styleguides: Styleguide[];\n}\n\nexport async function listStyleguides(credentials: Credentials) {\n try {\n const response = await request<\n APIResponse<StyleguideListSuccessResponse, {}, {}>\n >(\"/styleguides\", credentials, {\n method: \"GET\",\n });\n\n if (\"styleguides\" in response.data) {\n if (credentials.type === \"jwt\") {\n return response.data.styleguides.filter(\n (sg) => sg.id === credentials.styleguideId,\n );\n }\n\n return response.data.styleguides;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n\ninterface SyleguideTreeSuccessResponse {\n tree: (PageNode | CategoryNode | NavigationNode)[];\n}\n\nexport async function getStyleguideTree(credentials: Credentials, id: number) {\n try {\n const searchParams = new URLSearchParams({\n show_hidden: \"false\",\n });\n\n const response = await request<\n APIResponse<SyleguideTreeSuccessResponse, {}, {}>\n >(\n `/styleguides/${id}/tree`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n );\n\n if (\"tree\" in response.data) {\n return response.data.tree;\n }\n\n console.error(response);\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAwB;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAE5B,cAAc,EAAE,WAAW,EAAE;YAC7B,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CACrC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC,YAAY,CAC3C,CAAC;YACJ,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAwB,EAAE,EAAU;IAC1E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;YACvC,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,EAAE,OAAO,EACzB,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAExB,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC","debug_id":"e5eec58f-0a29-5ede-91ca-d9450e4f4bc2"}
|
|
@@ -1,6 +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]="
|
|
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]="56e783cf-38bc-50a3-a885-f48fe491817a")}catch(e){}}();
|
|
3
3
|
import { MissingCredentialsError } from "./errors.js";
|
|
4
|
+
import { internalRequest } from "../api/api.js";
|
|
4
5
|
export function getCredentialsFromEnvironment() {
|
|
5
6
|
const token = process.env["ZEROHEIGHT_ACCESS_TOKEN"];
|
|
6
7
|
const client = process.env["ZEROHEIGHT_CLIENT_ID"];
|
|
@@ -8,9 +9,23 @@ export function getCredentialsFromEnvironment() {
|
|
|
8
9
|
throw new MissingCredentialsError();
|
|
9
10
|
}
|
|
10
11
|
return {
|
|
12
|
+
type: "client_token",
|
|
11
13
|
token,
|
|
12
14
|
client,
|
|
13
15
|
};
|
|
14
16
|
}
|
|
17
|
+
export async function getCredentials(authInfo) {
|
|
18
|
+
if (!authInfo) {
|
|
19
|
+
return getCredentialsFromEnvironment();
|
|
20
|
+
}
|
|
21
|
+
const res = await internalRequest("/mcp_url/exchange_token", "POST", {
|
|
22
|
+
token: authInfo.token,
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
type: "jwt",
|
|
26
|
+
jwt: res.jwt,
|
|
27
|
+
styleguideId: res.styleguide_id,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
15
30
|
//# sourceMappingURL=credentials.js.map
|
|
16
|
-
//# debugId=
|
|
31
|
+
//# debugId=56e783cf-38bc-50a3-a885-f48fe491817a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sources":["common/credentials.ts"],"sourceRoot":"/","sourcesContent":["import { MissingCredentialsError } from \"./errors.js\";\n\nexport
|
|
1
|
+
{"version":3,"file":"credentials.js","sources":["common/credentials.ts"],"sourceRoot":"/","sourcesContent":["import { AuthInfo } from \"@modelcontextprotocol/sdk/server/auth/types.js\";\nimport { MissingCredentialsError } from \"./errors.js\";\nimport { internalRequest } from \"../api/api.js\";\n\nexport type Credentials =\n | {\n type: \"client_token\";\n token: string;\n client: string;\n }\n | {\n type: \"jwt\";\n jwt: string;\n styleguideId: number;\n };\n\nexport function getCredentialsFromEnvironment(): Credentials {\n const token = process.env[\"ZEROHEIGHT_ACCESS_TOKEN\"];\n const client = process.env[\"ZEROHEIGHT_CLIENT_ID\"];\n if (!token || !client) {\n throw new MissingCredentialsError();\n }\n\n return {\n type: \"client_token\",\n token,\n client,\n };\n}\n\ninterface JwtResponse {\n jwt: string;\n styleguide_id: number;\n}\n\nexport async function getCredentials(\n authInfo?: AuthInfo,\n): Promise<Credentials> {\n if (!authInfo) {\n return getCredentialsFromEnvironment();\n }\n\n const res = await internalRequest<JwtResponse>(\n \"/mcp_url/exchange_token\",\n \"POST\",\n {\n token: authInfo.token,\n },\n );\n\n return {\n type: \"jwt\",\n jwt: res.jwt,\n styleguideId: res.styleguide_id,\n };\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAchD,MAAM,UAAU,6BAA6B;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,uBAAuB,EAAE,CAAC;IACtC,CAAC;IAED,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAmB;IAEnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,6BAA6B,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,eAAe,CAC/B,yBAAyB,EACzB,MAAM,EACN;QACE,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,YAAY,EAAE,GAAG,CAAC,aAAa;KAChC,CAAC;AACJ,CAAC","debug_id":"56e783cf-38bc-50a3-a885-f48fe491817a"}
|
|
@@ -1,24 +1,36 @@
|
|
|
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]="
|
|
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]="e119b376-ad17-5fb4-a522-859a0d32ee68")}catch(e){}}();
|
|
3
3
|
export const DEFAULT_NAME = "Unnamed styleguide";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
function getUniqueName(baseName, existingKeys) {
|
|
5
|
+
if (!existingKeys[baseName]) {
|
|
6
|
+
return baseName;
|
|
7
|
+
}
|
|
8
|
+
let counter = 1;
|
|
9
|
+
while (existingKeys[`${baseName} ${counter}`]) {
|
|
10
|
+
counter++;
|
|
11
|
+
}
|
|
12
|
+
return `${baseName} ${counter}`;
|
|
13
|
+
}
|
|
14
|
+
function processNode(node, parent) {
|
|
15
|
+
node.children?.forEach((child) => {
|
|
16
|
+
const childName = getUniqueName(child.name || child.type, parent);
|
|
17
|
+
if (child.type === "page") {
|
|
18
|
+
parent[childName] = { id: child.id, url: child.url };
|
|
19
|
+
}
|
|
20
|
+
else if (["category", "navigation"].includes(child.type)) {
|
|
21
|
+
parent[childName] = parent[childName] || {};
|
|
22
|
+
processNode(child, parent[childName]);
|
|
14
23
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function formatTreeAsJson(tree) {
|
|
27
|
+
const result = { tree: {} };
|
|
28
|
+
tree.forEach((node) => {
|
|
29
|
+
const baseName = getUniqueName(node.name || node.type, result.tree);
|
|
30
|
+
result.tree[baseName] = result.tree[baseName] || {};
|
|
31
|
+
processNode(node, result.tree[baseName]);
|
|
32
|
+
});
|
|
33
|
+
return result.tree;
|
|
22
34
|
}
|
|
23
35
|
export function formatStyleguideListAsMarkdown(styleguides) {
|
|
24
36
|
return styleguides
|
|
@@ -26,4 +38,4 @@ export function formatStyleguideListAsMarkdown(styleguides) {
|
|
|
26
38
|
.join("\n");
|
|
27
39
|
}
|
|
28
40
|
//# sourceMappingURL=styleguide.js.map
|
|
29
|
-
//# debugId=
|
|
41
|
+
//# debugId=e119b376-ad17-5fb4-a522-859a0d32ee68
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styleguide.js","sources":["common/formatters/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { NodeType, Styleguide } from \"../../api/types/styleguide.js\";\n\nexport const DEFAULT_NAME = \"Unnamed styleguide\";\n\
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["common/formatters/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { NodeType, Styleguide } from \"../../api/types/styleguide.js\";\n\nexport const DEFAULT_NAME = \"Unnamed styleguide\";\n\ninterface PageNode {\n id: number;\n url: string;\n}\n\ntype HierarchicalNode = {\n [key: string]: PageNode | HierarchicalNode;\n};\n\ninterface ConvertedTree {\n tree: HierarchicalNode;\n}\n\nfunction getUniqueName(\n baseName: string,\n existingKeys: Record<string, any>,\n): string {\n if (!existingKeys[baseName]) {\n return baseName;\n }\n\n let counter = 1;\n while (existingKeys[`${baseName} ${counter}`]) {\n counter++;\n }\n return `${baseName} ${counter}`;\n}\n\nfunction processNode(node: NodeType, parent: HierarchicalNode) {\n node.children?.forEach((child) => {\n const childName = getUniqueName(child.name || child.type, parent);\n\n if (child.type === \"page\") {\n parent[childName] = { id: child.id, url: child.url };\n } else if ([\"category\", \"navigation\"].includes(child.type)) {\n parent[childName] = parent[childName] || {};\n processNode(child, parent[childName] as HierarchicalNode);\n }\n });\n}\n\nexport function formatTreeAsJson(tree: NodeType[]): Record<string, any> {\n const result: ConvertedTree = { tree: {} };\n\n tree.forEach((node) => {\n const baseName = getUniqueName(node.name || node.type, result.tree);\n\n result.tree[baseName] = result.tree[baseName] || {};\n processNode(node, result.tree[baseName] as HierarchicalNode);\n });\n\n return result.tree;\n}\n\nexport function formatStyleguideListAsMarkdown(\n styleguides: Styleguide[],\n): string {\n return styleguides\n .map(\n (styleguide) =>\n `- ${styleguide.name ?? DEFAULT_NAME} (ID: ${styleguide.id})`,\n )\n .join(\"\\n\");\n}\n"],"names":[],"mappings":";;AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAejD,SAAS,aAAa,CACpB,QAAgB,EAChB,YAAiC;IAEjC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,YAAY,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,WAAW,CAAC,IAAc,EAAE,MAAwB;IAC3D,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAElE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACvD,CAAC;aAAM,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5C,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAqB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,MAAM,MAAM,GAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAE3C,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpD,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAqB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,WAAyB;IAEzB,OAAO,WAAW;SACf,GAAG,CACF,CAAC,UAAU,EAAE,EAAE,CACb,KAAK,UAAU,CAAC,IAAI,IAAI,YAAY,SAAS,UAAU,CAAC,EAAE,GAAG,CAChE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC","debug_id":"e119b376-ad17-5fb4-a522-859a0d32ee68"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
|
|
3
|
-
!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]="
|
|
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){}}();
|
|
4
3
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
4
|
import packageJson from "../package.json" with { type: "json" };
|
|
7
5
|
import { registerStyleguideListResource, registerStyleguideResource, } from "./resources/styleguide.js";
|
|
8
6
|
import { registerListPagesResource, registerPageResource, } from "./resources/page.js";
|
|
@@ -10,10 +8,7 @@ import { registerGetStyleguideTreeTool, registerListStyleguidesTool, } from "./t
|
|
|
10
8
|
import { registerGetPageTool, registerListPagesTool } from "./tools/page.js";
|
|
11
9
|
import { recommendSummarizePagePrompt } from "./prompts/page.js";
|
|
12
10
|
import { registerRecommendPagesPrompt } from "./prompts/styleguide.js";
|
|
13
|
-
|
|
14
|
-
import { captureException } from "./common/errors.js";
|
|
15
|
-
function createServer() {
|
|
16
|
-
// Create server instance
|
|
11
|
+
export function createServer() {
|
|
17
12
|
const server = new McpServer({
|
|
18
13
|
name: "zeroheight",
|
|
19
14
|
version: packageJson.version,
|
|
@@ -40,21 +35,5 @@ function createServer() {
|
|
|
40
35
|
[registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) => fn(server));
|
|
41
36
|
return server;
|
|
42
37
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const disableTelemetry = process.env["ZEROHEIGHT_MCP_DISABLE_TELEMETRY"];
|
|
46
|
-
if (!disableTelemetry) {
|
|
47
|
-
initSentry();
|
|
48
|
-
}
|
|
49
|
-
const server = createServer();
|
|
50
|
-
const transport = new StdioServerTransport();
|
|
51
|
-
await server.connect(transport);
|
|
52
|
-
console.error("zeroheight MCP Server running on stdio");
|
|
53
|
-
}
|
|
54
|
-
main().catch((error) => {
|
|
55
|
-
console.error("Fatal error in main():", error);
|
|
56
|
-
captureException(error);
|
|
57
|
-
process.exit(1);
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=index.js.map
|
|
60
|
-
//# debugId=c0c825d2-da83-500a-98f6-80086abbe1a6
|
|
38
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
39
|
+
//# debugId=86e0b46d-45ed-57dd-b85a-47e051420308
|
|
@@ -0,0 +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"}
|
package/dist/resources/page.js
CHANGED
|
@@ -2,27 +2,26 @@
|
|
|
2
2
|
* Page Resources
|
|
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]="
|
|
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
6
|
import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
-
import {
|
|
7
|
+
import { listStyleguideResources } from "./styleguide.js";
|
|
8
8
|
import { getPage, listPages } from "../api/page.js";
|
|
9
9
|
import { formatPageAsMarkdown } from "../common/formatters/page.js";
|
|
10
|
+
import { getCredentials } from "../common/credentials.js";
|
|
10
11
|
export function registerListPagesResource(server) {
|
|
11
12
|
server.registerResource("styleguide-page-list", new ResourceTemplate("zeroheight://styleguide/{styleguideId}/page-list", {
|
|
12
13
|
list: listStyleguideResources,
|
|
13
|
-
complete: {
|
|
14
|
-
styleguideId: completionForStyleduideId,
|
|
15
|
-
},
|
|
16
14
|
}), {
|
|
17
15
|
title: "List the pages for a styleguide",
|
|
18
16
|
description: "List all pages in a styleguide",
|
|
19
17
|
mimeType: "text/markdown",
|
|
20
|
-
}, async (uri, { styleguideId }) => {
|
|
18
|
+
}, async (uri, { styleguideId }, { authInfo }) => {
|
|
21
19
|
const selectedId = Array.isArray(styleguideId)
|
|
22
20
|
? styleguideId[0]
|
|
23
21
|
: styleguideId;
|
|
24
22
|
const parsedStyleguideId = parseInt(selectedId, 10);
|
|
25
|
-
const
|
|
23
|
+
const credentials = await getCredentials(authInfo);
|
|
24
|
+
const pages = await listPages(credentials, parsedStyleguideId);
|
|
26
25
|
return {
|
|
27
26
|
contents: [
|
|
28
27
|
{
|
|
@@ -38,18 +37,15 @@ export function registerListPagesResource(server) {
|
|
|
38
37
|
export function registerPageResource(server) {
|
|
39
38
|
server.registerResource("page", new ResourceTemplate("zeroheight://styleguide/{styleguideId}/page/{pageId}", {
|
|
40
39
|
list: undefined,
|
|
41
|
-
complete: {
|
|
42
|
-
styleguideId: completionForStyleduideId,
|
|
43
|
-
pageId: completionForStyleduideId,
|
|
44
|
-
},
|
|
45
40
|
}), {
|
|
46
41
|
title: "Page",
|
|
47
42
|
description: "Design system page",
|
|
48
43
|
mimeType: "text/markdown",
|
|
49
|
-
}, async (uri, { pageId }) => {
|
|
44
|
+
}, async (uri, { pageId }, { authInfo }) => {
|
|
50
45
|
const selectedId = Array.isArray(pageId) ? pageId[0] : pageId;
|
|
51
46
|
const parsedPageId = parseInt(selectedId, 10);
|
|
52
|
-
const
|
|
47
|
+
const credentials = await getCredentials(authInfo);
|
|
48
|
+
const page = await getPage(credentials, parsedPageId);
|
|
53
49
|
if (!page) {
|
|
54
50
|
throw new Error("Couldn't find the page");
|
|
55
51
|
}
|
|
@@ -64,15 +60,5 @@ export function registerPageResource(server) {
|
|
|
64
60
|
};
|
|
65
61
|
});
|
|
66
62
|
}
|
|
67
|
-
/** Utils */
|
|
68
|
-
export async function completionForPageId(searchTerm, context) {
|
|
69
|
-
const styleguideId = parseInt(context.arguments?.styleguideId ?? "", 10);
|
|
70
|
-
const pageList = await listPages(styleguideId);
|
|
71
|
-
const matchingPages = pageList.filter((page) => page.id
|
|
72
|
-
.toString()
|
|
73
|
-
.toLocaleLowerCase()
|
|
74
|
-
.includes(searchTerm.toLocaleLowerCase()));
|
|
75
|
-
return matchingPages.map((page) => page.id.toString());
|
|
76
|
-
}
|
|
77
63
|
//# sourceMappingURL=page.js.map
|
|
78
|
-
//# debugId=
|
|
64
|
+
//# debugId=4a5c5d30-f2cc-5f45-9d88-37c63f6066a6
|
|
@@ -1 +1 @@
|
|
|
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 {
|
|
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"}
|
|
@@ -2,17 +2,19 @@
|
|
|
2
2
|
* Styleguide Resources
|
|
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]="
|
|
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
6
|
import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
7
|
import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
|
|
8
8
|
import { DEFAULT_NAME, formatTreeAsJson, } from "../common/formatters/styleguide.js";
|
|
9
|
+
import { getCredentials } from "../common/credentials.js";
|
|
9
10
|
export function registerStyleguideListResource(server) {
|
|
10
11
|
server.registerResource("styleguide-list", "zeroheight://styleguide/list", {
|
|
11
12
|
title: "Styleguide list",
|
|
12
13
|
description: "List all accessible styleguides",
|
|
13
14
|
mimeType: "application/json",
|
|
14
|
-
}, async (uri) => {
|
|
15
|
-
const
|
|
15
|
+
}, async (uri, { authInfo }) => {
|
|
16
|
+
const credentials = await getCredentials(authInfo);
|
|
17
|
+
const styleguideList = await listStyleguides(credentials);
|
|
16
18
|
const styleguideResources = styleguideList.map((styleguide) => ({
|
|
17
19
|
id: styleguide.id,
|
|
18
20
|
name: styleguide.name ?? DEFAULT_NAME,
|
|
@@ -31,27 +33,22 @@ export function registerStyleguideListResource(server) {
|
|
|
31
33
|
export function registerStyleguideResource(server) {
|
|
32
34
|
server.registerResource("styleguide", new ResourceTemplate("zeroheight://styleguide/{styleguideId}", {
|
|
33
35
|
list: undefined,
|
|
34
|
-
complete: {
|
|
35
|
-
styleguideId: completionForStyleduideId,
|
|
36
|
-
},
|
|
37
36
|
}), {
|
|
38
37
|
title: "Styleguide Navigation",
|
|
39
38
|
description: "Access the styleguide's navigation including categories, pages and tabs",
|
|
40
|
-
}, async (uri, { styleguideId }) => {
|
|
41
|
-
console.log({ uri, styleguideId });
|
|
39
|
+
}, async (uri, { styleguideId }, { authInfo }) => {
|
|
42
40
|
const selectedId = Array.isArray(styleguideId)
|
|
43
41
|
? styleguideId[0]
|
|
44
42
|
: styleguideId;
|
|
45
|
-
console.log({ selectedId });
|
|
46
43
|
const parsedStyleguideId = parseInt(selectedId, 10);
|
|
47
44
|
// TODO: Make endpoint to get basic styleguide info instead
|
|
48
|
-
const
|
|
49
|
-
|
|
45
|
+
const credentials = await getCredentials(authInfo);
|
|
46
|
+
const styleguideList = await listStyleguides(credentials);
|
|
50
47
|
const currentStyleguide = styleguideList.find((styleguide) => styleguide.id === parsedStyleguideId);
|
|
51
48
|
if (!currentStyleguide) {
|
|
52
49
|
return { contents: [] };
|
|
53
50
|
}
|
|
54
|
-
const tree = await getStyleguideTree(parsedStyleguideId);
|
|
51
|
+
const tree = await getStyleguideTree(credentials, parsedStyleguideId);
|
|
55
52
|
const formattedTree = formatTreeAsJson(tree);
|
|
56
53
|
return {
|
|
57
54
|
contents: [
|
|
@@ -65,16 +62,9 @@ export function registerStyleguideResource(server) {
|
|
|
65
62
|
});
|
|
66
63
|
}
|
|
67
64
|
/** Utils */
|
|
68
|
-
export async
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
-
.toString()
|
|
72
|
-
.toLocaleLowerCase()
|
|
73
|
-
.includes(searchTerm.toLocaleLowerCase()));
|
|
74
|
-
return matchingStyleguides.map((styleguide) => styleguide.id.toString());
|
|
75
|
-
}
|
|
76
|
-
export async function listStyleguideResources() {
|
|
77
|
-
const styleguideList = await listStyleguides();
|
|
65
|
+
export const listStyleguideResources = async ({ authInfo, }) => {
|
|
66
|
+
const credentials = await getCredentials(authInfo);
|
|
67
|
+
const styleguideList = await listStyleguides(credentials);
|
|
78
68
|
const resources = styleguideList.map((styleguide) => ({
|
|
79
69
|
uri: `zeroheight://styleguide/${styleguide.id}`,
|
|
80
70
|
name: `${styleguide.name ?? DEFAULT_NAME}`,
|
|
@@ -86,6 +76,6 @@ export async function listStyleguideResources() {
|
|
|
86
76
|
return {
|
|
87
77
|
resources,
|
|
88
78
|
};
|
|
89
|
-
}
|
|
79
|
+
};
|
|
90
80
|
//# sourceMappingURL=styleguide.js.map
|
|
91
|
-
//# debugId=
|
|
81
|
+
//# debugId=522aedc5-1222-58f7-a417-ad02a0f76dbb
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styleguide.js","sources":["resources/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Resources\n */\n\nimport {\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\";\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) => {\n const styleguideList = await listStyleguides();\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 }
|
|
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"}
|
package/dist/stdio.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
!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]="22d37322-72ea-594f-9146-3798ffcae660")}catch(e){}}();
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { initSentry } from "./api/sentry.js";
|
|
6
|
+
import { captureException } from "./common/errors.js";
|
|
7
|
+
import { createServer } from "./mcp-server.js";
|
|
8
|
+
/**
|
|
9
|
+
* Start server on STDIO
|
|
10
|
+
*/
|
|
11
|
+
async function main() {
|
|
12
|
+
const disableTelemetry = process.env["ZEROHEIGHT_MCP_DISABLE_TELEMETRY"];
|
|
13
|
+
if (!disableTelemetry) {
|
|
14
|
+
initSentry();
|
|
15
|
+
}
|
|
16
|
+
const server = createServer();
|
|
17
|
+
const transport = new StdioServerTransport();
|
|
18
|
+
await server.connect(transport);
|
|
19
|
+
console.error("zeroheight MCP Server running on stdio");
|
|
20
|
+
}
|
|
21
|
+
main().catch((error) => {
|
|
22
|
+
console.error("Fatal error in main():", error);
|
|
23
|
+
captureException(error);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=stdio.js.map
|
|
27
|
+
//# debugId=22d37322-72ea-594f-9146-3798ffcae660
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sources":["stdio.ts"],"sourceRoot":"/","sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { initSentry } from \"./api/sentry.js\";\nimport { captureException } from \"./common/errors.js\";\nimport { createServer } from \"./mcp-server.js\";\n\n/**\n * Start server on STDIO\n */\nasync function main() {\n const disableTelemetry = process.env[\"ZEROHEIGHT_MCP_DISABLE_TELEMETRY\"];\n if (!disableTelemetry) {\n initSentry();\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n console.error(\"zeroheight MCP Server running on stdio\");\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error in main():\", error);\n captureException(error);\n process.exit(1);\n});\n"],"names":[],"mappings":";;;AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,UAAU,EAAE,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","debug_id":"22d37322-72ea-594f-9146-3798ffcae660"}
|
package/dist/tools/page.js
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
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]="
|
|
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){}}();
|
|
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";
|
|
9
|
+
import { getCredentials } from "../common/credentials.js";
|
|
9
10
|
export function registerListPagesTool(server) {
|
|
10
11
|
server.registerTool("list-pages", {
|
|
11
12
|
title: "List pages for a styleguide",
|
|
@@ -18,8 +19,24 @@ export function registerListPagesTool(server) {
|
|
|
18
19
|
.enum(["markdown", "resource_links"])
|
|
19
20
|
.default("markdown"),
|
|
20
21
|
},
|
|
21
|
-
}, async ({ styleguideId, releaseId, searchTerm, responseFormat }) => {
|
|
22
|
-
const
|
|
22
|
+
}, async ({ styleguideId, releaseId, searchTerm, responseFormat }, { authInfo }) => {
|
|
23
|
+
const credentials = await getCredentials(authInfo);
|
|
24
|
+
if (credentials.type === "jwt" &&
|
|
25
|
+
credentials.styleguideId !== styleguideId) {
|
|
26
|
+
return {
|
|
27
|
+
isError: true,
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: "text",
|
|
31
|
+
text: "You do not have access to this styleguide",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const pages = await listPages(credentials, styleguideId, {
|
|
37
|
+
releaseId,
|
|
38
|
+
searchTerm,
|
|
39
|
+
});
|
|
23
40
|
if (pages.length === 0) {
|
|
24
41
|
return {
|
|
25
42
|
isError: true,
|
|
@@ -73,8 +90,9 @@ export function registerGetPageTool(server) {
|
|
|
73
90
|
releaseId: z.number().int().optional(),
|
|
74
91
|
responseFormat: z.enum(["markdown", "json"]).default("json"),
|
|
75
92
|
},
|
|
76
|
-
}, async ({ pageId, responseFormat }) => {
|
|
77
|
-
const
|
|
93
|
+
}, async ({ pageId, responseFormat }, { authInfo }) => {
|
|
94
|
+
const credentials = await getCredentials(authInfo);
|
|
95
|
+
const page = await getPage(credentials, pageId);
|
|
78
96
|
if (!page) {
|
|
79
97
|
return {
|
|
80
98
|
isError: true,
|
|
@@ -109,4 +127,4 @@ export function registerGetPageTool(server) {
|
|
|
109
127
|
});
|
|
110
128
|
}
|
|
111
129
|
//# sourceMappingURL=page.js.map
|
|
112
|
-
//# debugId=
|
|
130
|
+
//# debugId=c19966f8-0d3f-578e-99c2-e0c61928da53
|
package/dist/tools/page.js.map
CHANGED
|
@@ -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\";\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 ({ styleguideId, releaseId, searchTerm, responseFormat }) => {\n const pages = await listPages(styleguideId, {
|
|
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"}
|
package/dist/tools/styleguide.js
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
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]="
|
|
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){}}();
|
|
6
6
|
import z from "zod";
|
|
7
7
|
import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
|
|
8
8
|
import { DEFAULT_NAME, formatStyleguideListAsMarkdown, formatTreeAsJson, } from "../common/formatters/styleguide.js";
|
|
9
|
+
import { getCredentials } from "../common/credentials.js";
|
|
9
10
|
export function registerListStyleguidesTool(server) {
|
|
10
11
|
server.registerTool("list-styleguides", {
|
|
11
12
|
title: "List styleguides",
|
|
@@ -15,8 +16,9 @@ export function registerListStyleguidesTool(server) {
|
|
|
15
16
|
.enum(["markdown", "resource_links"])
|
|
16
17
|
.default("markdown"),
|
|
17
18
|
},
|
|
18
|
-
}, async ({ responseType }) => {
|
|
19
|
-
const
|
|
19
|
+
}, async ({ responseType }, { authInfo }) => {
|
|
20
|
+
const credentials = await getCredentials(authInfo);
|
|
21
|
+
const styleguides = await listStyleguides(credentials);
|
|
20
22
|
if (styleguides.length === 0) {
|
|
21
23
|
return {
|
|
22
24
|
isError: true,
|
|
@@ -68,9 +70,10 @@ export function registerGetStyleguideTreeTool(server) {
|
|
|
68
70
|
inputSchema: {
|
|
69
71
|
styleguideId: z.number().int().positive(),
|
|
70
72
|
},
|
|
71
|
-
}, async ({ styleguideId }) => {
|
|
73
|
+
}, async ({ styleguideId }, { authInfo }) => {
|
|
72
74
|
try {
|
|
73
|
-
const
|
|
75
|
+
const credentials = await getCredentials(authInfo);
|
|
76
|
+
const tree = await getStyleguideTree(credentials, styleguideId);
|
|
74
77
|
const formattedTree = formatTreeAsJson(tree);
|
|
75
78
|
return {
|
|
76
79
|
content: [
|
|
@@ -95,4 +98,4 @@ export function registerGetStyleguideTreeTool(server) {
|
|
|
95
98
|
});
|
|
96
99
|
}
|
|
97
100
|
//# sourceMappingURL=styleguide.js.map
|
|
98
|
-
//# debugId=
|
|
101
|
+
//# debugId=2a6ef93c-fcbe-5349-83c7-e3ce2646162a
|
|
@@ -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\";\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 }) => {\n const styleguides = await listStyleguides();\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 }) => {\n try {\n const tree = await getStyleguideTree(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;;;AAIH,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeroheight/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "MCP server for zeroheight",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"mcp-server": "dist/
|
|
7
|
+
"mcp-server": "dist/stdio.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"build": "tsc && chmod 755 dist/
|
|
11
|
-
"dev": "tsc && chmod 755 dist/
|
|
12
|
-
"start": "node dist/
|
|
10
|
+
"build:local": "tsc -p tsconfig.stdio.json && chmod 755 dist/stdio.js && npm run sentry:sourcemaps:local",
|
|
11
|
+
"dev:local": "tsc -p tsconfig.stdio.json && chmod 755 dist/stdio.js",
|
|
12
|
+
"start:local": "node --env-file=local.env dist/stdio.js",
|
|
13
|
+
"build:remote": "tsc && chmod 755 dist/http.js",
|
|
14
|
+
"dev:remote:build": "tsc && chmod 755 dist/http.js",
|
|
15
|
+
"dev:remote:start": "node --env-file=remote.env dist/http.js",
|
|
16
|
+
"build": "npm run build:local",
|
|
17
|
+
"start:remote": "node --env-file=remote.env dist/http.js",
|
|
13
18
|
"cleanup": "rm -rf dist",
|
|
14
19
|
"lint": "prettier --write .",
|
|
15
20
|
"test": "rstest",
|
|
16
|
-
"sentry:sourcemaps": "
|
|
21
|
+
"sentry:sourcemaps:local": "./upload-sourcemaps.sh local",
|
|
22
|
+
"sentry:sourcemaps:remote": "./upload-sourcemaps.sh remote"
|
|
17
23
|
},
|
|
18
24
|
"engines": {
|
|
19
25
|
"node": ">= 22"
|
|
@@ -30,13 +36,17 @@
|
|
|
30
36
|
},
|
|
31
37
|
"homepage": "https://zeroheight.com",
|
|
32
38
|
"dependencies": {
|
|
39
|
+
"@codegenie/serverless-express": "^4.17.0",
|
|
33
40
|
"@modelcontextprotocol/sdk": "^1.17.1",
|
|
41
|
+
"@sentry/aws-serverless": "^10.17.0",
|
|
34
42
|
"@sentry/cli": "^2.52.0",
|
|
35
43
|
"@sentry/node": "^10.5.0",
|
|
44
|
+
"express": "^5.1.0",
|
|
36
45
|
"zod": "^3.25.76"
|
|
37
46
|
},
|
|
38
47
|
"devDependencies": {
|
|
39
48
|
"@rstest/core": "^0.1.2",
|
|
49
|
+
"@types/express": "^5.0.3",
|
|
40
50
|
"@types/node": "^24.2.0",
|
|
41
51
|
"prettier": "^3.6.2",
|
|
42
52
|
"typescript": "^5.9.2"
|
package/dist/api/api.test.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
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]="e553bd78-9f77-52cf-bf2e-5515e27caa19")}catch(e){}}();
|
|
3
|
-
import { expect, describe, it } from "@rstest/core";
|
|
4
|
-
import { getZeroheightURL } from "./api.js";
|
|
5
|
-
describe("getZeroheightURL", () => {
|
|
6
|
-
it("uses local development domain when NODE_ENV is dev", () => {
|
|
7
|
-
process.env.NODE_ENV = "dev";
|
|
8
|
-
expect(getZeroheightURL().toString()).toBe("https://zeroheight.dev/");
|
|
9
|
-
});
|
|
10
|
-
it("uses local development domain when NODE_ENV is dev", () => {
|
|
11
|
-
process.env.NODE_ENV = "production";
|
|
12
|
-
expect(getZeroheightURL().toString()).toBe("https://zeroheight.com/");
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
//# sourceMappingURL=api.test.js.map
|
|
16
|
-
//# debugId=e553bd78-9f77-52cf-bf2e-5515e27caa19
|
package/dist/api/api.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.test.js","sources":["api/api.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, describe, it } from \"@rstest/core\";\n\nimport { getZeroheightURL } from \"./api.js\";\n\ndescribe(\"getZeroheightURL\", () => {\n it(\"uses local development domain when NODE_ENV is dev\", () => {\n process.env.NODE_ENV = \"dev\";\n expect(getZeroheightURL().toString()).toBe(\"https://zeroheight.dev/\");\n });\n\n it(\"uses local development domain when NODE_ENV is dev\", () => {\n process.env.NODE_ENV = \"production\";\n expect(getZeroheightURL().toString()).toBe(\"https://zeroheight.com/\");\n });\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC7B,MAAM,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;QACpC,MAAM,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","debug_id":"e553bd78-9f77-52cf-bf2e-5515e27caa19"}
|
|
@@ -1,28 +0,0 @@
|
|
|
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]="6237a41b-e6e2-5647-b86e-9f4737194ade")}catch(e){}}();
|
|
3
|
-
import { expect, describe, it } from "@rstest/core";
|
|
4
|
-
import { formatStyleguideListAsMarkdown } from "./styleguide.js";
|
|
5
|
-
describe("formatStyleguideListAsMarkdown", () => {
|
|
6
|
-
describe("when list is empty", () => {
|
|
7
|
-
it("returns an empty string", () => {
|
|
8
|
-
expect(formatStyleguideListAsMarkdown([])).toBe("");
|
|
9
|
-
});
|
|
10
|
-
});
|
|
11
|
-
describe("when there's one styleguide", () => {
|
|
12
|
-
it("formats styleguide list as markdown list on one line", () => {
|
|
13
|
-
expect(formatStyleguideListAsMarkdown([
|
|
14
|
-
{ id: 1, name: "Styleguide 1", team_id: 1, share_id: "abc123" },
|
|
15
|
-
])).toBe("- Styleguide 1 (ID: 1)");
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
describe("when there's multiple styleguides", () => {
|
|
19
|
-
it("formats styleguide list as markdown list", () => {
|
|
20
|
-
expect(formatStyleguideListAsMarkdown([
|
|
21
|
-
{ id: 1, name: "Styleguide 1", team_id: 1, share_id: "abc123" },
|
|
22
|
-
{ id: 2, name: "Styleguide 2", team_id: 1, share_id: "xyz987" },
|
|
23
|
-
])).toBe("- Styleguide 1 (ID: 1)\n- Styleguide 2 (ID: 2)");
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
//# sourceMappingURL=styleguide.test.js.map
|
|
28
|
-
//# debugId=6237a41b-e6e2-5647-b86e-9f4737194ade
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styleguide.test.js","sources":["common/formatters/styleguide.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, describe, it } from \"@rstest/core\";\n\nimport { formatStyleguideListAsMarkdown } from \"./styleguide.js\";\n\ndescribe(\"formatStyleguideListAsMarkdown\", () => {\n describe(\"when list is empty\", () => {\n it(\"returns an empty string\", () => {\n expect(formatStyleguideListAsMarkdown([])).toBe(\"\");\n });\n });\n\n describe(\"when there's one styleguide\", () => {\n it(\"formats styleguide list as markdown list on one line\", () => {\n expect(\n formatStyleguideListAsMarkdown([\n { id: 1, name: \"Styleguide 1\", team_id: 1, share_id: \"abc123\" },\n ]),\n ).toBe(\"- Styleguide 1 (ID: 1)\");\n });\n });\n\n describe(\"when there's multiple styleguides\", () => {\n it(\"formats styleguide list as markdown list\", () => {\n expect(\n formatStyleguideListAsMarkdown([\n { id: 1, name: \"Styleguide 1\", team_id: 1, share_id: \"abc123\" },\n { id: 2, name: \"Styleguide 2\", team_id: 1, share_id: \"xyz987\" },\n ]),\n ).toBe(\"- Styleguide 1 (ID: 1)\\n- Styleguide 2 (ID: 2)\");\n });\n });\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAEjE,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,CACJ,8BAA8B,CAAC;gBAC7B,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE;aAChE,CAAC,CACH,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACjD,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CACJ,8BAA8B,CAAC;gBAC7B,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBAC/D,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE;aAChE,CAAC,CACH,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","debug_id":"6237a41b-e6e2-5647-b86e-9f4737194ade"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["index.ts"],"sourceRoot":"/","sourcesContent":["#!/usr/bin/env node\n\nimport * as Sentry from \"@sentry/node\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.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\";\nimport { initSentry } from \"./api/sentry.js\";\nimport { captureException } from \"./common/errors.js\";\n\nfunction createServer() {\n // Create server instance\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\n// Start server on STDIO\nasync function main() {\n const disableTelemetry = process.env[\"ZEROHEIGHT_MCP_DISABLE_TELEMETRY\"];\n if (!disableTelemetry) {\n initSentry();\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"zeroheight MCP Server running on stdio\");\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error in main():\", error);\n captureException(error);\n process.exit(1);\n});\n"],"names":[],"mappings":";;;AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,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;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,SAAS,YAAY;IACnB,yBAAyB;IACzB,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;AAED,wBAAwB;AACxB,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,UAAU,EAAE,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","debug_id":"c0c825d2-da83-500a-98f6-80086abbe1a6"}
|