Skip to main content
Glama

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.

ci

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

monica_contacts

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.

monica_contact_info

Contact fields (email, phone, social profiles), postal addresses and tags.

monica_relationships

How contacts are related: partner, parent, friend, colleague…

monica_notes

Things to remember about someone.

monica_activities

Things done together, with one or more contacts.

monica_calls

Phone calls.

monica_conversations

Message threads, by channel.

monica_reminders

One-off and repeating reminders, listed by when they next come round.

monica_tasks

To-dos tied to a contact.

monica_gifts_debts

Gift ideas, gifts given and received, and money owed either way.

monica_journal

Journal entries.

monica_reference

Genders, countries, currencies, activity types, relationship types, contact field types and tags; adds custom ones.

monica_media

Documents and photos attached to contacts.

monica_status

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-mcp

compose.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

MONICA_BASE_URL

https://app.monicahq.com

The Monica instance

MONICA_API_TOKEN

required

Its API token

MONICA_API_TOKEN_FILE

Instead: a file holding the token, read again when it changes

MONICA_TOKEN_TYPE

bearer

apiKey sends X-Api-Key; legacy sends X-Auth-Token with MONICA_USER_TOKEN

MCP_TRANSPORT

stdio

http to serve at /mcp

PORT

8080

HTTP only

MCP_BEARER_TOKEN

HTTP: the token clients send

MCP_OAUTH_ISSUER, MCP_OAUTH_CANONICAL_URL, MCP_OAUTH_AUDIENCE, MCP_OAUTH_JWKS_URI

HTTP: optional OAuth 2.1

MONICA_TIMEOUT_MS

15000

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

monica_search_contacts, monica_list_contacts

monica_contacts (search, list)

monica_manage_contact, monica_manage_contact_profile

monica_contacts (get, create, update, delete)

monica_manage_contact_field, monica_manage_contact_address, monica_manage_contact_tags

monica_contact_info (kind: field, address, tag)

monica_manage_relationship

monica_relationships

monica_manage_note, monica_manage_activity, monica_manage_call, monica_manage_conversation

monica_notes, monica_activities, monica_calls, monica_conversations

monica_manage_task_reminder

monica_reminders, monica_tasks

monica_manage_financial_record

monica_gifts_debts

monica_manage_media

monica_media

monica_browse_metadata, monica_manage_activity_type, monica_manage_contact_field_type, monica_manage_tag

monica_reference

monica_health_check

monica_status

monica_manage_group

removed: Monica 4's API has no groups endpoint

resources monica-contact://, monica-contact-notes://

removed: monica_contacts get returns both

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 Monica

The 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 tools

License

MIT

Available Tools

14 tools
monica_activitiesA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe activity's id
dateNoYYYY-MM-DD
typeNo
limitNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
confirmNo
contactNo
summaryNo
contactsNoWho it was with
descriptionNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_callsA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe call's id
dateNoYYYY-MM-DD
limitNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
confirmNo
contactNo
contentNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_infoA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe field or address's id
cityNo
kindYes
nameNo
tagsNo
typeNo
valueNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
streetNo
confirmNo
contactNo
countryNo
provinceNo
postal_codeNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_contactsA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobNo
pageNo
sortNoname
limitNo
queryNoName, nickname, email or other text
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
genderNo
companyNo
confirmNo
contactNo
includeNo
deceasedNo
nicknameNo
birthdateNo
first_metNo
last_nameNo
first_nameNo
descriptionNo
how_you_metNo
met_throughNo
deceased_dateNo
first_met_reminderNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_conversationsA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe conversation's id
dateNoYYYY-MM-DD
fromNo
textNo
limitNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
channelNoe.g. Email, Phone, Whatsapp, Telegram
confirmNo
contactNo
messagesNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_debtsA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe gift or debt's id
urlNo
dateNoYYYY-MM-DD
kindYes
nameNo
limitNo
valueNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
amountNo
reasonNo
statusNo
commentNo
confirmNo
contactNo
settledNo
directionNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_journalA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe journal entry's id
dateNoYYYY-MM-DD
postNo
limitNo
titleNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
confirmNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_mediaA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe document or photo's id
kindYes
pathNo
limitNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
base64No
confirmNo
contactNo
filenameNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_notesA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe note's id
bodyNo
limitNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
confirmNo
contactNo
favoriteNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_referenceA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe item's id
kindYes
nameNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
filterNo
confirmNo
categoryNo
protocolNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_relationshipsA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe relationship's id
typeNo
otherNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
confirmNo
contactNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_remindersA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe reminder's id
dateNoThe first (or only) date, YYYY-MM-DD
daysNo
everyNo
titleNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
repeatNoonce
confirmNo
contactNo
descriptionNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_statusA
Read-only

