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).
24 tools: 1 change things and 23 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things1Claude Code: ask: see these tools
- Only reads23Claude Code: allow: see these tools
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/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "sprucehealth_list_contact_integration_links" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "sprucehealth_list_contact_integration_links" says "list": a word for reading.
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
sprucehealth_list_contact_integration_linksLinks between a contact and external systems (Elation, Hint, athena, custom): type, external id, url.1 finding
Why it is in this group
- The name "sprucehealth_list_contact_integration_links" says "list": a word for reading.
- The description's first verb is "link": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "sprucehealth_list_contact_integration_links" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "sprucehealth_list_contact_integration_links" says "list": a word for reading.
Description, as the server wrote it Links between a contact and external systems (Elation, Hint, athena, custom): type, external id, url. GET /contacts/{contactId}/integrationlinks.
Annotations the server declares
- title: List a contact's integration links
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
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/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .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.