Spruce Health MCP by usefulapi
Read Spruce Health contacts, conversations, messages, phone lines and team members (read-only).
¿Debería usar esto?
Calidad y seguridad
Hallazgos (12)
- LOWen sprucehealth_list_contact_conversations
- LOWen sprucehealth_list_contact_integration_links
- LOWen sprucehealth_list_contact_fields
- LOWen sprucehealth_list_conversations
- LOWen sprucehealth_list_conversation_items
- LOWen sprucehealth_get_conversation_item
- LOWen sprucehealth_list_read_receipts
- LOWen sprucehealth_list_conversation_tags
- LOWen sprucehealth_list_conversation_scheduled_messages
- LOWen sprucehealth_list_scheduled_messages
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"spruce-health": {
"url": "https://spruce-health.usefulapi.io/mcp"
}
}
}Puntos de conexión remotos
https://spruce-health.usefulapi.io/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (24)
🟢sprucehealth_get_organization
Your Spruce organization (id and name). The id is the owner/member id used by other objects. Good first call. GET /organization.
Esquema de entrada
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_members(page_size, pagination_token)
All members of the organization: teammates (name, email, admin, suspended), teams and the organization itself. Paged with hasMore/paginationToken; totalCount included. GET /organization/members.
Esquema de entrada
{
"type": "object",
"properties": {
"page_size": {
"description": "Results per page (2-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 2,
"maximum": 500
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_get_member(member_id)
One organization member (teammate, team or the organization) by id. GET /organization/members/{memberId}.
Esquema de entrada
{
"type": "object",
"properties": {
"member_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The member id (e.g. \"entity_0D4QABCC06000\")."
}
},
"required": [
"member_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_team_members(team_id, page_size, pagination_token)
The members of one team (team ids come from sprucehealth_list_members, type 'team'). Paged. GET /teams/{teamId}/members.
Esquema de entrada
{
"type": "object",
"properties": {
"team_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The team id (e.g. \"entity_0D4QABCC06000\")."
},
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"required": [
"team_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_contacts(page_size, pagination_token)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_search_contacts(free_text, categories, tags, tags_match, given_name, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"free_text": {
"description": "Free-text query (name, phone, email…).",
"type": "string",
"maxLength": 500
},
"categories": {
"description": "Contact categories to include.",
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"patient",
"professional",
"clinic",
"unknown"
]
}
},
"tags": {
"description": "Contact tag text values (the `value` of a tag from sprucehealth_list_contact_tags).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"tags_match": {
"description": "How the tags combine: any (default), all, or none (exclude).",
"type": "string",
"enum": [
"any",
"all",
"none"
]
},
"given_name": {
"description": "Given (first) name.",
"type": "string",
"maxLength": 200
},
"family_name": {
"description": "Family (last) name.",
"type": "string",
"maxLength": 200
},
"phone_numbers": {
"description": "Phone numbers, e.g. 2065551234 or +12065551234.",
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
},
"email_addresses": {
"description": "Email addresses.",
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 320,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"invite_states": {
"description": "Spruce account/invite state.",
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"has_account",
"invited",
"not_invited"
]
}
},
"created_from": {
"type": "string",
"description": "Only contacts added at or after this time (RFC 3339 with zone)."
},
"created_to": {
"type": "string",
"description": "Only contacts added at or before this time (RFC 3339 with zone)."
},
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_get_contact(contact_id)
One contact by Spruce contact id (entity_…): demographics, phones, emails, tags, custom and organization fields, integration links. GET /contacts/{contactId}.
Esquema de entrada
{
"type": "object",
"properties": {
"contact_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The contact id (e.g. \"entity_0E5QDGJC03000\")."
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_contact_conversations(contact_id)
The conversations (secure, SMS/phone, email, fax…) associated with one contact. GET /contacts/{contactId}/conversations.
Esquema de entrada
{
"type": "object",
"properties": {
"contact_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The contact id (e.g. \"entity_0E5QDGJC03000\")."
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_contact_integration_links(contact_id)
Links between a contact and external systems (Elation, Hint, athena, custom): type, external id, url. GET /contacts/{contactId}/integrationlinks.
Esquema de entrada
{
"type": "object",
"properties": {
"contact_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The contact id (e.g. \"entity_0E5QDGJC03000\")."
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_contact_tags(page_size, pagination_token)
All contact tags of the organization. Paged with hasMore/paginationToken; totalCount included. GET /contacts/tags.
Esquema de entrada
{
"type": "object",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_contact_fields(page_size, pagination_token)
The organization-wide contact fields shown on every contact. Paged; totalCount included. GET /contacts/fields.
Esquema de entrada
{
"type": "object",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_conversations(order_by, start_from, page_size, pagination_token)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"order_by": {
"description": "Order by creation time or last message time (default last_message).",
"type": "string",
"enum": [
"created",
"last_message"
]
},
"start_from": {
"type": "string",
"description": "Only conversations whose ordering time is at or after this RFC 3339 date-time (with zone)."
},
"page_size": {
"description": "Results per page (1-200). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_get_conversation(conversation_id)
One conversation by id (t_…). GET /conversations/{conversationId}.
Esquema de entrada
{
"type": "object",
"properties": {
"conversation_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The conversation id (e.g. \"t_0E5QDJJC03000\")."
}
},
"required": [
"conversation_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_conversation_items(conversation_id, order, start_from, page_size, pagination_token)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"conversation_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The conversation id (e.g. \"t_0E5QDJJC03000\")."
},
"order": {
"description": "Order of the items (default newest_first).",
"type": "string",
"enum": [
"newest_first",
"oldest_first"
]
},
"start_from": {
"type": "string",
"description": "Only items created after this RFC 3339 date-time (with zone)."
},
"page_size": {
"description": "Results per page (1-200). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"required": [
"conversation_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_get_conversation_item(conversation_item_id)
One conversation item (message, note, call, voicemail…) by id (ti_…). GET /conversationItems/{conversationItemId}.
Esquema de entrada
{
"type": "object",
"properties": {
"conversation_item_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The conversation item id (e.g. \"ti_0D4QABCC06000\")."
}
},
"required": [
"conversation_item_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_read_receipts(conversation_item_id)
Who has read one conversation item and when they first read it (oldest first). GET /conversationItems/{conversationItemId}/readReceipts.
Esquema de entrada
{
"type": "object",
"properties": {
"conversation_item_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The conversation item id (e.g. \"ti_0D4QABCC06000\")."
}
},
"required": [
"conversation_item_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_get_transcription(transcription_id)
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}.
Esquema de entrada
{
"type": "object",
"properties": {
"transcription_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The transcription id (from a conversation item's audio attachment)."
}
},
"required": [
"transcription_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_conversation_tags(page_size, pagination_token)
All conversation tags of the organization. Paged; totalCount included. GET /conversations/tags.
Esquema de entrada
{
"type": "object",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_conversation_scheduled_messages(conversation_id)
Messages scheduled to be sent later in one conversation (read only; nothing is sent or cancelled). GET /conversations/{conversationId}/scheduledmessages.
Esquema de entrada
{
"type": "object",
"properties": {
"conversation_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The conversation id (e.g. \"t_0E5QDJJC03000\")."
}
},
"required": [
"conversation_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_scheduled_messages(pagination_token)
All messages scheduled to be sent from the organization (read only). Paged with hasMore/paginationToken; totalCount included. GET /scheduledmessages.
Esquema de entrada
{
"type": "object",
"properties": {
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_saved_messages(page_size, pagination_token)
Saved message templates (private and organization-wide): title, text, internal/shared flags. Paged with hasMore/paginationToken. GET /savedmessages.
Esquema de entrada
{
"type": "object",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_internal_endpoints
The organization's own channels: Spruce phone and fax numbers, email addresses and Spruce Links, with their owner and members. GET /internalendpoints.
Esquema de entrada
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_list_phone_lines
All phone lines of the organization (id, name); totalCount included. GET /phonelines.
Esquema de entrada
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sprucehealth_get_phone_line(phone_line_id)
One phone line by id (pd_…). GET /phonelines/{phonelineId}.
Esquema de entrada
{
"type": "object",
"properties": {
"phone_line_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The phone line id (e.g. \"pd_26RRC7PQ6JG00\")."
}
},
"required": [
"phone_line_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Comunidad
Evidencia