Skip to main content
Glama
tszaks

multimodal-imessage-mcp

by tszaks

멀티모달 iMessage MCP

Claude를 위한 가장 완벽한 iMessage MCP 서버입니다. 전체 대화 읽기, 메시지 검색, 이미지 첨부 파일 보기, 메시지 보내기, 연락처 조회, 메시지에 반응하기 — 모두 Claude Desktop 또는 Claude Code에서 가능합니다.

존재 이유

다른 모든 iMessage MCP 도구는 Apple의 chat.db에서 text 열을 조회합니다. 문제는? 최신 macOS(14+)에서는 93%의 메시지가 text 대신 attributedBody에 저장됩니다. 해당 도구들은 조용히 빈 대화나 불완전한 대화를 반환합니다.

이 서버는 Apple의 NSAttributedString 바이너리 형식을 리버스 엔지니어링하여 실제 메시지 내용을 추출하므로 완전한 메시지 기록에 접근할 수 있습니다.

Related MCP server: jons-mcp-imessage

기능

도구

설명

read_recent_messages

모든 대화에서 최신 메시지 읽기

search_messages

모든 메시지, 연락처, 그룹 이름에 대한 전체 텍스트 검색

get_conversation

모든 연락처(이름 또는 번호로)와의 전체 대화 스레드 가져오기

list_chats_structured

채팅 ID, 핸들, 마지막 발신자, 미리보기, 그룹 상태를 JSON으로 가져오기

get_conversation_by_chat_id

채팅 ID로 신뢰할 수 있는 구조화된 스레드 가져오기

read_receipts release flag

발신 1:1 iMessage/RCS 메시지에 최선의 읽음 확인 메타데이터 추가

find_outreach_followups

후속 검토가 필요한 SMS 아웃리치 스레드 찾기

get_attachment

메시지에서 이미지 및 파일 보기 -- Claude가 사진을 보고 분석할 수 있음

send_message

확인 안전성과 선택적 검증된 폴백으로 iMessage 또는 SMS/RCS 보내기

detect_message_service

스레드를 검사하고 보내기 전에 iMessage, SMS/RCS 또는 자동 추천

send_message_batch

승인 토큰으로 검토된 배치 미리보기 및 보내기

list_delivery_failures

빨간 말풍선 전송 실패, 보류 중인 전송, SMS/RCS 복구 목록

delete_messages

백업 우선 DB 정리로 정확한 로컬 메시지 행 삭제

delete_threads

하나의 정확한 배치 승인 토큰으로 전체 로컬 스레드 미리보기 및 삭제

edit_message

Messages UI 자동화를 통해 최근 발신 iMessage 실험적으로 편집

undo_send_message

Messages UI 자동화를 통해 최근 발신 iMessage 전송 취소 실험

list_recent_chats

가장 활발한 대화 보기

lookup_contact

연락처에서 전화번호 및 이메일 찾기

react_to_message

메시지에 탭백 반응 추가

멀티모달: Claude가 사진을 볼 수 있습니다

get_attachment를 사용하면 이미지가 base64 콘텐츠 블록으로 반환되어 Claude가 실제로 볼 수 있습니다. HEIC 사진(iPhone 기본값)은 자동으로 JPEG로 변환됩니다. 즉, Claude는 다음을 할 수 있습니다:

  • 누군가 보낸 사진에 무엇이 있는지 설명

  • 이미지에서 텍스트/스크린샷 읽기

  • 대화에서 시각적 콘텐츠 분석

요구 사항

  • macOS (로컬 iMessage 데이터베이스를 읽습니다)

  • Node.js >= 18 및 < 26. Node 24 LTS를 권장합니다. 고정된 네이티브 SQLite 종속성이 Node 26과 호환되지 않기 때문입니다.

  • 터미널 앱에 전체 디스크 접근 권한이 부여되어야 합니다 (시스템 설정 > 개인정보 보호 및 보안 > 전체 디스크 접근). 이는 iMessage 데이터베이스와 연락처 이름 확인에 사용되는 AddressBook 데이터베이스를 모두 포함합니다 — Contacts 앱이 실행 중일 필요는 없습니다.

설치

git clone https://github.com/tszaks/imessage-mcp.git
cd imessage-mcp
npm install

구성

Claude Desktop

다음을 ~/Library/Application Support/Claude/claude_desktop_config.json에 추가하세요:

{
  "mcpServers": {
    "imessage": {
      "command": "/opt/homebrew/bin/node",
      "args": ["/path/to/imessage-mcp/index.js"]
    }
  }
}

