Sign In

@zeroheight/mcp-server

Package Overview
Dependencies
Maintainers
1
Versions
20
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@zeroheight/mcp-server - npm Package Compare versions

Comparing version
2.6.0
to
2.7.0
+4
-0
CHANGELOG.md
## Release notes
## [2.7.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/2.7.0) - 1st April 2026
- Added `list-releases` tool to discover available releases for a styleguide
## [2.6.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/2.6.0) - 24th March 2026

@@ -4,0 +8,0 @@

+9
-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]="4a8750ba-4616-5bb8-aadc-1a6c400d4bd6")}catch(e){}}();
!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]="5187beba-eaa2-55de-86e1-1867179935f5")}catch(e){}}();
import * as Sentry from "@sentry/node";
import { IncorrectScopeError, MaxRetriesError, UnauthorizedError, UnknownError, } from "./errors.js";
import { IncorrectScopeError, MaxRetriesError, NotFoundError, UnauthorizedError, UnknownError, } from "./errors.js";
import packageJson from "../../package.json" with { type: "json" };

@@ -104,2 +104,5 @@ const API_PATH = "/open_api/v2";

}
else if (response.status === 404) {
throw new NotFoundError();
}
else {

@@ -138,2 +141,5 @@ Sentry.captureMessage(`Unknown error occurred making request to: ${url}`);

}
else if (response.status === 404) {
throw new NotFoundError();
}
else {

@@ -148,2 +154,2 @@ Sentry.captureMessage(`Unknown error occurred making internal request to: ${url}`);

//# sourceMappingURL=api.js.map
//# debugId=4a8750ba-4616-5bb8-aadc-1a6c400d4bd6
//# debugId=5187beba-eaa2-55de-86e1-1867179935f5

@@ -1,1 +0,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 ApiType {\n OpenApi = \"open_api\", // /open_api/v2\n Internal = \"internal\", // /api\n}\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 const zeroheightURL = process.env[\"ZEROHEIGHT_URL\"];\n if (zeroheightURL) {\n return new URL(zeroheightURL);\n }\n\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 apiType: ApiType = ApiType.OpenApi,\n metadata: { clientUserAgent?: string } = {},\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = (apiType === ApiType.OpenApi ? API_PATH : \"/api\") + 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 (metadata.clientUserAgent) {\n headers[\"X-MCP-Client-User-Agent\"] = metadata.clientUserAgent;\n }\n\n if (credentials.type === \"jwt\") {\n headers[\"Authorization\"] = `Bearer ${credentials.jwt}`;\n headers[\"X-API-CLIENT-NAME\"] = \"remote-mcp-server\";\n if (credentials.mcpAuthId) {\n headers[\"X-MCP-Auth-ID\"] = String(credentials.mcpAuthId);\n }\n } else if (credentials.type === \"oauth_jwt\") {\n headers[\"Authorization\"] = `Bearer ${credentials.jwt}`;\n headers[\"X-API-CLIENT-NAME\"] = `remote-mcp-server:${credentials.clientId}`;\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 let waitTime: number;\n if (apiType === ApiType.OpenApi) {\n const responseData = await response.json();\n waitTime = responseData.data.reset_time * 1000 - Date.now();\n } else {\n waitTime = 2 ** retries * 1000;\n }\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":"4a8750ba-4616-5bb8-aadc-1a6c400d4bd6"}
{"version":3,"file":"api.js","sources":["api/api.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport {\n IncorrectScopeError,\n MaxRetriesError,\n NotFoundError,\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 ApiType {\n OpenApi = \"open_api\", // /open_api/v2\n Internal = \"internal\", // /api\n}\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 const zeroheightURL = process.env[\"ZEROHEIGHT_URL\"];\n if (zeroheightURL) {\n return new URL(zeroheightURL);\n }\n\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 apiType: ApiType = ApiType.OpenApi,\n metadata: { clientUserAgent?: string } = {},\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = (apiType === ApiType.OpenApi ? API_PATH : \"/api\") + 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 (metadata.clientUserAgent) {\n headers[\"X-MCP-Client-User-Agent\"] = metadata.clientUserAgent;\n }\n\n if (credentials.type === \"jwt\") {\n headers[\"Authorization\"] = `Bearer ${credentials.jwt}`;\n headers[\"X-API-CLIENT-NAME\"] = \"remote-mcp-server\";\n if (credentials.mcpAuthId) {\n headers[\"X-MCP-Auth-ID\"] = String(credentials.mcpAuthId);\n }\n } else if (credentials.type === \"oauth_jwt\") {\n headers[\"Authorization\"] = `Bearer ${credentials.jwt}`;\n headers[\"X-API-CLIENT-NAME\"] = `remote-mcp-server:${credentials.clientId}`;\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 let waitTime: number;\n if (apiType === ApiType.OpenApi) {\n const responseData = await response.json();\n waitTime = responseData.data.reset_time * 1000 - Date.now();\n } else {\n waitTime = 2 ** retries * 1000;\n }\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 if (response.status === 404) {\n throw new NotFoundError();\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 if (response.status === 404) {\n throw new NotFoundError();\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":";;AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAInE,MAAM,QAAQ,GAAG,cAAc,CAAC;AAChC,MAAM,UAAU,GAAG,yBAAyB,WAAW,CAAC,OAAO,EAAE,CAAC;AAElE,MAAM,CAAN,IAAY,OAGX;AAHD,WAAY,OAAO;IACjB,+BAAoB,CAAA;IACpB,gCAAqB,CAAA;AACvB,CAAC,EAHW,OAAO,KAAP,OAAO,QAGlB;AAED,MAAM,CAAN,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,qCAAmB,CAAA;IACnB,iCAAe,CAAA;IACf,+BAAa,CAAA;AACf,CAAC,EAJW,cAAc,KAAd,cAAc,QAIzB;AA6BD;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACpD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;QACtC,OAAO,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,EAAU;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,WAAwB,EACxB,IAAiB,EACjB,MAAwB,EACxB,UAAmB,OAAO,CAAC,OAAO,EAClC,WAAyC,EAAE;IAE3C,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,GAAG,CAAC,QAAQ,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACxE,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,GAAG,GAAG,CAAC;IACpD,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,OAAO,GAA2B;QACtC,mBAAmB,EAAE,YAAY;QACjC,sBAAsB,EAAE,WAAW,CAAC,OAAO;QAC3C,YAAY,EAAE,UAAU;QACxB,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IAEF,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,CAAC,yBAAyB,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC;IAChE,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC/B,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,WAAW,CAAC,GAAG,EAAE,CAAC;QACvD,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;QACnD,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC5C,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,WAAW,CAAC,GAAG,EAAE,CAAC;QACvD,OAAO,CAAC,mBAAmB,CAAC,GAAG,qBAAqB,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;QAC7C,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IAC3C,CAAC;IAED,OAAO,OAAO,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,GAAG,IAAI;YACP,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE;gBAC9C,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE;aACnE,CAAC,CAAC;YACH,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;YACV,IAAI,QAAgB,CAAC;YACrB,IAAI,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3C,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC;YACjC,CAAC;YACD,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBAClC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE;aACnE,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,mBAAmB,EAAE,CAAC;YAClC,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,MAAM,IAAI,aAAa,EAAE,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,cAAc,CACnB,6CAA6C,GAAG,EAAE,CACnD,CAAC;gBACF,MAAM,IAAI,YAAY,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,eAAe,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,MAAyC,EACzC,IAAS;IAET,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,GAAG,CAAC,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IAE7B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,GAAG,GAAG,CAAC;IACpD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,YAAY,EAAE,UAAU;YACxB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;SACnD;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC3C,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE;SACnE,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,cAAc,CACnB,sDAAsD,GAAG,EAAE,CAC5D,CAAC;YACF,MAAM,IAAI,YAAY,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,YAAY,CAAC;AACtB,CAAC","debug_id":"5187beba-eaa2-55de-86e1-1867179935f5"}
!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]="57836e5e-d792-53e5-b891-29f50550cf87")}catch(e){}}();
!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]="209959a5-32d5-556f-9bdd-8e06b0de90bb")}catch(e){}}();
export class ApiError extends Error {

@@ -19,2 +19,12 @@ constructor(message) {

}
export class NotFoundError extends ApiError {
constructor() {
super("The requested resource was not found. It may have been deleted or you may not have access to it.");
}
}
export class InvalidCredentialsError extends ApiError {
constructor() {
super("Your credentials could not be verified. The token may be invalid or expired.");
}
}
export class UnknownError extends ApiError {

@@ -31,2 +41,2 @@ constructor() {

//# sourceMappingURL=errors.js.map
//# debugId=57836e5e-d792-53e5-b891-29f50550cf87
//# debugId=209959a5-32d5-556f-9bdd-8e06b0de90bb

@@ -1,1 +0,1 @@

{"version":3,"file":"errors.js","sources":["api/errors.ts"],"sourceRoot":"/","sourcesContent":["export class ApiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class UnauthorizedError extends ApiError {\n constructor() {\n super(\"Unauthorized. Please ensure you have added your credentials.\");\n }\n}\n\nexport class IncorrectScopeError extends ApiError {\n constructor() {\n super(\n \"The authentication token used does not have the correct scope. \\n\\nPlease create a new authentication token with the relevant scopes and then update your credentials.\",\n );\n }\n}\n\nexport class UnknownError extends ApiError {\n constructor() {\n super(\"An unknown error occurred while calling the zeroheight API\");\n }\n}\n\nexport class MaxRetriesError extends ApiError {\n constructor() {\n super(\"Max retries exceeded while calling the zeroheight API\");\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C;QACE,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACxE,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C;QACE,KAAK,CACH,wKAAwK,CACzK,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC;QACE,KAAK,CAAC,4DAA4D,CAAC,CAAC;IACtE,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C;QACE,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACjE,CAAC;CACF","debug_id":"57836e5e-d792-53e5-b891-29f50550cf87"}
{"version":3,"file":"errors.js","sources":["api/errors.ts"],"sourceRoot":"/","sourcesContent":["export class ApiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class UnauthorizedError extends ApiError {\n constructor() {\n super(\"Unauthorized. Please ensure you have added your credentials.\");\n }\n}\n\nexport class IncorrectScopeError extends ApiError {\n constructor() {\n super(\n \"The authentication token used does not have the correct scope. \\n\\nPlease create a new authentication token with the relevant scopes and then update your credentials.\",\n );\n }\n}\n\nexport class NotFoundError extends ApiError {\n constructor() {\n super(\n \"The requested resource was not found. It may have been deleted or you may not have access to it.\",\n );\n }\n}\n\nexport class InvalidCredentialsError extends ApiError {\n constructor() {\n super(\n \"Your credentials could not be verified. The token may be invalid or expired.\",\n );\n }\n}\n\nexport class UnknownError extends ApiError {\n constructor() {\n super(\"An unknown error occurred while calling the zeroheight API\");\n }\n}\n\nexport class MaxRetriesError extends ApiError {\n constructor() {\n super(\"Max retries exceeded while calling the zeroheight API\");\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C;QACE,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACxE,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C;QACE,KAAK,CACH,wKAAwK,CACzK,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,QAAQ;IACzC;QACE,KAAK,CACH,kGAAkG,CACnG,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,QAAQ;IACnD;QACE,KAAK,CACH,8EAA8E,CAC/E,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC;QACE,KAAK,CAAC,4DAA4D,CAAC,CAAC;IACtE,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C;QACE,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACjE,CAAC;CACF","debug_id":"209959a5-32d5-556f-9bdd-8e06b0de90bb"}
!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]="695d4065-be7e-5a94-aebc-e83e8be3b71b")}catch(e){}}();
!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]="9f2ff797-d5ab-50eb-a199-5a5ddc18f7d2")}catch(e){}}();
import { request } from "./api.js";

