contacts as a graph, not a list
a contacts api that returns names and phone numbers is a phonebook. vintage treats contacts as the person authority for everything else: each contact links to their messages, mail threads, shared notes, calls and events.
so the mcp person tool answers "what’s the story with leo?" — last contact, what you owe them, the notes you share — not just a vcard.
vintage runs entirely on your Mac: it reads the local Apple databases, builds one person-graph index, and serves it over cli and mcp. no cloud, no account, nothing leaves the machine.
try it
brew install systemoperators/tap/vintage
vintage index sync
claude mcp add vintage -- vintage mcp --stdio
vintage people # ranked by actual activity person tool returns
- identity — names, handles, avatars from Contacts
- timeline — messages, mail, notes, calls, events with that person
- cadence — how often you actually talk, and whether it’s cooling
- unreplied state — whether the last word is theirs
honest limits
- people who text you but aren’t saved contacts still become persons (minted from strong keys like phone numbers) — marked as non-contacts
- editing contacts is not included
questions
how is this different from the macos contacts app via applescript?
vintage reads the addressbook store directly and joins it against six other sources; the value is the join, which no per-app bridge gives you.
local. no account. never phones home. · everything vintage does · the engine