The connector has eight 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, entities, to-dos, and published library passages 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 |
get_library_calls | Read whole calls from your transcript library (Alexandria) by the IDs search_library returns — Q&A and Key Takeaways, with library redaction — including calls from projects you're not on | Pull the full calls behind those data center passages |
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_action_items | List your to-dos — AI suggestions from meetings plus approved and manual ones — filtered by project, call, status, or to-dos assigned to you | What open to-dos are assigned to me on the Acme diligence? |
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? |
search_library | Semantic search across your published transcript library (Alexandria) — finds the passages most relevant to a question, with attribution for citation | What did experts say about switching costs? |
Server version 0.16.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. |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
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[].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 analysing 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), or personal=true for your personal calls (no project and not an unmatched expert call). 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. BUDGET 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 (max 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 (max 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. |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
job_title_contains | string (max 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 (max 128) | Case-insensitive substring match on interview.organization (e.g. 'Goldman'). |
personal | boolean | true = pull your personal calls (not in a project and not an unmatched expert call) instead of a project. Pass this or project_id, not both. |
project_id | string (uuid) | Project UUID to pull the corpus from. Get it from list_projects. Required unless personal=true. |
segment_contains | string (max 128) | Case-insensitive substring match on the call's segment name (interview_segment.segment). |
source_contains | string (max 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[].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. |
get_library_calls
Get library calls · read-only · requires library:read
Read whole calls from your organization's published transcript library (Alexandria) by call ID — the IDs search_library returns. Works for any published call in the library, including calls from projects you are not a member of. Returns attribution and the full call as cleaned Q&A, plus Key Takeaways, with the library's redaction applied. Pass up to 50 IDs per request. BUDGET: roughly 5k tokens per call, so 30 calls is ~150k tokens — pass fewer IDs per request, or split the work, when your context is smaller.
Parameters
| Parameter | Type | Description |
|---|---|---|
call_ids required | array of string | Public call IDs — the call_id (or duplicate_call_ids) values from search_library. |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
Response
| Field | Type | Description |
|---|---|---|
calls | array | The requested calls that are in the library. |
calls[].call_id | string | Public ID of the call — the call_id you passed in. |
calls[].interview_date | string | ISO 8601 date the call took place (the upload date when the call date is unknown). |
calls[].interview_job_title | string or null | The interviewee's job title, e.g. 'VP of Procurement'. |
calls[].interview_name | string | The interviewee's name, OR a redacted display identity (e.g. 'VP of Procurement, Acme') when the library's redaction settings hide the real name — either way it is safe to show as attribution. |
calls[].interview_organization | string or null | The interviewee's employer. null when redacted by library settings. |
calls[].key_takeaways | string or null | Markdown summary of the call's most important points, with the library's redaction applied. null when the call has none or your organization's connector does not expose them. |
calls[].project_name | string or null | Name of the project the call belongs to. null when the library hides project details. |
calls[].qa | array | The whole call as cleaned question/answer pairs, in call order, with the library's redaction applied. This is the full call content the library offers — there is no verbatim transcript. |
calls[].qa[].answer | string | — |
calls[].qa[].question | string | — |
unavailable_call_ids | array of string | Requested IDs that are not published in the library (or not visible to your connector). Use get_call for a call from one of your own projects. |
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. CREATES ONLY — 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. |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
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 does NOT exist yet when this returns. Poll list_calls to see it appear; expect minutes, not seconds. |
list_action_items
List to-dos · read-only · requires calls:read
List to-dos (action items) newest first — the same list the user sees on the Junior To-dos page. Includes AI-suggested to-dos extracted from meetings (status SUGGESTED) and approved or manual ones. Narrow with project_id, call_id, status or assigned_to_me; omit them to list every to-do you can access.
Parameters
| Parameter | Type | Description |
|---|---|---|
assigned_to_me | boolean · default false | When true, return only to-dos assigned to you. |
call_id | string (uuid) | Only to-dos from this call (call_id from list_calls). |
cursor | string | Opaque page token from a previous call's next_cursor. Omit for the first page. |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
limit | integer (1–200) · default 50 | How many to-dos to return per page. 1–200. |
project_id | string (uuid) | Only to-dos in this project (id from list_projects). |
status | array of string | Only to-dos in these statuses, e.g. ["NOT_DONE", "IN_PROGRESS"] for open work. Omit for all. |
Response
| Field | Type | Description |
|---|---|---|
action_items | array | To-dos, newest first. |
action_items[].assignee | object or null | Who owns the to-do. null when unassigned. |
action_items[].assignee.email | string | — |
action_items[].assignee.name | string or null | — |
action_items[].assignee.user_id | string | — |
action_items[].call_id | string or null | The call the to-do came from. Pass as call_id to get_call. null for a to-do added directly on /tasks. |
action_items[].call_name | string or null | Name of that call. null when there is no call. |
action_items[].created_at | string | ISO 8601 creation timestamp. |
action_items[].due_date | string or null | ISO 8601 due date. null when none is set. |
action_items[].id | string | To-do UUID. |
action_items[].notes | string | Free-text detail on the to-do. Empty string when none. |
action_items[].project_id | string or null | The project the to-do belongs to. null for a personal call. |
action_items[].project_name | string or null | Name of that project. |
action_items[].source | "ai-generated" or "scratch_notes" or "manual_notes" | 'ai-generated' = extracted from the call transcript, 'scratch_notes' = extracted from the call's notes, 'manual_notes' = added by a person. |
action_items[].source_quote | string or null | The transcript passage an ai-generated to-do was extracted from. null for other sources, or when your organization withholds transcripts. |
action_items[].status | "SUGGESTED" or "NOT_DONE" or "IN_PROGRESS" or "DONE" | 'SUGGESTED' = AI suggestion nobody has approved yet. 'NOT_DONE', 'IN_PROGRESS', 'DONE' = an approved or manual to-do's progress. |
action_items[].title | string | Short statement of what needs doing. |
action_items[].updated_at | string | ISO 8601 last-update timestamp. |
next_cursor | string or null | Pass as cursor to fetch the next page. null when this is the last page. |
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), or personal: true for only personal calls (no project and not an unmatched expert call). 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 (max 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 (max 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. |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
job_title_contains | string (max 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 (max 128) | Case-insensitive substring match on the expert's employer (expert.organization) (e.g. 'Goldman', 'Microsoft'). |
personal | boolean | true = only personal calls: not in a project and not an unmatched expert call (an expert-network transcript or detected expert call still waiting for a project). false = every other call. Omit for both. Cannot be combined with project_id. |
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 (max 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 (max 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. |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
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 |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
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. |
search_library
Search transcript library · read-only · requires library:read
Semantic search over your organization's published transcript library (Alexandria). Returns the transcript passages most relevant to your queries, with interviewee attribution for citation. Use natural-language queries (e.g. 'why customers switched away from the incumbent'), not single keywords. Pass 2-4 queries to capture different phrasings. Scoped to your own organization and to calls that have been published into the library. Re-uploads of the same recording are collapsed into one call. Use get_library_calls with a result's call_id to read the whole call, and list_calls / get_call for calls that are not in the library.
Parameters
| Parameter | Type | Description |
|---|---|---|
date_after | string (date-time) | ISO 8601 timestamp. Only return passages from calls on or after this date (the call date, or the upload date when the call date is unknown). |
date_before | string (date-time) | ISO 8601 timestamp. Only return passages from calls on or before this date (the call date, or the upload date when the call date is unknown). |
intent | string | One short sentence, in plain words, on what the user is trying to accomplish with this call — e.g. 'find pricing objections from enterprise buyers for a board deck'. Used to ensure relevant responses. |
limit | integer (1–100) | Max passages to return, most relevant first (1-100, default 50). BUDGET: roughly 300 tokens per passage, so the default is ~15k tokens. Lower it for a quick fact-check; raise it for a broad synthesis across the library. |
only_my_calls | boolean | Set true to search only your calls: calls you recorded or uploaded, calls you were invited to through a calendar or expert-network invite, and calls in projects you're a team member of. Calls outside your projects that you joined without an invite are not included. Use it for questions such as 'which calls have I done on X' or 'what did experts on my calls say about Y'. An empty result means none of those calls matched. |
project_ids | array of string | Restrict the search to these project UUIDs. Omit to search the whole library — do NOT pass an empty array (it is rejected, not treated as 'all'). |
queries required | array of string | Natural-language search queries. Use 2-4 descriptive queries (4-8 words each) to capture different phrasings of the topic. Avoid single-word keywords. |
Response
| Field | Type | Description |
|---|---|---|
results | array | Matching transcript passages, most relevant first. |
results[].answer | string | The matched transcript passage — the expert's answer. This is the evidence to quote. |
results[].call_id | string | Public ID of the call this passage came from. Passages sharing a call_id are the same expert, so key citations on it (two experts can share a role and employer). |
results[].duplicate_call_ids | array of string | Other calls in these results that are re-uploads of the same recording (same expert, date and length). Their passages are left out so one interview can't fill the results — count them as one interview, not several. |
results[].interview_date | string or null | ISO 8601 date the call took place. null when unknown. |
results[].interview_job_title | string or null | The interviewee's job title, e.g. 'VP of Procurement'. |
results[].interview_name | string or null | The interviewee's name, OR a redacted display identity (e.g. 'VP of Procurement, Acme') when the library's redaction settings hide the real name — either way it is safe to show as attribution. |
results[].interview_organization | string or null | The interviewee's employer. null when redacted by library settings. |
results[].project_name | string or null | Name of the project the call belongs to. null when the library hides project details. |
results[].question | string | The question the passage answers. Empty string when the block has no distinct question. |
results[].score | number | Relevance score for this passage. Higher is more relevant. Use it to rank, not as an absolute threshold. |