중요: Node.js 바이너리의 전체 경로(예: /opt/homebrew/bin/node)를 사용하고, 단순히 node를 사용하지 마세요. macOS 데스크톱 앱은 셸의 PATH를 상속하지 않으며, node 명령어만 사용하면 종종 네이티브 모듈 충돌을 일으키는 이전 시스템 Node로 확인됩니다.

Claude Code

다음을 .mcp.json에 추가하세요:

{
  "mcpServers": {
    "imessage": {
      "command": "node",
      "args": ["/path/to/imessage-mcp/index.js"]
    }
  }
}

Claude Code에서는 node가 일반적으로 셸 환경을 상속하므로 올바르게 확인됩니다.

사용 예

"최근 메시지 보여줘" -- 최신 대화 읽기

"엄마가 오늘 뭐라고 문자 보냈어?" -- "엄마"를 AddressBook을 통해 전화번호로 확인하고 대화를 가져옴

"내 메시지에서 'flight confirmation' 검색" -- 모든 메시지 전체 텍스트 검색

"지난 7일 동안 답장했고 후속 조치가 필요한 아웃리치 대상 찾기" -- 위험 레이블이 있는 구조화된 아웃리치 후보 반환

"이 10개의 후속 문자 배치 미리보기" -- 전송 전에 정확한 수신자, 메시지, 경고 및 승인 토큰 반환

"최근 전송 실패 보기" -- Messages가 실패 또는 보류 중으로 표시한 발신 메시지 보고, 이후 SMS/RCS 전송이 스레드를 복구했는지 여부 포함

"메시지 538516의 사진 보여줘" -- Claude가 보고 설명할 실제 이미지 반환

"+1234567890에 'Running 10 min late' 보내기" -- iMessage 전송 (확인 필요)

릴리스 플래그

릴리스 플래그는 MCP 서버 환경을 통해 선택적으로 활성화됩니다:

{
  "mcpServers": {
    "imessage": {
      "command": "node",
      "args": ["/path/to/imessage-mcp/index.js"],
      "env": {
        "IMESSAGE_MCP_RELEASES": "auto_sms_fallback,cleanup_failed_imessage_after_sms_fallback,message_mutation_tools,experimental_message_ui_actions,read_receipts"
      }
    }
  }
}

플래그

동작

auto_sms_fallback

send_message 및 send_message_batch는 자동 iMessage 전송 후 최근 발신 행을 확인합니다. Messages가 파란 말풍선 실패로 표시하고 수신자가 전화 기반인 경우 MCP가 SMS/RCS를 통해 재시도합니다.

cleanup_failed_imessage_after_sms_fallback

auto_sms_fallback이 SMS/RCS로 성공적으로 재시도한 후, MCP는 최선의 UI 정리 패스를 수행하여 실패한 파란 iMessage 말풍선을 삭제하고 정리가 확인되었는지 보고합니다. 이는 chat.db를 직접 변경하지 않습니다.

message_mutation_tools

delete_messages 및 delete_threads를 노출합니다. 이 도구들은 직접적인 로컬 Messages 데이터베이스 정리 전에 chat.db, chat.db-wal, chat.db-shm의 타임스탬프 백업을 만듭니다. delete_messages는 확인 없이 정확한 메시지 행 ID를 삭제합니다. delete_threads는 요청된 전체 채팅 ID 목록에 대해 하나의 정확한 배치 승인 토큰이 필요합니다.

experimental_message_ui_actions

edit_message 및 undo_send_message를 노출합니다. 이 도구들은 Messages UI 자동화를 사용하고, 대상이 최근 발신 iMessage인지 확인하며, 작업 후 chat.db와 대조하여 확인합니다. Messages가 메뉴 작업을 노출하지 않거나 메시지가 Apple의 허용 창을 벗어난 경우 명확하게 실패합니다.

read_receipts

구조화된 대화 결과에 읽음 확인 필드를 추가하고 get_conversation 텍스트 출력에 읽음 상태 힌트를 추가합니다. macOS가 date_read를 동기화한 경우 발신 1:1 iMessage 및 RCS 행을 지원합니다. SMS, 그룹 채팅, 수신 메시지는 지원되지 않는 것으로 보고됩니다. date_read가 없으면 읽지 않았거나 사용 불가능함을 의미하며, 이는 수신 확인이 비활성화되었거나 동기화되지 않았음을 의미할 수도 있습니다.

변형 도구

delete_messages는 정확한 메시지 ROWID를 허용합니다:

{ "message_ids": ["538516", "538517"] }

확인이 필요하지 않습니다. 삭제된 ID, 누락된 ID, 백업 위치, 확인 중 발견된 남은 행을 보고합니다.

