@pipeworx/vc-finder
Connect: https://pipeworx.io/mcp — every tool in the catalog, including @pipeworx/vc-finder’s. Install: one-click buttons
Connect to just the @pipeworx/vc-finder pack
https://gateway.pipeworx.io/vc-finder/mcp — only @pipeworx/vc-finder’s own tools, nothing else in the catalog.
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 10
VC / angel investor graph: which investors fit a raise, who is on which
round, and which investing person at a firm to approach — every fact carrying
the page it came from. Built for Mojibake’s own raise first (Bruce ask
2026-09-29) and public since fleet #2663 (Bruce 2026-10-01: “just make it
live; it will be easier to test”). Not npm-published — that is a separate
Bruce-gated path. See docs/vc-graph-plan.md, docs/vc-graph-architecture.md,
docs/vc-finder-staging-contract.md.
Store: D1, not Postgres (fleet #2526 store-change)
The architecture doc (§1) originally called for a dedicated Supabase Postgres
project. Superseded 2026-09-30 by the PM (Bruce ruled out new Supabase
spend): the store is ONE Cloudflare D1 database. Schema:
sql/vc-finder-schema.sqlite.sql — a narrow port (only the tables this pack’s
8 tools need) written because Liesel’s full port was not yet on origin/main
when this was built in parallel. Reconcile the two when hers lands; delete
this one rather than let two schema files drift.
Shape
mcps/vc-finder/— this pack. 10 tools,vc_prefixed. Calls a_vcIndexservice-binding-shaped object (RPC methods, not fetch — seeVcIndexBindinginsrc/index.ts), the same shape as the POD_INDEX precedent (workers/pod-index,docs/pod-researcher-design.md).workers/vc-index/— thepipeworx-vc-indexworker skeleton. AWorkerEntrypointexposing one RPC method per tool, backed bysrc/queries.ts(parameterized SQL against the D1 binding — no stored procedures; D1 has none). Deployed (fleet #2579) against thepipeworx-vc-finderD1 database; CI redeploys the code on push (.github/workflows/deploy-vc-index.yml) and never touches the data.scripts/vc-finder/fixtures/seed.sqlite.sql— fixed-id fixtures (a16z, Sequoia, SignalFire, two companies, two rounds, claims with provenance, precomputedinvestor_sector_portfolio_counts/investor_observed_statsrows) for local testing only.
Local test (never a remote D1 database)
wrangler d1 execute VC_INDEX_DB --local --cwd workers/vc-index \
--file sql/vc-finder-schema.sqlite.sql -y
wrangler d1 execute VC_INDEX_DB --local --cwd workers/vc-index \
--file scripts/vc-finder/fixtures/seed.sqlite.sql -y
Then either query directly (wrangler d1 execute VC_INDEX_DB --local --cwd workers/vc-index --command "...") or run the pack’s callTool() against the
resulting local D1 sqlite file (workers/vc-index/.wrangler/state/v3/d1/...)
via a harness that mocks _vcIndex with src/queries.ts’s functions — see
fleet #2526’s task record for the exact harness used to produce the
acceptance evidence (compiled with tsc, run with Node’s node:sqlite).
People and contact routes (fleet #2561)
Bruce’s 2026-09-30 case ruling: investing people are served with the contact
routes they published. vc_search_people and vc_get_person are the two
people tools; vc_get_investor lists a firm’s partners with their routes, and
vc_find_investors_for_company names a relevant_partner per firm when one is
known (most senior investing role, then one with a published route). Every
path serves only exposure_hold = 0 people and checks the removal list
(removal_entry, mirrored from scripts/vc-finder/removal-list.json) at read
time. Tests: workers/vc-index/src/queries.people.test.mts. Load/ER details:
docs/vc-finder-staging-contract.md “How the store loads and serves them”.
Source and removal, stated where a caller can see it (required now that the
pack is public — CLAUDE.md “Personal data”, Bruce’s case ruling). People and
their contact routes come from public sources only: the firm’s own site or
the person’s own published page. Every route carries the page it was published
on, the quoted text showing it, and a personal-or-role label. Phone numbers
and home addresses are never collected. Anyone can request removal at
[email protected] — add them to scripts/vc-finder/removal-list.json and
the read path drops them immediately; it does not wait for the next load. The
vc_search_people and vc_get_person descriptions carry this same statement,
so it reaches a caller who never reads this file, and
tests/scope-is-not-a-gate.test.ts fails if either description loses it.
Public since fleet #2663 — what the private gate was, and what replaced it
Through fleet #2579 this pack was unlisted in the manifest, listed in
PRIVATE_PACKS, hidden as not found from everyone outside
BOARD_OWNER_CALLERS + internal traffic (NOT_FOUND_PRIVATE_SLUGS in
workers/gateway/src/index.ts), and re-checked the same rule inside the pack
via assertAllowed(). All four are gone. Any caller can call every tool.
NOT_FOUND_PRIVATE_SLUGS is now an EMPTY set rather than deleted — it is the
next private pack’s gate, and with no members privatePackVisible() answers
true for every slug, so a green test over it proves nothing about the not-found
path. That is said out loud at the set’s definition.
What protects the people in the graph is therefore no longer the gate; it is the read-time removal check below, which was always the real control.
Refreshing the deployed data
The D1 database holds a SERVING copy, never the full local build:
node scripts/vc-finder/build-deploy-copy.mjs "$VC_DATA/<build>.sqlite" "$VC_DATA/vc_finder_deploy.sqlite"
node scripts/vc-finder/d1-export-chunks.mjs "$VC_DATA/vc_finder_deploy.sqlite" "$VC_DATA/d1-import"
node scripts/vc-finder/d1-import.mjs "$VC_DATA/d1-import" # resumable; verifies row counts
build-deploy-copy.mjs drops every held person (exposure_hold = 1) and
every row that exists only because of one, person-flagged companies, and
merged-away companies nothing references, and refuses to finish if any held
person or orphan survives. The import targets a fresh database (the schema
file is plain CREATEs); to refresh, create a new database, import, then
point database_id at it.
Known gaps (v0 skeleton, not fixed by this task)
vc_find_investors_for_companystill scores every VC-shaped organization per call, but in a fixed number of set queries (fleet #2579 — it used to be three D1 queries per candidate, which on the real store is past D1’s 1,000-queries-per-invocation limit). A materialized stated-fit candidate table would cut the rows read.- Money fields are
REAL— fine for whole-dollar amounts in these fixtures, worth revisiting (integer cents) once real amounts include cents. - No loader/insert path here — this is the READ side only, per the task.
Tools
- vc_search_investors — Search VC firms, CVCs, solo GPs, accelerators and angel groups by stated investment strategy — sector, stage, check size, geography. Stated-only (Phase 2); coverage is partial and every result carries
- vc_get_investor — Get one investor organization by id: identity, aliases, external ids (CRD/SEC#), funds, its investing people (partners, each with the contact routes they published, their source page and a personal/ro
- vc_get_fund — Get one private fund by id: name, vintage, VC-fund flag (ADV Schedule D 7.B), gross asset value, managing organization, and per-fact sources.
- vc_get_company — Get one company by id: identity, sector, maturity stage, and its financing rounds.
- vc_search_rounds — Search financing rounds by sector, stage and date window — answers “funding rounds this week/quarter”. Sourced from SEC Form D and newswire funding announcements; coverage is partial.
- vc_who_invested_in — List the investors named in a company’s financing rounds — role (lead/participant), amount where disclosed, and the evidence (source URL + quoted snippet) behind each edge.
- vc_get_evidence — Get the full provenance of one claim by id: source URL, source type, retrieval date, the extractor version, confidence, and the verbatim evidence text. Every other tool’s “sources” field is a list of
- vc_find_investors_for_company — Explainable stated-fit matcher (v0): for a company’s sector, stage, check size and geography, rank candidate investors by an EXPLAINABLE CHECKLIST of five criteria (sector_match, stage_match, check_si
- vc_search_people — Search investing people — partners, principals, associates, scouts, venture partners, fund GPs, angels, syndicate leads — by role, firm, the firm’s sector, the firm’s HQ geography, or name. Returns ea
- vc_get_person — Get one investing person by id: investing role, roles and firm history, companies, their own investments, and every contact route they published (email, LinkedIn, X, personal site), each with the page
Tools
vc_find_investors_for_company— Explainable stated-fit matcher (v0): for a company's sector, stage, check size and geography, rank candidate investors by an EXPLAINABLE CHECKLIST of five criteria (sector_match, stage_match, check_sivc_get_company— Get one company by id: identity, sector, maturity stage, and its financing rounds.vc_get_evidence— Get the full provenance of one claim by id: source URL, source type, retrieval date, the extractor version, confidence, and the verbatim evidence text. Every other tool's sources field is a list of thvc_get_fund— Get one private fund by id: name, vintage, VC-fund flag (ADV Schedule D 7.B), gross asset value, managing organization, and per-fact sources.vc_get_investor— Get one investor organization by id: identity, aliases, external ids (CRD/SEC#), funds, its investing people (partners, each with the contact routes they published, their source page and a personal/rovc_get_person— Get one investing person by id: investing role, roles and firm history, companies, their own investments, and every contact route they published (email, LinkedIn, X, personal site), each with the pagevc_search_investors— Search VC firms, CVCs, solo GPs, accelerators and angel groups by stated investment strategy — sector, stage, check size, geography. Stated-only (Phase 2); coverage is partial and every result carriesvc_search_people— Search investing people — partners, principals, associates, scouts, venture partners, fund GPs, angels, syndicate leads — by role, firm, the firm's sector, the firm's HQ geography, or name. Returns eavc_search_rounds— Search financing rounds by sector, stage and date window — answers funding rounds this week/quarter . Sourced from SEC Form D and newswire funding announcements; coverage is partial.vc_who_invested_in— List the investors named in a company's financing rounds — role (lead/participant), amount where disclosed, and the evidence (source URL + quoted snippet) behind each edge.