# Affinity MCP connector

The Affinity connector brings organizations, people, opportunities, notes and logged emails, calls and meetings into Elaichi, so Claude, ChatGPT, Cursor or any MCP client can look them up and keep them current inside each person's own Affinity access.

Source: https://elaichi.ai/connectors/affinity/

## Facts

| | |
| --- | --- |
| Application | Affinity |
| Category | CRM |
| AI tools | 61 |
| Authentication | Connects with an API key |
| Needs your own OAuth app | No |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. 61 tools is past the 30-tool threshold, so clients use `search_tools` and `execute_tool` |

## What you can ask once Affinity is connected

- List opportunities created in Affinity this week
- Add a note to the Acme organization in Affinity
- Which Affinity organizations have no opportunities yet

## Connect Affinity in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Affinity.
2. Optionally set Share with, then press Connect.
3. Paste an Affinity API key. One person generates a token in Affinity and pastes it once. Everyone else works through Share with, and never sees it.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Affinity tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Connect Affinity to Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Connect Affinity to ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Connect Affinity to Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Affinity to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Only Read is granted by default, which is not enough to call a Affinity tool. Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Grant Read and Run tools. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Affinity through Elaichi

### Catch a company record up after a call

Deal team. Ask for the latest on a portfolio prospect, then have the note written up and the opportunity moved along without opening Affinity.

### Get briefed before a founder meeting

Partners. Pull the organization, the people on it, recent notes and the last few emails and meetings into a short briefing minutes before you walk in.

### Find who last spoke to an LP

Investor relations. Check email, call and meeting history for a person and see which teammate has the warmest relationship before reaching out.

### Add new introductions to Affinity

Platform. After an event, turn a list of names and companies into new people and organizations in Affinity, linked to the right opportunity.

### Review the pipeline in plain language

Business development. Ask which opportunities have gone quiet, which organizations have no recent interactions, and what was said in the last note on each.

### Clean up duplicate and stale records

Operations. Spot organizations and people that need merging or updating, fix names, domains and details, and remove records that should not be there, within the limits your admin has set.

## Frequently asked questions

### How do I connect Affinity to Claude?

Connect Affinity in Elaichi first: Affinity signs in with an API key, so you copy the key from your Affinity settings and paste it in, with no client ID or secret to generate. Then in Claude open Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp. Claude signs you into Elaichi as yourself and your Affinity organizations, people, opportunities and notes are available in the conversation.

### Does Affinity work with ChatGPT and Cursor as well as Claude?

Yes. Once Affinity is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any other MCP client and the Elaichi Agent. You connect Affinity once and every client uses that one connection.

### What can an AI agent actually do with my Affinity data?

With Affinity connected, an agent can look up organizations, people and opportunities, read and write notes, create or update records after a call, and review logged emails, calls and meetings to tell you who last spoke to someone. Because Affinity has a large set of actions, the agent searches for the right one as you ask, so short concrete requests like "add a note to Acme" work better than long paragraphs.

### Does connecting Affinity give the AI my whole Affinity workspace?

No. Every request runs inside the Affinity access of the person who signed in, so an agent sees the organizations, people and opportunities that person can already see in Affinity, and nothing more. Elaichi can narrow that further, for example to read-only, but it can never widen what Affinity itself allows.

### Can my team share one Affinity connection?

Yes. One person connects Affinity in Elaichi and shares the connection with a team, and nobody else ever handles the Affinity API key. Each teammate still signs into Elaichi as themselves, so every note written or opportunity changed is recorded against the person who did it.

### Can I stop an agent from deleting or changing things in Affinity?

Yes. Restrictions in Elaichi apply per action, so you can allow reading and creating notes in Affinity while blocking deletion of organizations, people or opportunities. A blocked action is never shown to Claude, ChatGPT or any other client, so no prompt, however worded, can reach it.

### What happens to an Affinity connection when someone leaves?

Offboarding that person in Elaichi ends their access to Affinity through every client at once. If they had shared an Affinity connection with a team, it keeps working for everyone else. Disconnecting Affinity once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client at the same time.

## All 61 Affinity tools

Every tool below is callable through https://api.elaichi.ai/mcp once Affinity is connected, subject to the toolbox it is in and the restrictions on the caller.