delete_threads는 두 단계의 정확한 배치 흐름입니다:

{ "chat_ids": [101, 102] }

미리보기는 해당 순서 목록과 미리보기에 표시된 스레드 메타데이터에 대한 하나의 approval_token을 반환합니다. 삭제하려면 동일한 순서의 chat_ids, confirm: true, 해당 토큰을 보내세요:

{ "chat_ids": [101, 102], "confirm": true, "approval_token": "..." }

순서, 목록 또는 토큰을 변경하면 요청이 실패합니다.

edit_message 및 undo_send_message는 실험적입니다. Messages가 해당 작업에 대한 일급 AppleScript 명령을 노출하지 않기 때문입니다. 대화를 열고, 텍스트 조각으로 보이는 발신 말풍선을 찾고, 컨텍스트 메뉴를 사용한 다음 결과를 확인합니다. 이는 실제 Messages 동작에 영향을 미치기 위한 것이며, 가짜 로컬 전용 DB 편집이 아닙니다.

선택적 조정:

IMESSAGE_MCP_SEND_VERIFY_DELAY_MS=2500

이는 MCP가 새 발신 행에 대해 로컬 Messages 데이터베이스를 확인하기 전에 대기하는 시간을 제어합니다.

작동 방식

attributedBody 수정

Apple의 iMessage 데이터베이스(~/Library/Messages/chat.db)에는 메시지 내용을 위한 두 개의 열이 있습니다:

  • text -- 레거시 일반 텍스트 열 (이전 macOS 버전에서 사용)

  • attributedBody -- 직렬화된 NSAttributedString blob (macOS 14+에서 사용)

최신 macOS에서 Apple은 리치 텍스트, 멘션, 서식을 지원하기 위해 메시지 저장을 점차 attributedBody로 마이그레이션했습니다. text 열은 점점 더 자주 NULL인 레거시 폴백에 불과합니다.

이 서버는 NULL 텍스트가 있는 메시지를 감지하고 바이너리 NSTypedStream 형식을 파싱하여 attributedBody에서 내용을 추출합니다:

  1. 바이너리 blob에서 NSString 마커 찾기

  2. 유형 헤더 바이트(01 94 84 01 2b)를 지나 읽기

  3. 길이 접두사 디코딩 (짧은 메시지는 단일 바이트, 긴 메시지는 다중 바이트)

  4. UTF-8 텍스트 페이로드 추출

첨부 파일 처리

iMessage 첨부 파일은 ~/Library/Messages/Attachments/에 저장되며 경로는 attachment 테이블에서 추적됩니다. get_attachment 도구:

  1. 주어진 메시지 ID에 대한 첨부 파일 메타데이터 조회

  2. ~/Library/Messages/... 경로를 절대 경로로 확인

  3. JPEG/PNG/GIF/WebP의 경우: 파일을 읽고 base64 이미지 콘텐츠 반환

  4. HEIC(iPhone 기본값)의 경우: 반환 전에 macOS sips를 사용하여 JPEG로 변환

  5. 다른 파일의 경우: 메타데이터와 파일 경로 반환

문제 해결

"iMessage 데이터베이스를 열지 못했습니다" 터미널 앱에 전체 디스크 접근 권한을 부여하세요: 시스템 설정 > 개인정보 보호 및 보안 > 전체 디스크 접근.

연락처 조회 결과 없음 연락처 확인은 macOS AddressBook SQLite 데이터베이스를 직접 읽습니다(Contacts 앱 필요 없음). 전체 디스크 접근 권한이 부여되었는지 확인하세요. 연락처를 방금 추가한 경우 MCP 서버를 다시 시작하여 캐시를 새로 고치세요.

네이티브 모듈 충돌 / "NODE_MODULE_VERSION 불일치" 네이티브 종속성 재빌드: npm rebuild. Node.js 버전이 변경될 때 발생합니다. 또한 Claude Desktop 구성이 node의 전체 경로를 사용하는지 확인하세요(위 구성 참조).

대화에서 메시지 누락 이것이 바로 이 서버가 수정하는 버그입니다. attributedBody 추출을 포함한 최신 버전을 실행 중인지 확인하세요.

라이선스

MIT

빠른 시작 TL;DR

npm install
node index.js

그런 다음 서버를 MCP 클라이언트 설정에 추가하고 터미널 앱에 전체 디스크 접근 권한을 부여하세요.

작동 방식 (TL;DR)

  • macOS iMessage SQLite 데이터베이스 읽기

  • 최신 attributedBody 페이로드를 디코딩하여 완전한 메시지 텍스트를 추출

  • MCP를 통해 대화/검색/첨부 파일 도구를 노출

  • 명시적 확인과 함께 메시지 보내기/반응 작업을 위해 AppleScript 사용

