联系mcp
一个MCP服务器,为人工智能助手提供全面的联系人管理功能——创建、搜索、重复数据删除、合并、跨系统同步,并自信地回滚任何更改。
联系人作为单独的vCard文件存储在git存储库中。每个变异都是一个git提交,所以你可以免费获得完整的版本历史、差异和恢复。人工智能可以做出彻底的改变,知道一切都是可以恢复的。
快速开始
先决条件
- 包子 1.0+
- Git(在PATH中可用)
安装和构建
cd contacts-mcp
bun install
bun run build添加到克劳德代码
claude mcp add contacts bun /path/to/contacts-mcp/dist/index.js添加到克劳德桌面
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"contacts": {
"command": "bun",
"args": ["/path/to/contacts-mcp/dist/index.js"]
}
}
}发展模式
直接从源代码运行,无需构建(bun本机运行TypeScript):
bun run dev验证它是否有效
使用MCP检查器进行交互式测试:
bunx @modelcontextprotocol/inspector bun dist/index.js它做什么
一旦连接,您的AI助手将获得14个工具和4个资源来管理联系人:
工具
| 工具 | 它做什么 |
|---|---|
create_contact | 创建一个联系人,包括姓名、电子邮件、电话、地址、组织、生日、笔记、类别。电话号码会自动标准化为E.164。 |
get_contact | 通过UUID检索完整的联系人详细信息。 |
update_contact | 部分更新——只有您指定的字段会被更改,其他所有字段都会被保留。 |
delete_contact | 软删除(移动到存档)。可选永久删除。存档的联系人可以通过回滚恢复。 |
search_contacts | 在所有字段(姓名、电子邮件、电话、组织、笔记、类别)中进行模糊搜索。按相关性排名。 |
find_duplicates | 用置信度分数扫描潜在的重复项。匹配电子邮件(0.95)、电话(0.90)、姓名(模糊,0.50-0.70)和组织提升。 |
merge_contacts | 将2+个联系人合并为一个。策略: union (合并所有数据), keep-newest, keep-oldest。支持手动字段覆盖。 |
import_contacts | 从a批量导入 .vcf 文件。对现有联系人进行可选的数据消除检查。干运行模式。 |
export_contacts | 出口到 .vcf, .csv,或 .json。可选搜索筛选器。 |
resolve_contact_points | 使用精确的标准化匹配将电话号码和电子邮件地址解析为联系人。报告匹配、模糊和未解决的结果。 |
sync_provider | 与已配置的远程提供商(谷歌、苹果、CardDAV)同步。拉、推或两者兼而有之。可配置的冲突解决。 |
list_providers | 显示所有已配置的提供程序及其同步状态。 |
rollback | 通过恢复git提交来撤消更改。模式:撤消最后一个N,恢复到特定的提交,恢复到标记。支持干跑。首先创建一个安全标签,以便回滚本身可以撤消。 |
history | 查看更改历史记录——全局或特定联系人。显示操作类型、提交哈希、日期和消息。 |
CLI导出和解析
默认情况下,二进制文件仍会启动MCP stdio服务器。它还支持确定性 其他本地工具的非AI命令行操作:
contacts-mcp export --format json --output contacts.json
contacts-mcp export --format json --output -
contacts-mcp resolve --input contact-points.json --output -
contacts-mcp sync-provider --provider apple --direction pullresolve 输入是JSON:
{
"phones": ["+18016022838", "(801) 602-2838"],
"emails": ["alex@example.com"],
"defaultCountry": "US"
}使用 CONTACTS_MCP_STORE=/path/to/store 导出或解决自定义问题时 商店路径。
在从macOS导出联系人之前,将Apple Contacts拉入本地git支持 商店:
contacts-mcp sync-provider --provider apple --direction pull如果您没有Apple提供商 ~/.contacts-mcp/config.json,CLI将使用 macOS上的内置苹果提供商。第一次运行可能会触发联系人权限 提示。
资源
| URI | 描述 |
|---|---|
contacts://all | 所有活动联系人的摘要列表 |
contacts://{id} | 特定联系人的完整详细信息(资源模板——列出所有要查找的联系人) |
contacts://duplicates | 当前具有置信度得分的重复候选人 |
contacts://history | 最近更改日志 |
存储工作原理
~/.contacts-mcp/store/
├── .git/ # Git repository
├── contacts/
│ ├── .vcf # One vCard 4.0 file per contact
│ └── ...
├── archive/
│ └── .vcf # Soft-deleted contacts
└── .metadata/
├── providers.json # Provider config & sync state
└── merge-log.json # Audit trail for merges- 每个联系人一个文件 --每个联系人都是一个标准vCard 4.0(
.vcf)以UUID命名的文件。 - 每一次改变都是一次承诺 --创建、更新、删除、合并、导入所有生成描述性git提交,如
Create contact: Jane Smith (uuid)或Merge contacts: Jane + J. Smith -> Jane Smith. - 软删除 —
delete_contact从以下位置移动文件contacts/到archive/。它仍在回购中,可以通过以下方式找到get_contact或通过回滚恢复。 - 批量操作获取标签 --导入和同步创建
pre-import-/post-import-git标签,这样你就可以一次性回滚整个批量操作。 - 回滚=git恢复 --总是创建新的提交(从不
reset --hard),因此完整的审计跟踪得以保留,回滚本身也是可逆的。
配置
配置从加载 ~/.contacts-mcp/config.json (或路径在 CONTACTS_MCP_CONFIG 有人)。
最小配置(仅限本地)
不需要配置文件。服务器可以开箱即用,本地git存储在 ~/.contacts-mcp/store/.
自定义存储路径
{
"storePath": "/path/to/my/contacts-repo"
}或者通过环境变量:
CONTACTS_MCP_STORE=/path/to/my/contacts-repo bun dist/index.js与提供商完全配置
{
"storePath": "~/.contacts-mcp/store",
"providers": [
{
"name": "google-personal",
"type": "google",
"enabled": true,
"config": {
"clientId": "your-client-id.apps.googleusercontent.com",
"clientSecret": "your-client-secret",
"refreshToken": "your-refresh-token"
}
},
{
"name": "fastmail",
"type": "carddav",
"enabled": true,
"config": {
"serverUrl": "https://carddav.fastmail.com/dav/addressbooks",
"username": "you@fastmail.com",
"password": "app-specific-password",
"authMethod": "Basic"
}
},
{
"name": "apple",
"type": "apple",
"enabled": true,
"config": {}
}
]
}环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
CONTACTS_MCP_CONFIG | ~/.contacts-mcp/config.json | 配置文件的路径 |
CONTACTS_MCP_STORE | ~/.contacts-mcp/store | git支持的联系人存储路径 |
DEBUG | (unset) | 设置为任何值以启用调试日志记录 |
提供商设置
Google 通讯录
使用Google People API。您需要OAuth2凭据:
- 首选 谷歌云控制台 并创建一个项目。
- 启用 人民API.
- 创建OAuth2凭据(桌面应用程序类型)。
- 使用OAuth2游乐场或脚本获取刷新令牌
https://www.googleapis.com/auth/contacts范围。 - 添加
clientId,clientSecret,以及refreshToken到你的配置。
苹果联系人(仅限macOS)
通过以下方式使用JavaScript进行自动化(JXA) osascript.不需要凭据,但是:
- 首次同步时,macOS将提示您允许终端/IDE访问联系人。
- 授予权限 系统设置>隐私和安全>联系人.
- 配置只是
"config": {}--不需要字段。
CardDAV
适用于任何CardDAV服务器——Fastmail、Nextcloud、Radical、iCloud等。
| 配置字段 | 说明 |
|---|---|
serverUrl | CardDAV服务器URL(例如。, https://carddav.fastmail.com/dav/addressbooks) |
username | 您的用户名 |
password | 密码或特定于应用程序的密码 |
authMethod | "Basic" (默认)或 "Digest" |
对于 苹果云:使用 应用程序特定密码 和 https://contacts.icloud.com 作为服务器URL。
除尘工作原理
这 find_duplicates 该工具使用加权字段匹配来比较联系人:
| 匹配类型 | 置信度 | 工作原理 |
|---|---|---|
| 同一封电子邮件(标准化) | 0.95 | 任何电子邮件上的不区分大小写的精确匹配 |
| 同一部手机(标准化) | 0.90 | E.164标准化,所以 (555) 123-4567 火柴 +15551234567 |
| 精确名称 | 0.70 | 全名字符串匹配 |
| 模糊名称 | 0.50 | Levenshtein距离,句柄交换名称(“John Smith”/“Smith,John”)和首字母缩写(“J.Smith”/”Jane Smith“) |
| 同一组织 | +0.15 | 附加提升(从不独立,只增加现有分数) |
联系人分组为 屏蔽键 (按姓名首字母、电子邮件域、电话后缀)进行比较,因此即使有数千个联系人,性能也会保持快速。
默认阈值为0.6——任何得分等于或高于0.6的东西都被报告为潜在的重复。
合并是如何工作的
merge_contacts 获取2+个联系人ID并将其组合:
- 第一个ID是主要ID --它保留其UUID,其他UUID则存档。
union策略 (默认)--组合所有电子邮件、电话、地址、URL、类别。使用更长/更完整的名称。从任何有生日、组织、照片的地方获取。keep-newest--从最近修改的联系人中获取所有字段。keep-oldest--获取最早修改的联系人的所有字段。fieldOverrides--手动指定将哪个联系人的值用于特定字段:{ "organization": "uuid-of-contact-with-better-org" }.- 提供商ID已合并 --因此,如果联系人A来自谷歌,联系人B来自CardDAV,则合并后的联系人映射到两个遥控器。
Sync的工作原理
同步是 本地优先 和 明确的 (由触发 sync_provider 工具,从不自动):
- 拉:从远程获取联系人。新的是从当地进口的。更改后的内容将根据冲突策略进行更新。
- 推:自上次同步以来修改的本地联系人被推送到远程。远程创建新的本地联系人。
- 冲突解决 (当双方都发生变化时):
- newest-wins (默认)--比较修改时间戳,保留较新的时间戳。 - local-wins --始终保持本地版本。 - remote-wins --始终接受远程版本。 - manual --标记为冲突,不要自动解决。
- 创建同步前/同步后的git标签用于回滚。
项目结构
src/
├── index.ts # Entry point — stdio transport
├── server.ts # McpServer setup, wires tools + resources
├── config.ts # Config loading from file / env vars
├── types/ # TypeScript interfaces (Contact, Provider, etc.)
├── contacts/
│ ├── model.ts # Contact construction + name parsing
│ ├── vcard.ts # vCard 4.0 serialize/deserialize (no external lib)
│ ├── normalize.ts # Phone (E.164), email, name normalization
│ ├── search.ts # Fuse.js fuzzy search
│ ├── dedup.ts # Duplicate detection with weighted scoring
│ └── merge.ts # Contact merge with multiple strategies
├── store/
│ ├── git-ops.ts # Low-level git wrapper (simple-git)
│ ├── git-store.ts # CRUD + bulk ops + history + rollback
│ └── file-layout.ts # Path conventions
├── providers/
│ ├── base.ts # Abstract provider
│ ├── google.ts # Google People API
│ ├── apple.ts # macOS Contacts via JXA
│ ├── carddav.ts # CardDAV via tsdav
│ └── local.ts # Local store wrapper
├── sync/
│ ├── engine.ts # Bidirectional sync orchestration
│ ├── conflict.ts # Conflict resolution
│ └── diff.ts # Field-level contact diffing
├── tools/ # One file per MCP tool (13 tools)
└── resources/ # MCP resource handlers (4 resources)技术栈
| 组件 | 库 | 为什么 |
|---|---|---|
| MCP服务器 | @modelcontextprotocol/sdk | 官方SDK、stdio传输 |
| 架构验证 | zod | MCP SDK要求工具输入模式 |
| Git操作 | simple-git | 通过git CLI清理异步API |
| 模糊搜索 | fuse.js | 具有字段权重的快速客户端模糊匹配 |
| 电话正常化 | libphonenumber-js | 谷歌用于E.164标准化的libphonenumber |
| 谷歌联系人 | googleapis | 官方Google API客户端(People API v1) |
| CardDAV | tsdav | 用于地址簿同步的WebDAV/CardDAV客户端 |
| 苹果联系人 | osascript (JXA) | 内置macOS自动化,无需额外安装 |
| vCard解析 | 自定义 | 手动生成的RFC 6350解析器/序列化器——零依赖,完全往返保真度 |
许可证
麻省理工学院