@@ -24,2 +24,16 @@ import { UnknownError } from "./errors.js";

}
export async function listStyleguideVersions(credentials, styleguideId, clientUserAgent) {
const searchParams = new URLSearchParams({ show_hidden: "false" });
try {
const response = await request(`/styleguides/${styleguideId}/versions`, credentials, { method: "GET" }, searchParams, undefined, { clientUserAgent });
if ("versions" in response.data) {
return response.data.versions;
}
throw new UnknownError();
}
catch (e) {
captureException(e);
throw e;
}
}
export async function getStyleguideTree(credentials, id, clientUserAgent, releaseId) {

@@ -48,2 +62,2 @@ const searchParams = new URLSearchParams({

//# sourceMappingURL=styleguide.js.map
//# debugId=695d4065-be7e-5a94-aebc-e83e8be3b71b
//# debugId=9f2ff797-d5ab-50eb-a199-5a5ddc18f7d2

@@ -1,1 +0,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, clientUserAgent?: string) {\n try {\n const response = await request<\n APIResponse<StyleguideListSuccessResponse, {}, {}>\n >(\"/styleguides\", credentials, {\n method: \"GET\",\n }, undefined, undefined, { clientUserAgent });\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, clientUserAgent?: string, releaseId?: number) {\n const searchParams = new URLSearchParams({\n show_hidden: \"false\",\n });\n if (releaseId) {\n searchParams.set(\"release_id\", String(releaseId));\n }\n\n try {\n const response = await request<\n APIResponse<SyleguideTreeSuccessResponse, {}, {}>\n >(\n `/styleguides/${id}/tree`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n undefined,\n { clientUserAgent },\n );\n\n if (\"tree\" in response.data) {\n return response.data.tree;\n }\n\n console.error(response);\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n throw e;\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,EAAE,eAAwB;IACtF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAE5B,cAAc,EAAE,WAAW,EAAE;YAC7B,MAAM,EAAE,KAAK;SACd,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;QAE9C,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,EAAE,eAAwB,EAAE,SAAkB;IACxH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;QACvC,WAAW,EAAE,OAAO;KACrB,CAAC,CAAC;IACH,IAAI,SAAS,EAAE,CAAC;QACd,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,EAAE,OAAO,EACzB,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,EACZ,SAAS,EACT,EAAE,eAAe,EAAE,CACpB,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;QACxB,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC","debug_id":"695d4065-be7e-5a94-aebc-e83e8be3b71b"}
{"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 StyleguideVersion,\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, clientUserAgent?: string) {\n try {\n const response = await request<\n APIResponse<StyleguideListSuccessResponse, {}, {}>\n >(\"/styleguides\", credentials, {\n method: \"GET\",\n }, undefined, undefined, { clientUserAgent });\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 StyleguideVersionsSuccessResponse {\n versions: StyleguideVersion[];\n}\n\nexport async function listStyleguideVersions(credentials: Credentials, styleguideId: number, clientUserAgent?: string): Promise<StyleguideVersion[]> {\n const searchParams = new URLSearchParams({ show_hidden: \"false\" });\n\n try {\n const response = await request<\n APIResponse<StyleguideVersionsSuccessResponse, {}, {}>\n >(\n `/styleguides/${styleguideId}/versions`,\n credentials,\n { method: \"GET\" },\n searchParams,\n undefined,\n { clientUserAgent },\n );\n\n if (\"versions\" in response.data) {\n return response.data.versions;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n throw e;\n }\n}\n\ninterface SyleguideTreeSuccessResponse {\n tree: (PageNode | CategoryNode | NavigationNode)[];\n}\n\nexport async function getStyleguideTree(credentials: Credentials, id: number, clientUserAgent?: string, releaseId?: number) {\n const searchParams = new URLSearchParams({\n show_hidden: \"false\",\n });\n if (releaseId) {\n searchParams.set(\"release_id\", String(releaseId));\n }\n\n try {\n const response = await request<\n APIResponse<SyleguideTreeSuccessResponse, {}, {}>\n >(\n `/styleguides/${id}/tree`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n undefined,\n { clientUserAgent },\n );\n\n if (\"tree\" in response.data) {\n return response.data.tree;\n }\n\n console.error(response);\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n throw e;\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAwB,EAAE,eAAwB;IACtF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAE5B,cAAc,EAAE,WAAW,EAAE;YAC7B,MAAM,EAAE,KAAK;SACd,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;QAE9C,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,sBAAsB,CAAC,WAAwB,EAAE,YAAoB,EAAE,eAAwB;IACnH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,YAAY,WAAW,EACvC,WAAW,EACX,EAAE,MAAM,EAAE,KAAK,EAAE,EACjB,YAAY,EACZ,SAAS,EACT,EAAE,eAAe,EAAE,CACpB,CAAC;QAEF,IAAI,UAAU,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAwB,EAAE,EAAU,EAAE,eAAwB,EAAE,SAAkB;IACxH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;QACvC,WAAW,EAAE,OAAO;KACrB,CAAC,CAAC;IACH,IAAI,SAAS,EAAE,CAAC;QACd,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,EAAE,OAAO,EACzB,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,EACZ,SAAS,EACT,EAAE,eAAe,EAAE,CACpB,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;QACxB,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC","debug_id":"9f2ff797-d5ab-50eb-a199-5a5ddc18f7d2"}
!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]="283f262f-07ce-53a3-a308-d9a435af34ac")}catch(e){}}();
!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]="a1dc28fe-9b88-5fe3-b1a1-60480c6b617c")}catch(e){}}();
export {};
//# sourceMappingURL=styleguide.js.map
//# debugId=283f262f-07ce-53a3-a308-d9a435af34ac
//# debugId=a1dc28fe-9b88-5fe3-b1a1-60480c6b617c

@@ -1,1 +0,1 @@

