@zeroheight/mcp-server
Advanced tools
| !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]="30b81d5e-e94d-5bce-a3f1-4fe8a6b66d72")}catch(e){}}(); | ||
| export class InvalidRemoteSingleStyleguideContextError extends Error { | ||
| constructor() { | ||
| super("Single-styleguide remote MCP requires JWT credentials with styleguideId"); | ||
| this.name = "InvalidRemoteSingleStyleguideContextError"; | ||
| } | ||
| } | ||
| export function createLocalServerContext() { | ||
| return { | ||
| connectionMode: "local", | ||
| features: {}, | ||
| }; | ||
| } | ||
| export function createRemoteOauthServerContext(features = {}) { | ||
| return { | ||
| connectionMode: "remote_oauth", | ||
| features, | ||
| }; | ||
| } | ||
| export function createRemoteSingleStyleguideServerContext(credentials) { | ||
| if (credentials.type !== "jwt" || | ||
| typeof credentials.styleguideId !== "number") { | ||
| throw new InvalidRemoteSingleStyleguideContextError(); | ||
| } | ||
| return { | ||
| connectionMode: "remote_single_styleguide", | ||
| features: credentials.features, | ||
| styleguideId: credentials.styleguideId, | ||
| styleguideName: credentials.styleguideName, | ||
| tokenSets: credentials.tokenSets, | ||
| }; | ||
| } | ||
| //# sourceMappingURL=context.js.map | ||
| //# debugId=30b81d5e-e94d-5bce-a3f1-4fe8a6b66d72 |
| {"version":3,"file":"context.js","sources":["context.ts"],"sourceRoot":"/","sourcesContent":["import { Credentials } from \"./common/credentials.js\";\nimport { ServerContext } from \"./types/server.js\";\n\nexport class InvalidRemoteSingleStyleguideContextError extends Error {\n constructor() {\n super(\n \"Single-styleguide remote MCP requires JWT credentials with styleguideId\",\n );\n this.name = \"InvalidRemoteSingleStyleguideContextError\";\n }\n}\n\nexport function createLocalServerContext(): ServerContext {\n return {\n connectionMode: \"local\",\n features: {},\n };\n}\n\nexport function createRemoteOauthServerContext(\n features: Record<string, boolean> = {},\n): ServerContext {\n return {\n connectionMode: \"remote_oauth\",\n features,\n };\n}\n\nexport function createRemoteSingleStyleguideServerContext(\n credentials: Credentials,\n): ServerContext {\n if (\n credentials.type !== \"jwt\" ||\n typeof credentials.styleguideId !== \"number\"\n ) {\n throw new InvalidRemoteSingleStyleguideContextError();\n }\n\n return {\n connectionMode: \"remote_single_styleguide\",\n features: credentials.features,\n styleguideId: credentials.styleguideId,\n styleguideName: credentials.styleguideName,\n tokenSets: credentials.tokenSets,\n };\n}\n"],"names":[],"mappings":";;AAGA,MAAM,OAAO,yCAA0C,SAAQ,KAAK;IAClE;QACE,KAAK,CACH,yEAAyE,CAC1E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2CAA2C,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,cAAc,EAAE,OAAO;QACvB,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,WAAoC,EAAE;IAEtC,OAAO;QACL,cAAc,EAAE,cAAc;QAC9B,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yCAAyC,CACvD,WAAwB;IAExB,IACE,WAAW,CAAC,IAAI,KAAK,KAAK;QAC1B,OAAO,WAAW,CAAC,YAAY,KAAK,QAAQ,EAC5C,CAAC;QACD,MAAM,IAAI,yCAAyC,EAAE,CAAC;IACxD,CAAC;IAED,OAAO;QACL,cAAc,EAAE,0BAA0B;QAC1C,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,cAAc,EAAE,WAAW,CAAC,cAAc;QAC1C,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC;AACJ,CAAC","debug_id":"30b81d5e-e94d-5bce-a3f1-4fe8a6b66d72"} |
+6
-0
| ## Release notes | ||
| ## [2.6.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/2.6.0) - 24th March 2026 | ||
| - Simplify single-styleguide remote MCP connections by removing `list-styleguides` | ||
| - For single-styleguide remote MCP connections, `list-pages` and `search-pages` now use the connected styleguide automatically | ||
| - Bug fixes | ||
| ## [2.5.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/2.5.0) - 23rd March 2026 | ||
@@ -4,0 +10,0 @@ |
| !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]="297bbf44-22a9-5899-b2be-ac6d0428ee04")}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]="695d4065-be7e-5a94-aebc-e83e8be3b71b")}catch(e){}}(); | ||
| import { request } from "./api.js"; | ||
@@ -24,6 +24,9 @@ import { UnknownError } from "./errors.js"; | ||
| } | ||
| export async function getStyleguideTree(credentials, id, clientUserAgent) { | ||
| export async function getStyleguideTree(credentials, id, clientUserAgent, releaseId) { | ||
| const searchParams = new URLSearchParams({ | ||
| show_hidden: "false", | ||
| }); | ||
| if (releaseId) { | ||
| searchParams.set("release_id", String(releaseId)); | ||
| } | ||
| try { | ||
@@ -45,2 +48,2 @@ const response = await request(`/styleguides/${id}/tree`, credentials, { | ||
| //# sourceMappingURL=styleguide.js.map | ||
| //# debugId=297bbf44-22a9-5899-b2be-ac6d0428ee04 | ||
| //# debugId=695d4065-be7e-5a94-aebc-e83e8be3b71b |
@@ -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) {\n const searchParams = new URLSearchParams({\n show_hidden: \"false\",\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;IACpG,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;QACvC,WAAW,EAAE,OAAO;KACrB,CAAC,CAAC;IAEH,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":"297bbf44-22a9-5899-b2be-ac6d0428ee04"} | ||
| {"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"} |
| !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]="11c203a2-35a9-5524-af57-bf3c016a0056")}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]="1a11d5e2-c1f1-5398-a9c3-711356b97241")}catch(e){}}(); | ||
| import { MissingCredentialsError } from "./errors.js"; | ||
@@ -32,2 +32,3 @@ import { internalRequest } from "../api/api.js"; | ||
| styleguideId: res.styleguide_id, | ||
| styleguideName: res.styleguide_name, | ||
| features: res.features ?? {}, | ||
@@ -51,2 +52,2 @@ userId: res.user_id, | ||
| //# sourceMappingURL=credentials.js.map | ||
| //# debugId=11c203a2-35a9-5524-af57-bf3c016a0056 | ||
| //# debugId=1a11d5e2-c1f1-5398-a9c3-711356b97241 |
@@ -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 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 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 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;AA4BhD,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;AAaD,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,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":"11c203a2-35a9-5524-af57-bf3c016a0056"} | ||
| {"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"} |
+11
-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]="c25e9b7c-243a-5e35-a054-46ee2133d638")}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]="8e2e81bd-1d19-5c86-9245-3fda1e664e4b")}catch(e){}}(); | ||
| import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; | ||
@@ -11,3 +11,6 @@ import packageJson from "../package.json" with { type: "json" }; | ||
| import { registerRecommendPagesPrompt } from "./prompts/styleguide.js"; | ||
| export function createServer(context = { features: {} }) { | ||
| export function createServer(context = { | ||
| connectionMode: "local", | ||
| features: {}, | ||
| }) { | ||
| const server = new McpServer({ | ||
@@ -17,3 +20,2 @@ name: "zeroheight", | ||
| capabilities: { | ||
| resources: {}, | ||
| tools: {}, | ||
@@ -23,4 +25,6 @@ }, | ||
| // Register tools | ||
| if (context.connectionMode !== "remote_single_styleguide") { | ||
| registerListStyleguidesTool(server); | ||
| } | ||
| [ | ||
| registerListStyleguidesTool, | ||
| registerListPagesTool, | ||
@@ -35,6 +39,7 @@ registerGetPageTool, | ||
| // Register all prompts | ||
| [registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) => fn(server)); | ||
| registerRecommendPagesPrompt(server, context); | ||
| recommendSummarizePagePrompt(server); | ||
| return server; | ||
| } | ||
| //# sourceMappingURL=mcp-server.js.map | ||
| //# debugId=c25e9b7c-243a-5e35-a054-46ee2133d638 | ||
| //# debugId=8e2e81bd-1d19-5c86-9245-3fda1e664e4b |
@@ -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(context: ServerContext = { features: {} }) {\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 registerListStyleguidesTool,\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, 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,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,CAAC,UAAyB,EAAE,QAAQ,EAAE,EAAE,EAAE;IACpE,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,2BAA2B;QAC3B,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,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":"c25e9b7c-243a-5e35-a054-46ee2133d638"} | ||
| {"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"} |
| !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]="cb65ad75-161e-5265-8e2d-f8711705e930")}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]="3d2c0748-c666-52f2-bbf9-31302b0901aa")}catch(e){}}(); | ||
| import z from "zod"; | ||
| export function registerRecommendPagesPrompt(server) { | ||
| export function registerRecommendPagesPrompt(server, context) { | ||
| const singleStyleguideMode = context.connectionMode === "remote_single_styleguide"; | ||
| server.registerPrompt("recommend-pages", { | ||
| title: "Recommend Pages", | ||
| description: "Find useful pages on a given topic", | ||
| argsSchema: { | ||
| styleguideId: z.string(), | ||
| topic: z.string(), | ||
| }, | ||
| }, ({ styleguideId, topic }) => ({ | ||
| argsSchema: singleStyleguideMode | ||
| ? { | ||
| topic: z.string(), | ||
| } | ||
| : { | ||
| styleguideId: z.string(), | ||
| topic: z.string(), | ||
| }, | ||
| }, (args) => ({ | ||
| messages: [ | ||
@@ -18,3 +23,5 @@ { | ||
| type: "text", | ||
| text: "Your goal is to find pages in a styleguide and recommend the top 5 most relevant to the given task.", | ||
| text: singleStyleguideMode | ||
| ? "Your goal is to find pages in the current styleguide and recommend the top 5 most relevant to the given task." | ||
| : "Your goal is to find pages in a styleguide and recommend the top 5 most relevant to the given task.", | ||
| }, | ||
@@ -26,3 +33,5 @@ }, | ||
| type: "text", | ||
| text: `Look at the navigation tree for this styleguide: ${styleguideId}.\n\nReturn the URLs for the top 5 most relevant pages about this topic: ${topic}.`, | ||
| text: singleStyleguideMode | ||
| ? `Look at the navigation tree for the current styleguide.\n\nReturn the URLs for the top 5 most relevant pages about this topic: ${args.topic}.` | ||
| : `Look at the navigation tree for this styleguide: ${args.styleguideId}.\n\nReturn the URLs for the top 5 most relevant pages about this topic: ${args.topic}.`, | ||
| }, | ||
@@ -34,2 +43,2 @@ }, | ||
| //# sourceMappingURL=styleguide.js.map | ||
| //# debugId=cb65ad75-161e-5265-8e2d-f8711705e930 | ||
| //# debugId=3d2c0748-c666-52f2-bbf9-31302b0901aa |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"styleguide.js","sources":["prompts/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport z from \"zod\";\n\nexport function registerRecommendPagesPrompt(server: McpServer) {\n server.registerPrompt(\n \"recommend-pages\",\n {\n title: \"Recommend Pages\",\n description: \"Find useful pages on a given topic\",\n argsSchema: {\n styleguideId: z.string(),\n topic: z.string(),\n },\n },\n ({ styleguideId, topic }) => ({\n messages: [\n {\n role: \"assistant\",\n content: {\n type: \"text\",\n text: \"Your goal is to find pages in a styleguide and recommend the top 5 most relevant to the given task.\",\n },\n },\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Look at the navigation tree for this styleguide: ${styleguideId}.\\n\\nReturn the URLs for the top 5 most relevant pages about this topic: ${topic}.`,\n },\n },\n ],\n }),\n );\n}\n"],"names":[],"mappings":";;AACA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,cAAc,CACnB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,oCAAoC;QACjD,UAAU,EAAE;YACV,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;YACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;SAClB;KACF,EACD,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qGAAqG;iBAC5G;aACF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oDAAoD,YAAY,4EAA4E,KAAK,GAAG;iBAC3J;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC","debug_id":"cb65ad75-161e-5265-8e2d-f8711705e930"} | ||
| {"version":3,"file":"styleguide.js","sources":["prompts/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport z from \"zod\";\nimport { ServerContext } from \"../types/server.js\";\n\nexport function registerRecommendPagesPrompt(\n server: McpServer,\n context: ServerContext,\n) {\n const singleStyleguideMode =\n context.connectionMode === \"remote_single_styleguide\";\n\n server.registerPrompt(\n \"recommend-pages\",\n {\n title: \"Recommend Pages\",\n description: \"Find useful pages on a given topic\",\n argsSchema: singleStyleguideMode\n ? {\n topic: z.string(),\n }\n : {\n styleguideId: z.string(),\n topic: z.string(),\n },\n },\n (args) => ({\n messages: [\n {\n role: \"assistant\",\n content: {\n type: \"text\",\n text: singleStyleguideMode\n ? \"Your goal is to find pages in the current styleguide and recommend the top 5 most relevant to the given task.\"\n : \"Your goal is to find pages in a styleguide and recommend the top 5 most relevant to the given task.\",\n },\n },\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: singleStyleguideMode\n ? `Look at the navigation tree for the current styleguide.\\n\\nReturn the URLs for the top 5 most relevant pages about this topic: ${(args as { topic: string }).topic}.`\n : `Look at the navigation tree for this styleguide: ${(args as { styleguideId: string }).styleguideId}.\\n\\nReturn the URLs for the top 5 most relevant pages about this topic: ${(args as { topic: string }).topic}.`,\n },\n },\n ],\n }),\n );\n}\n"],"names":[],"mappings":";;AACA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,MAAM,UAAU,4BAA4B,CAC1C,MAAiB,EACjB,OAAsB;IAEtB,MAAM,oBAAoB,GACxB,OAAO,CAAC,cAAc,KAAK,0BAA0B,CAAC;IAExD,MAAM,CAAC,cAAc,CACnB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,oCAAoC;QACjD,UAAU,EAAE,oBAAoB;YAC9B,CAAC,CAAC;gBACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;aAClB;YACH,CAAC,CAAC;gBACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;gBACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;aAClB;KACN,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACT,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oBAAoB;wBACxB,CAAC,CAAC,+GAA+G;wBACjH,CAAC,CAAC,qGAAqG;iBAC1G;aACF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oBAAoB;wBACxB,CAAC,CAAC,kIAAmI,IAA0B,CAAC,KAAK,GAAG;wBACxK,CAAC,CAAC,oDAAqD,IAAiC,CAAC,YAAY,4EAA6E,IAA0B,CAAC,KAAK,GAAG;iBACxN;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC","debug_id":"3d2c0748-c666-52f2-bbf9-31302b0901aa"} |
+4
-3
| #!/usr/bin/env node | ||
| !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="22d37322-72ea-594f-9146-3798ffcae660")}catch(e){}}(); | ||
| !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]="50865840-a409-51b5-ad76-8c41f2644aa6")}catch(e){}}(); | ||
| import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; | ||
| import { initSentry } from "./api/sentry.js"; | ||
| import { captureException } from "./common/errors.js"; | ||
| import { createLocalServerContext } from "./context.js"; | ||
| import { createServer } from "./mcp-server.js"; | ||
@@ -16,3 +17,3 @@ /** | ||
| } | ||
| const server = createServer(); | ||
| const server = createServer(createLocalServerContext()); | ||
| const transport = new StdioServerTransport(); | ||
@@ -28,2 +29,2 @@ await server.connect(transport); | ||
| //# sourceMappingURL=stdio.js.map | ||
| //# debugId=22d37322-72ea-594f-9146-3798ffcae660 | ||
| //# debugId=50865840-a409-51b5-ad76-8c41f2644aa6 |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"stdio.js","sources":["stdio.ts"],"sourceRoot":"/","sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { initSentry } from \"./api/sentry.js\";\nimport { captureException } from \"./common/errors.js\";\nimport { createServer } from \"./mcp-server.js\";\n\n/**\n * Start server on STDIO\n */\nasync function main() {\n const disableTelemetry = process.env[\"ZEROHEIGHT_MCP_DISABLE_TELEMETRY\"];\n if (!disableTelemetry) {\n initSentry();\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n console.error(\"zeroheight MCP Server running on stdio\");\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error in main():\", error);\n captureException(error);\n process.exit(1);\n});\n"],"names":[],"mappings":";;;AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,UAAU,EAAE,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","debug_id":"22d37322-72ea-594f-9146-3798ffcae660"} | ||
| {"version":3,"file":"stdio.js","sources":["stdio.ts"],"sourceRoot":"/","sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { initSentry } from \"./api/sentry.js\";\nimport { captureException } from \"./common/errors.js\";\nimport { createLocalServerContext } from \"./context.js\";\nimport { createServer } from \"./mcp-server.js\";\n\n/**\n * Start server on STDIO\n */\nasync function main() {\n const disableTelemetry = process.env[\"ZEROHEIGHT_MCP_DISABLE_TELEMETRY\"];\n if (!disableTelemetry) {\n initSentry();\n }\n\n const server = createServer(createLocalServerContext());\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n console.error(\"zeroheight MCP Server running on stdio\");\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error in main():\", error);\n captureException(error);\n process.exit(1);\n});\n"],"names":[],"mappings":";;;AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,UAAU,EAAE,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","debug_id":"50865840-a409-51b5-ad76-8c41f2644aa6"} |
+35
-11
@@ -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]="f6a95e05-9471-5fe8-a72b-de2187d3b8d1")}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]="c757c5c9-d251-525f-9ba5-572d83183419")}catch(e){}}(); | ||
| import z from "zod"; | ||
@@ -18,3 +18,4 @@ import { getPage, searchPages } from "../api/page.js"; | ||
| pageId: z | ||
| .string() | ||
| .number() | ||
| .int() | ||
| .describe("Identifies the page containing relevant guidance. Use `list-pages` to locate it."), | ||
@@ -62,3 +63,4 @@ releaseId: z | ||
| pageId: z | ||
| .string() | ||
| .number() | ||
| .int() | ||
| .describe("The page to fetch images from. Use the same page ID as a previous `get-page` call."), | ||
@@ -109,16 +111,38 @@ releaseId: z | ||
| } | ||
| const singleStyleguideMode = context.connectionMode === "remote_single_styleguide"; | ||
| registerTrackedToolCall(server, "search-pages", { | ||
| title: "Search pages in a styleguide", | ||
| description: "Search for pages in a styleguide by a search term", | ||
| inputSchema: { | ||
| styleguideId: z.number().int().min(1), | ||
| releaseId: z.number().int().min(1).optional(), | ||
| searchTerm: z.string(), | ||
| responseFormat: z.enum(["markdown", "json"]).default("json"), | ||
| }, | ||
| inputSchema: singleStyleguideMode | ||
| ? { | ||
| releaseId: z.number().int().min(1).optional(), | ||
| searchTerm: z.string(), | ||
| responseFormat: z.enum(["markdown", "json"]).default("json"), | ||
| } | ||
| : { | ||
| styleguideId: z.number().int().min(1), | ||
| releaseId: z.number().int().min(1).optional(), | ||
| searchTerm: z.string(), | ||
| responseFormat: z.enum(["markdown", "json"]).default("json"), | ||
| }, | ||
| annotations: { | ||
| readOnlyHint: true, | ||
| }, | ||
| }, async ({ styleguideId, searchTerm, releaseId, responseFormat }, { authInfo }, clientUserAgent) => { | ||
| }, async (args, { authInfo }, clientUserAgent) => { | ||
| const credentials = await getCredentials(authInfo); | ||
| const { searchTerm, releaseId, responseFormat, } = args; | ||
| const styleguideId = context.connectionMode === "remote_single_styleguide" | ||
| ? context.styleguideId | ||
| : args.styleguideId; | ||
| if (typeof styleguideId !== "number") { | ||
| return { | ||
| isError: true, | ||
| content: [ | ||
| { | ||
| type: "text", | ||
| text: "Could not determine which styleguide to search.", | ||
| }, | ||
| ], | ||
| }; | ||
| } | ||
| if (credentials.type === "jwt" && | ||
@@ -171,2 +195,2 @@ credentials.styleguideId !== styleguideId) { | ||
| //# sourceMappingURL=page.js.map | ||
| //# debugId=f6a95e05-9471-5fe8-a72b-de2187d3b8d1 | ||
| //# debugId=c757c5c9-d251-525f-9ba5-572d83183419 |
@@ -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 .string()\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 .string()\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 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: {\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 { styleguideId, searchTerm, releaseId, responseFormat },\n { authInfo },\n clientUserAgent,\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 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":"f6a95e05-9471-5fe8-a72b-de2187d3b8d1"} | ||
| {"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"} |
@@ -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]="e1ca99d6-8227-52a6-a4cd-e28651e1e3ea")}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]="40007100-5858-52c5-8440-9bdc646ab841")}catch(e){}}(); | ||
| import z from "zod"; | ||
@@ -65,14 +65,34 @@ import { getStyleguideTree, listStyleguides } from "../api/styleguide.js"; | ||
| ])); | ||
| export function registerListPagesTool(server) { | ||
| export function registerListPagesTool(server, context) { | ||
| const singleStyleguideMode = context.connectionMode === "remote_single_styleguide"; | ||
| registerTrackedToolCall(server, "list-pages", { | ||
| title: "List pages in a styleguide", | ||
| description: "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.*", | ||
| description: singleStyleguideMode | ||
| ? "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.*" | ||
| : "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.*", | ||
| inputSchema: { | ||
| styleguideId: z | ||
| ...(singleStyleguideMode | ||
| ? {} | ||
| : { | ||
| styleguideId: z | ||
| .number() | ||
| .int() | ||
| .min(1) | ||
| .describe("The design system to reference. Use `list-styleguides` to discover available systems."), | ||
| }), | ||
| releaseId: z | ||
| .number() | ||
| .int() | ||
| .min(1) | ||
| .describe("The design system to reference. Use `list-styleguides` to discover available systems."), | ||
| .optional() | ||
| .describe("Optional. Returns pages for the default release if omitted. User can specify when a particular release is relevant."), | ||
| }, | ||
| outputSchema: { | ||
| ...(singleStyleguideMode | ||
| ? { | ||
| styleguideName: z | ||
| .string() | ||
| .describe("The name of the styleguide."), | ||
| } | ||
| : {}), | ||
| pages: z | ||
@@ -85,6 +105,13 @@ .record(z.string(), pageNodeSchema) | ||
| }, | ||
| }, async ({ styleguideId }, { authInfo }, clientUserAgent) => { | ||
| }, async (args, { authInfo }, clientUserAgent) => { | ||
| const releaseId = args.releaseId; | ||
| try { | ||
| const credentials = await getCredentials(authInfo); | ||
| const tree = await getStyleguideTree(credentials, styleguideId, clientUserAgent); | ||
| const styleguideId = context.connectionMode === "remote_single_styleguide" | ||
| ? context.styleguideId | ||
| : args.styleguideId; | ||
| if (typeof styleguideId !== "number") { | ||
| throw new Error("Missing styleguideId"); | ||
| } | ||
| const tree = await getStyleguideTree(credentials, styleguideId, clientUserAgent, releaseId); | ||
| if (tree.length === 0) { | ||
@@ -94,3 +121,5 @@ throw new Error("Empty styleguide tree"); | ||
| const formattedTree = formatTreeAsJson(tree); | ||
| const structuredContent = { pages: formattedTree }; | ||
| const structuredContent = singleStyleguideMode | ||
| ? { styleguideName: context.styleguideName, pages: formattedTree } | ||
| : { pages: formattedTree }; | ||
| return { | ||
@@ -120,2 +149,2 @@ content: [ | ||
| //# sourceMappingURL=styleguide.js.map | ||
| //# debugId=e1ca99d6-8227-52a6-a4cd-e28651e1e3ea | ||
| //# debugId=40007100-5858-52c5-8440-9bdc646ab841 |
@@ -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\";\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) {\n registerTrackedToolCall(\n server,\n \"list-pages\",\n {\n title: \"List pages in a styleguide\",\n description:\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 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 outputSchema: {\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 ({ styleguideId }, { authInfo }, clientUserAgent) => {\n try {\n const credentials = await getCredentials(authInfo);\n const tree = await getStyleguideTree(\n credentials,\n styleguideId,\n clientUserAgent,\n );\n\n if (tree.length === 0) {\n throw new Error(\"Empty styleguide tree\");\n }\n\n const formattedTree = formatTreeAsJson(tree);\n const structuredContent = { 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":"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","debug_id":"e1ca99d6-8227-52a6-a4cd-e28651e1e3ea"} | ||
| {"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":"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","debug_id":"40007100-5858-52c5-8440-9bdc646ab841"} |
| !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]="945744ff-cb37-5887-b19d-a2368edf5b34")}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]="1823151d-02fc-58c1-806a-f5f2410b365c")}catch(e){}}(); | ||
| export {}; | ||
| //# sourceMappingURL=server.js.map | ||
| //# debugId=945744ff-cb37-5887-b19d-a2368edf5b34 | ||
| //# debugId=1823151d-02fc-58c1-806a-f5f2410b365c |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"server.js","sources":["types/server.ts"],"sourceRoot":"/","sourcesContent":["export interface LinkedTokenSet {\n id: number;\n name: string;\n}\n\nexport interface ServerContext {\n features: Record<string, boolean>;\n tokenSets?: LinkedTokenSet[];\n}\n"],"names":[],"mappings":"","debug_id":"945744ff-cb37-5887-b19d-a2368edf5b34"} | ||
| {"version":3,"file":"server.js","sources":["types/server.ts"],"sourceRoot":"/","sourcesContent":["export interface LinkedTokenSet {\n id: number;\n name: string;\n}\n\nexport type ConnectionMode =\n | \"local\"\n | \"remote_single_styleguide\"\n | \"remote_oauth\";\n\nexport interface ServerContext {\n connectionMode: ConnectionMode;\n features: Record<string, boolean>;\n styleguideId?: number;\n styleguideName?: string;\n tokenSets?: LinkedTokenSet[];\n}\n"],"names":[],"mappings":"","debug_id":"1823151d-02fc-58c1-806a-f5f2410b365c"} |
+1
-1
| { | ||
| "name": "@zeroheight/mcp-server", | ||
| "version": "2.5.0", | ||
| "version": "2.6.0", | ||
| "description": "MCP server for zeroheight", | ||
@@ -5,0 +5,0 @@ "mcpName": "com.zeroheight/zeroheight", |
+4
-0
@@ -50,2 +50,4 @@ # zeroheight MCP Server | ||
| For single-styleguide remote MCP connections, this tool is not exposed because the connection is already scoped to one design system. | ||
| **list-pages** | ||
@@ -56,2 +58,4 @@ 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. | ||
| For single-styleguide remote MCP connections, this tool does not require a `styleguideId` argument. | ||
| **get-page** | ||
@@ -58,0 +62,0 @@ Fetch guidance from a specific design system page, including usage notes, recommendations, and supporting context. |
246090
5.69%65
3.17%2207
5.1%117
3.54%