LLM 빠른 복사

GitHub에서 이 코드 블록의 복사 버튼을 사용하세요.

Repo: imessage-mcp
Goal: Full iMessage MCP including attachments and send/reaction actions.
Setup:
1) npm install
2) Grant Full Disk Access to terminal app
3) Add MCP config entry for index.js
Use:
- read_recent_messages, search_messages, get_conversation
- list_chats_structured, get_conversation_by_chat_id, find_outreach_followups
- get_attachment for image/file analysis
- send_message/send_message_batch/react_to_message with explicit confirm flag
How it works:
- SQLite + attributedBody decoding + AppleScript actions wrapped as MCP tools

Available Tools

14 tools
detect_message_serviceA

Inspect local Messages history for a recipient and recommend iMessage, SMS/RCS, or auto before sending. This is best-effort because Apple does not expose a direct preflight availability API.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesPhone number, email address, or contact name.
limitNoNumber of recent matching outgoing messages to inspect (default: 20).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden and does well by explicitly stating 'This is best-effort because Apple does not expose a direct preflight availability API.' This warns the agent about reliability limitations. It does not elaborate on possible failure modes or whether the tool is read-only, but 'inspect' implies no mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, front-loaded purpose statement, and a meaningful caveat. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter pre-send detection tool, the description covers the core behavior, output categories (iMessage, SMS/RCS, or auto), and the key limitation. It lacks a detailed return structure, but the described output types are sufficient for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description adds no parameter-specific detail beyond implying the recipient in 'for a recipient,' so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pairing: 'Inspect local Messages history for a recipient and recommend iMessage, SMS/RCS, or auto before sending.' It clearly distinguishes itself from sending tools like send_message and read/search tools by focusing on pre-send service detection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: use this before sending to determine the best message service. It does not explicitly name alternative tools or state when not to use it, but the 'before sending' phrasing gives a practical usage trigger.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_outreach_followupsA

Find SMS outreach conversations that need agent review or follow-up. Returns structured candidates with status, risk labels, and evidence snippets.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of recent chats to inspect (default: 100).
hours_agoNoLook for outreach in the last N hours (default: 168).
max_resultsNoMaximum classified results to return (default: 50).
outreach_termsNoOptional custom terms that mark Tyler outbound messages as site-sales outreach.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It does state that the tool returns structured candidates with status, risk labels, and evidence snippets, implying a read/classify operation. However, it does not explain how risk or follow-up status is determined, what status values are possible, or whether the tool only inspects outbound Tyler messages.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one focused sentence that states the action, the resource, and the output shape. It has no redundant clauses, does not duplicate schema details, and is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 4 optional and fully documented parameters and no output schema, the description does a solid job by noting what kinds of results are returned. It would be more complete with explicit mention of what status/risk labels mean or an example, but the overall complexity is low enough that the current description is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers all four parameters with complete descriptions, so the description does not need to restate them. The schema descriptions already explain the meaning of limit, hours_ago, max_results, and outreach_terms, and the description itself adds little parameter-level semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Find' with a distinct resource ('SMS outreach conversations that need agent review or follow-up') and clearly names what is returned: structured candidates with status, risk labels, and evidence snippets. This distinguishes it well from sibling tools like read_recent_messages or search_messages, which are more general chat lookup tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the intended use case: triage or surface SMS outreach conversations that an agent should review or follow up on. It gives clear context but does not explicitly name alternative tools or exclusion conditions, so it falls just short of fully explicit usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_attachmentA

Get an attachment (image, file) from a message. Returns images directly so Claude can view and analyze them. Use message IDs from get_conversation results.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe message ROWID to get attachments for (from conversation results)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden. It discloses a key behavior: 'Returns images directly so Claude can view and analyze them,' which indicates the response format is the file content itself, not a URL or metadata. This adds value beyond what the input schema specifies, though it doesn't detail error handling or non-image file behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the primary action and followed by a helpful clarification. No unnecessary words, every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter and no output schema, the description covers the core purpose, return behavior, and required input source. It doesn't mention error cases or file type limitations, but the simplicity of the tool makes this acceptable. Overall, it provides enough context for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already fully documents the only parameter, message_id, including its origin ('from conversation results'). The description repeats this guidance but adds no new meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get an attachment (image, file) from a message.' It also adds purpose nuance by explaining that images are returned directly for viewing and analysis, which distinguishes it from sibling tools that read messages or retrieve conversation metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context by specifying the prerequisite: 'Use message IDs from get_conversation results.' This tells the agent exactly where to obtain the required parameter. It doesn't explicitly discuss alternatives or exclusions, but the purpose is distinct enough among siblings that this guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_conversationA