{"version":3,"file":"styleguide.js","sources":["api/types/styleguide.ts"],"sourceRoot":"/","sourcesContent":["export interface Styleguide {\n id: number;\n name: string;\n team_id: number;\n project_id?: number;\n share_id: string;\n}\n\nexport interface TreeNode {\n id: number;\n type: string;\n name: string;\n hidden: boolean;\n children: NodeType[];\n}\n\nexport interface CategoryNode extends TreeNode {\n type: \"category\";\n}\n\nexport interface PageNode extends TreeNode {\n type: \"page\";\n url: string;\n category_overview_page: boolean;\n}\n\nexport interface NavigationNode extends TreeNode {\n type: \"navigation\";\n}\n\nexport interface TabNode extends TreeNode {\n type: \"tab\";\n url: string;\n}\n\nexport type NodeType = CategoryNode | PageNode | NavigationNode | TabNode;\n"],"names":[],"mappings":"","debug_id":"283f262f-07ce-53a3-a308-d9a435af34ac"}
{"version":3,"file":"styleguide.js","sources":["api/types/styleguide.ts"],"sourceRoot":"/","sourcesContent":["export interface Styleguide {\n id: number;\n name: string;\n team_id: number;\n project_id?: number;\n share_id: string;\n}\n\nexport interface TreeNode {\n id: number;\n type: string;\n name: string;\n hidden: boolean;\n children: NodeType[];\n}\n\nexport interface CategoryNode extends TreeNode {\n type: \"category\";\n}\n\nexport interface PageNode extends TreeNode {\n type: \"page\";\n url: string;\n category_overview_page: boolean;\n}\n\nexport interface NavigationNode extends TreeNode {\n type: \"navigation\";\n}\n\nexport interface TabNode extends TreeNode {\n type: \"tab\";\n url: string;\n}\n\nexport type NodeType = CategoryNode | PageNode | NavigationNode | TabNode;\n\nexport interface StyleguideVersion {\n id: number;\n name: string;\n default: boolean;\n working_version: boolean;\n created_at: string;\n release_notes: string | null;\n}\n"],"names":[],"mappings":"","debug_id":"a1dc28fe-9b88-5fe3-b1a1-60480c6b617c"}
!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]="1a11d5e2-c1f1-5398-a9c3-711356b97241")}catch(e){}}();
!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]="a8b94cb7-b633-5e19-be85-722b7a610e41")}catch(e){}}();
import { MissingCredentialsError } from "./errors.js";
import { internalRequest } from "../api/api.js";
import { InvalidCredentialsError, NotFoundError } from "../api/errors.js";
export function isLocalMCP(credentials) {

@@ -25,5 +26,14 @@ return credentials.type === "client_token";

if (authInfo.clientId === "http-client") {
const res = await internalRequest("/mcp_url/exchange_token", "POST", {
token: authInfo.token,
});
let res;
try {
res = await internalRequest("/mcp_url/exchange_token", "POST", {
token: authInfo.token,
});
}
catch (e) {
if (e instanceof NotFoundError) {
throw new InvalidCredentialsError();
}
throw e;
}
return {

@@ -52,2 +62,2 @@ type: "jwt",

//# sourceMappingURL=credentials.js.map
//# debugId=1a11d5e2-c1f1-5398-a9c3-711356b97241
//# debugId=a8b94cb7-b633-5e19-be85-722b7a610e41

@@ -1,1 +0,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 styleguideName?: string;\n features: Record<string, boolean>;\n viewerId?: string;\n userId?: number;\n teamId?: number;\n mcpAuthId?: number;\n tokenSets?: Array<{ id: number; name: string }>;\n }\n | {\n type: \"oauth_jwt\";\n jwt: string;\n clientId: string;\n features: Record<string, boolean>;\n userId: number;\n teamId: number;\n };\n\nexport function isLocalMCP(\n credentials: Credentials,\n): credentials is Extract<Credentials, { type: \"client_token\" }> {\n return credentials.type === \"client_token\";\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 styleguide_name?: string;\n features: Record<string, boolean>;\n user_id?: number;\n viewer_id?: string;\n team_id?: number;\n mcp_auth_id?: number;\n token_sets?: Array<{ id: number; name: string }>;\n}\n\nexport async function getCredentials(\n authInfo?: AuthInfo,\n): Promise<Credentials> {\n if (!authInfo) {\n return getCredentialsFromEnvironment();\n }\n if (authInfo.clientId === \"http-client\") {\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 styleguideName: res.styleguide_name,\n features: res.features ?? {},\n userId: res.user_id,\n viewerId: res.viewer_id,\n teamId: res.team_id,\n mcpAuthId: res.mcp_auth_id,\n tokenSets: res.token_sets,\n };\n }\n return {\n type: \"oauth_jwt\",\n jwt: authInfo.token,\n features: authInfo.extra!.features as Record<string, boolean>,\n userId: authInfo.extra!.user_id as number,\n teamId: authInfo.extra!.team_id as number,\n clientId: authInfo.clientId,\n };\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA6BhD,MAAM,UAAU,UAAU,CACxB,WAAwB;IAExB,OAAO,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC;AAC7C,CAAC;AAED,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;AAcD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAmB;IAEnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,6BAA6B,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,eAAe,CAC/B,yBAAyB,EACzB,MAAM,EACN;YACE,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CACF,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,cAAc,EAAE,GAAG,CAAC,eAAe;YACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;YAC5B,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,SAAS,EAAE,GAAG,CAAC,WAAW;YAC1B,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,QAAQ,CAAC,KAAK;QACnB,QAAQ,EAAE,QAAQ,CAAC,KAAM,CAAC,QAAmC;QAC7D,MAAM,EAAE,QAAQ,CAAC,KAAM,CAAC,OAAiB;QACzC,MAAM,EAAE,QAAQ,CAAC,KAAM,CAAC,OAAiB;QACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAC;AACJ,CAAC","debug_id":"1a11d5e2-c1f1-5398-a9c3-711356b97241"}
{"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\";\nimport { InvalidCredentialsError, NotFoundError } from \"../api/errors.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 styleguideName?: string;\n features: Record<string, boolean>;\n viewerId?: string;\n userId?: number;\n teamId?: number;\n mcpAuthId?: number;\n tokenSets?: Array<{ id: number; name: string }>;\n }\n | {\n type: \"oauth_jwt\";\n jwt: string;\n clientId: string;\n features: Record<string, boolean>;\n userId: number;\n teamId: number;\n };\n\nexport function isLocalMCP(\n credentials: Credentials,\n): credentials is Extract<Credentials, { type: \"client_token\" }> {\n return credentials.type === \"client_token\";\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 styleguide_name?: string;\n features: Record<string, boolean>;\n user_id?: number;\n viewer_id?: string;\n team_id?: number;\n mcp_auth_id?: number;\n token_sets?: Array<{ id: number; name: string }>;\n}\n\nexport async function getCredentials(\n authInfo?: AuthInfo,\n): Promise<Credentials> {\n if (!authInfo) {\n return getCredentialsFromEnvironment();\n }\n if (authInfo.clientId === \"http-client\") {\n let res: JwtResponse;\n try {\n res = await internalRequest<JwtResponse>(\n \"/mcp_url/exchange_token\",\n \"POST\",\n {\n token: authInfo.token,\n },\n );\n } catch (e) {\n if (e instanceof NotFoundError) {\n throw new InvalidCredentialsError();\n }\n throw e;\n }\n\n return {\n type: \"jwt\",\n jwt: res.jwt,\n styleguideId: res.styleguide_id,\n styleguideName: res.styleguide_name,\n features: res.features ?? {},\n userId: res.user_id,\n viewerId: res.viewer_id,\n teamId: res.team_id,\n mcpAuthId: res.mcp_auth_id,\n tokenSets: res.token_sets,\n };\n }\n return {\n type: \"oauth_jwt\",\n jwt: authInfo.token,\n features: authInfo.extra!.features as Record<string, boolean>,\n userId: authInfo.extra!.user_id as number,\n teamId: authInfo.extra!.team_id as number,\n clientId: authInfo.clientId,\n };\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA6B1E,MAAM,UAAU,UAAU,CACxB,WAAwB;IAExB,OAAO,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC;AAC7C,CAAC;AAED,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;AAcD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAmB;IAEnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,6BAA6B,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACxC,IAAI,GAAgB,CAAC;QACrB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,eAAe,CACzB,yBAAyB,EACzB,MAAM,EACN;gBACE,KAAK,EAAE,QAAQ,CAAC,KAAK;aACtB,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC;gBAC/B,MAAM,IAAI,uBAAuB,EAAE,CAAC;YACtC,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;QAED,OAAO;YACL,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,cAAc,EAAE,GAAG,CAAC,eAAe;YACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;YAC5B,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,SAAS,EAAE,GAAG,CAAC,WAAW;YAC1B,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,QAAQ,CAAC,KAAK;QACnB,QAAQ,EAAE,QAAQ,CAAC,KAAM,CAAC,QAAmC;QAC7D,MAAM,EAAE,QAAQ,CAAC,KAAM,CAAC,OAAiB;QACzC,MAAM,EAAE,QAAQ,CAAC,KAAM,CAAC,OAAiB;QACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAC;AACJ,CAAC","debug_id":"a8b94cb7-b633-5e19-be85-722b7a610e41"}
!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]="8e2e81bd-1d19-5c86-9245-3fda1e664e4b")}catch(e){}}();
!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]="90977dea-fb56-575a-aa98-e6b90076a20e")}catch(e){}}();
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import packageJson from "../package.json" with { type: "json" };
import { registerListPagesTool, registerListStyleguidesTool, } from "./tools/styleguide.js";
import { registerListPagesTool, registerListReleasesTool, registerListStyleguidesTool, } from "./tools/styleguide.js";
import { registerGetPageTool, registerGetPageImagesTool, registerSearchPagesTool, } from "./tools/page.js";

@@ -28,2 +28,3 @@ import { registerGetTokensTool, registerListTokenSetsTool, } from "./tools/token.js";

registerListPagesTool,
registerListReleasesTool,
registerGetPageTool,

@@ -42,2 +43,2 @@ registerGetPageImagesTool,

//# sourceMappingURL=mcp-server.js.map
//# debugId=8e2e81bd-1d19-5c86-9245-3fda1e664e4b
//# debugId=90977dea-fb56-575a-aa98-e6b90076a20e

