carddav-mcp
An MCP server that enables agents to read and write CardDAV address books, supporting contacts, groups, and photos. It handles multiple CardDAV implementations, manages group conventions (vCard 3 and 4), and ensures data integrity by preserving unmodeled properties and handling ETags. It supports read-only modes and tool filtering for security.
Package and access
Local package with source-attributed installation metadata. Koskamo does not execute packages during review.
What you can do with it
- Find a person in an address book
- Read a contact card in full
- Add and correct contacts
- Fetch a contact photo
Source and maintenance
- Last repository push
- Latest release
- v0.1.4
- Maintenance checked
Packages and installation
Source-provided package data. Koskamo has not executed or live-probed this package.
ghcr.io/ni-c/carddav-mcp:0.1.4
{
"transport": "stdio",
"identifier": "ghcr.io/ni-c/carddav-mcp:0.1.4",
"registryType": "oci",
"environmentVariables": [
{
"name": "CARDDAV_URL",
"format": "string",
"isRequired": true,
"description": "Root of the CardDAV server, e.g. https://dav.example.net. An address book collection URL also works."
},
{
"name": "CARDDAV_USERNAME",
"format": "string",
"description": "Account name. Most hosted services want an app-specific password with it."
},
{
"name": "CARDDAV_PASSWORD",
"format": "string",
"description": "Password or app-specific password. Deleted from the environment once read."
},
{
"name": "CARDDAV_TOKEN",
"format": "string",
"description": "Bearer token, as an alternative to username and password. Not both."
},
{
"name": "CARDDAV_ADDRESSBOOKS",
"format": "string",
"description": "Comma-separated address books this server may touch, by path or final path segment. Default: all of them."
},
{
"name": "CARDDAV_MAX_CONTACTS",
"format": "number",
"description": "Contacts a listing returns by default, 1 to 500 (default: 100)"
},
{
"name": "CARDDAV_READ_ONLY",
"format": "boolean",
"description": "Set to true to register only the read tools (default: false)"
},
{
"name": "CARDDAV_INSECURE_TLS",
"format": "boolean",
"description": "Set to true to accept a self-signed certificate on the configured host only (default: false)"
},
{
"name": "CARDDAV_ALLOW_PLAINTEXT",
"format": "boolean",
"description": "Set to true to allow a plain http:// URL to a host that is not loopback, which sends the credentials and every contact unencrypted (default: false)"
},
{
"name": "CARDDAV_ALLOW_TOOLS",
"format": "string",
"description": "Comma-separated tool names or list_* prefixes to register; 'essential' selects a curated preset (default: all tools)"
},
{
"name": "CARDDAV_DENY_TOOLS",
"format": "string",
"description": "Comma-separated tool names or list_* prefixes to remove from whatever the allow list left"
},
{
"name": "ELICITATION",
"format": "boolean",
"description": "Deliberately unprefixed, and reaches every MCP server in the environment. Set to false to make guarded tools use the two-call token instead of a dialog (default: true)"
}
]
}Tools
Reported by the attributed source; not independently observed by Koskamo.
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · repository · passed · metadata changed · updated
- · backfill · recorded · Pre-expansion baseline; unobserved rich metadata remains unknown
Connect from your client
Each snippet configures the same source-provided package; replace placeholders before use.
Cursor
{
"mcpServers": {
"carddav-mcp-0-1-4": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"CARDDAV_URL=<YOUR_CARDDAV_URL>",
"-e",
"CARDDAV_USERNAME=<YOUR_CARDDAV_USERNAME>",
"-e",
"CARDDAV_PASSWORD=<YOUR_CARDDAV_PASSWORD>",
"-e",
"CARDDAV_TOKEN=<YOUR_CARDDAV_TOKEN>",
"-e",
"CARDDAV_ADDRESSBOOKS=<YOUR_CARDDAV_ADDRESSBOOKS>",
"-e",
"CARDDAV_MAX_CONTACTS=<YOUR_CARDDAV_MAX_CONTACTS>",
"-e",
"CARDDAV_READ_ONLY=<YOUR_CARDDAV_READ_ONLY>",
"-e",
"CARDDAV_INSECURE_TLS=<YOUR_CARDDAV_INSECURE_TLS>",
"-e",
"CARDDAV_ALLOW_PLAINTEXT=<YOUR_CARDDAV_ALLOW_PLAINTEXT>",
"-e",
"CARDDAV_ALLOW_TOOLS=<YOUR_CARDDAV_ALLOW_TOOLS>",
"-e",
"CARDDAV_DENY_TOOLS=<YOUR_CARDDAV_DENY_TOOLS>",
"-e",
"ELICITATION=<YOUR_ELICITATION>",
"ghcr.io/ni-c/carddav-mcp:0.1.4"
],
"env": {
"CARDDAV_URL": "<YOUR_CARDDAV_URL>",
"CARDDAV_USERNAME": "<YOUR_CARDDAV_USERNAME>",
"CARDDAV_PASSWORD": "<YOUR_CARDDAV_PASSWORD>",
"CARDDAV_TOKEN": "<YOUR_CARDDAV_TOKEN>",
"CARDDAV_ADDRESSBOOKS": "<YOUR_CARDDAV_ADDRESSBOOKS>",
"CARDDAV_MAX_CONTACTS": "<YOUR_CARDDAV_MAX_CONTACTS>",
"CARDDAV_READ_ONLY": "<YOUR_CARDDAV_READ_ONLY>",
"CARDDAV_INSECURE_TLS": "<YOUR_CARDDAV_INSECURE_TLS>",
"CARDDAV_ALLOW_PLAINTEXT": "<YOUR_CARDDAV_ALLOW_PLAINTEXT>",
"CARDDAV_ALLOW_TOOLS": "<YOUR_CARDDAV_ALLOW_TOOLS>",
"CARDDAV_DENY_TOOLS": "<YOUR_CARDDAV_DENY_TOOLS>",
"ELICITATION": "<YOUR_ELICITATION>"
}
}
}
}Cline
{
"mcpServers": {
"carddav-mcp-0-1-4": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"CARDDAV_URL=<YOUR_CARDDAV_URL>",
"-e",
"CARDDAV_USERNAME=<YOUR_CARDDAV_USERNAME>",
"-e",
"CARDDAV_PASSWORD=<YOUR_CARDDAV_PASSWORD>",
"-e",
"CARDDAV_TOKEN=<YOUR_CARDDAV_TOKEN>",
"-e",
"CARDDAV_ADDRESSBOOKS=<YOUR_CARDDAV_ADDRESSBOOKS>",
"-e",
"CARDDAV_MAX_CONTACTS=<YOUR_CARDDAV_MAX_CONTACTS>",
"-e",
"CARDDAV_READ_ONLY=<YOUR_CARDDAV_READ_ONLY>",
"-e",
"CARDDAV_INSECURE_TLS=<YOUR_CARDDAV_INSECURE_TLS>",
"-e",
"CARDDAV_ALLOW_PLAINTEXT=<YOUR_CARDDAV_ALLOW_PLAINTEXT>",
"-e",
"CARDDAV_ALLOW_TOOLS=<YOUR_CARDDAV_ALLOW_TOOLS>",
"-e",
"CARDDAV_DENY_TOOLS=<YOUR_CARDDAV_DENY_TOOLS>",
"-e",
"ELICITATION=<YOUR_ELICITATION>",
"ghcr.io/ni-c/carddav-mcp:0.1.4"
],
"env": {
"CARDDAV_URL": "<YOUR_CARDDAV_URL>",
"CARDDAV_USERNAME": "<YOUR_CARDDAV_USERNAME>",
"CARDDAV_PASSWORD": "<YOUR_CARDDAV_PASSWORD>",
"CARDDAV_TOKEN": "<YOUR_CARDDAV_TOKEN>",
"CARDDAV_ADDRESSBOOKS": "<YOUR_CARDDAV_ADDRESSBOOKS>",
"CARDDAV_MAX_CONTACTS": "<YOUR_CARDDAV_MAX_CONTACTS>",
"CARDDAV_READ_ONLY": "<YOUR_CARDDAV_READ_ONLY>",
"CARDDAV_INSECURE_TLS": "<YOUR_CARDDAV_INSECURE_TLS>",
"CARDDAV_ALLOW_PLAINTEXT": "<YOUR_CARDDAV_ALLOW_PLAINTEXT>",
"CARDDAV_ALLOW_TOOLS": "<YOUR_CARDDAV_ALLOW_TOOLS>",
"CARDDAV_DENY_TOOLS": "<YOUR_CARDDAV_DENY_TOOLS>",
"ELICITATION": "<YOUR_ELICITATION>"
}
}
}
}VS Code
{
"servers": {
"carddav-mcp-0-1-4": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"CARDDAV_URL=<YOUR_CARDDAV_URL>",
"-e",
"CARDDAV_USERNAME=<YOUR_CARDDAV_USERNAME>",
"-e",
"CARDDAV_PASSWORD=<YOUR_CARDDAV_PASSWORD>",
"-e",
"CARDDAV_TOKEN=<YOUR_CARDDAV_TOKEN>",
"-e",
"CARDDAV_ADDRESSBOOKS=<YOUR_CARDDAV_ADDRESSBOOKS>",
"-e",
"CARDDAV_MAX_CONTACTS=<YOUR_CARDDAV_MAX_CONTACTS>",
"-e",
"CARDDAV_READ_ONLY=<YOUR_CARDDAV_READ_ONLY>",
"-e",
"CARDDAV_INSECURE_TLS=<YOUR_CARDDAV_INSECURE_TLS>",
"-e",
"CARDDAV_ALLOW_PLAINTEXT=<YOUR_CARDDAV_ALLOW_PLAINTEXT>",
"-e",
"CARDDAV_ALLOW_TOOLS=<YOUR_CARDDAV_ALLOW_TOOLS>",
"-e",
"CARDDAV_DENY_TOOLS=<YOUR_CARDDAV_DENY_TOOLS>",
"-e",
"ELICITATION=<YOUR_ELICITATION>",
"ghcr.io/ni-c/carddav-mcp:0.1.4"
],
"env": {
"CARDDAV_URL": "<YOUR_CARDDAV_URL>",
"CARDDAV_USERNAME": "<YOUR_CARDDAV_USERNAME>",
"CARDDAV_PASSWORD": "<YOUR_CARDDAV_PASSWORD>",
"CARDDAV_TOKEN": "<YOUR_CARDDAV_TOKEN>",
"CARDDAV_ADDRESSBOOKS": "<YOUR_CARDDAV_ADDRESSBOOKS>",
"CARDDAV_MAX_CONTACTS": "<YOUR_CARDDAV_MAX_CONTACTS>",
"CARDDAV_READ_ONLY": "<YOUR_CARDDAV_READ_ONLY>",
"CARDDAV_INSECURE_TLS": "<YOUR_CARDDAV_INSECURE_TLS>",
"CARDDAV_ALLOW_PLAINTEXT": "<YOUR_CARDDAV_ALLOW_PLAINTEXT>",
"CARDDAV_ALLOW_TOOLS": "<YOUR_CARDDAV_ALLOW_TOOLS>",
"CARDDAV_DENY_TOOLS": "<YOUR_CARDDAV_DENY_TOOLS>",
"ELICITATION": "<YOUR_ELICITATION>"
}
}
}
}Claude Desktop
{
"mcpServers": {
"carddav-mcp-0-1-4": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"CARDDAV_URL=<YOUR_CARDDAV_URL>",
"-e",
"CARDDAV_USERNAME=<YOUR_CARDDAV_USERNAME>",
"-e",
"CARDDAV_PASSWORD=<YOUR_CARDDAV_PASSWORD>",
"-e",
"CARDDAV_TOKEN=<YOUR_CARDDAV_TOKEN>",
"-e",
"CARDDAV_ADDRESSBOOKS=<YOUR_CARDDAV_ADDRESSBOOKS>",
"-e",
"CARDDAV_MAX_CONTACTS=<YOUR_CARDDAV_MAX_CONTACTS>",
"-e",
"CARDDAV_READ_ONLY=<YOUR_CARDDAV_READ_ONLY>",
"-e",
"CARDDAV_INSECURE_TLS=<YOUR_CARDDAV_INSECURE_TLS>",
"-e",
"CARDDAV_ALLOW_PLAINTEXT=<YOUR_CARDDAV_ALLOW_PLAINTEXT>",
"-e",
"CARDDAV_ALLOW_TOOLS=<YOUR_CARDDAV_ALLOW_TOOLS>",
"-e",
"CARDDAV_DENY_TOOLS=<YOUR_CARDDAV_DENY_TOOLS>",
"-e",
"ELICITATION=<YOUR_ELICITATION>",
"ghcr.io/ni-c/carddav-mcp:0.1.4"
],
"env": {
"CARDDAV_URL": "<YOUR_CARDDAV_URL>",
"CARDDAV_USERNAME": "<YOUR_CARDDAV_USERNAME>",
"CARDDAV_PASSWORD": "<YOUR_CARDDAV_PASSWORD>",
"CARDDAV_TOKEN": "<YOUR_CARDDAV_TOKEN>",
"CARDDAV_ADDRESSBOOKS": "<YOUR_CARDDAV_ADDRESSBOOKS>",
"CARDDAV_MAX_CONTACTS": "<YOUR_CARDDAV_MAX_CONTACTS>",
"CARDDAV_READ_ONLY": "<YOUR_CARDDAV_READ_ONLY>",
"CARDDAV_INSECURE_TLS": "<YOUR_CARDDAV_INSECURE_TLS>",
"CARDDAV_ALLOW_PLAINTEXT": "<YOUR_CARDDAV_ALLOW_PLAINTEXT>",
"CARDDAV_ALLOW_TOOLS": "<YOUR_CARDDAV_ALLOW_TOOLS>",
"CARDDAV_DENY_TOOLS": "<YOUR_CARDDAV_DENY_TOOLS>",
"ELICITATION": "<YOUR_ELICITATION>"
}
}
}
}Let your agent find its tools
Find servers like carddav-mcp from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.