Spruce Health MCP by usefulapi

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

사용해야 할까요

품질 및 안전성

A
설명 품질
96%
스키마 완전성
88%
이름 품질
70%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

발견 사항 (12)

  • LOWTool 'sprucehealth_list_contact_conversations' name length outside 3-30 rangesprucehealth_list_contact_conversations에서
  • LOWTool 'sprucehealth_list_contact_integration_links' name length outside 3-30 rangesprucehealth_list_contact_integration_links에서
  • LOWTool 'sprucehealth_list_contact_fields' name length outside 3-30 rangesprucehealth_list_contact_fields에서
  • LOWTool 'sprucehealth_list_conversations' name length outside 3-30 rangesprucehealth_list_conversations에서
  • LOWTool 'sprucehealth_list_conversation_items' name length outside 3-30 rangesprucehealth_list_conversation_items에서
  • LOWTool 'sprucehealth_get_conversation_item' name length outside 3-30 rangesprucehealth_get_conversation_item에서
  • LOWTool 'sprucehealth_list_read_receipts' name length outside 3-30 rangesprucehealth_list_read_receipts에서
  • LOWTool 'sprucehealth_list_conversation_tags' name length outside 3-30 rangesprucehealth_list_conversation_tags에서
  • LOWTool 'sprucehealth_list_conversation_scheduled_messages' name length outside 3-30 rangesprucehealth_list_conversation_scheduled_messages에서
  • LOWTool 'sprucehealth_list_scheduled_messages' name length outside 3-30 rangesprucehealth_list_scheduled_messages에서

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~4,751토큰 (도구 정의)
~1.2 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 3.71%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "spruce-health": {
      "url": "https://spruce-health.usefulapi.io/mcp"
    }
  }
}

원격 엔드포인트

https://spruce-health.usefulapi.io/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (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.

입력 스키마

{
  "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.

입력 스키마

{
  "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}.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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}.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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}.

입력 스키마

{
  "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.

입력 스키마

{
  "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}.

입력 스키마

{
  "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.

입력 스키마

{
  "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}.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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.

입력 스키마

{
  "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}.

입력 스키마

{
  "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"
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 24개