ContactZapp
app.contactz/contactzappcontactz.appstreamable-httpv1.0.0Scanned
Find, add and update the contacts in your ContactZapp account.
10 tools: 4 change things and 6 only read.
- Reads private data · 2
- Reads text others write · 0
- Can send data out · 1
- No findings
Anlyon alternative
4 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
10 tools
Changes things 4Claude Code: ask
createV1ContactCreates a contact.No findings
Why it is in this group
- The name "createV1Contact" says "create": a word for a change.
Description, as the server wrote it Creates a contact. It is treated like a contact that arrives from a sync. The contact is written to one of the user's two-way accounts, which ContactZapp chooses: the earliest-linked account that keeps an address book and is not paused. The sync then copies it to every other two-way account, and never to a read-only one. It is matched like any incoming contact: - when the user's auto-merge level covers the match, the values are added to the contact the user already has (200, `merged`); - otherwise the contact is created (201, `created`), and a possible match waits in Review duplicates (201, `needs_review`). A create is never refused for the plan's contact limit. Over the limit, the contact is created frozen (201), and `contact.frozen` in the answer is true. ContactZapp keeps a frozen contact but does not sync it until the user upgrades or frees a place. Send an `Idempotency-Key` header to make a retry safe. A repeat with the same key and the same body within 24 hours answers with the first result and writes nothing. The same key with a different body is a 422.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: false
createV1WebhookSubscribes a URL to one event.No findings
Why it is in this group
- The name "createV1Webhook" says "create": a word for a change.
Description, as the server wrote it Subscribes a URL to one event. Zapier, Make and n8n call this when an automation is switched on. The URL must use HTTPS and reach a public address. The answer is 201 with the subscription and its signing `secret`, which is shown only here. Needs the `webhooks:manage` and `contacts:read` scopes. A user can have up to 25 subscriptions. Each event is sent to the URL as a POST with a JSON body. The body is one item, exactly as the polling trigger for the same event lists it. Every delivery has these headers: - `ContactZapp-Signature`: `t=<unix seconds>,v1=<signature>`, where the signature is the hex HMAC-SHA256 of the timestamp, a full stop and the raw body, keyed with the secret. Check it, and refuse a timestamp more than five minutes from your clock. - `ContactZapp-Delivery`: the delivery's id. A retry sends the same id. - `ContactZapp-Event`: the event, for example `contact.created`. Answer with any 2xx status. An answer of 410 removes the subscription. Any other answer, or none within 10 seconds, is retried with backoff for about a day; after the last attempt the subscription is turned off. Each event is sent at least once: deduplicate by the item's `id`.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: false
postV1SyncStarts a sync, the same as pressing Sync now in ContactZapp.Can send data outNo findings
Why it is in this group
- The name "postV1Sync" says "post": a word for a change.
What it can reach
- outboundThe name "postV1Sync" says "post": it sends or publishes something to other people.
Description, as the server wrote it Starts a sync, the same as pressing Sync now in ContactZapp. The run shows in History as a manual run. The answer is 202 with the state of the sync: `queued` or `running`. If a sync is already going, you get that one back and no second one starts. Needs the `sync:trigger` scope.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: false
updateV1ContactChanges a contact's fields, as the app's edit does.No findings
Why it is in this group
- The name "updateV1Contact" says "update": a word for a change.
Description, as the server wrote it Changes a contact's fields, as the app's edit does. Only the fields in the body change; a field the body leaves out keeps its value. The change is recorded in History as the user's, naming the API key, and written to every two-way account the contact is in, never to a read-only one. A contact waiting in Review duplicates cannot be changed until the review is decided (409, `contact_pending_review`). `Idempotency-Key` works as it does when you create a contact.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: false
Only reads 6Show 6 read-only tools
getV1ContactReturns one contact.Reads private dataNo findings
Why it is in this group
- The name "getV1Contact" says "get": a word for reading.
What it can reach
- private-dataThe name "getV1Contact" says "get" and "contact": it reads contacts.
- private-dataThe description's first sentence says "return" and "contact": it reads contacts.
Description, as the server wrote it Returns one contact. `id` is the contact's `id` or its `publicId` (`CS-0042`). A deleted or merged contact is a 404, and so is another user's contact.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: true
getV1MeChecks an API key.No findings
Why it is in this group
- The name "getV1Me" says "get": a word for reading.
Description, as the server wrote it Checks an API key. Returns the user the key acts for, the user's plan and the key's scopes. Any live key may call it, so it is the call to make when you want to test a key. Send the key in every request as `Authorization: Bearer <key>`. Each operation names the scope it needs; a key without that scope gets 403. There is a limit on requests; past it the answer is 429 with a `Retry-After` header. Every error body has a stable `code`.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: true
listV1AccountsLists the user's linked accounts, as the Settings screen does: provider, name, sync direction, connection state and when each account last synced.No findings
Why it is in this group
- The name "listV1Accounts" says "list": a word for reading.
Description, as the server wrote it Lists the user's linked accounts, as the Settings screen does: provider, name, sync direction, connection state and when each account last synced.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: true
listV1ContactsFinds the user's contacts, or lists them.Reads private dataNo findings
Why it is in this group
- The name "listV1Contacts" says "list": a word for reading.
What it can reach
- private-dataThe name "listV1Contacts" says "list" and "contact": it reads contacts.
- private-dataThe description's first sentence says "find" and "contact": it reads contacts.
Description, as the server wrote it Finds the user's contacts, or lists them. Give at most one of `email`, `phone` and `query`: - `email` and `phone` find the contacts that hold that address or number. An email is compared ignoring case, and a phone number ignoring formatting. - `query` is the same free-text search the Contacts screen has. - With none of them, every contact is listed, newest first. Pages work with a cursor: pass `nextCursor` back as `cursor`, with the same filter, until a page comes back without one. Deleted and merged contacts are never returned.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: true
listV1TriggerEventsPolling trigger: returns the newest events of one type first.No findings
Why it is in this group
- The name "listV1TriggerEvents" says "list": a word for reading.
Description, as the server wrote it Polling trigger: returns the newest events of one type first. This is what Zapier, Make and n8n poll to start an automation. Each item has an `id` that never changes. Polling again with nothing new returns the same ids, and a new event appears at the top. Deduplicate by `id`. `contact.created`, `contact.updated`, `contacts.merged` and `account.needs_attention` come from the change history ContactZapp records. One item is one recorded event, and it is kept as long as the History screen keeps it. `match.needs_review` comes from the duplicate flags the Contacts screen shows: one item for each contact flagged as a possible duplicate and not yet merged. Its `id` changes when the flag is raised again. Each item carries what an automation needs without a second call: the contact's fields (null when the contact has since been deleted or merged), for a merge the ids of the contacts it absorbed, and for an account the account and why it needs attention.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: true
listV1WebhooksLists the webhook subscriptions of this API key's user, oldest first: the URL, the event and whether it is `active` or `disabled`.No findings
Why it is in this group
- The name "listV1Webhooks" says "list": a word for reading.
Description, as the server wrote it Lists the webhook subscriptions of this API key's user, oldest first: the URL, the event and whether it is `active` or `disabled`. The signing secret is never shown again after the subscription is made. Needs the `webhooks:manage` scope.
Annotations the server declares
- destructiveHint: false
- readOnlyHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged untrusted-input.
- Reads private data2
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write0
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out1
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
No check matched anything in these tool definitions. That is not a safety guarantee.
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 1.0.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http contactzapp https://app.contactz.app/api/v1/mcp --header 'Authorization: <your-authorization>'claude mcp add --transport http contactzapp https://app.contactz.app/api/v1/mcp --header 'Authorization: <your-authorization>'Run in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__contactzapp__getV1Me",
"mcp__contactzapp__listV1Contacts",
"mcp__contactzapp__getV1Contact",
"mcp__contactzapp__listV1Accounts",
"mcp__contactzapp__listV1TriggerEvents",
"mcp__contactzapp__listV1Webhooks"
],
"ask": [
"mcp__contactzapp__createV1Contact",
"mcp__contactzapp__updateV1Contact",
"mcp__contactzapp__postV1Sync",
"mcp__contactzapp__createV1Webhook"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as contactzapp. Review it before you use it.
Capability tags behind 3 rules
- mcp__contactzapp__listV1Contacts private-data
- mcp__contactzapp__getV1Contact private-data
- mcp__contactzapp__postV1Sync outbound
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/app.contactz/contactzapp/verify?hash=b990984241dad910c138b6fc9c41d9c88b3f6c2c356ede35efd55add87fd2a63" | jq -e '.changed == false'Pinned hash b990984241da, from Nov 3, 2026, 14:17 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/app.contactz/contactzapp/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/app.contactz/contactzapp)Source: MCP Registry. Synced Nov 3, 2026, 14:17 UTC.