@se-studio/contentful-cms 2.7.6 → 2.8.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.
Files changed (57) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/HOSTED.md +20 -2
  3. package/dist/commands/preview.d.ts.map +1 -1
  4. package/dist/commands/preview.js +74 -0
  5. package/dist/commands/preview.js.map +1 -1
  6. package/dist/config/hosted.d.ts +1 -0
  7. package/dist/config/hosted.d.ts.map +1 -1
  8. package/dist/config/hosted.js +4 -0
  9. package/dist/config/hosted.js.map +1 -1
  10. package/dist/config/load.d.ts.map +1 -1
  11. package/dist/config/load.js +3 -0
  12. package/dist/config/load.js.map +1 -1
  13. package/dist/config/types.d.ts +2 -0
  14. package/dist/config/types.d.ts.map +1 -1
  15. package/dist/editor-pack/capabilities.d.ts +6 -0
  16. package/dist/editor-pack/capabilities.d.ts.map +1 -1
  17. package/dist/editor-pack/capabilities.js +19 -1
  18. package/dist/editor-pack/capabilities.js.map +1 -1
  19. package/dist/editor-pack/generate.d.ts.map +1 -1
  20. package/dist/editor-pack/generate.js +13 -1
  21. package/dist/editor-pack/generate.js.map +1 -1
  22. package/dist/generated/hosted-guide.d.ts +1 -1
  23. package/dist/generated/hosted-guide.d.ts.map +1 -1
  24. package/dist/generated/hosted-guide.js +1 -1
  25. package/dist/generated/hosted-guide.js.map +1 -1
  26. package/dist/generated/version.d.ts +1 -1
  27. package/dist/generated/version.js +1 -1
  28. package/dist/hosted/oauth/complete.d.ts.map +1 -1
  29. package/dist/hosted/oauth/complete.js +2 -1
  30. package/dist/hosted/oauth/complete.js.map +1 -1
  31. package/dist/hosted/oauth/handlers.d.ts.map +1 -1
  32. package/dist/hosted/oauth/handlers.js +5 -26
  33. package/dist/hosted/oauth/handlers.js.map +1 -1
  34. package/dist/hosted/oauth/redirect-uri.d.ts +10 -0
  35. package/dist/hosted/oauth/redirect-uri.d.ts.map +1 -0
  36. package/dist/hosted/oauth/redirect-uri.js +61 -0
  37. package/dist/hosted/oauth/redirect-uri.js.map +1 -0
  38. package/dist/mcp/prompts/onboarding.d.ts.map +1 -1
  39. package/dist/mcp/prompts/onboarding.js +15 -5
  40. package/dist/mcp/prompts/onboarding.js.map +1 -1
  41. package/dist/mcp/tools/cms-edit.d.ts +1 -1
  42. package/dist/mcp/tools/cms-edit.d.ts.map +1 -1
  43. package/dist/mcp/tools/cms-edit.js +2 -1
  44. package/dist/mcp/tools/cms-edit.js.map +1 -1
  45. package/dist/preview/entry-urls.d.ts +32 -0
  46. package/dist/preview/entry-urls.d.ts.map +1 -0
  47. package/dist/preview/entry-urls.js +103 -0
  48. package/dist/preview/entry-urls.js.map +1 -0
  49. package/dist/project/doctor.d.ts.map +1 -1
  50. package/dist/project/doctor.js +24 -0
  51. package/dist/project/doctor.js.map +1 -1
  52. package/docs/editor-tasks/create-from-document.md +4 -2
  53. package/docs/editor-tasks/preview-verify.md +40 -6
  54. package/docs/mcp/hosted-guide.md +23 -2
  55. package/package.json +1 -1
  56. package/skills/manifest.json +1 -1
  57. package/skills/setup/SKILL.md +39 -3
