Atlas / MCP servers / typeroll / Typeroll CMS

Typeroll CMSBLOCK

mcp/typeroll/typeroll

Open-source Typeroll website and application platform

Verdict
BLOCK
Grade
F
Trust score
48 /100
Exposed tools
184 93r · 69w · 22d
Transport
stdio · streamable-http
License
MIT
Stars
0
01

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-server for 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/       
Read from source at commit 1cc72945c40cOBSERVED · 2026-10-12
Advertisement
02

Connect

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-code
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]
claude-desktop
{
  "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}"
      }
    }
  }
}
03

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.

ToolRiskDescription
AnalyticsreadPrivacy-friendly traffic analytics and Core Web Vitals via Cloudflare Web Analytics,
IntegrationswriteAdd analytics, advertising pixels, and support widgets by pasting an ID instead of a script tag.
activate_domainreadLegacy compatibility tool; new workflows should not call it. A declared
add_blockwriteInsert 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_domainwriteAttach a custom domain to this site. The site MUST NOT already have
add_event_schemawriteAttach Event JSON-LD to a page describing an upcoming event.
add_faq_schemawriteAttach 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_urlswriteAdd 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_schemawriteAttach Recipe JSON-LD to a recipe page. Required: name, recipeIngredient[], recipeInstructions[].
approve_publishing_domain_cutoverreadApprove 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_workflowwriteApprove 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_pagesreadRead 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_pageswriteApply 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_linkswriteCheck 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_migrationreadVerify 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_indexingreadProbe the site\
clone_pagereadDuplicate 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_copywriteSAVE a doc\
configure_owner_reviewreadSite 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_typewriteCreate a block type for this Site when no core block (or block template) fits a recurring shape. Origin is stamped
create_branchwriteCreate a copy-on-write branch from main (or the version passed in
create_content_typewriteCreate 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_formwriteCreate a form. Steps are the ONLY stored model — a Block[] tree of form/* field blocks per step. Simple forms: pass
create_free_blockwriteCreate a new global block: one shared source that every page using it shows, so an edit updates them all. Pass
create_pagewriteCreate a new page. Defaults to blocks mode (same as the portal UI\
create_page_templatewriteCreate 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_redirectwriteCreate a redirect rule. Defaults to 301; pass status_code=302 for a temporary redirect.
create_sitewriteCreate + 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_stylewriteCreate 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_urlwriteMint 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_proposalreadExplicit 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_templatedestructiveDelete a block template. Pages that already inserted it keep their copies.
delete_block_typedestructiveRemove 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_branchdestructiveDiscard a branch with its overrides, tombstones and revision history (main cannot be deleted). Admin permission required.
delete_content_typedestructiveDelete an unused content type. Reassign or delete its pages first; the standard Page type cannot be deleted.
delete_email_settingsdestructiveDisconnect the site
delete_formdestructiveDelete a form. Existing submissions are preserved by default — pass delete_submissions: true to also drop them.
delete_form_submissiondestructiveDelete a single submission from a form\
delete_mediadestructiveDelete a media item\
delete_migration_urldestructiveRemove 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_pagedestructiveDelete a page (tombstoned on branches, removed on main).
delete_page_templatedestructiveDelete an unused Page template. Reassign any Pages or content types using it first.
delete_partialdestructiveDelete a free global block. header and footer cannot be deleted (they are layout blocks).
delete_redirectdestructiveRemove a redirect rule.
delete_styledestructiveDelete a style. Blocks that still reference it fall back to their default look; reassign them first.
detach_global_blockreadReplace a core/global_block reference on a page with an editable copy of the global block\
discard_changesreadDiscard 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_copyreadThrow away a doc\
duplicate_blockwriteClone a block (subtree included) and insert the copy directly after the original within the same container. Returns the duplicate\
export_block_typesreadPack site block types into a .tcblocks zip (base64). When
finalize_all_mediareadBackfill 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_blockreadWhat references a global block, saved or in a draft:
find_pages_using_block_typereadEverything that uses a block type, on every surface:
get_change_summaryreadStructured summary of a page
get_composition_starterreadRead 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_settingsreadRead the site
get_form_capabilitieswriteList the action types a form can run after a submission (core
get_form_embedreadGet 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_readinesswriteCheck 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_settingsreadRead the site
get_media_preparationreadRead background image preparation progress. Originals and prepared draft variants remain private. Requires site access.
get_media_upload_statuswritePre-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_blocksreadRead the block tree of a container (page, partial, or page template). Use
get_page_previewreadGet the WHOLE page rendered as one self-contained HTML document — header partial + block-rendered body + footer partial, with the site
get_sitereadRead this site\
get_site_capabilitiesreadDiscover 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_workflowwriteRead 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_typeswriteInstall 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_performancewriteImport 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_sitemapwriteImport an explicit sitemap URL into the migration URL inventory. Sitemap indexes are followed recursively; URLs outside source_origin are rejected and reported.
insert_block_templatewriteInsert 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_extensionwriteInstall an Extension release on this site, as the portal\
launch_extension_admin_pagereadIssue a single-use, short-lived launch grant for one of the Extension\
list_api_keysreadList this Site\
list_appsreadList 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_templatesreadList the site\
list_block_type_startersreadBuilt-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_typesreadDiscover every block type usable on this site. Returns ALL of them in one list: core blocks (id like
list_content_typesreadList 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_deployswriteRecent deploy jobs, newest first (capped at 50).
list_extension_installationsreadList the site\
list_form_submissionsreadList submissions received for a form, newest first, cursor-paginated (cap 200 per page). Admins also see each submission\
list_formsreadList every form defined on the site with its full field schema.
list_mediareadList uploaded media items (CDN URLs, alt text, mime). Newest first, cursor-paginated.
list_migration_urlsreadThe legacy site
list_owner_proposalsreadSite 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_templatesreadList reusable Page templates in the selected version, including inherited templates.
list_pagesreadList 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_partialsreadList 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_redirectsreadList redirect rules (from_path → to_path, status code).
list_site_sharesreadList 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_stylesreadList the site\
list_versionsreadList versions (main + branches).
list_workflowswriteList 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_globalwriteTurn 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_branchwritePromote a branch\
move_blockwriteReparent 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_answersreadExplicit 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_completenessreadReport 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_issuerreadPair this Typeroll instance\
poll_domainreadAsk Cloudflare for the current state of the attached domain and
prepare_mediareadQueue or retry background image preparation on the organization’s selected build provider. Requires site admin permission; does not publish the site.
prepare_publishing_domain_changereadPrepare 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_typereadRender a block type definition that need not be saved, through the same preview renderer as the portal (the Site\
preview_page_revisionreadRender one saved page revision as the whole preview document (header, body, footer, site CSS and block scripts), exactly what the editor\
read_appreadRead 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_templatereadRead one block template, including its block tree.
read_block_typereadFull definition of one block type: the field schema, and its composition (composed types) or template (template types), styles with
read_content_typereadRead one Page content type.
read_design_notesreadRead the starter design system reference (CSS variables, header/footer skeletons, spacing scale). Only useful when the customer\
read_domainreadRead the current state of the site
read_extension_diagnosticsreadRead an installation\
read_extension_installationreadRead one Extension installation, its manifest config schema, and its masked current config. Secret values are never returned. Admin permission required.
read_formreadRead 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_submissionreadRead 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_guidereadRead Typeroll
read_incoming_email_receiptreadRead 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_mediareadRead one media item\
read_owner_answersreadSite administrator: read typed owner-writable answers and their current revision. Returns safe source kinds/times, never private actor identifiers.
read_owner_proposalreadRead the original before/after answers and review outcome. No changes or notifications are triggered.
read_pagereadFetch 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_revisionreadRead 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_templatereadRead one reusable Page template and its block tree.
read_partialreadFetch one global block including its content_mode and the active HTML or block tree.
read_partial_revisionreadRead one partial revision with the full saved document (name, kind, html_content or blocks, status) — compare it with read_partial before restoring.
read_playbookreadRead 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_urlreadGet 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_domainsreadRead 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_readinessreadCheck 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_groupreadRead the selected site Hosting Group and eligible organization groups. Omitted legacy assignments resolve to Default.
read_site_settingsreadGet the site\
read_skillreadReturn the full markdown of one bundled skill by name (e.g.
read_versionreadRead one version\
read_working_copyreadRead a doc\
recover_owner_review_notificationreadAdministrator recovery after investigating an interrupted notification. Record why retry is safe. Does not send email and does not reset the three-attempt bound.
remove_blockdestructiveRemove a block and everything inside it from its container. Works for pages, partials, and templates.
remove_domaindestructiveDetach the custom domain from this site. Removes it from Cloudflare
replace_pagereadFull replace of a page\
replace_partialwriteFull replace of a global block (PUT). Pass html_content (and optionally name/status) directly — no wrapper object needed.
reset_versiondestructiveDiscard 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_revisionreadRestore a page revision
restore_partial_revisionreadRestore a partial revision
restore_sitereadRestore 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_notificationwriteExplicitly 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_keydestructiveRevoke one of this Site\
revoke_owner_proposaldestructiveRevoke a pending proposal and its private review link. Accepted Page content remains unchanged.
revoke_preview_linkdestructiveRevoke 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_sharedestructiveRevoke 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_templatewriteSave a block template: a section starter that editors and agents insert as an independent copy. Pass
send_test_emailwriteSend a test email through the stored email connector to check it works, like
set_email_settingswriteConnect or change the site
set_extension_installation_statuswriteEnable 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_modewriteSafely switch a page\
set_page_templatedestructiveAssign or clear a PageTemplate on a page (sets Page.template).
set_partial_modewriteSwitch 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_domainswriteSave 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_groupwriteSelect 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_contextreadGet everything you need to generate good alt-text for a media item: the image URL, a tuned SEO/accessibility prompt, the site\
tr-demoreadDo a demo thing.
tr-fallbackreadNo name here.
tr-xread
trigger_deploywriteEnqueue 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_blockwriteUpdate a block\
update_block_templatewriteRename a block template, change its description, or replace its blocks. Pages that already inserted it do not change.
update_block_typewriteChange 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_typewriteUpdate 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_formwritePatch a form. Provide only what you want to change. Passing
update_mediawritePatch a media item\
update_migration_urlwriteAnnotate one inventory entry.
update_migration_urlswriteApply one shared patch to many inventory entries in a single API request. Select either
update_pagewriteShallow-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_fieldswriteEdit custom fields on a page. Read its content type first. Changes stay in the working copy until saved.
update_page_htmlwriteUpdate 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_seowriteUpdate SEO fields on a page. Use
update_page_statuswriteChange a page\
update_page_templatewriteUpdate 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_partialwriteShallow-merge update on a global block. Use partial_id
update_sitewriteEdit 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_settingswritePatch 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_sharewriteChange 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_stylewriteUpdate a style.
upload_media_batch_from_urlswriteUpload 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_urlwriteFetch an image (or PDF) from any public URL and push it to the site\
verify_migration_urlsreadPre-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
04

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.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (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)

CRITICALHard-coded secrets · secret.private_key · CWE-798, CWE-321
packages/site-template/scripts/smoke-build.mjs:103
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"}',
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
wp-helper-plugin/includes/class-content.php:265
$un = @unserialize( $value, array( 'allowed_classes' => false ) );
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
packages/portal/src/lib/apps/analytics.ts:23
'Adds a lightweight cookieless beacon to your published site.',
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Dockerfile:84
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))"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/mcp-server/tests/client.test.ts:34
apiKey: 'typeroll_live_aaaa_bbbb',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/mcp-server/tests/tools.test.ts:43
apiKey: 'typeroll_live_aaaa_bbbb',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/portal/src/__tests__/lib/analytics-events.test.ts:8
const SECRET = "analytics-test-secret".padEnd(48, "x");
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/portal/src/__tests__/lib/api-keys.test.ts:25
secret: '0123456789abcdef0123456789abcdef0123456789abcdef',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/portal/src/__tests__/lib/api-v1-preview.test.ts:12
const SECRET = 'a-very-long-secret-string-at-least-32-chars-x';
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
scripts/static-publication.test.mjs:39
for (const secret of ['ghp_' + 'a'.repeat(36), '-----BEGIN PRIVATE KEY-----']) {
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
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
Why it matters. 22 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.env.self-host.example
.env.self-host.example
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.suspicious_name · CWE-1104
packages/portal/src/__tests__/lib/runner-payload.test.ts
runner-payload.test.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/portal/src/__tests__/lib/editor-canvas-bridge.test.ts:22
expect(() => new Function(script)).not.toThrow();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/portal/src/__tests__/lib/editor-canvas-bridge.test.ts:34
expect(() => new Function(script)).not.toThrow();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/portal/src/__tests__/lib/editor-canvas-bridge.test.ts:74
expect(() => new Function(script)).not.toThrow();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/portal/src/__tests__/lib/preview-sandbox.test.ts:116
expect(() => new Function(shellScript!)).not.toThrow();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/shared/src/__tests__/extensions.test.ts:371
const forms = new Function('fetch', `${source}; return forms;`)(fetch) as (component: unknown, preview: boolean) => {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/portal/src/lib/publishing/providers.mjs:190
const sha = createHash('sha1').update(`blob ${Buffer.byteLength(content)}\0`).update(content).digest('hex');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/docs-site/scripts/agent-docs.test.mjs:15
[Publish](../../publishing/cloudflare/?version=main#builds)
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/docs-site/scripts/agent-docs.test.mjs:16
![Screen](../../images/editor.png)
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/docs-site/scripts/agent-docs.test.mjs:34
[Editor](../../guides/editor/)
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/docs-site/scripts/docs-target.mjs:10
output: '../../temp/docs-subdirectory',
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/docs-site/scripts/prepare-migration.mjs:13
const output = path.resolve(root, '../../temp/docs-migration');
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
packages/mcp-server/tests/apps.test.ts:22
config: { beacon_token: 'public-beacon' },

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 1cc72945c40cfull audit observations/trust-audit/mcp-server/typeroll__typeroll.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-121cc72945c40cBLOCKF48first audit
06

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.

Advertisement