# MCP tool reference

Junior's MCP connector exposes 4 read-only tools. Every tool is scoped to the signed-in user: it returns only the projects, calls, and entities that user can already see in the Junior web app.

You don't call these yourself — the assistant picks the right one from what you ask. This page is here so you can see exactly what it can reach. For phrasing that works well, see [What you can ask](/mcp-connector).

## At a glance

| Tool | What it does | Example ask |
|  --- | --- | --- |
| `get_call` | Read one call — summary, Key Takeaways, Q&A, and optionally the transcript | *Summarise the call with the former Head of Procurement* |
| `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 | *Which competitors came up most across the 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.5.0` — this changes whenever a tool name, parameter, or response shape changes, so clients that cache tool definitions can tell they need to refresh.

## Reference

Parameters and response fields for each tool — useful for security review or for anyone building against the same data.

### 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. Under the hood this is transcript.public_id (transcript and call share one identifier in Junior's data model). |
| `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 | 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 | 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 | null | — |
| `created_at` | string | 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 | null | ISO 8601 timestamp of when the call took place. |
| `duration_minutes` | number | null | Call duration in minutes, derived from the recording/transcript. `null` when the duration is unknown. |
| `expert` | object | Who was interviewed. |
| `expert.bio` | string | null | — |
| `expert.country` | string | null | The interviewee's country, e.g. 'France'. |
| `expert.job_title` | string | null | The interviewee's job title, e.g. 'VP of Procurement'. |
| `expert.name` | string | 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 | null | The interviewee's employer. |
| `id` | string | The call's public ID — the value you passed in. |
| `kta_approval_status` | `"approved"` | `"pending"` | null | 'pending' = AI-generated, not yet human-reviewed (treat as draft); 'approved' = reviewed. Omitted when include_ktas=false. |
| `ktas` | string | null | Key Takeaways as markdown. Omitted when include_ktas=false; null if none have been generated for the call. |
| `notes` | string | null | Your scratchpad notes from the call (the ScribblePad — transcript.scribble_pad). 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 | 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 | null | The question as asked. |
| `qa_blocks[].section` | string | null | — |
| `rating` | number | null | — |
| `segment` | string | 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 | null | Where the call came from — free text, usually an expert-network name such as 'GLG' or 'AlphaSights', or an import label. |
| `summary` | string | null | The call's AI summary (markdown). Omitted when include_summary=false. |
| `transcript` | string | null | Verbatim transcript text. Present only when include_transcript=true. |
| `transcript_public_id` | string | null | Same value as `id` — transcript and call share one identifier in Junior's data model. |


### list_calls

**List calls** · read-only · requires `calls:read`

List calls (interviews) most recent first. Defaults to calls the authenticated user personally conducted (scope="mine"). Pass scope="all" to widen to every call you can access — project calls, teammates' calls, and your own uncategorized (not-yet-filed) calls. 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 interview.call_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"` | `"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', 'United States'). |
| `cursor` | string | — |
| `date_after` | string (date-time) | ISO 8601 timestamp. Returns calls with interview.date >= this. Use for date-range queries. |
| `date_before` | string (date-time) | ISO 8601 timestamp. Returns calls with interview.date <= this. |
| `job_title_contains` | string (1–128) | Case-insensitive substring match on interview.job_title (e.g. 'VP', 'CFO', 'Engineer'). |
| `limit` | integer (1–100) · default `25` | — |
| `max_cost` | number (min 0) | Return only calls with interview.cost <= 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 with interview.cost >= 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 with interview.rating >= this. 1–5 scale. |
| `organization_contains` | string (1–128) | Case-insensitive substring match on interview.organization (e.g. 'Goldman', 'Microsoft'). |
| `project_id` | string (uuid) | Project UUID. Omit to list calls across every accessible project. |
| `scope` | `"mine"` | `"all"` | `"project"` · default `"mine"` | Which calls to list. "mine" (default) = calls you personally conducted (interview.created_by = you). "all" = every call you can access: project calls, teammates' calls, and your own uncategorized (not-yet-filed) calls. ("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 (interview_segment.segment) — 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 interview.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 | 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 | null | — |
| `calls[].country` | string | null | The interviewee's country, e.g. 'France'. |
| `calls[].created_at` | string | 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 | null | ISO 8601 timestamp of when the call took place. |
| `calls[].duration_minutes` | number | 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 | null | The interviewee's job title, e.g. 'VP of Procurement'. |
| `calls[].name` | string | 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 | null | The interviewee's employer. |
| `calls[].rating` | number | null | — |
| `calls[].segment` | string | 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 | 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 | 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 | — |
| `limit` | integer (1–200) · default `50` | — |
| `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 | null | — |
| `entities[].competitor_tier` | string | null | — |
| `entities[].created_at` | string | null | ISO 8601 timestamp of when the entity was first recognized in this project. |
| `entities[].description` | string | null | — |
| `entities[].domain` | string | null | The entity's web domain, where one has been resolved. |
| `entities[].id` | string | Entity UUID. |
| `entities[].is_competitor` | boolean | null | — |
| `entities[].name` | string | null | Entity name as recognized across the project's calls. |
| `entities[].overview` | string | null | — |
| `entities[].type` | string | null | Entity type, e.g. 'company' or 'product'. Pass as `type` to filter. |
| `next_cursor` | string | 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 |
| `include_archived` | boolean · default `false` | Include archived projects in the result |
| `limit` | integer (1–100) · default `25` | Max rows to return (1–100, default 25) |
| `scope` | `"mine"` | `"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 | 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 | null | ISO 8601 timestamp of when the project was created. |
| `projects[].id` | string | Project UUID. Pass as `project_id` elsewhere. |
| `projects[].is_archived` | boolean | null | Archived projects are hidden by default; pass `include_archived` to list them. |
| `projects[].name` | string | null | Project name. |
| `projects[].role` | string | null | Your role on this project — 'lead' or 'member'. `null` on a project you created but were never explicitly added to. |
| `projects[].sector` | string | 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 | null | — |
| `projects[].summary` | string | null | Short description of the project's research scope. |