Topolo Docs Topolo Platform
Open workspace

Ask workspace documentation

Answer from tenant-filtered retrieved versions and return immutable citations.

Outcome

Answer from tenant-filtered retrieved versions and return immutable citations.

These examples were captured from the local Worker. Deployment, publication and retrieval are verified separately for each environment; local examples do not establish external provider delivery.

Before you start

  • Inspect the credential identity with topolo whoami and the exact action with topolo actions get before preparing input.

  • Discover an accessible Docs workspace with topolo resources topolo-docs and topolo workspaces list topolo-docs. Pass workspace resource type and identifier separately from action input.

  • The published required permission is docs:read; the active credential and resource binding must authorize the call.

  • Validate and plan the exact request. Execute only after the intended effect has been authorized; --confirm is the transport guard, not a grant of permission.

Discover the target


topolo actions get app_topolo_docs.search.ask --detail --json
topolo resources topolo-docs --json
topolo workspaces list topolo-docs --json

Input fields

FieldRequiredMeaning
queryYesQuestion to ground in current workspace documentation. No matches return no_sources with a null answer. An answered response includes immutable citations; generation can fail if Nexus is unavailable.
limitNoMaximum search hits, from 1 through 50; omitted limit defaults to 20. This is a search limit, not a pagination cursor.

Interpret the response

status answered includes answer text and immutable citations; no_sources returns a null answer and empty citations/results. Generation failure is a non-success HTTP response, not an empty successful answer. The input body limit bounds retrieval.

Worked examples

The following inputs and responses were captured from the local Docs worker fixture. Auth and Nexus dependencies are simulated. Identifiers, URLs and timestamps are illustrative fixture values. Discover your own identifiers and choose an appropriate test resource; copying a fixture identifier does not make it valid in your environment. For workspace-bound calls, set DOCS_WORKSPACE_ID to the identifier returned by resource discovery. Run validation and planning first; the final call requires the intended effect to be authorized.

Minimal example

Save the input as payload.json:


{
  "query": "unmatchedtermzero",
  "limit": 5
}

CLI:


topolo actions validate app_topolo_docs.search.ask --data @payload.json --json
topolo actions plan app_topolo_docs.search.ask --resource-type workspace --resource-id "$DOCS_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_docs.search.ask --resource-type workspace --resource-id "$DOCS_WORKSPACE_ID" --data @payload.json --confirm --json

MCP tool and arguments:


{
  "tool": "topolo_call_action",
  "arguments": {
    "actionId": "app_topolo_docs.search.ask",
    "input": {
      "query": "unmatchedtermzero",
      "limit": 5
    },
    "resourceType": "workspace",
    "resourceId": "<identifier returned by resource discovery>",
    "confirm": true
  }
}

Captured local response · HTTP 200:


{
  "query": "unmatchedtermzero",
  "answer": null,
  "status": "no_sources",
  "citations": [],
  "results": []
}

status answered includes answer text and immutable citations; no_sources returns a null answer and empty citations/results. Generation failure is a non-success HTTP response, not an empty successful answer. The input body limit bounds retrieval.

Workflow example

Save the input as payload.json:


{
  "query": "token",
  "limit": 5
}

CLI:


topolo actions validate app_topolo_docs.search.ask --data @payload.json --json
topolo actions plan app_topolo_docs.search.ask --resource-type workspace --resource-id "$DOCS_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_docs.search.ask --resource-type workspace --resource-id "$DOCS_WORKSPACE_ID" --data @payload.json --confirm --json

MCP tool and arguments:


{
  "tool": "topolo_call_action",
  "arguments": {
    "actionId": "app_topolo_docs.search.ask",
    "input": {
      "query": "token",
      "limit": 5
    },
    "resourceType": "workspace",
    "resourceId": "<identifier returned by resource discovery>",
    "confirm": true
  }
}

Captured local response · HTTP 200:


{
  "query": "token",
  "answer": "Rotate the token from the documented credential settings [1].",
  "status": "answered",
  "citations": [
    {
      "documentId": "doc_453b15f4-06fc-4366-ae42-adf1f10d9d38",
      "versionId": "docver_81f1572d-43ea-45fe-b0dd-0f550c94d80a",
      "spaceId": "docspace_a0013653-dabf-4831-8c11-6405b39664ca",
      "locale": "en",
      "title": "Rotate an integration token",
      "anchor": null,
      "contentHash": "f14fd31c10cbbf734ad4677c8c68f7036d2f3625815ed61465ff8375acd5e0b6"
    }
  ],
  "results": [
    {
      "document": {
        "id": "doc_453b15f4-06fc-4366-ae42-adf1f10d9d38",
        "organizationId": "org_fixture",
        "workspaceId": "ws_fixture",
        "spaceId": "docspace_a0013653-dabf-4831-8c11-6405b39664ca",
        "sectionId": "docsec_37f4c4e1-d416-47d7-ad57-d0a38fb678c4",
        "sectionPosition": 0,
        "parentId": null,
        "slug": "rotate-token",
        "title": "Rotate an integration token",
        "summary": "Safely replace an integration token.",
        "status": "published",
        "sourceKind": "native",
        "ownerAppId": null,
        "currentVersionId": "docver_81f1572d-43ea-45fe-b0dd-0f550c94d80a",
        "publishedVersionId": "docver_81f1572d-43ea-45fe-b0dd-0f550c94d80a",
        "createdByUserId": "usr_fixture",
        "createdAt": "2026-10-03T08:07:34.003Z",
        "updatedAt": "2026-10-03T08:07:34.384Z",
        "publishedAt": "2026-10-03T08:07:34.384Z"
      },
      "version": {
        "id": "docver_81f1572d-43ea-45fe-b0dd-0f550c94d80a",
        "organizationId": "org_fixture",
        "workspaceId": "ws_fixture",
        "documentId": "doc_453b15f4-06fc-4366-ae42-adf1f10d9d38",
        "locale": "en",
        "title": "Rotate an integration token",
        "summary": "Safely replace an integration token.",
        "bodyMarkdown": "# Rotate a token\n\nOpen credential settings, replace the token and verify a read.",
        "agentGuidance": null,
        "contentHash": "f14fd31c10cbbf734ad4677c8c68f7036d2f3625815ed61465ff8375acd5e0b6",
        "sourceRevision": null,
        "sourcePath": null,
        "createdByUserId": "usr_fixture",
        "createdAt": "2026-10-03T08:07:34.265Z"
      },
      "rank": -0.5042990213106258
    }
  ]
}

status answered includes answer text and immutable citations; no_sources returns a null answer and empty citations/results. Generation failure is a non-success HTTP response, not an empty successful answer. The input body limit bounds retrieval.

Verify the result

  • Check the cited versions on the answer — an answer with no citations is not grounded in your documentation.

Errors and recovery

  • HTTP 403 · organization_required: The token carries no organization scope. Re-authenticate against the organization that owns the Docs workspace and retry.

  • HTTP 400 · workspace_required: No Docs workspace resolved for the caller. Call workspace.get to see which workspace is bound, then retry in that context.

  • HTTP 403 · permission_denied: The credential needs docs:read on the selected Docs workspace.

  • HTTP 400 · query_required: Supply a non-empty query.

  • HTTP 502 · docs_answer_unavailable: The model gateway could not be reached. Retry once; if it repeats, fall back to search.query, which needs no completion.

Asking changes no documentation. It does cost a completion, so prefer search.query when a keyword match will do.

Evidence boundary

These examples establish local handler behavior and schema validity. They do not establish runtime permission parity, a deployed development/staging result or production completion. Preserve the actual request identifier and perform the verification reads after an authorized live call.