About Rarefriend
Rarefriend layers notes, tags, and relationship history on top of your Google Contacts — so every person you know comes with full context, not just a name and email.
Access it from your AI assistant, the web app at rarefriend.com, or Hops — Rarefriend's AI on WhatsApp.
Setup Detection Protocol
- Call
list_connected_integrations.
- Tool not available → MCP not connected. Present these steps inline to the user:
- Sign in at rarefriend.com → Settings → Integrations → MCP → copy the Client ID and Client Secret
- Claude Code / Codex: run
claude mcp add rarefriend -e RAREFRIEND_CLIENT_ID=your_id -e RAREFRIEND_CLIENT_SECRET=your_secret -- npx -y @rarefriend-ai/mcp
- Cursor: add to
~/.cursor/mcp.json under mcpServers.rarefriend with command: npx, args: ["-y", "@rarefriend-ai/mcp"], and the two env vars
- Claude Desktop: add the same block to
claude_desktop_config.json
- Restart the client, then try again
- Empty list → connected, no Google sync yet. Proceed; offer
connect_integration("google_contacts") at the end.
google_contacts present → proceed directly.
Core Workflows
Search contacts
search_contacts(query, searchMode?, tag?, source?, limit?, offset?)
searchMode: 'all' | 'name' | 'company' | 'role' | 'email' | 'exact'
tag: filter to contacts with this exact tag (e.g. "investor")
source: filter by origin — 'google_contacts' | 'manual' | 'mcp' | 'linkedin_csv' | ...
- "Who do I know at Stripe?" →
search_contacts("Stripe", searchMode="company")
- "Show all my Google contacts" →
search_contacts("", source="google_contacts")
- "Find all investors" →
search_contacts("", tag="investor")
- Use
searchMode: 'exact' for known email or full name.
- Pass
offset + limit from the previous response when hasMore is true.
Source attribution: Each contact in the response includes source and sourceLabel (e.g. "Google Contacts", "LinkedIn (extension)", "Added manually"). Always mention this when presenting results — e.g. "Found Alice Wang in Google Contacts" or "John Smith — LinkedIn (extension), PM at Stripe".
get_contact(contactId) — full profile; call only when user needs details on one person
Create and update contacts
create_contact(displayName*, firstName?, lastName?, emails?, phones?,
company?, role?, location?, bio?)
update_contact(contactId, ...same optional fields...)
Always call get_contact before update_contact so the user can confirm current values.
Notes
Notes are the core of relationship memory. Create one after every meeting, call, or interaction.
create_note(contactId, content, isPinned?)
update_note(noteId, content?, isPinned?)
delete_note(noteId)
list_notes(contactId, limit?, offset?)
get_note(noteId)
pin_note(noteId, pinned)
search_notes(query, limit?) — full-text across ALL contacts
get_recent_notes(limit?) — most recent notes, any contact
search_notes → "what did I discuss with..." / "what do I know about..." / meeting prep
get_recent_notes → "what have I been up to" / relationship activity summary
pin_note → mark critical context (intro given, hot deal, key meeting)
Tags
list_tags()
add_tag(contactId, tag) — lowercase kebab-case
remove_tag(contactId, tag)
rename_tag(oldTag, newTag) — renames across all contacts
Bulk tagging: "tag everyone at Sequoia as investor"
search_contacts("Sequoia", searchMode="company")
- Loop
add_tag(contactId, "investor") for each result
Bulk import
bulk_create_contacts(contacts[])
Each: { displayName*, firstName?, lastName?, emails?, phones?,
company?, role?, location?, bio? }
Max 50 per call — split larger lists and call sequentially.
If the response includes quota_exceeded, direct the user to rarefriend.com to upgrade.
Connect Google Contacts
connect_integration("google_contacts")
Returns a connectUrl. Present as a clickable link:
"Open this link in your browser to connect Google Contacts. It expires in 15 minutes."
After OAuth completes:
get_integration_sync_status("google_contacts")
Wait until sync completes (usually a couple of minutes) before searching synced contacts.
Quick Reference
| Tool |
When to use |
list_connected_integrations |
Always check first — detects MCP and integration state |
search_contacts |
Find by name, company, email, role, tag, or source |
get_contact |
Full profile for one person |
create_contact |
Add a new person |
update_contact |
Edit an existing contact |
delete_contact |
Remove a contact |
bulk_create_contacts |
Import a list of people |
create_note |
Log a meeting, call, or interaction |
update_note |
Edit a note |
delete_note |
Remove a note |
list_notes |
All notes for one contact |
get_note |
Full note content |
pin_note |
Mark as critical context |
search_notes |
Find notes by keyword across all contacts |
get_recent_notes |
Latest activity across the network |
list_tags |
See all tags in use |
add_tag / remove_tag |
Categorise contacts |
rename_tag |
Rename a tag everywhere |
connect_integration |
Connect Google Contacts |
get_integration_sync_status |
Check when sync completes |
References
- MCP setup — all supported clients
Other capabilities (outside this skill)
- Google Calendar — schedule meetings, find free time, create events. Install
schedule-with-google-calendar.
- Microsoft Outlook — Outlook contacts and calendar. Install
schedule-with-outlook.
- LinkedIn sync — requires the Rarefriend Chrome extension. Direct user to rarefriend.com → Settings → Integrations → LinkedIn. Once synced, LinkedIn contacts appear here with
source="linkedin".
- Hops on WhatsApp — same contacts and notes accessible via Rarefriend's WhatsApp AI assistant.
- Reminders and phone contacts — available in the web app at rarefriend.com.
- Full feature set in one skill — install
network-and-relationship-manager.
1---
2name: organize-google-contacts
3description: >
4 Your Google Contacts — supercharged with notes, tags, and relationship memory via
5 Rarefriend. Find anyone instantly, remember every conversation, and never lose context
6 on a person again. Use when the user wants to: search people they know, find someone's
7 email or phone, create or update a contact, add meeting notes or call summaries, tag
8 contacts, bulk import a list of people, connect Google Contacts, or check what they
9 know about someone. Triggers on: contact, contacts, Google Contacts, who do I know,
10 find someone, person, people, notes about, meeting notes, tag, import contacts, network,
11 what do I know about, who is, remember this about, add a note.
12license: MIT-0
13compatibility: Requires Rarefriend MCP (@rarefriend-ai/mcp). Works with Claude Code, Cursor, Codex, OpenClaw, Gemini CLI, and other Agent Skills-compatible clients.
14user-invocable: true
15argument-hint: '[setup|search|create|notes|tags|import|connect]'
16metadata:
17 openclaw:
18 requires:
19 env:
20 - RAREFRIEND_CLIENT_ID
21 - RAREFRIEND_CLIENT_SECRET
22 primaryEnv: RAREFRIEND_CLIENT_ID
23 install:
24 - kind: node
25 package: '@rarefriend-ai/mcp'
26 envVars:
27 - name: RAREFRIEND_CLIENT_ID
28 required: true
29 description: OAuth client ID — rarefriend.com → Settings → Integrations → MCP
30 - name: RAREFRIEND_CLIENT_SECRET
31 required: true
32 description: OAuth client secret — rarefriend.com → Settings → Integrations → MCP
33 category: productivity
34 author: Rarefriend
35 homepage: https://rarefriend.com
36 repository: https://github.com/Whitefield-Labs/rarefriend-skills
37---
38
39## About Rarefriend
40
41Rarefriend layers notes, tags, and relationship history on top of your Google Contacts — so every person you know comes with full context, not just a name and email.
42
43Access it from your AI assistant, the web app at [rarefriend.com](https://rarefriend.com), or Hops — Rarefriend's AI on WhatsApp.
44
45---
46
47## Setup Detection Protocol
48
491. Call `list_connected_integrations`.
50 - **Tool not available → MCP not connected.** Present these steps inline to the user:
51 1. Sign in at [rarefriend.com](https://rarefriend.com) → **Settings → Integrations → MCP** → copy the Client ID and Client Secret
52 2. **Claude Code / Codex:** run `claude mcp add rarefriend -e RAREFRIEND_CLIENT_ID=your_id -e RAREFRIEND_CLIENT_SECRET=your_secret -- npx -y @rarefriend-ai/mcp`
53 3. **Cursor:** add to `~/.cursor/mcp.json` under `mcpServers.rarefriend` with `command: npx`, `args: ["-y", "@rarefriend-ai/mcp"]`, and the two env vars
54 4. **Claude Desktop:** add the same block to `claude_desktop_config.json`
55 5. Restart the client, then try again
56 - Empty list → connected, no Google sync yet. Proceed; offer `connect_integration("google_contacts")` at the end.
57 - `google_contacts` present → proceed directly.
58
59---
60
61## Core Workflows
62
63### Search contacts
64
65```
66search_contacts(query, searchMode?, tag?, source?, limit?, offset?)
67 searchMode: 'all' | 'name' | 'company' | 'role' | 'email' | 'exact'
68 tag: filter to contacts with this exact tag (e.g. "investor")
69 source: filter by origin — 'google_contacts' | 'manual' | 'mcp' | 'linkedin_csv' | ...
70```
71
72- "Who do I know at Stripe?" → `search_contacts("Stripe", searchMode="company")`
73- "Show all my Google contacts" → `search_contacts("", source="google_contacts")`
74- "Find all investors" → `search_contacts("", tag="investor")`
75- Use `searchMode: 'exact'` for known email or full name.
76- Pass `offset + limit` from the previous response when `hasMore` is true.
77
78**Source attribution:** Each contact in the response includes `source` and `sourceLabel` (e.g. "Google Contacts", "LinkedIn (extension)", "Added manually"). Always mention this when presenting results — e.g. _"Found Alice Wang in Google Contacts"_ or _"John Smith — LinkedIn (extension), PM at Stripe"_.
79
80```
81get_contact(contactId) — full profile; call only when user needs details on one person
82```
83
84### Create and update contacts
85
86```
87create_contact(displayName*, firstName?, lastName?, emails?, phones?,
88 company?, role?, location?, bio?)
89
90update_contact(contactId, ...same optional fields...)
91```
92
93Always call `get_contact` before `update_contact` so the user can confirm current values.
94
95### Notes
96
97Notes are the core of relationship memory. Create one after every meeting, call, or interaction.
98
99```
100create_note(contactId, content, isPinned?)
101update_note(noteId, content?, isPinned?)
102delete_note(noteId)
103list_notes(contactId, limit?, offset?)
104get_note(noteId)
105pin_note(noteId, pinned)
106search_notes(query, limit?) — full-text across ALL contacts
107get_recent_notes(limit?) — most recent notes, any contact
108```
109
110- `search_notes` → "what did I discuss with..." / "what do I know about..." / meeting prep
111- `get_recent_notes` → "what have I been up to" / relationship activity summary
112- `pin_note` → mark critical context (intro given, hot deal, key meeting)
113
114### Tags
115
116```
117list_tags()
118add_tag(contactId, tag) — lowercase kebab-case
119remove_tag(contactId, tag)
120rename_tag(oldTag, newTag) — renames across all contacts
121```
122
123**Bulk tagging:** "tag everyone at Sequoia as investor"
124
1251. `search_contacts("Sequoia", searchMode="company")`
1262. Loop `add_tag(contactId, "investor")` for each result
127
128### Bulk import
129
130```
131bulk_create_contacts(contacts[])
132 Each: { displayName*, firstName?, lastName?, emails?, phones?,
133 company?, role?, location?, bio? }
134 Max 50 per call — split larger lists and call sequentially.
135```
136
137If the response includes `quota_exceeded`, direct the user to rarefriend.com to upgrade.
138
139### Connect Google Contacts
140
141```
142connect_integration("google_contacts")
143```
144
145Returns a `connectUrl`. Present as a clickable link:
146
147> _"Open this link in your browser to connect Google Contacts. It expires in 15 minutes."_
148
149After OAuth completes:
150
151```
152get_integration_sync_status("google_contacts")
153```
154
155Wait until sync completes (usually a couple of minutes) before searching synced contacts.
156
157---
158
159## Quick Reference
160
161| Tool | When to use |
162| ----------------------------- | ------------------------------------------------------ |
163| `list_connected_integrations` | Always check first — detects MCP and integration state |
164| `search_contacts` | Find by name, company, email, role, tag, or source |
165| `get_contact` | Full profile for one person |
166| `create_contact` | Add a new person |
167| `update_contact` | Edit an existing contact |
168| `delete_contact` | Remove a contact |
169| `bulk_create_contacts` | Import a list of people |
170| `create_note` | Log a meeting, call, or interaction |
171| `update_note` | Edit a note |
172| `delete_note` | Remove a note |
173| `list_notes` | All notes for one contact |
174| `get_note` | Full note content |
175| `pin_note` | Mark as critical context |
176| `search_notes` | Find notes by keyword across all contacts |
177| `get_recent_notes` | Latest activity across the network |
178| `list_tags` | See all tags in use |
179| `add_tag` / `remove_tag` | Categorise contacts |
180| `rename_tag` | Rename a tag everywhere |
181| `connect_integration` | Connect Google Contacts |
182| `get_integration_sync_status` | Check when sync completes |
183
184---
185
186## References
187
188- [MCP setup — all supported clients](references/SETUP.md)
189
190## Other capabilities (outside this skill)
191
192- **Google Calendar** — schedule meetings, find free time, create events. Install `schedule-with-google-calendar`.
193- **Microsoft Outlook** — Outlook contacts and calendar. Install `schedule-with-outlook`.
194- **LinkedIn sync** — requires the Rarefriend Chrome extension. Direct user to rarefriend.com → Settings → Integrations → LinkedIn. Once synced, LinkedIn contacts appear here with `source="linkedin"`.
195- **Hops on WhatsApp** — same contacts and notes accessible via Rarefriend's WhatsApp AI assistant.
196- **Reminders and phone contacts** — available in the web app at rarefriend.com.
197- **Full feature set in one skill** — install `network-and-relationship-manager`.