Get full conversation thread with a specific contact or phone number, optionally filtered by time. Shows text content and indicates attachments.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of messages to retrieve (default: 100)
contactNoContact name or phone number
hours_agoNoOptional: Only show messages from the last N hours (e.g., 12 for last 12 hours, 24 for last day)
phone_numberNoPhone number alias for contact. Kept for compatibility with clients that call this tool using phone_number.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It mentions output includes text content and attachment indicators, and implies read-only behavior via 'get', but does not detail permissions, rate limits, or any side effects. This partial disclosure merits a mid-range score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (two sentences) and front-loaded with the main purpose. It avoids redundancy and captures the core functionality efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the sibling tools include similar functions like get_conversation_by_chat_id, the description does not clarify the unique value or conditions for using this tool over others. It also leaves ambiguity about whether 'full thread' implies all messages or a summary, and does not mention output format. This incomplete context warrants a mid-range score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All four parameters have descriptive comments in the schema (100% coverage). The descriptions add meaning, such as clarifying 'phone_number' as an alias for 'contact' and explaining the purpose of 'hours_ago'. This exceeds the baseline for full coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves a full conversation thread with a specific contact or phone number, optionally filtered by time. It distinguishes itself from siblings like 'read_recent_messages' and 'search_messages' by specifying the retrieval scope and criteria.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool versus alternatives (e.g., get_conversation_by_chat_id, search_messages). It only states what the tool does, leaving the user to infer the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_conversation_by_chat_idA

Get a conversation by iMessage chat_id as structured JSON. Use chat_id from list_chats_structured or find_outreach_followups.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of messages to retrieve (default: 100)
chat_idYesThe iMessage chat ROWID.
hours_agoNoOptional: Only show messages from the last N hours.

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It does not mention side effects, permissions, rate limits, or whether the operation is read-only. The phrase 'as structured JSON' hints at output format but does not describe error behavior, pagination, or any constraints. For a read-like operation with no annotations, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, compact sentence that is front-loaded with the purpose and contains no redundant words. It includes a practical hint about obtaining the chat_id without unnecessary elaboration. Every word earns its place, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (3 params, no output schema, no annotations), the description is minimally sufficient. It covers the core purpose and provides a source for chat_id, but lacks additional context like whether the response includes message details, attachments, or any limits. Since schema descriptions cover the parameters, the description does not need to repeat them, but it could mention expected output structure or typical use cases. It is adequate but leaves some gaps for a fully informed decision.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so parameters are already well-documented. The description adds value by clarifying the source for 'chat_id' (from list_chats_structured or find_outreach_followups), which is a practical semantic detail beyond the schema's generic 'The iMessage chat ROWID.' This justifies a score above the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get a conversation by iMessage chat_id as structured JSON.' It specifies the resource (conversation), the identifier (chat_id), and the output format (structured JSON). It distinguishes itself from siblings by focusing on chat_id lookup and even mentions where to obtain the chat_id from, which adds clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives contextual guidance by instructing the agent to 'Use chat_id from list_chats_structured or find_outreach_followups.' This indicates the typical workflow and source for the input parameter. However, it does not explicitly state when to use this tool versus alternatives like 'get_conversation' or 'read_recent_messages', nor does it mention exclusions or prerequisites beyond the chat_id source.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_chats_structuredB

List recent chats as structured JSON with chat IDs, handles, last sender, last message preview, group status, and message counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of conversations to return (default: 20)
hours_agoNoOnly show chats active in the last N hours (optional)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only mentions output fields and 'structured JSON'; it does not state whether the operation is read-only, how results are ordered, whether default filtering applies, or any rate limits. This is minimal behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that front-loads the core action ('List recent chats') and then specifies the output format and fields. Every word contributes value, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two optional parameters and no output schema, the description provides the essential return fields, which is reasonably complete. However, the lack of differentiation from the sibling 'list_recent_chats' and the unexplained 'recent' behavior leave clear gaps for fully informed use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are fully described in the input schema (100% coverage), so the description does not need to add parameter details. It also does not add any additional semantics beyond what the schema provides; the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List recent chats as structured JSON' and enumerates specific output fields (chat IDs, handles, last sender, last message preview, group status, message counts), which makes the tool's function and return format evident. However, it does not explicitly differentiate this tool from the similarly named sibling 'list_recent_chats', so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus the sibling 'list_recent_chats' or other chat retrieval tools. There is no mention of alternatives, exclusions, or preferred use cases, leaving the agent without context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_delivery_failuresA

