@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.
- package/CHANGELOG.md +12 -0
- package/HOSTED.md +20 -2
- package/dist/commands/preview.d.ts.map +1 -1
- package/dist/commands/preview.js +74 -0
- package/dist/commands/preview.js.map +1 -1
- package/dist/config/hosted.d.ts +1 -0
- package/dist/config/hosted.d.ts.map +1 -1
- package/dist/config/hosted.js +4 -0
- package/dist/config/hosted.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +3 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/types.d.ts +2 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/editor-pack/capabilities.d.ts +6 -0
- package/dist/editor-pack/capabilities.d.ts.map +1 -1
- package/dist/editor-pack/capabilities.js +19 -1
- package/dist/editor-pack/capabilities.js.map +1 -1
- package/dist/editor-pack/generate.d.ts.map +1 -1
- package/dist/editor-pack/generate.js +13 -1
- package/dist/editor-pack/generate.js.map +1 -1
- package/dist/generated/hosted-guide.d.ts +1 -1
- package/dist/generated/hosted-guide.d.ts.map +1 -1
- package/dist/generated/hosted-guide.js +1 -1
- package/dist/generated/hosted-guide.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/hosted/oauth/complete.d.ts.map +1 -1
- package/dist/hosted/oauth/complete.js +2 -1
- package/dist/hosted/oauth/complete.js.map +1 -1
- package/dist/hosted/oauth/handlers.d.ts.map +1 -1
- package/dist/hosted/oauth/handlers.js +5 -26
- package/dist/hosted/oauth/handlers.js.map +1 -1
- package/dist/hosted/oauth/redirect-uri.d.ts +10 -0
- package/dist/hosted/oauth/redirect-uri.d.ts.map +1 -0
- package/dist/hosted/oauth/redirect-uri.js +61 -0
- package/dist/hosted/oauth/redirect-uri.js.map +1 -0
- package/dist/mcp/prompts/onboarding.d.ts.map +1 -1
- package/dist/mcp/prompts/onboarding.js +15 -5
- package/dist/mcp/prompts/onboarding.js.map +1 -1
- package/dist/mcp/tools/cms-edit.d.ts +1 -1
- package/dist/mcp/tools/cms-edit.d.ts.map +1 -1
- package/dist/mcp/tools/cms-edit.js +2 -1
- package/dist/mcp/tools/cms-edit.js.map +1 -1
- package/dist/preview/entry-urls.d.ts +32 -0
- package/dist/preview/entry-urls.d.ts.map +1 -0
- package/dist/preview/entry-urls.js +103 -0
- package/dist/preview/entry-urls.js.map +1 -0
- package/dist/project/doctor.d.ts.map +1 -1
- package/dist/project/doctor.js +24 -0
- package/dist/project/doctor.js.map +1 -1
- package/docs/editor-tasks/create-from-document.md +4 -2
- package/docs/editor-tasks/preview-verify.md +40 -6
- package/docs/mcp/hosted-guide.md +23 -2
- package/package.json +1 -1
- package/skills/manifest.json +1 -1
- 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":"
|
|
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"}
|
package/dist/project/doctor.js
CHANGED
|
@@ -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.
|
|
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`,
|
|
35
|
+
1. After `save`, list all preview URLs:
|
|
21
36
|
```
|
|
22
|
-
cms_edit ["preview", "
|
|
37
|
+
cms_edit ["preview", "urls", "<slug>"]
|
|
23
38
|
```
|
|
24
|
-
|
|
25
|
-
|
|
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`
|
package/docs/mcp/hosted-guide.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# cms-edit MCP guide
|
|
2
2
|
|
|
3
|
-
Use this guide when editing Contentful draft content through Claude Desktop
|
|
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 →
|
|
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
package/skills/manifest.json
CHANGED
|
@@ -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
|
|
5
|
+
"setup": "Guide a user through connecting hosted cms-edit MCP for Claude or Grok (OAuth)."
|
|
6
6
|
}
|
package/skills/setup/SKILL.md
CHANGED
|
@@ -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
|
|
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.
|