Typeroll CMSBLOCK
Open-source Typeroll website and application platform
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Typeroll CMS is an open-source CMS for static websites, with AI-agent workflows and a client-friendly visual editor for managing multiple client sites.
Freelancers and web agencies can build and manage client websites with their own AI agents, then give clients access to edit content in the browser. Organizations can also use Typeroll CMS to manage their own websites. Self-host or use Typeroll Cloud.
The repository contains the editor, public API, MCP server, Forms backend, Extension runtime, static renderer, and self-hosting adapters as open-source software. Most code is MIT-licensed; the WordPress helper plugin is GPL-2.0-or-later for WordPress compatibility.
AI agents can connect through MCP using a supported HTTP or stdio client, or call the REST API directly. See client compatibility and verification status and the connection guide.
What is included
- block and HTML page editing with live preview;
- Pages with content types, reusable blocks, media, redirects, templates, and workflows;
- server-backed Forms with stored submissions, email actions, and webhooks;
- the Extension manifest, installation, admin SSO, and browser runtime;
- the WordPress migration workflow, URL coverage tools, and helper plugin;
- a REST API and
@typeroll/mcp-serverfor agent-driven site management; - static site generation and Cloudflare Pages deployment support;
- Firebase/Firestore, R2, and local fixture-store adapters.
Forms is a core module in both the open-source edition and Typeroll Cloud. A self-hosted installation stores submissions in its own datastore and sends notifications and webhooks through services configured by its operator.
Repository layout
packages/shared/ Shared data contracts and block renderer packages/site-template/ Astro static site generator packages/portal/
1cc72945c40cOBSERVED · 2026-10-12Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add typeroll-static-publication-probe --env ACTIONS_ID_TOKEN_REQUEST_TOKEN=${ACTIONS_ID_TOKEN_REQUEST_TOKEN} --env ACTIONS_ID_TOKEN_REQUEST_URL=${ACTIONS_ID_TOKEN_REQUEST_URL} --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env AUTH_TRUST_PROXY_HOPS=${AUTH_TRUST_PROXY_HOPS} -- npx -y [email protected]{
"mcpServers": {
"typeroll-static-publication-probe": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"ACTIONS_ID_TOKEN_REQUEST_TOKEN": "${ACTIONS_ID_TOKEN_REQUEST_TOKEN}",
"ACTIONS_ID_TOKEN_REQUEST_URL": "${ACTIONS_ID_TOKEN_REQUEST_URL}",
"ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
"AUTH_TRUST_PROXY_HOPS": "${AUTH_TRUST_PROXY_HOPS}"
}
}
}
}Exposed tools (184)
93 read · 69 write · 22 destructive. Blast radius: 22 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
Analytics | read | Privacy-friendly traffic analytics and Core Web Vitals via Cloudflare Web Analytics, |
Integrations | write | Add analytics, advertising pixels, and support widgets by pasting an ID instead of a script tag. |
activate_domain | read | Legacy compatibility tool; new workflows should not call it. A declared |
add_block | write | Insert a block into a container — a page, partial, or page template. With no parent_id, inserts at the top level of the container. Otherwise the new block becomes a child of parent_id (or lands in slot_index N for slot-containers). Use |
add_domain | write | Attach a custom domain to this site. The site MUST NOT already have |
add_event_schema | write | Attach Event JSON-LD to a page describing an upcoming event. |
add_faq_schema | write | Attach FAQPage JSON-LD to a page. Use this when the page actually presents an FAQ — Google flags pages that emit FAQ schema for content that isn\ |
add_migration_urls | write | Add old-site URLs to the inventory in bulk (up to 2000 per call). This is how the inventory gets populated outside the in-portal WordPress migration: walk the old sitemap.xml, a GSC export, or a crawl, and post what you found. Idempotent — re-posting a known URL merges its |
add_recipe_schema | write | Attach Recipe JSON-LD to a recipe page. Required: name, recipeIngredient[], recipeInstructions[]. |
approve_publishing_domain_cutover | read | Approve switching website traffic to the verified frozen deployment. Read publishing domains first and review DNS requirements and certificate readiness. Existing traffic is preserved until validation succeeds. External DNS management remains the caller’s responsibility. |
approve_workflow | write | Approve the review gate of a run that is paused_for_review; it resumes from the next step in the background. Show the user review_message and review_data from get_workflow and get their approval first — approval is theirs to give, not the tool\ |
batch_read_pages | read | Read up to 200 pages in a single call. Returns pages_by_id — a map keyed by page_id for easy lookup — plus a not_found list. Use to bulk-load context before a redesign sweep. |
batch_update_pages | write | Apply per-page patches in one call (up to 200 entries). Each entry is { page_id, patch, save?, answer_sources? }; failures are reported per-row, the rest still apply. BUFFER MODEL: content patches land in each page\ |
check_internal_links | write | Check internal hrefs against the versioned database before deploy. Covers published Pages of every content type, partials, Page templates, generated facet routes, media URLs and redirect chains. Returns every broken source/href pair without requesting the live site. |
check_managed_site_migration | read | Verify migration of an existing static managed Pages site to connected Git publishing. Checks the original hosting account, project, domain and shared build engine. Returns a revision and previous live deployment; does not migrate or deploy. |
check_site_indexing | read | Probe the site\ |
clone_page | read | Duplicate an existing page under a new title + slug. Use this when you want a near-copy of an existing page as the starting point (e.g. duplicate |
commit_working_copy | write | SAVE a doc\ |
configure_owner_review | read | Site administrators: configure the reviewer recipient, enabled state and token lifetime. A separately configured site email connector sends notifications. This action does not send email or publish. |
create_block_type | write | Create a block type for this Site when no core block (or block template) fits a recurring shape. Origin is stamped |
create_branch | write | Create a copy-on-write branch from main (or the version passed in |
create_content_type | write | Create a Page content type. Title, slug, block body, SEO and status are built in; fields defines custom fields only. An empty route_template means pages of this type have no public URL. |
create_form | write | Create a form. Steps are the ONLY stored model — a Block[] tree of form/* field blocks per step. Simple forms: pass |
create_free_block | write | Create a new global block: one shared source that every page using it shows, so an edit updates them all. Pass |
create_page | write | Create a new page. Defaults to blocks mode (same as the portal UI\ |
create_page_template | write | Create a reusable template. Choose a starter or provide blocks, including template_content_slot for the Page body. Assign its ID to a content type’s template or a Page’s template. |
create_redirect | write | Create a redirect rule. Defaults to 301; pass status_code=302 for a temporary redirect. |
create_site | write | Create + bootstrap a NEW site in your org. Seeds default settings, a draft Home page, and a published header/footer so it renders immediately. Requires an ORG-scoped key (a site-scoped key is bound to one existing site and can |
create_style | write | Create a named style. Do this whenever a look could recur — an eyebrow, a lead paragraph, a card title, a quote, a button variant, a section rhythm — then apply it with the block\ |
create_upload_url | write | Mint a 5-min signed PUT URL for direct-to-R2 upload. After the upload completes, the CDN url is what you reference in <img src= |
decide_owner_proposal | read | Explicit site-administrator editorial decision: approve, reject, or approve with adjustments. Requires current content/schema and a stable request_id for retries. First decision wins. Approval updates accepted CMS content, never deploys; reviewer adjustments retain separate provenance. |
delete_block_template | destructive | Delete a block template. Pages that already inserted it keep their copies. |
delete_block_type | destructive | Remove a site block type. Needs admin permission. Core blocks cannot be deleted. Refused while anything uses the type (pages and drafts, templates, header, footer, global blocks, block templates, other block types); the refusal lists where, so tell the user and remove those uses first. |
delete_branch | destructive | Discard a branch with its overrides, tombstones and revision history (main cannot be deleted). Admin permission required. |
delete_content_type | destructive | Delete an unused content type. Reassign or delete its pages first; the standard Page type cannot be deleted. |
delete_email_settings | destructive | Disconnect the site |
delete_form | destructive | Delete a form. Existing submissions are preserved by default — pass delete_submissions: true to also drop them. |
delete_form_submission | destructive | Delete a single submission from a form\ |
delete_media | destructive | Delete a media item\ |
delete_migration_url | destructive | Remove an entry from the inventory entirely. Use for junk the crawl picked up (session URLs, faceted duplicates). To record a deliberate 404 instead, prefer update_migration_url with excluded: true — that keeps the decision visible in the coverage report. |
delete_page | destructive | Delete a page (tombstoned on branches, removed on main). |
delete_page_template | destructive | Delete an unused Page template. Reassign any Pages or content types using it first. |
delete_partial | destructive | Delete a free global block. header and footer cannot be deleted (they are layout blocks). |
delete_redirect | destructive | Remove a redirect rule. |
delete_style | destructive | Delete a style. Blocks that still reference it fall back to their default look; reassign them first. |
detach_global_block | read | Replace a core/global_block reference on a page with an editable copy of the global block\ |
discard_changes | read | Discard the unsaved draft (working copy) of a page or partial — the saved doc is untouched. Use when the user rejects your proposed change. CAUTION: this also throws away any unsaved edits the user made in the editor on the same doc. |
discard_working_copy | read | Throw away a doc\ |
duplicate_block | write | Clone a block (subtree included) and insert the copy directly after the original within the same container. Returns the duplicate\ |
export_block_types | read | Pack site block types into a .tcblocks zip (base64). When |
finalize_all_media | read | Backfill version of finalize_media: walks the entire media library, applies cache headers + variant generation to every item missing them. Use this once on legacy sites to fix Lighthouse |
find_pages_using_block | read | What references a global block, saved or in a draft: |
find_pages_using_block_type | read | Everything that uses a block type, on every surface: |
get_change_summary | read | Structured summary of a page |
get_composition_starter | read | Read one native editable starting block tree without saving. Choose a Page template, header/footer or archive. Replace sample navigation and map profile field_list fields before saving with the normal Page/template/partial tools. Existing content is never replaced by this read. |
get_email_settings | read | Read the site |
get_form_capabilities | write | List the action types a form can run after a submission (core |
get_form_embed | read | Get the HTML-mode authoring directive for a form. Paste the returned <x-form> reference into page HTML; preview and static generation replace it server-side with the complete form shell, signed token, and initial state. |
get_import_readiness | write | Check whether the organization’s own storage is connected and verified before importing content or media. Returns a Publishing settings link when setup is required. |
get_incoming_email_settings | read | Read the site |
get_media_preparation | read | Read background image preparation progress. Originals and prepared draft variants remain private. Requires site access. |
get_media_upload_status | write | Pre-flight for uploads: whether media uploads can go through for this site right now (organization storage connected, or platform storage configured), with the reason and a settings_url when they cannot. Same check as the banner in the portal media library. Requires site read access. |
get_page_blocks | read | Read the block tree of a container (page, partial, or page template). Use |
get_page_preview | read | Get the WHOLE page rendered as one self-contained HTML document — header partial + block-rendered body + footer partial, with the site |
get_site | read | Read this site\ |
get_site_capabilities | read | Discover what the site-template renderer supports for this site. Returns a manifest of feature flags (blocks-mode, x-include, content-type routes, custom block scripts, dry-run deploys, etc.) plus template_capabilities_version + the core block type ids. Call this when you |
get_workflow | write | Read one workflow run: status (pending | running | paused_for_review | completed | failed), current step, progress, log, review_message/review_data when paused, results and failure_reason. Credential config is masked. |
import_block_types | write | Install block types from a .tcblocks package (zip as base64). Needs ADMIN permission on the Site. Each definition is checked by the same validator as create_block_type; a definition with errors is reported as failed and not written. On a name conflict |
import_gsc_performance | write | Import URL metrics from Google Search Console. Use property for a direct server-side Search Console API query, or csv for the manual export fallback. URL fragments are stripped, duplicate metrics are summed, and previously unknown URLs enter the inventory as unhandled. |
import_sitemap | write | Import an explicit sitemap URL into the migration URL inventory. Sitemap indexes are followed recursively; URLs outside source_origin are rejected and reported. |
insert_block_template | write | Insert a copy of a block template into a page (new block ids), at the top level or inside parent_id (slot_index for column slots), at |
install_extension | write | Install an Extension release on this site, as the portal\ |
launch_extension_admin_page | read | Issue a single-use, short-lived launch grant for one of the Extension\ |
list_api_keys | read | List this Site\ |
list_apps | read | List every Typeroll app available to this site, including its field schema, build impact, and masked enabled/config state. For setup guidance without admin access, use read_app_documentation. Admin permission required. |
list_block_templates | read | List the site\ |
list_block_type_starters | read | Built-in starting points for a new block type: complete composed definitions (icon list, feature cards, numbered steps) with fields, composition and scoped CSS. Adapt one (rename it, change fields) and pass it to create_block_type — it is the quickest way to a valid composed type. |
list_block_types | read | Discover every block type usable on this site. Returns ALL of them in one list: core blocks (id like |
list_content_types | read | List the field schemas, URL patterns, sorting, allowed templates and default templates for Pages. All content is a Page; use list_pages with content_type to filter. |
list_deploys | write | Recent deploy jobs, newest first (capped at 50). |
list_extension_installations | read | List the site\ |
list_form_submissions | read | List submissions received for a form, newest first, cursor-paginated (cap 200 per page). Admins also see each submission\ |
list_forms | read | List every form defined on the site with its full field schema. |
list_media | read | List uploaded media items (CDN URLs, alt text, mime). Newest first, cursor-paginated. |
list_migration_urls | read | The legacy site |
list_owner_proposals | read | Site administrators: list isolated owner proposals and reviewer settings. Pending proposals are excluded from Pages, drafts and publication. Never exposes review tokens or owner identities. |
list_page_templates | read | List reusable Page templates in the selected version, including inherited templates. |
list_pages | read | List pages on the active site. Returns id, title, slug, status, and SEO summary (no html_content by default — use read_page or batch_read_pages for body content). Supports filtering by status and forward-cursor pagination. Pass full=true to include html_content + blocks in the response. |
list_partials | read | List global blocks (header, footer, free blocks). Defaults to summary mode (no html_content, just metadata + byte count) to keep agent context lean — pass include_content: true if you actually want the bodies inline, otherwise call read_partial on the one you care about. |
list_redirects | read | List redirect rules (from_path → to_path, status code). |
list_site_shares | read | List the organizations this Site is shared with, including revoked shares for audit: id, shared_with_org_id, permission (read | write | admin), label, created_at, revoked_at. Admin permission on the Site, as in the portal. |
list_styles | read | List the site\ |
list_versions | read | List versions (main + branches). |
list_workflows | write | List the workflow types this Site can run (label, description, steps, required_permission) and its most recent runs with status. Read only. Migration, site planning and URL parity pause for review; check get_workflow for paused_for_review. |
make_block_global | write | Turn a block on a page (with everything inside it) into a global block and put a reference in its place. Other pages then add the same block with add_block type |
merge_branch | write | Promote a branch\ |
move_block | write | Reparent or reorder a block inside its container. target_parent_id=null moves to top level. For slot containers, target_slot_index picks the slot. Cycles (moving a block into its own descendant) are rejected. Works for pages, partials, and templates. |
override_owner_answers | read | Explicit administrator correction of protected answers. Supply the current revision from read_owner_answers, changed fields, and the factual reason. Does not publish. Never use this tool to bypass an import or scraping conflict without explicit authorization. |
page_completeness | read | Report missing, unverified and stale fields for Pages of one content type, with per-field counts and worst-first Page IDs. Read-only; agent-writable fields only by default. |
pair_extension_issuer | read | Pair this Typeroll instance\ |
poll_domain | read | Ask Cloudflare for the current state of the attached domain and |
prepare_media | read | Queue or retry background image preparation on the organization’s selected build provider. Requires site admin permission; does not publish the site. |
prepare_publishing_domain_change | read | Prepare future website and media hosts using only the last successfully published snapshot. Saved CMS changes stay unpublished. Requires the current domain revision. Poll read_publishing_domains for certificate and DNS requirements, then explicitly approve the verified cutover. |
preview_block_type | read | Render a block type definition that need not be saved, through the same preview renderer as the portal (the Site\ |
preview_page_revision | read | Render one saved page revision as the whole preview document (header, body, footer, site CSS and block scripts), exactly what the editor\ |
read_app | read | Read one Typeroll app by registry id, including its field schema and masked state. Use list_apps to discover ids and required config fields. Secret values are never returned. For setup guidance without admin access, use read_app_documentation. Admin permission required. |
read_block_template | read | Read one block template, including its block tree. |
read_block_type | read | Full definition of one block type: the field schema, and its composition (composed types) or template (template types), styles with |
read_content_type | read | Read one Page content type. |
read_design_notes | read | Read the starter design system reference (CSS variables, header/footer skeletons, spacing scale). Only useful when the customer\ |
read_domain | read | Read the current state of the site |
read_extension_diagnostics | read | Read an installation\ |
read_extension_installation | read | Read one Extension installation, its manifest config schema, and its masked current config. Secret values are never returned. Admin permission required. |
read_form | read | Read one form by id, including fields/steps, submit_text, success_message and, for admins, its actions (email notifications and webhooks; secrets masked). Place it with a |
read_form_submission | read | Read one submission of a form by id (from list_form_submissions): the submitted values, status (partial or complete), step and timestamps. Admins also see its webhook delivery status, as in the portal. |
read_guide | read | Read Typeroll |
read_incoming_email_receipt | read | Read one incoming email receipt (status such as forwarded, held or blocked, its reason and the forwarded delivery status) by the receipt_id shown in get_incoming_email_settings. Contains no subject, sender or body. Admin permission required. |
read_media | read | Read one media item\ |
read_owner_answers | read | Site administrator: read typed owner-writable answers and their current revision. Returns safe source kinds/times, never private actor identifiers. |
read_owner_proposal | read | Read the original before/after answers and review outcome. No changes or notifications are triggered. |
read_page | read | Fetch one page in full — title, slug, status, html_content, SEO fields. Returns the DRAFT VIEW: the saved page with any unsaved draft (working copy) overlaid, plus has_unsaved_changes. |
read_page_revision | read | Read one page revision with the full saved document (title, blocks or html_content, SEO fields, fields, ...) — compare it with read_page before restoring. |
read_page_template | read | Read one reusable Page template and its block tree. |
read_partial | read | Fetch one global block including its content_mode and the active HTML or block tree. |
read_partial_revision | read | Read one partial revision with the full saved document (name, kind, html_content or blocks, status) — compare it with read_partial before restoring. |
read_playbook | read | Read the chat playbook: recipes for common customer requests (page URLs, listings, menu edits, embedding forms, etc.). Read this when a request looks like one of the common patterns — it saves you from re-deriving conventions every time. |
read_private_media_url | read | Get a 60-second read URL for a private media original. Use it for authorized image inspection; never store it in page content or generated source. Use the stable media URL or ID in content. |
read_publishing_domains | read | Read the desired and active website and media hosts, retained media aliases, DNS management mode and domain configuration revision. Saving intent does not switch traffic. |
read_publishing_readiness | read | Check required publishing connections and domains for the selected site. Returns actionable setup requirements. Editing and temporary previews remain available before publishing is configured. |
read_site_hosting_group | read | Read the selected site Hosting Group and eligible organization groups. Omitted legacy assignments resolve to Default. |
read_site_settings | read | Get the site\ |
read_skill | read | Return the full markdown of one bundled skill by name (e.g. |
read_version | read | Read one version\ |
read_working_copy | read | Read a doc\ |
recover_owner_review_notification | read | Administrator recovery after investigating an interrupted notification. Record why retry is safe. Does not send email and does not reset the three-attempt bound. |
remove_block | destructive | Remove a block and everything inside it from its container. Works for pages, partials, and templates. |
remove_domain | destructive | Detach the custom domain from this site. Removes it from Cloudflare |
replace_page | read | Full replace of a page\ |
replace_partial | write | Full replace of a global block (PUT). Pass html_content (and optionally name/status) directly — no wrapper object needed. |
reset_version | destructive | Discard EVERY change on a branch (all overrides and deletions), so it reads straight through to main again. The branch itself, its deploy address and its revision history are kept. Destructive for the branch\ |
restore_page_revision | read | Restore a page revision |
restore_partial_revision | read | Restore a partial revision |
restore_site | read | Restore an archived site so it accepts writes and publishing again, the same action as Restore in the portal. Same permission as archive_site (owner-organization admin). Idempotent: restoring an active site succeeds without change. |
retry_owner_review_notification | write | Explicitly send or retry the proposal notification. Maximum three attempts. Never retries an ambiguous in-flight delivery; an administrator must first record a recovery reason. Requires authorization to send this transactional notification. |
revoke_api_key | destructive | Revoke one of this Site\ |
revoke_owner_proposal | destructive | Revoke a pending proposal and its private review link. Accepted Page content remains unchanged. |
revoke_preview_link | destructive | Revoke one previously issued preview link. Page access stops immediately; any media read URLs already issued expire within 60 seconds. Does not affect other preview links. |
revoke_site_share | destructive | Revoke a share of this Site (admin permission on the Site). The recipient Organization and its keys lose access immediately; the record stays listed as revoked. |
save_block_template | write | Save a block template: a section starter that editors and agents insert as an independent copy. Pass |
send_test_email | write | Send a test email through the stored email connector to check it works, like |
set_email_settings | write | Connect or change the site |
set_extension_installation_status | write | Enable or disable an installed Extension on this site. Disabling removes its components from the public snapshot and editor until re-enabled; page instances are kept. Changes apply immediately to previews; deploy to publish. Admin permission required. |
set_page_mode | write | Safely switch a page\ |
set_page_template | destructive | Assign or clear a PageTemplate on a page (sets Page.template). |
set_partial_mode | write | Switch a header, footer, or free partial between HTML and native blocks through the revision-safe mode endpoint. To author a native partial deterministically: update_partial with blocks + save:true, then set_partial_mode to= |
set_publishing_domains | write | Save future website and media hosts before preparing a deployment. Requires the current revision from read_publishing_domains. This does not publish content or change traffic DNS. Choose external DNS when your agent manages Cloudflare independently. |
set_site_hosting_group | write | Select the Hosting Group for an unpublished site. Requires site admin permission and previous_group_id from read_site_hosting_group. Published sites or active builds require a hosting migration and are rejected. |
suggest_alt_text_context | read | Get everything you need to generate good alt-text for a media item: the image URL, a tuned SEO/accessibility prompt, the site\ |
tr-demo | read | Do a demo thing. |
tr-fallback | read | No name here. |
tr-x | read | |
trigger_deploy | write | 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 |
update_block | write | Update a block\ |
update_block_template | write | Rename a block template, change its description, or replace its blocks. Pages that already inserted it do not change. |
update_block_type | write | Change a site block type (core/* types are read-only). Needs ADMIN permission. schema, composition, template and styles replace wholesale when sent; other properties merge. Changing a type in use: to RENAME a field, send the new schema with |
update_content_type | write | Update a Page content type. Changes affect all its pages at the next publication; explicit per-page paths remain overrides. The default template must be allowed; removing templates used by saved Pages is rejected. |
update_form | write | Patch a form. Provide only what you want to change. Passing |
update_media | write | Patch a media item\ |
update_migration_url | write | Annotate one inventory entry. |
update_migration_urls | write | Apply one shared patch to many inventory entries in a single API request. Select either |
update_page | write | Shallow-merge update on a page, including its short breadcrumb label (only the fields you pass change). BUFFER MODEL: content fields land in the page\ |
update_page_fields | write | Edit custom fields on a page. Read its content type first. Changes stay in the working copy until saved. |
update_page_html | write | Update the full HTML body of an existing HTML-mode page. Always provide the entire new body — never a diff. Preserve unrelated content unless the user asked to change it. |
update_page_seo | write | Update SEO fields on a page. Use |
update_page_status | write | Change a page\ |
update_page_template | write | Update a reusable Page template. The change is saved immediately and affects its Pages on the next publication. A version isolates the edit from main. |
update_partial | write | Shallow-merge update on a global block. Use partial_id |
update_site | write | Edit Site-level fields: name (display), slug (drives the {slug}.typeroll-fallback subdomain — kebab-case, 3-48 chars, unique across the org), domain (the customer\ |
update_site_settings | write | Patch site settings, including responsive breakpoints for block layouts and visibility. Accepts everything the portal Settings form does. Requires admin permission on the site, as in the portal. Only the fields you pass change. |
update_site_share | write | Change the permission (read | write | admin) and/or label of an active share of this Site (admin permission on the Site). Takes effect on the recipient\ |
update_style | write | Update a style. |
upload_media_batch_from_urls | write | Upload 1–50 public images/PDFs (max 25 MiB each) in one MCP call. Uses the same integrity-safe download → signed PUT → finalize pipeline as upload_media_from_url, with four concurrent workers. Returns one result per source URL; individual failures do not abort the batch. |
upload_media_from_url | write | Fetch an image (or PDF) from any public URL and push it to the site\ |
verify_migration_urls | read | Pre-cutover parity check: actually REQUEST every observed inventory path against the new site and report what it answers. Slash-equivalent paths share one inventory row but remain separate checks through |
Trust audit
BLOCKgrade F · trust 48/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (7 observation(s))
- Network
- declared (5 observation(s))
- Shell
- declared (5 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
FIREBASE_SERVICE_ACCOUNT: '{"project_id":"smoke-bogus","client_email":"x@x","private_key":"-----BEGIN PRIVATE KEY-----\\nnot-a-real-key\\n-----END PRIVATE KEY-----\\n"}',$un = @unserialize( $value, array( 'allowed_classes' => false ) );
'Adds a lightweight cookieless beacon to your published site.',
CMD node -e "fetch('http://127.0.0.1:' + process.env.PORT + '/api/healthz').then((response) => { if (!response.ok) process.exit(1); }).catch(() => process.exit(1))"apiKey: 'typeroll_live_aaaa_bbbb',
apiKey: 'typeroll_live_aaaa_bbbb',
const SECRET = "analytics-test-secret".padEnd(48, "x");
secret: '0123456789abcdef0123456789abcdef0123456789abcdef',
const SECRET = 'a-very-long-secret-string-at-least-32-chars-x';
for (const secret of ['ghp_' + 'a'.repeat(36), '-----BEGIN PRIVATE KEY-----']) {delete_block_template, delete_block_type, delete_branch, delete_content_type, delete_email_settings, delete_form, delete_form_submission, delete_media, delete_migration_url, delete_page, delete_page_t
.env.self-host.example
runner-payload.test.ts
expect(() => new Function(script)).not.toThrow();
expect(() => new Function(script)).not.toThrow();
expect(() => new Function(script)).not.toThrow();
expect(() => new Function(shellScript!)).not.toThrow();
const forms = new Function('fetch', `${source}; return forms;`)(fetch) as (component: unknown, preview: boolean) => {const sha = createHash('sha1').update(`blob ${Buffer.byteLength(content)}\0`).update(content).digest('hex');[Publish](../../publishing/cloudflare/?version=main#builds)

[Editor](../../guides/editor/)
output: '../../temp/docs-subdirectory',
const output = path.resolve(root, '../../temp/docs-migration');
config: { beacon_token: 'public-beacon' },Gates applied: critical_finding, no_behavioural_pass.
1cc72945c40cfull audit observations/trust-audit/mcp-server/typeroll__typeroll.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | 1cc72945c40c | BLOCK | F | 48 | first audit |
Questions
What is the @typeroll/mcp-server MCP server?
Open-source Typeroll website and application platform
What tools does @typeroll/mcp-server expose?
184 in total: 93 read-only, 69 that write, and 22 that can delete or overwrite (delete_block_template, delete_block_type, delete_branch, delete_content_type, delete_email_settings). Every one is listed on this page with its risk.
Is @typeroll/mcp-server safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (48/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 22 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does @typeroll/mcp-server need?
It reads ACTIONS_ID_TOKEN_REQUEST_TOKEN, ACTIONS_ID_TOKEN_REQUEST_URL, ANTHROPIC_API_KEY, AUTH_TRUST_PROXY_HOPS, CLOUDFLARE_API_TOKEN, DEPLOY_WORKER_SKIP_AUTH, FORMS_HMAC_SECRET, GOOGLE_SEARCH_CONSOLE_CREDENTIALS, INTEGRATIONS_SECRET_KEY, MCP_OAUTH_SIGNING_KEY, MCP_SMOKE_API_KEY and PAGESPEED_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does @typeroll/mcp-server run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as typeroll-static-publication-probe at 1.0.0.
How current is this page?
The grade is for one exact copy of the source (1cc72945c40c), read on 2026-10-12. The repository is watched and re-audited when it changes.