@@ -1,1 +0,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 registerListPagesTool,\n registerListStyleguidesTool,\n} from \"./tools/styleguide.js\";\nimport {\n registerGetPageTool,\n registerGetPageImagesTool,\n registerSearchPagesTool,\n} from \"./tools/page.js\";\nimport {\n registerGetTokensTool,\n registerListTokenSetsTool,\n} from \"./tools/token.js\";\nimport { registerLintCodeTool } from \"./tools/lint.js\";\nimport { recommendSummarizePagePrompt } from \"./prompts/page.js\";\nimport { registerRecommendPagesPrompt } from \"./prompts/styleguide.js\";\nimport { ServerContext } from \"./types/server.js\";\n\nexport function createServer(\n context: ServerContext = {\n connectionMode: \"local\",\n features: {},\n },\n) {\n const server = new McpServer({\n name: \"zeroheight\",\n version: packageJson.version,\n capabilities: {\n tools: {},\n },\n });\n\n // Register tools\n if (context.connectionMode !== \"remote_single_styleguide\") {\n registerListStyleguidesTool(server);\n }\n\n [\n registerListPagesTool,\n registerGetPageTool,\n registerGetPageImagesTool,\n registerSearchPagesTool,\n registerListTokenSetsTool,\n registerGetTokensTool,\n registerLintCodeTool,\n ].forEach((fn) => fn(server, context));\n\n // Register all prompts\n registerRecommendPagesPrompt(server, context);\n recommendSummarizePagePrompt(server);\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,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAGvE,MAAM,UAAU,YAAY,CAC1B,UAAyB;IACvB,cAAc,EAAE,OAAO;IACvB,QAAQ,EAAE,EAAE;CACb;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,OAAO,CAAC,cAAc,KAAK,0BAA0B,EAAE,CAAC;QAC1D,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;QACE,qBAAqB;QACrB,mBAAmB;QACnB,yBAAyB;QACzB,uBAAuB;QACvB,yBAAyB;QACzB,qBAAqB;QACrB,oBAAoB;KACrB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvC,uBAAuB;IACvB,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AAChB,CAAC","debug_id":"8e2e81bd-1d19-5c86-9245-3fda1e664e4b"}
{"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 registerListPagesTool,\n registerListReleasesTool,\n registerListStyleguidesTool,\n} from \"./tools/styleguide.js\";\nimport {\n registerGetPageTool,\n registerGetPageImagesTool,\n registerSearchPagesTool,\n} from \"./tools/page.js\";\nimport {\n registerGetTokensTool,\n registerListTokenSetsTool,\n} from \"./tools/token.js\";\nimport { registerLintCodeTool } from \"./tools/lint.js\";\nimport { recommendSummarizePagePrompt } from \"./prompts/page.js\";\nimport { registerRecommendPagesPrompt } from \"./prompts/styleguide.js\";\nimport { ServerContext } from \"./types/server.js\";\n\nexport function createServer(\n context: ServerContext = {\n connectionMode: \"local\",\n features: {},\n },\n) {\n const server = new McpServer({\n name: \"zeroheight\",\n version: packageJson.version,\n capabilities: {\n tools: {},\n },\n });\n\n // Register tools\n if (context.connectionMode !== \"remote_single_styleguide\") {\n registerListStyleguidesTool(server);\n }\n\n [\n registerListPagesTool,\n registerListReleasesTool,\n registerGetPageTool,\n registerGetPageImagesTool,\n registerSearchPagesTool,\n registerListTokenSetsTool,\n registerGetTokensTool,\n registerLintCodeTool,\n ].forEach((fn) => fn(server, context));\n\n // Register all prompts\n registerRecommendPagesPrompt(server, context);\n recommendSummarizePagePrompt(server);\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,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAGvE,MAAM,UAAU,YAAY,CAC1B,UAAyB;IACvB,cAAc,EAAE,OAAO;IACvB,QAAQ,EAAE,EAAE;CACb;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,OAAO,CAAC,cAAc,KAAK,0BAA0B,EAAE,CAAC;QAC1D,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;QACE,qBAAqB;QACrB,wBAAwB;QACxB,mBAAmB;QACnB,yBAAyB;QACzB,uBAAuB;QACvB,yBAAyB;QACzB,qBAAqB;QACrB,oBAAoB;KACrB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvC,uBAAuB;IACvB,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AAChB,CAAC","debug_id":"90977dea-fb56-575a-aa98-e6b90076a20e"}

@@ -5,3 +5,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]="ac86888a-13dd-552b-a4a8-64b95bf7a4aa")}catch(e){}}();
!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]="e590276f-d3ab-54f6-a7db-501f00630c0e")}catch(e){}}();
import { z } from "zod";

@@ -20,3 +20,7 @@ import { getTokenSetExport } from "../api/token.js";

annotations: {
title: "Lint code against design tokens",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},

@@ -79,2 +83,2 @@ inputSchema: {

//# sourceMappingURL=lint.js.map
//# debugId=ac86888a-13dd-552b-a4a8-64b95bf7a4aa
//# debugId=e590276f-d3ab-54f6-a7db-501f00630c0e

@@ -1,1 +0,1 @@

{"version":3,"file":"lint.js","sources":["tools/lint.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Lint Tool - lint-code MCP tool\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport { getTokenSetExport } from \"../api/token.js\";\nimport { getCredentials } from \"../common/credentials.js\";\nimport { registerTrackedToolCall } from \"../logging.js\";\nimport { lint, type Language } from \"../lint/index.js\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerLintCodeTool(\n server: McpServer,\n context: ServerContext,\n) {\n if (!context.features[\"TREE-2686_mcp_experimental_tools\"]) {\n return;\n }\n\n registerTrackedToolCall(\n server,\n \"lint-code\",\n {\n title: \"Lint code against design tokens\",\n description:\n \"Lint CSS, SCSS, TSX, TS, JS, or JSX code against design tokens to find hardcoded values that should use tokens. IMPORTANT: Always use this tool to validate code AFTER generating CSS/SCSS/TSX/TS/JS/JSX. When violations are found, you MUST fix them by replacing hardcoded values with the suggested design tokens from the violation results before returning the code to the user. Replace only the literal value (e.g. the color hex or dimension) with the suggested token value or variable; do not add any inline comments or labels.\",\n annotations: {\n readOnlyHint: true,\n },\n inputSchema: {\n code: z.string().describe(\"Source code to lint\"),\n language: z\n .enum([\"css\", \"scss\", \"tsx\", \"ts\", \"js\", \"jsx\"])\n .describe(\"Language of the source code\"),\n tokenSetId: z\n .number()\n .int()\n .positive()\n .describe(\"Token set ID to validate against\"),\n colorDistanceThreshold: z\n .number()\n .min(0)\n .max(100)\n .default(10)\n .describe(\n \"Color distance threshold for suggestions (0-100, default 10)\",\n ),\n },\n },\n async (\n { code, language, tokenSetId, colorDistanceThreshold },\n { authInfo },\n clientUserAgent,\n ) => {\n const credentials = await getCredentials(authInfo);\n const tokens = await getTokenSetExport(credentials, tokenSetId, clientUserAgent);\n\n if (tokens === null) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not fetch tokens for this token set. Check that the token set ID is valid.\",\n },\n ],\n };\n }\n\n const violations = lint(\n code,\n language as Language,\n tokens,\n colorDistanceThreshold,\n );\n\n const byType = violations.reduce(\n (acc, v) => {\n acc[v.type] = (acc[v.type] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>,\n );\n\n const result = {\n violations,\n tokenSetId,\n summary: {\n total: violations.length,\n byType,\n },\n };\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,IAAI,EAAiB,MAAM,kBAAkB,CAAC;AAGvD,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,OAAsB;IAEtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,uBAAuB,CACrB,MAAM,EACN,WAAW,EACX;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,ghBAAghB;QAClhB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;QACD,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAChD,QAAQ,EAAE,CAAC;iBACR,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;iBAC/C,QAAQ,CAAC,6BAA6B,CAAC;YAC1C,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,sBAAsB,EAAE,CAAC;iBACtB,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CACP,8DAA8D,CAC/D;SACJ;KACF,EACD,KAAK,EACH,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,sBAAsB,EAAE,EACtD,EAAE,QAAQ,EAAE,EACZ,eAAe,EACf,EAAE;QACF,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAEjF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,kFAAkF;qBACzF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CACrB,IAAI,EACJ,QAAoB,EACpB,MAAM,EACN,sBAAsB,CACvB,CAAC;QAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACT,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA4B,CAC7B,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,UAAU;YACV,UAAU;YACV,OAAO,EAAE;gBACP,KAAK,EAAE,UAAU,CAAC,MAAM;gBACxB,MAAM;aACP;SACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrC,QAAQ,EAAE,kBAAkB;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"ac86888a-13dd-552b-a4a8-64b95bf7a4aa"}
{"version":3,"file":"lint.js","sources":["tools/lint.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Lint Tool - lint-code MCP tool\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport { getTokenSetExport } from \"../api/token.js\";\nimport { getCredentials } from \"../common/credentials.js\";\nimport { registerTrackedToolCall } from \"../logging.js\";\nimport { lint, type Language } from \"../lint/index.js\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerLintCodeTool(\n server: McpServer,\n context: ServerContext,\n) {\n if (!context.features[\"TREE-2686_mcp_experimental_tools\"]) {\n return;\n }\n\n registerTrackedToolCall(\n server,\n \"lint-code\",\n {\n title: \"Lint code against design tokens\",\n description:\n \"Lint CSS, SCSS, TSX, TS, JS, or JSX code against design tokens to find hardcoded values that should use tokens. IMPORTANT: Always use this tool to validate code AFTER generating CSS/SCSS/TSX/TS/JS/JSX. When violations are found, you MUST fix them by replacing hardcoded values with the suggested design tokens from the violation results before returning the code to the user. Replace only the literal value (e.g. the color hex or dimension) with the suggested token value or variable; do not add any inline comments or labels.\",\n annotations: {\n title: \"Lint code against design tokens\",\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n inputSchema: {\n code: z.string().describe(\"Source code to lint\"),\n language: z\n .enum([\"css\", \"scss\", \"tsx\", \"ts\", \"js\", \"jsx\"])\n .describe(\"Language of the source code\"),\n tokenSetId: z\n .number()\n .int()\n .positive()\n .describe(\"Token set ID to validate against\"),\n colorDistanceThreshold: z\n .number()\n .min(0)\n .max(100)\n .default(10)\n .describe(\n \"Color distance threshold for suggestions (0-100, default 10)\",\n ),\n },\n },\n async (\n { code, language, tokenSetId, colorDistanceThreshold },\n { authInfo },\n clientUserAgent,\n ) => {\n const credentials = await getCredentials(authInfo);\n const tokens = await getTokenSetExport(credentials, tokenSetId, clientUserAgent);\n\n if (tokens === null) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not fetch tokens for this token set. Check that the token set ID is valid.\",\n },\n ],\n };\n }\n\n const violations = lint(\n code,\n language as Language,\n tokens,\n colorDistanceThreshold,\n );\n\n const byType = violations.reduce(\n (acc, v) => {\n acc[v.type] = (acc[v.type] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>,\n );\n\n const result = {\n violations,\n tokenSetId,\n summary: {\n total: violations.length,\n byType,\n },\n };\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"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","debug_id":"e590276f-d3ab-54f6-a7db-501f00630c0e"}

@@ -5,3 +5,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]="c757c5c9-d251-525f-9ba5-572d83183419")}catch(e){}}();
!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]="694bee8d-7ded-5054-9a83-2310df4ae0e6")}catch(e){}}();
import z from "zod";

@@ -20,11 +20,15 @@ import { getPage, searchPages } from "../api/page.js";

