Examples

Copy-pasteable JSON-RPC. Substitute $ENDPOINT with your server URL (https://mcp.docs.salesforce.com/, or the path-namespaced https://docs.salesforce.com/mcp/). Every example below is a real call against the live server.

Initialize a session

curl -X POST $ENDPOINT \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2024-11-05",
      "capabilities": {},
      "clientInfo": { "name": "curl", "version": "0" }
    }
  }'

Capture mcp-session-id from the response headers and pass it as -H 'mcp-session-id: <id>' on subsequent requests.

list

{
  "jsonrpc": "2.0", "id": 2, "method": "tools/call",
  "params": {
    "name": "list",
    "arguments": {}
  }
}

search — ranked retrieval

{
  "jsonrpc": "2.0", "id": 3, "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": {
      "query": "calculated field",
      "collection": "tableau",
      "version": "current",
      "locale": "en-us",
      "pageSize": 5
    }
  }
}

Add "format": "text" (or "markdown" / "html") to include document bodies. Omit it for triage queries (smaller responses, ranking only).

Multi-collection retrieval

The same five tools work across all six collections — switch the collection argument. Each collection has its own +guides:<slug> vocabulary (read it from list).

Admin — scope to a product area with a +guides: filter:

{
  "jsonrpc": "2.0", "id": 4, "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": { "query": "+guides:commerce order management", "collection": "admin", "locale": "en-us" }
  }
}

Admin also indexes a Salesforce quarterly-release number — add +release:<n> (e.g. 262) to pin a release:

{ "name": "search", "arguments": { "query": "+guides:commerce +release:262 order management", "collection": "admin", "locale": "en-us" } }

MuleSoft — natural-language answer with citations:

{
  "jsonrpc": "2.0", "id": 5, "method": "tools/call",
  "params": {
    "name": "answer",
    "arguments": { "query": "How do I configure the Amazon Bedrock connector?", "collection": "mulesoft", "locale": "en-us" }
  }
}

Developer — chain co-occurring guides axes (brand × doc type) as bare boosts:

{
  "jsonrpc": "2.0", "id": 6, "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": { "query": "+guides:marketing_cloud_ampscript +guides:reference string functions", "collection": "developer", "locale": "en-us" }
  }
}

LegacyDeveloper — Apex / platform reference (one book per doc; use bare guides: boosts, never chained):

{
  "jsonrpc": "2.0", "id": 7, "method": "tools/call",
  "params": {
    "name": "answer",
    "arguments": { "query": "How do Apex trigger context variables work?", "collection": "legacydeveloper", "locale": "en-us" }
  }
}

Release-preview retrieval (version: "next")

Tableau publishes a next channel documenting upcoming, not-yet-shipped behavior. Citations resolve to /release-preview/ URLs. Use current (the default) for behavior available today.

{
  "jsonrpc": "2.0", "id": 8, "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": { "query": "Tableau Next", "collection": "tableau", "version": "next", "locale": "en-us" }
  }
}

Localized content & locale routing

Collections carry localized slices (see each collection's locales[]). Target one explicitly, and the answer grounds in that language's documentation:

{
  "jsonrpc": "2.0", "id": 9, "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": { "query": "bien arquitectado", "collection": "architect", "locale": "es-mx" }
  }
}

Or leave locale at its default "auto": the server detects the question's language and routes to the matching slice when the collection has it, answering in the language you asked. A Spanish question routes to es-es and answers in Spanish:

{
  "jsonrpc": "2.0", "id": 10, "method": "tools/call",
  "params": {
    "name": "answer",
    "arguments": { "query": "¿Cómo puedo crear un campo calculado en Tableau Server?", "collection": "tableau", "locale": "auto" }
  }
}

Collection-specific facets — Architect recency

The architect collection carries semi-structured date fields, so you can retrieve by when a document was last touched. updated is an indexed yyyymmdd token (wildcard-matchable); pill flags new / updated content.

"What changed in the last two months?" — OR the recent year-month wildcards (today is June 2026, so April–June):

{
  "jsonrpc": "2.0", "id": 13, "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": { "query": "updated:202604* updated:202605* updated:202606*", "collection": "architect", "locale": "en-us" }
  }
}

Use a leading + to require a month ("+updated:202605*"), or combine the +pill:new "what's new" flag with a topic ("+pill:new agentforce"). These facets are unique to architect; other collections ignore them.

fetch — direct lookup by id or url

Chain ids from a search / answer result, or pass public urls (not both). Pick format per use: text for triage/bulk, markdown for structure, html for raw.

{
  "jsonrpc": "2.0", "id": 11, "method": "tools/call",
  "params": {
    "name": "fetch",
    "arguments": {
      "urls": ["https://help.tableau.com/current/pro/desktop/en-us/calculations_calculatedfields.htm"],
      "format": "markdown"
    }
  }
}

explain — answer grounded in one document

Use when you already know which document holds the answer. Pass id (chained from a citation) or url.

{
  "jsonrpc": "2.0", "id": 12, "method": "tools/call",
  "params": {
    "name": "explain",
    "arguments": {
      "query": "Does this article explain how to save a calculated field?",
      "url": "https://help.tableau.com/current/pro/desktop/en-us/calculations_calculatedfields.htm"
    }
  }
}