Skip to content

Commit 15cc2de

Browse files
iharvalodzinIhar Valodzinclaude
authored
feat(carta-crm): expand to full 20-skill CRM suite (v0.6.0) (#31)
## Summary - Expands `carta-crm` from 5 add-only skills to a complete **20-skill suite** - Adds `carta-crm` and `carta-investors` to the root README (both were missing) - Bumps version `0.5.1 → 0.6.0` ## Skills added (15 new) **Search:** `search-investors`, `search-companies`, `search-contacts`, `search-deals`, `search-notes`, `search-fundraisings` **Update:** `update-investor`, `update-company`, `update-contact`, `update-deal`, `update-note`, `update-fundraising` **Add:** `add-fundraising` **Enrich:** `enrich-company`, `lookup-fund-portfolio` ## Test plan - [ ] `search-investors <name>` returns investor records with IDs - [ ] `search-deals <keyword>` filters to correct pipeline/stage - [ ] `update-investor <id>` patches fields without overwriting others - [ ] `enrich-company <domain>` returns structured company profile - [ ] `lookup-fund-portfolio <url>` returns portfolio companies - [ ] All add skills create records and confirm result - [ ] `LISTALPHA_API_KEY` resolves correctly from env 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Ihar Valodzin <ihar.valodzin@ihar.valodzin> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 837d0f9 commit 15cc2de

31 files changed

Lines changed: 2611 additions & 10 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ Visit the [Carta Developer Platform website here](https://docs.carta.com/api-pla
1313
| Plugin | Description |
1414
|--------|-------------|
1515
| [carta-cap-table](plugins/carta-cap-table) | Skills and MCP server for querying Carta cap tables, grants, SAFEs, 409A valuations, waterfall scenarios, and more |
16-
| [carta-fund-admin](plugins/carta-fund-admin) | Skills and MCP server for querying Carta fund admin data, including NAV, performance, allocations, and regulatory reporting |
16+
| [carta-crm](plugins/carta-crm) | Manage the Carta CRM conversationally — search, add, update, and enrich investors, companies, contacts, deals, notes, and fundraisings via the public API |
17+
| [carta-investors](plugins/carta-investors) | Skills and MCP server for querying Carta fund admin data, including NAV, performance, allocations, and regulatory reporting |
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"name": "carta-crm",
33
"displayName": "Carta CRM",
4-
"version": "0.5.1",
5-
"description": "Add investors, companies, contacts, deals, and notes to the Carta CRM via the public API",
4+
"version": "0.6.0",
5+
"description": "Manage the Carta CRM conversationally — search, add, update, and enrich investors, companies, contacts, deals, notes, and fundraisings via the public API",
66
"author": {
77
"name": "Ihar Valodzin",
88
"email": "ihar.valodzin@carta.com"
99
},
10-
"keywords": ["carta", "crm", "investors", "companies", "contacts", "deals", "notes"]
10+
"keywords": ["carta", "crm", "investors", "companies", "contacts", "deals", "notes", "fundraisings", "search", "enrich"]
1111
}

plugins/carta-crm/README.md

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Carta CRM Plugin
22

3-
Add investors, companies, contacts, deals, and notes to the Carta CRM via the public API — conversationally.
3+
Manage the Carta CRM conversationally — search, add, update, and enrich investors, companies, contacts, deals, notes, and fundraisings via the public API.
44

55
## Setup
66

@@ -26,10 +26,38 @@ Claude will collect any missing required information, then create the record(s)
2626

2727
## Skills
2828

29+
### Add records
2930
| Skill | Trigger phrases |
3031
|-------|----------------|
31-
| `add-investor` | "/add-investor", "add investor", "add investor to Carta CRM", "create investor record", "add VC fund to CRM" |
32-
| `add-company` | "/add-company", "add a company", "create company record", "add company to CRM", "upload company to Carta CRM" |
33-
| `add-contact` | "/add-contact", "add a contact", "create contact record", "add contact to CRM", "save a contact", "upload contact to Carta CRM" |
34-
| `add-deal` | "/add-deal", "add a deal", "create a deal", "log a deal", "add deal to CRM", "add deal to Carta CRM" |
35-
| `add-note` | "/add-note", "add a note", "create a note", "log a note", "add note to CRM", "add note to Carta CRM" |
32+
| `add-investor` | "add investor", "add investor to Carta CRM", "create investor record", "add VC fund to CRM" |
33+
| `add-company` | "add a company", "create company record", "add company to CRM" |
34+
| `add-contact` | "add a contact", "create contact record", "add contact to CRM", "save a contact" |
35+
| `add-deal` | "add a deal", "create a deal", "log a deal", "add deal to CRM" |
36+
| `add-note` | "add a note", "create a note", "log a note", "add note to CRM" |
37+
| `add-fundraising` | "add a fundraising", "create a fundraising", "log a fundraising round" |
38+
39+
### Search & retrieve
40+
| Skill | Trigger phrases |
41+
|-------|----------------|
42+
| `search-investors` | "find an investor", "search investors", "look up an investor" |
43+
| `search-companies` | "find a company", "search companies", "look up a company" |
44+
| `search-contacts` | "find a contact", "search contacts", "look up a person" |
45+
| `search-deals` | "find a deal", "search deals", "show me deals for [company]" |
46+
| `search-notes` | "find a note", "search notes", "look up a note" |
47+
| `search-fundraisings` | "find a fundraising", "search fundraisings", "show fundraising pipeline" |
48+
49+
### Update records
50+
| Skill | Trigger phrases |
51+
|-------|----------------|
52+
| `update-investor` | "update an investor", "edit investor", "update investor details" |
53+
| `update-company` | "update a company", "edit company", "update company details" |
54+
| `update-contact` | "update a contact", "edit contact", "update contact details" |
55+
| `update-deal` | "update a deal", "move deal to [stage]", "change deal stage" |
56+
| `update-note` | "update a note", "edit note", "update note content" |
57+
| `update-fundraising` | "update a fundraising", "edit fundraising", "update fundraising details" |
58+
59+
### Research & enrichment
60+
| Skill | Trigger phrases |
61+
|-------|----------------|
62+
| `enrich-company` | "enrich this company", "look up company info", "research this company" |
63+
| `lookup-fund-portfolio` | "look up portfolio of [fund]", "get portfolio companies for [fund website]" |
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
---
2+
name: add-fundraising
3+
description: >
4+
Creates one or more fundraising records in the Carta CRM via the public API.
5+
Use this skill when the user says things like "add a fundraising", "create a fundraising",
6+
"log a fundraising round", "add fundraising to CRM", "create fundraising record",
7+
or "/add-fundraising". Collects fundraising information conversationally, then POSTs
8+
it to the Carta CRM API.
9+
allowed-tools:
10+
- Bash
11+
---
12+
13+
## Overview
14+
15+
Help the user create one or more fundraising records in the Carta CRM by calling
16+
`POST /v1/fundraisings`. Collect the fundraising details conversationally, validate the
17+
required fields, then make the API call using curl.
18+
19+
## Step 1 — Check credentials
20+
21+
Check that the required environment variables are set:
22+
23+
```bash
24+
echo "API_KEY=${LISTALPHA_API_KEY:+set}"
25+
```
26+
27+
If `LISTALPHA_API_KEY` is missing, tell the user:
28+
> "You need to set the `LISTALPHA_API_KEY` environment variable to your Carta CRM API key before using this skill. You can add it in Claude's environment settings."
29+
30+
## Step 2 — Discover available custom fields (optional but recommended)
31+
32+
Call the custom fields endpoint to see what fields the tenant has configured for fundraisings:
33+
34+
```bash
35+
curl -s -X GET "https://api.listalpha.com/v1/fundraisings/custom-fields" \
36+
-H "Authorization: ${LISTALPHA_API_KEY}"
37+
```
38+
39+
Use the returned field names as hints when collecting fundraising data. If the call
40+
fails, proceed without it — custom fields are optional.
41+
42+
## Step 3 — Collect fundraising information
43+
44+
Ask the user for:
45+
- **Name** (required) — the fundraising round name (e.g., "Acme Corp Series B", "Project Atlas Seed Round")
46+
- **Additional fields** (optional) — any custom fields returned in Step 2
47+
48+
If the user has already provided details in their message, extract them directly
49+
without re-asking.
50+
51+
## Step 4 — Create the fundraising via API
52+
53+
Build the request body:
54+
```json
55+
{
56+
"name": "<fundraising name>",
57+
"fields": {
58+
"<field_key>": "<value>"
59+
}
60+
}
61+
```
62+
63+
Omit `fields` entirely if no field data was provided.
64+
65+
Make the API call:
66+
```bash
67+
curl -s -X POST "https://api.listalpha.com/v1/fundraisings" \
68+
-H "Authorization: ${LISTALPHA_API_KEY}" \
69+
-H "Content-Type: application/json" \
70+
-d '<json_body>'
71+
```
72+
73+
## Step 5 — Report result
74+
75+
On success (HTTP 200), respond with:
76+
> "Fundraising **{name}** created successfully (ID: `{id}`)."
77+
78+
On error, show the status code and error message from the response, and suggest fixes:
79+
- **401** — API key is invalid or missing
80+
- **400** — Check that `name` is provided and `fields` contains valid keys
81+
- **500** — Server error; try again or contact support
82+
83+
## Adding multiple fundraisings
84+
85+
If the user wants to add multiple fundraisings at once, repeat Steps 3–5 for each
86+
one. After all are done, summarize:
87+
> "Created N fundraisings: [list of names with IDs]"
88+
89+
## Reference
90+
91+
See `references/api-reference.md` for endpoint details and field schema.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# Carta CRM Fundraising API Reference
2+
3+
## Authentication
4+
5+
All requests require an API key in the `Authorization` header (no `Bearer` prefix):
6+
7+
```
8+
Authorization: <your-api-key>
9+
```
10+
11+
## Environment Variables
12+
13+
| Variable | Required | Description |
14+
|----------|----------|-------------|
15+
| `LISTALPHA_API_KEY` | Yes | Your Carta CRM API key |
16+
17+
---
18+
19+
## Endpoints
20+
21+
### GET /v1/fundraisings/custom-fields
22+
23+
Returns the custom field schema configured for your tenant's fundraising records.
24+
Use this to discover which field keys are valid before creating fundraisings.
25+
26+
**Example:**
27+
```bash
28+
curl -s "https://api.listalpha.com/v1/fundraisings/custom-fields" \
29+
-H "Authorization: ${LISTALPHA_API_KEY}"
30+
```
31+
32+
**Response:**
33+
```json
34+
{
35+
"fields": [
36+
{ "key": "amount", "label": "Amount", "type": "string" },
37+
{ "key": "stage", "label": "Stage", "type": "string" },
38+
{ "key": "status", "label": "Status", "type": "string" },
39+
{ "key": "closeDate", "label": "Close Date", "type": "date" },
40+
{ "key": "tags", "label": "Tags", "type": "array" }
41+
]
42+
}
43+
```
44+
45+
> The actual fields returned depend on your tenant's configuration.
46+
47+
---
48+
49+
### POST /v1/fundraisings
50+
51+
Creates a new fundraising record.
52+
53+
**Request body:**
54+
```json
55+
{
56+
"name": "Acme Corp Series B",
57+
"fields": {
58+
"amount": "50000000",
59+
"stage": "Series B",
60+
"status": "open",
61+
"closeDate": "2026-06-30"
62+
}
63+
}
64+
```
65+
66+
| Field | Type | Required | Description |
67+
|-------|------|----------|-------------|
68+
| `name` | string | **Yes** | Fundraising round name |
69+
| `fields` | object | No | Key/value map of custom fields |
70+
71+
**Success response (200):**
72+
```json
73+
{
74+
"id": "64f1a2b3c4d5e6f7a8b9c0d1",
75+
"name": "Acme Corp Series B",
76+
"fields": {
77+
"amount": "50000000",
78+
"stage": "Series B"
79+
}
80+
}
81+
```
82+
83+
**Error responses:**
84+
85+
| Status | Meaning |
86+
|--------|---------|
87+
| 400 | Bad request — `name` missing or invalid field keys |
88+
| 401 | Unauthorized — invalid or missing API key |
89+
| 500 | Internal server error |
90+
91+
---
92+
93+
### GET /v1/fundraisings
94+
95+
List or search existing fundraisings.
96+
97+
**Query params:** `search` (string), `limit` (number), `offset` (number)
98+
99+
**Example:**
100+
```bash
101+
curl -s "https://api.listalpha.com/v1/fundraisings?search=acme&limit=10" \
102+
-H "Authorization: ${LISTALPHA_API_KEY}"
103+
```
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
---
2+
name: enrich-company
3+
description: >
4+
Researches a company by fetching its website and returning structured profile data.
5+
Use this skill when the user says things like "enrich this company", "look up company info",
6+
"research this company", "what does [domain] do", "get company details for [url]",
7+
"find info on [company]", or "/enrich-company".
8+
Input: target (domain name or website URL).
9+
Output: structured JSON with name, industry, tags, description, and website.
10+
Saves the result locally at ~/.carta-crm/enriched-companies/ for auditing.
11+
user-invocable: false
12+
allowed-tools:
13+
- WebFetch
14+
- WebSearch
15+
- Bash
16+
---
17+
18+
## Overview
19+
20+
Enrich a company profile by fetching its website and extracting key business information.
21+
The result is returned as structured JSON and saved locally for auditing.
22+
23+
## Step 1 — Normalize the target URL
24+
25+
Take the `target` input and produce a clean `https://` URL:
26+
- If it already starts with `http://` or `https://`, use it as-is.
27+
- If it looks like a bare domain (e.g., `acme.com`), prepend `https://`.
28+
- Strip any trailing paths — use only the root URL (e.g., `https://acme.com`).
29+
30+
Also extract the bare domain (e.g., `acme.com`) — you'll need it for the output filename.
31+
32+
## Step 2 — Fetch the company website
33+
34+
Use WebFetch to retrieve the homepage. Look for:
35+
- Page `<title>` and `<meta name="description">` content
36+
- `<h1>` / `<h2>` headings and hero/tagline text
37+
- Any "About", "What we do", or "Our mission" sections
38+
39+
If the homepage returns insufficient content (e.g., a login wall, placeholder, or very sparse text),
40+
also try fetching `[root-url]/about` as a fallback.
41+
42+
## Step 3 — Supplement with web search if needed
43+
44+
If the website alone doesn't clearly reveal the company's industry or what it does,
45+
run a WebSearch for:
46+
47+
```
48+
"[company name]" company what does it do
49+
```
50+
51+
Use the top 2–3 results to fill in gaps — especially for `industry` and `description`.
52+
53+
## Step 4 — Extract structured data
54+
55+
From the gathered content, produce the following fields:
56+
57+
| Field | Type | Notes |
58+
|-------|------|-------|
59+
| `name` | string | Official company name (not the domain) |
60+
| `industry` | string | Primary industry, e.g. "FinTech", "SaaS", "Healthcare IT", "Climate Tech" |
61+
| `tags` | array of strings | 3–6 short topic tags, e.g. `["payments", "B2B", "API", "embedded finance"]` |
62+
| `description` | string | 1–2 sentence plain-English summary of what the company does |
63+
| `website` | string | Canonical root URL, e.g. `https://acme.com` |
64+
65+
Use specific, meaningful tags — avoid generic ones like "technology" or "software" on their own.
66+
67+
## Step 5 — Save the enrichment record
68+
69+
Write the JSON to a local audit file:
70+
71+
```bash
72+
mkdir -p ~/.carta-crm/enriched-companies
73+
cat > ~/.carta-crm/enriched-companies/[domain].json << 'ENDJSON'
74+
{
75+
"name": "...",
76+
"industry": "...",
77+
"tags": [...],
78+
"description": "...",
79+
"website": "..."
80+
}
81+
ENDJSON
82+
```
83+
84+
Replace `[domain]` with the bare domain (e.g., `acme.com`).
85+
Confirm the file was written with `echo $?` (should be 0).
86+
87+
## Step 6 — Return the result
88+
89+
Return the enrichment record as a JSON block, followed by the save path:
90+
91+
```json
92+
{
93+
"name": "...",
94+
"industry": "...",
95+
"tags": [...],
96+
"description": "...",
97+
"website": "..."
98+
}
99+
```
100+
101+
State: `Saved to ~/.carta-crm/enriched-companies/[domain].json`
102+
103+
## Handling multiple companies
104+
105+
If the user provides multiple targets, repeat Steps 1–5 for each one, then return all
106+
results together and summarize: `Enriched N companies — saved to ~/.carta-crm/enriched-companies/`

0 commit comments

Comments
 (0)