- **List all Affinity whoami** (List). Get information about the authenticated user and their Affinity instance. Returns tenant details (id, name, subdomain), user data (id, firstName, lastName, email), and grant metadata (type, scope, createdAt).
- **List all Affinity organizations** (List). List organizations in Affinity that match the search criteria. Returns key fields like organization details. Requires no parameters.
- **Get single Affinity organization by ID** (Get). Get details about a specific organization in Affinity using id. Returns key fields such as id, name, domain, domains, person_ids, opportunity_ids, and list_entries including creator_id and created_at.
- **Delete a Affinity organization by ID** (Delete). Delete an organization in Affinity using id. Returns confirmation of deletion and related metadata in the response.
- **Update a Affinity organization by ID** (Update). Update organization with id in Affinity. Returns updated fields such as name, domain, and associated person_ids.
- **Create a Affinity organization** (Create). Create a new organization in Affinity by providing name. Returns fields such as id, name, domain, domains, global, and person_ids in the response.
- **List all Affinity notes** (List). List all notes in Affinity. Returns key fields including id, creator_id, person_ids, organization_ids, opportunity_ids, content, is_meeting, and timestamps created_at and updated_at.
- **Get single Affinity note by ID** (Get). Get a specific note in Affinity using id. Returns fields such as creator_id, content, person_ids, organization_ids, interaction details, and timestamps created_at and updated_at.
- **Create a Affinity note** (Create). Create a new note in Affinity. Requires content. Returns id, creator_id, person_ids, organization_ids, opportunity_ids, parent_id, content, type, created_at, and updated_at fields in the response.
- **Update a Affinity note by ID** (Update). Update a specific note in Affinity by id with new content. Requires id and content. Returns the updated note object including fields like content, created_at, updated_at, and creator_id.
- **Delete a Affinity note by ID** (Delete). Delete a note in Affinity using id. Removes the specified note permanently.
- **List all Affinity opportunities** (List). List opportunities in Affinity that match search criteria. Returns id, name, person_ids, organization_ids, and list_entries in the response. Requires no parameters.
- **Get single Affinity opportunity by ID** (Get). Get a specific opportunity in Affinity using id. Returns id, name, person_ids, organization_ids, and list_entries with details such as creator_id, list_id, entity_id, and created_at.
- **Create a Affinity opportunity** (Create). Create a new opportunity in Affinity with required parameters name and list_id. Returns the newly created opportunity resource including key details such as its id and name.
- **Update a Affinity opportunity by ID** (Update). Update an existing opportunity in Affinity using id. Returns fields such as id, name, person_ids, organization_ids, and list_entries with details like creator_id and created_at.
- **Delete a Affinity opportunity by ID** (Delete). Delete an opportunity in Affinity. Requires id. Returns confirmation of deletion status in the response.
- **List all Affinity persons** (List). List persons in Affinity that match search criteria. Returns an array of person records including id, first_name, last_name, primary_email, and emails fields.
- **Get single Affinity person by ID** (Get). Get a specific person in Affinity by id. Returns fields such as id, first_name, last_name, primary_email, emails, organization_ids, opportunity_ids, current_organization_ids, and list_entries.
- **Create a Affinity person** (Create). Create a new person in Affinity using first_name, last_name, and emails. Returns fields such as id, first_name, last_name, primary_email, emails, and organization_ids in the response.
- **Update a Affinity person by ID** (Update). Update a person in Affinity using id. Returns updated person details including first_name, last_name, emails, and organization_ids.
- **Delete a Affinity person by ID** (Delete). Delete a person in Affinity using id. Removes the person record associated with the specified id and returns confirmation of successful deletion.
- **List all Affinity email interactions** (List). List email interactions from Affinity. Returns a collection of email interaction records from the emails field of the API response.
- **List all Affinity call interactions** (List). List call interactions in Affinity. Returns a collection of call records from the calls response field.
- **List all Affinity meeting interactions** (List). List meeting interactions in Affinity. Returns a collection of meeting records from the interactions endpoint, filtered to meetings only.
- **Get single Affinity meeting interaction by ID** (Get). Get a single meeting interaction in Affinity by id. Returns the full meeting interaction record for the specified id.
- **Get single Affinity interaction by ID** (Get). Get details for a specific interaction in Affinity. Requires id and type. Returns fields including date, direction, manual_creator_id, persons, type, and notes for the interaction.
- **Create a Affinity interaction** (Create). Create a new interaction in Affinity with required parameters type, person_ids, content, and date. Returns fields such as id, date, attendees, type, title, notes, and persons associated with the interaction.
- **Update a Affinity interaction by ID** (Update). Update an existing interaction in Affinity using id, type, and person_ids. Returns fields such as id, date, attendees, title, type, notes, and persons with their details for confirmation of update.
- **Delete a Affinity interaction by ID** (Delete). Delete a specific interaction in Affinity using id and type. Returns confirmation of successful deletion.
- **List all Affinity interactions** (List). List interactions in Affinity filtered by type, start_time, and end_time. Returns key fields such as interaction id, timestamps, participants, and related entities.
- **List all Affinity chat interactions** (List). List chat interactions in Affinity. Returns a collection of chat interaction objects from the chats response field.
- **List all Affinity events** (List). List events in Affinity. Returns a collection of event objects from the authenticated organization's account.
- **Create a Affinity event** (Create). Create a new event in Affinity. Returns the created event object including its id and associated details.
- **List all Affinity lists** (List). List all lists visible to the user in Affinity. Returns id, name, type, public, owner_id, and list_size fields for each list.
- **Get single Affinity list by ID** (Get). Get details about a specific list in Affinity using id. Returns list attributes including id, type, name, public, owner_id, list_size, and fields with field id, name, value_type, allows_multiple, and dropdown_options.
- **Create a Affinity list** (Create). Create a new list in Affinity with specified name, type, and is_public parameters. Returns the created list with fields such as id, name, type, and is_public in the response.
- **List all Affinity fields** (List). List all fields in Affinity. Returns id, name, list_id, enrichment_source, value_type, allows_multiple, track_changes, and dropdown_options for each field.
- **Create a Affinity field** (Create). Create a new field in Affinity. Requires name, entity_type, and value_type. Returns id, name, list_id, enrichment_source, value_type, allows_multiple, track_changes, and dropdown_options for the created field.
- **Delete a Affinity field by ID** (Delete). Delete a specific field in Affinity using id. Returns confirmation of deletion.
- **List all Affinity person fields** (List). Get global person fields in Affinity. Returns an array of global fields that exist on people including id, name, value_type, allows_multiple, and dropdown_options.
- **List all Affinity organization fields** (List). List all global organization fields in Affinity. Returns id, name, value_type, allows_multiple, and dropdown_options for each field.
- **List all Affinity rate limits** (List). Querying the rate limit endpoint will yield information about account (AKA organization)-level and API key-level rate limits and usage. The rate limit resource, a JSON body of data including limits, calls remaining, seconds until reset and call count.
- **List all Affinity list entries** (List). Get all list entries for list_id in Affinity. Returns an array of list entries including id, list_id, creator_id, entity_id, created_at, and entity details such as type, first_name, last_name, and primary_email.
- **Get single Affinity list entry by ID** (Get). Get a specific list entry by list_id and id in Affinity. Returns fields id, list_id, creator_id, entity_id, created_at, and entity details including type, first_name, last_name, primary_email, and emails.
- **Create a Affinity list entry** (Create). Create a new list entry in Affinity. Requires list_id and entity_id. Returns id, list_id, creator_id, entity_id, created_at, and entity details including type, first_name, last_name, and primary_email.
- **Delete a Affinity list entry by ID** (Delete). Delete a specific list entry in Affinity. Requires list_id and id. Returns success indicating the deletion was completed. Also deletes all associated field values and, if part of an opportunity list, deletes the associated opportunity.
- **List all Affinity field values** (List). Get all field values attached to a person, organization, opportunity, or list_entry in Affinity. Requires one of person_id, organization_id, opportunity_id, or list_entry_id. Returns id, field_id, entity_id, created_at, updated_at, and value fields.
- **Create a Affinity field value** (Create). Create a new field value in Affinity using required parameters field_id, entity_id, and value. Returns id, field_id, entity_id, list_entry_id, created_at, updated_at, and value for the created field value.
- **Update a Affinity field value by ID** (Update). Update a field value in Affinity using id. Requires id. Returns the updated field value object with fields id, field_id, list_entry_id, entity_id, created_at, updated_at, and value reflecting the new data.
- **Delete a Affinity field value by ID** (Delete). Delete a field value in Affinity. Requires id. Returns confirmation of deletion with relevant metadata fields if applicable.
- **List all Affinity field values changes** (List). List field-values-changes in Affinity for a specific field using field_id. Returns an array of changes including action_type, old_value, new_value, and timestamps relevant to the field’s modifications.
- **List all Affinity relationship strength** (List). Get relationship strength in Affinity for a specific external_id. Returns key metrics such as score and influencing factors for the evaluated relationship.
- **List all Affinity reminders** (List). List reminders in Affinity filtered by optional parameters like person_id, organization_id, opportunity_id, creator_id, owner_id, completer_id, type, reset_type, status, due_before, and due_after. Returns reminders with fields such as id, type, content, created_at, due_date, status, creator, owner, person, organization, opportunity, and reminder_days.
- **Get single Affinity reminder by ID** (Get). Get details of a specific reminder in Affinity using id. Returns id, type, created_at, content, due_date, status, and related person, creator, and owner information.
- **Create a Affinity reminder** (Create). Create a new reminder in Affinity. Requires owner_id, type, and due_date when type=0. Returns fields such as id, type, content, due_date, status, and creator in the response.
- **Update a Affinity reminder by ID** (Update). Update a reminder in Affinity by id. Allows modifying fields such as type, reset_type, reminder_days, due_date, and content. Returns the updated reminder resource including id, type, content, due_date, status, and creator details.
- **Delete a Affinity reminder by ID** (Delete). Delete a specific reminder in Affinity. Requires id. Returns confirmation of successful deletion.
- **List all Affinity files** (List). List all files in Affinity. Returns entity_files array containing all files within your organization and next_page_token for pagination.
- **Get single Affinity file by ID** (Get). Get a specific file in Affinity using id. Returns details of the entity file including metadata and file information.
- **Affinity files download** (Download). Download a specific file in Affinity using id. Returns the actual file corresponding to the id.
- **Affinity files upload** (Upload). Upload file attachments in Affinity for a specific entity using person_id. Returns uploaded file details including id, file name, and associated entity information. Requires person_id and at least one file or files parameter.
