Monica CRM MCP Server
An MCP server that connects MCP clients to a Monica 4 personal CRM, letting you find and manage contacts plus everything attached to them.
Contacts — search by name/nickname/email, or paginate a list with filters (gender, tags, has email/phone) at minimal/basic/expanded/full detail; create, update, delete and read full profiles (nickname, gender, birthdate/age or unknown, deceased status, description).
Contact info — email, phone and social handles (fields and field types), postal addresses with automatic country lookup, and tag assignments (list, append, remove).
Relationships — connect contacts as partner, parent, friend, colleague, etc., via relationship types.
Interactions — activities (meetings/events with one or more contacts), conversations and their messages by channel, and logged phone calls.
Notes — create, read, update and delete notes on a contact.
Tasks & reminders — to-dos and stay-in-touch nudges, one-off or repeating (day/week/month/year), filtered by status.
Gifts & debts — presents given or received, gift ideas, and money owed either way, with amounts, currency and settled status.
Media — list, inspect, upload (base64) and delete documents and photos.
Groups — organize contacts into named collections.
Reference data — browse genders, countries, currencies, occupations, contact field types, activity types and relationship types; add or edit custom ones.
Status — check that the Monica connection and credentials work.
Behaviour worth relying on — contacts and types accepted by name or id, inputs validated before reaching Monica, updates merge rather than overwrite, deletes need
confirm: true, compact results, and rate-limit-aware retries.
Note: the exposed schema is the 1.x tool set (e.g. monica_manage_group, monica_manage_contact_profile), whereas the README documents the 2.0 rewrite with 14 consolidated tools (monica_contacts, monica_journal, etc.).
Provides comprehensive contact relationship management through Monica CRM's API, including contact search and management, activity tracking, task and reminder scheduling, note capture, relationship mapping, address management, and custom field handling.
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., "@Monica CRM MCP Serverfind John Smith's contact details and show me his recent notes"
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.
Monica MCP
An MCP server for Monica, the personal CRM: contacts, notes, activities, reminders and more, for any MCP client.
It targets Monica 4 (the classic version, 4.1.2 being its latest release), through its REST API. Monica 5 is a separate rewrite, still in beta, with a different API.
Self-hosting Monica as well? Monica Server Stack runs Monica 4 and this server together in one Docker Compose project, with the account and API token set up automatically.
What it does
Tool | For |
| Search, list, read, create, update and delete contacts, including job, company and how they met. A contact's profile comes with its details, recent notes, activities and reminders. |
| Contact fields (email, phone, social profiles), postal addresses and tags. |
| How contacts are related: partner, parent, friend, colleague… |
| Things to remember about someone. |
| Things done together, with one or more contacts. |
| Phone calls. |
| Message threads, by channel. |
| One-off and repeating reminders, listed by when they next come round. |
| To-dos tied to a contact. |
| Gift ideas, gifts given and received, and money owed either way. |
| Journal entries. |
| Genders, countries, currencies, activity types, relationship types, contact field types and tags; adds custom ones. |
| Documents and photos attached to contacts. |
| Checks the connection. |
How it's built to behave:
People by name. Every tool takes a contact's name or id. A name that matches several people is refused with the candidates and their ids; types, genders and countries are matched by name too.
Few tools, one action each call. Fourteen tools, each with an
action, rather than dozens. Inputs are validated before anything reaches Monica, and invalid ones are rejected with what's allowed (date: use YYYY-MM-DD,no gender "Robot". Choose one of: Man, Woman, Rather not say).Safe edits. Updates change only what's given and keep the rest. Monica's own update API clears anything left out, so the server reads the record first. Deleting anything needs
confirm: true.Compact answers. Results are trimmed to what's useful: names instead of nested objects, plain dates, no API noise.
Gentle with Monica. Monica allows 60 API requests a minute by default. The server remembers names it has already resolved, and waits and retries when Monica asks it to slow down.
Tested against a real Monica. CI sets up Monica 4.1.2 from scratch and runs every tool against it (
scripts/e2e.mjs).
Related MCP server: Bitrix24 MCP Server
Install
Requires Node.js 20.12 or newer, a Monica 4 instance (self-hosted, or monicahq.com) and an API token from it (Settings → API → Create a new token).
To set up Monica and this server together, monica-server-stack does it in one Docker Compose project: the account, the API token (renewed before it expires), the scheduler for reminders, and optional HTTPS.
Desktop clients (stdio)
Most MCP clients take a configuration like this:
{
"mcpServers": {
"monica": {
"command": "npx",
"args": ["-y", "github:Jacob-Stokes/monica-mcp"],
"env": {
"MONICA_BASE_URL": "https://monica.example.com",
"MONICA_API_TOKEN": "the-token"
}
}
}
}Or from a clone: git clone https://github.com/Jacob-Stokes/monica-mcp && cd monica-mcp && npm install, then "command": "node", "args": ["/path/to/monica-mcp/dist/index.js"].
As a service (HTTP)
With MCP_TRANSPORT=http, the server speaks Streamable HTTP at /mcp and requires MCP_BEARER_TOKEN (or OAuth) on every request. The Docker image runs this way:
docker build -t monica-mcp https://github.com/Jacob-Stokes/monica-mcp.git
docker run -d -p 127.0.0.1:8080:8080 \
-e MONICA_BASE_URL=https://monica.example.com -e MONICA_API_TOKEN=... -e MCP_BEARER_TOKEN=... \
monica-mcpcompose.example.yml runs it next to a Monica container. For clients that log in with OAuth 2.1, set MCP_OAUTH_ISSUER, MCP_OAUTH_CANONICAL_URL and, if the issuer puts the client id in aud, MCP_OAUTH_AUDIENCE. /health answers without authentication.
Configuration
Variable | Default | |
|
| The Monica instance |
| required | Its API token |
| Instead: a file holding the token, read again when it changes | |
|
|
|
|
|
|
|
| HTTP only |
| HTTP: the token clients send | |
| HTTP: optional OAuth 2.1 | |
|
| Per request to Monica |
A .env file in the working directory is read when the variables aren't already set. Logs go to stderr.
A self-hosted Monica's API limit can be raised with RATE_LIMIT_PER_MINUTE_API in Monica's own environment; 60 a minute is tight for an assistant looking around.
Upgrading from 1.x
2.0 is a rewrite. The Monica settings are unchanged, and dist/index.js is still the entry point, so existing client configurations keep working, but the tools are new:
1.x | 2.0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| removed: Monica 4's API has no groups endpoint |
resources | removed: |
New: monica_journal, the HTTP transport, OAuth, and a Docker image. Details in CHANGELOG.md.
Development
npm install
npm test # build, then unit tests and an HTTP transport test (no Monica needed)
MONICA_BASE_URL=... MONICA_API_TOKEN=... npm run e2e # every tool against a real MonicaThe end-to-end test works on contacts it creates itself and deletes them at the end; point it at a test instance all the same.
src/
index.ts start-up: stdio or HTTP
config.ts environment variables
monica.ts Monica's API: auth, pagination, rate-limit retries, errors
resolve.ts names to ids (contacts, types, countries…)
format.ts compact results
server.ts tool registry, validation, error messages
http.ts Streamable HTTP, bearer and OAuth
schema.ts zod to flat JSON Schema
tools/ the fourteen toolsLicense
MIT
Available Tools
14 toolsmonica_activitiesADestructive
Things done together with contacts (a coffee, a trip, a dinner). • list — a contact's activities, or the most recent across everyone. • get — one activity. • create — log an activity with one or more contacts, a summary and a date (today by default), optionally typed (e.g. 'ate at a restaurant', 'went to a bar'; monica_reference kind=activity_types). • update — change any of it; contacts, if given, replace the list. • delete — remove an activity (confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The activity's id | |
| date | No | YYYY-MM-DD | |
| type | No | ||
| limit | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| confirm | No | ||
| contact | No | ||
| summary | No | ||
| contacts | No | Who it was with | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent; the description goes further by disclosing that update replaces the contacts list wholesale and that delete requires confirm: true, plus the date-defaults-to-today behavior. No contradiction with the write/destructive annotation profile.
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?
One front-loaded definition sentence followed by a tight per-action bullet list; no filler and every clause carries routing or semantic information.
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 10-param multi-action mutation tool with no output schema, the description covers each action's required fields and the key mutation semantics. It stops short of explaining pagination/limit behavior on list or failure modes, but nothing essential for correct invocation 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 coverage is only 40%, so the description must compensate and largely does: it defines summary, date (defaults today), type with concrete examples and a pointer to monica_reference kind=activity_types, contacts ('who it was with', replaced on update), and confirm. Only id and limit semantics are left entirely to the schema.
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 concrete resource (activities: things done together with contacts) and enumerates all five verbs (list/get/create/update/delete) with the scope of each. An agent can tell this apart from monica_journal, monica_notes, or monica_calls purely from the description without opening the schema.
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?
Each action is scoped with its own condition: 'list — a contact's activities, or the most recent across everyone', 'delete — confirm: true', 'update — change any of it'. This is clear intra-tool routing, but it never names when to pick a sibling tool (e.g. journal vs activities) or states exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_callsADestructive
Phone calls with contacts. • list — a contact's calls, or the most recent across everyone. • create — log a call (date: today by default) with what was said. • update / delete — by id (delete needs confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The call's id | |
| date | No | YYYY-MM-DD | |
| limit | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| confirm | No | ||
| contact | No | ||
| content | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds genuinely useful behavioral context beyond that: the delete-confirm requirement ('confirm: true') and the date default ('today by default'). It stops short of describing what deletion affects or permission needs.
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?
A single front-loaded sentence followed by tight per-action bullets; no filler, and the action-to-behavior mapping is scannable.
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 and seven parameters, the description covers the action surface and the confirm gate but omits what list returns and the semantics of contact/content/limit. Adequate minimum for a CRUD tool 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 coverage is only 43%, so the description must compensate. It does clarify the date default, the confirm requirement for delete, and that id-based ops apply to update/delete, but leaves contact, content, and limit undocumented in both schema and description.
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 concrete resource ('Phone calls with contacts') and enumerates all four operations (list, create, update, delete), so the agent knows exactly what the tool does. It does not, however, explicitly distinguish itself from siblings like monica_conversations or monica_activities, so sibling routing is left to inference.
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?
Per-action conditions are given: list returns a contact's calls or recent across everyone, create logs a call with date defaulting to today, update/delete go by id and delete needs confirm:true. However, there is no guidance on when to choose this tool over the many sibling tools (e.g., conversations/activities), so alternative selection 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.
monica_contact_infoADestructive
A contact's details: contact fields (email, phone, social profiles…), postal addresses, and tags. Choose kind, then: • list — the contact's fields, addresses or tags. • add — a field (type by name, e.g. Email, Phone, Instagram, plus value), an address, or tags (by name; new tags are created). • update — a field or address by its id. • remove — a field or address by id, or tags from the contact by name (confirm: true for fields and addresses). Field types: monica_reference kind=contact_field_types; new types can be added there.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The field or address's id | |
| city | No | ||
| kind | Yes | ||
| name | No | ||
| tags | No | ||
| type | No | ||
| value | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| street | No | ||
| confirm | No | ||
| contact | No | ||
| country | No | ||
| province | No | ||
| postal_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds real behavioral detail: removes on fields/addresses require confirm:true, and adding tags by name silently creates new tags as a side effect. That is useful mutation context beyond the structured hints, though it doesn't cover auth/permission needs.
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 dense but front-loaded and organized around the action matrix, so each clause earns its place given 14 parameters and four operations. It is longer than ideal but avoids filler.
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 14-parameter, destructive, no-output-schema tool, the operation-by-operation coverage is strong, and the 'list' bullet effectively conveys what is returned. The one notable omission is how the target contact is identified, which an agent needs before calling.
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 only 14%, so the description must carry the load, and it largely does — it explains action values, kind (field/address/tag), type-by-name, value, id, tags-by-name, and the confirm flag. Gaps remain: the required 'contact' identifier and the individual address fields (street/city/province/country/postal_code) are never explained, though their names are largely self-evident.
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 opening names the resource (a contact's fields, postal addresses, and tags) and the action matrix makes clear this is a CRUD tool over those sub-resources. It is specific but doesn't explicitly distinguish itself from the sibling monica_contacts, leaving the agent to infer that this handles details rather than the contact record itself.
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 bulleted action map (list/add/update/remove) tells the agent which operation to choose for each task, and it routes field-type discovery to monica_reference kind=contact_field_types. It stops short of stating when NOT to use this tool versus a sibling, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_contactsADestructive
People in Monica, the personal CRM. Actions: • search — find contacts by name, nickname, email or other text. Start here when a person is mentioned. • list — browse all contacts, a page at a time. • get — one contact's profile (birthdate, job, how you met, addresses, relationships, tags) plus their contact details, recent notes, activities and reminders; choose more with include. • create — add a contact. Only first_name is required. • update — change any profile field; fields left out are kept, null clears one. • delete — remove a contact and everything attached to it (confirm: true). Everywhere a contact is needed, a name works as well as an id; if a name matches several people, the error lists them with ids.
| Name | Required | Description | Default |
|---|---|---|---|
| job | No | ||
| page | No | ||
| sort | No | name | |
| limit | No | ||
| query | No | Name, nickname, email or other text | |
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| gender | No | ||
| company | No | ||
| confirm | No | ||
| contact | No | ||
| include | No | ||
| deceased | No | ||
| nickname | No | ||
| birthdate | No | ||
| first_met | No | ||
| last_name | No | ||
| first_name | No | ||
| description | No | ||
| how_you_met | No | ||
| met_through | No | ||
| deceased_date | No | ||
| first_met_reminder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true broadly, and the description sharpens that by scoping destruction to the delete action and stating it removes 'everything attached to it'. It also discloses non-obvious update semantics ('fields left out are kept, null clears one') and error behavior when a name is ambiguous. No permission or rate-limit context, which keeps it short of 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?
Front-loads the resource, then one bullet per action, each starting with the verb. Dense but zero filler, and the cross-cutting name-or-id rule is placed last as a global note rather than repeated per action.
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 22-parameter, six-action tool with no output schema and sparse schema descriptions, the description covers action selection, the destructive path, and update semantics well. It stops short of mapping parameters to actions or describing the shape of list/search results, but those are secondary given the actions are already disambiguated.
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 only 9% across 22 parameters, so the description must carry the load. It does clarify that only first_name is required for create, that confirm gates delete, that include extends get, and that a name substitutes for an id — but the bulk of profile fields (job, gender, company, birthdate, first_met, deceased, etc.) and the list controls (page, limit, sort) remain 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?
Names the resource ('People in Monica, the personal CRM') and then enumerates six distinct verbs — search, list, get, create, update, delete — each with its own scope. An agent can tell contacts apart from monica_notes, monica_activities and the other siblings from the description alone.
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?
Gives explicit routing for the primary entry point ('search — ... Start here when a person is mentioned') and states the precondition for the dangerous action ('delete ... confirm: true'). It does not, however, explain when to prefer this tool over overlapping siblings such as monica_contact_info or monica_relationships, so no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_conversationsADestructive
Message threads with contacts (texts, emails, chats), kept as conversations of messages. • list — a contact's conversations, or the most recent across everyone. • get — one conversation with its messages. • create — record a conversation on a channel (a contact field type such as Email, Phone, Whatsapp, Telegram) with its messages. • add_message — append a message to a conversation. • delete — remove a conversation (confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The conversation's id | |
| date | No | YYYY-MM-DD | |
| from | No | ||
| text | No | ||
| limit | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| channel | No | e.g. Email, Phone, Whatsapp, Telegram | |
| confirm | No | ||
| contact | No | ||
| messages | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so safety is partly covered. The description adds operational context beyond that: delete requires confirm: true, and the action list makes clear which operations mutate versus read. It does not say whether deleting a conversation also destroys its messages, which is the one meaningful remaining gap.
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?
Front-loaded with the resource summary, then a scannable bullet per action with no filler. The opening clause is slightly redundant with the following bullets, but the structure is otherwise tight and well-sized for a five-action 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?
For a 10-parameter, five-action tool with no output schema and only 40% schema coverage, the description is only partially complete. The schema explicitly defers per-action field requirements to the tool description ('see tool description'), yet the description never states which fields each action needs — a real gap for create, add_message, and get.
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 only 40% across 10 parameters, so the description needs to compensate. It does explain channel as a contact field type (Email, Phone, Whatsapp, Telegram), the messages array, and the confirm flag, but leaves date, from, limit, and text semantics to the schema, and never maps which fields are required for which action despite the schema's action description pointing to the tool description for that.
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 the resource (message threads with contacts, as conversations of messages) and enumerates all five operations with a specific verb each: list, get, create, add_message, delete. An agent can immediately tell this apart from siblings like monica_notes or monica_activities without opening the schema.
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?
Each action gets a short gloss ('list — a contact's conversations, or the most recent across everyone'), which implies when to pick it, and delete notes the confirm requirement. However there is no explicit when-not guidance, no prerequisites (e.g. whether a contact must already exist), and no routing to alternatives for overlapping needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_gifts_debtsADestructive
Gifts (ideas, given, received) and money owed between you and contacts. Choose kind, then: • list — a contact's, or everyone's. • create — gift: name, status (idea, offered, received), optional value, url, comment, date. debt: amount, direction (i_owe or they_owe), reason. • update — by id; a debt can be marked settled. • delete — by id (confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The gift or debt's id | |
| url | No | ||
| date | No | YYYY-MM-DD | |
| kind | Yes | ||
| name | No | ||
| limit | No | ||
| value | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| amount | No | ||
| reason | No | ||
| status | No | ||
| comment | No | ||
| confirm | No | ||
| contact | No | ||
| settled | No | ||
| direction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, readOnlyHint=false, and idempotentHint=false. The description adds meaningful behavioral context beyond that: delete requires 'confirm: true', and a debt 'can be marked settled' via update. It stops short of noting permissions or reversibility, but is solid for an annotated 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?
Purpose is front-loaded, then an efficient bulleted breakdown by action. Dense but every bullet earns its place; no filler sentences.
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 16-param multi-action tool with no output schema and low schema coverage, the description covers the action space and most fields well. Gaps around the list filter (contact), pagination ('limit'), and return shape remain, but given the annotations and lack of output schema these are minor.
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?
With only 19% schema coverage on 16 params, the description must carry the load, and it largely does — enumerating per-kind fields (name, status, value, url, comment, date for gifts; amount, direction, reason for debts) and mapping id/confirm to update/delete. It leaves 'limit' and 'contact' format unexplained, so it's not exhaustive.
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 resource ('Gifts (ideas, given, received) and money owed between you and contacts') and distinguishes the two sub-kinds (gift vs debt). It clearly conveys CRUD over gifts/debts, though it doesn't explicitly contrast itself against siblings like monica_contacts or monica_notes.
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 tells the agent how to use each action: 'list — a contact's, or everyone's', 'create — gift: ... debt: ...', 'update — by id', 'delete — by id (confirm: true)'. This effectively guides action selection, though it offers no explicit when-not-to-use or alternate-tool routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_journalADestructive
The journal: dated entries about your own days, not tied to a contact. • list — recent entries. • get — one entry. • create — write an entry (date: today by default). • update — change it. • delete — remove it (confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The journal entry's id | |
| date | No | YYYY-MM-DD | |
| post | No | ||
| limit | No | ||
| title | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is covered structurally. The description adds real value beyond that by stating that delete requires confirm:true, but it never says whether deletes are recoverable, whether update overwrites unspecified fields, or what create/update return.
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?
A single front-loaded definition sentence followed by a tight bullet list per operation — a good structure for a multi-action tool. The bullets are telegraphic ('update — change it'), which trades a little clarity for brevity but wastes no 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?
For a 7-parameter, five-action mutation tool with no output schema and only 43% schema coverage, the description covers the operation surface and two defaults but leaves per-action field requirements, pagination (limit), and return behavior unaddressed.
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 only 43%, and the description compensates only partially: it documents the date default ('today by default') and the confirm flag, and lets the agent infer id for get/update/delete. It says nothing about limit, title, or post, nor which fields each action accepts or requires.
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?
Names the resource precisely ('journal: dated entries about your own days, not tied to a contact') and enumerates the five operations with concrete verbs (list/get/create/update/delete). The phrase 'not tied to a contact' explicitly separates it from sibling tools like monica_notes and monica_activities, so an agent can route without opening any schema.
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 per-action bullets implicitly tell the agent which operation fits which intent, and delete is flagged as needing confirm: true. There is no explicit when-to-use / when-not-to-use guidance and no alternative tool is named, so routing still relies on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_mediaADestructive
Documents and photos attached to contacts. Choose kind, then: • list — a contact's, or everyone's. • upload — a file for a contact, from base64 content plus a filename (or, when this server runs on the same machine over stdio, a local path). • delete — by id (confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The document or photo's id | |
| kind | Yes | ||
| path | No | ||
| limit | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| base64 | No | ||
| confirm | No | ||
| contact | No | ||
| filename | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description adds the non-obvious safety gate: delete requires confirm: true. It also discloses the environment-dependent upload source (base64 vs. local path over stdio), which is behavior an agent cannot infer from schema or annotations. It does not describe what deletion cascades to, keeping it out of 5 territory.
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?
Front-loaded with the resource, then a compact bulleted mapping of action to requirements — no filler sentences. It is dense enough that the stdio caveat is parenthetical, which is efficient but slightly terse.
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 9-parameter, destructive-capable tool with 22% schema coverage and no output schema, the description covers action semantics and the delete confirmation gate well. It omits pagination behavior (limit) and gives no hint about the return shape for list, which an agent needs when paging through media.
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 only 22%, so the description carries most of the burden and does explain the action-dependent parameter contracts (kind choice, upload's base64/filename/path, delete's id/confirm). However, limit (default 20, max 100) is undocumented in both the description and schema, and the shape of contact/id is left to the schema alone, leaving a real 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?
The description names a concrete resource (documents and photos attached to contacts) and enumerates the three verbs it supports (list/upload/delete), so an agent immediately knows the domain. It implicitly separates itself from monica_contacts by scoping to attachments, but never explicitly contrasts with a sibling, so it stops 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?
Each action is paired with the condition that selects it and what it operates on: list scopes to a contact's media or everyone's, upload takes base64+filename (or a local path under stdio), delete works by id with confirm. There are no explicit exclusions or named alternatives, but the per-action framing gives clear context for choosing one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_notesADestructive
Notes about contacts: things to remember about someone. • list — a contact's notes, or the most recent notes across everyone. • get — one note in full. • create / update — write a note about a contact; favorite pins it. • delete — remove a note (confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The note's id | |
| body | No | ||
| limit | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| confirm | No | ||
| contact | No | ||
| favorite | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is covered. The description adds invocation-critical behavior beyond that: delete requires confirm: true (omitting it would fail the call), and 'favorite pins it' describes a side effect of create/update. It still says nothing about auth or reversibility, keeping it below 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?
A single front-loaded sentence establishes the resource, then a tight bulleted list handles each action with no filler. Every clause carries information, though the compressed per-action glosses leave some field-mapping detail unstated rather than over-explained.
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 7-parameter, 5-action tool with no output schema and low schema coverage, the description covers the action set well but does not fully specify which fields each action needs or what a call returns. It is adequate for choosing an action but leaves gaps an agent would have to resolve by trial.
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 only 29%, so the description must carry the parameter burden, and it partially does: confirm:true maps to delete, 'favorite pins it' maps to favorite, and 'a contact's notes' implies contact is the filter for list. However it never explicitly maps body/contact/id to the specific actions that require them, so the agent must infer field requirements per action despite the action field's own pointer back to this description.
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 resource ('Notes about contacts: things to remember about someone') and enumerates every operation the tool supports (list/get/create/update/delete) with a short gloss of each. An agent can tell what each action does, though it does not explicitly distinguish notes from the semantically adjacent monica_journal sibling.
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?
Each action is scoped: list returns either a contact's notes or the most recent across everyone, get returns one note in full, create/update write a note, delete removes one. This tells the agent when to pick each branch. It stops short of stating exclusions or alternatives (e.g., when to prefer monica_journal over a note), so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_referenceADestructive
Monica's reference lists, which other tools match names against: genders, countries, currencies, activity_types, relationship_types, contact_field_types, tags. • list — a list, optionally filtered by text. • create / rename / delete — your own activity types (e.g. 'climbing'), contact field types (e.g. Instagram, with an optional protocol such as https://instagram.com/), and tags. Deleting needs confirm: true.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The item's id | |
| kind | Yes | ||
| name | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| filter | No | ||
| confirm | No | ||
| category | No | ||
| protocol | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds genuinely useful behavioral detail beyond them: it scopes destruction to the delete action and states the safety requirement 'Deleting needs confirm: true.' It also notes the optional protocol format for contact field types. It does not describe what deletion affects or the response, but it meaningfully complements the annotations.
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?
It front-loads the identity of the resource, then uses bullet separators to break out the actions compactly. Every clause carries information (the enumerations, the protocol example, the confirm requirement). It is appropriately sized with little waste.
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 8-parameter, four-action, destructive tool with no output schema, the description covers the main mechanics but leaves meaningful gaps: 'category' is undocumented, the per-action required/optional field mapping is only gestured at, and with no output schema the shape of list results is unexplained. Adequate but not fully self-sufficient.
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 only 25% (2 of 8 params), so the description must compensate, and it partially does: it explains filter ('optionally filtered by text'), protocol (with the https://instagram.com/ example), confirm: true, and implies name for create/rename plus the kind enumeration. However the 'category' parameter is never mentioned anywhere, and per-action required fields are left as 'see tool description' without being fully spelled out. Net partial compensation.
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 this is Monica's set of reference lists and enumerates the exact kinds (genders, countries, currencies, activity_types, relationship_types, contact_field_types, tags), and it separates what each action does. The framing that these are lists 'which other tools match names against' implicitly but clearly distinguishes it from the sibling entity-CRUD tools. It is clear, though it never states the purpose in a single crisp verb+resource phrase.
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 gives clear routing context: 'list' returns the values other tools match against, and create/rename/delete apply specifically to 'your own' activity types, contact field types and tags — implying that genders/countries/currencies are read-only. The filter use for list is described. There is no explicit 'do not use this for X' exclusion, so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_relationshipsADestructive
How contacts are related. A relationship reads 'contact is of other', e.g. contact=Alice, type=parent, other=Bob means Alice is Bob's parent; Monica records the reverse (Bob is Alice's child) itself. • list — a contact's relationships. • add — relate two contacts. • update — change a relationship's type. • remove — delete a relationship (confirm: true). Types include partner, spouse, date, ex, parent, child, sibling, grandparent, uncle, cousin, friend, bestfriend, colleague, boss, mentor (monica_reference kind=relationship_types).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The relationship's id | |
| type | No | ||
| other | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| confirm | No | ||
| contact | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and non-idempotence, so the safety profile is covered. The description adds genuinely useful behavior the annotations cannot: that removal requires confirmation, and that Monica auto-creates the inverse relationship, which affects how the agent reasons about state after an add.
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?
Front-loaded with the core concept and direction semantics, then bulleted per action. Dense but every sentence carries information; the type enumeration is long but useful reference material.
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 6-parameter, no-output-schema tool this covers the conceptual model, all four actions, and the confirm guard. The only shortfall is not spelling out per-action required/optional field combinations despite the action param description deferring to the tool description for exactly that.
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 only 33% (id and action only), so the description must compensate, and it does: it defines contact, type, and other through a concrete worked example and specifies confirm for remove. It stops short of mapping which parameters are required for each action, which is the one remaining 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 resource ('How contacts are related') and enumerates the four operations (list/add/update/remove), so the agent immediately knows the tool's scope. It also routes to the sibling monica_reference for the type vocabulary, distinguishing itself from the other Monica tools.
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?
Each action is annotated with its purpose, and remove explicitly notes the confirm: true prerequisite. The direction convention ('contact is <type> of other', with Monica recording the reverse) tells the agent how to frame add calls. No explicit when-not or alternative-selection guidance beyond the reference lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_remindersADestructive
Reminders about contacts (call Mum on Sunday, a birthday card every year). Monica emails them when due. • list — upcoming reminders, soonest first: a contact's, or everyone's within the next days. • create — a reminder on a date, once or repeating (daily, weekly, monthly, yearly, every N). • update / delete — by id (delete needs confirm: true). Birthday reminders are created by Monica itself when a birthdate is set.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The reminder's id | |
| date | No | The first (or only) date, YYYY-MM-DD | |
| days | No | ||
| every | No | ||
| title | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| repeat | No | once | |
| confirm | No | ||
| contact | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true already declared, the description still adds real behavioral context: delete requires `confirm: true`, Monica emails reminders when due, and birthday reminders are auto-generated. It does not cover permissions or whether update replaces or merges fields, keeping it out of the top tier.
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 purpose and the email behavior are front-loaded, then actions are laid out as terse bullets with no filler. It is information-dense but readable; a slightly tighter grouping of the create/repeat options would make it cleaner.
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 multi-action mutation tool with no output schema, the description covers action routing, the destructive confirmation, list ordering, and auto-created birthdays. It stops short of describing return shape or update semantics, which an agent might still wonder about.
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 only 30% across 10 parameters, so the description must compensate. It does explain id, date, days (lookahead window), repeat values including 'every N', and confirm, but leaves title, description, contact, and the `every` interval largely unspecified. Partial compensation, hence a middle score.
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 resource (reminders about contacts) and enumerates the four operations the single tool performs, so an agent can see exactly what it does. It is distinct from siblings like monica_contacts or monica_journal, though it never explicitly names those siblings to route between them.
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?
Each action is given a use condition: list for upcoming reminders (soonest first, scoped by contact or the next `days`), create for a dated/repeating reminder, update/delete by id with `confirm: true` for delete. It also tells the agent not to hand-create birthday reminders because Monica does that automatically. No explicit when-not-guidance or named alternatives beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_statusARead-only
Check the connection to Monica: the signed-in user, the instance and how many contacts it holds. Useful when other tools fail.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine value by disclosing what the call returns (identity, instance, contact count), which is the key behavioral fact for a diagnostic tool. No pagination or side-effect caveats are needed here.
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 tight sentences with the purpose and returned fields front-loaded and the usage trigger last. No filler or redundancy.
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 parameters, no output schema, and annotations covering the safety profile, the description supplies the missing piece an agent needs — what a successful status response contains — and when to invoke it. Nothing material is absent for a tool of this complexity.
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 tool takes zero parameters, so the baseline is 4. The description correctly does not invent parameter semantics and instead spends its words on return contents, which is the relevant information.
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 (Check) and resource (connection to Monica), then enumerates exactly what it surfaces: the signed-in user, the instance, and the contact count. This clearly separates it from the data-retrieval siblings (monica_contacts, monica_notes, etc.), which fetch records rather than report connection state.
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?
"Useful when other tools fail" gives a concrete trigger condition for reaching for this diagnostic tool instead of the data tools. It stops short of an explicit when-not statement, but for a zero-param health check the intended usage window is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monica_tasksADestructive
To-dos tied to a contact (return their book, send the photos). • list — open tasks (or done ones with done: true), a contact's or everyone's. • create — a task for a contact. • update — change it, or mark it done / not done. • delete — remove it (confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The task's id | |
| done | No | ||
| limit | No | ||
| title | No | ||
| action | Yes | Which operation to perform. Other fields are required/optional depending on the value chosen — see tool description. | |
| confirm | No | ||
| contact | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds operationally important detail beyond that: delete requires confirm: true, and list distinguishes open vs done tasks via the done flag. It still omits what update does to unspecified fields or any return-shape information.
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?
Front-loads the resource definition, then bullet-lists each action with its key flag. Extremely compact with no redundant sentences.
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 8-parameter multi-action CRUD tool with no output schema, the description conveys the essential action semantics and the critical confirm guard. It leaves two parameters (limit, description) undocumented and does not describe return values, but for a predictable CRUD surface this is largely adequate.
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 only 25% (just id and action documented), and the action enum explicitly defers per-action field requirements to the tool description. The description partially compensates by mapping actions to done/confirm/contact/id/title, but never mentions limit or description, nor states required fields per action.
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 resource ('To-dos tied to a contact') and enumerates the four actions (list/create/update/delete) with a concrete example, so an agent knows exactly what domain this covers. It does not, however, differentiate itself from the close sibling monica_reminders, which is a plausible source of confusion for a task-like tool.
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?
Gives clear per-action context: list for open tasks (or done ones with done: true), a contact's or everyone's; create for a contact; update to change or toggle done; delete with confirm: true. It stops short of saying when to prefer this over sibling tools such as monica_reminders.
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.
35 tool updates
v2.1.1- Added
monica_activities - Removed
monica_browse_metadata - Added
monica_calls - Added
monica_contact_info - Added
monica_contacts - Added
monica_conversations - Added
monica_gifts_debts - Removed
monica_health_check - Added
monica_journal - Removed
monica_list_contacts - Removed
monica_manage_activity - Removed
monica_manage_activity_type - Removed
monica_manage_call - Removed
monica_manage_contact - Removed
monica_manage_contact_address - Removed
monica_manage_contact_field - Removed
monica_manage_contact_field_type - Removed
monica_manage_contact_profile - Removed
monica_manage_contact_tags - Removed
monica_manage_conversation - Removed
monica_manage_financial_record - Removed
monica_manage_group - Removed
monica_manage_media - Removed
monica_manage_note - Removed
monica_manage_relationship - Removed
monica_manage_tag - Removed
monica_manage_task_reminder - Added
monica_media - Added
monica_notes - Added
monica_reference - Added
monica_relationships - Added
monica_reminders - Removed
monica_search_contacts - Added
monica_status - Added
monica_tasks
31 tool updates
v1.0.0- Added
monica_browse_metadata - Removed
monica_create_note - Removed
monica_get_contact_summary - Added
monica_list_contacts - Removed
monica_list_tasks - Removed
monica_lookup_country - Removed
monica_lookup_gender - Changed
monica_manage_activity4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / payload / properties / activityTypeNameAdded value: +{ + "maxLength": 255, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / payload / requiredPrevious value: -[ - "activityTypeId", - "summary", - "happenedAt", - "contactIds" -]New value: +[ + "summary", + "happenedAt", + "contactIds" +]
- Changed
monica_manage_activity_type2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Removed
monica_manage_activity_type_category - Removed
monica_manage_address - Added
monica_manage_call - Changed
monica_manage_contact14 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / action / enumPrevious value: -[ - "create", - "update", - "delete" -]New value: +[ + "create", + "update", + "delete", + "list", + "get" +] - added
Input schema / properties / addressIdAdded value: +{ + "exclusiveMinimum": 0, + "type": "integer" +} - added
Input schema / properties / addressPayloadAdded value: +{ + "additionalProperties": false, + "properties": { + "city": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "maxLength": 255, + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "contactId": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "countryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "maxLength": 3, + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "countryIso": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "maxLength": 3, + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "countryName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "maxLength": 255, + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "postalCode": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "maxLength": 255, + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "province": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "maxLength": 255, + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "street": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "maxLength": 255, + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "contactId", + "name" + ], + "type": "object" +} - added
Input schema / properties / contactFieldIdAdded value: +{ + "exclusiveMinimum": 0, + "type": "integer" +} - added
Input schema / properties / fieldPayloadAdded value: +{ + "additionalProperties": false, + "properties": { + "contactFieldTypeId": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "contactFieldTypeName": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "contactId": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "data": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "contactId", + "data" + ], + "type": "object" +} - added
Input schema / properties / includeContactFieldsAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / pageAdded value: +{ + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / profile / properties / genderNameAdded value: +{ + "maxLength": 50, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / profile / requiredPrevious value: -[ - "firstName", - "genderId" -]New value: +[ + "firstName" +] - added
Input schema / properties / sectionAdded value: +{ + "enum": [ + "summary", + "profile", + "field", + "address" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "action" -]New value: +[ + "section" +]
- Added
monica_manage_contact_address - Changed
monica_manage_contact_field4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / fieldPayloadAdded value: +{ + "additionalProperties": false, + "properties": { + "contactFieldTypeId": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "contactFieldTypeName": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "contactId": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "data": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "contactId", + "data" + ], + "type": "object" +} - removed
Input schema / properties / payloadRemoved value: -{ - "additionalProperties": false, - "properties": { - "contactFieldTypeId": { - "exclusiveMinimum": 0, - "type": "integer" - }, - "contactId": { - "exclusiveMinimum": 0, - "type": "integer" - }, - "data": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "contactId", - "contactFieldTypeId", - "data" - ], - "type": "object" -}
- Changed
monica_manage_contact_field_type2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Added
monica_manage_contact_profile - Added
monica_manage_contact_tags - Added
monica_manage_conversation - Added
monica_manage_financial_record - Changed
monica_manage_group2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Added
monica_manage_media - Changed
monica_manage_note2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
monica_manage_relationship3 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / payload / properties / relationshipTypeNameAdded value: +{ + "maxLength": 255, + "minLength": 1, + "type": "string" +}
- Removed
monica_manage_relationship_type - Removed
monica_manage_relationship_type_group - Removed
monica_manage_reminder - Changed
monica_manage_tag2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Removed
monica_manage_task - Added
monica_manage_task_reminder - Changed
monica_search_contacts2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
22 tool updates
- First observed
monica_create_note - First observed
monica_get_contact_summary - First observed
monica_health_check - First observed
monica_list_tasks - First observed
monica_lookup_country - First observed
monica_lookup_gender - First observed
monica_manage_activity - First observed
monica_manage_activity_type - First observed
monica_manage_activity_type_category - First observed
monica_manage_address - First observed
monica_manage_contact - First observed
monica_manage_contact_field - First observed
monica_manage_contact_field_type - First observed
monica_manage_group - First observed
monica_manage_note - First observed
monica_manage_relationship - First observed
monica_manage_relationship_type - First observed
monica_manage_relationship_type_group - First observed
monica_manage_reminder - First observed
monica_manage_tag - First observed
monica_manage_task - First observed
monica_search_contacts
TDQS
Scored across 14 tools
Each tool maps to a distinct CRM resource (contacts, notes, activities, calls, conversations, reminders, tasks, gifts/debts, journal, media, reference, status). The only apparent overlap—tags/contact field types across monica_contact_info and monica_reference—is clearly bounded: one attaches to a contact, the other manages global reference lists. No two tools appear to do the same thing.
All tool names use snake_case with a consistent monica_ prefix. Although the pattern is resource-noun rather than verb_noun, the convention is uniform and predictable across the set; minor singular/plural variation is not confusing.
14 tools is well-scoped for a personal CRM; each resource area earns its own tool without obvious redundancy. It sits comfortably within the ideal 3–15 range.
Core CRM lifecycle is broadly covered: contacts, notes, activities, calls, conversations, reminders, tasks, gifts/debts, journal, relationships, and media all support list/get/create/update/delete where appropriate. Minor gaps exist (e.g., no get for calls/reminders/tasks, no update for conversations/media), but they are not dead ends for typical agent workflows.
Maintenance
Related MCP Connectors
- PlixanaOAuthcom.plixana
Operate the Plixana CRM from any AI: contacts, deals, quotes, WhatsApp and metrics.
Personal CRM operated by AI agents. Read relationship context before acting, write back after.
Connect AI to your Attio CRM. Manage contacts, companies, deals, and sales pipelines. Create tasks…
Carbon Voice MCP serves as a bridge that connects AI assistants like ChatGPT, Claude, and Cursor to a user's Carbon Voice account, turning voice messages and conversations into a private, on-demand knowledge base. It provides 28 specialized tools for comprehensive voice messaging management, including creating and sending messages, accessing conversation history with instant transcription, running AI actions (summarization, TLDR generation, meeting notes), and managing workspace collaboration through folders, contacts, and team communications.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to manage Folk CRM data, including contacts, companies, notes, and reminders. It supports searching for entities, logging interactions, and setting follow-up tasks through the Folk REST API.6MIT
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents to interact with Bitrix24 CRM for managing contacts, deals, tasks, and leads via a comprehensive set of tools. It supports advanced features like sales team monitoring, performance analytics, and automated CRM searching.-
- AlicenseBqualityDmaintenanceEnables AI assistants to manage ActiveCampaign CRM, marketing automation, and contact data via 33 tools including contacts, deals, tags, automations, pipelines, custom fields, campaigns, accounts, and webhooks.6534 PyPI1MIT
- FlicenseCqualityCmaintenanceEnables Claude to interact with GoHighLevel CRM for contact management, messaging, calendar, and sales opportunities via 14 tools.20-