The connector has five read tools and one tool for adding new calls. Your assistant chooses which tool to use from what you ask; you don't need to call them yourself. For example prompts, see Using the MCP connector.
Every tool runs as the person signed in. Read tools return only projects, calls, and entities you can already access in Junior. The write tool can add a call to a project you belong to, or leave it unfiled. It can't change or delete existing content.
What each tool does
| Tool | What it does | Example ask |
|---|---|---|
get_call | Read one call — summary, Key Takeaways, Q&A, and optionally the transcript | Summarize the call with the former Head of Procurement |
get_calls | Read a whole project's calls in one request — metadata, summary, Key Takeaways and the verbatim transcript per call by default — for questions that span the corpus rather than one call | Read every call on the Acme diligence and tell me what buyers said about pricing |
ingest_call | Add a new call and transcript to a project — for calls from sources Junior isn't integrated with. Creates only; it can't change an existing call | Add this transcript to the Acme diligence as a call with Jane Smith |
list_calls | Find calls by expert network, country, job title, segment, rating, cost, duration, or date | Expert calls in France rated 4+ from GLG since March |
list_entities | See the companies and products recognized across a project's calls, and which are flagged as competitors | Which competitors came up on the Acme diligence? |
list_projects | List your projects and the segment names their calls are tagged with | What segments do we have calls for on the Acme diligence? |
Server version 0.9.0 — this changes whenever a tool name, parameter, or response shape changes, so clients that cache tool definitions can tell they need to refresh.
get_call
Get a call · read-only · requires calls:read
Fetch one call's detail by its public ID (get the ID from list_calls first). Returns metadata, a summary, cleaned Q&A, and Key Takeaways by default. Set include_transcript=true only when you need exact quotes or precise wording — for most questions the summary and Q&A are enough and far smaller.
Parameters
| Parameter | Type | Description |
|---|---|---|
call_id required | string | Call's public ID — the id field returned by list_calls. A call and its transcript share one identifier, so a transcript ID from another tool's output works here too. |
include_ktas | boolean · default true | Include Key Takeaways: a curated markdown summary of the call's most important points. Defaults to true; keep on when the user wants headline insights rather than full detail. |
include_notes | boolean · default true | Include your scratchpad notes from the call (the ScribblePad you type during a call). Defaults to true; set false to omit. |
include_qa | boolean · default true | Include the cleaned, structured Q&A extracted from the call (question/answer pairs by section). Defaults to true; use for content and quotes organized by topic. |
include_summary | boolean · default true | Include the call's AI summary (markdown). Defaults to true; set false to omit (e.g. when you only need Q&A or metadata). |
include_transcript | boolean · default false | Verbatim transcript text. Defaults to false. Set true only when you need exact quotes or precise wording — it can be large, and the summary and Q&A cover most questions. |
Response
| Field | Type | Description |
|---|---|---|
anonymity_status | string or null | Redaction state for this call: 'not_requested', 'started', 'complete', or 'errored'. 'complete' means anonymized variants of the identity fields exist — but this tool still returns the originals, so treat this as informational rather than as a description of what you received. |
call_status | string or null | Where the call sits in the scheduling workflow: 'scheduled', 'reached_out', 'not_scheduled', 'done', 'rescheduled', 'not_interested', 'canceled', or 'candidate'. 'done' means the call actually happened. |
cost | number or null | The call's recorded spend in the project's currency — the 'Cost' column in the web call tracker. null when no cost was recorded. |
created_at | string or null | ISO 8601 timestamp of when the call record was created in Junior — not when the call took place. See date for that. |
date | string or null | ISO 8601 timestamp of when the call took place. |
duration_minutes | number or null | Call duration in minutes, derived from the recording/transcript. null when the duration is unknown. |
expert | object | Who was interviewed. |
expert.bio | string or null | The interviewee's background as supplied by the expert network, where one provided it. |
expert.country | string or null | The interviewee's country, e.g. 'France'. |
expert.job_title | string or null | The interviewee's job title, e.g. 'VP of Procurement'. |
expert.name | string or null | The interviewee's name as recorded. Identity fields are returned as-is: MCP does not substitute the anonymized variant, even for calls that have been through redaction, which matches what the Junior web app shows. (The REST API differs — it can return an anonymized name depending on organization settings.) See anonymity_status for whether this call was redacted. |
expert.organization | string or null | The interviewee's employer. |
id | string | The call's public ID — the value you passed in. |
kta_approval_status | "approved" or "pending" or null | 'pending' = AI-generated, not yet human-reviewed (treat as draft); 'approved' = reviewed. Omitted when include_ktas=false. |
ktas | string or null | Key Takeaways as markdown. Omitted when include_ktas=false; null if none have been generated for the call. |
notes | string or null | Your scratchpad notes from the call (the ScribblePad in the web app). Omitted when include_notes=false. |
qa_blocks | array | The call's cleaned question-and-answer pairs. Omitted when include_qa=false. |
qa_blocks[].answer | string or null | The answer, rewritten as a clean standalone statement rather than raw transcript speech. |
qa_blocks[].id | string | QA block UUID. |
qa_blocks[].question | string or null | The question as asked. |
qa_blocks[].section | string or null | The interview-guide section this Q&A came under, e.g. 'Pricing'. null for calls with no guide. |
rating | number or null | The call's quality rating on a 1–5 scale, as set in the web app. null when nobody has rated it. |
segment | string or null | The call's segment — a per-project label grouping calls by interviewee type, e.g. 'Buyer' or 'Former Employee'. Call list_projects to see a project's segment vocabulary. |
source | string or null | Where the call came from — free text, usually an expert-network name such as 'GLG' or 'AlphaSights', or an import label. |
summary | string or null | The call's AI summary (markdown). Omitted when include_summary=false. |
transcript | string or null | Verbatim transcript text. Present only when include_transcript=true. |
transcript_public_id | string or null | Same value as id — transcript and call share one identifier in Junior's data model. |
get_calls
Get all calls in a project · read-only · requires calls:read
Fetch detail for every call in one project at once — the right tool for analyzing a whole corpus rather than a sample. Returns metadata, a summary, Key Takeaways and the verbatim transcript per call by default. Requires project_id (get it from list_projects). Accepts the same filters as list_calls (country, organization, job title, source, segment, rating, cost range, duration range, date range, call type, call status), AND-combined, so you can pull 'every done call rated 4+ since March' in one request instead of looping get_call per id. Returns up to max_calls (default 50); when more match, truncated is true and next_cursor pages. Check the response size first: the transcript is ~210 tokens per minute of call, so an hour-long call is ~12.5k and forty are ~500k. If that exceeds your context, narrow with the filters or set include_transcript=false. include_qa (~5k tokens/call) is a derivative of the transcript and defaults to false — turn it on only for question-level detail.
Parameters
| Parameter | Type | Description |
|---|---|---|
call_status | string (1–64) | Exact-match filter on interview.call_status. Case-sensitive. Valid values: 'scheduled', 'reached_out', 'not_scheduled', 'done', 'rescheduled', 'not_interested', 'canceled', 'candidate'. Most common is 'done' (the call happened). |
call_type | "interview" or "meeting" | Filter on transcript.call_type. 'interview' = expert call, 'meeting' = internal/recorded meeting. |
country | string (1–64) | Filter on interview.country. Case-insensitive exact match (e.g. 'France'). |
cursor | string | Opaque pagination cursor from a previous get_calls response's next_cursor. Pass it to fetch the next page of the same filtered corpus. |
date_after | string (date-time) | ISO 8601 timestamp. Returns calls with interview.date ≥ this. |
date_before | string (date-time) | ISO 8601 timestamp. Returns calls with interview.date ≤ this. |
include_ktas | boolean · default true | Include each call's Key Takeaways (curated markdown summary). Defaults to true — the highest signal per token in the response. |
include_notes | boolean · default true | Include each call's ScribblePad notes — the scratchpad the conductor typed during the call. Defaults to true; set false to omit. |
include_qa | boolean · default false | Include each call's cleaned, structured Q&A (question/answer pairs by section). Defaults to false: budget ~5,000 tokens per call, and it is a restructured derivative of the verbatim transcript rather than new content. Turn it on for a narrow, filtered set when you want question-level structure. |
include_summary | boolean · default true | Include each call's AI summary (markdown). Defaults to true. Set false to trim the response when you only need Q&A or metadata — across a whole project the summaries add up. |
include_transcript | boolean · default true | Include each call's verbatim transcript. Defaults to true — this is the primary source and usually what a corpus question needs. Budget ~210 tokens per minute of call (an hour-long call is ~12.5k), multiply by max_calls, and if that exceeds your remaining context, narrow with the filters or lower max_calls before setting this false. |
job_title_contains | string (1–128) | Case-insensitive substring match on interview.job_title (e.g. 'VP', 'CFO'). |
max_calls | integer (1–200) · default 50 | Maximum number of calls to return in this response (1-200, default 50). Lower it when the content you asked for is large relative to your remaining context; when more calls match than you asked for, truncated is true and next_cursor pages the rest. Each page you fetch stays in your context, so paging spreads the cost out rather than reducing it. |
max_cost | number (min 0) | Return only calls with interview.cost ≤ this. |
max_duration_minutes | number (min 0) | Return only calls whose transcript duration ≤ this many minutes. |
min_cost | number (min 0) | Return only calls with interview.cost ≥ this. |
min_duration_minutes | number (min 0) | Return only calls whose transcript duration ≥ this many minutes. |
min_rating | integer (1–5) | Return only calls with interview.rating ≥ this. 1-5 scale. |
organization_contains | string (1–128) | Case-insensitive substring match on interview.organization (e.g. 'Goldman'). |
project_id required | string (uuid) | Project UUID to pull the corpus from (required). Get it from list_projects. |
segment_contains | string (1–128) | Case-insensitive substring match on the call's segment name (interview_segment.segment). |
source_contains | string (1–128) | Case-insensitive substring match on interview.source (e.g. 'GLG', 'AlphaSights'). |
Response
| Field | Type | Description |
|---|---|---|
calls | array | The matching calls, most recent first (ordered by creation time, then ID). Array order is the only ordering signal — no rank or position field is returned. |
calls[].anonymity_status | string or null | Redaction state for this call: 'not_requested', 'started', 'complete', or 'errored'. 'complete' means anonymized variants of the identity fields exist — but this tool still returns the originals, so treat this as informational rather than as a description of what you received. |
calls[].call_status | string or null | Where the call sits in the scheduling workflow: 'scheduled', 'reached_out', 'not_scheduled', 'done', 'rescheduled', 'not_interested', 'canceled', or 'candidate'. 'done' means the call actually happened. |
calls[].cost | number or null | The call's recorded spend in the project's currency — the 'Cost' column in the web call tracker. null when no cost was recorded. |
calls[].created_at | string or null | ISO 8601 timestamp of when the call record was created in Junior — not when the call took place. See date for that. |
calls[].date | string or null | ISO 8601 timestamp of when the call took place. |
calls[].duration_minutes | number or null | Call duration in minutes, derived from the recording/transcript. null when the duration is unknown. |
calls[].expert | object | Who was interviewed. |
calls[].expert.bio | string or null | The interviewee's background as supplied by the expert network, where one provided it. |
calls[].expert.country | string or null | The interviewee's country, e.g. 'France'. |
calls[].expert.job_title | string or null | The interviewee's job title, e.g. 'VP of Procurement'. |
calls[].expert.name | string or null | The interviewee's name as recorded. Identity fields are returned as-is: MCP does not substitute the anonymized variant, even for calls that have been through redaction, which matches what the Junior web app shows. (The REST API differs — it can return an anonymized name depending on organization settings.) See anonymity_status for whether this call was redacted. |
calls[].expert.organization | string or null | The interviewee's employer. |
calls[].id | string | The call's public ID. Pass it to get_call to re-fetch this one call on its own. |
calls[].kta_approval_status | "approved" or "pending" or null | 'pending' = AI-generated, not yet human-reviewed (treat as draft); 'approved' = reviewed. Omitted when include_ktas=false. |
calls[].ktas | string or null | Key Takeaways as markdown. Omitted when include_ktas=false; null if none have been generated for the call. |
calls[].notes | string or null | Your scratchpad notes from the call (the ScribblePad in the web app). Omitted when include_notes=false. |
calls[].qa_blocks | array | The call's cleaned question-and-answer pairs. Omitted when include_qa=false. |
calls[].qa_blocks[].answer | string or null | The answer, rewritten as a clean standalone statement rather than raw transcript speech. |
calls[].qa_blocks[].id | string | QA block UUID. |
calls[].qa_blocks[].question | string or null | The question as asked. |
calls[].qa_blocks[].section | string or null | The interview-guide section this Q&A came under, e.g. 'Pricing'. null for calls with no guide. |
calls[].rating | number or null | The call's quality rating on a 1–5 scale, as set in the web app. null when nobody has rated it. |
calls[].segment | string or null | The call's segment — a per-project label grouping calls by interviewee type, e.g. 'Buyer' or 'Former Employee'. Call list_projects to see a project's segment vocabulary. |
calls[].source | string or null | Where the call came from — free text, usually an expert-network name such as 'GLG' or 'AlphaSights', or an import label. |
calls[].summary | string or null | The call's AI summary (markdown). Omitted when include_summary=false. |
calls[].transcript | string or null | Verbatim transcript text. Present only when include_transcript=true. |
calls[].transcript_public_id | string or null | Same value as id — transcript and call share one identifier in Junior's data model. |
next_cursor | string or null | Opaque cursor for the next page. Pass it back as cursor to continue; null when this response covered every matching call. |
total_matching | number | How many calls match the filters in total, across every page — not just the ones in this response. Use it to say what you did and did not read ("25 of 137"), to size your pages deliberately rather than discovering the corpus by sweeping it, and to decide before spending context whether to fetch cheaper content instead. |
truncated | boolean | True when more calls matched the filters than max_calls returned. Pair with next_cursor to fetch the rest — do not treat a truncated response as the whole corpus. |
ingest_call
Add a call · requires calls:write
Add a call and its transcript to a project. Use this for calls from sources Junior has no integration with — an expert network that isn't wired up, notes from another tool. The transcript is processed like any upload (cleaning, Q&A extraction, Key Takeaways, entities, search indexing), so it becomes a normal call afterwards. This only creates new calls; it cannot change or delete an existing call. Returns before the call exists: poll list_calls to see it appear.
Parameters
| Parameter | Type | Description |
|---|---|---|
attendee_emails | array of string | People to invite to the call. Emails that don't belong to users in your organization are skipped rather than rejected. |
date | string (date-time) | When the call took place (RFC 3339). UTC or a numeric offset both work; a local time with no offset is rejected. |
expert_organization | string (max 255) | The expert's employer — not your own organization. |
external_id | string (1–255) | The source system's own id for this call. Supply it when you have one: it makes re-sending the same call a no-op instead of creating a duplicate. |
job_title | string (max 255) | The expert's role at that employer, e.g. VP Procurement. |
name required | string (1–255) | The expert's name. |
project_id | string (uuid) | Project to file the call under (get it from list_projects). Omit to leave the call unmatched for someone to assign later. |
source | string (max 255) | Where the call came from, e.g. the expert network's name. |
transcript required | string | The transcript text (plain text or markdown). Not a file upload. |
Response
| Field | Type | Description |
|---|---|---|
external_id | string | The deduplication key used — the one you supplied, or a fingerprint derived from the call's content and identity fields. Reuse it to make a retry a no-op instead of a second call. |
project_id | string or null | The project the call was filed under, or null if it was left unmatched. |
status | string | The call is created and processed asynchronously — it doesn't exist yet when this returns. Poll list_calls to see it appear; expect minutes, not seconds. |
list_calls
List calls · read-only · requires calls:read
List calls (interviews) most recent first. Defaults to calls the authenticated user created (scope="mine"). Pass scope="all" to widen to every call you can access, in a project or not. Access comes from membership of the call's project, being its creator, or a per-call invite — not from sharing an organization with whoever recorded it. Pass project_id to narrow to a single project (works with any scope). Filter params (country, organization, job title, source, segment, rating, cost range, duration range, date range, call type, call status) are AND-combined and applied at query time, so you can fetch 'expert calls with people in France rated 4+ from GLG since March' without paginating through everything. Returns metadata only — use get_call for the transcript, Questions & Answers, and Key Takeaways.
Parameters
| Parameter | Type | Description |
|---|---|---|
call_status | string (1–64) | Exact-match filter on the call's status. Case-sensitive. Valid values: 'scheduled', 'reached_out', 'not_scheduled', 'done', 'rescheduled', 'not_interested', 'canceled', 'candidate'. Most common in queries is 'done' (the call actually happened). |
call_type | "interview" or "meeting" | Filter by call type. 'interview' = expert call, 'meeting' = recorded internal meeting. |
country | string (1–64) | Filter by the expert's country (expert.country). Case-insensitive exact match (e.g. 'France', 'United States'). |
cursor | string | Opaque page token from a previous call's next_cursor. Omit for the first page. |
date_after | string (date-time) | ISO 8601 timestamp. Returns calls whose date is at or after this. Use for date-range queries. |
date_before | string (date-time) | ISO 8601 timestamp. Returns calls whose date is at or before this. |
job_title_contains | string (1–128) | Case-insensitive substring match on the expert's job title (expert.job_title) (e.g. 'VP', 'CFO', 'Engineer'). |
limit | integer (1–100) · default 25 | How many calls to return per page. 1–100. |
max_cost | number (min 0) | Return only calls whose cost is at or below this. Cost is the call's recorded spend in the project's currency — the 'Cost' column in the web call tracker. Combine with min_cost for a range. |
max_duration_minutes | number (min 0) | Return only calls whose transcript duration ≤ this many minutes — the 'Duration' column in the web call tracker. Combine with min_duration_minutes for a range. |
min_cost | number (min 0) | Return only calls whose cost is at or above this. See max_cost. |
min_duration_minutes | number (min 0) | Return only calls whose transcript duration ≥ this many minutes. See max_duration_minutes. |
min_rating | integer (1–5) | Return only calls whose rating is at or above this. 1–5 scale. |
organization_contains | string (1–128) | Case-insensitive substring match on the expert's employer (expert.organization) (e.g. 'Goldman', 'Microsoft'). |
project_id | string (uuid) | Project UUID. Omit to list calls across every accessible project. |
scope | "mine" or "all" or "project" · default "mine" | Which calls to list. "mine" (default) = calls you created — not necessarily ones you recorded or attended. "all" = every call you can access; see the tool description for what grants access. ("project" is a deprecated alias for "all".) Combine with project_id to narrow to a single project. |
segment_contains | string (1–128) | Case-insensitive substring match on the call's segment name — the 'Segment' column in the web call tracker. Segments are per-project labels grouping calls by interviewee type (e.g. 'Buyer', 'Competitor', 'Former Employee'). |
source_contains | string (1–128) | Case-insensitive substring match on the call's source (e.g. 'GLG', 'AlphaSights'). The source field is free text — usually an expert-network name or import label — so substring match handles common variants ('GLG' vs 'Gerson Lehrman'). |
Response
| Field | Type | Description |
|---|---|---|
calls | array | Matching calls, most recent first. |
calls[].call_status | string or null | Where the call sits in the scheduling workflow: 'scheduled', 'reached_out', 'not_scheduled', 'done', 'rescheduled', 'not_interested', 'canceled', or 'candidate'. 'done' means the call actually happened. |
calls[].cost | number or null | The call's recorded spend in the project's currency — the 'Cost' column in the web call tracker. null when no cost was recorded. |
calls[].country | string or null | The interviewee's country, e.g. 'France'. |
calls[].created_at | string or null | ISO 8601 timestamp of when the call record was created in Junior — not when the call took place. See date for that. |
calls[].date | string or null | ISO 8601 timestamp of when the call took place. |
calls[].duration_minutes | number or null | Call duration in minutes, derived from the recording/transcript. null when the duration is unknown. |
calls[].id | string | The call's public ID. Pass as call_id to get_call for the transcript, Questions & Answers, and Key Takeaways. |
calls[].job_title | string or null | The interviewee's job title, e.g. 'VP of Procurement'. |
calls[].name | string or null | The interviewee's name as recorded. Not anonymized: MCP returns the original even for calls that have been through redaction, matching the Junior web app. get_call returns anonymity_status if you need to know whether a call was redacted. |
calls[].organization | string or null | The interviewee's employer. |
calls[].rating | number or null | The call's quality rating on a 1–5 scale, as set in the web app. null when nobody has rated it. |
calls[].segment | string or null | The call's segment — a per-project label grouping calls by interviewee type, e.g. 'Buyer' or 'Former Employee'. Call list_projects to see a project's segment vocabulary. |
calls[].source | string or null | Where the call came from — free text, usually an expert-network name such as 'GLG' or 'AlphaSights', or an import label. |
next_cursor | string or null | Pass as cursor to fetch the next page. null when this is the last page. |
list_entities
List entities in a project · read-only · requires entities:read
List entities (companies, products, etc.) recognized across the calls in a project.
Parameters
| Parameter | Type | Description |
|---|---|---|
cursor | string | Opaque page token from a previous call's next_cursor. Omit for the first page. |
limit | integer (1–200) · default 50 | How many entities to return per page. 1–200. |
project_id required | string (uuid) | Project UUID |
type | string | Optional entity-type filter (e.g. "company", "product"). Omit to return all types. |
Response
| Field | Type | Description |
|---|---|---|
entities | array | Entities recognized across the project's calls. |
entities[].category | string or null | Free-text market category Junior assigned, e.g. 'Electronics' or 'Grocery'. null when none was inferred. |
entities[].competitor_tier | string or null | How close a competitor this is, e.g. 'tier-1'. null for entities that aren't competitors, or when no tier was assigned. Not a mention count — it says nothing about how often the entity came up. |
entities[].created_at | string or null | ISO 8601 timestamp of when the entity was first recognized in this project. |
entities[].description | string or null | One-line description of what the entity is. null when Junior hasn't generated one. |
entities[].domain | string or null | The entity's web domain, where one has been resolved. |
entities[].id | string | Entity UUID. |
entities[].is_competitor | boolean or null | True when this entity is flagged as a competitor in the project. Use it to answer "which competitors came up" without reading every call. |
entities[].name | string or null | Entity name as recognized across the project's calls. |
entities[].overview | string or null | Longer profile of the entity, where one has been generated. null otherwise. |
entities[].type | string or null | Entity type, e.g. 'company' or 'product'. Pass as type to filter. |
next_cursor | string or null | Pass as cursor to fetch the next page. null when this is the last page. |
list_projects
List projects · read-only · requires projects:read
List projects in your organization (most recent first). Defaults to projects you actively run as creator or lead (scope="mine"). Pass scope="all" to include projects you were auto-added to as a member. Each project includes its segments — the segment names calls in that project are tagged with. Read these first when a user asks to filter calls by segment, then pass the exact value to list_calls' segment_contains.
Parameters
| Parameter | Type | Description |
|---|---|---|
cursor | string | Opaque pagination cursor from a previous response |
limit | integer (1–100) · default 25 | Max rows to return (1–100, default 25) |
scope | "mine" or "all" · default "mine" | Which projects to list. "mine" (default) = projects you created or are a lead of. "all" = every project you have any membership in. |
Response
| Field | Type | Description |
|---|---|---|
next_cursor | string or null | Pass as cursor to fetch the next page. null when this is the last page. |
projects | array | Your projects, most recently created first. |
projects[].created_at | string or null | ISO 8601 timestamp of when the project was created. |
projects[].id | string | Project UUID. Pass as project_id elsewhere. |
projects[].is_archived | boolean or null | Always false — archived projects are excluded from all MCP reads. |
projects[].name | string or null | Project name. |
projects[].role | string or null | Your role on this project — 'lead' or 'member'. null on a project you created but were never explicitly added to. |
projects[].sector | string or null | Reserved. Currently returns null. |
projects[].segments | array of string | The segment names calls in this project are tagged with, e.g. 'Buyer', 'Competitor', 'Former Employee'. Segments are per-project — read these before filtering list_calls by segment_contains rather than guessing a value. |
projects[].status | string or null | Lifecycle state of the project, e.g. 'active' or 'pending_deletion'. null when unset. |
projects[].summary | string or null | Short description of the project's research scope. |