@timelesscms-com/mcp-server 0.5.0 → 0.7.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.
@@ -6,7 +6,7 @@ function v(version) {
6
6
  export const bulkTools = [
7
7
  {
8
8
  name: 'bulk_replace_text',
9
- description: 'Replace a literal substring or regex across pages in one call. ALWAYS run with dry_run=true first and show the sample_diffs to the user before running the real call. Writes go through the normal pipeline (SEO transforms + revision snapshots).',
9
+ description: 'Replace a literal substring or regex across pages in one call. ALWAYS run with dry_run=true first and show the sample_diffs to the user before running the real call. Writes go through the normal pipeline (SEO transforms + revision snapshots). Response shape: { dry_run, updated, total_matches, pages_with_matches, sample_diffs_shown, additional_pages_with_matches, sample_diffs[], skipped (deprecated) }.',
10
10
  inputSchema: {
11
11
  pattern: z.string().min(1).describe('Literal substring (default) or JS regex source if regex=true.'),
12
12
  replacement: z.string(),
@@ -6,9 +6,10 @@ function v(version) {
6
6
  export const deployTools = [
7
7
  {
8
8
  name: 'trigger_deploy',
9
- description: 'Enqueue a deploy of the currently active version. Returns a job_id immediately; poll get_deploy_status until the status leaves queued/running.',
9
+ description: "Enqueue a deploy of the currently active version. Returns a job_id immediately; poll get_deploy_status until the status leaves queued/running. With `dry_run: true`, the deploy runs through every step EXCEPT the hosting-adapter upload — useful for validating a structural change (new collection routes, schema bump, mode switch) without risking the live site. A dry_run job that succeeds proves the build is clean; one that fails returns the same astro stack-trace in get_deploy_status.error as a real deploy would.",
10
10
  inputSchema: {
11
11
  environment: z.enum(['production', 'staging']).optional(),
12
+ dry_run: z.boolean().optional().describe('Run the build but skip the CDN upload. The job ends in succeeded/failed the same way a real deploy does.'),
12
13
  version: versionParam,
13
14
  },
14
15
  handler: withErrorBoundary(async (args, { client, siteId }) => {
@@ -27,7 +28,7 @@ export const deployTools = [
27
28
  },
28
29
  {
29
30
  name: 'get_deploy_status',
30
- description: 'Status of a single deploy job (queued | running | succeeded | failed).',
31
+ description: "Status of a single deploy job. Returns { job, queued_for_seconds, queue_timeout_seconds }. job.status is one of queued | running | succeeded | failed. Polling cadence: ~5s for queued/running. A job stuck in 'queued' for longer than queue_timeout_seconds (default 300s) auto-flips to failed with phase='queue_timeout' — so a single poll past that timestamp returns the terminal state and you can stop polling.",
31
32
  inputSchema: { job_id: z.string() },
32
33
  handler: withErrorBoundary(async (args, { client, siteId }) => {
33
34
  const res = await client.get(siteId, `deploys/${encodeURIComponent(args.job_id)}`);
@@ -10,6 +10,14 @@ export const siteTools = [
10
10
  return ok(res);
11
11
  }),
12
12
  },
13
+ {
14
+ name: 'get_site_capabilities',
15
+ description: "Discover what the site-template renderer supports for this site. Returns a manifest of feature flags (blocks-mode, x-include, collection routes, custom block scripts, dry-run deploys, etc.) plus template_capabilities_version + the core block type ids. Call this when you're about to do something structural (set route_template on a collection, switch a page to blocks-mode, install a custom block type) and want to feature-detect rather than guess. The manifest is platform-wide today; per-site custom templates land later.",
16
+ handler: withErrorBoundary(async (_args, { client, siteId }) => {
17
+ const res = await client.get(siteId, 'capabilities');
18
+ return ok(res);
19
+ }),
20
+ },
13
21
  {
14
22
  name: 'update_site',
15
23
  description: 'Edit Site-level identity fields: name (display), slug (drives the {slug}.timelesscms-fallback subdomain — kebab-case, 3-48 chars, unique across the org), domain (the customer\'s real hostname; pass "" to clear). For colors / fonts / contact info / tagline use update_site_settings instead.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timelesscms-com/mcp-server",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Model Context Protocol server for the TimelessCMS public API. Use with Claude Code or any MCP-compatible client to manage a TimelessCMS site.",
5
5
  "license": "MIT",
6
6
  "type": "module",