# Fund Momentum MCP — tools reference

Plain Markdown on purpose. Readable by a person, and by whatever assistant you
paste this URL into.

- **Endpoint:** `https://fundmomentum.vc/_api/mcp`
- **Transport:** Streamable HTTP (MCP)
- **Coverage:** 1,120 actively deploying VC funds, and 710 disclosed LPs across 64 HQ countries, 310 of which have backed emerging managers
- **LP data, two tools, two access models:** `check_lp_coverage` is free and returns
  COUNTS ONLY — how many LPs match a country and LP type — with no key needed.
  `search_lps` returns LP records and requires an LP Radar subscription
  (EUR 199 per month or EUR 1,499 per year, https://fundmomentum.vc/lp-radar). LP records are NOT sold per call, on
  agent credits or on the keyless trial. Commitment history is not served over MCP at all.
- **Every tool is read-only.** Nothing you call here changes anything, in your
  account or in ours. All 8 carry `readOnlyHint: true`.

## Try it with no key at all

```bash
curl -s -X POST https://fundmomentum.vc/_api/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"search_funds","arguments":{"country":"Austria","limit":3}}}'
```

`search_funds`, `get_fund`, `get_changes`, `check_lp_coverage` answer 10 calls per caller per
UTC day, combined, with no credential and no signup.

## Add it to a client

```bash
claude mcp add --transport http fund-momentum https://fundmomentum.vc/_api/mcp
```

Cursor, Windsurf, VS Code and anything else that speaks remote MCP over
Streamable HTTP take the same URL. ChatGPT's connectors cannot send a custom
header, so pass the key in the URL instead: `https://fundmomentum.vc/_api/mcp?api_key=YOUR_KEY`
with "No authentication" selected.

## The order to call things in

Most failed calls against this server are a slug that was invented rather than
looked up. The sequence that works:

1. **`search_funds`** — or `match_startup` if the brief is qualitative. Both
   return a `slug` for every result.
2. **`get_fund`** — pass a slug from step 1, never one built from a fund's name.
   A near-miss is resolved only when exactly one fund matches (different case or
   spacing, or a name that is a hyphen-boundary prefix of one real slug, such as
   `speedinvest-africa`). It is then served with `resolved_from` set to what you
   asked for; use the real slug next time. A name matching several funds
   (`speedinvest`) is listed, not guessed. Applies to `get_fund`,
   `get_fund_signals` and `get_gp_profile`, before any payment.
3. **`get_fund_signals`** or **`get_gp_profile`** — drill into a fund you have
   already identified.
4. **`get_changes`** — afterwards, to stay current without re-running step 1.

For limited partners: **`check_lp_coverage`** first (free, counts only), then
**`search_lps`** if you hold LP Radar.

## Free tools

### `search_funds`

**Search VC funds** · Free tier · read-only

START HERE for any question about funds. Search actively deploying venture capital funds by stage, country and industry. COST: free, and it works with no API key at all. Returns name, slug, country, stage, fund size, industries and a durable profile URL. The `slug` in each result is what every other tool takes as input, so run this first and copy the slug rather than constructing one from a fund's name.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `stage` | string | no | Funding stage focus. Must be one of the listed enum values (lowercase, underscores). Common spellings such as 'Pre-Seed' or 'Series A' are accepted and normalised. One of 7 enum values. |
| `country` | string | no | Country of the fund's headquarters, spelled out in full (e.g. 'United States', 'United Kingdom', 'Germany'). Not an ISO code. |
| `industry` | string | no | Industry focus. Must be one of the listed enum values (lowercase, underscores), e.g. 'ai_ml', 'fintech', 'climate_sustainability'. Common spellings such as 'AI/ML', 'FinTech' or 'climate' are accepted and normalised. One of 54 enum values. |
| `limit` | integer | no | Number of results to return (1-20) |

**Accepted `stage` values** (7):

```
growth, late_stage, pre_seed, seed, series_a, series_b, series_c
```

**Accepted `industry` values** (54):

```
agritech, ai_ml, biotech, built_environment, carbon_removal, circular_economy, climate_sustainability, cloud_devops, consumer_commerce, creator_economy, cybersecurity, data_infrastructure, deep_tech, defense, developer_tools, diagnostics, digital_banking, digital_education_consumer, digital_health, digital_infrastructure, ecommerce, energy_tech, enterprise_software, evs_charging, fashion_tech, fem_tech, fintech, food_beverage, food_tech, gaming, infrastructure_tech, insur_tech, iot, manufacturing, marketplaces, med_tech, mental_health, mobility_transport, payments_embedded_finance, private_markets, prop_tech, robotics_automation, saas, semiconductors, space, supply_chain, therapeutics, travel_tech, vertical_saas, water_tech, wealth_tech, web3_finance, web3_infrastructure, wellness_lifestyle
```


### `get_fund`

**Get fund profile** · Free tier · read-only

THEN: get the detailed profile of one fund, using a slug returned by search_funds. COST: free, no API key required. Every response carries a `provenance` block stating where each field came from, when it was last verified, and how confident Fund Momentum is in it. Do not guess the slug from a fund's display name; it will usually be wrong and the call is wasted. A near-miss is resolved only when exactly one fund matches, and the result then carries `resolved_from`; a name matching several funds is listed, not guessed.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `slug` | string | yes | The slug identifier of a fund, exactly as returned in the `slug` field of search_funds. Call search_funds first rather than guessing: slugs are not derivable from a fund's display name. |


### `get_changes`

**Get changed funds since** · Free tier · read-only

FOR STAYING CURRENT, not for discovery: return only the funds whose data changed since a given timestamp. COST: free, no API key required. With no key it reaches back at most 7 days; a free key widens that to 30 days, and a paid caller is not limited. A shortened window is declared as since_floor_applied, never silently truncated. Designed for cheap repeated polling: send the `next_since` AND the `etag` from your previous response, and an unchanged window answers with `unchanged: true` and no rows. Use this instead of re-running search_funds on a schedule. One call here replaces a full re-crawl.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `since` | string | no | Lower bound, exclusive. Accepts either an ISO 8601 timestamp ('2026-08-01T00:00:00Z') or a unix epoch in milliseconds as a string ('1785955265103'). Omit to receive the last 7 days. |
| `if_none_match` | string | no | The `etag` value from your previous get_changes response. If nothing changed, the reply is a few bytes instead of a full page. This is the cheapest poll available here. |
| `limit` | integer | no | Maximum rows to return (1-200) |


## Paid tools

Available on a Pro key, on agent credits, or per call over MPP. A request for a
fund that does not exist, or one with no published signals, returns
`not_found` **before** any payment is taken.

### `get_fund_signals`

**Get fund investor signals** · pro tier (€29/mo) · read-only

DRILL DOWN on a fund you already identified with search_funds or get_fund. Returns investor signals: GP thesis, bullish and contrarian signals, founder dos and don'ts, deployment status and source URLs. This is the tool to use before writing an outreach message to a specific fund. COST: included in Pro, or €0.10 per call over MPP if you have no key. Roughly 96% of funds carry signals; the rest return not_found BEFORE any payment is taken, so a wrong slug is never charged for.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `slug` | string | yes | The fund's slug, exactly as returned in the `slug` field of search_funds. Call search_funds first rather than guessing. |


### `get_gp_profile`

**Get General Partner profiles** · pro tier (€29/mo) · read-only

DRILL DOWN to the people: General Partner profiles for a fund you already identified. Use this when the question is who to approach and what they personally focus on, rather than what the fund does. COST: included in Pro, or €0.10 per call over MPP if you have no key. A fund with no published GP data returns not_found before any payment. Requires a slug from search_funds.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `fund_slug` | string | yes | The fund's slug, exactly as returned in the `slug` field of search_funds. Call search_funds first rather than guessing. |
| `gp_name` | string | no | Optional GP name to filter by |


### `match_startup`

**Match startup to funds** · pro tier (€29/mo) · read-only

ALTERNATIVE ENTRY POINT when you do not know what to search for. Describe a startup in plain language and receive the top 10 matching funds, each with a slug, a reason and a score. Use this instead of search_funds when the brief is qualitative ('climate hardware, pre-seed, Europe') rather than a filter. Slower than the other tools, three to ten seconds, because it reasons over every tracked fund: allow for that before you time out and retry. COST: included in Pro, or €0.25 per call over MPP if you have no key.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `description` | string | yes | Startup description (max 500 chars) |
| `stage` | string | no | Funding stage. Must be one of the listed enum values; common spellings are normalised. One of 7 enum values. |
| `country` | string | no | Country, spelled out in full |

**Accepted `stage` values** (7):

```
growth, late_stage, pre_seed, seed, series_a, series_b, series_c
```


## LP tools

LP data is a list, not a lookup, so it is priced as a subscription and never
per call. `check_lp_coverage` is free on any key and on the keyless trial, and
never costs a credit. `search_lps` needs the API key of an account holding LP
Radar; for subscribers calls are unlimited and not counted against any quota,
at most 25 records per call. Anyone else gets
`error_reason: "lp_access_required"` with the coverage count for their filters —
never a payment challenge.

### `check_lp_coverage`

**Check LP coverage** · Free tier · read-only

START HERE for any question about limited partners (LPs). Answers "does Fund Momentum cover my geography and LP type" with COUNTS ONLY: how many disclosed LPs match, and how many of those have backed emerging managers. It never returns a name, slug, website or commitment. COST: free, works with no API key at all (counts against the keyless daily allowance), and is never billed to agent credits or a monthly quota. Counts below 5 are reported as "<5" and zero as "none". Call this before search_lps to find out whether LP Radar covers what you need.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `country` | string | no | Headquarters country of the LP, spelled out in full (e.g. 'Germany', 'United States'). Two-letter ISO codes are accepted too. LPs whose headquarters is undisclosed are never counted under a country; they are reported separately as undisclosed_hq_count. |
| `lp_type` | string | no | LP type. Must be one of the listed values; common spellings such as 'family office', 'pension' or 'fund of funds' are accepted and normalised. One of 15 enum values. |

**Accepted `lp_type` values** (15):

```
Pension fund, Insurer, Foundation / Endowment, University / Research, Bank, Public / State institution, Sovereign wealth fund, Fund-of-Funds, Asset manager / Investment firm, Family office / Holding, Corporate / Strategic, Impact investor, Investment vehicle, Individual / Angel, Institutional LP
```


### `search_lps`

**Search LP records** · LP Radar subscription (EUR 199 per month or EUR 1,499 per year) · not sold per call · read-only

THEN, for LP Radar subscribers: return limited partner records (name, slug, LP type, HQ country and city, geographic focus, website, emerging-manager backing, verified flag) filtered by country, LP type and emerging-manager backing, at most 25 per call. Set backs_emerging_managers=true to see only LPs that have already backed a first or second fund — for a first-time manager that is usually the only filter that matters. Requires LP Radar (EUR 199 per month or EUR 1,499 per year, https://fundmomentum.vc/lp-radar). Not available per call, on agent credits or on the keyless trial. Unlimited calls for subscribers. Use check_lp_coverage first — it is free and tells you whether the dataset covers your geography and LP type before you pay anything. Send the API key of the account that holds LP Radar. A caller without it gets error_reason "lp_access_required" together with the coverage count for its filters, never a payment challenge. website is null when no website is on record; it is never omitted.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `country` | string | no | Headquarters country of the LP, spelled out in full (e.g. 'Germany'). Two-letter ISO codes are accepted too. |
| `lp_type` | string | no | LP type. Must be one of the listed values; common spellings such as 'family office' or 'pension' are accepted and normalised. One of 15 enum values. |
| `backs_emerging_managers` | boolean | no | true returns only LPs that have backed an emerging manager; false returns only those that have not. Omit for both. Not available on check_lp_coverage, which reports the figure as a breakdown instead. |
| `limit` | integer | no | Records to return, 1-25. A value above 25 is rejected, not clamped. |

**Accepted `lp_type` values** (15):

```
Pension fund, Insurer, Foundation / Endowment, University / Research, Bank, Public / State institution, Sovereign wealth fund, Fund-of-Funds, Asset manager / Investment firm, Family office / Holding, Corporate / Strategic, Impact investor, Investment vehicle, Individual / Angel, Institutional LP
```


## Tiers

| Tier | Price | Calls / month | Tools |
|---|---|---|---|
| Keyless trial | €0 | 10 per day | search_funds, get_fund, get_changes, check_lp_coverage |
| Free (key) | €0 | 100 | search_funds, get_fund, get_changes |
| Starter | €9/mo | 1,000 | free tools |
| Pro | €29/mo | 10,000 | all 6 fund tools |
| Agent | €0.01/call | metered | all 6 fund tools |
| LP Radar | EUR 199 per month or EUR 1,499 per year | unlimited | search_lps (check_lp_coverage is free for everyone) |

LP Radar is independent of the tiers above: a Pro key does not include it, and
a Free key can hold it.

Agents can self-register and receive a key plus 25 free credits immediately:

```bash
curl -s -X POST https://fundmomentum.vc/_api/agent/register \
  -H 'Content-Type: application/json' \
  -d '{"agent_name":"your-agent","email":"you@example.com"}'
```

## Errors worth knowing

| Code / status | Meaning |
|---|---|
| `-32042` | Payment required. A challenge is attached in `error.data.challenges`. Nothing has been charged |
| `-32043` | A payment credential failed verification. Money may have moved — report it and we will settle it by hand |
| `-32000`, `error_reason: "not_found"`, `checked_before_payment: true` | The slug does not exist, matches several funds (none is picked for you), or has no signals. You were not charged, and the message names the closest real slugs. A single unambiguous near-match is served instead, with `resolved_from` in the result |
| `-32602`, `error_reason: "invalid_args"`, `checked_before_payment: true` | An unknown, missing or malformed parameter, refused before any challenge. You were not charged, and the message names what it expected. `search_lps` with `limit` above 25 lands here |
| `-32001`, `error_reason: "missing_key"` | The tool needs a key. The message opens with how a person gets one (https://fundmomentum.vc/pricing), then the agent route (`POST` to the register URL), then which tier the tool needs. The same two-part opening is used by `anon_quota_exceeded`, `anon_ip_ceiling_exceeded`, `insufficient_tier` and the `-32042` message; fields in `error.data` are unchanged |
| `-32001`, `error_reason: "lp_access_required"` | `search_lps` without LP Radar. No challenge, nothing charged; `error.data.coverage` carries the count for your filters |

## Provenance

Every `get_fund` response carries a `provenance` block: where each field came
from, when it was last verified, and a confidence level. Fields we have not
verified say so rather than guessing.

---

Questions, or a failed run worth telling us about: michael@fundmomentum.vc
