Content Read-Only MCP Server

The platform/content-readonly server provides read-only access to Salesforce CMS through MCP, so agents can search for, access, and read enhanced CMS content, folders, workspaces, and channels.

Use this server to:

  • Summarize an existing CMS content item
  • Help an author find existing content before they make changes elsewhere
  • Find translated versions of a content item
  • Answer questions about what CMS content is published where
  • Get details about an enhanced CMS workspace or channel

When agents need to create or modify Salesforce CMS content, workspaces, folders, or channels, see the Content Write MCP Server.

Prerequisites 

  • API version: v67.0 and later
  • External Client App configured with the mcp_api scope
  • MCP client installed and configured with OAuth authentication

To use this MCP server, make sure that Digital Experiences is enabled in your org. Users must have access to Salesforce CMS in the org to be able to access CMS through the server. For example, to get details about a CMS workspace or content from a CMS workspace via the MCP server, the user must be a contributor for that workspace. See Contributors and Roles in Salesforce Help for more information.

For setup instructions, see Set Up Your Org.

Server URL 

Use these server URLs to access the production and sandbox versions of the content-readonly server.

  • Production: https://api.salesforce.com/platform/mcp/v1/platform/content-readonly
  • Sandbox/Scratch: https://api.salesforce.com/platform/mcp/v1/sandbox/platform/content-readonly

Activate the Server 

  1. From Setup, in the Quick Find box, enter MCP Servers, and then select MCP Servers.
  2. Find content-readonly in the list of servers.
  3. Click Activate.

Example Prompts 

  • “What CMS workspaces do I have access to?”
  • “Find all news articles mentioning ‘open enrollment’ in the Benefits workspace.”
  • “Show me the French version of this content item.”
  • “What content is currently published on our public website channel?”
  • “Get the sharing settings for the Marketing Assets folder.”

Available Tools 

The content-readonly server provides the following tools.

get_cms_workspace 

Gets the details of a single CMS workspace given its ID, including the workspace name, type, and default language.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/spaces/{contentSpaceId}.

Inputs:

ParameterTypeRequiredDescription
contentSpaceIdstringYesThe ID of the CMS workspace

Outputs: An array of details about the CMS workspace including its name, type, and default language.

get_cms_workspaces 

Lists all enhanced CMS workspaces in the org that the current user can access. Returns each workspace’s ID, name, and type.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/spaces/.

Inputs:

ParameterTypeRequiredDescription
nameFragmentstringNoThe name fragment to filter spaces that contain the value in the workspace name.
spaceTypestringNoType of CMS workspace to filter by. Enum: App_Dev, Content, Enablement, Experience, ExperienceContainer, Fragment_Space, Gen_AI, Library, Marketing, SalesEngagement, Web_App.
pageintegerNoNumber of the page you want returned. Starts at 0. If you don’t specify a value or if you specify 0, the first page is returned.
pageSizeintegerNoSpecifies the number of items per page. Valid values are 1–250. If you don’t specify a value, the default size is 25.
businessUnitIdstringNoThe ID of the Marketing business unit by which to filter workspaces
businessUnitStatusstringNoThe status of the Marketing business unit by which to filter workspaces
hasBusinessUnitbooleanNoFilters workspaces by whether they’re associated with a business unit (true) or not (false)

Outputs: An array of enhanced CMS workspaces with ID, name, and type.

get_cms_channels_for_workspace 

Lists all the channels that are associated with a specific CMS workspace for the given workspace ID.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/spaces/{contentSpaceId/channels}.

Inputs:

ParameterTypeRequiredDescription
contentSpaceIdstringYesThe ID of the CMS workspace
pageintegerNoNumber of the page you want returned. Starts at 0. If you don’t specify a value or if you specify 0, the first page is returned.
pageSizeintegerNoSpecifies the number of items per page. Valid values are from 1-250. If you don’t specify a value, the default size is 25.

Outputs: An array of channels associated with the CMS workspace, each with ID, name, and type.

search_content_cms_workspaces 

Searches for CMS content in enhanced CMS workspaces and folders by keyword, optionally filtered by workspace, folder, content type, or language.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/items/search.

Inputs:

ParameterTypeRequiredDescription
queryTermstringYesA list of up to 50 search terms, separated by space
contentSpaceOrFolderIdsarray of stringsYesThe ID of the CMS workspace or folder in which to search for content
contentTypeFQNstringNoThe fully qualified name of the content type used to restrict the search
languagesarray of stringsNoA list of up to 10 languages or All to search for all languages. Specify each language as a language only, such as en, or as a language and locale, such as en_US. The search returns only exact matches and only languages that the workspace supports. If unspecified, the workspace’s default language is used.
pageintegerNoNumber of the page you want returned. Starts at 0. If you don’t specify a value or if you specify 0, the first page is returned.
pageSizeintegerNoSpecifies the number of items per page. Valid values are from 1-250. If you don’t specify a value, the default size is 25.
scopestringNoThe text search scope for items. Possible values include “All” or “TitleOnly.” If unspecified, defaults to All. If you specify a folder ID, you can’t restrict the search scope.

Outputs: A paginated list of CMS keyword-based search result items.

get_cms_content_item 

Gets a single CMS content item by its content key or ID, and returns the content item and any translated variants.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/contents/{contentKeyOrId}.

Inputs:

ParameterTypeRequiredDescription
contentKeyOrIdstringYesThe content key or ID of the CMS content item
contentVersionstringNoThe content version of the CMS content item
languagestringNoThe language locale of the managed content, for example, en_US. If you don’t specify version or if you specify a version corresponding to the latest version, the document is returned in the fallback language, if available, or in the primary language of the workspace. If you specify a version that isn’t the latest version and isn’t available for the language, an error is returned. If you don’t specify a language, the document is returned in the primary language of the workspace.
variantVersionstringNoThe variant version of the content item

Outputs: The CMS content item and its variants.

get_cms_content_variant 

Gets a single CMS content variant by its variant ID. A variant is one language rendition of a content item, for example, a French version, and it contains the content item’s body and field values in that language.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/contents/variants/{variantId}.

Inputs:

ParameterTypeRequiredDescription
variantIdstringYesThe ID of the CMS content variant

Outputs: The content variant, including its language, body, and field values.

get_cms_folder 

Gets the details of a single CMS folder from an enhanced CMS workspace by the folder ID. Returns the folder name, creation date, permissions, and parent folder, if applicable.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/folders/{folderId}.

Inputs:

ParameterTypeRequiredDescription
folderIdstringYesThe ID of the CMS folder
contextContentSpaceIdstringNoThe ID of the context workspace. Specify to get folder hierarchy information starting from the root of the context workspace.

Outputs: The folder name, creation date, permissions, and parent folder.

get_cms_folder_sharing_details 

Gets the sharing and permission settings for a CMS folder, including which users, groups, or roles have access and their permission levels.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/folders/{folderId}/shares.

Inputs:

ParameterTypeRequiredDescription
folderIdstringYesID of the CMS folder

Outputs: The sharing and permission settings for the folder, by user, group, or role.

get_cms_channels 

Lists all CMS channels in the org that the current user can access. Returns each channel’s ID, name, and type.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/channels.

Inputs:

ParameterTypeRequiredDescription
pageintegerNoNumber of the page you want returned. Starts at 0. If you don’t specify a value or if you specify 0, the first page is returned.
pageSizeintegerNoSpecifies the number of items per page. Valid values are from 1 through 250. If you don’t specify a value, the default size is 25.
showDetailsbooleanNoSpecifies whether to show the channels’ detailed information (true) or summary information only (false). If you don’t specify a value, the default is false.

Outputs: An array of CMS channels with ID, name, and type.

get_cms_channel 

Gets the details of a CMS channel by its ID, including the channel name and type. This tool returns the channel’s authoring and configuration record.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/channels/{channelId}.

Inputs:

ParameterTypeRequiredDescription
channelIdstringYesThe ID of the CMS channel

Outputs: The CMS channel name, type, and authoring configuration details.

get_cms_channel_delivery_detail 

Gets the delivery details of a CMS channel by its ID. This tool describes the channel as content consumers see it at run time.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/delivery/channels/{channelId}.

Inputs:

ParameterTypeRequiredDescription
channelIdstringYesID of the CMS channel

Outputs: The delivery-side details of the channel.

search_content_cms_channels 

Searches for and retrieves published, non-media content in Salesforce CMS by using keywords or taxonomy terms. This tool retrieves only non-media content such as news (sfdc_cms__news), from public CMS channels that are accessible to the current user.

Inputs:

ParameterTypeRequiredDescription
searchKeywordstringNoA list of up to 10 OR-separated concrete nouns extracted from the user’s natural language query.
searchLanguagestringNoThe locale of the content to search for, by using underscore format (for example, en_US, es_MX, fr_FR). Default is en_US.
channelIdsstringNoA list of one or more IDs of CMS channels where the search happens.
channelTypestringNoThe type of channel where the search happens. This parameter limits the action to search for published content only within channels of the specified type.
contentAccessScopestringNoThis parameter limits the search to channels with the specified content access scope. The only supported value is Public, which restricts the search to publicly accessible channels.
taxonomyExpressionstringNoA stringified JSON expression derived from the user’s natural language query that filters content by descriptive qualities, styles, moods, or categories (for example, {"OR": ["term1", "term2"]}). Use {} if no taxonomies apply.
contentTypeFqnstringNoA list of one or more non-media content type fully qualified names (FQN).
pageOffsetintegerNoA page of results when the search returns multiple content items.
searchLimitintegerNoThe maximum number of content items shown on a single page when the search returns multiple content items.

Outputs: An array of published, non-media content items from public CMS channels that match the search query.

search_media_cms_channels 

Searches for and retrieves published media assets in Salesforce CMS by using keywords or taxonomy terms. This tool retrieves only published media content, such as images (sfdc_cms__image), videos (sfdc_cms__video), documents (sfdc_cms__document), and audio (sfdc_cms__audio), from public CMS channels that are accessible to the current user.

Inputs:

ParameterTypeRequiredDescription
searchKeywordstringNoA list of up to 10 OR-separated concrete nouns extracted from the user’s natural language query. Use domain-specific synonyms, leave empty if the query contains no concrete nouns.
searchLanguagestringNoThe locale of the content to search for, by using underscore format (for example, en_US, es_MX, fr_FR). Default is en_US.
channelIdsstringNoA list of one or more IDs of CMS channels where the search happens.
channelTypestringNoThe type of channel where the search happens. This parameter limits the action to search for published content only within channels of the specified type.
contentAccessScopestringNoThis parameter limits the search to channels with the specified content access scope. The only supported value is Public, which restricts the search to publicly accessible channels.
taxonomyExpressionstringNoA stringified JSON expression derived from the user’s natural language query that filters content by descriptive qualities, styles, moods, or categories (for example, {"OR": ["term1", "term2"]}). Use {} if no taxonomies apply.
contentTypeFqnstringNoA list of one or more content type fully qualified names (FQN).
pageOffsetintegerNoA page of results when the search returns multiple content items.
searchLimitintegerNoThe maximum number of content items shown on a single page when the search returns multiple content items.

Outputs: An array of published media assets from public CMS channels that match the search query.

get_published_cms_content_from_channel 

Lists the CMS content published to a specific CMS channel. Filter the results by content type, language, publish date, and show paginated results. Use this tool to read live, published CMS content from a channel.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/delivery/channels/{channelId}/contents.

Inputs:

ParameterTypeRequiredDescription
channelIdstringYesID of the CMS channel
contentKeysarray of stringsNoComma-separated list of up to 50 content keys. Specify either managed content IDs or content keys.
contentTypeFQNstringNoFully qualified name of the managed content type.
expandReferencesbooleanNoSpecifies whether to include details of references (true) or summaries of references (false) in the response body. If unspecified, the default value is false.
includeContentBodybooleanNoSpecifies whether to return the content body (true) or the content summary (false). If unspecified, the default value is false.
languagestringNoLanguage locale for the managed content, for example, en_US. If the requested translation isn’t available, the language defaults to the configured fallback language or the channel’s default language. If the content isn’t available in the fallback language and the channel’s default language, we return an error.
managedContentIdsarray of stringsNoComma-separated list of up to 100 managed content IDs. Specify either managed content IDs or content keys.
pageintegerNoNumber of the page you want returned. Starts at 0. If you don’t specify a value or if you specify 0, the first page is returned.
pageSizeintegerNoSpecifies the number of items per page. Valid values are from 1 through 250. If unspecified, the default size is 25. If you specify true for expandReferences or includeContentBody, the maximum page size you can specify is 25.
publishEndDatestringNoISO 8601 formatted publish end date.
publishStartDatestringNoISO 8601 formatted publish start date.
referenceDepthintegerNoAn integer 0–3 specifying the depth of references. If you specify 0, the references property of the Managed Content Delivery Document Collection response body is null. If unspecified, the default value is 0.
referencesAsListbooleanNoSpecifies whether to return the references as a list in the referencesList property of the Managed Content Delivery Document Collection response body (true). If you specify false, the references are returned as key-value pairs in the references property. If unspecified, the default value is false.
showAbsoluteUrlbooleanNoSpecifies whether to show absolute URLs in the response body (true) or not (false). If you don’t specify a value, the default is false.

Outputs: A paginated array of published content variants for the CMS channel.

get_published_cms_content_from_site 