List recent outgoing messages that Messages marked failed, pending, or potentially recovered by SMS/RCS fallback. Use this to find red Not Delivered bubbles.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum delivery issues to return (default: 50).
hours_agoNoLook back this many hours (default: 24).
include_pendingNoInclude rows where Messages has not marked sent yet but error is 0 (default: true).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must convey behavior. It clearly indicates a read-only operation (list) and specifies the criteria (recent, outgoing, failed/pending/recovered). It doesn't mention side effects, but as a listing operation, it's reasonably transparent. It could be clearer about whether it modifies anything, but it's unlikely given 'List'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (two sentences) and directly states the purpose and use case. No unnecessary words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides sufficient context for the tool's behavior and purpose. Since there is no output schema, the description does not explain the return format, but it's implied that it returns a list of delivery failures. The absence of explicit output details is a minor omission but not critical for this simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Each parameter (limit, hours_ago, include_pending) has a descriptive explanation in the schema, covering 100% of parameters. The descriptions are clear enough for a user to understand their purpose, though 'include_pending' could be more precise about the condition 'error is 0'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: listing recent outgoing messages that failed, are pending, or potentially recovered via SMS/RCS fallback, with a concrete use case (finding red 'Not Delivered' bubbles). This distinguishes it from sibling tools like read_recent_messages or search_messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a specific use case ('Use this to find red Not Delivered bubbles'), which implies when to use it. However, it does not explicitly mention when not to use it or compare with alternatives, but the purpose is narrow enough that this is not a major gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recent_chatsB

List recent active conversations, sorted by most recent activity

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of conversations to return (default: 20)
hours_agoNoOnly show chats active in the last N hours (optional)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the sort order and does not explain what 'active' means, how 'hours_ago' affects results, or any edge-case behavior. This is minimal and leaves several operational aspects ambiguous.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the action with 'List' and efficiently conveys the core behavior. Every word contributes to meaning, with no unnecessary elaboration, making it highly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list with two optional parameters, the description is adequate but not comprehensive. It doesn't clarify how 'limit' and 'hours_ago' interact, what 'active' means in this context, or whether any pagination strategy exists. The absence of an output schema makes the return type implicit (a list), but overall the description leaves some user-visible behavior unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers both parameters ('limit' and 'hours_ago') with descriptions, resulting in 100% schema coverage. The tool description adds no additional parameter semantics beyond what the schema already provides, meeting the baseline of 3 for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'List' and clarifies the resource as 'recent active conversations' with a sorting criterion, which is clear and action-oriented. However, it does not distinguish itself from sibling tool 'list_chats_structured', so the purpose is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no mention of when to use this tool versus alternatives like 'list_chats_structured' or 'search_messages'. The description implies a use case for recent chats but provides no explicit guidance, alternatives, or exclusions, leaving the agent without help in choosing among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_contactA

Look up a contact name in macOS Contacts to find their phone number or email

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesContact name to search for (e.g., "Mom", "Luisa", "John Smith")

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility. It implies a read-only lookup but does not explicitly state safety, behavior on no match, or whether multiple results may be returned. The description is minimal and lacks behavioral transparency beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that conveys the purpose and expected output without unnecessary words. It is appropriately front-loaded with the action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one parameter and no output schemachers. The description covers the core functionality well, but it doesn't specify behavior for ambiguous cases (e.g., multiple matches, no match) or explicitly state read-only nature. Given the simplicity, a 4 could be argued, but the lack of any behavioral detail beyond the core action lowers it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% — the parameter 'name' has a clear description with examples. The tool description does not add additional parameter semantics beyond what the schema already provides, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: looking up a contact in macOS Contacts to retrieve phone number or email. The verb 'Look up' is specific, the resource is identified (macOS Contacts), and the intended output is explicit. It distinguishes from siblings which are message-related.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for finding contact information but does not explicitly state when to use it versus alternatives, nor does it mention exclusions or prerequisites. Since all siblings are message-related, the context is clear, but explicit guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

react_to_messageA

