Default tools
Content tools (CDA-backed, read-only)
All set annotations: { readOnlyHint: true }.
contentstack_search_entries
Full-text search across configured content types.
| Input | Type | Description |
|---|---|---|
query | string | Free-text search |
content_types | string[] | Filter by UID |
limit | integer | 1–50, default 10 |
offset | integer | Pagination offset |
locale | string | e.g. 'en-us' |
contentstack_get_entry_by_url
Fetch entry by public URL path.
| Input | Type | Description |
|---|---|---|
url | string | Path starting with / |
locale | string | Optional locale |
contentstack_get_entry_by_uid
Fetch entry by content type UID and entry UID.
| Input | Type | Description |
|---|---|---|
content_type | string | Content type UID |
uid | string | Entry UID |
locale | string | Optional 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.
navigate_to
Client-side navigation. Requires navigate callback in register(). Not read-only.
| Input | Type | Description |
|---|---|---|
path | string | Internal 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) searchableFieldsdefaults to[titleField, bodyField]when omittedmeta.totalis 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:
| Limit | Detail |
|---|---|
| Deep offsets | The CDA returns at most 100 entries per request, so offset + limit above 100 cannot be paged into |
| Ordering | Results 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:
{
"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:
{ "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
| Annotation | Set on | Meaning |
|---|---|---|
readOnlyHint | all tools except navigate_to | Tool does not modify state |
untrustedContentHint | the three CDA entry tools | Output is author-written content the package has not validated, so agents should treat it as untrusted input |