Skip to content

Experimental · Unofficial

Built by Tim Benniks. This is not an official Contentstack product and is not supported by Contentstack.

Default tools

Content tools (CDA-backed, read-only)

All set annotations: { readOnlyHint: true }.

contentstack_search_entries

Full-text search across configured content types.

InputTypeDescription
querystringFree-text search
content_typesstring[]Filter by UID
limitinteger1–50, default 10
offsetintegerPagination offset
localestringe.g. 'en-us'

contentstack_get_entry_by_url

Fetch entry by public URL path.

InputTypeDescription
urlstringPath starting with /
localestringOptional locale

contentstack_get_entry_by_uid

Fetch entry by content type UID and entry UID.

InputTypeDescription
content_typestringContent type UID
uidstringEntry UID
localestringOptional locale

contentstack_list_content_types

List configured/exposed content types. No input.

Browser context tools

get_current_page

Returns window.location and document.title. No SDK call.

get_site_info

Returns discovery pointers (llms.txt, OpenAPI, server MCP, etc.). Configurable via siteInfo.

Client-side navigation. Requires navigate callback in register(). Not read-only.

InputTypeDescription
pathstringInternal path starting with /

How search works

contentstack_search_entries matches CDA-side, not in the browser:

  • The query is capped at 200 characters and 8 tokens, and each token is regex-escaped
  • Per content type: AND across tokens, OR across searchableFields (case-insensitive)
  • searchableFields defaults to [titleField, bodyField] when omitted
  • meta.total is the summed CDA match count, so it reflects the real result set
  • Each type fetches only enough rows to cover the requested page — no full content download
  • References are not fetched for search results, only for get_entry_by_*

Two limits worth knowing:

LimitDetail
Deep offsetsThe CDA returns at most 100 entries per request, so offset + limit above 100 cannot be paged into
OrderingResults are grouped by content type in config order, not interleaved by relevance

Tool execute response format

Per the WebMCP spec, execute resolves to any serializable value and the agent receives it directly — there is no MCP-style content envelope. Tools return their response shape as-is:

json
{
  "data": [{ "uid": "blt123", "title": "Getting Started" }],
  "meta": { "total": 42, "limit": 10, "offset": 0, "has_more": true }
}

On failure they resolve to an error object instead:

json
{ "error": { "code": "tool_error", "message": "No entry found for URL: /missing" } }

Wrap custom handlers in safeExecute() from @timbenniks/contentstack-webmcp to get that error shape automatically, or build one with toolError().

Annotations

AnnotationSet onMeaning
readOnlyHintall tools except navigate_toTool does not modify state
untrustedContentHintthe three CDA entry toolsOutput is author-written content the package has not validated, so agents should treat it as untrusted input

Released under the MIT License.