React to a message with an emoji (❤️, 👍, 👎, 😂, ‼️, ❓). IMPORTANT: Always show the user which message and reaction before sending, and get explicit confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be set to true to actually send the reaction. This forces explicit confirmation.
reactionYesReaction emoji: love (❤️), like (👍), dislike (👎), laugh (😂), emphasize (‼️), question (❓)
message_idYesThe message ID to react to (from conversation results)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the confirmation requirement and lists supported reactions, but does not detail permission requirements or reversibility. The core behavioral constraint (confirmation) is clearly communicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with purpose and followed by a critical safety instruction. No redundancy or wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with exhaustive schema descriptions, the description covers purpose and the key confirmation behavior. It does not explain return values, but no output schema exists and the tool's behavior is straightforward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the description need not add parameter details. The description does restate the emoji mapping but adds no new parameter semantics beyond the schema's existing descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'React to a message with an emoji,' enumerating specific emoji options. This distinguishes it from sibling tools like send_message or read_recent_messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs the agent to 'Always show the user which message and reaction before sending, and get explicit confirmation,' providing a clear safety protocol. It does not explicitly name alternatives, but the action (reaction vs sending) is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_recent_messagesB

Read recent iMessages from your Messages app

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of recent messages to retrieve (default: 50)
include_group_chatsNoInclude group chat messages (default: true)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not mention that this is a read-only operation (though 'read' implies it), nor does it describe any side effects, permissions, or limitations. The description is minimal and does not add context beyond the tool's name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that is front-loaded with the core purpose. It is appropriately sized with no wasted words, though it could benefit from a bit more detail on usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no output schema), the description is somewhat complete but lacks context on what the returned messages look like, how they are ordered, or any limitations. With no annotations and no output schema, the description should provide more behavioral context to be fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters (limit and include_group_chats) with defaults. The description adds no additional meaning beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads recent iMessages from the Messages app, which is a specific verb+resource. It distinguishes from siblings like search_messages and get_conversation by focusing on 'recent' messages, though it doesn't explicitly differentiate from list_recent_chats which might be similar.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for reading recent messages but does not provide explicit guidance on when to use this tool versus alternatives like search_messages or get_conversation. No exclusions or alternative tool mentions are given, so the agent must infer context from the name and siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_messagesA

Search for messages by contact name, phone number, or message content

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results (default: 25)
queryYesSearch query (contact name, phone, or message text)

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations to disclose read-only or destructive behavior. The description only mentions 'search', suggesting a read operation, but does not explicitly state that it does not modify data, nor does it mention authentication or rate limits. It does not contradict any annotations (none provided), but it fails to carry the burden of behavioral disclosure without them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-formed sentence that directly states the tool's purpose without any filler. It is front-loaded and concise, ideal for an agent to quickly understand the tool's function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only 2 parameters and no output schema, the description is adequate but minimal. It does not describe the return format (e.g., message objects, IDs, or metadata), nor does it mention pagination or result sorting. While the simplicity of the tool lowers the bar, the description omits details that would help an agent anticipate the response shape, making it incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% coverage, documenting both parameters. The description's phrase 'by contact name, phone number, or message content' mirrors the schema's description of query, adding no new meaning. The limit parameter is not mentioned, but its schema description is sufficient. Since the schema does the heavy lifting, the description adds minimal value beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches for messages using specific criteria (contact name, phone number, or content). It distinguishes from siblings like read_recent_messages (retrieves recent messages) and get_conversation (fetches a full conversation). The verb 'search' plus the resource 'messages' and the scope of search fields make the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when you need to find messages by contact details or content. However, it does not explicitly contrast with alternatives like read_recent_messages or list_chats_structured, nor does it state when not to use it. The guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_messageA

Send an iMessage or SMS/RCS to a contact (uses AppleScript). Supports iMessage (blue bubble), SMS/RCS (green bubble), or auto-detection with verified fallback when the auto_sms_fallback release flag is enabled. IMPORTANT: Always show the user the message content and recipient before sending, and get explicit confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesPhone number or email address (e.g., +1234567890 or email@example.com)
confirmYesMust be set to true to actually send the message. This forces explicit confirmation.
messageYesMessage text to send
serviceNoMessaging service to use: "auto" (try iMessage first, fall back to SMS), "imessage" (force iMessage/blue bubble), "sms" (force SMS/green bubble). Defaults to "auto".auto

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses AppleScript reliance, iMessage vs SMS/RCS behavior, auto-detection fallback, and the confirmation requirement. It could be more transparent about failure behavior or permissions, but the key behavioral traits are clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact: two sentences, front-loaded with the core action, and no filler. The IMPORTANT warning earns its place because it encodes a critical safety workflow. Redundancy with the schema is minimal and acceptable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-send tool with moderate complexity, the description covers the main invocation context: recipient types, service selection, fallback behavior, and confirmation. It doesn't detail delivery outcomes or error paths, but those are plausibly covered by sibling tools and are not essential to selecting and invoking this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema by explaining blue/green bubble semantics, the auto fallback behavior tied to the service parameter, and reinforcing the confirm parameter's real-world purpose with the 'IMPORTANT' note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Send an iMessage or SMS/RCS to a contact.' It clearly distinguishes itself from send_message_batch by describing a single message to a single contact, and adds concrete context with blue/green bubble terminology and AppleScript mention.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for sending one message and provides the important workflow requirement to show content and get confirmation. However, it does not explicitly say when to use this tool versus siblings like send_message_batch or detect_message_service, nor does it list exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_message_batchA