.int()
.describe("Identifies the page containing relevant guidance. Use `list-pages` to locate it."),
.describe("Identifies the page containing relevant guidance. Use `list-pages` to locate it. Important: page IDs differ between releases — if using a `releaseId`, call `list-pages` with the same `releaseId` first to get the correct page ID."),
releaseId: z
.number()
.int()
.describe("Optional. Returns guidelines for the default release if omitted. User can specify when a particular release is relevant.")
.describe("Optional. Do not provide unless the user has explicitly asked for a specific release. Use `list-releases` to discover available releases. When provided, you must also use the page ID from `list-pages` called with this same release ID.")
.optional(),
},
annotations: {
title: "Get a styleguide page",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},

@@ -40,3 +44,3 @@ }, async ({ pageId, releaseId }, { authInfo }, clientUserAgent) => {

type: "text",
text: `Could not find the page, check you have the correct page ID${releaseId ? ` and release ID` : ""}.`,
text: `Could not find the page. Verify the page ID by calling \`list-pages\`${releaseId ? ` with releaseId ${releaseId}` : ""}.`,
},

@@ -66,11 +70,15 @@ ],

.int()
.describe("The page to fetch images from. Use the same page ID as a previous `get-page` call."),
.describe("The page to fetch images from. Use the same page ID as a previous `get-page` call. Page IDs differ between releases — ensure the ID matches the release."),
releaseId: z
.number()
.int()
.describe("Optional. Returns images for the default release if omitted. Should match the release ID used with `get-page`.")
.describe("Optional. Do not provide unless the user has explicitly asked for a specific release. Should match the release ID used with `get-page`.")
.optional(),
},
annotations: {
title: "Get images from a styleguide page",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},

@@ -86,3 +94,3 @@ }, async ({ pageId, releaseId }, { authInfo }, clientUserAgent) => {

type: "text",
text: `Could not find the page, check you have the correct page ID${releaseId ? ` and release ID` : ""}.`,
text: `Could not find the page. Verify the page ID by calling \`list-pages\`${releaseId ? ` with releaseId ${releaseId}` : ""}.`,
},

@@ -130,7 +138,11 @@ ],

