Use when working with Affinity CRM via MCP tools - find entities, manage workflows, log interactions, prepare briefings, find warm intros. Also use when user mentions "pipeline", "deals", "relationship strength", or wants to prepare for meetings.
/plugin marketplace add yaniv-golan/affinity-sdk/plugin install mcp@xaffinityThis skill inherits all available tools. When active, it can use any tool Claude has access to.
This skill covers the xaffinity MCP server tools, prompts, and resources for working with Affinity CRM.
The MCP server requires the xaffinity CLI to be installed:
pip install "affinity-sdk[cli]"
The CLI must be configured with an API key before the MCP server will work.
Only use tools or prompts that modify CRM data when the user explicitly asks to do so.
Write operations include:
execute-write-commandlog-interaction-and-update-workflow, change-status, log-call, log-messageRead-only operations (search, lookup, briefings) can be used proactively to help the user. But never create, update, or delete CRM records unless the user specifically requests it.
The CLI Gateway provides full access to the xaffinity CLI:
| Tool | Use Case |
|---|---|
discover-commands | Search CLI commands by keyword (e.g., "create person", "export list") |
execute-read-command | Execute read-only CLI commands (get, search, list, export) |
execute-write-command | (write) Execute write CLI commands (create, update, delete) |
Usage pattern:
discover-commands(query: "create person", category: "write")execute-write-command(command: "person create", argv: ["--first-name", "John", "--last-name", "Doe"])| Tool | Use Case |
|---|---|
get-entity-dossier | Comprehensive entity info (details, relationship strength, interactions, notes, list memberships) |
read-xaffinity-resource | Access dynamic resources via xaffinity:// URIs |
Commands that delete data require double confirmation:
execute-read-command to show what will be deletedconfirm: trueExample flow:
User: "Delete person 123"
You: execute-read-command(command: "person get", argv: ["123"])
You: "This will permanently delete John Smith (ID: 123, email: john@example.com).
Type 'yes' to confirm deletion."
[Stop here and wait for user's response]
User: "yes"
You: execute-write-command(command: "person delete", argv: ["123"], confirm: true)
Use discover-commands to find commands, then execute-read-command or execute-write-command to run them.
| Command | Use Case |
|---|---|
person ls --query "..." | Search persons by name/email |
company ls --filter 'name =~ "..."' | Search companies |
list ls | List all Affinity lists |
list export "<listName>" | Export list entries (supports --filter) |
field ls --list-id <id> | Get field definitions and dropdown options for a list |
| Command | Use Case |
|---|---|
person get <id> | Get person details |
company get <id> | Get company details |
opportunity get <id> | Get opportunity details |
relationship-strength ls --external-id <id> | Get relationship strength for a person |
interaction ls --person-id <id> --type email | Get interactions (types: email, meeting, call, chat-message) |
| Command | Use Case |
|---|---|
interaction create --type call --person-id <id> | Log a call/meeting/email |
note create --person-id <id> --content "..." | Add a note |
field-value set --list-entry-id <id> --field-id <id> --value "..." | Update a field value |
person create --first-name "..." --last-name "..." | Create a person |
These prompts provide guided multi-step workflows. Suggest them when appropriate.
Note: Prompts marked with (write) modify CRM data - only use when user explicitly requests.
| Prompt | Type | When to Suggest |
|---|---|---|
prepare-briefing | read-only | User has upcoming meeting, needs context on a person/company |
pipeline-review | read-only | User wants weekly/monthly pipeline review |
warm-intro | read-only | User wants to find introduction path to someone |
interaction-brief | read-only | Get interaction history summary for an entity |
log-interaction-and-update-workflow | write | User explicitly asks to log a call/meeting and update pipeline |
change-status | write | User explicitly asks to move a deal to new stage |
log-call | write | User explicitly asks to log a phone call |
log-message | write | User explicitly asks to log a chat/text message |
Prompts are invoked with arguments. Example:
prepare-briefing(entityName: "John Smith", meetingType: "demo")warm-intro(targetName: "Jane Doe", context: "partnership discussion")log-interaction-and-update-workflow(personName: "Alice", interactionType: "call", summary: "Discussed pricing")Access dynamic data via xaffinity:// URIs using read-xaffinity-resource:
| URI | Returns |
|---|---|
xaffinity://me | Current authenticated user details |
xaffinity://me/person-id | Current user's person ID in Affinity |
xaffinity://interaction-enums | Valid interaction types and directions |
xaffinity://saved-views/{listId} | Saved views available for a list |
xaffinity://field-catalogs/{listId} | Field definitions for a list |
xaffinity://workflow-config/{listId} | Workflow configuration for a list |
get-entity-dossier for full context (relationship strength, recent interactions, notes)prepare-briefing prompt for a guided flowexecute-write-command with interaction create to log what happenedexecute-read-command with list export to find list entry (if updating pipeline)execute-write-command with field-value set if deal stage changedlog-interaction-and-update-workflow promptexecute-read-command with person ls to locate target personexecute-read-command with relationship-strength ls for connection strengthwarm-intro prompt for guided flowexecute-read-command with field ls --list-id to see fields/statusesexecute-read-command with list export to see itemspipeline-review promptexecute-read-command with list export to find the entryexecute-read-command with field ls --list-id to see available statusesexecute-write-command with field-value set to updatechange-status promptperson, company, opportunitycall, meeting, email, chat_message, in_personget-entity-dossier returns relationship strength, interactions, notes, and list memberships in one calllist export "Dealflow")--filter 'field op "value"' (ops: =, !=, =~ contains, =^ starts with)If tools aren't working or returning unexpected results:
# Enable (persistent, works with any MCP client)
mkdir -p ~/.config/xaffinity-mcp && touch ~/.config/xaffinity-mcp/debug
# Restart the MCP client (Claude Desktop: Cmd+Q, reopen)
# Disable when done
rm ~/.config/xaffinity-mcp/debug
Claude Desktop: tail -f ~/Library/Logs/Claude/mcp-server-*.log
Debug logs show component prefixes like [xaffinity:tool:1.2.3] to identify which component produced each message.
| Symptom | Likely Cause | Fix |
|---|---|---|
| Tools show old behavior after update | Cached MCP server process | Fully quit and restart Claude Desktop |
| API key errors | Key not configured | Run xaffinity config setup-key |
| CLI version errors | Outdated CLI | Run pip install --upgrade affinity-sdk |
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.