Preview or send a reviewed SMS/iMessage batch. Preview returns an approval token. Sending requires the same exact batch, confirm=true, and the token.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesExact messages to send.
confirmNoSet true only after reviewing the exact preview and approval token.
serviceNoMessaging service to use for every message. Defaults to sms.sms
approval_tokenNoApproval token returned by the preview call.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavior. It reveals the two-phase safety mechanism (preview token, confirm=true, exact batch required) and implies preview does not send. It does not describe failure modes, token expiry, or send results, but the core behavioral safeguard is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and immediately front-loads the core purpose. Every sentence contributes: the first states what the tool does, the second explains the critical preview/send workflow. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-mode batch messaging tool with no output schema, the description covers the essential workflow well. The main gap is that it does not describe what the send call returns or what happens on unsuccessful validation, but the schema and the preview-token explanation provide enough context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds meaningful semantics beyond the schema by explaining how approval_token, confirm, and items interact: preview returns a token, and sending requires the same batch plus confirm=true plus that token. This helps the agent correctly sequence calls.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Preview or send a reviewed SMS/iMessage batch.' It specifies the resource (batch of messages), the two distinct operations (preview vs send), and implicitly distinguishes itself from the singular sibling tool send_message by focusing on batch operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear operational context: preview first to obtain an approval token, then send with confirm=true and the matching token. It does not explicitly name alternative tools or state when not to use this tool, but the batch-focused workflow and mention of 'the same exact batch' give sufficient usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv1.5.1
    • First observeddetect_message_service
    • First observedfind_outreach_followups
    • First observedget_attachment
    • First observedget_conversation
    • First observedget_conversation_by_chat_id
    • First observedlist_chats_structured
    • First observedlist_delivery_failures
    • First observedlist_recent_chats
    • First observedlookup_contact
    • First observedreact_to_message
    • First observedread_recent_messages
    • First observedsearch_messages
    • First observedsend_message
    • First observedsend_message_batch

TDQS

B3.4/5.0

Scored across 14 tools

Disambiguation2/5

Several tools overlap significantly: read_recent_messages, list_chats_structured, and list_recent_chats all list conversations with varying formats. get_conversation and get_conversation_by_chat_id retrieve threads but differ only in ID type, which could confuse agents. send_message and send_message_batch have overlapping purposes (sending messages) with subtle differences in batching.

Naming Consistency3/5

Most tools follow a verb_noun pattern (read_recent_messages, search_messages, send_message, list_delivery_failures), but there are inconsistencies: get_conversation vs get_conversation_by_chat_id (one is specific, one generic), and list_chats_structured vs list_recent_chats (both list chats but with different modifiers). The style is consistent snake_case, but the verbs (read, search, get, list, send, detect, find, lookup, react) vary without a clear hierarchy.

Tool Count4/5

14 tools is within the well-scoped range for a messaging server. The count is slightly high but justified by the need to handle message reading, searching, sending, attachments, and delivery status. Each tool serves a distinct function (though some overlap), so the count is reasonable.

Completeness3/5

The server covers core iMessage workflows: listing, searching, reading conversations, sending (including batch), reactions, attachments, and delivery failures. However, it lacks obvious lifecycle operations like deleting messages, marking as read/unread, or editing sent messages. There's also no tool to create a new conversation with a new contact, only sending to existing/known contacts. These gaps are not fatal as most agents would work around them, but they are notable for a comprehensive messaging tool.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables reading, searching, and sending iMessages directly from MCP-compatible clients by accessing the local macOS iMessage database, supporting conversations, attachments, and both individual and group chats.
    246 npm
    10
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to read iMessage history and send messages on macOS. Supports conversation listing, message search with keyword and semantic modes, contact lookup, and sending messages to existing conversations.
    13
    11
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables reading, searching, and sending iMessages on macOS by accessing the local messages database and utilizing AppleScript. Users can list conversations, search message history, and send messages to individuals or group chats directly through the Model Context Protocol.
    6
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables reading, sending, and managing iMessage conversations on macOS through MCP.
    1
    MIT