Skip to content

Spruce Health MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.7.3 · published by io.usefulapi

Read Spruce Health contacts, conversations, messages, phone lines and team members (read-only).

Changes · 1

24 tools: 1 change things and 23 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http spruce-health https://spruce-health.usefulapi.io/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "sprucehealth_list_contact_integration_links" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "sprucehealth_list_contact_integration_links" says "list": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

24 tools

Changes things 1Claude Code: ask
Only reads 23Claude Code: allow
  • sprucehealth_get_contactOne contact by Spruce contact id (entity_…): demographics, phones, emails, tags, custom and organization fields, integration links.No findings

    Why it is in this group

    • The name "sprucehealth_get_contact" says "get": a word for reading.
    Description, as the server wrote it
    One contact by Spruce contact id (entity_…): demographics, phones, emails, tags, custom and organization fields, integration links. GET /contacts/{contactId}.

    Annotations the server declares

    • title: Get a contact
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_get_conversationOne conversation by id (t_…).No findings

    Why it is in this group

    • The name "sprucehealth_get_conversation" says "get": a word for reading.
    Description, as the server wrote it
    One conversation by id (t_…). GET /conversations/{conversationId}.

    Annotations the server declares

    • title: Get a conversation
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_get_conversation_itemOne conversation item (message, note, call, voicemail…) by id (ti_…).No findings

    Why it is in this group

    • The name "sprucehealth_get_conversation_item" says "get": a word for reading.
    Description, as the server wrote it
    One conversation item (message, note, call, voicemail…) by id (ti_…). GET /conversationItems/{conversationItemId}.

    Annotations the server declares

    • title: Get a conversation message
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_get_memberOne organization member (teammate, team or the organization) by id.No findings

    Why it is in this group

    • The name "sprucehealth_get_member" says "get": a word for reading.
    Description, as the server wrote it
    One organization member (teammate, team or the organization) by id. GET /organization/members/{memberId}.

    Annotations the server declares

    • title: Get an organization member
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_get_organizationYour Spruce organization (id and name).No findings

    Why it is in this group

    • The name "sprucehealth_get_organization" says "get": a word for reading.
    Description, as the server wrote it
    Your Spruce organization (id and name). The id is the owner/member id used by other objects. Good first call. GET /organization.

    Annotations the server declares

    • title: Get the organization
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_get_phone_lineOne phone line by id (pd_…).No findings

    Why it is in this group

    • The name "sprucehealth_get_phone_line" says "get": a word for reading.
    Description, as the server wrote it
    One phone line by id (pd_…). GET /phonelines/{phonelineId}.

    Annotations the server declares

    • title: Get a phone line
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_get_transcriptionThe full transcription text and its summary (if any) for a transcription id (the transcriptionId on a call/voicemail attachment).No findings

    Why it is in this group

    • The name "sprucehealth_get_transcription" says "get": a word for reading.
    Description, as the server wrote it
    The full transcription text and its summary (if any) for a transcription id (the transcriptionId on a call/voicemail attachment). Status pending/completed/failed/noSpeech. GET /transcriptions/{transcriptionId}.

    Annotations the server declares

    • title: Get a transcription
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_contact_conversationsThe conversations (secure, SMS/phone, email, fax…) associated with one contact.No findings

    Why it is in this group

    • The name "sprucehealth_list_contact_conversations" says "list": a word for reading.
    Description, as the server wrote it
    The conversations (secure, SMS/phone, email, fax…) associated with one contact. GET /contacts/{contactId}/conversations.

    Annotations the server declares

    • title: List a contact's conversations
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_contact_fieldsThe organization-wide contact fields shown on every contact.No findings

    Why it is in this group

    • The name "sprucehealth_list_contact_fields" says "list": a word for reading.
    Description, as the server wrote it
    The organization-wide contact fields shown on every contact. Paged; totalCount included. GET /contacts/fields.

    Annotations the server declares

    • title: List organization contact fields
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_contact_tagsAll contact tags of the organization.No findings

    Why it is in this group

    • The name "sprucehealth_list_contact_tags" says "list": a word for reading.
    Description, as the server wrote it
    All contact tags of the organization. Paged with hasMore/paginationToken; totalCount included. GET /contacts/tags.

    Annotations the server declares

    • title: List contact tags
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_contactsContacts of the organization (patients, professionals, clinics): name, date of birth, phones, emails, tags, custom fields, integration links.No findings

    Why it is in this group

    • The name "sprucehealth_list_contacts" says "list": a word for reading.
    Description, as the server wrote it
    Contacts of the organization (patients, professionals, clinics): name, date of birth, phones, emails, tags, custom fields, integration links. Paged with hasMore/paginationToken; totalCount included. Use sprucehealth_search_contacts to find someone. GET /contacts.

    Annotations the server declares

    • title: List contacts
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_conversation_itemsThe items (messages, internal notes, calls, voicemails, faxes, attachments with short-lived signed URLs) in one conversation.No findings

    Why it is in this group

    • The name "sprucehealth_list_conversation_items" says "list": a word for reading.
    Description, as the server wrote it
    The items (messages, internal notes, calls, voicemails, faxes, attachments with short-lived signed URLs) in one conversation. Order newest_first (default) or oldest_first; start_from = only items created after that time. Paged with hasMore/paginationToken; totalCount is a best-effort count. GET /conversations/{conversationId}/items.

    Annotations the server declares

    • title: List conversation messages
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_conversation_scheduled_messagesMessages scheduled to be sent later in one conversation (read only; nothing is sent or cancelled).No findings

    Why it is in this group

    • The name "sprucehealth_list_conversation_scheduled_messages" says "list": a word for reading.
    Description, as the server wrote it
    Messages scheduled to be sent later in one conversation (read only; nothing is sent or cancelled). GET /conversations/{conversationId}/scheduledmessages.

    Annotations the server declares

    • title: List a conversation's scheduled messages
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_conversation_tagsAll conversation tags of the organization.No findings

    Why it is in this group

    • The name "sprucehealth_list_conversation_tags" says "list": a word for reading.
    Description, as the server wrote it
    All conversation tags of the organization. Paged; totalCount included. GET /conversations/tags.

    Annotations the server declares

    • title: List conversation tags
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_conversationsConversations of the organization (title, type, tags, archived, assignee, participants, last message time), ordered by creation or last message.No findings

    Why it is in this group

    • The name "sprucehealth_list_conversations" says "list": a word for reading.
    Description, as the server wrote it
    Conversations of the organization (title, type, tags, archived, assignee, participants, last message time), ordered by creation or last message. With start_from, only conversations whose ordering time is at or after it (useful for 'what changed since…'). Eventually consistent. Paged; give start_from OR pagination_token, not both. GET /conversations.

    Annotations the server declares

    • title: List conversations
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_internal_endpointsThe organization's own channels: Spruce phone and fax numbers, email addresses and Spruce Links, with their owner and members.No findings

    Why it is in this group

    • The name "sprucehealth_list_internal_endpoints" says "list": a word for reading.
    Description, as the server wrote it
    The organization's own channels: Spruce phone and fax numbers, email addresses and Spruce Links, with their owner and members. GET /internalendpoints.

    Annotations the server declares

    • title: List internal endpoints
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_membersAll members of the organization: teammates (name, email, admin, suspended), teams and the organization itself.No findings

    Why it is in this group

    • The name "sprucehealth_list_members" says "list": a word for reading.
    Description, as the server wrote it
    All members of the organization: teammates (name, email, admin, suspended), teams and the organization itself. Paged with hasMore/paginationToken; totalCount included. GET /organization/members.

    Annotations the server declares

    • title: List organization members
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_phone_linesAll phone lines of the organization (id, name); totalCount included.No findings

    Why it is in this group

    • The name "sprucehealth_list_phone_lines" says "list": a word for reading.
    Description, as the server wrote it
    All phone lines of the organization (id, name); totalCount included. GET /phonelines.

    Annotations the server declares

    • title: List phone lines
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_read_receiptsWho has read one conversation item and when they first read it (oldest first).No findings

    Why it is in this group

    • The name "sprucehealth_list_read_receipts" says "list": a word for reading.
    Description, as the server wrote it
    Who has read one conversation item and when they first read it (oldest first). GET /conversationItems/{conversationItemId}/readReceipts.

    Annotations the server declares

    • title: List a message's read receipts
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_saved_messagesSaved message templates (private and organization-wide): title, text, internal/shared flags.No findings

    Why it is in this group

    • The name "sprucehealth_list_saved_messages" says "list": a word for reading.
    Description, as the server wrote it
    Saved message templates (private and organization-wide): title, text, internal/shared flags. Paged with hasMore/paginationToken. GET /savedmessages.

    Annotations the server declares

    • title: List saved messages
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_scheduled_messagesAll messages scheduled to be sent from the organization (read only).No findings

    Why it is in this group

    • The name "sprucehealth_list_scheduled_messages" says "list": a word for reading.
    Description, as the server wrote it
    All messages scheduled to be sent from the organization (read only). Paged with hasMore/paginationToken; totalCount included. GET /scheduledmessages.

    Annotations the server declares

    • title: List scheduled messages
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_list_team_membersThe members of one team (team ids come from sprucehealth_list_members, type 'team').No findings

    Why it is in this group

    • The name "sprucehealth_list_team_members" says "list": a word for reading.
    Description, as the server wrote it
    The members of one team (team ids come from sprucehealth_list_members, type 'team'). Paged. GET /teams/{teamId}/members.

    Annotations the server declares

    • title: List a team's members
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sprucehealth_search_contactsFind contacts by free text and/or filters (category, tags, name, phone, email, invite state, created time).No findings

    Why it is in this group

    • The name "sprucehealth_search_contacts" says "search": a word for reading.
    Description, as the server wrote it
    Find contacts by free text and/or filters (category, tags, name, phone, email, invite state, created time). Filters combine with AND; values inside one filter match ANY (tags can use all/none). Paged; totalCount with totalCountRelation (eq = exact, gte = lower bound). A read: POST /contacts/search changes nothing.

    Annotations the server declares

    • title: Search contacts
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.7.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http spruce-health https://spruce-health.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__spruce-health__sprucehealth_get_organization",
      "mcp__spruce-health__sprucehealth_list_members",
      "mcp__spruce-health__sprucehealth_get_member",
      "mcp__spruce-health__sprucehealth_list_team_members",
      "mcp__spruce-health__sprucehealth_list_contacts",
      "mcp__spruce-health__sprucehealth_search_contacts",
      "mcp__spruce-health__sprucehealth_get_contact",
      "mcp__spruce-health__sprucehealth_list_contact_conversations",
      "mcp__spruce-health__sprucehealth_list_contact_tags",
      "mcp__spruce-health__sprucehealth_list_contact_fields",
      "mcp__spruce-health__sprucehealth_list_conversations",
      "mcp__spruce-health__sprucehealth_get_conversation",
      "mcp__spruce-health__sprucehealth_list_conversation_items",
      "mcp__spruce-health__sprucehealth_get_conversation_item",
      "mcp__spruce-health__sprucehealth_list_read_receipts",
      "mcp__spruce-health__sprucehealth_get_transcription",
      "mcp__spruce-health__sprucehealth_list_conversation_tags",
      "mcp__spruce-health__sprucehealth_list_conversation_scheduled_messages",
      "mcp__spruce-health__sprucehealth_list_scheduled_messages",
      "mcp__spruce-health__sprucehealth_list_saved_messages",
      "mcp__spruce-health__sprucehealth_list_internal_endpoints",
      "mcp__spruce-health__sprucehealth_list_phone_lines",
      "mcp__spruce-health__sprucehealth_get_phone_line"
    ],
    "ask": [
      "mcp__spruce-health__sprucehealth_list_contact_integration_links"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as spruce-health. Review it before you use it.