annotations: {
title: "Search pages in a styleguide",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},
}, async (args, { authInfo }, clientUserAgent) => {
const credentials = await getCredentials(authInfo);
const { searchTerm, releaseId, responseFormat, } = args;
const { searchTerm, releaseId, responseFormat } = args;
const styleguideId = context.connectionMode === "remote_single_styleguide"

@@ -197,2 +209,2 @@ ? context.styleguideId

//# sourceMappingURL=page.js.map
//# debugId=c757c5c9-d251-525f-9ba5-572d83183419
//# debugId=694bee8d-7ded-5054-9a83-2310df4ae0e6

@@ -1,1 +0,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, searchPages } from \"../api/page.js\";\nimport {\n formatPageAsMarkdown,\n formatPageListItemsAsMarkdown,\n extractImageUrlsFromPage,\n} from \"../common/formatters/page.js\";\nimport { getCredentials } from \"../common/credentials.js\";\nimport { registerTrackedToolCall } from \"../logging.js\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerGetPageTool(\n server: McpServer,\n _context: ServerContext,\n) {\n registerTrackedToolCall(\n server,\n \"get-page\",\n {\n title: \"Get a styleguide page\",\n description:\n \"Fetch guidance from a specific design system page, including usage notes, recommendations, and supporting context.\\n\\n*Particularly helpful ahead of UI generation to increase the likelihood that outputs reflect the intent of the design system.*\\n\\n*If images from the page are needed, call `get-page-images` afterwards with the same page ID to retrieve them as base64-encoded content.*\",\n inputSchema: {\n pageId: z\n .number()\n .int()\n .describe(\n \"Identifies the page containing relevant guidance. Use `list-pages` to locate it.\",\n ),\n releaseId: z\n .number()\n .int()\n .describe(\n \"Optional. Returns guidelines for the default release if omitted. User can specify when a particular release is relevant.\",\n )\n .optional(),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async ({ pageId, releaseId }, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n const page = await getPage(\n credentials,\n pageId,\n { releaseId },\n clientUserAgent,\n );\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${releaseId ? ` and release ID` : \"\"}.`,\n },\n ],\n };\n }\n\n const textContent = formatPageAsMarkdown(page);\n\n return {\n content: [\n {\n type: \"text\",\n text: textContent,\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n\nexport function registerGetPageImagesTool(\n server: McpServer,\n _context: ServerContext,\n) {\n registerTrackedToolCall(\n server,\n \"get-page-images\",\n {\n title: \"Get images from a styleguide page\",\n description:\n \"Fetch all images from a specific design system page as base64-encoded content.\\n\\n*Call this after `get-page` with the same page ID if images are needed for the task — for example, when referencing visual examples, screenshots, or diagrams from the page.*\",\n inputSchema: {\n pageId: z\n .number()\n .int()\n .describe(\n \"The page to fetch images from. Use the same page ID as a previous `get-page` call.\",\n ),\n releaseId: z\n .number()\n .int()\n .describe(\n \"Optional. Returns images for the default release if omitted. Should match the release ID used with `get-page`.\",\n )\n .optional(),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async ({ pageId, releaseId }, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n const page = await getPage(\n credentials,\n pageId,\n { releaseId },\n clientUserAgent,\n );\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${releaseId ? ` and release ID` : \"\"}.`,\n },\n ],\n };\n }\n\n const textContent = formatPageAsMarkdown(page);\n const images = await extractImageUrlsFromPage(textContent);\n\n if (images.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No images found on this page.\",\n },\n ],\n };\n }\n\n return {\n content: images,\n };\n },\n );\n}\n\nexport function registerSearchPagesTool(\n server: McpServer,\n context: ServerContext,\n) {\n if (context.features[\"SKI_2466_bedrock_indexing\"] !== true) {\n return;\n }\n\n const singleStyleguideMode =\n context.connectionMode === \"remote_single_styleguide\";\n\n registerTrackedToolCall(\n server,\n \"search-pages\",\n {\n title: \"Search pages in a styleguide\",\n description: \"Search for pages in a styleguide by a search term\",\n inputSchema: singleStyleguideMode\n ? {\n releaseId: z.number().int().min(1).optional(),\n searchTerm: z.string(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n }\n : {\n styleguideId: z.number().int().min(1),\n releaseId: z.number().int().min(1).optional(),\n searchTerm: z.string(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (\n args,\n { authInfo },\n clientUserAgent,\n ) => {\n const credentials = await getCredentials(authInfo);\n const {\n searchTerm,\n releaseId,\n responseFormat,\n } = args as {\n searchTerm: string;\n releaseId?: number;\n responseFormat: \"markdown\" | \"json\";\n };\n const styleguideId =\n context.connectionMode === \"remote_single_styleguide\"\n ? context.styleguideId\n : (args as { styleguideId: number }).styleguideId;\n\n if (typeof styleguideId !== \"number\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not determine which styleguide to search.\",\n },\n ],\n };\n }\n\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 results = await searchPages(\n credentials,\n styleguideId,\n searchTerm,\n releaseId,\n clientUserAgent,\n );\n\n if (results.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"No pages match that search term, try something else.\",\n },\n ],\n };\n }\n\n if (responseFormat === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatPageListItemsAsMarkdown(results),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(results, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"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","debug_id":"c757c5c9-d251-525f-9ba5-572d83183419"}
{"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, searchPages } from \"../api/page.js\";\nimport {\n formatPageAsMarkdown,\n formatPageListItemsAsMarkdown,\n extractImageUrlsFromPage,\n} from \"../common/formatters/page.js\";\nimport { getCredentials } from \"../common/credentials.js\";\nimport { registerTrackedToolCall } from \"../logging.js\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerGetPageTool(\n server: McpServer,\n _context: ServerContext,\n) {\n registerTrackedToolCall(\n server,\n \"get-page\",\n {\n title: \"Get a styleguide page\",\n description:\n \"Fetch guidance from a specific design system page, including usage notes, recommendations, and supporting context.\\n\\n*Particularly helpful ahead of UI generation to increase the likelihood that outputs reflect the intent of the design system.*\\n\\n*If images from the page are needed, call `get-page-images` afterwards with the same page ID to retrieve them as base64-encoded content.*\",\n inputSchema: {\n pageId: z\n .number()\n .int()\n .describe(\n \"Identifies the page containing relevant guidance. Use `list-pages` to locate it. Important: page IDs differ between releases — if using a `releaseId`, call `list-pages` with the same `releaseId` first to get the correct page ID.\",\n ),\n releaseId: z\n .number()\n .int()\n .describe(\n \"Optional. Do not provide unless the user has explicitly asked for a specific release. Use `list-releases` to discover available releases. When provided, you must also use the page ID from `list-pages` called with this same release ID.\",\n )\n .optional(),\n },\n annotations: {\n title: \"Get a styleguide page\",\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async ({ pageId, releaseId }, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n const page = await getPage(\n credentials,\n pageId,\n { releaseId },\n clientUserAgent,\n );\n\n if (!page) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Could not find the page. Verify the page ID by calling \\`list-pages\\`${releaseId ? ` with releaseId ${releaseId}` : \"\"}.`,\n },\n ],\n };\n }\n\n const textContent = formatPageAsMarkdown(page);\n\n return {\n content: [\n {\n type: \"text\",\n text: textContent,\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n\nexport function registerGetPageImagesTool(\n server: McpServer,\n _context: ServerContext,\n) {\n registerTrackedToolCall(\n server,\n \"get-page-images\",\n {\n title: \"Get images from a styleguide page\",\n description:\n \"Fetch all images from a specific design system page as base64-encoded content.\\n\\n*Call this after `get-page` with the same page ID if images are needed for the task — for example, when referencing visual examples, screenshots, or diagrams from the page.*\",\n inputSchema: {\n pageId: z\n .number()\n .int()\n .describe(\n \"The page to fetch images from. Use the same page ID as a previous `get-page` call. Page IDs differ between releases — ensure the ID matches the release.\",\n ),\n releaseId: z\n .number()\n .int()\n .describe(\n \"Optional. Do not provide unless the user has explicitly asked for a specific release. Should match the release ID used with `get-page`.\",\n )\n .optional(),\n },\n annotations: {\n title: \"Get images from a styleguide page\",\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async ({ pageId, releaseId }, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n const page = await getPage(\n credentials,\n pageId,\n { releaseId },\n clientUserAgent,\n );\n\n if (!page) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Could not find the page. Verify the page ID by calling \\`list-pages\\`${releaseId ? ` with releaseId ${releaseId}` : \"\"}.`,\n },\n ],\n };\n }\n\n const textContent = formatPageAsMarkdown(page);\n const images = await extractImageUrlsFromPage(textContent);\n\n if (images.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No images found on this page.\",\n },\n ],\n };\n }\n\n return {\n content: images,\n };\n },\n );\n}\n\nexport function registerSearchPagesTool(\n server: McpServer,\n context: ServerContext,\n) {\n if (context.features[\"SKI_2466_bedrock_indexing\"] !== true) {\n return;\n }\n\n const singleStyleguideMode =\n context.connectionMode === \"remote_single_styleguide\";\n\n registerTrackedToolCall(\n server,\n \"search-pages\",\n {\n title: \"Search pages in a styleguide\",\n description: \"Search for pages in a styleguide by a search term\",\n inputSchema: singleStyleguideMode\n ? {\n releaseId: z.number().int().min(1).optional(),\n searchTerm: z.string(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n }\n : {\n styleguideId: z.number().int().min(1),\n releaseId: z.number().int().min(1).optional(),\n searchTerm: z.string(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n },\n annotations: {\n title: \"Search pages in a styleguide\",\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async (args, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n const { searchTerm, releaseId, responseFormat } = args as {\n searchTerm: string;\n releaseId?: number;\n responseFormat: \"markdown\" | \"json\";\n };\n const styleguideId =\n context.connectionMode === \"remote_single_styleguide\"\n ? context.styleguideId\n : (args as { styleguideId: number }).styleguideId;\n\n if (typeof styleguideId !== \"number\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not determine which styleguide to search.\",\n },\n ],\n };\n }\n\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 results = await searchPages(\n credentials,\n styleguideId,\n searchTerm,\n releaseId,\n clientUserAgent,\n );\n\n if (results.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"No pages match that search term, try something else.\",\n },\n ],\n };\n }\n\n if (responseFormat === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatPageListItemsAsMarkdown(results),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(results, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"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","debug_id":"694bee8d-7ded-5054-9a83-2310df4ae0e6"}

@@ -5,5 +5,6 @@ /**

!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]="40007100-5858-52c5-8440-9bdc646ab841")}catch(e){}}();
!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]="1f896b4f-8093-5778-8702-a6f5a6ba909b")}catch(e){}}();
import z from "zod";
import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
import { ApiError } from "../api/errors.js";
import { getStyleguideTree, listStyleguides, listStyleguideVersions } from "../api/styleguide.js";
import { formatStyleguideListAsJson, formatTreeAsJson, } from "../common/formatters/styleguide.js";

@@ -28,3 +29,7 @@ import { getCredentials } from "../common/credentials.js";

annotations: {
title: "List styleguides",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},

@@ -66,2 +71,70 @@ }, async (_, { authInfo }, clientUserAgent) => {

]));
const releasesSchema = z
.array(z.object({
id: z.number().describe("The unique identifier for the release. Pass as `releaseId` to other tools when the user requests a specific release."),
name: z.string().describe("The name of the release."),
default: z.boolean().describe("Whether this is the default release shown to viewers."),
working_version: z.boolean().describe("Whether this is the current work-in-progress release."),
created_at: z.string().describe("When the release was created."),
release_notes: z.string().nullable().describe("Release notes for this release."),
}))
.describe("Available releases for the styleguide, newest first.");
export function registerListReleasesTool(server, context) {
const singleStyleguideMode = context.connectionMode === "remote_single_styleguide";
registerTrackedToolCall(server, "list-releases", {
title: "List releases in a styleguide",
description: "List available releases for a styleguide. Only call this when the user has explicitly asked about releases or wants content from a specific release. Do not use `releaseId` in other tools unless the user has requested a particular release — all tools default to the latest published content.",
inputSchema: {
...(singleStyleguideMode
? {}
: {
styleguideId: z
.number()
.int()
.min(1)
.describe("The design system to list releases for. Use `list-styleguides` to discover available systems."),
}),
},
outputSchema: {
releases: releasesSchema,
},
annotations: {
readOnlyHint: true,
},
}, async (args, { authInfo }, clientUserAgent) => {
try {
const credentials = await getCredentials(authInfo);
const styleguideId = singleStyleguideMode
? context.styleguideId
: args.styleguideId;
if (typeof styleguideId !== "number") {
throw new Error("Missing styleguideId");
}
const versions = await listStyleguideVersions(credentials, styleguideId, clientUserAgent);
const structuredContent = { releases: releasesSchema.parse(versions) };
return {
content: [
{
type: "text",
text: JSON.stringify(structuredContent, null, 2),
},
],
structuredContent,
};
}
catch (e) {
return {
isError: true,
content: [
{
type: "text",
text: e instanceof ApiError
? e.message
: "Could not get releases for this styleguide.",
},
],
};
}
});
}
export function registerListPagesTool(server, context) {

@@ -89,3 +162,3 @@ const singleStyleguideMode = context.connectionMode === "remote_single_styleguide";

.optional()
.describe("Optional. Returns pages for the default release if omitted. User can specify when a particular release is relevant."),
.describe("Optional. Do not provide unless the user has explicitly asked for a specific release. Use `list-releases` to discover available releases."),
},

@@ -105,3 +178,7 @@ outputSchema: {

annotations: {
title: "List pages in a styleguide",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},

@@ -150,2 +227,2 @@ }, async (args, { authInfo }, clientUserAgent) => {

//# sourceMappingURL=styleguide.js.map
//# debugId=40007100-5858-52c5-8440-9bdc646ab841
//# debugId=1f896b4f-8093-5778-8702-a6f5a6ba909b

@@ -1,1 +0,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 formatStyleguideListAsJson,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\nimport { getCredentials } from \"../common/credentials.js\";\nimport { registerTrackedToolCall } from \"../logging.js\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerListStyleguidesTool(server: McpServer) {\n registerTrackedToolCall(\n server,\n \"list-styleguides\",\n {\n title: \"List styleguides\",\n description:\n \"Discover available design systems that provide documented guidance for components, patterns, and styles. Call this tool first. If multiple systems are available, confirm with the user which should be used.\\n\\n*Helpful to reference before generating UI so decisions can reflect established design approaches.*\",\n inputSchema: {},\n outputSchema: {\n styleguides: z\n .array(\n z.object({\n id: z\n .number()\n .describe(\"The unique identifier for the styleguide.\"),\n name: z.string().describe(\"The name of the styleguide.\"),\n }),\n )\n .describe(\"List of available design system styleguides.\"),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (_, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n const styleguides = await listStyleguides(credentials, clientUserAgent);\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 const structuredContent = formatStyleguideListAsJson(styleguides);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n };\n },\n );\n}\n\nconst pageNodeSchema: z.ZodType = z.lazy(() =>\n z.union([\n z.object({\n id: z\n .number()\n .describe(\"The page ID. Use with `get-page` to fetch its content.\"),\n url: z.string().describe(\"The URL of the page.\"),\n }),\n z.record(z.string(), pageNodeSchema),\n ]),\n);\n\nexport function registerListPagesTool(server: McpServer, context: ServerContext) {\n const singleStyleguideMode =\n context.connectionMode === \"remote_single_styleguide\";\n\n registerTrackedToolCall(\n server,\n \"list-pages\",\n {\n title: \"List pages in a styleguide\",\n description:\n singleStyleguideMode\n ? \"View the navigation hierarchy of the current design system — including categories, pages, and tabs — to better understand how guidance is organized.\\n\\n*Helpful when determining where to look for component or pattern documentation before generating UI.*\"\n : \"View the navigation hierarchy of a design system — including categories, pages, and tabs — to better understand how guidance is organized. Call this tool immediately after list-styleguides with the desired styleguide ID.\\n\\n*Helpful when determining where to look for component or pattern documentation before generating UI.*\",\n inputSchema: {\n ...(singleStyleguideMode\n ? {}\n : {\n styleguideId: z\n .number()\n .int()\n .min(1)\n .describe(\n \"The design system to reference. Use `list-styleguides` to discover available systems.\",\n ),\n }),\n releaseId: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\n \"Optional. Returns pages for the default release if omitted. User can specify when a particular release is relevant.\",\n ),\n },\n outputSchema: {\n ...(singleStyleguideMode\n ? {\n styleguideName: z\n .string()\n .describe(\"The name of the styleguide.\"),\n }\n : {}),\n pages: z\n .record(z.string(), pageNodeSchema)\n .describe(\n \"A hierarchical navigation tree of the design system. Keys are category or page names. Page leaf nodes have { id, url } properties; category nodes contain further nested objects.\",\n ),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (args, { authInfo }, clientUserAgent) => {\n const releaseId = (args as { releaseId?: number }).releaseId;\n try {\n const credentials = await getCredentials(authInfo);\n const styleguideId =\n context.connectionMode === \"remote_single_styleguide\"\n ? context.styleguideId\n : (args as { styleguideId: number }).styleguideId;\n\n if (typeof styleguideId !== \"number\") {\n throw new Error(\"Missing styleguideId\");\n }\n\n const tree = await getStyleguideTree(\n credentials,\n styleguideId,\n clientUserAgent,\n releaseId,\n );\n\n if (tree.length === 0) {\n throw new Error(\"Empty styleguide tree\");\n }\n\n const formattedTree = formatTreeAsJson(tree);\n const structuredContent = singleStyleguideMode\n ? { styleguideName: context.styleguideName, pages: formattedTree }\n : { pages: formattedTree };\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\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,EACL,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,uBAAuB,CACrB,MAAM,EACN,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,sTAAsT;QACxT,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,WAAW,EAAE,CAAC;iBACX,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,EAAE,EAAE,CAAC;qBACF,MAAM,EAAE;qBACR,QAAQ,CAAC,2CAA2C,CAAC;gBACxD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;aACzD,CAAC,CACH;iBACA,QAAQ,CAAC,8CAA8C,CAAC;SAC5D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE;QACzC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAExE,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,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;QAElE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;iBACjD;aACF;YACD,iBAAiB;SAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAc,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC5C,CAAC,CAAC,KAAK,CAAC;IACN,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC;aACF,MAAM,EAAE;aACR,QAAQ,CAAC,wDAAwD,CAAC;QACrE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACjD,CAAC;IACF,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC;CACrC,CAAC,CACH,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,OAAsB;IAC7E,MAAM,oBAAoB,GACxB,OAAO,CAAC,cAAc,KAAK,0BAA0B,CAAC;IAExD,uBAAuB,CACrB,MAAM,EACN,YAAY,EACZ;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,oBAAoB;YAClB,CAAC,CAAC,+PAA+P;YACjQ,CAAC,CAAC,uUAAuU;QAC7U,WAAW,EAAE;YACX,GAAG,CAAC,oBAAoB;gBACtB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,YAAY,EAAE,CAAC;yBACZ,MAAM,EAAE;yBACR,GAAG,EAAE;yBACL,GAAG,CAAC,CAAC,CAAC;yBACN,QAAQ,CACP,uFAAuF,CACxF;iBACJ,CAAC;YACN,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,QAAQ,CACP,qHAAqH,CACtH;SACJ;QACD,YAAY,EAAE;YACZ,GAAG,CAAC,oBAAoB;gBACtB,CAAC,CAAC;oBACE,cAAc,EAAE,CAAC;yBACd,MAAM,EAAE;yBACR,QAAQ,CAAC,6BAA6B,CAAC;iBAC3C;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;iBACL,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC;iBAClC,QAAQ,CACP,mLAAmL,CACpL;SACJ;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAI,IAA+B,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,YAAY,GAChB,OAAO,CAAC,cAAc,KAAK,0BAA0B;gBACnD,CAAC,CAAC,OAAO,CAAC,YAAY;gBACtB,CAAC,CAAE,IAAiC,CAAC,YAAY,CAAC;YAEtD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAClC,WAAW,EACX,YAAY,EACZ,eAAe,EACf,SAAS,CACV,CAAC;YAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,iBAAiB,GAAG,oBAAoB;gBAC5C,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE;gBAClE,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;YAE7B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;qBACjD;iBACF;gBACD,iBAAiB;aAClB,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":"40007100-5858-52c5-8440-9bdc646ab841"}
{"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 { ApiError } from \"../api/errors.js\";\nimport { getStyleguideTree, listStyleguides, listStyleguideVersions } from \"../api/styleguide.js\";\nimport {\n formatStyleguideListAsJson,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\nimport { getCredentials } from \"../common/credentials.js\";\nimport { registerTrackedToolCall } from \"../logging.js\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerListStyleguidesTool(server: McpServer) {\n registerTrackedToolCall(\n server,\n \"list-styleguides\",\n {\n title: \"List styleguides\",\n description:\n \"Discover available design systems that provide documented guidance for components, patterns, and styles. Call this tool first. If multiple systems are available, confirm with the user which should be used.\\n\\n*Helpful to reference before generating UI so decisions can reflect established design approaches.*\",\n inputSchema: {},\n outputSchema: {\n styleguides: z\n .array(\n z.object({\n id: z\n .number()\n .describe(\"The unique identifier for the styleguide.\"),\n name: z.string().describe(\"The name of the styleguide.\"),\n }),\n )\n .describe(\"List of available design system styleguides.\"),\n },\n annotations: {\n title: \"List styleguides\",\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async (_, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n const styleguides = await listStyleguides(credentials, clientUserAgent);\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 const structuredContent = formatStyleguideListAsJson(styleguides);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n };\n },\n );\n}\n\nconst pageNodeSchema: z.ZodType = z.lazy(() =>\n z.union([\n z.object({\n id: z\n .number()\n .describe(\"The page ID. Use with `get-page` to fetch its content.\"),\n url: z.string().describe(\"The URL of the page.\"),\n }),\n z.record(z.string(), pageNodeSchema),\n ]),\n);\n\nconst releasesSchema = z\n .array(\n z.object({\n id: z.number().describe(\"The unique identifier for the release. Pass as `releaseId` to other tools when the user requests a specific release.\"),\n name: z.string().describe(\"The name of the release.\"),\n default: z.boolean().describe(\"Whether this is the default release shown to viewers.\"),\n working_version: z.boolean().describe(\"Whether this is the current work-in-progress release.\"),\n created_at: z.string().describe(\"When the release was created.\"),\n release_notes: z.string().nullable().describe(\"Release notes for this release.\"),\n }),\n )\n .describe(\"Available releases for the styleguide, newest first.\");\n\nexport function registerListReleasesTool(server: McpServer, context: ServerContext) {\n const singleStyleguideMode =\n context.connectionMode === \"remote_single_styleguide\";\n\n registerTrackedToolCall(\n server,\n \"list-releases\",\n {\n title: \"List releases in a styleguide\",\n description:\n \"List available releases for a styleguide. Only call this when the user has explicitly asked about releases or wants content from a specific release. Do not use `releaseId` in other tools unless the user has requested a particular release — all tools default to the latest published content.\",\n inputSchema: {\n ...(singleStyleguideMode\n ? {}\n : {\n styleguideId: z\n .number()\n .int()\n .min(1)\n .describe(\n \"The design system to list releases for. Use `list-styleguides` to discover available systems.\",\n ),\n }),\n },\n outputSchema: {\n releases: releasesSchema,\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (args, { authInfo }, clientUserAgent) => {\n try {\n const credentials = await getCredentials(authInfo);\n const styleguideId =\n singleStyleguideMode\n ? context.styleguideId\n : (args as { styleguideId: number }).styleguideId;\n\n if (typeof styleguideId !== \"number\") {\n throw new Error(\"Missing styleguideId\");\n }\n\n const versions = await listStyleguideVersions(credentials, styleguideId, clientUserAgent);\n const structuredContent = { releases: releasesSchema.parse(versions) };\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n };\n } catch (e) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: e instanceof ApiError\n ? e.message\n : \"Could not get releases for this styleguide.\",\n },\n ],\n };\n }\n },\n );\n}\n\nexport function registerListPagesTool(server: McpServer, context: ServerContext) {\n const singleStyleguideMode =\n context.connectionMode === \"remote_single_styleguide\";\n\n registerTrackedToolCall(\n server,\n \"list-pages\",\n {\n title: \"List pages in a styleguide\",\n description:\n singleStyleguideMode\n ? \"View the navigation hierarchy of the current design system — including categories, pages, and tabs — to better understand how guidance is organized.\\n\\n*Helpful when determining where to look for component or pattern documentation before generating UI.*\"\n : \"View the navigation hierarchy of a design system — including categories, pages, and tabs — to better understand how guidance is organized. Call this tool immediately after list-styleguides with the desired styleguide ID.\\n\\n*Helpful when determining where to look for component or pattern documentation before generating UI.*\",\n inputSchema: {\n ...(singleStyleguideMode\n ? {}\n : {\n styleguideId: z\n .number()\n .int()\n .min(1)\n .describe(\n \"The design system to reference. Use `list-styleguides` to discover available systems.\",\n ),\n }),\n releaseId: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\n \"Optional. Do not provide unless the user has explicitly asked for a specific release. Use `list-releases` to discover available releases.\",\n ),\n },\n outputSchema: {\n ...(singleStyleguideMode\n ? {\n styleguideName: z\n .string()\n .describe(\"The name of the styleguide.\"),\n }\n : {}),\n pages: z\n .record(z.string(), pageNodeSchema)\n .describe(\n \"A hierarchical navigation tree of the design system. Keys are category or page names. Page leaf nodes have { id, url } properties; category nodes contain further nested objects.\",\n ),\n },\n annotations: {\n title: \"List pages in a styleguide\",\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async (args, { authInfo }, clientUserAgent) => {\n const releaseId = (args as { releaseId?: number }).releaseId;\n try {\n const credentials = await getCredentials(authInfo);\n const styleguideId =\n context.connectionMode === \"remote_single_styleguide\"\n ? context.styleguideId\n : (args as { styleguideId: number }).styleguideId;\n\n if (typeof styleguideId !== \"number\") {\n throw new Error(\"Missing styleguideId\");\n }\n\n const tree = await getStyleguideTree(\n credentials,\n styleguideId,\n clientUserAgent,\n releaseId,\n );\n\n if (tree.length === 0) {\n throw new Error(\"Empty styleguide tree\");\n }\n\n const formattedTree = formatTreeAsJson(tree);\n const structuredContent = singleStyleguideMode\n ? { styleguideName: context.styleguideName, pages: formattedTree }\n : { pages: formattedTree };\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\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,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,uBAAuB,CACrB,MAAM,EACN,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,sTAAsT;QACxT,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,WAAW,EAAE,CAAC;iBACX,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,EAAE,EAAE,CAAC;qBACF,MAAM,EAAE;qBACR,QAAQ,CAAC,2CAA2C,CAAC;gBACxD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;aACzD,CAAC,CACH;iBACA,QAAQ,CAAC,8CAA8C,CAAC;SAC5D;QACD,WAAW,EAAE;YACX,KAAK,EAAE,kBAAkB;YACzB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE;QACzC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAExE,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,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;QAElE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;iBACjD;aACF;YACD,iBAAiB;SAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAc,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC5C,CAAC,CAAC,KAAK,CAAC;IACN,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC;aACF,MAAM,EAAE;aACR,QAAQ,CAAC,wDAAwD,CAAC;QACrE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACjD,CAAC;IACF,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC;CACrC,CAAC,CACH,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC;KACrB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;IACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sHAAsH,CAAC;IAC/I,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACrD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IACtF,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC9F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAChE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CACjF,CAAC,CACH;KACA,QAAQ,CAAC,sDAAsD,CAAC,CAAC;AAEpE,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,OAAsB;IAChF,MAAM,oBAAoB,GACxB,OAAO,CAAC,cAAc,KAAK,0BAA0B,CAAC;IAExD,uBAAuB,CACrB,MAAM,EACN,eAAe,EACf;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EACT,oSAAoS;QACtS,WAAW,EAAE;YACX,GAAG,CAAC,oBAAoB;gBACtB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,YAAY,EAAE,CAAC;yBACZ,MAAM,EAAE;yBACR,GAAG,EAAE;yBACL,GAAG,CAAC,CAAC,CAAC;yBACN,QAAQ,CACP,+FAA+F,CAChG;iBACJ,CAAC;SACP;QACD,YAAY,EAAE;YACZ,QAAQ,EAAE,cAAc;SACzB;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,YAAY,GAChB,oBAAoB;gBAClB,CAAC,CAAC,OAAO,CAAC,YAAY;gBACtB,CAAC,CAAE,IAAiC,CAAC,YAAY,CAAC;YAEtD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;YAC1F,MAAM,iBAAiB,GAAG,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAEvE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;qBACjD;iBACF;gBACD,iBAAiB;aAClB,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,CAAC,YAAY,QAAQ;4BACzB,CAAC,CAAC,CAAC,CAAC,OAAO;4BACX,CAAC,CAAC,6CAA6C;qBAClD;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,OAAsB;IAC7E,MAAM,oBAAoB,GACxB,OAAO,CAAC,cAAc,KAAK,0BAA0B,CAAC;IAExD,uBAAuB,CACrB,MAAM,EACN,YAAY,EACZ;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,oBAAoB;YAClB,CAAC,CAAC,+PAA+P;YACjQ,CAAC,CAAC,uUAAuU;QAC7U,WAAW,EAAE;YACX,GAAG,CAAC,oBAAoB;gBACtB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,YAAY,EAAE,CAAC;yBACZ,MAAM,EAAE;yBACR,GAAG,EAAE;yBACL,GAAG,CAAC,CAAC,CAAC;yBACN,QAAQ,CACP,uFAAuF,CACxF;iBACJ,CAAC;YACN,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,QAAQ,CACP,2IAA2I,CAC5I;SACJ;QACD,YAAY,EAAE;YACZ,GAAG,CAAC,oBAAoB;gBACtB,CAAC,CAAC;oBACE,cAAc,EAAE,CAAC;yBACd,MAAM,EAAE;yBACR,QAAQ,CAAC,6BAA6B,CAAC;iBAC3C;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;iBACL,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC;iBAClC,QAAQ,CACP,mLAAmL,CACpL;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,4BAA4B;YACnC,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAI,IAA+B,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,YAAY,GAChB,OAAO,CAAC,cAAc,KAAK,0BAA0B;gBACnD,CAAC,CAAC,OAAO,CAAC,YAAY;gBACtB,CAAC,CAAE,IAAiC,CAAC,YAAY,CAAC;YAEtD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAClC,WAAW,EACX,YAAY,EACZ,eAAe,EACf,SAAS,CACV,CAAC;YAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,iBAAiB,GAAG,oBAAoB;gBAC5C,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE;gBAClE,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;YAE7B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;qBACjD;iBACF;gBACD,iBAAiB;aAClB,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":"1f896b4f-8093-5778-8702-a6f5a6ba909b"}

@@ -5,3 +5,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]="09d81793-58c0-53b6-9fd8-b4523b8eafdf")}catch(e){}}();
!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]="6b1d50e3-b7f8-5bdd-adf6-2c5211aafabd")}catch(e){}}();
import { z } from "zod";

@@ -21,3 +21,7 @@ import { getTokenSetExport } from "../api/token.js";

annotations: {
title: "List token sets",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},

@@ -47,3 +51,7 @@ }, async () => {

annotations: {
title: "Get tokens",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},

@@ -76,2 +84,2 @@ }, async ({ tokenSetId }, { authInfo }, clientUserAgent) => {

//# sourceMappingURL=token.js.map
//# debugId=09d81793-58c0-53b6-9fd8-b4523b8eafdf
//# debugId=6b1d50e3-b7f8-5bdd-adf6-2c5211aafabd

@@ -1,1 +0,1 @@

{"version":3,"file":"token.js","sources":["tools/token.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Token Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport { getTokenSetExport } from \"../api/token.js\";\nimport { getCredentials } from \"../common/credentials.js\";\nimport { registerTrackedToolCall } from \"../logging.js\";\nimport { formatTokenSetsAsMarkdown } from \"../common/formatters/token.js\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerListTokenSetsTool(\n server: McpServer,\n context: ServerContext,\n) {\n if (!context.features[\"TREE-2686_mcp_experimental_tools\"]) {\n return;\n }\n\n registerTrackedToolCall(\n server,\n \"list-token-sets\",\n {\n title: \"List token sets\",\n description: \"List all accessible token sets\",\n inputSchema: {},\n annotations: {\n readOnlyHint: true,\n },\n },\n async () => {\n return {\n content: [\n {\n type: \"text\",\n text: formatTokenSetsAsMarkdown(context.tokenSets ?? []),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n\nexport function registerGetTokensTool(\n server: McpServer,\n context: ServerContext,\n) {\n if (!context.features[\"TREE-2686_mcp_experimental_tools\"]) {\n return;\n }\n\n registerTrackedToolCall(\n server,\n \"get-tokens\",\n {\n title: \"Get tokens\",\n description:\n \"Fetch W3C design tokens from a token set. Use list-token-sets to find the token set ID.\",\n inputSchema: {\n tokenSetId: z.number().int().min(1).describe(\"The token set ID\"),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async ({ tokenSetId }, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n\n const tokens = await getTokenSetExport(credentials, tokenSetId, clientUserAgent);\n\n if (tokens === null) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not fetch tokens. Ensure the token set ID is valid and the token set has been published.\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(tokens, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAG1E,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,OAAsB;IAEtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,uBAAuB,CACrB,MAAM,EACN,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,gCAAgC;QAC7C,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;oBACxD,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,OAAsB;IAEtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,uBAAuB,CACrB,MAAM,EACN,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,yFAAyF;QAC3F,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SACjE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE;QACtD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAEjF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gGAAgG;qBACvG;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrC,QAAQ,EAAE,kBAAkB;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"09d81793-58c0-53b6-9fd8-b4523b8eafdf"}
{"version":3,"file":"token.js","sources":["tools/token.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Token Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport { getTokenSetExport } from \"../api/token.js\";\nimport { getCredentials } from \"../common/credentials.js\";\nimport { registerTrackedToolCall } from \"../logging.js\";\nimport { formatTokenSetsAsMarkdown } from \"../common/formatters/token.js\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerListTokenSetsTool(\n server: McpServer,\n context: ServerContext,\n) {\n if (!context.features[\"TREE-2686_mcp_experimental_tools\"]) {\n return;\n }\n\n registerTrackedToolCall(\n server,\n \"list-token-sets\",\n {\n title: \"List token sets\",\n description: \"List all accessible token sets\",\n inputSchema: {},\n annotations: {\n title: \"List token sets\",\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async () => {\n return {\n content: [\n {\n type: \"text\",\n text: formatTokenSetsAsMarkdown(context.tokenSets ?? []),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n\nexport function registerGetTokensTool(\n server: McpServer,\n context: ServerContext,\n) {\n if (!context.features[\"TREE-2686_mcp_experimental_tools\"]) {\n return;\n }\n\n registerTrackedToolCall(\n server,\n \"get-tokens\",\n {\n title: \"Get tokens\",\n description:\n \"Fetch W3C design tokens from a token set. Use list-token-sets to find the token set ID.\",\n inputSchema: {\n tokenSetId: z.number().int().min(1).describe(\"The token set ID\"),\n },\n annotations: {\n title: \"Get tokens\",\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async ({ tokenSetId }, { authInfo }, clientUserAgent) => {\n const credentials = await getCredentials(authInfo);\n\n const tokens = await getTokenSetExport(credentials, tokenSetId, clientUserAgent);\n\n if (tokens === null) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not fetch tokens. Ensure the token set ID is valid and the token set has been published.\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(tokens, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAG1E,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,OAAsB;IAEtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,uBAAuB,CACrB,MAAM,EACN,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,gCAAgC;QAC7C,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,KAAK,EAAE,iBAAiB;YACxB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;oBACxD,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,OAAsB;IAEtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,uBAAuB,CACrB,MAAM,EACN,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,yFAAyF;QAC3F,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SACjE;QACD,WAAW,EAAE;YACX,KAAK,EAAE,YAAY;YACnB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE;QACtD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAEjF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gGAAgG;qBACvG;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrC,QAAQ,EAAE,kBAAkB;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"6b1d50e3-b7f8-5bdd-adf6-2c5211aafabd"}
{
"name": "@zeroheight/mcp-server",
"version": "2.6.0",
"version": "2.7.0",
"description": "MCP server for zeroheight",

@@ -21,2 +21,4 @@ "mcpName": "com.zeroheight/zeroheight",

"lint": "prettier --write .",
"lint:staged": "lint-staged",
"prepare": "husky",
"test": "rstest",

@@ -61,4 +63,10 @@ "sentry:sourcemaps:local": "./upload-sourcemaps.sh local",

"@types/node": "^24.2.0",
"husky": "^9.1.7",
"lint-staged": "^16.4.0",
"prettier": "^3.6.2"
}
},
"lint-staged": {
"*": "prettier --write --ignore-unknown"
},
"prettier": {}
}