Lists all the CMS content published to a specific Experience Cloud site. Filter the results by content type, language, publication date, and show paginated results. Use this tool to read live, published CMS content on a site.

Inputs and outputs mirror the Connect REST API at GET /connect/sites/{siteId}/cms/delivery/contents.

Inputs:

ParameterTypeRequiredDescription
siteIdstringYesID of the Experience Cloud site
contentKeysarray of stringsNoComma-separated list of up to 50 content keys. Specify either managed content IDs or content keys.
contentTypeFQNstringNoFully qualified name of the managed content type.
expandReferencesbooleanNoSpecifies whether to include details of references (true) or summaries of references (false) in the response body. If unspecified, the default value is false.
includeContentBodybooleanNoSpecifies whether to return the content body (true) or the content summary (false). If unspecified, the default value is false.
languagestringNoLanguage locale for the managed content, for example, en_US. If the requested translation isn’t available, the language defaults to the configured fallback language or the site’s default language. If the content isn’t available in the fallback language and the site’s default language, we return an error.
managedContentIdsarray of stringsNoComma-separated list of up to 100 managed content IDs. Specify either managed content IDs or content keys.
pageintegerNoNumber of the page you want returned. Starts at 0. If you don’t specify a value or if you specify 0, the first page is returned.
pageSizeintegerNoSpecifies the number of items per page. Valid values are from 1 through 250. If unspecified, the default size is 25. If you specify true for expandReferences or includeContentBody, the maximum page size you can specify is 25.
publishEndDatestringNoISO 8601 formatted publish end date.
publishStartDatestringNoISO 8601 formatted publish start date.
referenceDepthintegerNoAn integer 0–3 specifying the depth of references. If you specify 0, the references property of the Managed Content Delivery Document Collection response body is null. If unspecified, the default value is 0.
referencesAsListbooleanNoSpecifies whether to return the references as a list in the referencesList property of the Managed Content Delivery Document Collection response body (true). If you specify false, the references are returned as key-value pairs in the references property. If unspecified, the default value is false.
showAbsoluteUrlbooleanNoSpecifies whether to show absolute URLs in the response body (true) or not (false). If you don’t specify a value, the default is false.

Outputs: A paginated array of published content variants for the site.

get_published_cms_content_item_from_site 

Gets a single item of published CMS content from an Experience Cloud site given the content key or ID. This tool returns the published variant as content consumers see it at run time.

Inputs and outputs mirror the Connect REST API at GET /connect/sites/{siteId}/cms/delivery/contents/{contentKeyOrId}.

Inputs:

ParameterTypeRequiredDescription
siteIdstringYesID of the Experience Cloud site
contentKeyOrIdstringYesContent key or ID of the content item

Outputs: The published content variant.

get_published_cms_collection_from_site 

Gets a published CMS collection from an Experience Cloud site given the collection key or ID. This tool also lists all content items contained in the collection.

Inputs and outputs mirror the Connect REST API at GET /connect/sites/siteId/cms/delivery/collections/{collectionKeyOrId}.

Inputs:

ParameterTypeRequiredDescription
siteIdstringYesID of the Experience Cloud site
collectionKeyOrIdstringYesCollection key or ID. A collection key is a unique identifier such as MCA4CCV5QS2BAB5H7YRCRPTCWGZQ.

Outputs: The collection and the published content items it contains.

get_published_cms_content_item_from_channel 

Gets a single item of published CMS content from a CMS channel given the content key or ID. Returns the published variant as content consumers see it at run time.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/delivery/channels/{channelId}/contents/{contentKeyOrId}.

Inputs:

ParameterTypeRequiredDescription
channelIdstringYesThe ID of the CMS channel
contentKeyOrIdstringYesThe content key or ID of the content item
contentVersionintegerNoThe content version of the CMS content item
expandReferencesbooleanNoSpecifies whether to include details of references (true) or summaries of references (false) in the response body. If unspecified, the default value is false.
languagestringNoThe language locale for the managed content, for example, en_US. If the requested translation isn’t available, the language defaults to the configured fallback language or the channel’s default language.
referenceDepthintegerNoAn integer 0–3 specifying the depth of references. If you specify 0, the references property of the response body is null. If unspecified, the default value is 0.
referencesAsListbooleanNoSpecifies whether to return the references as a list in the referencesList property of the response body (true), or as key-value pairs in the references property (false). If unspecified, the default value is false.
showAbsoluteUrlbooleanNoSpecifies whether to show absolute URLs in the response body (true) or not (false). If you don’t specify a value, the default is false.

