@zeroheight/mcp-server 1.3.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/api/api.js +3 -2
- package/dist/api/api.js.map +1 -1
- package/dist/api/page.js +31 -2
- package/dist/api/page.js.map +1 -1
- package/dist/api/types/page.js +2 -2
- package/dist/api/types/page.js.map +1 -1
- package/dist/common/credentials.js +3 -2
- package/dist/common/credentials.js.map +1 -1
- package/dist/common/formatters/page.js +2 -2
- package/dist/common/formatters/page.js.map +1 -1
- package/dist/mcp-server.js +7 -15
- package/dist/mcp-server.js.map +1 -1
- package/dist/tools/page.js +70 -34
- package/dist/tools/page.js.map +1 -1
- package/dist/tools/styleguide.js +8 -34
- package/dist/tools/styleguide.js.map +1 -1
- package/package.json +2 -1
- package/dist/resources/page.js +0 -64
- package/dist/resources/page.js.map +0 -1
- package/dist/resources/styleguide.js +0 -81
- package/dist/resources/styleguide.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
## Release notes
|
|
2
2
|
|
|
3
|
+
## [2.1.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/2.1.0) - 9th December 2025
|
|
4
|
+
|
|
5
|
+
- Beta feature
|
|
6
|
+
|
|
7
|
+
## [2.0.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/2.0.0) - 28th November 2025
|
|
8
|
+
|
|
9
|
+
- Remove resources
|
|
10
|
+
|
|
3
11
|
## [1.3.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.3.0) - 12th November 2025
|
|
4
12
|
|
|
5
13
|
- Only return published pages, categories and navigations to MCP clients
|
package/dist/api/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="84ff6650-a8f8-5c0b-9cd9-6a6cd07211cf")}catch(e){}}();
|
|
3
3
|
import * as Sentry from "@sentry/node";
|
|
4
4
|
import { IncorrectScopeError, MaxRetriesError, UnauthorizedError, UnknownError, } from "./errors.js";
|
|
5
5
|
import packageJson from "../../package.json" with { type: "json" };
|
|
@@ -45,6 +45,7 @@ export async function request(path, credentials, init, search) {
|
|
|
45
45
|
};
|
|
46
46
|
if (credentials.type === "jwt") {
|
|
47
47
|
headers["Authorization"] = `Bearer ${credentials.jwt}`;
|
|
48
|
+
headers["X-API-CLIENT-NAME"] = "remote-mcp-server";
|
|
48
49
|
}
|
|
49
50
|
else {
|
|
50
51
|
headers["X-API-CLIENT"] = credentials.client;
|
|
@@ -117,4 +118,4 @@ export async function internalRequest(path, method, body) {
|
|
|
117
118
|
return responseJson;
|
|
118
119
|
}
|
|
119
120
|
//# sourceMappingURL=api.js.map
|
|
120
|
-
//# debugId=
|
|
121
|
+
//# debugId=84ff6650-a8f8-5c0b-9cd9-6a6cd07211cf
|
package/dist/api/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":["api/api.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport {\n IncorrectScopeError,\n MaxRetriesError,\n UnauthorizedError,\n UnknownError,\n} from \"./errors.js\";\n\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nimport { Credentials } from \"../common/credentials.js\";\n\nconst API_PATH = \"/open_api/v2\";\nconst USER_AGENT = `zeroheight-mcp-server/${packageJson.version}`;\n\nexport enum ResponseStatus {\n Success = \"success\",\n Error = \"error\",\n Fail = \"fail\",\n}\n\n/**\n * Open API V2 Response format\n */\n\ninterface BaseResponse<T> {\n status: ResponseStatus;\n message: string;\n data: T;\n}\n\ninterface SuccessResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Success;\n}\n\ninterface FailResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Fail;\n}\n\ninterface ErrorResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Error;\n}\n\nexport type APIResponse<S = {}, F = {}, E = {}> =\n | SuccessResponse<S>\n | FailResponse<F>\n | ErrorResponse<E>;\n\n/**\n * Get the correct URL for production of development depending on the environment variable\n */\nexport function getZeroheightURL() {\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n return new URL(\"https://zeroheight.dev\");\n } else {\n return new URL(\"https://zeroheight.com\");\n }\n}\n\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function request<R>(\n path: string,\n credentials: Credentials,\n init: RequestInit,\n search?: URLSearchParams,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = API_PATH + path;\n if (search) {\n url.search = \"?\" + search.toString();\n }\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const maxRetries = 3;\n let retries = 0;\n\n const headers: Record<string, string> = {\n \"X-API-CLIENT-NAME\": \"mcp-server\",\n \"X-API-CLIENT-VERSION\": packageJson.version,\n \"User-Agent\": USER_AGENT,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n if (credentials.type === \"jwt\") {\n headers[\"Authorization\"] = `Bearer ${credentials.jwt}`;\n } else {\n headers[\"X-API-CLIENT\"] = credentials.client;\n headers[\"X-API-KEY\"] = credentials.token;\n }\n\n while (retries < maxRetries) {\n const response = await fetch(url, {\n ...init,\n headers,\n });\n\n if (response.status === 401) {\n console.error(\"Unauthorized response from API\", {\n response: { status: response.status, body: await response.text() },\n });\n throw new UnauthorizedError();\n } else if (response.status === 429) {\n retries++;\n const responseData = await response.json();\n const waitTime = responseData.data.reset_time * 1000 - Date.now();\n await sleep(waitTime);\n continue;\n } else if (response.status < 200 || response.status >= 300) {\n console.error(\"API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 403) {\n throw new IncorrectScopeError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n }\n\n throw new MaxRetriesError();\n}\n\nexport async function internalRequest<R>(\n path: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n body: any,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = \"/api\" + path;\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": USER_AGENT,\n \"X-API-KEY\": process.env[\"INTERNAL_API_KEY\"] || \"\",\n },\n body: JSON.stringify(body),\n });\n\n if (response.status < 200 || response.status >= 300) {\n console.error(\"Internal API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 401) {\n throw new UnauthorizedError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making internal request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,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,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,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;IAExB,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,GAAG,CAAC,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC/B,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,WAAW,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC/B,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,WAAW,CAAC,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sources":["api/api.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport {\n IncorrectScopeError,\n MaxRetriesError,\n UnauthorizedError,\n UnknownError,\n} from \"./errors.js\";\n\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nimport { Credentials } from \"../common/credentials.js\";\n\nconst API_PATH = \"/open_api/v2\";\nconst USER_AGENT = `zeroheight-mcp-server/${packageJson.version}`;\n\nexport enum ResponseStatus {\n Success = \"success\",\n Error = \"error\",\n Fail = \"fail\",\n}\n\n/**\n * Open API V2 Response format\n */\n\ninterface BaseResponse<T> {\n status: ResponseStatus;\n message: string;\n data: T;\n}\n\ninterface SuccessResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Success;\n}\n\ninterface FailResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Fail;\n}\n\ninterface ErrorResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Error;\n}\n\nexport type APIResponse<S = {}, F = {}, E = {}> =\n | SuccessResponse<S>\n | FailResponse<F>\n | ErrorResponse<E>;\n\n/**\n * Get the correct URL for production of development depending on the environment variable\n */\nexport function getZeroheightURL() {\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n return new URL(\"https://zeroheight.dev\");\n } else {\n return new URL(\"https://zeroheight.com\");\n }\n}\n\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function request<R>(\n path: string,\n credentials: Credentials,\n init: RequestInit,\n search?: URLSearchParams,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = API_PATH + path;\n if (search) {\n url.search = \"?\" + search.toString();\n }\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const maxRetries = 3;\n let retries = 0;\n\n const headers: Record<string, string> = {\n \"X-API-CLIENT-NAME\": \"mcp-server\",\n \"X-API-CLIENT-VERSION\": packageJson.version,\n \"User-Agent\": USER_AGENT,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n if (credentials.type === \"jwt\") {\n headers[\"Authorization\"] = `Bearer ${credentials.jwt}`;\n headers[\"X-API-CLIENT-NAME\"] = \"remote-mcp-server\";\n } else {\n headers[\"X-API-CLIENT\"] = credentials.client;\n headers[\"X-API-KEY\"] = credentials.token;\n }\n\n while (retries < maxRetries) {\n const response = await fetch(url, {\n ...init,\n headers,\n });\n\n if (response.status === 401) {\n console.error(\"Unauthorized response from API\", {\n response: { status: response.status, body: await response.text() },\n });\n throw new UnauthorizedError();\n } else if (response.status === 429) {\n retries++;\n const responseData = await response.json();\n const waitTime = responseData.data.reset_time * 1000 - Date.now();\n await sleep(waitTime);\n continue;\n } else if (response.status < 200 || response.status >= 300) {\n console.error(\"API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 403) {\n throw new IncorrectScopeError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n }\n\n throw new MaxRetriesError();\n}\n\nexport async function internalRequest<R>(\n path: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n body: any,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = \"/api\" + path;\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": USER_AGENT,\n \"X-API-KEY\": process.env[\"INTERNAL_API_KEY\"] || \"\",\n },\n body: JSON.stringify(body),\n });\n\n if (response.status < 200 || response.status >= 300) {\n console.error(\"Internal API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 401) {\n throw new UnauthorizedError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making internal request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n}\n"],"names":[],"mappings":"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","debug_id":"84ff6650-a8f8-5c0b-9cd9-6a6cd07211cf"}
|
package/dist/api/page.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c0906784-1b58-5e49-b986-94f3d2cb0468")}catch(e){}}();
|
|
3
3
|
import { request } from "./api.js";
|
|
4
4
|
import { UnknownError } from "./errors.js";
|
|
5
5
|
import { captureException } from "../common/errors.js";
|
|
@@ -46,5 +46,34 @@ export async function getPage(credentials, pageId, optionalParams = {}) {
|
|
|
46
46
|
return null;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
+
export async function searchPages(credentials, styleguideId, query, releaseId) {
|
|
50
|
+
try {
|
|
51
|
+
const filters = {
|
|
52
|
+
type: "page",
|
|
53
|
+
styleguide_id: styleguideId,
|
|
54
|
+
};
|
|
55
|
+
if (typeof releaseId === "number") {
|
|
56
|
+
filters["styleguide_version_id"] = releaseId;
|
|
57
|
+
}
|
|
58
|
+
const response = await request(`/search`, credentials, {
|
|
59
|
+
method: "POST",
|
|
60
|
+
headers: {
|
|
61
|
+
"Content-Type": "application/json",
|
|
62
|
+
},
|
|
63
|
+
body: JSON.stringify({
|
|
64
|
+
query,
|
|
65
|
+
filters,
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
if ("results" in response.data) {
|
|
69
|
+
return response.data.results;
|
|
70
|
+
}
|
|
71
|
+
throw new UnknownError();
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
captureException(e);
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
49
78
|
//# sourceMappingURL=page.js.map
|
|
50
|
-
//# debugId=
|
|
79
|
+
//# debugId=c0906784-1b58-5e49-b986-94f3d2cb0468
|
package/dist/api/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sources":["api/page.ts"],"sourceRoot":"/","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"page.js","sources":["api/page.ts"],"sourceRoot":"/","sourcesContent":["import { Credentials } from \"../common/credentials.js\";\nimport { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport { Page, PageListItem, PageSearchResultItem } from \"./types/page.js\";\nimport { captureException } from \"../common/errors.js\";\n\ninterface PageListSuccessResponse {\n pages: PageListItem[];\n}\n\ninterface PageListOptionalParams {\n searchTerm: string;\n releaseId: number;\n}\n\nexport async function listPages(\n credentials: Credentials,\n styleguideId: number,\n optionalParams: Partial<PageListOptionalParams> = {}\n) {\n try {\n const searchParams = new URLSearchParams({\n show_hidden: \"false\",\n });\n\n if (optionalParams.releaseId) {\n searchParams.set(\"release_id\", optionalParams.releaseId.toString());\n }\n\n if (optionalParams.searchTerm) {\n searchParams.set(\"search\", optionalParams.searchTerm);\n }\n\n const response = await request<\n APIResponse<PageListSuccessResponse, {}, {}>\n >(\n `/styleguides/${styleguideId}/pages`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams\n );\n\n if (\"pages\" in response.data) {\n return response.data.pages;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n\ninterface PageSuccessResponse {\n page: Page;\n}\n\ninterface PageOptionalParams {\n releaseId: number;\n}\n\nexport async function getPage(\n credentials: Credentials,\n pageId: number | string,\n optionalParams: Partial<PageOptionalParams> = {}\n) {\n try {\n const searchParams = new URLSearchParams();\n\n if (optionalParams.releaseId) {\n searchParams.set(\"release_id\", optionalParams.releaseId.toString());\n }\n\n const response = await request<APIResponse<PageSuccessResponse, {}, {}>>(\n `/pages/${pageId}`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams\n );\n\n if (\"page\" in response.data) {\n return response.data.page;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return null;\n }\n}\n\ninterface SearchSuccessResponse {\n results: PageSearchResultItem[];\n}\n\nexport async function searchPages(\n credentials: Credentials,\n styleguideId: number,\n query: string,\n releaseId?: number\n) {\n try {\n const filters: Record<string, number | string> = {\n type: \"page\",\n styleguide_id: styleguideId,\n };\n\n if (typeof releaseId === \"number\") {\n filters[\"styleguide_version_id\"] = releaseId;\n }\n\n const response = await request<APIResponse<SearchSuccessResponse, {}, {}>>(\n `/search`,\n credentials,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query,\n filters,\n }),\n }\n );\n\n if (\"results\" in response.data) {\n return response.data.results;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAWvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,WAAwB,EACxB,YAAoB,EACpB,iBAAkD,EAAE;IAEpD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;YACvC,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QAEH,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;YAC9B,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,YAAY,QAAQ,EACpC,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,WAAwB,EACxB,MAAuB,EACvB,iBAA8C,EAAE;IAEhD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAE3C,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,UAAU,MAAM,EAAE,EAClB,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAwB,EACxB,YAAoB,EACpB,KAAa,EACb,SAAkB;IAElB,IAAI,CAAC;QACH,MAAM,OAAO,GAAoC;YAC/C,IAAI,EAAE,MAAM;YACZ,aAAa,EAAE,YAAY;SAC5B,CAAC;QAEF,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,uBAAuB,CAAC,GAAG,SAAS,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,SAAS,EACT,WAAW,EACX;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,OAAO;aACR,CAAC;SACH,CACF,CAAC;QAEF,IAAI,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,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","debug_id":"c0906784-1b58-5e49-b986-94f3d2cb0468"}
|
package/dist/api/types/page.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="bf5b0fee-6c8e-580b-8cc7-2bb23ef8efb0")}catch(e){}}();
|
|
3
3
|
export {};
|
|
4
4
|
//# sourceMappingURL=page.js.map
|
|
5
|
-
//# debugId=
|
|
5
|
+
//# debugId=bf5b0fee-6c8e-580b-8cc7-2bb23ef8efb0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sources":["api/types/page.ts"],"sourceRoot":"/","sourcesContent":["export interface PageListItem {\n id: number;\n name: string;\n hidden: boolean;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Tab {\n name: string;\n hidden: boolean;\n order: number;\n uid: string;\n url: string;\n content: string;\n}\n\nexport interface PageStatus {\n id: string;\n name: string;\n}\n\nexport interface Page {\n id: number;\n uid: string;\n slug: string;\n url: string;\n name: string;\n introduction: string;\n hidden: boolean;\n locked: boolean;\n created_at: string;\n updated_at: string;\n status: PageStatus | null;\n tabs?: Tab[];\n content?: string;\n}\n"],"names":[],"mappings":"","debug_id":"
|
|
1
|
+
{"version":3,"file":"page.js","sources":["api/types/page.ts"],"sourceRoot":"/","sourcesContent":["export interface PageListItem {\n id: number;\n name: string;\n hidden: boolean;\n created_at: string;\n updated_at: string;\n}\n\nexport interface PageSearchResultItem {\n id: number;\n type: string;\n name: string;\n hidden: boolean;\n url: string;\n matching_chunk: string;\n score: number;\n}\n\nexport interface Tab {\n name: string;\n hidden: boolean;\n order: number;\n uid: string;\n url: string;\n content: string;\n}\n\nexport interface PageStatus {\n id: string;\n name: string;\n}\n\nexport interface Page {\n id: number;\n uid: string;\n slug: string;\n url: string;\n name: string;\n introduction: string;\n hidden: boolean;\n locked: boolean;\n created_at: string;\n updated_at: string;\n status: PageStatus | null;\n tabs?: Tab[];\n content?: string;\n}\n"],"names":[],"mappings":"","debug_id":"bf5b0fee-6c8e-580b-8cc7-2bb23ef8efb0"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="07c05406-ef6e-5651-b18b-da323e5fc8d1")}catch(e){}}();
|
|
3
3
|
import { MissingCredentialsError } from "./errors.js";
|
|
4
4
|
import { internalRequest } from "../api/api.js";
|
|
5
5
|
export function getCredentialsFromEnvironment() {
|
|
@@ -25,7 +25,8 @@ export async function getCredentials(authInfo) {
|
|
|
25
25
|
type: "jwt",
|
|
26
26
|
jwt: res.jwt,
|
|
27
27
|
styleguideId: res.styleguide_id,
|
|
28
|
+
features: res.features ?? {},
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
//# sourceMappingURL=credentials.js.map
|
|
31
|
-
//# debugId=
|
|
32
|
+
//# debugId=07c05406-ef6e-5651-b18b-da323e5fc8d1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sources":["common/credentials.ts"],"sourceRoot":"/","sourcesContent":["import { AuthInfo } from \"@modelcontextprotocol/sdk/server/auth/types.js\";\nimport { MissingCredentialsError } from \"./errors.js\";\nimport { internalRequest } from \"../api/api.js\";\n\nexport type Credentials =\n | {\n type: \"client_token\";\n token: string;\n client: string;\n }\n | {\n type: \"jwt\";\n jwt: string;\n styleguideId: number;\n };\n\nexport function getCredentialsFromEnvironment(): Credentials {\n const token = process.env[\"ZEROHEIGHT_ACCESS_TOKEN\"];\n const client = process.env[\"ZEROHEIGHT_CLIENT_ID\"];\n if (!token || !client) {\n throw new MissingCredentialsError();\n }\n\n return {\n type: \"client_token\",\n token,\n client,\n };\n}\n\ninterface JwtResponse {\n jwt: string;\n styleguide_id: number;\n}\n\nexport async function getCredentials(\n authInfo?: AuthInfo
|
|
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 features: Record<string, boolean>;\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 features: Record<string, boolean>;\n}\n\nexport async function getCredentials(\n authInfo?: AuthInfo\n): Promise<Credentials> {\n if (!authInfo) {\n return getCredentialsFromEnvironment();\n }\n\n const res = await internalRequest<JwtResponse>(\n \"/mcp_url/exchange_token\",\n \"POST\",\n {\n token: authInfo.token,\n }\n );\n\n return {\n type: \"jwt\",\n jwt: res.jwt,\n styleguideId: res.styleguide_id,\n features: res.features ?? {},\n };\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAehD,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;AAQD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAmB;IAEnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,6BAA6B,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,eAAe,CAC/B,yBAAyB,EACzB,MAAM,EACN;QACE,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;KAC7B,CAAC;AACJ,CAAC","debug_id":"07c05406-ef6e-5651-b18b-da323e5fc8d1"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="81d521fa-4cae-5fc7-9119-2f545af25cc6")}catch(e){}}();
|
|
3
3
|
export function formatPageAsMarkdown(page) {
|
|
4
4
|
const content = page.content ||
|
|
5
5
|
page.tabs?.map((tab) => `## ${tab.name}\n${tab.content}\n---\n`).join("\n");
|
|
@@ -17,4 +17,4 @@ export function formatPageListItemsAsMarkdown(pages) {
|
|
|
17
17
|
.join("\n");
|
|
18
18
|
}
|
|
19
19
|
//# sourceMappingURL=page.js.map
|
|
20
|
-
//# debugId=
|
|
20
|
+
//# debugId=81d521fa-4cae-5fc7-9119-2f545af25cc6
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sources":["common/formatters/page.ts"],"sourceRoot":"/","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"page.js","sources":["common/formatters/page.ts"],"sourceRoot":"/","sourcesContent":["import {\n Page,\n PageListItem,\n PageSearchResultItem,\n} from \"../../api/types/page.js\";\n\nexport function formatPageAsMarkdown(page: Page): string {\n const content =\n page.content ||\n page.tabs?.map((tab) => `## ${tab.name}\\n${tab.content}\\n---\\n`).join(\"\\n\");\n return [\n `# ${page.name}`,\n `[Web URL](${page.url})`,\n page.introduction,\n \"\\n\",\n content,\n ].join(\"\\n\");\n}\n\nexport function formatPageListItemsAsMarkdown(\n pages: (PageListItem | PageSearchResultItem)[]\n): string {\n return pages\n .map((page) => `- ${page.name ?? \"Untitled page\"} (ID: ${page.id})`)\n .join(\"\\n\");\n}\n"],"names":[],"mappings":";;AAMA,MAAM,UAAU,oBAAoB,CAAC,IAAU;IAC7C,MAAM,OAAO,GACX,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO;QACL,KAAK,IAAI,CAAC,IAAI,EAAE;QAChB,aAAa,IAAI,CAAC,GAAG,GAAG;QACxB,IAAI,CAAC,YAAY;QACjB,IAAI;QACJ,OAAO;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,KAA8C;IAE9C,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,eAAe,SAAS,IAAI,CAAC,EAAE,GAAG,CAAC;SACnE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC","debug_id":"81d521fa-4cae-5fc7-9119-2f545af25cc6"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d9ef5e56-d15c-5b8e-8f7f-22c28fd880b7")}catch(e){}}();
|
|
3
3
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
4
|
import packageJson from "../package.json" with { type: "json" };
|
|
5
|
-
import { registerStyleguideListResource, registerStyleguideResource, } from "./resources/styleguide.js";
|
|
6
|
-
import { registerListPagesResource, registerPageResource, } from "./resources/page.js";
|
|
7
5
|
import { registerGetStyleguideTreeTool, registerListStyleguidesTool, } from "./tools/styleguide.js";
|
|
8
|
-
import { registerGetPageTool, registerListPagesTool } from "./tools/page.js";
|
|
6
|
+
import { registerGetPageTool, registerListPagesTool, registerSearchPagesTool, } from "./tools/page.js";
|
|
9
7
|
import { recommendSummarizePagePrompt } from "./prompts/page.js";
|
|
10
8
|
import { registerRecommendPagesPrompt } from "./prompts/styleguide.js";
|
|
11
|
-
export function createServer() {
|
|
9
|
+
export function createServer(features = {}) {
|
|
12
10
|
const server = new McpServer({
|
|
13
11
|
name: "zeroheight",
|
|
14
12
|
version: packageJson.version,
|
|
@@ -17,23 +15,17 @@ export function createServer() {
|
|
|
17
15
|
tools: {},
|
|
18
16
|
},
|
|
19
17
|
});
|
|
20
|
-
// Register
|
|
18
|
+
// Register tools
|
|
21
19
|
[
|
|
22
20
|
registerListPagesTool,
|
|
23
21
|
registerGetPageTool,
|
|
24
22
|
registerListStyleguidesTool,
|
|
25
23
|
registerGetStyleguideTreeTool,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
[
|
|
29
|
-
registerStyleguideListResource,
|
|
30
|
-
registerStyleguideResource,
|
|
31
|
-
registerListPagesResource,
|
|
32
|
-
registerPageResource,
|
|
33
|
-
].forEach((fn) => fn(server));
|
|
24
|
+
registerSearchPagesTool,
|
|
25
|
+
].forEach((fn) => fn(server, features));
|
|
34
26
|
// Register all prompts
|
|
35
27
|
[registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) => fn(server));
|
|
36
28
|
return server;
|
|
37
29
|
}
|
|
38
30
|
//# sourceMappingURL=mcp-server.js.map
|
|
39
|
-
//# debugId=
|
|
31
|
+
//# debugId=d9ef5e56-d15c-5b8e-8f7f-22c28fd880b7
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sources":["mcp-server.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sources":["mcp-server.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n registerGetStyleguideTreeTool,\n registerListStyleguidesTool,\n} from \"./tools/styleguide.js\";\nimport {\n registerGetPageTool,\n registerListPagesTool,\n registerSearchPagesTool,\n} from \"./tools/page.js\";\nimport { recommendSummarizePagePrompt } from \"./prompts/page.js\";\nimport { registerRecommendPagesPrompt } from \"./prompts/styleguide.js\";\n\nexport function createServer(features: Record<string, boolean> = {}) {\n const server = new McpServer({\n name: \"zeroheight\",\n version: packageJson.version,\n capabilities: {\n resources: {},\n tools: {},\n },\n });\n\n // Register tools\n [\n registerListPagesTool,\n registerGetPageTool,\n registerListStyleguidesTool,\n registerGetStyleguideTreeTool,\n registerSearchPagesTool,\n ].forEach((fn) => fn(server, features));\n\n // Register all prompts\n [registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) =>\n fn(server)\n );\n\n return server;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEvE,MAAM,UAAU,YAAY,CAAC,WAAoC,EAAE;IACjE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IAEH,iBAAiB;IACjB;QACE,qBAAqB;QACrB,mBAAmB;QACnB,2BAA2B;QAC3B,6BAA6B;QAC7B,uBAAuB;KACxB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExC,uBAAuB;IACvB,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAC1E,EAAE,CAAC,MAAM,CAAC,CACX,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","debug_id":"d9ef5e56-d15c-5b8e-8f7f-22c28fd880b7"}
|
package/dist/tools/page.js
CHANGED
|
@@ -2,24 +2,21 @@
|
|
|
2
2
|
* Page Tools
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
5
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="dcf209c1-22ae-5f43-8f9e-0a88d093d5f0")}catch(e){}}();
|
|
6
6
|
import z from "zod";
|
|
7
|
-
import { getPage, listPages } from "../api/page.js";
|
|
7
|
+
import { getPage, listPages, searchPages } from "../api/page.js";
|
|
8
8
|
import { formatPageAsMarkdown, formatPageListItemsAsMarkdown, } from "../common/formatters/page.js";
|
|
9
9
|
import { getCredentials } from "../common/credentials.js";
|
|
10
|
-
export function registerListPagesTool(server) {
|
|
10
|
+
export function registerListPagesTool(server, _features) {
|
|
11
11
|
server.registerTool("list-pages", {
|
|
12
12
|
title: "List pages for a styleguide",
|
|
13
13
|
description: "List all accessible pages in a styleguide",
|
|
14
14
|
inputSchema: {
|
|
15
15
|
styleguideId: z.number().int().positive(),
|
|
16
|
-
releaseId: z.number().int().optional(),
|
|
16
|
+
releaseId: z.number().int().positive().optional(),
|
|
17
17
|
searchTerm: z.string().optional(),
|
|
18
|
-
responseFormat: z
|
|
19
|
-
.enum(["markdown", "resource_links"])
|
|
20
|
-
.default("markdown"),
|
|
21
18
|
},
|
|
22
|
-
}, async ({ styleguideId, releaseId, searchTerm
|
|
19
|
+
}, async ({ styleguideId, releaseId, searchTerm }, { authInfo }) => {
|
|
23
20
|
const credentials = await getCredentials(authInfo);
|
|
24
21
|
if (credentials.type === "jwt" &&
|
|
25
22
|
credentials.styleguideId !== styleguideId) {
|
|
@@ -48,40 +45,18 @@ export function registerListPagesTool(server) {
|
|
|
48
45
|
],
|
|
49
46
|
};
|
|
50
47
|
}
|
|
51
|
-
if (responseFormat === "markdown") {
|
|
52
|
-
return {
|
|
53
|
-
content: [
|
|
54
|
-
{
|
|
55
|
-
type: "text",
|
|
56
|
-
text: formatPageListItemsAsMarkdown(pages),
|
|
57
|
-
mimeType: "text/markdown",
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
const resourceLinks = pages.map((page) => ({
|
|
63
|
-
type: "resource_link",
|
|
64
|
-
uri: `zeroheight://styleguide/${styleguideId}/page/${page.id}`,
|
|
65
|
-
name: page.name ?? "Unnamed Page",
|
|
66
|
-
_meta: {
|
|
67
|
-
createdAt: page.created_at,
|
|
68
|
-
id: page.id,
|
|
69
|
-
},
|
|
70
|
-
mimeType: "text/markdown",
|
|
71
|
-
description: "Styleguide page",
|
|
72
|
-
}));
|
|
73
48
|
return {
|
|
74
49
|
content: [
|
|
75
50
|
{
|
|
76
51
|
type: "text",
|
|
77
|
-
text:
|
|
52
|
+
text: formatPageListItemsAsMarkdown(pages),
|
|
53
|
+
mimeType: "text/markdown",
|
|
78
54
|
},
|
|
79
|
-
...resourceLinks,
|
|
80
55
|
],
|
|
81
56
|
};
|
|
82
57
|
});
|
|
83
58
|
}
|
|
84
|
-
export function registerGetPageTool(server) {
|
|
59
|
+
export function registerGetPageTool(server, _features) {
|
|
85
60
|
server.registerTool("get-page", {
|
|
86
61
|
title: "Get a styleguide page",
|
|
87
62
|
description: "Get a page in the requested format",
|
|
@@ -126,5 +101,66 @@ export function registerGetPageTool(server) {
|
|
|
126
101
|
};
|
|
127
102
|
});
|
|
128
103
|
}
|
|
104
|
+
export function registerSearchPagesTool(server, features) {
|
|
105
|
+
if (features["SKI_2466_bedrock_indexing"] !== true) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
server.registerTool("search-pages", {
|
|
109
|
+
title: "Search pages in a styleguide",
|
|
110
|
+
description: "Search for pages in a styleguide by a search term",
|
|
111
|
+
inputSchema: {
|
|
112
|
+
styleguideId: z.number().int().positive(),
|
|
113
|
+
releaseId: z.number().int().positive().optional(),
|
|
114
|
+
searchTerm: z.string(),
|
|
115
|
+
responseFormat: z.enum(["markdown", "json"]).default("json"),
|
|
116
|
+
},
|
|
117
|
+
}, async ({ styleguideId, searchTerm, releaseId, responseFormat }, { authInfo }) => {
|
|
118
|
+
const credentials = await getCredentials(authInfo);
|
|
119
|
+
if (credentials.type === "jwt" &&
|
|
120
|
+
credentials.styleguideId !== styleguideId) {
|
|
121
|
+
return {
|
|
122
|
+
isError: true,
|
|
123
|
+
content: [
|
|
124
|
+
{
|
|
125
|
+
type: "text",
|
|
126
|
+
text: "You do not have access to this styleguide",
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const results = await searchPages(credentials, styleguideId, searchTerm, releaseId);
|
|
132
|
+
if (results.length === 0) {
|
|
133
|
+
return {
|
|
134
|
+
isError: true,
|
|
135
|
+
content: [
|
|
136
|
+
{
|
|
137
|
+
type: "text",
|
|
138
|
+
text: "No pages match that search term, try something else.",
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (responseFormat === "markdown") {
|
|
144
|
+
return {
|
|
145
|
+
content: [
|
|
146
|
+
{
|
|
147
|
+
type: "text",
|
|
148
|
+
text: formatPageListItemsAsMarkdown(results),
|
|
149
|
+
mimeType: "text/markdown",
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
content: [
|
|
156
|
+
{
|
|
157
|
+
type: "text",
|
|
158
|
+
text: JSON.stringify(results, null, 2),
|
|
159
|
+
mimeType: "application/json",
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
}
|
|
129
165
|
//# sourceMappingURL=page.js.map
|
|
130
|
-
//# debugId=
|
|
166
|
+
//# debugId=dcf209c1-22ae-5f43-8f9e-0a88d093d5f0
|
package/dist/tools/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sources":["tools/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport
|
|
1
|
+
{"version":3,"file":"page.js","sources":["tools/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport z from \"zod\";\n\nimport { getPage, listPages, searchPages } from \"../api/page.js\";\nimport {\n formatPageAsMarkdown,\n formatPageListItemsAsMarkdown,\n} from \"../common/formatters/page.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListPagesTool(\n server: McpServer,\n _features: Record<string, boolean>\n) {\n server.registerTool(\n \"list-pages\",\n {\n title: \"List pages for a styleguide\",\n description: \"List all accessible pages in a styleguide\",\n inputSchema: {\n styleguideId: z.number().int().positive(),\n releaseId: z.number().int().positive().optional(),\n searchTerm: z.string().optional(),\n },\n },\n async ({ styleguideId, releaseId, searchTerm }, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n if (\n credentials.type === \"jwt\" &&\n credentials.styleguideId !== styleguideId\n ) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"You do not have access to this styleguide\",\n },\n ],\n };\n }\n\n const pages = await listPages(credentials, styleguideId, {\n releaseId,\n searchTerm,\n });\n\n if (pages.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"There are no pages in this styleguide, check you have the correct styleguide ID\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: formatPageListItemsAsMarkdown(pages),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n );\n}\n\nexport function registerGetPageTool(\n server: McpServer,\n _features: Record<string, boolean>\n) {\n server.registerTool(\n \"get-page\",\n {\n title: \"Get a styleguide page\",\n description: \"Get a page in the requested format\",\n inputSchema: {\n pageId: z.string(),\n releaseId: z.number().int().optional(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n },\n },\n async ({ pageId, responseFormat }, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const page = await getPage(credentials, pageId);\n\n if (!page) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not find the page, check you have the correct page ID and release ID.\",\n },\n ],\n };\n }\n\n if (responseFormat === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatPageAsMarkdown(page),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(page, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n }\n );\n}\n\nexport function registerSearchPagesTool(\n server: McpServer,\n features: Record<string, boolean>\n) {\n if (features[\"SKI_2466_bedrock_indexing\"] !== true) {\n return;\n }\n server.registerTool(\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: {\n styleguideId: z.number().int().positive(),\n releaseId: z.number().int().positive().optional(),\n searchTerm: z.string(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n },\n },\n async (\n { styleguideId, searchTerm, releaseId, responseFormat },\n { authInfo }\n ) => {\n const credentials = await getCredentials(authInfo);\n if (\n credentials.type === \"jwt\" &&\n credentials.styleguideId !== styleguideId\n ) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"You do not have access to this styleguide\",\n },\n ],\n };\n }\n\n const results = await searchPages(\n credentials,\n styleguideId,\n searchTerm,\n releaseId\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":"dcf209c1-22ae-5f43-8f9e-0a88d093d5f0"}
|
package/dist/tools/styleguide.js
CHANGED
|
@@ -2,21 +2,17 @@
|
|
|
2
2
|
* Styleguide Tools
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
5
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8e279caa-2a6c-5171-8561-ff4a3a6351e4")}catch(e){}}();
|
|
6
6
|
import z from "zod";
|
|
7
7
|
import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
|
|
8
|
-
import {
|
|
8
|
+
import { formatStyleguideListAsMarkdown, formatTreeAsJson, } from "../common/formatters/styleguide.js";
|
|
9
9
|
import { getCredentials } from "../common/credentials.js";
|
|
10
10
|
export function registerListStyleguidesTool(server) {
|
|
11
11
|
server.registerTool("list-styleguides", {
|
|
12
12
|
title: "List styleguides",
|
|
13
|
-
description: "List all accessible styleguides as
|
|
14
|
-
inputSchema: {
|
|
15
|
-
|
|
16
|
-
.enum(["markdown", "resource_links"])
|
|
17
|
-
.default("markdown"),
|
|
18
|
-
},
|
|
19
|
-
}, async ({ responseType }, { authInfo }) => {
|
|
13
|
+
description: "List all accessible styleguides as markdown",
|
|
14
|
+
inputSchema: {},
|
|
15
|
+
}, async (_, { authInfo }) => {
|
|
20
16
|
const credentials = await getCredentials(authInfo);
|
|
21
17
|
const styleguides = await listStyleguides(credentials);
|
|
22
18
|
if (styleguides.length === 0) {
|
|
@@ -30,35 +26,13 @@ export function registerListStyleguidesTool(server) {
|
|
|
30
26
|
],
|
|
31
27
|
};
|
|
32
28
|
}
|
|
33
|
-
if (responseType === "markdown") {
|
|
34
|
-
return {
|
|
35
|
-
content: [
|
|
36
|
-
{
|
|
37
|
-
type: "text",
|
|
38
|
-
text: formatStyleguideListAsMarkdown(styleguides),
|
|
39
|
-
mimeType: "text/markdown",
|
|
40
|
-
},
|
|
41
|
-
],
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
const resourceLinks = styleguides.map((styleguide) => ({
|
|
45
|
-
type: "resource_link",
|
|
46
|
-
uri: `zeroheight://styleguide/${styleguide.id}`,
|
|
47
|
-
name: styleguide.name ?? DEFAULT_NAME,
|
|
48
|
-
_meta: {
|
|
49
|
-
shareId: styleguide.share_id,
|
|
50
|
-
id: styleguide.id,
|
|
51
|
-
},
|
|
52
|
-
mimeType: "application/json",
|
|
53
|
-
description: "Navigation structure for the styleguide",
|
|
54
|
-
}));
|
|
55
29
|
return {
|
|
56
30
|
content: [
|
|
57
31
|
{
|
|
58
32
|
type: "text",
|
|
59
|
-
text:
|
|
33
|
+
text: formatStyleguideListAsMarkdown(styleguides),
|
|
34
|
+
mimeType: "text/markdown",
|
|
60
35
|
},
|
|
61
|
-
...resourceLinks,
|
|
62
36
|
],
|
|
63
37
|
};
|
|
64
38
|
});
|
|
@@ -98,4 +72,4 @@ export function registerGetStyleguideTreeTool(server) {
|
|
|
98
72
|
});
|
|
99
73
|
}
|
|
100
74
|
//# sourceMappingURL=styleguide.js.map
|
|
101
|
-
//# debugId=
|
|
75
|
+
//# debugId=8e279caa-2a6c-5171-8561-ff4a3a6351e4
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styleguide.js","sources":["tools/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["tools/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport z from \"zod\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatStyleguideListAsMarkdown,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListStyleguidesTool(server: McpServer) {\n server.registerTool(\n \"list-styleguides\",\n {\n title: \"List styleguides\",\n description: \"List all accessible styleguides as markdown\",\n inputSchema: {},\n },\n async (_, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const styleguides = await listStyleguides(credentials);\n\n if (styleguides.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"There are no accessible styleguides. Check your auth credentials and make sure you have at least one styleguide in zeroheight.\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: formatStyleguideListAsMarkdown(styleguides),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n\nexport function registerGetStyleguideTreeTool(server: McpServer) {\n server.registerTool(\n \"get-styleguide-tree\",\n {\n title: \"Get styleguide tree\",\n description:\n \"A navigation hierarchy for a styleguide with top-level navigation, categories, pages and tabs\",\n inputSchema: {\n styleguideId: z.number().int().positive(),\n },\n },\n async ({ styleguideId }, { authInfo }) => {\n try {\n const credentials = await getCredentials(authInfo);\n const tree = await getStyleguideTree(credentials, styleguideId);\n const formattedTree = formatTreeAsJson(tree);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(formattedTree, null, 2),\n },\n ],\n };\n } catch {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not get the navigation tree for this styleguide.\",\n },\n ],\n };\n }\n },\n );\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAGH,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAEL,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,6CAA6C;QAC1D,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxB,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;QAEvD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gIAAgI;qBACvI;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8BAA8B,CAAC,WAAW,CAAC;oBACjD,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,+FAA+F;QACjG,WAAW,EAAE;YACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;SAC1C;KACF,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAE7C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC7C;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,wDAAwD;qBAC/D;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"8e279caa-2a6c-5171-8561-ff4a3a6351e4"}
|
package/package.json
CHANGED
package/dist/resources/page.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Page Resources
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4a5c5d30-f2cc-5f45-9d88-37c63f6066a6")}catch(e){}}();
|
|
6
|
-
import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
-
import { listStyleguideResources } from "./styleguide.js";
|
|
8
|
-
import { getPage, listPages } from "../api/page.js";
|
|
9
|
-
import { formatPageAsMarkdown } from "../common/formatters/page.js";
|
|
10
|
-
import { getCredentials } from "../common/credentials.js";
|
|
11
|
-
export function registerListPagesResource(server) {
|
|
12
|
-
server.registerResource("styleguide-page-list", new ResourceTemplate("zeroheight://styleguide/{styleguideId}/page-list", {
|
|
13
|
-
list: listStyleguideResources,
|
|
14
|
-
}), {
|
|
15
|
-
title: "List the pages for a styleguide",
|
|
16
|
-
description: "List all pages in a styleguide",
|
|
17
|
-
mimeType: "text/markdown",
|
|
18
|
-
}, async (uri, { styleguideId }, { authInfo }) => {
|
|
19
|
-
const selectedId = Array.isArray(styleguideId)
|
|
20
|
-
? styleguideId[0]
|
|
21
|
-
: styleguideId;
|
|
22
|
-
const parsedStyleguideId = parseInt(selectedId, 10);
|
|
23
|
-
const credentials = await getCredentials(authInfo);
|
|
24
|
-
const pages = await listPages(credentials, parsedStyleguideId);
|
|
25
|
-
return {
|
|
26
|
-
contents: [
|
|
27
|
-
{
|
|
28
|
-
uri: uri.href,
|
|
29
|
-
text: pages
|
|
30
|
-
.map((page) => `- ${page.name} (id: ${page.id})`)
|
|
31
|
-
.join("\n"),
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
export function registerPageResource(server) {
|
|
38
|
-
server.registerResource("page", new ResourceTemplate("zeroheight://styleguide/{styleguideId}/page/{pageId}", {
|
|
39
|
-
list: undefined,
|
|
40
|
-
}), {
|
|
41
|
-
title: "Page",
|
|
42
|
-
description: "Design system page",
|
|
43
|
-
mimeType: "text/markdown",
|
|
44
|
-
}, async (uri, { pageId }, { authInfo }) => {
|
|
45
|
-
const selectedId = Array.isArray(pageId) ? pageId[0] : pageId;
|
|
46
|
-
const parsedPageId = parseInt(selectedId, 10);
|
|
47
|
-
const credentials = await getCredentials(authInfo);
|
|
48
|
-
const page = await getPage(credentials, parsedPageId);
|
|
49
|
-
if (!page) {
|
|
50
|
-
throw new Error("Couldn't find the page");
|
|
51
|
-
}
|
|
52
|
-
return {
|
|
53
|
-
contents: [
|
|
54
|
-
{
|
|
55
|
-
uri: uri.href,
|
|
56
|
-
text: formatPageAsMarkdown(page),
|
|
57
|
-
mimeType: "text/markdown",
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
};
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=page.js.map
|
|
64
|
-
//# debugId=4a5c5d30-f2cc-5f45-9d88-37c63f6066a6
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sources":["resources/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Resources\n */\n\nimport {\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { listStyleguideResources } from \"./styleguide.js\";\nimport { getPage, listPages } from \"../api/page.js\";\nimport { formatPageAsMarkdown } from \"../common/formatters/page.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListPagesResource(server: McpServer) {\n server.registerResource(\n \"styleguide-page-list\",\n new ResourceTemplate(\"zeroheight://styleguide/{styleguideId}/page-list\", {\n list: listStyleguideResources,\n }),\n {\n title: \"List the pages for a styleguide\",\n description: \"List all pages in a styleguide\",\n mimeType: \"text/markdown\",\n },\n async (uri, { styleguideId }, { authInfo }) => {\n const selectedId = Array.isArray(styleguideId)\n ? styleguideId[0]\n : styleguideId;\n\n const parsedStyleguideId = parseInt(selectedId, 10);\n const credentials = await getCredentials(authInfo);\n const pages = await listPages(credentials, parsedStyleguideId);\n\n return {\n contents: [\n {\n uri: uri.href,\n text: pages\n .map((page) => `- ${page.name} (id: ${page.id})`)\n .join(\"\\n\"),\n },\n ],\n };\n },\n );\n}\n\nexport function registerPageResource(server: McpServer) {\n server.registerResource(\n \"page\",\n new ResourceTemplate(\n \"zeroheight://styleguide/{styleguideId}/page/{pageId}\",\n {\n list: undefined,\n },\n ),\n {\n title: \"Page\",\n description: \"Design system page\",\n mimeType: \"text/markdown\",\n },\n async (uri, { pageId }, { authInfo }) => {\n const selectedId = Array.isArray(pageId) ? pageId[0] : pageId;\n const parsedPageId = parseInt(selectedId, 10);\n const credentials = await getCredentials(authInfo);\n const page = await getPage(credentials, parsedPageId);\n\n if (!page) {\n throw new Error(\"Couldn't find the page\");\n }\n\n return {\n contents: [\n {\n uri: uri.href,\n text: formatPageAsMarkdown(page),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAEH,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,gBAAgB,CACrB,sBAAsB,EACtB,IAAI,gBAAgB,CAAC,kDAAkD,EAAE;QACvE,IAAI,EAAE,uBAAuB;KAC9B,CAAC,EACF;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5C,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,YAAY,CAAC;QAEjB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAE/D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,KAAK;yBACR,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,GAAG,CAAC;yBAChD,IAAI,CAAC,IAAI,CAAC;iBACd;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,gBAAgB,CACrB,MAAM,EACN,IAAI,gBAAgB,CAClB,sDAAsD,EACtD;QACE,IAAI,EAAE,SAAS;KAChB,CACF,EACD;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAEtD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;oBAChC,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"4a5c5d30-f2cc-5f45-9d88-37c63f6066a6"}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Styleguide Resources
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="522aedc5-1222-58f7-a417-ad02a0f76dbb")}catch(e){}}();
|
|
6
|
-
import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
-
import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
|
|
8
|
-
import { DEFAULT_NAME, formatTreeAsJson, } from "../common/formatters/styleguide.js";
|
|
9
|
-
import { getCredentials } from "../common/credentials.js";
|
|
10
|
-
export function registerStyleguideListResource(server) {
|
|
11
|
-
server.registerResource("styleguide-list", "zeroheight://styleguide/list", {
|
|
12
|
-
title: "Styleguide list",
|
|
13
|
-
description: "List all accessible styleguides",
|
|
14
|
-
mimeType: "application/json",
|
|
15
|
-
}, async (uri, { authInfo }) => {
|
|
16
|
-
const credentials = await getCredentials(authInfo);
|
|
17
|
-
const styleguideList = await listStyleguides(credentials);
|
|
18
|
-
const styleguideResources = styleguideList.map((styleguide) => ({
|
|
19
|
-
id: styleguide.id,
|
|
20
|
-
name: styleguide.name ?? DEFAULT_NAME,
|
|
21
|
-
}));
|
|
22
|
-
return {
|
|
23
|
-
contents: [
|
|
24
|
-
{
|
|
25
|
-
uri: uri.href,
|
|
26
|
-
text: JSON.stringify(styleguideResources, null, 2),
|
|
27
|
-
mimeType: "application/json",
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
};
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
export function registerStyleguideResource(server) {
|
|
34
|
-
server.registerResource("styleguide", new ResourceTemplate("zeroheight://styleguide/{styleguideId}", {
|
|
35
|
-
list: undefined,
|
|
36
|
-
}), {
|
|
37
|
-
title: "Styleguide Navigation",
|
|
38
|
-
description: "Access the styleguide's navigation including categories, pages and tabs",
|
|
39
|
-
}, async (uri, { styleguideId }, { authInfo }) => {
|
|
40
|
-
const selectedId = Array.isArray(styleguideId)
|
|
41
|
-
? styleguideId[0]
|
|
42
|
-
: styleguideId;
|
|
43
|
-
const parsedStyleguideId = parseInt(selectedId, 10);
|
|
44
|
-
// TODO: Make endpoint to get basic styleguide info instead
|
|
45
|
-
const credentials = await getCredentials(authInfo);
|
|
46
|
-
const styleguideList = await listStyleguides(credentials);
|
|
47
|
-
const currentStyleguide = styleguideList.find((styleguide) => styleguide.id === parsedStyleguideId);
|
|
48
|
-
if (!currentStyleguide) {
|
|
49
|
-
return { contents: [] };
|
|
50
|
-
}
|
|
51
|
-
const tree = await getStyleguideTree(credentials, parsedStyleguideId);
|
|
52
|
-
const formattedTree = formatTreeAsJson(tree);
|
|
53
|
-
return {
|
|
54
|
-
contents: [
|
|
55
|
-
{
|
|
56
|
-
mimeType: "application/json",
|
|
57
|
-
uri: uri.href,
|
|
58
|
-
text: JSON.stringify(formattedTree, null, 2),
|
|
59
|
-
},
|
|
60
|
-
],
|
|
61
|
-
};
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
/** Utils */
|
|
65
|
-
export const listStyleguideResources = async ({ authInfo, }) => {
|
|
66
|
-
const credentials = await getCredentials(authInfo);
|
|
67
|
-
const styleguideList = await listStyleguides(credentials);
|
|
68
|
-
const resources = styleguideList.map((styleguide) => ({
|
|
69
|
-
uri: `zeroheight://styleguide/${styleguide.id}`,
|
|
70
|
-
name: `${styleguide.name ?? DEFAULT_NAME}`,
|
|
71
|
-
_meta: {
|
|
72
|
-
id: styleguide.id,
|
|
73
|
-
shareId: styleguide.share_id,
|
|
74
|
-
},
|
|
75
|
-
}));
|
|
76
|
-
return {
|
|
77
|
-
resources,
|
|
78
|
-
};
|
|
79
|
-
};
|
|
80
|
-
//# sourceMappingURL=styleguide.js.map
|
|
81
|
-
//# debugId=522aedc5-1222-58f7-a417-ad02a0f76dbb
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styleguide.js","sources":["resources/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Resources\n */\n\nimport {\n ListResourcesCallback,\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerStyleguideListResource(server: McpServer) {\n server.registerResource(\n \"styleguide-list\",\n \"zeroheight://styleguide/list\",\n {\n title: \"Styleguide list\",\n description: \"List all accessible styleguides\",\n mimeType: \"application/json\",\n },\n async (uri, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n const styleguideResources = styleguideList.map((styleguide) => ({\n id: styleguide.id,\n name: styleguide.name ?? DEFAULT_NAME,\n }));\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(styleguideResources, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n }\n );\n}\n\nexport function registerStyleguideResource(server: McpServer) {\n server.registerResource(\n \"styleguide\",\n new ResourceTemplate(\"zeroheight://styleguide/{styleguideId}\", {\n list: undefined,\n }),\n {\n title: \"Styleguide Navigation\",\n description:\n \"Access the styleguide's navigation including categories, pages and tabs\",\n },\n async (uri, { styleguideId }, { authInfo }) => {\n const selectedId = Array.isArray(styleguideId)\n ? styleguideId[0]\n : styleguideId;\n\n const parsedStyleguideId = parseInt(selectedId, 10);\n\n // TODO: Make endpoint to get basic styleguide info instead\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n\n const currentStyleguide = styleguideList.find(\n (styleguide) => styleguide.id === parsedStyleguideId\n );\n\n if (!currentStyleguide) {\n return { contents: [] };\n }\n\n const tree = await getStyleguideTree(credentials, parsedStyleguideId);\n\n const formattedTree = formatTreeAsJson(tree);\n\n return {\n contents: [\n {\n mimeType: \"application/json\",\n uri: uri.href,\n text: JSON.stringify(formattedTree, null, 2),\n },\n ],\n };\n }\n );\n}\n\n/** Utils */\n\nexport const listStyleguideResources: ListResourcesCallback = async ({\n authInfo,\n}) => {\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n const resources = styleguideList.map((styleguide) => ({\n uri: `zeroheight://styleguide/${styleguide.id}`,\n name: `${styleguide.name ?? DEFAULT_NAME}`,\n _meta: {\n id: styleguide.id,\n shareId: styleguide.share_id,\n },\n }));\n\n return {\n resources,\n };\n};\n"],"names":[],"mappings":"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","debug_id":"522aedc5-1222-58f7-a417-ad02a0f76dbb"}
|