Skip to main content
Contentstack MCP profile hub is in general availability!

McpUrlConfigurator

A connection configurator for Contentstack Profile Hub MCP profiles: pick a profile, fill in its configuration, copy an install command for your AI client.

Anatomy

SectionWhat it does
Profile<select> of the system profiles, its description, and a NoticeShell warning when the profile can write or delete
RequiredLabelled inputs for the params the profile needs, two columns from sm up
Optional configuration<details> disclosure (the FAQ pattern) holding params that override a stack default
InstallOptional one-click deeplink buttons (show_install_links), then a role="tablist" of manual targets, the editable server name, and the generated snippet in CodeBlockWithCopy. The last tab is the raw URL

Sections are separated by border-t border-border-light, not nested cards.

Reused atoms

Title, Button (PrimaryFillButton for Copy, UnderlineButton/ButtonContainer for the tabs), Icons, NoticeShell, CodeBlockWithCopy. Inputs and the select use the field treatment from SearchBar (border-border-light, bg-on-surface-2-strong, h-10) and the focus ring from Button. Typography uses the cs-* utilities. No new component system.

Props

Props come from the mcp_connector block (global field mcp_connect), typed as McpConnector in types/types.ts.

PropTypeDefaultNotes
copyRichText–Nested rich_text global field (title, tag, variant, fancy background, body), rendered with the RichText organism as the intro. With no title or body, a built-in heading and description render instead
profilesstring[]all profilesProfile ids to offer, in CMS order. Matching ignores case, spaces, and dashes (Brand Kit → brandkit). Unknown values are skipped. With one profile the select is hidden
show_install_linksbooleanfalseShows the one-click Add to Claude / Cursor deeplinks above the manual tabs
classNamestring–Extra classes on the section
noPaddingbooleanfalseDrops the section padding utility

Usage

CMS-only. Registered in ComponentsRenderer as mcp_connector (the block uid in the page components field), so it renders wherever an editor places that block. There is no standalone route — noPadding is injected by the renderer when the surrounding layout already pads.

Rules

lib/mcp-url-configurator.ts is the single source of truth and drives the form:

  • PARAMS — every query param, with its label, sample value, and serialization order.
  • PROFILES — per profile: label, description, required params, optional params, and a writes flag for the safety notice. Adding a profile is one entry.
  • DEEPLINKS — one-click install links, each a build(name, url). Both formats are verified: Claude uses claude.ai/customize/connectors?modal=add-custom-connector with connectorName / connectorUrl (shipped May 2026); Cursor uses cursor://anysphere.cursor-deeplink/mcp/install with name and a base64 config holding just the inner server object (docs). Both clients ask the user to confirm before saving. Rendered with buttonVariants() on an <a>, the same link-as-button pattern as ListFilters.
  • CLIENTS — manual install targets, each with a language and a build(name, url) function. Formats verified against each client's own docs (Claude Code CLI, Cursor mcpServers.url, Codex [mcp_servers.NAME] TOML, generic mcp.json) plus a url target that returns the bare URL. usesServerName: false hides the server name field for targets that have no name to set.

buildUrl returns errors (malformed values — these block the URL) separately from missing (blank required params — the URL still builds, install snippets wait). Blank values are never serialized. The whole Install section is hidden until the configuration is complete.

Notes

  • The endpoint origin is fixed and not configurable.
  • Everything is reactive; there is no Generate action.
  • apikey is a stack pointer, not a credential, so it is not masked.
  • OAuth authenticates the connection; the URL only configures it.