@@ -0,0 +1,32 @@
1
+ export type PreviewUrlTarget = 'staging' | 'production' | 'siteLivePreview' | 'contentfulEntry' | 'contentfulLivePreview';
2
+ export interface BuildPreviewUrlsInput {
3
+ spaceId: string;
4
+ environment: string;
5
+ entryId?: string;
6
+ slug?: string;
7
+ devBaseUrl?: string;
8
+ productionSiteUrl?: string;
9
+ requestParams?: Record<string, string>;
10
+ focusedField?: string;
11
+ }
12
+ export interface PreviewUrlResult {
13
+ target: PreviewUrlTarget;
14
+ label: string;
15
+ url: string | null;
16
+ /** When true, draft-only changes are visible at this URL. */
17
+ showsDrafts: boolean;
18
+ notes?: string;
19
+ }
20
+ export declare function buildContentfulEntryUrl(spaceId: string, environment: string, entryId: string, options?: {
21
+ focusedField?: string;
22
+ }): string;
23
+ /**
24
+ * Fetches Contentful's in-app live preview URL (includes ephemeral preview token).
25
+ * Falls back to null when the API is unavailable or the token cannot be resolved.
26
+ */
27
+ export declare function fetchContentfulLivePreviewUrl(spaceId: string, environment: string, entryId: string, managementToken: string): Promise<string | null>;
28
+ export declare function buildPreviewUrls(input: BuildPreviewUrlsInput): PreviewUrlResult[];
29
+ export declare function buildAllPreviewUrls(input: BuildPreviewUrlsInput & {
30
+ managementToken?: string;
31
+ }): Promise<PreviewUrlResult[]>;
32
+ //# sourceMappingURL=entry-urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-urls.d.ts","sourceRoot":"","sources":["../../src/preview/entry-urls.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,iBAAiB,GACjB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,gBAAgB,EAAE,CA2DjF;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,qBAAqB,GAAG;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsB7B"}
@@ -0,0 +1,103 @@
1
+ import { appendRequestParams } from './capture-urls.js';
2
+ function normalizeBaseUrl(url) {
3
+ return url.replace(/\/$/, '');
4
+ }
5
+ function normalizeSlug(slug) {
6
+ if (slug === '/' || slug === '/index')
7
+ return '/';
8
+ return slug.startsWith('/') ? slug : `/${slug}`;
9
+ }
10
+ export function buildContentfulEntryUrl(spaceId, environment, entryId, options) {
11
+ const base = `https://app.contentful.com/spaces/${spaceId}/environments/${environment}/entries/${entryId}`;
12
+ if (options?.focusedField) {
13
+ return `${base}?focusedField=${encodeURIComponent(options.focusedField)}`;
14
+ }
15
+ return base;
16
+ }
17
+ /**
18
+ * Fetches Contentful's in-app live preview URL (includes ephemeral preview token).
19
+ * Falls back to null when the API is unavailable or the token cannot be resolved.
20
+ */
21
+ export async function fetchContentfulLivePreviewUrl(spaceId, environment, entryId, managementToken) {
22
+ const endpoint = `https://api.contentful.com/spaces/${spaceId}/environments/${environment}/entries/${entryId}/preview`;
23
+ try {
24
+ const res = await fetch(endpoint, {
25
+ headers: { Authorization: `Bearer ${managementToken}` },
26
+ });
27
+ if (!res.ok)
28
+ return null;
29
+ const body = (await res.json());
30
+ const url = body.url ?? body.preview_url;
31
+ return typeof url === 'string' && url.startsWith('http') ? url : null;
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ export function buildPreviewUrls(input) {
38
+ const slug = input.slug ? normalizeSlug(input.slug) : undefined;
39
+ const results = [];
40
+ if (input.devBaseUrl && slug) {
41
+ const stagingUrl = appendRequestParams(`${normalizeBaseUrl(input.devBaseUrl)}${slug === '/' ? '' : slug}`, input.requestParams);
42
+ results.push({
43
+ target: 'staging',
44
+ label: 'Staging site',
45
+ url: stagingUrl,
46
+ showsDrafts: false,
47
+ notes: 'Public staging path. Draft content may require the site live-preview redirect or Contentful preview.',
48
+ });
49
+ }
50
+ if (input.devBaseUrl && input.entryId) {
51
+ const params = new URLSearchParams({ id: input.entryId });
52
+ if (input.requestParams) {
53
+ for (const [key, value] of Object.entries(input.requestParams)) {
54
+ params.set(key, value);
55
+ }
56
+ }
57
+ results.push({
58
+ target: 'siteLivePreview',
59
+ label: 'Site live preview',
60
+ url: `${normalizeBaseUrl(input.devBaseUrl)}/preview?${params.toString()}`,
61
+ showsDrafts: true,
62
+ notes: 'Entry-aware redirect (Contentful preview destination). Best for verifying drafts on staging.',
63
+ });
64
+ }
65
+ if (input.productionSiteUrl && slug) {
66
+ results.push({
67
+ target: 'production',
68
+ label: 'Production site',
69
+ url: `${normalizeBaseUrl(input.productionSiteUrl)}${slug === '/' ? '' : slug}`,
70
+ showsDrafts: false,
71
+ notes: 'Published content only until the entry is published in Contentful.',
72
+ });
73
+ }
74
+ if (input.entryId) {
75
+ results.push({
76
+ target: 'contentfulEntry',
77
+ label: 'Contentful entry editor',
78
+ url: buildContentfulEntryUrl(input.spaceId, input.environment, input.entryId, {
79
+ focusedField: input.focusedField,
80
+ }),
81
+ showsDrafts: true,
82
+ notes: 'Open the entry in Contentful. Use the Live preview tab for in-app draft preview.',
83
+ });
84
+ }
85
+ return results;
86
+ }
87
+ export async function buildAllPreviewUrls(input) {
88
+ const results = buildPreviewUrls(input);
89
+ if (input.entryId && input.managementToken) {
90
+ const livePreviewUrl = await fetchContentfulLivePreviewUrl(input.spaceId, input.environment, input.entryId, input.managementToken);
91
+ if (livePreviewUrl) {
92
+ results.push({
93
+ target: 'contentfulLivePreview',
94
+ label: 'Contentful live preview',
95
+ url: livePreviewUrl,
96
+ showsDrafts: true,
97
+ notes: 'In-app Contentful preview with inspector mode.',
98
+ });
99
+ }
100
+ }
101
+ return results;
102
+ }
103
+ //# sourceMappingURL=entry-urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-urls.js","sourceRoot":"","sources":["../../src/preview/entry-urls.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/project/doctor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAiDD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,EAAE,CAgH7F"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/project/doctor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAiDD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,EAAE,CAwI7F"}
@@ -1,5 +1,6 @@
1
1
  import * as fs from 'node:fs';
2
2
  import * as path from 'node:path';
3
+ import { hasSiteHandbook } from '../editor-pack/capabilities.js';
3
4
  import { loadEditorPackManifest } from '../editor-pack/load.js';
4
5
  import { parseConstants } from '../editor-pack/parse-constants.js';
5
6
  import { resolveRepoRoot, resolveWebsiteAppDir } from './load.js';
@@ -109,6 +110,29 @@ export function runProjectDoctor(configPath, project) {
109
110
  message: 'editor-pack has no articles.md — regenerate after adding articles playbook',
110
111
  });
111
112
  }
