Spruce Health MCP by usefulapi
Read Spruce Health contacts, conversations, messages, phone lines and team members (read-only).
使うべきか
品質と安全性
検出事項(12)
- LOWsprucehealth_list_contact_conversations 内
- LOWsprucehealth_list_contact_integration_links 内
- LOWsprucehealth_list_contact_fields 内
- LOWsprucehealth_list_conversations 内
- LOWsprucehealth_list_conversation_items 内
- LOWsprucehealth_get_conversation_item 内
- LOWsprucehealth_list_read_receipts 内
- LOWsprucehealth_list_conversation_tags 内
- LOWsprucehealth_list_conversation_scheduled_messages 内
- LOWsprucehealth_list_scheduled_messages 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `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"
}コミュニティ
エビデンス