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.