External Interviews
Purpose
During a task, Claude sometimes needs an answer that only an external person can
give — a client, a stakeholder, a colleague of the user, anyone who is not the
person Claude is currently talking to. In that situation Claude must not stop the
task, guess, or invent an answer on the external person's behalf. Instead, Claude
opens a remote, link-based conversation through the interviews MCP server
(interviews.oiarplatform.com), asks the external person directly, and manages
that conversation through to closure — resuming it across sessions if needed.
Prerequisite: confirm the interviews MCP server is available
Before doing anything else, check whether the following tools are available:
create_chat, send_message, wait_for_reply, get_pending_replies,
get_chat, close_chat.
If they are not available, stop and tell the user this skill needs the
interviews MCP server configured first:
claude mcp add --transport sse interviews https://mcp.oiarplatform.com/sse \
--header "Authorization: Bearer oiar_pk_<YOUR_KEY>"
The key is generated at https://interviews.oiarplatform.com/hub/keys.
Do not attempt any part of the flow below without these tools — there is no fallback. Explain the missing setup and end here.
Step 1 — Start a chat
Ask the user three things:
- Who is the person (name / role)?
- What exactly do we need to find out from them?
- Their email address (optional — without it, the user shares the link themselves; with it, an invite email goes out automatically).
Then call create_chat with:
- A well-written private
context: the goal of the conversation, who the interlocutor is, and what needs to be discovered. This context is never shown to the external person — write it as a briefing for yourself, not for them. recipient_emailif the user provided one.expires_daysif the default (7 days) doesn't fit — valid range 1-90.
Immediately show the resulting link to the user. This is the only time the link is surfaced automatically — it is not re-shown later, so make sure the user has it (or copies it) now.
If create_chat fails with a plan/limit error (monthly chat cap on the free
plan), report this to the user plainly and do not retry.
Step 2 — Hold the conversation
Send one question at a time with send_message:
- In the interlocutor's language.
- Short and concrete — one thing at a time, not a list of five questions in one message.
After sending, call wait_for_reply(session_id, timeout=300).
If they reply: read the answer, reason about it, and ask the next question — adapted to what they just said, without repeating ground already covered. Cap the conversation at 5-7 questions total, then thank them and move toward closing (Step 4).
If it times out: this is normal — people answer when they can, not on-demand. Retry the wait at most 2 more times. If still nothing, tell the user:
"No reply yet — you'll get an email when they respond. In a future session, just ask me to check for replies."
Then continue with the rest of the task. Never block the whole task on a pending reply.
Step 3 — Resume a conversation
At the start of a session, or whenever the user asks something like "ci sono
risposte?" / "any replies?", call get_pending_replies. All conversation state
lives on the server, so any session can resume any chat — you don't need to be
the session that created it.
For the full transcript of a specific conversation, call
get_chat(session_id). Pick the thread back up from the latest reply and
continue with Step 2's logic (next question, or move to closing).
Step 4 — Close the chat
Once you have enough information:
- Send a final thank-you message via
send_message. - Call
close_chatto invalidate the link. - Give the user a structured summary of what came out of the conversation: key points learned, relevant direct quotes, and any questions that remain open.
Rules
- Never block the whole task waiting for a reply. The long-poll in
wait_for_replyis for interlocutors who are online right now. For anything longer, end the turn and resume later — the partner is notified by email automatically the first time they have an unread message. - Never leak the user's confidential information. The
contextpassed tocreate_chatis private (Claude-only), but every question sent withsend_messageis visible to the external person. Keep that distinction in mind when deciding what goes where. - Links expire (default 7 days;
expires_days1-90) and the free plan has a monthly chat limit. Ifcreate_chatfails with a limit error, report it to the user and stop — don't retry. - If
wait_for_replyrisks exceeding the client's own timeout, suggest the user setMCP_TOOL_TIMEOUT=660000in their Claude Code environment. - One chat = one person. To interview multiple people, create multiple
chats. These can run in parallel: send the opening question to everyone
first, then work through
wait_for_replyfor each in rotation.
Example session
User: "Prima di chiudere lo scoping, chiedi a Marco (il PM del cliente) se possono darci accesso a un ambiente di staging entro venerdì."
Claude: confirms the interviews tools are available, then asks the user
for Marco's email (marco@clientco.com) and creates the chat:
create_chat(
context: "Marco è il PM lato cliente su ClientCo. Ci serve sapere se possono
darci accesso a un ambiente di staging entro venerdì, e se serve
aprire un ticket IT da parte loro. Obiettivo: sbloccare lo scoping
tecnico entro la settimana.",
recipient_email: "marco@clientco.com",
expires_days: 7
)
→ { session_id: "sess_8f2a", chat_link: "https://interviews.oiarplatform.com/c/8f2a..." }
Claude immediately shows the user the link and confirms the invite email was sent to Marco.
Q1. send_message: "Ciao Marco, possiamo avere accesso a un ambiente di
staging entro venerdì?" → wait_for_reply(timeout=300) →
Marco replies: "Sì, dovremmo riuscirci per giovedì."
Q2. send_message: "Perfetto. Serve che apriate un ticket IT interno da
parte vostra, o possiamo procedere diretti con le credenziali?" →
Marco replies: "Ve le mando direttamente io, niente ticket."
Q3. send_message: "Ok! Un'ultima cosa: l'ambiente di staging avrà gli
stessi dati di produzione o dati di test?" →
wait_for_reply(timeout=300) → timeout, nessuna risposta.
Claude retries once more (2nd attempt) → still timeout. Claude tells the user:
"Marco ha confermato accesso allo staging entro giovedì, senza bisogno di ticket IT — ce le manda lui le credenziali. Non ha ancora risposto se i dati saranno di produzione o di test: nessuna risposta per ora, riceverà un promemoria via email. Continuo con il resto del task nel frattempo."
Claude proceeds with the rest of the scoping work without waiting further.
Later, new session. User: "Ci sono risposte da Marco?"
Claude calls get_pending_replies → finds a new reply on sess_8f2a: "Dati di
test, per sicurezza." Claude calls get_chat("sess_8f2a") to confirm full
context, then since this answers the last open question, moves to closing:
send_message(session_id: "sess_8f2a", message: "Perfetto, grazie mille Marco,
abbiamo tutto quello che ci serve!")
close_chat(session_id: "sess_8f2a")
Claude gives the user the final summary:
Riepilogo intervista — Marco (PM ClientCo)
- Accesso staging confermato entro giovedì.
- Credenziali inviate direttamente da Marco, nessun ticket IT necessario.
- Ambiente di staging con dati di test (non di produzione), per motivi di sicurezza.
- Nessuna domanda rimasta aperta. Chat chiusa.