Outputs: The published content variant.

get_published_cms_collection_from_channel 

Gets a published CMS collection from a CMS channel given the collection key or ID. This tool also lists all content items contained in the collection.

Inputs and outputs mirror the Connect REST API at GET /connect/cms/delivery/channels/{channelId}/collections/{collectionKeyOrId}.

Inputs:

ParameterTypeRequiredDescription
channelIdstringYesThe ID of the CMS channel
collectionKeyOrIdstringYesThe collection key or ID. A collection key is a unique identifier such as MCA4CCV5QS2BAB5H7YRCRPTCWGZQ.
languagestringNoThe language locale for the managed content collection, for example, en_US.
pageSizeintegerNoThe number of items to fetch per page. The default is 50.
pageTokenintegerNoThe page of items to fetch.

Outputs: The collection and the published content items it contains.

search_electronic_media 

Searches for and retrieves media assets, such as image files, across Salesforce CMS and any connected third-party CMS or digital asset management (DAM) systems. This tool uses Data 360 hybrid search (vector search and keyword search) to find media.

Inputs:

ParameterTypeRequiredDescription
searchQuerystringYesThe natural language query that the user provides. The action uses this query to retrieve relevant digital content or electronic media.
channelTypestringYesThis parameter limits the search to content or media published to channels of the specified channel type. The only supported channel type is PublicUnauthenticated. This channel type searches content across all public channels.
contentAccessScopestringNoThis parameter limits the search to channels with the specified content access scope. The only supported value is Public, which restricts the search to publicly accessible channels.

Outputs: An array of matching media assets from Salesforce CMS and connected third-party sources.

get_brand_instructions 

Gets specific instructions that tell Agentforce Vibes how to extract and apply a brand from Salesforce CMS. This tool executes an invocable action to get instructions that specialize in applying branding to apps or sites. Call this tool before you call any other brand tools.

Inputs: None

Outputs: Instructions for extracting and applying a brand from Salesforce CMS.

get_content_types_for_workspace 

List the content types supported by a Salesforce CMS workspace. Identify the workspace by supplying exactly one of: a base type developer name, such as content, marketing, or fragment_space; the ID of a content space; or the ID of a CMS folder. The supported content types are derived from the modules that the workspace defines or has installed. This tool returns a list of content types, each with a namespace prefix, developer name, title, and description.

Inputs:

ParameterTypeRequiredDescription
baseTypestringNoThe base type developer name of the workspace (for example, content, marketing, fragment_space). The supported content types are derived from the modules that this base type defines. Specify at most one of baseType, spaceId, or folderId. All three can be omitted only if typeClassFullyQualifiedNames or mixinTypeFullyQualifiedNames is provided instead (when enabled for the org).
spaceIdstringNoThe ID of a content space. The supported content types are derived from the modules installed on this space. Specify at most one of baseType, spaceId, or folderId. All three can be omitted only if typeClassFullyQualifiedNames or mixinTypeFullyQualifiedNames is provided instead (when enabled for the org).
folderIdstringNoThe ID of a CMS folder. Its owning content space is resolved first, then the supported content types are derived from the modules installed on that space. Specify at most one of baseType, spaceId, or folderId. All three can be omitted only if typeClassFullyQualifiedNames or mixinTypeFullyQualifiedNames is provided instead (when enabled for the org).
typeClassFullyQualifiedNamesarray of stringsNoA list of type-class fully qualified names (or IDs) to scope the returned content types. Combines with the types the workspace already supports when both are present, but can also be provided on its own to scope the query even when the workspace resolves no content types. Ignored unless this feature is enabled for the org.
mixinTypeFullyQualifiedNamesarray of stringsNoA list of mixin-type fully qualified names (or IDs) to scope the returned content types to those types that carry the given mixin. Combines with the types the workspace already supports when both are present, but can also be provided on its own to scope the query even when the workspace resolves no content types. Ignored unless this feature is enabled for the org.

Outputs: An array of content types, each with a namespace prefix, developer name, title, and description.

Understand How Security Works 

Every Salesforce Hosted MCP transaction runs as the authenticated user, scoped through an External Client App with the mcp_api scope. Object permissions (CRUD), field-level security (FLS), sharing rules, profile permissions, and permission sets all apply. If you can’t perform an action in Salesforce, your agent can’t perform it through the MCP server. The audit trail attributes every action to you.

The Content Read-Only server follows the same practices that apply across all Salesforce Hosted MCP servers. For full guidance, see Security Best Practices and General Best Practices.

Related Resources