Cozi MCP Server
This server lets AI assistants read and update your Cozi family organizer data via MCP.
Family members: List family members with IDs for use as appointment attendees.
Lists: Summarize all lists (optionally filter by shopping/todo), get items in a list, create and delete lists.
List items: Add, update (text and/or completion status), and remove items.
Calendar: Get appointments for a given month, create appointments (timed, all-day, multi-day), partial-update appointments (fetch-then-merge), and delete them.
Read-only mode: When
COZI_READ_ONLY=true, only read operations (family_members, get_lists, get_list_items, get_calendar) are exposed; all write tools are hidden.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Cozi MCP Serveradd milk to the shopping list"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Cozi MCP Server
An unofficial Model Context Protocol server that lets AI assistants like Claude read and update your Cozi Family Organizer lists and calendar.
Each user runs their own instance against their own Cozi account. Your credentials are stored in your MCP client's secure config (Claude Desktop's OS keychain, Smithery's encrypted session config, or your local environment) and never leave your machine — the author of this server has no access to your data.
Install
1. MCPB (recommended for Claude Desktop)
Download the latest .mcpb from the Releases page and double-click to install in Claude Desktop. You'll be prompted for your Cozi username and password — they're stored securely in your OS keychain.
This path requires no Node, npm, or Python install on your machine.
2. Smithery (for other MCP clients)
For Cursor, ChatGPT-style clients, or web agents that connect to Smithery-hosted servers:
Configure your Cozi credentials in the Smithery UI; each session runs in isolation with its own credential set.
3. npx (for power users)
Add this to your Claude Desktop claude_desktop_config.json (or any other MCP client config file):
{
"mcpServers": {
"cozi": {
"command": "npx",
"args": ["-y", "@mjucius/cozi-mcp"],
"env": {
"COZI_USERNAME": "you@example.com",
"COZI_PASSWORD": "your-password",
"COZI_READ_ONLY": "true"
}
}
}
}Requires Node 20+. The package will be downloaded on first run.
Set COZI_READ_ONLY=true to expose only read operations. In read-only mode, the server registers
family_members, get_lists, get_list_items, and get_calendar; tools that create, update, or
delete Cozi data are hidden from MCP clients. Omit the variable, or set it to any value other than
1, true, yes, or on, for the default read-write tool surface.
Related MCP server: AnyList MCP Server
Troubleshooting
Tools fail with "Authentication failed" even after I corrected my password
COZI_USERNAME and COZI_PASSWORD are read once, when the server process
starts. Editing them in your MCP client's settings updates the stored config but
does not reach a server that is already running — it keeps presenting the old
credentials until it is respawned.
Fully quit and relaunch your MCP client (on macOS, Cmd-Q rather than closing the window). Reloading, reconnecting, or toggling the extension off and on is usually not enough.
How do I tell which version is actually running?
The running server advertises its version in the MCP handshake; your client
displays it (Claude Desktop: Settings > Extensions). That is independent of what
is in your working tree — installing an MCPB installs whatever is inside the
.mcpb file, which is only as current as the last npm run bundle:mcpb. Build
the bundle immediately before installing it, or install from a GitHub release.
Repeated failures start returning "Too many failed login attempts"
Five consecutive failed authentications for a username trigger an exponential backoff, capped at 15 minutes; the message states the remaining wait. The counter lives in process memory, so restarting the client clears it.
Trust and Security
Cozi has no OAuth — username/password authentication is the only way the API supports. This server handles that fact honestly:
Per-user, by architecture. Each user runs their own instance against their own Cozi account. There is no shared backend, no proxy, no multi-tenant database. The author of this server never sees anyone's credentials or data.
Credentials live only in your MCP client's secure config. Claude Desktop stores them in your OS keychain. Smithery encrypts them per-session. The npx path reads them from environment variables you set yourself. Nothing is logged, written to disk by this server, or sent anywhere except
https://rest.cozi.com.API surface is constrained. This server only contacts
rest.cozi.comfor the same endpoints the Cozi web app uses (auth, lists, calendar, family members). The full request/response code lives insrc/cozi/— about 500 lines of TypeScript you can audit yourself.Open source, MIT licensed. Pin a specific version (
@mjucius/cozi-mcp@2.0.0) if you want a stable target, or fork the repo and run your own build if you want zero supply-chain trust.
Security & trust model
This is a single-user server by design. The Cozi credential holder is the principal — there is no separate per-caller authentication gate, because each user runs their own instance against their own Cozi account. Concretely:
stdio (npx / MCPB) trusts the local user. Whoever can launch the process and read the configured
COZI_USERNAME/COZI_PASSWORD(or the OS keychain entry) is treated as the account owner. The trust boundary is your machine and its user account.The Smithery HTTP deployment trusts the session-config credentials as the principal. Whoever supplies valid Cozi credentials in the session config is the authenticated user for that session. There is no additional login layer.
No multi-tenancy. Each user configures their own instance with their own Cozi account. There is no shared backend, no tenant isolation to breach, and no per-caller authentication beyond possession of valid Cozi credentials — which is the same access model as the Cozi web app itself.
Two defensive measures narrow the blast radius of that model:
Time-bounded credential cache. Authenticated clients are cached only for a bounded lifetime, so a rotated or revoked Cozi password stops working rather than being honored indefinitely from a stale cached session.
Failed-login rate limiting. Repeated failed authentication attempts are rate-limited to blunt credential-guessing against the Cozi endpoint.
Tools
The server exposes 12 tools by default, or 4 read-only tools when COZI_READ_ONLY=true (or
Smithery/MCPB read-only config) is enabled. Returns are slim dicts with null/empty fields omitted.
Family
family_members()→[{id, name, color?}]— call this first to get attendee IDs for appointments.
Lists
get_lists(list_type?)→[{id, title, type, item_count, completed_count}]—list_typeis optional,'shopping'or'todo'.get_list_items(list_id, include_completed=false)→[{id, text, status, position?}].create_list(name, list_type)→{id, title, type}.delete_list(list_id)→boolean.
create_list and delete_list are hidden in read-only mode.
Items
add_item(list_id, text, position=0)→{id, text}.update_item(list_id, item_id, text?, completed?)→{id, text, status}— pass either or both. Non-atomic when both are passed: the text is updated first, then the status.remove_items(list_id, item_ids)→boolean.
All item tools are hidden in read-only mode.
Calendar
get_calendar(year, month)→[{id, subject, day, all_day, start?, end?, end_day?, attendees?, location?, notes?}].dayis always the start day;end_dayappears only on multi-day events, which Cozi lists in every month they overlap (sodaymay fall outside the month you asked for).create_appointment(subject, start, end, attendees?, all_day=false, notes='', location?)—startandendare ISO datetimes (e.g.'2026-06-15T10:00:00'). For all-day events (all_day=true) a bare date (e.g.'2026-06-15') is also accepted andendmay equalstart; a bare date on a timed event is an error. Putendon a later date for a multi-day event; the result reports the span asend_day. Anendbeforestartis an error.update_appointment(appointment_id, year, month, ...)— partial update via fetch-then-merge: pass(appointment_id, year, month)plus any fields to change. Omitted fields are preserved. To switch a timed appointment to all-day passall_day=true; to switch to timed pass newstart/end. Passingendre-spans the event against its (possibly newly set) start day, so anendon a later date makes it multi-day and one on the start day collapses it back; passingstartalone moves the event and keeps its length. A bare date is accepted forstart/endwhen the event is, or is being made, all-day; on a timed event it is an error.delete_appointment(appointment_id, year, month)→boolean.
create_appointment, update_appointment, and delete_appointment are hidden in read-only mode.
Workflow tip
When creating or updating appointments with specific attendees, call family_members() first and use those id values in the attendees arg. Calendar tools are scoped to a (year, month) page — pass the same year/month back when updating or deleting an appointment from that page.
Migration from v1 (Python)
v2.0 is a Node/TypeScript rewrite of the previous Python implementation, distributed as MCPB / npx / Smithery. The runtime changed AND the tool surface was consolidated — if you have prompts written against v1, update them as follows:
v1 (Python, 14 tools) | v2 (Node, 12 tools) |
|
|
|
|
|
|
|
|
|
|
| removed |
|
|
| now summary only — fetch items via |
The legacy v1 Python source is preserved at git tag v1.0.0 for reference.
Development
Requires Node 20+ (see .nvmrc).
nvm use
npm install
npm test # vitest, mocked at the CoziClient boundary; no credentials
npm run test:live # live conformance suite against real Cozi (creds.env); required before a release
npm run typecheck
npm run build # tsup → dist/
npm run dev # local stdio dev with COZI_USERNAME / COZI_PASSWORD env vars
npm run playground # @smithery/cli local playground UI
npm run bundle:mcpb # produces cozi-mcp.mcpb at repo rootThe repo layout:
cozi_mcp/
├── src/
│ ├── server.ts # MCP server factory (Smithery default export)
│ ├── bin.ts # npx + MCPB stdio entry point
│ ├── instructions.ts
│ ├── cozi/ # Inlined Cozi HTTP client (no separate npm package)
│ └── tools/ # 12 MCP tools
├── tests/ # vitest, mocks CoziClient at the boundary
├── manifest.json # MCPB manifest (Claude Desktop)
├── smithery.yaml # Smithery deploy manifest
└── package.jsonThe Cozi HTTP client is inlined under src/cozi/ rather than published as a separate npm package — it's small, only useful for this MCP server, and avoids the supply-chain surface area of a separate dependency. If you'd prefer the Python equivalent for your own projects, see py-cozi-client.
Acknowledgments
The
?apikey=coziwc|v…_productionrequirement on the Cozi auth endpoint was reverse-engineered from the livemy.cozi.comweb bundle by Wetzel402/py-cozi PR #3. Without that discovery, every login attempt from a server environment fails with a misleading 401 regardless of credential validity.Built on the Model Context Protocol and its TypeScript SDK by Anthropic.
Trademark and affiliation
Cozi and the Cozi logo are trademarks of Cozi Group Inc. This project is unofficial and not affiliated with, endorsed by, or sponsored by Cozi Group Inc. Use of the Cozi API is at your own risk and subject to Cozi's Terms of Service.
License
MIT — see LICENSE.
Contributing
PRs welcome. Please run npm test and npm run typecheck before submitting.
Available Tools
12 toolsadd_itemAdd an item to a listCInspect
Add an item to a list. Returns: {id, text}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| list_id | Yes | ||
| position | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it only discloses the return shape ({id, text}). It says nothing about duplicate handling, ordering behavior, permission requirements, or what happens on failure — all relevant for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the purpose front-loaded and no filler. The return-shape line is compact and useful given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with no annotations, no output schema, and 0% schema description coverage, this definition leaves too much unspecified — parameter meaning, side effects, and failure modes are all absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for three parameters (list_id, text, position). The description adds no parameter meaning beyond echoing 'text' and 'id' in the return value, leaving position semantics (index? insertion point?) and id format entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Add an item to a list'), so an agent immediately knows the operation. It does not distinguish itself from siblings like update_item or remove_items, which share the same list-item domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as update_item or remove_items. The agent must infer selection entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_appointmentCreate a calendar appointmentAInspect
Create a calendar appointment. start and end are ISO datetimes (e.g. '2026-06-15T10:00:00'). For all-day events (all_day=true) a bare date (e.g. '2026-06-15') is also accepted and end may equal start; a bare date on a timed event is an error. For a multi-day event put end on a later date — the span is preserved, and the result reports it as end_day. end before start is an error. For attendees, call family_members() first and pass those id values.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| notes | No | ||
| start | Yes | ||
| all_day | No | ||
| subject | Yes | ||
| location | No | ||
| attendees | No |
TDQS
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 reveals error conditions (bare date on a timed event, end before start), special all-day semantics, and the result field end_day. It does not mention permissions or broader side effects, but it covers the most decision-relevant behaviors well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense, well-ordered paragraph with no filler: purpose first, followed by date rules, error cases, multi-day behavior, and attendee sourcing. Every sentence adds essential information an agent needs before calling the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and seven parameters, the description covers the hardest input semantics, key error conditions, and one important returned field (end_day). It does not specify the full return shape or timezone handling, but an agent has enough to invoke the tool correctly for common cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It thoroughly explains start, end, all_day, and attendees, which are the non-obvious parameters, but leaves subject, notes, and location to their self-evident names. This is strong compensation for the tricky parameters though not exhaustive for all seven.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a calendar appointment') and then enriches it with concrete behavioral rules that distinguish creation from the update/delete/get siblings. The all-day, multi-day, and attendee semantics make the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when and how to use the tool, including date-format constraints, all-day event handling, and the explicit prerequisite to call family_members() for attendees. It does not explicitly name alternatives like update_appointment for modifications, but the create-vs-update distinction is strongly implied by the verb and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_listCreate a listAInspect
Create a list ('shopping' or 'todo'). Returns: {id, title, type}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| list_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It discloses the return structure ({id, title, type}), but does not mention side effects, validation, authorization needs, or behavior on duplicate names.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two front-loaded sentences and zero wasted words. Every part adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 required params, no nested objects, no output schema), the description provides the essential purpose and return format. It is adequate for an AI agent to use correctly, though it could mention that 'name' is a required string.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no descriptions in schema). The description adds context for the 'list_type' parameter by specifying allowed values ('shopping' or 'todo'), but the 'name' parameter is not described at all, leaving its purpose and constraints unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'create' and the resource 'list', and specifies the two valid types ('shopping' or 'todo'). This distinguishes it from sibling tools like 'create_appointment' or 'get_lists'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives. It does not mention when not to use it or provide context for choosing between this and sibling tools like 'add_item' or 'get_lists'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_appointmentDelete an appointmentCInspect
Delete an appointment. Returns true on success.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| month | Yes | ||
| appointment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description only adds 'Returns true on success', omitting whether deletion is irreversible, permissions required, or error behavior. Lacks critical behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, direct sentences with no wasted words, though it sacrifices completeness for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and three required parameters, the description is far too minimal to fully guide correct usage, especially given sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the three parameters (appointment_id, year, month), leaving the agent to infer meaning from names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete an appointment', which is a specific verb+resource combination, distinguishing it from sibling tools like create_appointment and update_appointment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, no prerequisites or exclusions provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_listDelete a listCInspect
Delete a list. Returns true on success.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden for a destructive operation. It notes the return value ('true on success') but omits irreversibility, permission requirements, and whether dependent items are also removed — critical context for a delete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the return contract. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, annotation-free tool with no output schema and an undocumented required parameter, the description is too thin. It should at minimum state irreversibility and any preconditions before an agent commits to the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter list_id is documented only by a regex pattern. The description adds no meaning about how to obtain a list_id or what it references, so it does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a list'), which is unambiguous against siblings like create_list or get_list_items. It does not, however, differentiate itself from other delete-style siblings (delete_appointment, remove_items) or clarify scope (e.g., whether list items go with it).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as remove_items, nor any preconditions or warnings. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
family_membersList family membersAInspect
List family members. Use the id for appointment attendees. Returns: [{id, name, color?}].
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description must disclose behavior. It correctly states it returns a list of family members with fields {id, name, color?}, but does not specify ordering, caching, or potential empty results. Adequate for a read-only list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly crafted sentences: first states purpose, second provides usage guidance and return structure. No redundant words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully sufficient for a simple parameterless tool: describes return format and actionable usage (id for attendees). No output schema exists, so the description compensates well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in input schema, so schema coverage is 100%. Description adds no parameter info (none needed), baseline 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'List' and resource 'family members' is specific and unambiguous. It distinguishes itself from sibling list tools (e.g., get_calendar, get_lists) by naming a distinct entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to use the returned `id` for appointment attendees, providing a clear use case. Lacks explicit when-not-to-use or alternative comparisons, but sufficient for this simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendarGet appointments for a monthAInspect
Appointments for one month. Returns: [{id, subject, day, all_day, start?, end?, end_day?, attendees?, location?, notes?}]. day is always the start day and end_day appears only on multi-day events; such an event is listed in every month it overlaps, so day may fall outside the month asked for.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| month | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it delivers the key non-obvious behavior: multi-day events appear in every overlapping month and `day` can fall outside the requested month. That overlap caveat is genuinely useful and not derivable from the schema, though it says nothing about permissions, calendar scope, or result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very tight: the scope statement comes first, followed by the return shape and the multi-day caveat, with no filler sentences. Slightly compressed for the amount of information packed in, but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return field list and the tricky end_day/day semantics, which is exactly the gap a caller would otherwise hit. It omits permission/auth context and any pagination or volume expectation for a month-long query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the two required parameters, so the description must compensate; it hints at the semantics of the queried month ('the month asked for') but never defines `year` or `month` or clarifies month numbering. It adds only marginal meaning over the schema's integer type and 1-12 bounds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (appointments) and the scope (one month), so an agent can tell it fetches calendar entries rather than mutating them. It lacks an explicit verb and never names the sibling tools it is distinct from, but against siblings like create_appointment/update_appointment the read purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as the create/update/delete appointment siblings. The agent must infer from the name alone that this is the retrieval tool for a given month.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_list_itemsGet items in a listAInspect
Items in one list. Excludes completed items by default. Returns: [{id, text, status, position?}].
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | ||
| include_completed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the default filtering behavior (excludes completed) and the return shape, which is genuinely useful. However, it doesn't mention read-only safety, pagination, ordering, or permissions—significant omissions for a retrieval tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded clauses: scope, default behavior, return shape. No wasted words, and the most decision-relevant fact (default exclusion) is prominent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the inline return shape is a plus. But for a 2-param tool with 0% schema coverage and no annotations, the description leaves gaps: list_id semantics, pagination, error cases, and read-only nature are unaddressed. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that include_completed controls the completed-item filter, which gives meaning to one parameter. But list_id is undocumented (though self-evident), and the parameter's type/default behavior isn't fully explained. Partial compensation warrants a 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource: retrieving items within one list. Distinguishes from get_lists (which returns lists, not items). However, it doesn't explicitly name or differentiate from sibling add_item/update_item/remove_items beyond the 'get' verb, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The default behavior (excludes completed items) implies context for when to use include_completed, but there's no explicit statement of when to use this vs alternatives like get_lists or update_item. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listsSummarize all listsAInspect
Summarize all lists (no items). Optionally filter by 'shopping' or 'todo'. Returns: [{id, title, type, item_count, completed_count}].
| Name | Required | Description | Default |
|---|---|---|---|
| list_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description clearly indicates it is a read-only summarization that returns specific fields and explicitly states it does not return items, disclosing key behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words: main purpose first, then filter, then return format. Highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers return structure and filtering, which is adequate for a simple list summary tool. Minor omissions like case sensitivity or pagination do not significantly detract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, but the description adds meaning by explaining the parameter's purpose and suggesting valid filter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it summarizes all lists without items, and optionally filters by type. It distinguishes from siblings like 'get_list_items' which retrieves items of a specific list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides filtering options ('shopping' or 'todo') but does not explicitly state when to use this tool versus alternatives like 'get_list_items' for item details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_itemsRemove items from a listCInspect
Remove items from a list. Returns true on success.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | ||
| item_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral disclosure. It only states the return value (true on success) but omits critical details such as required permissions, whether removal is reversible, and whether missing item_ids are ignored or cause errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with minimal waste. The purpose is stated first, followed by the return value, which is efficient though slightly sparse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and no output schema, the description is incomplete. It does not cover permissions, error conditions, or parameter semantics for a mutation tool with two required parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not describe the two parameters (list_id, item_ids) beyond their names. With a low coverage, the description fails to compensate for the missing parameter documentation, leaving the agent to infer meanings from names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Remove) and resource (items from a list), which distinguishes it from siblings like add_item and update_item. However, it does not explicitly differentiate from other removal-style siblings such as delete_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this tool versus alternatives like update_item or delete_list, nor any prerequisites or conditions for use. The description offers no guidance on selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_appointmentPartial-update an appointmentAInspect
Partial-update an appointment. The Cozi PUT semantics replace ALL fields, so this tool first fetches the existing appointment from the (year, month) page and merges your changes — only fields you pass are altered. To switch a timed appointment to all-day pass all_day=true; to switch to timed pass new start/end. Passing end re-spans the event against its (possibly newly set) start day, so an end on a later date makes it multi-day and one on the start day collapses it back; passing start alone moves the event and keeps its length, and all_day=true preserves the span. A bare date (e.g. '2026-06-15') is accepted for start/end when the event is, or is being made, all-day; on a timed event it is an error.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| year | Yes | ||
| month | Yes | ||
| notes | No | ||
| start | No | ||
| all_day | No | ||
| subject | No | ||
| location | No | ||
| attendees | No | ||
| appointment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it reveals the fetch-and-merge behavior, the effect of passing `end` (re-spans, multi-day vs collapse), `start` alone (moves and keeps length), and the error condition for bare dates on timed events. This is far beyond what the schema provides and leaves no hidden behavioral surprises.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every clause earns its place, explaining intricate edge-case behavior that would otherwise be inscrutable. It front-loads the core purpose and merge semantics before detailing parameter interactions; slightly verbose, but appropriately so for a 10-parameter tool with no annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameter-rich mutation tool with no annotations or output schema, the description covers the essential invocation logic: how to switch timed/all-day, how start/end interact, and one explicit error condition. It stops short of describing return values or other error cases, but nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate; it does for the high-risk parameters (`start`, `end`, `all_day`) with concrete scenario rules, and even explains `year`/`month` as the locating page for the fetch. The simple string fields (`subject`, `location`, `notes`, `attendees`) and `appointment_id` are left to schema-name inference, but the semantics of 'only fields you pass are altered' covers them adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Partial-update an appointment') and immediately distinguishes it from the Cozi PUT full-replace semantics. Among siblings like create_appointment and delete_appointment, the 'partial-update' wording makes the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides conditional usage guidance ('To switch a timed appointment to all-day pass all_day=true; to switch to timed pass new start/end') and explains the merge model, which clarifies when this tool is appropriate for modifying an existing appointment. It doesn't explicitly name alternatives or exclusions, so it stops short of a 5, but the context clearly separates it from create/delete siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_itemUpdate an item's text and/or completionAInspect
Update an item's text and/or completion status. Pass text, completed, or both. When both are provided the text is updated first then status is updated as a separate request — these are NOT atomic. Returns: {id, text, status}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| item_id | Yes | ||
| list_id | Yes | ||
| completed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does real work: it discloses that a combined text+status update is executed as two sequential requests that are NOT atomic, which an agent must know to reason about partial-failure states. It also discloses the response shape {id, text, status}. It omits permission/auth requirements and error behavior, keeping it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler: purpose first, then valid parameter combinations, then the non-atomicity caveat, then the return shape. The most decision-critical constraint is placed where it cannot be missed and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unannotated mutation tool with no output schema and four undocumented parameters, the description supplies the two things that matter most: the non-atomic update behavior and the return shape. Remaining gaps are authorization requirements and failure semantics for a partially applied update, which an agent would still have to discover.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds real meaning for `text` and `completed` (they can be supplied individually or together, with ordering semantics) but says nothing about `list_id` or `item_id` beyond their presence as required identifiers, and gives no format notes despite the id patterns. Partial compensation justifies the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: "Update an item's text and/or completion status", which unambiguously separates it from add_item, remove_items, and update_list-style siblings. It names the exact mutable fields rather than restating the title. It stops short of explicitly contrasting with any sibling tool, so it lands just under a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Pass `text`, `completed`, or both" tells the agent what input combinations are valid, which is useful invocation guidance. However, it never states when to prefer this tool over a delete/re-add pattern or what happens on invalid item_id, and there are no explicit exclusions. Usage is implied rather than prescribed.
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.
5 tool updates
v2.2.0- Changed
add_item1 field changed- added
Input schema / properties / list_id / patternAdded value: +"^[A-Za-z0-9_-]+$"
- Changed
delete_list1 field changed- added
Input schema / properties / list_id / patternAdded value: +"^[A-Za-z0-9_-]+$"
- Changed
get_list_items1 field changed- added
Input schema / properties / list_id / patternAdded value: +"^[A-Za-z0-9_-]+$"
- Changed
remove_items2 fields changed- added
Input schema / properties / item_ids / items / patternAdded value: +"^[A-Za-z0-9_-]+$" - added
Input schema / properties / list_id / patternAdded value: +"^[A-Za-z0-9_-]+$"
- Changed
update_item2 fields changed- added
Input schema / properties / item_id / patternAdded value: +"^[A-Za-z0-9_-]+$" - added
Input schema / properties / list_id / patternAdded value: +"^[A-Za-z0-9_-]+$"
12 tool updates
v2.0.1- First observed
add_item - First observed
create_appointment - First observed
create_list - First observed
delete_appointment - First observed
delete_list - First observed
family_members - First observed
get_calendar - First observed
get_list_items - First observed
get_lists - First observed
remove_items - First observed
update_appointment - First observed
update_item
TDQS
Scored across 12 tools
Tools are mostly distinct by resource (lists/items vs. appointments vs. family members), but update_item and add_item both target list items and could be confused when an agent wants to modify an item; remove_items vs. delete_list vs. delete_appointment are clear by resource. The calendar tools are well-differentiated.
Most tools follow a clear verb_noun pattern (create_appointment, update_appointment, delete_appointment, get_calendar, get_lists, get_list_items, create_list, delete_list, add_item, remove_items). Minor inconsistency: add_item/remove_items use different verb forms (add vs. remove) and update_item is the only 'update' for items, but the pattern is still readable.
12 tools is well-scoped for a family organizer server covering calendar, lists, and family members. Each tool maps to a distinct operation and none feel redundant.
The surface covers core lifecycle for lists (create/get/delete, add/update/remove items) and appointments (create/update/delete/get), plus family_members for attendees. Minor gaps: no way to update a list's title/type, no way to reorder items, and no search across calendar or lists, but agents can accomplish primary workflows.
Maintenance
Related MCP Connectors
Family schedules and household tools with OAuth. External calendars remain read-only.
GDPR-compliant calendar access for AI assistants: read, create, edit, RSVP. Google, MS 365, Apple.
Household-aware cooking brain: pantry, meal suggestions, dietary safety, recipes, shopping lists.
Private family planner for schedules, tasks, checklists, attachments, and availability.
Related MCP Servers
- -licenseAqualityNot gradedmaintenanceEnables management of Cozi Family Organizer shopping lists and todo lists through natural language. Supports creating, editing, and organizing family lists with real-time sync to the Cozi platform.9-
- FlicenseAqualityDmaintenanceEnables AI assistants to interact with AnyList for managing shopping lists, recipes, and meal planning. Users can retrieve recipe details, add ingredients to lists, and schedule meals on their AnyList calendar.10-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to view, create, update, search, and manage Google Calendar events, including multi-account support and availability checks.11 npmBusiness Source 1.1
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Google Calendar events, including reading, searching, creating, updating, and deleting events, as well as checking availability and listing calendars.20 npmMIT