npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@actuate-media/mcp-server

v0.16.2

Published

Model Context Protocol (MCP) server for Actuate CMS — gives AI agents read/write access to your CMS over stdio

Downloads

2,897

Readme

@actuate-media/mcp-server

A Model Context Protocol server that lets AI agents (Claude, Cursor, ChatGPT, etc.) read and write content in your Actuate CMS.

Install & connect

You don't need to install this globally — your MCP client will run it via npx.

Cursor / Claude Desktop:

{
  "mcpServers": {
    "actuate": {
      "command": "npx",
      "args": ["-y", "@actuate-media/mcp-server"],
      "env": {
        "ACTUATE_BASE_URL": "https://your-site.com",
        "ACTUATE_API_KEY": "act_sk_..."
      }
    }
  }
}

Generate an ACTUATE_API_KEY from your CMS admin under API Keys → New API Key. Grant it the scopes the agent needs (e.g. content + media + pageBuilder).

Tools exposed

| Tool | What it does | | ------------------------------ | ---------------------------------------------------- | | list_collections | Discover available collections and their fields | | list_documents | Paginated list of documents in a collection | | get_document | Fetch a document by ID | | create_document | Create a new document with explicit fields (DRAFT) | | update_document | Patch an existing document | | delete_document | Soft-delete a document | | get_global / update_global | Read/update globals (site settings, etc.) | | list_media | Browse the media library | | generate_page | AI page-builder: prompt → page tree (no persistence) | | create_page_from_prompt | One-shot: prompt → tree → persisted page document | | generate_block | AI generate a single page-builder block | | resolve_url | Map a public URL path to its CMS document |

AI content authoring (any non-page collection)

The agent can also author structured content for blog posts, case studies, services, locations, team profiles, FAQs, testimonials — any collection that isn't a page builder. Each tool maps a free-form prompt onto the collection's field schema and persists the result.

| Tool | Default collection | Notes | | ---------------------- | ------------------ | --------------------------------------------------------------------------------------------------- | | create_in_collection | (required arg) | Generic. Pass template: service \| location \| team_member for built-in prompt-enrichment recipes | | create_blog_post | posts | Blog post sugar | | create_case_study | case-studies | Plus clientName / industry hints |

All authoring tools share the same base inputs (prompt, tone, targetAudience, context, title, slug, publish) and accept a collection override when your site uses non-conventional slugs.

The standalone create_service / create_location / create_team_member tools were collapsed into create_in_collection. Use create_in_collection({ template: "service" | "location" | "team_member", ... }) instead.

Building pages section-by-section

Pages are authored as an ordered list of sections (the same model the visual Page Editor reads/writes), so an agent can build a real, previewable, editable page rather than disposable HTML.

| Tool | What it does | | ----------------------------------------------- | ------------------------------------------------------- | | list_section_types / get_section_schema | Discover registered section types + their field schema | | validate_section_content | Validate content against a type schema (no persistence) | | list_page_sections | List a page's ordered sections | | add_page_section / update_page_section | Add or patch a single section in place | | reorder_page_sections / remove_page_section | Reorder / remove a section | | toggle_page_section_visibility | Show or hide a section without deleting it |

Resolving relationships

Relationship fields store a target document ID, but prompts speak in slugs ("set the author to jane-doe"). These tools let an agent resolve them instead of guessing IDs.

| Tool | What it does | | --------------------------- | ----------------------------------------------------------------------------------- | | get_relationship_fields | List a collection's relationship/media/select fields + each field's relationTo | | resolve_relationship | Resolve an exact slug → { id, slug, title, status } within a collection | | list_relationship_targets | Browse candidate documents ({ id, slug, title, status }) when the slug is unknown |

Typical flow: get_relationship_fields(collection) → find the field's relationToresolve_relationship(relationTo, slug)update_document with the returned ID.

Navigation menus

Menus live in the navigations collection (link tree on data.items). These tools wrap the document API with tree-aware conveniences so an agent builds a real, editable menu — and can wire a published page into one without hand-deriving its URL.

| Tool | What it does | | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | | list_navigations / get_navigation | List menus ({ id, name, slug, location, itemCount }) or read one + its tree | | create_navigation / update_navigation / delete_navigation | Create, edit metadata / replace tree, or soft-delete a menu | | add_navigation_item | Add a link — explicit { label, url } or a page ref ("link page X into menu Y"); optional parentId nests it | | remove_navigation_item / reorder_navigation_items | Remove one item (+ sub-tree), or reorder one level by id permutation | | validate_navigation_tree | Validate a menu or candidate items (no save): { valid, errors, warnings, stats } |

Forms

The agent can author forms and manage the submissions inbox end-to-end (write-role API key required).

| Tool | What it does | | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | list_forms / get_form | Discover form definitions and read one | | create_form / update_form / delete_form | Create, edit metadata, or delete a form | | duplicate_form | Copy a form into a new draft | | get_form_schema / save_form_schema | Read or replace the (versioned) field schema | | list_form_submissions / list_form_entries / get_form_entry | Read submissions (PII-sensitive; explicit formId required) | | set_form_entry_status / bulk_set_form_entry_status / delete_form_entry | Manage inbox state (read/star/archive) and delete entries | | export_form_entries | Export all submissions as CSV (bulk PII egress; requires confirm: true) |

Scoping

The agent inherits whatever scopes you grant to its API key. Use the Content preset to allow read/create/update across all collections without admin powers. Use Custom to lock down to specific collections.

Direct (non-MCP) use

You can also import the underlying ActuateClient programmatically:

import { ActuateClient } from '@actuate-media/mcp-server'

const cms = new ActuateClient({
  baseUrl: 'https://your-site.com',
  apiKey: process.env.ACTUATE_API_KEY!,
})

const page = await cms.createPageFromPrompt({
  prompt: 'A landing page for a New York City house cleaning service',
  publish: false,
})