Docs · MCP
MCP tools reference
Fifteen tools, written for language models: plain descriptions, forgiving references, and idempotent writes where it matters. They call the same code as the REST API, so the rules are the same everywhere. None of them deletes anything.
| Tool | Access | Safe to repeat |
|---|---|---|
| get_workspace | read | yes |
| list_rounds | read | yes |
| create_round | write | yes |
| get_round_summary | read | yes |
| search_investors | read | yes |
| get_investor | read | yes |
| add_investor | write | yes |
| add_investors | write | yes |
| update_investor | write | no |
| add_to_round | write | yes |
| move_stage | write | yes |
| log_activity | write | with idempotency_key |
| set_follow_up | write | yes |
| list_due_follow_ups | read | yes |
| record_commitment | write | yes |
| import_investors_csv | write | no |
| export_round | read | yes |
How references work#
- investor: a UUID, an email, a LinkedIn URL,
"Name"or"Name @ Firm". Matching is exact after normalization (case, accents, punctuation), not fuzzy. No match returnsnot_foundwith the three closest names; more than one returnsambiguous_referencewith the candidates. - round: a UUID, slug or name, case-insensitive. Where a round is required and you leave it out, Raisebook uses the only open round, or answers
round_requiredwith the open rounds listed. - stage: a stage key or label, case-insensitive (
ddorDiligence). - dates are
YYYY-MM-DDin the workspace timezone; amounts are whole units of the round currency.
Server instructions#
Clients receive this text when they connect. It is the short version of this page.
Raisebook is the founder's fundraising CRM: rounds, investors, and each investor's stage in a round. Your API key belongs to one workspace (one company). Start with get_workspace to learn the rounds, valid stage keys and today's date in the workspace timezone. Refer to investors by id, email, LinkedIn URL, or exact name ("Name" or "Name @ Firm"). Refer to rounds by id, slug or name; you may omit the round when the workspace has exactly one open round. Amounts are whole units of the round's currency (250000 means $250k). Dates are YYYY-MM-DD. add_investor deduplicates by email, LinkedIn and name+firm, so call it directly instead of searching first. Use log_activity for what happened (email sent, call, meeting), set_follow_up for what should happen next, move_stage when the relationship advances, and record_commitment only when the investor has actually committed. Every write is recorded on the investor's timeline under your agent name, and the founder sees it. Never invent investor details; leave unknown fields empty. import_investors_csv defaults to dry_run=true: show the human the preview counts, then rerun with dry_run=false.get_workspaceread#
Who am I and what's here: workspace name, timezone and today's date, your scopes and agent name, every round with its stage keys, and the allowed investor types and activity kinds. Call this first.
No parameters.
Returns{workspace: {id, name, slug, is_sandbox, timezone, today, weekday, default_currency}, you: {agent_name, scopes, key_prefix}, rounds: [{id, slug, name, status, currency, target_amount, stages: [{key, label, kind}]}], investor_types, loggable_activity_kinds}
list_roundsread#
List fundraising rounds with target, committed amount and participant counts per stage kind. Use the slug or name as round in other tools.
| Name | Type | Required | Description |
|---|---|---|---|
| status | "open" | "closed" | "all" | Default "open". |
Returns{rounds: [{id, slug, name, status, instrument, currency, target_amount, committed_amount, target_close_on?, counts: {total, open, active, won, lost}}]}
create_roundwriteidempotent#
Create a fundraising round with the default stages (New, Researching, Contacted, Replied, Meeting, Diligence, Committed, Passed). Safe to repeat: if a round with this name exists, it is returned unchanged with created: false. Returns the round with its stage keys, ready for add_investor / add_to_round.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string 1-80 | yes | e.g. "Seed" or "Seed Extension". |
| target_amount | integer or "2M" | Whole units. | |
| currency | string | 3-letter code. Default: the workspace currency. | |
| instrument | string | safe (default), priced, convertible_note or other. | |
| valuation_cap | integer | Optional. | |
| target_close_on | date | YYYY-MM-DD. |
Returns{created, round: {id, slug, name, status, instrument, currency, target_amount, stages: [{key, label, kind}]}}
get_round_summaryread#
The state of a round in one call: committed vs target, soft-circled and weighted pipeline, investors per stage, overdue and upcoming follow-ups, stale conversations (no activity for 14+ days), recent activity and warnings. Use it for status updates and 'what should I do today'.
| Name | Type | Required | Description |
|---|---|---|---|
| round | string | Round id, slug or name. Omit it when the workspace has exactly one open round. |
ReturnsRoundSummary: {round, money: {currency, target, committed, pct_of_target, soft_circled, weighted_pipeline, committed_count}, funnel, counts, follow_ups: {overdue, today, next_7_days, top}, stale, recent_activity, warnings}
search_investorsread#
Find investors. query matches name, firm, title, email, location, tags, industries, source and notes (all words must match). Without round, it searches all workspace contacts and shows each one's stage in every round. With round (or any of stage/fit_min/follow_up, which imply the single open round), it returns investors in that round with stage, fit, follow-up and amounts.
| Name | Type | Required | Description |
|---|---|---|---|
| query | string | Words that must all match. | |
| round | string | Round id, slug or name. Limits results to that round's participants. | |
| stage | string | string[] | Stage key(s) or label(s). | |
| fit_min | integer 0-5 | Minimum fit. | |
| tags | string[] | All must match. | |
| industries | string[] | Any may match. | |
| type | investor type | vc, angel, family_office, corporate_vc, accelerator, scout, other. | |
| follow_up | "due" | "week" | "none" | Due now, due within a week, or no follow-up set. | |
| sort | "fit" | "name" | "follow_up" | "recent" | "stage" | Default fit in a round, name for contacts. | |
| limit | integer 1-100 | Default 25. | |
| cursor | string | From next_cursor. |
Returns{round?: {slug, name}, results: [investor + stage, fit, priority, follow_up_on, amounts (in a round) or rounds: [{round_slug, stage_key, fit}]], next_cursor?, total}
get_investorread#
Everything about one investor: contact fields, notes, their stage and terms in every round, and the timeline (newest first) with who did what, including agent actions.
| Name | Type | Required | Description |
|---|---|---|---|
| investor | string | yes | Id, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization. |
| round | string | Round id, slug or name. Filters the timeline and the participation shown. | |
| timeline_limit | integer 1-100 | Default 20. |
Returns{investor, participations: Participant[], timeline: Activity[], timeline_truncated}
add_investorwriteidempotent#
Add an investor contact, or find the existing one and fill in what it is missing. Dedupes by email, then LinkedIn profile, then name+firm, then the name alone when there is exactly one person with that name; matched_on tells you which. on_duplicate: fill_empty (default: fill empty fields, merge tags, and append new notes as a dated paragraph; it never overwrites), return_existing (change nothing; not_applied lists the fields you sent that were not saved), create_anyway (ignore name matches; email/LinkedIn duplicates are never created). Pass round (and optionally stage, fit, follow_up_on, follow_up_note, next_step, amount_soft) to also put them on that round's board in the same call. Leave unknown fields out.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string 1-200 | yes | Full name. |
| firm | string | Fund or company. | |
| title | string | Partner, Principal, Angel… | |
| type | investor type | vc, angel, family_office, corporate_vc, accelerator, scout, other. | |
| string | Used for dedupe. | ||
| string | Profile URL. Used for dedupe. | ||
| website | string | URL. | |
| x | string | URL or @handle. | |
| location | string | City or region. | |
| check_min, check_max | integer | Check size range in whole units. | |
| check_note | string | Free text, e.g. "$250k-$1M, leads". Parsed for min and max. | |
| stage_focus, industries, tags | string[] | Lists. | |
| notes | string | Research notes. | |
| source, warm_intro_by | string | Where you met, who introduced you. | |
| on_duplicate | "fill_empty" | "return_existing" | "create_anyway" | Default fill_empty (never overwrites). | |
| round | string | Round id, slug or name. Also adds the investor to this round. Omitted with any option below: the single open round. | |
| stage | string | Stage in that round. Default: the first stage. | |
| fit | integer 0-5 | 0 = unrated; 5 hot, 4 warm, 3 maybe, 1-2 low. | |
| follow_up_on, follow_up_note | date, string | Set the next follow-up in the same call. | |
| next_step | string | One line. | |
| amount_soft | integer or "250k" | Soft-circled amount. |
Returns{investor, created, matched_on?: email | linkedin | name_firm | name, filled_fields?, not_applied?, hint?, round?, participant?, warning?}
{"name": "Dana Whitfield", "firm": "Harbor Light Ventures", "email": "dana@example.com", "type": "vc", "round": "seed", "stage": "research", "fit": 4}add_investorswriteidempotent#
Add up to 50 investors in one call, each exactly as add_investor would (same dedupe and on_duplicate rules), optionally all on one round. Each item takes add_investor's contact fields plus its own stage, fit, follow_up_on, follow_up_note, next_step and amount_soft. Returns one compact line per item (id, name, created or matched_on, and any error), so one bad item does not stop the rest.
| Name | Type | Required | Description |
|---|---|---|---|
| items | object[] 1-50 | yes | add_investor arguments, one object per investor. |
| round | string | Round id, slug or name. Adds every item to this round. | |
| on_duplicate | "fill_empty" | "return_existing" | "create_anyway" | Default fill_empty. |
Returns{counts: {created, existing, errors}, results: [{item, id, name, created, matched_on?, not_applied?, stage?, error?}]}
update_investorwrite#
Change an investor's contact fields. Only keys in set change; null clears a field. Use add_tags/remove_tags to edit tags without rewriting the list, and append_notes to add a dated paragraph to their notes instead of replacing them. Round-specific fields (stage, fit, follow-up, amounts) are changed with add_to_round, move_stage, set_follow_up and record_commitment.
| Name | Type | Required | Description |
|---|---|---|---|
| investor | string | yes | Id, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization. |
| set | object | Any add_investor contact field. null clears it. | |
| add_tags, remove_tags | string[] | Edit tags in place. | |
| add_industries | string[] | Append industries. | |
| append_notes | string | Adds "[YYYY-MM-DD, agent name] text" as a new paragraph. |
Returns{investor, changed_fields} (an empty list means nothing changed and nothing was logged)
add_to_roundwriteidempotent#
Put an investor on a round's board, or update their round fields if they are already there. Safe to repeat. New participants start in the first stage unless you pass stage. For an existing participant, a different stage moves them (logged as a stage change).
| Name | Type | Required | Description |
|---|---|---|---|
| investor | string | yes | Id, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization. |
| round | string | Round id, slug or name. Omit it when the workspace has exactly one open round. | |
| stage | string | Stage key or label. | |
| fit | integer 0-5 | Fit. | |
| probability | integer 0-100 | Chance they invest, for the weighted pipeline. | |
| amount_soft | integer | Soft-circled amount. | |
| next_step | string | One line. | |
| follow_up_on | date | YYYY-MM-DD. | |
| owner_email | string | A member who owns this conversation. |
Returns{participant, created, changed}
move_stagewriteidempotent#
Move an investor to another stage in a round (for example contacted → meeting). Moving to the current stage does nothing. Add note to explain why; it appears on the timeline. To mark a commitment with an amount, use record_commitment instead of moving to the won stage.
| Name | Type | Required | Description |
|---|---|---|---|
| investor | string | yes | Id, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization. |
| stage | string | yes | Stage key or label. |
| round | string | Round id, slug or name. Omit it when the workspace has exactly one open round. | |
| note | string ≤2000 | Why. Shown on the timeline. |
Returns{participant, changed, from, to}. Errors: not_in_round (use add_to_round), stage_not_found (lists valid keys).
log_activitywrite#
Record something that happened with an investor: a note, an email (sent or received), a call or a meeting. body is what happened in plain words. occurred_at defaults to now; past dates are fine, and a future meeting time records a scheduled meeting. Pass round when it concerns a specific round. Pass a stable idempotency_key (for example an email message id) to make retries safe.
| Name | Type | Required | Description |
|---|---|---|---|
| investor | string | yes | Id, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization. |
| kind | "note" | "email" | "call" | "meeting" | yes | What kind of thing happened. |
| body | string 1-20000 | yes | What happened, in plain words. |
| occurred_at | string | RFC 3339, or a date (read as 12:00 local time). | |
| round | string | Round id, slug or name. Omit for activity that is not about one round. | |
| direction | "inbound" | "outbound" | For emails and calls. | |
| idempotency_key | string ≤200 | Repeat calls with the same key return the first activity. |
Returns{activity, duplicate}
set_follow_upwriteidempotent#
Set or clear the date you should next follow up with an investor in a round. Give exactly one of on (YYYY-MM-DD), in_days (from today in the workspace timezone) or clear: true. note says what the follow-up is for (shown in the follow-up list).
| Name | Type | Required | Description |
|---|---|---|---|
| investor | string | yes | Id, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization. |
| round | string | Round id, slug or name. Omit it when the workspace has exactly one open round. | |
| on | date | YYYY-MM-DD. | |
| in_days | integer 0-365 | Days from today. | |
| clear | boolean | Remove the follow-up. | |
| note | string ≤500 | What the follow-up is for. |
Returns{participant, changed}
list_due_follow_upsread#
Follow-ups that are due: overdue first, then today, then (with within_days > 0) the next N days. Without round, it covers all open rounds. Use it to plan the founder's outreach for the day; for 'this week', pass within_days=7. counts always includes next_7_days and next_due_on, so an empty list never hides a busy week ahead.
| Name | Type | Required | Description |
|---|---|---|---|
| round | string | Round id, slug or name. Omit to cover all open rounds. | |
| within_days | integer 0-60 | Default 0 (overdue and today only). | |
| include_overdue | boolean | Default true. | |
| limit | integer 1-200 | Default 50. |
Returns{today, weekday, items: FollowUpItem[], counts: {overdue, today, upcoming, next_7_days, next_due_on?}}
record_commitmentwriteidempotent#
Record that an investor committed money to a round. amount is the total commitment in whole currency units (it replaces any earlier amount; it is not added to it), and 0 clears it. By default this also moves them to the round's won stage (Committed) and adds them to the round if needed.
| Name | Type | Required | Description |
|---|---|---|---|
| investor | string | yes | Id, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization. |
| amount | integer ≥ 0 | yes | Total commitment. 0 clears it. |
| round | string | Round id, slug or name. Omit it when the workspace has exactly one open round. | |
| committed_on | date | Default today. | |
| note | string | Shown on the timeline. | |
| move_to_won | boolean | Default true. |
Returns{participant, previous_amount?, moved_stage, round_committed_total}
import_investors_csvwrite#
Import investors from CSV text (first row = headers). Columns are auto-mapped from common headers (Name, Firm/Fund/Company, Email, LinkedIn, Type, Check size, Tags, Stage, Fit, Follow up…); pass mapping to override ({"Column header": "field" or null to ignore}). Existing investors are matched like add_investor. dry_run defaults to true and returns a preview with counts and per-row actions; show it to the human, then call again with dry_run=false. With round, imported investors are added to that round, and the stage, fit, follow-up and amount columns apply.
| Name | Type | Required | Description |
|---|---|---|---|
| csv | string ≤2 MB | yes | CSV text with a header row. |
| round | string | Round id, slug or name. Adds imported investors to this round. | |
| mapping | object | {"Column header": "field" | null}. | |
| default_stage | string | For rows without a stage. | |
| on_duplicate | "skip" | "fill_empty" | "update" | skip (default) leaves existing investors and their round fields untouched; fill_empty fills blanks; update overwrites with non-empty CSV values and applies the round columns. | |
| source | string | Fills source on rows without one, e.g. "Robotics Demo Night". | |
| dry_run | boolean | Default true. Nothing is written until false. |
ReturnsDry run: {counts, mapping, warnings, rows} where rows lists only updates, skips, errors and rows with warnings (plain creates are counted). Otherwise: {import_run_id, counts, errors, created: [{row, id, name}]}.
export_roundread#
Export a round's pipeline: every investor in the round with contact fields, stage, fit, follow-up, amounts and last activity date. format=csv gives spreadsheet-ready text; json gives structured data. Set include_activities to add each investor's timeline (json only).
| Name | Type | Required | Description |
|---|---|---|---|
| round | string | Round id, slug or name. Omit it when the workspace has exactly one open round. | |
| format | "json" | "csv" | Default json. | |
| include_activities | boolean | json only. Default false. |
Returns{round: {slug, name}, format, filename, row_count, content}. Over 1 MB: payload_too_large with the REST URL to use.
Setting up a client? Connect an agent.