Skip to main content
Glama
wealthbox-mcp

wealthbox-mcp

by rhyeal

wealthbox-mcp

A Model Context Protocol (MCP) server that exposes the Wealthbox CRM API to MCP-enabled clients (e.g., Claude Desktop).

Requirements

  • Node.js 18+ (uses global fetch)

  • A Wealthbox API Access Token (Personal access token)

Installation

Global install:

npm i -g wealthbox-mcp

Local (from source):

npm install
npm run build

Configuration

Provide your Wealthbox token via environment variable or a local file:

  • WEALTHBOX_TOKEN (required): your Wealthbox API access token; sent as ACCESS_TOKEN header per docs

  • WEALTHBOX_API_BASE_URL (optional): defaults to https://api.crmworkspace.com

  • Optional local file fallback: wealthbox_key.txt (first line)

Example (stdio run):

WEALTHBOX_TOKEN=your_token_here wealthbox-mcp
# or if running from source
WEALTHBOX_TOKEN=your_token_here node dist/index.js

Using with Claude (MCP)

Add to your Claude Desktop config (platform-specific path). Minimal example:

{
  "mcpServers": {
    "wealthbox": {
      "command": "wealthbox-mcp",
      "env": {
        "WEALTHBOX_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}

After starting Claude, you can ask it to list tools and call them. Example prompts:

  • "List all MCP tools from the wealthbox server."

  • "Call the wealthbox.health tool and show the full structured JSON."

  • "Call the wealthbox.getMe tool and print the full structured JSON."

Tools Overview

Core tools map to Wealthbox REST endpoints. Many create/update tools accept explicit fields and also an optional raw body that overrides field parameters when provided.

  • Health and basics

    • wealthbox.health – GET /v1/me and return ok + profile

    • wealthbox.getMe – GET /v1/me

    • wealthbox.listUsers – GET /v1/users

    • wealthbox.listTeams – GET /v1/teams

    • wealthbox.request – Generic caller: { method, path, body?, query? }

  • Contacts

    • wealthbox.contacts.list – GET /v1/contacts

    • wealthbox.contacts.get – GET /v1/contacts/{id}

    • wealthbox.contacts.create – POST /v1/contacts

    • wealthbox.contacts.update – PUT /v1/contacts/{id}

    • wealthbox.contacts.delete – DELETE /v1/contacts/{id}

  • Tasks

    • wealthbox.tasks.list – GET /v1/tasks

    • wealthbox.tasks.get – GET /v1/tasks/{id}

    • wealthbox.tasks.create – POST /v1/tasks

    • wealthbox.tasks.update – PUT /v1/tasks/{id}

    • wealthbox.tasks.delete – DELETE /v1/tasks/{id}

  • Events

    • wealthbox.events.list – GET /v1/events

    • wealthbox.events.get – GET /v1/events/{id}

    • wealthbox.events.create – POST /v1/events

    • wealthbox.events.update – PUT /v1/events/{id}

    • wealthbox.events.delete – DELETE /v1/events/{id}

  • Notes

    • wealthbox.notes.list – GET /v1/notes

    • wealthbox.notes.get – GET /v1/notes/{id}

    • wealthbox.notes.create – POST /v1/notes

    • wealthbox.notes.update – PUT /v1/notes/{id}

  • Opportunities

    • wealthbox.opportunities.list – GET /v1/opportunities

    • wealthbox.opportunities.get – GET /v1/opportunities/{id}

    • wealthbox.opportunities.create – POST /v1/opportunities

    • wealthbox.opportunities.update – PUT /v1/opportunities/{id}

    • wealthbox.opportunities.delete – DELETE /v1/opportunities/{id}

  • Projects

    • wealthbox.projects.list – GET /v1/projects

    • wealthbox.projects.get – GET /v1/projects/{id}

    • wealthbox.projects.create – POST /v1/projects

    • wealthbox.projects.update – PUT /v1/projects/{id}

    • wealthbox.projects.delete – DELETE /v1/projects/{id}

  • Comments & Activity Stream

    • wealthbox.comments.list – GET /v1/comments{?resource_id,resource_type,updated_since,updated_before}

    • wealthbox.activityStream.list – GET /v1/activity_stream

  • Metadata & Categories

    • wealthbox.userGroups.list – GET /v1/user_groups

    • wealthbox.tags.list – GET /v1/tags{?document_type} (document_type: Contact or Note)

    • wealthbox.categories.list – GET /v1/categories/{type} where type ∈ tags|custom_fields|opportunity_stages|opportunity_pipelines|contact_types|contact_sources|task_categories|event_categories|file_categories|investment_objectives|financial_account_types|email_types|phone_types|address_types|website_types|contact_roles

    • wealthbox.customFields.list – GET /v1/custom_fields

    • wealthbox.contactRoles.list – GET /v1/contact_roles

  • Workflows

    • wealthbox.workflows.list – GET /v1/workflows

    • wealthbox.workflows.get – GET /v1/workflows/{id}

    • wealthbox.workflows.create – POST /v1/workflows

    • wealthbox.workflows.delete – DELETE /v1/workflows/{id}

    • wealthbox.workflowTemplates.list – GET /v1/workflow_templates

    • wealthbox.workflowTemplates.get – GET /v1/workflow_templates/{id}

    • wealthbox.workflowSteps.complete – POST /v1/workflow_steps/{id}/complete

    • wealthbox.workflowSteps.revert – POST /v1/workflow_steps/{id}/revert

  • Households

    • wealthbox.households.addMember – POST /v1/households/{household_id}/members

    • wealthbox.households.deleteMember – DELETE /v1/households/{household_id}/members/{id}

Parameter Hints (selected)

Contacts list (query)

{
  "query": {
    "name": "string",
    "email": "string",
    "phone": "string",
    "contact_type": "string",
    "id": 123,
    "active": true,
    "tags": ["VIP", "Newsletter"],
    "type": "person",
    "page": 1,
    "per_page": 5
  }
}

Example: { "query": { "name": "John Smith", "per_page": 10 } }

Notes

// wealthbox.notes.create
{
  "content": "Updated with Claude via Wealthbox MCP",
  "linked_to": [{ "id": 12345, "type": "Contact" }]
}
// wealthbox.notes.update
{ "id": 211578273, "content": "New contents" }

Tasks

// wealthbox.tasks.create
{ "title": "Call client", "due_date": "2025-10-04", "assigned_to_user_id": 123 }

Contacts

// wealthbox.contacts.create
{ "first_name": "Ada", "last_name": "Lovelace", "emails": [{ "address": "ada@example.com", "type": "Work" }] }

Households

// wealthbox.households.addMember
{ "household_id": 1, "id": 2, "title": "Head" }

Tags/Categories

// wealthbox.tags.list
{ "document_type": "Contact" }

// wealthbox.categories.list
{ "type": "contact_sources" }

Security

  • Do not commit your token. The token is loaded from WEALTHBOX_TOKEN or a local file (wealthbox_key.txt) which is ignored by git and npm.

  • The server uses HTTPS to talk to Wealthbox’s API endpoint https://api.crmworkspace.com.

Development

Run locally (stdio):

npm install
npm run build
WEALTHBOX_TOKEN=$(cat wealthbox_key.txt) node dist/index.js

License

MIT

Acknowledgements

Built on the TypeScript MCP SDK. See the Wealthbox API docs for full parameter and response details: https://dev.wealthbox.com/

Available Tools

51 tools
wealthbox.activityStream.listC

Retrieve activity stream. Query params: updated_since, updated_before, page, per_page.

Inputs: query.

wealthbox.categories.listC

List members of a customizable category

Inputs: type (required).

wealthbox.comments.listC

List comments (optionally by resource). Query params: resource_id, resource_type, updated_since, updated_before, page, per_page.

Inputs: page, per_page, resource_id, resource_type, +2 more.

wealthbox.contactRoles.listB

List contact roles

Inputs: no named parameters.

wealthbox.contacts.createC

Create contact. Example: {"first_name":"Ada","last_name":"Lovelace"}. You can also provide a raw body.

Inputs: body, tags, type, emails, +4 more.

wealthbox.contacts.deleteC

Delete contact

Inputs: id (required).

wealthbox.contacts.getB

Get contact by id

Inputs: id (required).

wealthbox.contacts.listB

List contacts. Query params: name, email, phone, contact_type, id, active, tags[], type (person|household|organization|trust), page, per_page. Example: {"query":{"name":"John","per_page":10}}

Inputs: query.

wealthbox.contacts.updateA

Update contact. Provide id and changed fields. You can also pass raw body.

Inputs: id (required), body, tags, type, +5 more.

wealthbox.customFields.listA

List custom fields

Inputs: no named parameters.

wealthbox.events.createB

Create event. Example: {"title":"Review","starts_at":"2025-10-04 10:00","ends_at":"2025-10-04 11:00"}

Inputs: body, title, ends_at, location, +3 more.

wealthbox.events.deleteD

Delete event

Inputs: id (required).

wealthbox.events.getB

Get event by id

Inputs: id (required).

wealthbox.events.listC

List events. Query params: title, category_id, starts_after, starts_before, ends_after, ends_before, updated_since, updated_before, page, per_page.

Inputs: query.

wealthbox.events.updateB

Update event by id. You can also pass raw body.

Inputs: id (required), body, title, ends_at, +4 more.

wealthbox.getMeA

Retrieve login profile information for the authenticated user

Inputs: no named parameters.

wealthbox.healthA

Health check that hits /v1/me to verify token and connectivity

Inputs: no named parameters.

wealthbox.households.addMemberA

Add member to a household. Provide household_id and either id+title or raw body.

Inputs: household_id (required), id, body, title.

wealthbox.households.deleteMemberB

Delete member from a household

Inputs: id (required), household_id (required).

wealthbox.listTeamsA

List all teams in the authenticated account

Inputs: no named parameters.

wealthbox.listUsersA

List all users accessible to the authenticated account

Inputs: no named parameters.

wealthbox.notes.createA

Create note. Example: {"content": "Note text", "linked_to": [{"id": 12345, "type": "Contact"}]}

Inputs: body, content, linked_to.

wealthbox.notes.getB

Get note by id

Inputs: id (required).

wealthbox.notes.listC

List notes. Query params: updated_since, updated_before, page, per_page.

Inputs: query.

wealthbox.notes.updateB

Update note content by id. You can pass {content} directly, or a raw body.

Inputs: id (required), body, content.

wealthbox.opportunities.createC

Create opportunity. Example: {"name":"New deal","pipeline_id":1,"stage_id":2,"amount":10000}

Inputs: body, name, amount, stage_id, +4 more.

wealthbox.opportunities.deleteC

Delete opportunity

Inputs: id (required).

wealthbox.opportunities.getB

Get opportunity by id

Inputs: id (required).

wealthbox.opportunities.listB

List opportunities. Query params: name, pipeline_id, stage_id, amount_min, amount_max, close_after, close_before, updated_since, updated_before, page, per_page.

Inputs: query.

wealthbox.opportunities.updateC

Update opportunity by id. You can also pass raw body.

Inputs: id (required), body, name, amount, +5 more.

wealthbox.projects.createC

Create project. Example: {"name":"Onboarding","description":"..."}

Inputs: body, name, status, due_date, +1 more.

wealthbox.projects.deleteC

Delete project

Inputs: id (required).

wealthbox.projects.getC

Get project by id

Inputs: id (required).

wealthbox.projects.listB

List projects. Query params: name, status, due_after, due_before, updated_since, updated_before, page, per_page.

Inputs: query.

wealthbox.projects.updateC

Update project by id. You can also pass raw body.

Inputs: id (required), body, name, status, +2 more.

wealthbox.requestC

Generic Wealthbox API request tool supporting method, path, body, and query

Inputs: path (required), method (required), body, query.

wealthbox.tags.listB

List tags (optionally by document_type)

Inputs: document_type.

wealthbox.tasks.createB

Create task. Example: {"title":"Call client","due_date":"2025-10-04"}. You can also provide a raw body.

Inputs: body, title, due_date, category_id, +3 more.

wealthbox.tasks.deleteC

Delete task

Inputs: id (required).

wealthbox.tasks.getB

Get task by id

Inputs: id (required).

wealthbox.tasks.listB

List tasks. Query params: title, assigned_to_user_id, assigned_to_team_id, category_id, completed (boolean), due_date (YYYY-MM-DD), updated_since, updated_before, page, per_page.

Inputs: query.

wealthbox.tasks.updateB

Update task by id. You can also pass raw body.

Inputs: id (required), body, title, due_date, +4 more.

wealthbox.userGroups.listB

List user groups

Inputs: no named parameters.

wealthbox.workflows.createD

Create workflow

Inputs: body (required).

wealthbox.workflows.deleteC

Delete workflow

Inputs: id (required).

wealthbox.workflows.getB

Get workflow by id

Inputs: id (required).

wealthbox.workflows.listB

List workflows. Query params: status, template_id, updated_since, updated_before, page, per_page.

Inputs: query.

wealthbox.workflowSteps.completeC

Complete a workflow step

Inputs: id (required).

wealthbox.workflowSteps.revertC

Revert a workflow step

Inputs: id (required).

wealthbox.workflowTemplates.getB

Get workflow template by id

Inputs: id (required).

wealthbox.workflowTemplates.listB

List workflow templates. Query params: page, per_page.

Inputs: query.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 51 tools

    Disambiguation5/5

    Each tool targets a distinct resource-action pair, with standard CRUD verbs and clear resource prefixes. The only potential overlap is between health and getMe, but their descriptions clearly differentiate a connectivity check from profile retrieval. The generic request tool does not create ambiguity as it serves as a catch-all.

    Naming Consistency4/5

    The vast majority of tools follow the wealthbox.<resource>.<action> pattern with consistent snake_case CRUD verbs. Minor deviations include wealthbox.getMe, listUsers, listTeams, and request, plus camelCase actions like addMember/deleteMember, which break the pattern slightly but remain predictable.

    Tool Count3/5

    With 51 tools, this server is clearly on the heavy side, but the count is justified by the broad CRM domain covering over 10 entities with full CRUD operations. It may be overwhelming for agents, yet each tool serves a distinct purpose and no redundant tools exist.

    Completeness4/5

    Core entities (contacts, tasks, events, opportunities, projects) have complete CRUD coverage. Minor gaps exist, such as missing delete for notes, missing update for workflows, and limited operations for comments and templates, but these can be worked around with the generic request tool and do not severely hinder common workflows.

    Related MCP Connectors

    Related MCP Servers