Check the connection to Monica: the signed-in user, the instance and how many contacts it holds. Useful when other tools fail.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_tasksA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe task's id
doneNo
limitNo
titleNo
actionYesWhich operation to perform. Other fields are required/optional depending on the value chosen — see tool description.
confirmNo
contactNo
descriptionNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 35 tool updatesv2.1.1
    • Addedmonica_activities
    • Removedmonica_browse_metadata
    • Addedmonica_calls
    • Addedmonica_contact_info
    • Addedmonica_contacts
    • Addedmonica_conversations
    • Addedmonica_gifts_debts
    • Removedmonica_health_check
    • Addedmonica_journal
    • Removedmonica_list_contacts
    • Removedmonica_manage_activity
    • Removedmonica_manage_activity_type
    • Removedmonica_manage_call
    • Removedmonica_manage_contact
    • Removedmonica_manage_contact_address
    • Removedmonica_manage_contact_field
    • Removedmonica_manage_contact_field_type
    • Removedmonica_manage_contact_profile
    • Removedmonica_manage_contact_tags
    • Removedmonica_manage_conversation
    • Removedmonica_manage_financial_record
    • Removedmonica_manage_group
    • Removedmonica_manage_media
    • Removedmonica_manage_note
    • Removedmonica_manage_relationship
    • Removedmonica_manage_tag
    • Removedmonica_manage_task_reminder
    • Addedmonica_media
    • Addedmonica_notes
    • Addedmonica_reference
    • Addedmonica_relationships
    • Addedmonica_reminders
    • Removedmonica_search_contacts
    • Addedmonica_status
    • Addedmonica_tasks
  2. 31 tool updatesv1.0.0
    • Addedmonica_browse_metadata
    • Removedmonica_create_note
    • Removedmonica_get_contact_summary
    • Addedmonica_list_contacts
    • Removedmonica_list_tasks
    • Removedmonica_lookup_country
    • Removedmonica_lookup_gender
    • Changedmonica_manage_activity4 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / payload / properties / activityTypeName
        Added value: +{
        +  "maxLength": 255,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / payload / required
        Previous value: -[
        -  "activityTypeId",
        -  "summary",
        -  "happenedAt",
        -  "contactIds"
        -]New value: +[
        +  "summary",
        +  "happenedAt",
        +  "contactIds"
        +]
    • Changedmonica_manage_activity_type2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Removedmonica_manage_activity_type_category
    • Removedmonica_manage_address
    • Addedmonica_manage_call
    • Changedmonica_manage_contact14 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create",
        -  "update",
        -  "delete"
        -]New value: +[
        +  "create",
        +  "update",
        +  "delete",
        +  "list",
        +  "get"
        +]
      • addedInput schema / properties / addressId
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / addressPayload
        Added 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"
        +}
      • addedInput schema / properties / contactFieldId
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / fieldPayload
        Added 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"
        +}
      • addedInput schema / properties / includeContactFields
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / page
        Added value: +{
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / profile / properties / genderName
        Added value: +{
        +  "maxLength": 50,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / profile / required
        Previous value: -[
        -  "firstName",
        -  "genderId"
        -]New value: +[
        +  "firstName"
        +]
      • addedInput schema / properties / section
        Added value: +{
        +  "enum": [
        +    "summary",
        +    "profile",
        +    "field",
        +    "address"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "section"
        +]
    • Addedmonica_manage_contact_address
    • Changedmonica_manage_contact_field4 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / fieldPayload
        Added 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"
        +}
      • removedInput schema / properties / payload
        Removed 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"
        -}
    • Changedmonica_manage_contact_field_type2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedmonica_manage_contact_profile
    • Addedmonica_manage_contact_tags
    • Addedmonica_manage_conversation
    • Addedmonica_manage_financial_record
    • Changedmonica_manage_group2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedmonica_manage_media
    • Changedmonica_manage_note2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmonica_manage_relationship3 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / payload / properties / relationshipTypeName
        Added value: +{
        +  "maxLength": 255,
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Removedmonica_manage_relationship_type
    • Removedmonica_manage_relationship_type_group
    • Removedmonica_manage_reminder
    • Changedmonica_manage_tag2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Removedmonica_manage_task
    • Addedmonica_manage_task_reminder
    • Changedmonica_search_contacts2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
  3. 22 tool updates
    • First observedmonica_create_note
    • First observedmonica_get_contact_summary
    • First observedmonica_health_check
    • First observedmonica_list_tasks
    • First observedmonica_lookup_country
    • First observedmonica_lookup_gender
    • First observedmonica_manage_activity
    • First observedmonica_manage_activity_type
    • First observedmonica_manage_activity_type_category
    • First observedmonica_manage_address
    • First observedmonica_manage_contact
    • First observedmonica_manage_contact_field
    • First observedmonica_manage_contact_field_type
    • First observedmonica_manage_group
    • First observedmonica_manage_note
    • First observedmonica_manage_relationship
    • First observedmonica_manage_relationship_type
    • First observedmonica_manage_relationship_type_group
    • First observedmonica_manage_reminder
    • First observedmonica_manage_tag
    • First observedmonica_manage_task
    • First observedmonica_search_contacts

TDQS

A4.1/5.0

Scored across 14 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers