@umbraco-cms/mcp-dev 18.0.1 → 18.1.0-rc

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/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  availableCollections,
10
10
  setAllowFilePathUploads,
11
11
  setUmbracoVersion
12
- } from "./chunk-KKNLEZQN.js";
12
+ } from "./chunk-MMATLZNV.js";
13
13
 
14
14
  // node_modules/ajv/dist/compile/codegen/code.js
15
15
  var require_code = __commonJS({
@@ -3622,7 +3622,12 @@ var require_fast_uri = __commonJS({
3622
3622
  }
3623
3623
  function resolve(baseURI, relativeURI, options) {
3624
3624
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
3625
- const resolved = resolveComponent(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true);
3625
+ const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions);
3626
+ const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions);
3627
+ if (baseMalformed || relativeMalformed) {
3628
+ throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
3629
+ }
3630
+ const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
3626
3631
  schemelessOptions.skipEscape = true;
3627
3632
  return serialize(resolved, schemelessOptions);
3628
3633
  }
@@ -3747,6 +3752,8 @@ var require_fast_uri = __commonJS({
3747
3752
  return uriTokens.join("");
3748
3753
  }
3749
3754
  var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
3755
+ var AUTHORITY_PREFIX = /^(?:[^#/:?]+:)?\/\/([^/?#]*)/;
3756
+ var AUTHORITY_INTRODUCER_REGION = /^(?:[^#/:?]+:)?([/\\\t\n\r]*)/;
3750
3757
  function getParseError(parsed, matches) {
3751
3758
  if (matches[2] !== void 0 && parsed.path && parsed.path[0] !== "/") {
3752
3759
  return 'URI path must start with "/" when authority is present.';
@@ -3776,6 +3783,25 @@ var require_fast_uri = __commonJS({
3776
3783
  uri = "//" + uri;
3777
3784
  }
3778
3785
  }
3786
+ const authorityMatch = uri.match(AUTHORITY_PREFIX);
3787
+ if (authorityMatch !== null && authorityMatch[1].indexOf("\\") !== -1) {
3788
+ parsed.error = "URI authority must not contain a literal backslash.";
3789
+ malformedAuthorityOrPort = true;
3790
+ }
3791
+ const introducerMatch = uri.match(AUTHORITY_INTRODUCER_REGION);
3792
+ if (introducerMatch !== null) {
3793
+ const region = introducerMatch[1];
3794
+ const normalizedRegion = region.replace(/[\t\n\r]/g, "");
3795
+ if (normalizedRegion.length >= 2) {
3796
+ if (normalizedRegion.slice(0, 2) !== "//") {
3797
+ parsed.error = parsed.error || "URI authority must not contain a literal backslash.";
3798
+ malformedAuthorityOrPort = true;
3799
+ } else if (region.length !== normalizedRegion.length) {
3800
+ parsed.error = parsed.error || "URI authority introducer must not contain whitespace.";
3801
+ malformedAuthorityOrPort = true;
3802
+ }
3803
+ }
3804
+ }
3779
3805
  const matches = uri.match(URI_PARSE);
3780
3806
  if (matches) {
3781
3807
  parsed.scheme = matches[1];
@@ -3819,7 +3845,7 @@ var require_fast_uri = __commonJS({
3819
3845
  if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
3820
3846
  if (parsed.host && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
3821
3847
  try {
3822
- parsed.host = URL.domainToASCII(parsed.host.toLowerCase());
3848
+ parsed.host = new URL("http://" + parsed.host).hostname;
3823
3849
  } catch (e) {
3824
3850
  parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
3825
3851
  }
@@ -12511,7 +12537,7 @@ var StdioServerTransport = class {
12511
12537
  // package.json
12512
12538
  var package_default = {
12513
12539
  name: "@umbraco-cms/mcp-dev",
12514
- version: "18.0.1",
12540
+ version: "18.1.0-rc",
12515
12541
  type: "module",
12516
12542
  description: "A model context protocol (MCP) server for Umbraco CMS",
12517
12543
  main: "dist/index.js",
@@ -12536,8 +12562,11 @@ var package_default = {
12536
12562
  compile: "tsc --noEmit",
12537
12563
  watch: "tsup --config tsup.config.ts --watch",
12538
12564
  generate: "orval --config orval.config.ts",
12539
- inspect: "npx @modelcontextprotocol/inspector node dist/index.js",
12565
+ inspect: "npx @modelcontextprotocol/inspector@1 node dist/index.js",
12540
12566
  test: "node --experimental-vm-modules node_modules/jest/bin/jest.js",
12567
+ "test:all": "npm run build && npm run test && npm run test:evals",
12568
+ "test:one": "node --experimental-vm-modules node_modules/jest/bin/jest.js --runInBand --forceExit",
12569
+ "test:changed": "node scripts/test-changed.mjs",
12541
12570
  "test:rerun-failures": "grep '^FAIL ' test-failures.log 2>/dev/null | sed 's/^FAIL //' | tr '\\n' ' ' | xargs -r node --experimental-vm-modules node_modules/jest/bin/jest.js --no-coverage || echo 'No failures to rerun (test-failures.log not found or empty)'",
12542
12571
  "test:evals": "node --experimental-vm-modules node_modules/jest/bin/jest.js --no-coverage --config tests/evals/jest.config.ts",
12543
12572
  "patch-publish-alpha": "npm version prerelease --preid=alpha && npm publish --tag alpha --access public",
@@ -12547,6 +12576,7 @@ var package_default = {
12547
12576
  "test:e2e": "npx playwright test --config tests/cms-hosted-e2e/playwright.config.ts",
12548
12577
  "umbraco:bootstrap": "bash scripts/bootstrap-demo-site.sh",
12549
12578
  "umbraco:start": "bash scripts/bootstrap-demo-site.sh && dotnet run --project demo-site",
12579
+ "start:umbraco": "npm run umbraco:start",
12550
12580
  "umbraco:stop": "lsof -ti :44391 | xargs kill 2>/dev/null; lsof -ti :56472 | xargs kill 2>/dev/null",
12551
12581
  "dev:hosted": "wrangler dev"
12552
12582
  },
@@ -12579,8 +12609,8 @@ var package_default = {
12579
12609
  "@modelcontextprotocol/sdk": "^1.28.0",
12580
12610
  "@types/uuid": "^10.0.0",
12581
12611
  "@types/yargs": "^17.0.33",
12582
- "@umbraco-cms/mcp-hosted": "^1.0.0-beta.31",
12583
- "@umbraco-cms/mcp-server-sdk": "^1.0.0-beta.31",
12612
+ "@umbraco-cms/mcp-hosted": "^1.0.0-beta.35",
12613
+ "@umbraco-cms/mcp-server-sdk": "^1.0.0-beta.35",
12584
12614
  dotenv: "^16.5.0",
12585
12615
  "form-data": "^4.0.4",
12586
12616
  "mime-types": "^3.0.1",
@@ -12593,6 +12623,7 @@ var package_default = {
12593
12623
  "@anthropic-ai/claude-agent-sdk": "0.2.39",
12594
12624
  "@cloudflare/workers-oauth-provider": "^0.2.3",
12595
12625
  "@jest/types": "^29.6.3",
12626
+ "@modelcontextprotocol/inspector": "^1.0.1",
12596
12627
  "@playwright/test": "^1.58.2",
12597
12628
  "@types/dotenv": "^6.1.1",
12598
12629
  "@types/jest": "^29.5.14",
@@ -12614,7 +12645,7 @@ var package_default = {
12614
12645
  }
12615
12646
  };
12616
12647
 
12617
- // src/umb-management-api/tools/tool-factory.ts
12648
+ // src/umbraco-api/tools/tool-factory.ts
12618
12649
  import { createCollectionConfigLoader } from "@umbraco-cms/mcp-server-sdk";
12619
12650
 
12620
12651
  // src/config/server-config.ts
@@ -12648,7 +12679,7 @@ function clearConfigCache() {
12648
12679
  cachedConfig = null;
12649
12680
  }
12650
12681
 
12651
- // src/umb-management-api/tools/collection-resolver.ts
12682
+ // src/umbraco-api/tools/collection-resolver.ts
12652
12683
  var CollectionResolver = {
12653
12684
  /**
12654
12685
  * Validates that all referenced collection names exist in the available collections.
@@ -12704,7 +12735,7 @@ var CollectionResolver = {
12704
12735
  }
12705
12736
  };
12706
12737
 
12707
- // src/umb-management-api/tools/tool-registrar.ts
12738
+ // src/umbraco-api/tools/tool-registrar.ts
12708
12739
  import {
12709
12740
  createToolAnnotations
12710
12741
  } from "@umbraco-cms/mcp-server-sdk";
@@ -12755,7 +12786,7 @@ var ToolRegistrar = {
12755
12786
  }
12756
12787
  };
12757
12788
 
12758
- // src/umb-management-api/tools/tool-factory.ts
12789
+ // src/umbraco-api/tools/tool-factory.ts
12759
12790
  var configLoader = createCollectionConfigLoader({
12760
12791
  modeRegistry: allModes,
12761
12792
  allModeNames,
@@ -12779,7 +12810,12 @@ Readonly mode: Disabled ${filteredTools.length} write tools:`);
12779
12810
  }
12780
12811
 
12781
12812
  // src/index.ts
12782
- import { checkUmbracoVersion, configureApiClient, initializeUmbracoFetch, getServerConfig as getServerConfig2, handleCliCommands, createCollectionConfigLoader as createCollectionConfigLoader2 } from "@umbraco-cms/mcp-server-sdk";
12813
+ import { checkUmbracoVersion, configureVersionCheckHook, getVersionCheckMessage, configureApiClient, initializeUmbracoFetch, getServerConfig as getServerConfig2, handleCliCommands, createCollectionConfigLoader as createCollectionConfigLoader2 } from "@umbraco-cms/mcp-server-sdk";
12814
+
12815
+ // src/config/umbraco-target.generated.ts
12816
+ var UMBRACO_TARGET_MAJOR = "18";
12817
+
12818
+ // src/index.ts
12783
12819
  var main = async () => {
12784
12820
  setAllowFilePathUploads(true);
12785
12821
  clearConfigCache();
@@ -12787,10 +12823,6 @@ var main = async () => {
12787
12823
  const config = serverConfig.umbraco;
12788
12824
  initializeUmbracoFetch(config.auth);
12789
12825
  configureApiClient(() => UmbracoManagementClient.getClient());
12790
- const server = new McpServer({
12791
- name: "Umbraco CMS Developer MCP Server",
12792
- version: package_default.version
12793
- });
12794
12826
  const client = UmbracoManagementClient.getClient();
12795
12827
  const user = await client.getUserCurrent();
12796
12828
  const rawConfig = await getServerConfig2(true);
@@ -12812,8 +12844,23 @@ var main = async () => {
12812
12844
  setUmbracoVersion(serverInfo.version);
12813
12845
  await checkUmbracoVersion({
12814
12846
  mcpVersion: package_default.version,
12847
+ // UMBRACO_TARGET_MAJOR is stamped into src/config/umbraco-target.generated.ts
12848
+ // by the orval target-major transformer, from the Umbraco instance the API
12849
+ // client was generated against. Override to point at a different major.
12850
+ // (`?.trim() ||`, not `??`: an env var set to an empty string must still
12851
+ // fall back, or the check silently no-ops with no log output at all.)
12852
+ expectedUmbracoMajor: process.env.UMBRACO_EXPECTED_MAJOR?.trim() || UMBRACO_TARGET_MAJOR,
12815
12853
  client: { getServerInformation: async () => serverInfo }
12816
12854
  });
12855
+ configureVersionCheckHook();
12856
+ const versionCheckMessage = getVersionCheckMessage();
12857
+ const server = new McpServer(
12858
+ {
12859
+ name: "Umbraco CMS Developer MCP Server",
12860
+ version: package_default.version
12861
+ },
12862
+ versionCheckMessage ? { instructions: versionCheckMessage } : void 0
12863
+ );
12817
12864
  UmbracoToolFactory(server, user, config);
12818
12865
  const transport = new StdioServerTransport();
12819
12866
  await server.connect(transport);