@typeroll/mcp-server 0.45.105 → 0.45.107
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/AGENTS.md +17 -7
- package/README.md +4 -3
- package/dist/bundled-content.js +6 -6
- package/dist/compact-tools.js +1 -1
- package/dist/server.js +5 -0
- package/dist/tools/deploy.js +4 -3
- package/dist/tools/workflows.js +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/skills/tr-edit-site.md +4 -0
- package/skills/tr-header-footer.md +6 -0
- package/skills/tr-migrate-multisite.md +8 -0
- package/skills/tr-migrate-wp.md +16 -0
package/dist/compact-tools.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { fail, ok } from './tools/helpers.js';
|
|
3
|
-
export const COMPACT_INSTRUCTIONS = `Typeroll CMS. Use search_tools to find a task's tools, describe_tool to read one exact schema, then call_read_tool, call_write_tool or call_admin_tool. Discover before you write: identify Site/Version, capabilities and enabled app documentation. Read only the relevant skill or guide section; do not load the full manual by default. Larger changes: create_branch and keep the same version. Working copy, saved content and live output differ. Publishing and other external effects require the user's authorization; tool access alone is not approval.`;
|
|
3
|
+
export const COMPACT_INSTRUCTIONS = `Typeroll CMS. Use search_tools to find a task's tools, describe_tool to read one exact schema, then call_read_tool, call_write_tool or call_admin_tool. Discover before you write: identify Site/Version, capabilities and enabled app documentation. Read only the relevant skill or guide section; do not load the full manual by default. Larger changes: create_branch and keep the same version. Working copy, saved content and live output differ. Publishing and other external effects require the user's authorization; tool access alone is not approval. After cutover a deploy reaches the live domain: it needs the owner's approval and confirm_live_domains: true.`;
|
|
4
4
|
/** Stable discovery surface: no dynamic registration or client list-change support needed. */
|
|
5
5
|
export function compactTools(catalog) {
|
|
6
6
|
const byName = new Map(catalog.map(tool => [tool.name, tool]));
|
package/dist/server.js
CHANGED
|
@@ -190,6 +190,11 @@ The full playbook ships with this server — use it:
|
|
|
190
190
|
schema_markup, create_site_and_plan) need the Organization's portal AI
|
|
191
191
|
key for the Site. On ai_not_enabled don't retry: do the work yourself
|
|
192
192
|
with the recipe named in start_workflow and tell the user you did.
|
|
193
|
+
10. Publishing to the temporary address ends at cutover. Once a site serves
|
|
194
|
+
its live custom domain, every trigger_deploy is a production release: get
|
|
195
|
+
the owner's approval and pass confirm_live_domains: true
|
|
196
|
+
(get_publication_impact reports production and targets). Review with
|
|
197
|
+
get_preview_link include_working_copy instead of deploying.
|
|
193
198
|
|
|
194
199
|
If anything here conflicts with what a tool returns, trust the tool. Every
|
|
195
200
|
tool's own description carries its specifics.
|
package/dist/tools/deploy.js
CHANGED
|
@@ -6,15 +6,16 @@ function v(version) {
|
|
|
6
6
|
export const deployTools = [
|
|
7
7
|
{
|
|
8
8
|
name: 'get_publication_impact',
|
|
9
|
-
description: 'Read provisional net saved public-source changes against the selected version’s last verified publication. Reports additions, removals, shared inputs, metadata-only changes and unavailable baselines. Does not build or deploy. execution is automatic and reuse_verified is false before the build; inspect job.render_report afterwards for actual rendered/reused counts; source-level classification does not prove output reuse or cost savings.',
|
|
9
|
+
description: 'Read where a deploy lands and provisional net saved public-source changes against the selected version’s last verified publication. targets lists every public URL the publication serves (live domains first, then the temporary address); production: true means the site is cut over and a deploy publishes to live_domains. Reports additions, removals, shared inputs, metadata-only changes and unavailable baselines. Does not build or deploy. execution is automatic and reuse_verified is false before the build; inspect job.render_report afterwards for actual rendered/reused counts; source-level classification does not prove output reuse or cost savings.',
|
|
10
10
|
inputSchema: { version: versionParam },
|
|
11
11
|
handler: withErrorBoundary(async (args, { client, siteId }) => ok(await client.get(siteId, 'publishing/impact', v(args.version)))),
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
name: 'trigger_deploy',
|
|
15
|
-
description: "Enqueue a deploy (static-page build → hosting) of the currently active version. Returns a job_id immediately; poll get_deploy_status until the status leaves queued/running. NOT for previewing iterative design/content edits — that's what get_preview_link is for (it renders live from the DB with no build). Reserve trigger_deploy for publishing, a stakeholder link to the compiled site, or pre-merge validation. Deploys build SAVED content only — unsaved drafts (working copies) are excluded, so commit_working_copy (or save:true on your writes) before deploying, or your changes won't ship. Customer publishing freezes a consistent saved source, then resumes source/Git/build-dispatch checkpoints without recapturing later edits. GitHub or Cloudflare performs rendering and media work. With dry_run:true, customer publishing validates frozen source without a Git push or external build; it does not prove an Astro build succeeds. Other self-hosted adapters may build locally without upload. Check the reported phase. All sites in an organization share one build engine: publish one site at a time, starting the next only when the previous job has finished and read_organization_build_engine shows no active_jobs. A domain switch waiting for DNS approval (awaiting_approval) does not block other sites.",
|
|
15
|
+
description: "Enqueue a deploy (static-page build → hosting) of the currently active version. Returns a job_id immediately; poll get_deploy_status until the status leaves queued/running. NOT for previewing iterative design/content edits — that's what get_preview_link is for (it renders live from the DB with no build). Reserve trigger_deploy for publishing, a stakeholder link to the compiled site, or pre-merge validation. Publishing to the temporary address ends at cutover: once a site serves its live custom domain, the same publication serves both, so every deploy of main is a production release. Then get the owner's approval and pass confirm_live_domains: true; without it a real deploy is refused with live_domain_confirmation_required, naming the live URLs and targets. Review changes on a cut-over site with get_preview_link (include_working_copy) or dry_run:true, which need no confirmation. The result reports production, live_domains and targets (live domains first, then the temporary address). Deploys build SAVED content only — unsaved drafts (working copies) are excluded, so commit_working_copy (or save:true on your writes) before deploying, or your changes won't ship. Customer publishing freezes a consistent saved source, then resumes source/Git/build-dispatch checkpoints without recapturing later edits. GitHub or Cloudflare performs rendering and media work. With dry_run:true, customer publishing validates frozen source without a Git push or external build; it does not prove an Astro build succeeds. Other self-hosted adapters may build locally without upload. Check the reported phase. All sites in an organization share one build engine: publish one site at a time, starting the next only when the previous job has finished and read_organization_build_engine shows no active_jobs. A domain switch waiting for DNS approval (awaiting_approval) does not block other sites.",
|
|
16
16
|
inputSchema: {
|
|
17
17
|
environment: z.enum(['production', 'staging']).optional(),
|
|
18
|
+
confirm_live_domains: z.boolean().optional().describe('Required (true) for a real deploy of a cut-over site: acknowledges that the deploy publishes to the live domains named by get_publication_impact or the live_domain_confirmation_required error. Only after the site owner approved this production release. Not needed for dry_run or sites that are not cut over.'),
|
|
18
19
|
allow_unsaved: z.boolean().optional().describe('Explicitly publish saved content while leaving the reported unsaved Pages/partials untouched. Only after owner confirmation.'),
|
|
19
20
|
dry_run: z.boolean().optional().describe('Validate without publishing. Customer publishing checks frozen source only, including image links without an accessible name (publication_validation_failed); other adapters may build locally without upload.'),
|
|
20
21
|
version: versionParam,
|
|
@@ -41,7 +42,7 @@ export const deployTools = [
|
|
|
41
42
|
},
|
|
42
43
|
{
|
|
43
44
|
name: 'get_deploy_status',
|
|
44
|
-
description: "Status of a single deploy job. Optional top-level build_progress reports the exact task status, attempt, step and completed/total files; not an overall percentage or ETA. Returns { job, queued_for_seconds, queue_timeout_seconds }. job.status is one of queued | running | succeeded | failed. On a failed build, job.error names the failed step and the cause the step printed, job.failure.code is the reported code (e.g. media_build_process_exit_1) and job.failure.diagnostic holds { cause, lines } (the last 40 lines that step printed, credentials removed). On the Cloudflare build engine job.failure.provider_log also holds { step, build_id, summary, lines } from the provider's build log (last 60 lines). Read them before retrying; retrying does not fix a cause that is in the content or the build engine. job.warnings, when present, lists non-blocking findings of a deploy that still ran, for example a media file left out of the publication because it could not be published safely (an SVG that could not be sanitized); report them to the user. Polling cadence: ~5s for queued/running. job.render_report, when present, reports actual HTML mode (full/partial), rendered, reused, total and removed route counts plus a fallback reason. From Core 0.2.17, custom blocks and consumed image metadata are tracked per route; older caches require one full build. It does not measure media or provider startup savings. job.coordinator, when present, reports the last completed CMS phase and duration_ms for that attempt; external build waiting is excluded. Keep observing the same job across checkpoints; do not trigger duplicate deploys. 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.",
|
|
45
|
+
description: "Status of a single deploy job. Optional top-level build_progress reports the exact task status, attempt, step and completed/total files; not an overall percentage or ETA. Returns { job, queued_for_seconds, queue_timeout_seconds }. job.targets and job.production, when present, record where the publication was admitted to publish and whether that included a live domain. job.status is one of queued | running | succeeded | failed. On a failed build, job.error names the failed step and the cause the step printed, job.failure.code is the reported code (e.g. media_build_process_exit_1) and job.failure.diagnostic holds { cause, lines } (the last 40 lines that step printed, credentials removed). On the Cloudflare build engine job.failure.provider_log also holds { step, build_id, summary, lines } from the provider's build log (last 60 lines). Read them before retrying; retrying does not fix a cause that is in the content or the build engine. job.warnings, when present, lists non-blocking findings of a deploy that still ran, for example a media file left out of the publication because it could not be published safely (an SVG that could not be sanitized); report them to the user. Polling cadence: ~5s for queued/running. job.render_report, when present, reports actual HTML mode (full/partial), rendered, reused, total and removed route counts plus a fallback reason. From Core 0.2.17, custom blocks and consumed image metadata are tracked per route; older caches require one full build. It does not measure media or provider startup savings. job.coordinator, when present, reports the last completed CMS phase and duration_ms for that attempt; external build waiting is excluded. Keep observing the same job across checkpoints; do not trigger duplicate deploys. 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.",
|
|
45
46
|
inputSchema: { job_id: z.string(), include_provider: z.boolean().optional().describe('Also read the exact Git commit and Cloudflare build stages for a customer Git publication. Does not return build secrets.') },
|
|
46
47
|
handler: withErrorBoundary(async (args, { client, siteId }) => {
|
|
47
48
|
const res = await client.get(siteId, `deploys/${encodeURIComponent(args.job_id)}`);
|
package/dist/tools/workflows.js
CHANGED
|
@@ -25,7 +25,7 @@ export const workflowTools = [
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
name: 'start_workflow',
|
|
28
|
-
description: 'Start a server-side workflow on this Site; it runs in the background and returns workflow_id. Poll get_workflow. Config per type (same fields as the portal form): migration { wp_url, helper_api_key? } (needs verified organization import storage); site_planning { business_description }; content_generation { topic, tone?, audience? }; content_improvement { limit? }; url_parity { target_origin?, source_origin?, check_source?, statuses? }; rebuild_deploy { environment: staging | production }; seo_audit, link_check, performance_audit and schema_markup take none. Needs write permission; rebuild_deploy publishes and needs admin. Workflows that change content write to the given version (default main) — get the user\'s agreement first. ' + AI_WORKFLOWS,
|
|
28
|
+
description: 'Start a server-side workflow on this Site; it runs in the background and returns workflow_id. Poll get_workflow. Config per type (same fields as the portal form): migration { wp_url, helper_api_key? } (needs verified organization import storage); site_planning { business_description }; content_generation { topic, tone?, audience? }; content_improvement { limit? }; url_parity { target_origin?, source_origin?, check_source?, statuses? }; rebuild_deploy { environment: staging | production, confirm_live_domains? } (production on a cut-over site publishes to its live domain and needs confirm_live_domains: true after owner approval); seo_audit, link_check, performance_audit and schema_markup take none. Needs write permission; rebuild_deploy publishes and needs admin. Workflows that change content write to the given version (default main) — get the user\'s agreement first. ' + AI_WORKFLOWS,
|
|
29
29
|
inputSchema: {
|
|
30
30
|
type: z.enum(WORKFLOW_TYPES),
|
|
31
31
|
config: z.record(z.string(), z.unknown()).optional(),
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typeroll/mcp-server",
|
|
3
3
|
"mcpName": "io.github.Typeroll/typeroll",
|
|
4
|
-
"version": "0.45.
|
|
4
|
+
"version": "0.45.107",
|
|
5
5
|
"description": "Typeroll CMS MCP server \u2013 connect AI agents to the REST API to manage content and publish static websites.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
package/skills/tr-edit-site.md
CHANGED
|
@@ -67,6 +67,10 @@ section. A Page template is `update_page` `template` (an allowed ID, or null
|
|
|
67
67
|
for the content type default). `discard_working_copy` throws an unsaved draft
|
|
68
68
|
away. Publishing means saving the draft, `update_page` `status: "published"`
|
|
69
69
|
(applies immediately) and, when the user wants it live now, `trigger_deploy`.
|
|
70
|
+
On a site that serves its live custom domain (`get_publication_impact`
|
|
71
|
+
reports `production: true`), every deploy is a production release: get the
|
|
72
|
+
owner's approval and pass `confirm_live_domains: true`. Review with
|
|
73
|
+
`get_preview_link` `include_working_copy: true` instead of deploying.
|
|
70
74
|
|
|
71
75
|
**Publishing and failed deploys.** Poll `get_deploy_status` until the job is
|
|
72
76
|
`succeeded` or `failed`. Every site in an organization shares one build
|
|
@@ -129,6 +129,12 @@ names the list for screen readers and takes the site's Eyebrow style (or
|
|
|
129
129
|
or style them with site CSS. Read `read_site_settings` → `render.version`
|
|
130
130
|
first; below 13, raise it with `tr-upgrade-rendering`.
|
|
131
131
|
|
|
132
|
+
A header or menu partial renders before every Page's H1, so a label in it that
|
|
133
|
+
is not a navigation group title, such as "Get a quote:" above contact links,
|
|
134
|
+
must not be a `core/heading`. Use `core/prose` with `html: "<p>Get a quote:</p>"`
|
|
135
|
+
and its own `font_size_px`, `font_weight` and `color` (a palette token such as
|
|
136
|
+
`on_secondary` on a secondary panel). `core/text` takes the same `color`.
|
|
137
|
+
|
|
132
138
|
Each entry in `links` (`core/navigation_links` and `core/navigation`) may set
|
|
133
139
|
`link_rel`, for example `nofollow sponsored` on an affiliate or partner link.
|
|
134
140
|
A `core/tabs` choice with a direct `href` accepts `link_rel` and `new_tab` too,
|
|
@@ -308,6 +308,14 @@ new canonical build and is not an inventory-only operation):
|
|
|
308
308
|
6. Rerun the complete, unfiltered URL check and SEO review, then require
|
|
309
309
|
`get_migration_launch_report` to return `launch_ready: true`
|
|
310
310
|
|
|
311
|
+
Publishing to the temporary address ends at each site's cutover. From then on
|
|
312
|
+
one publication serves both the live domain and the old fallback address, so
|
|
313
|
+
every `trigger_deploy` of that site is a production release: review with
|
|
314
|
+
`get_preview_link` (`include_working_copy: true`) or `dry_run: true`, get the
|
|
315
|
+
owner's approval, and pass `confirm_live_domains: true`. Without it the deploy
|
|
316
|
+
is refused with `live_domain_confirmation_required`, naming the live URLs.
|
|
317
|
+
`get_publication_impact` reports `production` and `targets` per site.
|
|
318
|
+
|
|
311
319
|
## Phase 8 — Launch (required)
|
|
312
320
|
|
|
313
321
|
A site is not finished until this step has run. Call `read_site_readiness`
|
package/skills/tr-migrate-wp.md
CHANGED
|
@@ -394,6 +394,22 @@ is not visible to Typeroll. The
|
|
|
394
394
|
[launch checklist](https://typeroll.com/docs/guides/launch-checklist/)
|
|
395
395
|
explains every item.
|
|
396
396
|
|
|
397
|
+
## After cutover: every deploy is production
|
|
398
|
+
|
|
399
|
+
Publishing to the temporary address ends at cutover. Once the real domain
|
|
400
|
+
serves the site, one publication serves both the live domain and the old
|
|
401
|
+
`site-*.sites` address, so a deploy you think of as "temporary" changes the
|
|
402
|
+
live website.
|
|
403
|
+
|
|
404
|
+
- Review changes with `get_preview_link` (`include_working_copy: true`) or
|
|
405
|
+
`trigger_deploy dry_run=true`. Neither publishes or needs confirmation.
|
|
406
|
+
- Treat every real `trigger_deploy` as a production release: get the owner's
|
|
407
|
+
approval for it, then pass `confirm_live_domains: true`.
|
|
408
|
+
- `get_publication_impact` and the deploy result report `production` and
|
|
409
|
+
`targets` (live domains first, then the temporary address). Without the
|
|
410
|
+
acknowledgement a deploy is refused with `live_domain_confirmation_required`,
|
|
411
|
+
naming the live URLs. Show them to the owner; never add the flag on your own.
|
|
412
|
+
|
|
397
413
|
## Pitfalls
|
|
398
414
|
|
|
399
415
|
- **Don't publish during migration.** Always import as `draft`. Even
|