113
+ if (!hasSiteHandbook(repoRoot, project.projectKey, 'pages.md')) {
114
+ findings.push({
115
+ severity: 'info',
116
+ code: 'pages_playbook_missing',
117
+ message: `Add docs/cms-editor/${project.projectKey}/pages.md for landing-page and create-from-doc playbooks`,
118
+ });
119
+ }
120
+ else if (!manifest.resources.includes('pages')) {
121
+ findings.push({
122
+ severity: 'warning',
123
+ code: 'pack_pages_missing',
124
+ message: 'editor-pack has no pages.md — regenerate after adding pages playbook',
125
+ });
126
+ }
127
+ const constants = parseConstants(appDir);
128
+ const hasPersons = constants.enablePerson === true || Boolean(constants.peopleBase);
129
+ if (hasPersons && !hasSiteHandbook(repoRoot, project.projectKey, 'people.md')) {
130
+ findings.push({
131
+ severity: 'info',
132
+ code: 'people_playbook_missing',
133
+ message: `Add docs/cms-editor/${project.projectKey}/people.md for team profiles and author import`,
134
+ });
135
+ }
112
136
  const routingPath = path.join(packDir, 'routing.md');
113
137
  if (fs.existsSync(routingPath)) {
114
138
  const routing = fs.readFileSync(routingPath, 'utf8');
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/project/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/project/doctor.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,8 @@
24
24
  5. Build `create from-json` payload
25
25
  6. `cms_edit ["create", "from-json", "--file", "<path>", "--dry-run", "--strict"]`
26
26
  7. On approval, create and `save`
27
- 8. Remind user to publish in Contentful UI
27
+ 8. `cms_edit ["preview", "urls", "<slug>"]` — open **site live preview** or staging URL in browser MCP; offer production and Contentful entry URLs
28
+ 9. Remind user to publish in Contentful UI
28
29
 
29
30
  Use MCP prompts `cms_edit_create_from_doc` or `cms_edit_create_article_from_doc` when available.
30
31
 
@@ -42,4 +43,5 @@ Use MCP prompts `cms_edit_create_from_doc` or `cms_edit_create_article_from_doc`
42
43
  ## Related resources
43
44
 
44
45
  - `cms-edit://customer/components-index`
45
- - `task-media-reuse-and-upload`
46
+ - `task-media-reuse-and-upload`
47
+ - `task-preview-verify`
@@ -5,6 +5,7 @@
5
5
  - preview changes
6
6
  - check staging
7
7
  - verify page looks right
8
+ - open in browser
8
9
 
9
10
  ## Requires capabilities
10
11
 
@@ -13,21 +14,53 @@ Always available.
13
14
  ## Prerequisites
14
15
 
15
16
  - Draft saved (`save` creates drafts)
16
- - Staging URL from `cms-edit://customer/overview`
17
+ - Staging URL from `cms-edit://customer/overview` or `capabilities.json` → `website.devBaseUrl`
18
+ - Entry ID from session (after `open` / `save`) or `--entry-id`
19
+
20
+ ## Preview targets
21
+
22
+ After saving a draft, agents should offer **all applicable URLs** and open the best default in a browser MCP (Chrome DevTools, agent-browser, etc.).
23
+
24
+ | Target | Command | When to use |
25
+ |--------|---------|-------------|
26
+ | **Staging site** | `preview url <slug>` | Quick check on develop/staging deployment |
27
+ | **All URLs** | `preview urls <slug>` | Returns staging, production, site live preview, Contentful entry (and live preview when API resolves) |
28
+ | **Site live preview** | Included in `preview urls` | `{devBaseUrl}/preview?id={entryId}` — entry-aware draft redirect; **preferred for new drafts** |
29
+ | **Production site** | Included in `preview urls` | Published content only — use after publish or to compare live |
30
+ | **Contentful entry** | Included in `preview urls` | `app.contentful.com/.../entries/{id}` — editor + Live preview tab |
31
+ | **Contentful live preview** | Included in `preview urls` when available | In-app iframe preview with inspector (ephemeral token from Contentful API) |
17
32
 
18
33
  ## Steps
19
34
 
20
- 1. After `save`, get preview URL:
35
+ 1. After `save`, list all preview URLs:
21
36
  ```
22
- cms_edit ["preview", "url", "--page-slug", "<slug>"]
37
+ cms_edit ["preview", "urls", "<slug>"]
23
38
  ```
24
- 2. Open in browser (browser MCP in dev environments)
25
- 3. Report visual/layout issues to user before they publish in Contentful
39
+ Or with explicit entry ID:
40
+ ```
41
+ cms_edit ["preview", "urls", "<slug>", "--entry-id", "<entry-id>"]
42
+ ```
43
+ Use `--json` for machine-readable output.
44
+
45
+ 2. **Default open for new drafts:** site live preview (`siteLivePreview`) or staging URL — whichever the site playbook recommends.
46
+
47
+ 3. **Open in browser** — use browser MCP on the chosen URL. Offer the user links to the other targets.
48
+
49
+ 4. Summarize what to check (headings, CTAs, images, template blocks) before publish handoff.
50
+
51
+ ### Legacy single URL
52
+
53
+ ```
54
+ cms_edit ["preview", "url", "--page-slug", "<slug>"]
55
+ ```
56
+
57
+ Still valid for staging-only checks.
26
58
 
27
59
  ## Confirmation gates
28
60
 
29
61
  1. Confirm draft saved before preview
30
62
  2. Summarize what to check (headings, CTAs, images)
63
+ 3. Tell user production URL will not show draft content until published
31
64
 
32
65
  ## Out of scope
33
66
 
@@ -35,4 +68,5 @@ Always available.
35
68
 
36
69
  ## Related resources
37
70
 
38
- - `cms-edit://customer/overview`
71
+ - `cms-edit://customer/overview`
72
+ - `cms-edit://customer/production-site`
@@ -1,6 +1,6 @@
1
1
  # cms-edit MCP guide
2
2
 
3
- Use this guide when editing Contentful draft content through Claude Desktop (hosted Integrations + OAuth).
3
+ Use this guide when editing Contentful draft content through a hosted MCP connector (Claude Desktop Integrations + OAuth, or Grok Build).
4
4
 
5
5
  {{SITE_INTRO}}
6
6
 
@@ -216,6 +216,27 @@ Asset search and media-by-filename list **require** the index. Template/taxonomy
216
216
  ["search", "pricing"]
217
217
  ```
218
218
 
219
+ ## Grok Build setup
220
+
221
+ Grok connects to the same hosted MCP URL as Claude. Add to `~/.grok/config.toml`:
222
+
223
+ ```toml
224
+ [mcp_servers.cms-edit-brightline]
225
+ url = "https://brightline.content.se.studio/api/mcp"
226
+ enabled = true
227
+ ```
228
+
229
+ Replace the server name and host with your site's deployment. The URL **must** end with `/api/mcp` (not the site root).
230
+
231
+ **Connect:**
232
+
233
+ 1. In Grok, run `/mcps` and select your cms-edit server
234
+ 2. Press **`i`** to initiate OAuth (not just enable the toggle)
235
+ 3. Sign in with Contentful when the browser opens
236
+ 4. Verify with `grok mcp doctor <server-name>` or call `cms_edit_version`
237
+
238
+ OAuth is two steps: Grok obtains an MCP token, then you sign in with Contentful to link your account. If the browser flashes and closes immediately, reconnect after upgrading cms-edit (loopback redirect handling).
239
+
219
240
  ## Hosted connector rules
220
241
 
221
242
  {{HOSTED_RULES}}
@@ -245,7 +266,7 @@ Asset search and media-by-filename list **require** the index. Template/taxonomy
245
266
 
246
267
  | Problem | What to do |
247
268
  |---------|------------|
248
- | **401 / connection failed** | Claude → Settings → Integrations → Connect again; complete Contentful sign-in. On Vercel, search runtime logs for `[cms-edit:oauth] auth_failure` (always logged). Set `LOG_CMS_OAUTH=1` for connect success traces. |
269
+ | **401 / connection failed** | Reconnect: Claude → Settings → Integrations, or Grok `/mcps` → press `i`. Complete Contentful sign-in. On Vercel, search runtime logs for `[cms-edit:oauth] auth_failure` (always logged). Set `LOG_CMS_OAUTH=1` for connect success traces. |
249
270
  | **No cms_edit tool** | Confirm the integration is connected under Settings → Integrations |
250
271
  | **No active session** | Do not pass `--space` on hosted. Check `/api/health` — `redis` must be ok. MCP uses `_mcp` session automatically. Manual session: `["--session", "name", "open", "--page-slug", "/"]`. Fallback: `["read", "<entry-id>", "--id"]` |
251
272
  | **Wrong space** | Your Contentful account must have access to this deployment's space |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/contentful-cms",
3
- "version": "2.7.6",
3
+ "version": "2.8.0",
4
4
  "description": "CLI tool for AI agents to read and edit Contentful draft content without publish permissions",
5
5
  "repository": {
6
6
  "type": "git",
@@ -2,5 +2,5 @@
2
2
  "core": "Use cms-edit CLI to read/edit Contentful content (open → snapshot → read → set/rtf → diff → save).",
3
3
  "editor-tasks": "Route CMS editing intents to site task playbooks via tasks-index (hosted MCP resources or local editor-pack files).",
4
4
  "templates": "Create or edit templates (preContent, postContent, menu, footer, colours) in Contentful via cms-edit.",
5
- "setup": "Guide a user through connecting hosted cms-edit MCP for Claude (Integrations + OAuth)."
5
+ "setup": "Guide a user through connecting hosted cms-edit MCP for Claude or Grok (OAuth)."
6
6
  }
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: contentful-cms-setup
3
- description: "Guide a user through connecting hosted cms-edit MCP for Claude (Integrations + OAuth)."
3
+ description: "Guide a user through connecting hosted cms-edit MCP for Claude or Grok (OAuth)."
4
4
  ---
5
5
 
6
6
  # Skill: cms-edit Setup
7
7
 
8
- Use this skill when the user wants to connect Claude to their Contentful site via **hosted cms-edit MCP**.
8
+ Use this skill when the user wants to connect Claude or Grok to their Contentful site via **hosted cms-edit MCP**.
9
9
 
10
10
  Local stdio MCP and the setup wizard are **not supported**. Editors connect through the site's `/cms-edit` onboarding flow.
11
11
 
@@ -35,6 +35,39 @@ Use skill **`contentful-cms-editor-tasks`** for the tasks-index → capability p
35
35
 
36
36
  ---
37
37
 
38
+ ## Hosted setup (Grok Build)
39
+
40
+ Use when the user wants cms-edit in **Grok Build** (not local stdio MCP).
41
+
42
+ ### Step 1: Configure Grok
43
+
44
+ Add to `~/.grok/config.toml`:
45
+
46
+ ```toml
47
+ [mcp_servers.cms-edit-<projectKey>]
48
+ url = "https://<host>/api/mcp"
49
+ enabled = true
50
+ ```
51
+
52
+ The URL **must** end with `/api/mcp`. Use the MCP URL from the site's `/cms-edit` page.
53
+
54
+ ### Step 2: Connect
55
+
56
+ 1. In Grok, run `/mcps`
57
+ 2. Select the cms-edit server
58
+ 3. Press **`i`** to initiate OAuth (not just enable)
59
+ 4. Sign in with Contentful when prompted
60
+
61
+ ### Step 3: Verify
62
+
63
+ Run `grok mcp doctor cms-edit-<projectKey>` or call `cms_edit_version` in a Grok session.
64
+
65
+ **Reconnect:** `/mcps` → press `i` again if OAuth expires.
66
+
67
+ Full guide: `packages/contentful-cms/docs/mcp/hosted-guide.md` (Grok Build section).
68
+
69
+ ---
70
+
38
71
  ## Developers (CLI + skills, not local MCP)
39
72
 
40
73
  For engineering work in a site repo (Cursor, Grok, terminal):
@@ -51,7 +84,10 @@ Do **not** register a local `mcpServers.cms-edit` entry in Claude Desktop — us
51
84
  ## Troubleshooting
52
85
 
53
86
  **OAuth / sign-in fails**
54
- → Confirm the user was invited to the Contentful space and is signing in with the correct account.
87
+ → Confirm the user was invited to the Contentful space and is signing in with the correct account. In Grok, use `/mcps` → press `i` (not just toggle). Confirm config URL ends with `/api/mcp`.
88
+
89
+ **Grok browser flashes and closes**
90
+ → Usually a redirect_uri mismatch before cms-edit v2.7.7+; upgrade the hosted deployment and retry OAuth.
55
91
 
56
92
  **`cms_edit` tool not available**
57
93
  → Reconnect via `/cms-edit` or Claude Integrations. Remove any legacy local MCP or `.mcpb` extension entries.