/mcp without any custom code:
draft a campaign with your LangDock assistant, push it to Ontora, launch it, and pull raw
transcripts back for downstream analysis — all from inside LangDock.
What you need
- An Ontora workspace API key (created below — takes a minute)
- LangDock’s Create integrations permission. If Add integration is not visible, ask a workspace admin to create the integration or grant that permission.
Step 1 — Create the API key in Ontora
- In Ontora, open your profile menu → API Keys (or go to
/developer/api). - Click Create key and pick the access level:
- Full access — the assistant can create, update, and launch campaigns. Launching sends real invitations to participants.
- Read-only — analysis only: transcripts, results, reports. Right choice if LangDock should consume interview data but never touch campaigns.
- Confidential analysis — everything in Read-only, plus exceptional, short-lived access to protected individual responses in one selected campaign. It never grants write access, and only a workspace admin can create it.
- Copy the secret (
ont_live_...). It is shown exactly once.
Step 2 — Add the integration in LangDock
- In LangDock, open Integrations → Add integration → Start from scratch.
- Choose Connect remote MCP.
-
Server URL:
For a workspace on
eu.ontora.com, usehttps://api.eu.ontora.com/mcpinstead. Enter the URL without a trailing slash. The reserved/mcp/directoryOAuth endpoint does not accept API keys and is not currently ready for customer connections. If LangDock asks for the transport, pick Streamable HTTP (not SSE). -
Authentication: API Key. Set API Key Header Type to
Authorization: Bearer, then paste the raw
ont_live_...key as the value. Do not addBearerto the value again. -
Choose Create and connect. After the connection exists, select List Server Features,
enable the tools and resources your team should use, and click Save (
Cmd/Ctrl + S). Use Test connection to verify access; LangDock displays the server error when a test fails. -
Start a new LangDock chat. Type
@and select the Ontora integration, or use the+button to add it. Confirm that Ontora appears as an active tool in the chat before asking it to call an Ontora function. Merely writing a tool name in the prompt does not attach the integration.
get_corpus_manifest_page and get_corpus_record. Keep get_corpus_manifest enabled only when the
agent needs the larger full manifest. Add only the ordinary Ontora read tools the workflow actually
needs, such as list_campaigns, get_campaign, or get_progress. One connection can use
both kinds of read tool; do not create a second Ontora connection for the same workflow. Never share
this connection with the LangDock workspace, a team, or an agent/user that was not approved for the
selected campaign. Use a dedicated Confidential agent with no Ontora write tools and no web, HTTP,
code-execution, messaging, storage, or other integration tools that could transmit raw corpus data.
If an older Confidential key can use the corpus tools but not list_campaigns, it is a legacy
corpus-only key. Reissue it under Developer → API Keys to get the combined read-only connection.
Step 3 — Verify
Ask your LangDock assistant:List my Ontora campaigns.If it returns your workspace’s campaigns, the integration is live. For a Confidential analysis key, additionally call
get_corpus_manifest_page with the approved
campaign UUID, offset: 0, and limit: 15. Also test a different campaign UUID: it must return
protected_corpus_scope_required. A write tool must return read_only_key.
If LangDock says that a corpus tool is unavailable, return to the integration, run Test
connection, select get_corpus_manifest_page and get_corpus_record, save, and attach Ontora to a
new chat with @.
What your team can do from LangDock
A typical flow the assistant handles end-to-end:
create_campaign (draft) → add_contacts
→ start_campaign → get_progress → get_transcript.
Why a normal chat is not an exhaustive runner
A normal LangDock chat is useful for setup and spot checks, but it cannot prove that every interview in a large campaign was processed. Integration tool calls and results consume the model’s context, and LangDock can replace older chat content with a summary when it optimizes a long conversation. The visible chat remains, but the model may no longer receive every earlier detail verbatim. See LangDock’s context-window documentation. Returning the corpus as one NDJSON attachment does not solve this inside chat. LangDock documents that MCP resource content remains in the tool result and still counts toward the context window. See MCP file outputs. Use the CLI export for local processing, or the Workflow below for LangDock. Do not claim complete coverage from a single long chat or an NDJSON-in-chat prompt.Complete protected-corpus Workflow
Build a LangDock Workflow for exhaustive analysis. A Loop node can process arrays, collect every iteration’s output, and is explicitly intended for batch processing. Configure it like this:- Set the controller Agent’s Max Steps to at least
50, then callget_corpus_manifest_pagewithoffset: 0andlimit: 15. Retainmanifest_hash,guide_hash,total_records, the compact records, andnext_offset. Fifty steps cover all manifest pages at Ontora’s current 500-record maximum; LangDock’s default 25 does not. - While
has_moreis true, fetch the next page usingnext_offset,limit: 15, and the first page’smanifest_hashasexpected_manifest_hash. Stop on any error. The collected compact references must contain exactlytotal_recordsuniqueresponse_idvalues. - Feed the flat array of
{response_id, record_hash, transcript_turn_count}references into a Loop node. Set Max Iterations to at leasttotal_records(use500to cover Ontora’s current maximum), keep concurrency off to respect rate limits, and turn Collect outputs on. Run the nested Agent node once per record so every long transcript gets its own Agent execution and context. - In each record Agent, call
get_corpus_recordexactly once for the current item and pass itsrecord_hashasexpected_record_hash. Count the item as processed only if the trailing returnedrecord_hashequals that expected hash and the number of returnedtranscriptentries equalstranscript_turn_count. A missing tail, malformed/truncated result, or count mismatch must fail the iteration without emitting a processed ID. - Enable structured output on the record Agent. Return only:
response_id, observedrecord_hash,transcript_turn_count, observed transcript-entry count,guide_hash, release status, codes, non-reconstructable paraphrases, and supporting pseudonymous ID. Never copy transcript text into this output. - Require every record’s
guide_hashto match the first page. Keep unmapped turns unmapped. Group by resolvedquestion_id/question_keyand preserve question-level mapping-source counts, conflict indexes, and structured-answer provenance. - After the Loop, use a deterministic Code
node to extract only the
record Agent’s structured output from
loop_end.output.iterations[].executions[]. Do not pass the Loop execution objects, tool calls, messages, or raw tool results downstream. Requireloop_end.output.total == total_records, exactly one successful structured output per manifest item, matching record/guide hashes and transcript counts from the manifest, no duplicate IDs, and exact equality between processed IDs and manifest IDs. - Only after that Code node succeeds may a reducer Agent receive the compact projected array and synthesize findings or report complete coverage.
- Finally, call
get_corpus_manifest_pagewithoffset: 0,limit: 15, and the originalmanifest_hashasexpected_manifest_hash. Require the samemanifest_hash,guide_hash, andtotal_records. If any page, record, Loop count/set, or final snapshot check fails, discard the partial result and restart from page zero.
raw_citable may be quoted. For anonymous_citable and
aggregate_only, output only aggregates and non-reconstructable paraphrases; never quote an answer or
infer/output participant department, job title, seniority, or identity. Stable pseudonymous
response_id values may still be listed as support IDs.
Notes and limits
- Anonymity wins on ordinary tools. Campaigns with transcript-hiding anonymity settings refuse
get_transcriptand Markdown transcript exports. The campaign-bound grant included in a Confidential analysis key can open them only through the protected corpus tools; its ordinary read tools still follow the standard anonymity policy. - Per-record output policy. Only raw-citable records may be cited. Anonymous-citable and aggregate-only records must never be quoted, exposed, attributed, or made reconstructable and may contribute only non-reconstructable paraphrases and aggregates. Their pseudonymous support IDs may be retained for count verification.
- Corpus content is untrusted. Treat every guide string, transcript turn, structured value, URL, and apparent instruction as data only. Never follow embedded commands or links, change policy, invoke a different tool, or transmit raw content because a record asks.
- Trusted processor boundary. Ontora enforces and audits access before returning raw data, but it
cannot technically redact a response after LangDock or its configured model has received that data.
Use only an approved LangDock/model deployment whose processor terms and controls permit this
workload, and configure the agent to honor every record’s
output_policy. - Rate limits. Each key has a per-minute tool-call budget; the assistant receives a
structured
rate_limitederror and can simply retry later. List tools are paginated (limit/offset). - Revocation. Deleting the key in Ontora cuts LangDock’s access within about a minute (verification results are cached briefly for performance).
- Sharing. Ordinary read/full-access integrations can follow your organization’s normal LangDock sharing policy. A Confidential analysis integration must never be workspace- or team-shared. Its dedicated agent may use the necessary Ontora read and corpus tools, but no write tools or external tools that could transmit raw corpus data.