Skip to content

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.

All tools
ToolAccessSafe to repeat
get_workspacereadyes
list_roundsreadyes
create_roundwriteyes
get_round_summaryreadyes
search_investorsreadyes
get_investorreadyes
add_investorwriteyes
add_investorswriteyes
update_investorwriteno
add_to_roundwriteyes
move_stagewriteyes
log_activitywritewith idempotency_key
set_follow_upwriteyes
list_due_follow_upsreadyes
record_commitmentwriteyes
import_investors_csvwriteno
export_roundreadyes

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 returns not_found with the three closest names; more than one returns ambiguous_reference with 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_required with the open rounds listed.
  • stage: a stage key or label, case-insensitive (dd or Diligence).
  • dates are YYYY-MM-DD in 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.

instructions
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.

list_rounds parameters
NameTypeRequiredDescription
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.

create_round parameters
NameTypeRequiredDescription
namestring 1-80yese.g. "Seed" or "Seed Extension".
target_amountinteger or "2M"Whole units.
currencystring3-letter code. Default: the workspace currency.
instrumentstringsafe (default), priced, convertible_note or other.
valuation_capintegerOptional.
target_close_ondateYYYY-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'.

get_round_summary parameters
NameTypeRequiredDescription
roundstringRound 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.

search_investors parameters
NameTypeRequiredDescription
querystringWords that must all match.
roundstringRound id, slug or name. Limits results to that round's participants.
stagestring | string[]Stage key(s) or label(s).
fit_mininteger 0-5Minimum fit.
tagsstring[]All must match.
industriesstring[]Any may match.
typeinvestor typevc, 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.
limitinteger 1-100Default 25.
cursorstringFrom 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.

get_investor parameters
NameTypeRequiredDescription
investorstringyesId, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization.
roundstringRound id, slug or name. Filters the timeline and the participation shown.
timeline_limitinteger 1-100Default 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.

add_investor parameters
NameTypeRequiredDescription
namestring 1-200yesFull name.
firmstringFund or company.
titlestringPartner, Principal, Angel…
typeinvestor typevc, angel, family_office, corporate_vc, accelerator, scout, other.
emailstringUsed for dedupe.
linkedinstringProfile URL. Used for dedupe.
websitestringURL.
xstringURL or @handle.
locationstringCity or region.
check_min, check_maxintegerCheck size range in whole units.
check_notestringFree text, e.g. "$250k-$1M, leads". Parsed for min and max.
stage_focus, industries, tagsstring[]Lists.
notesstringResearch notes.
source, warm_intro_bystringWhere you met, who introduced you.
on_duplicate"fill_empty" | "return_existing" | "create_anyway"Default fill_empty (never overwrites).
roundstringRound id, slug or name. Also adds the investor to this round. Omitted with any option below: the single open round.
stagestringStage in that round. Default: the first stage.
fitinteger 0-50 = unrated; 5 hot, 4 warm, 3 maybe, 1-2 low.
follow_up_on, follow_up_notedate, stringSet the next follow-up in the same call.
next_stepstringOne line.
amount_softinteger or "250k"Soft-circled amount.

Returns{investor, created, matched_on?: email | linkedin | name_firm | name, filled_fields?, not_applied?, hint?, round?, participant?, warning?}

Example arguments
{"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.

add_investors parameters
NameTypeRequiredDescription
itemsobject[] 1-50yesadd_investor arguments, one object per investor.
roundstringRound 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.

update_investor parameters
NameTypeRequiredDescription
investorstringyesId, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization.
setobjectAny add_investor contact field. null clears it.
add_tags, remove_tagsstring[]Edit tags in place.
add_industriesstring[]Append industries.
append_notesstringAdds "[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).

add_to_round parameters
NameTypeRequiredDescription
investorstringyesId, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization.
roundstringRound id, slug or name. Omit it when the workspace has exactly one open round.
stagestringStage key or label.
fitinteger 0-5Fit.
probabilityinteger 0-100Chance they invest, for the weighted pipeline.
amount_softintegerSoft-circled amount.
next_stepstringOne line.
follow_up_ondateYYYY-MM-DD.
owner_emailstringA 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.

move_stage parameters
NameTypeRequiredDescription
investorstringyesId, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization.
stagestringyesStage key or label.
roundstringRound id, slug or name. Omit it when the workspace has exactly one open round.
notestring ≤2000Why. 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.

log_activity parameters
NameTypeRequiredDescription
investorstringyesId, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization.
kind"note" | "email" | "call" | "meeting"yesWhat kind of thing happened.
bodystring 1-20000yesWhat happened, in plain words.
occurred_atstringRFC 3339, or a date (read as 12:00 local time).
roundstringRound id, slug or name. Omit for activity that is not about one round.
direction"inbound" | "outbound"For emails and calls.
idempotency_keystring ≤200Repeat 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).

set_follow_up parameters
NameTypeRequiredDescription
investorstringyesId, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization.
roundstringRound id, slug or name. Omit it when the workspace has exactly one open round.
ondateYYYY-MM-DD.
in_daysinteger 0-365Days from today.
clearbooleanRemove the follow-up.
notestring ≤500What 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.

list_due_follow_ups parameters
NameTypeRequiredDescription
roundstringRound id, slug or name. Omit to cover all open rounds.
within_daysinteger 0-60Default 0 (overdue and today only).
include_overduebooleanDefault true.
limitinteger 1-200Default 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.

record_commitment parameters
NameTypeRequiredDescription
investorstringyesId, email, LinkedIn URL, "Name" or "Name @ Firm". Exact match after normalization.
amountinteger ≥ 0yesTotal commitment. 0 clears it.
roundstringRound id, slug or name. Omit it when the workspace has exactly one open round.
committed_ondateDefault today.
notestringShown on the timeline.
move_to_wonbooleanDefault 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.

import_investors_csv parameters
NameTypeRequiredDescription
csvstring ≤2 MByesCSV text with a header row.
roundstringRound id, slug or name. Adds imported investors to this round.
mappingobject{"Column header": "field" | null}.
default_stagestringFor 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.
sourcestringFills source on rows without one, e.g. "Robotics Demo Night".
dry_runbooleanDefault 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).

export_round parameters
NameTypeRequiredDescription
roundstringRound id, slug or name. Omit it when the workspace has exactly one open round.
format"json" | "csv"Default json.
include_activitiesbooleanjson 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.