Skip to main content
Glama
ppiotis

Solo CRM MCP

Official
by ppiotis

Solo CRM MCP

CI License: MIT

A minimal CRM your agent can run for you, safely. Contacts, deals with stages, follow-ups, an activity log, a pipeline summary with weighted forecast, and outreach drafts. Built for solopreneurs and freelancers who don't want a SaaS CRM. Everything lives in one JSON file on your machine, and every change is previewed and requires your confirmation.

Why

Agents are great at "log that call and remind me Friday", but a CRM that writes silently is a liability. Solo CRM makes every write a two-step preview → confirm with a cryptographic token bound to the exact change, so the agent must show you what it will do before it does it. It can draft outreach, but it cannot send anything: it has no network access.

Related MCP server: agent-crm

Tools

Read-only (readOnlyHint: true)

Tool

Purpose

list_contacts

Search by text or tag; includes open-deal count

get_contact

Contact + deals + open follow-ups + recent activity

list_deals

Filter by stage, contact, open only

list_follow_ups

Sorted by due date, flagged overdue / due_today / upcoming

pipeline_summary

Per-stage counts and value, weighted forecast, win rate, stale deals, overdue follow-ups

draft_outreach

Email/DM draft from CRM context (intro, follow_up, proposal_nudge, check_in, thank_you, reengage). Never sends.

Writes: two-step, readOnlyHint: false

Tool

destructiveHint

Purpose

upsert_contact

true (updates overwrite fields)

Create or update; preview shows a from → to diff; blocks duplicate emails

delete_contact

true

Deletes contact and cascades to their deals, follow-ups and activities (counts shown in preview)

upsert_deal

true

Create or update (stage changes are recorded in stage_history)

delete_deal

true

Deletes a deal

add_follow_up

false

Schedule a reminder

complete_follow_up

false

Mark done

log_activity

false

Log call / email / meeting / DM / note

Stages: lead → qualified → proposal → negotiation → won / lost (forecast weights 10/25/50/75/100/0%).

The confirmation protocol

  1. Call a write tool without confirm_token → {"status":"preview","summary":…,"changes":…,"confirm_token":…}. Nothing is written.

  2. The agent shows you the preview.

  3. The agent calls again with identical arguments + confirm_token → {"status":"applied",…}.

Tokens are HMAC-SHA256 signed with a per-process random key and bound to the tool name, the exact arguments and the current store revision. They expire after 10 minutes and are single-use, and any other change to the CRM invalidates them. A token from one preview cannot apply a different change.

Install

Requires Node.js 20+. Add the plugin, or put this in .mcp.json:

{
  "mcpServers": {
    "solo-crm": {
      "command": "npx",
      "args": ["-y", "https://github.com/ppiotis/solo-crm-mcp/archive/refs/tags/v1.0.0.tar.gz"],
      "env": { "SOLO_CRM_PATH": "/absolute/path/to/crm.json" }
    }
  }
}

Default data file: ~/.solo-crm/crm.json (created on first confirmed write, mode 0600, folder 0700).

From source: git clone https://github.com/ppiotis/solo-crm-mcp && cd solo-crm-mcp && npm ci && npm run build && node dist/stdio.js

Remote (Streamable HTTP)

node dist/serve-http.js serves stateless Streamable HTTP at /mcp (and GET /health). Because the CRM is a local file, run it on a machine you control, e.g. a home server or private VPS, with a token:

SOLO_CRM_PATH=/data/crm.json MCP_AUTH_TOKEN=change-me HOST=0.0.0.0 PORT=3000 node dist/serve-http.js
docker build -t solo-crm-mcp . && docker run -p 3000:3000 -v "$HOME/.solo-crm:/data" -e SOLO_CRM_PATH=/data/crm.json -e MCP_AUTH_TOKEN=change-me solo-crm-mcp

Client: {"url":"https://your-host/mcp","headers":{"Authorization":"Bearer change-me"}}. Put TLS in front (Caddy / Cloudflare Tunnel). Do not expose it publicly without MCP_AUTH_TOKEN.

Env var

Default

Purpose

SOLO_CRM_PATH

~/.solo-crm/crm.json

Data file (must end in .json)

MCP_AUTH_TOKEN

unset

HTTP only: require a bearer token

HOST / PORT

127.0.0.1 / 3000

HTTP bind

Security & privacy

  • No network, no telemetry. The server never makes outbound requests. Runtime deps: the MCP SDK and zod.

  • Human-in-the-loop writes. Preview → confirm with bound, expiring, single-use tokens (unit-tested: wrong args, reuse, stale revision, malformed, expired).

  • Accurate MCP annotations on every tool (readOnlyHint, destructiveHint, idempotentHint, openWorldHint: false).

  • Can't send messages. draft_outreach returns text with "sent": false.

  • Data safety. Atomic writes (temp file + rename), serialised in-process; private file permissions; a corrupt file is reported and never overwritten.

  • Validated input. zod schemas for every field (emails, ISO dates, ISO currency codes, id formats, length caps).

  • No secrets in code or config. The optional HTTP bearer token is compared in constant time.

Reviewer test plan

Setup: add the plugin with SOLO_CRM_PATH set to a scratch file, e.g. /tmp/solo-crm-review.json.

  1. Preview gate. Ask: "Add Sam Rivera (sam@rivera.studio) from Rivera Studio, and a $800 logo deal at proposal stage." → Expect a preview of both changes and a question asking you to confirm, with no file created yet. Say "yes" → both applied; the file now exists.

  2. Follow-ups. Ask: "Remind me to nudge Sam on 2026-01-05, then what's overdue?" → Expect preview → confirm, then list_follow_ups showing the item as overdue.

  3. Pipeline. Ask: "How's my pipeline?" → Expect pipeline_summary: 1 open deal, $800 open value, $400 weighted forecast, the proposal stage listed.

  4. Draft, never send. Ask: "Draft a proposal nudge to Sam." → Expect a subject draft that names the deal (subject "Re: proposal for "), and an explicit note that nothing was sent.

  5. Destructive guard. Ask: "Delete Sam." → Expect a preview stating it will PERMANENTLY delete the contact plus 1 deal and 1 follow-up. Say "no" → the file is unchanged.

Development

npm ci
npm test               # build + unit tests + e2e over stdio and Streamable HTTP
npm audit --omit=dev

License

MIT © Paris Piotis

Available Tools

13 tools
add_follow_upAdd follow-upA

Schedule a follow-up reminder for a contact (optionally tied to a deal). TWO-STEP: the first call (no confirm_token) only returns a preview and a confirm_token; nothing is written. Show the preview to the user, and only after they approve call again with the same arguments plus confirm_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueYes
noteYes
deal_idNo
contact_idYes
confirm_tokenNoOmit on the first call to get a preview. Pass the token from the preview (with identical arguments) to apply the change.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: the first invocation is a no-write preview, the write only occurs on the confirmed second call, and the token is bound to identical arguments. This is consistent with readOnlyHint=false and destructiveHint=false, and discloses the two-phase write semantics an agent could not infer otherwise.

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 sentences, front-loaded with the purpose and then the critical two-step protocol. No filler; every clause is actionable.

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 output schema, the description still explains what the first call returns (a preview and confirm_token) and what is required to commit the write. Nothing essential to correct invocation is missing.

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 20%, so the description must carry the load. It explains deal_id's optional linkage and the confirm_token flow, but adds nothing about due's date format or note's length/format constraints, which remain schema-only.

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 and resource ('Schedule a follow-up reminder for a contact') plus the optional deal association. It is clearly distinguishable from siblings like complete_follow_up, list_follow_ups, and draft_outreach.

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 operational guidance: the first call must omit confirm_token, the user must approve the preview, and the second call must repeat identical arguments plus the token. It does not name alternative tools for related cases (e.g., when to complete vs. add), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

complete_follow_upComplete follow-upA
Idempotent

Mark a follow-up as done. TWO-STEP: the first call (no confirm_token) only returns a preview and a confirm_token; nothing is written. Show the preview to the user, and only after they approve call again with the same arguments plus confirm_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
follow_up_idYes
confirm_tokenNoOmit on the first call to get a preview. Pass the token from the preview (with identical arguments) to apply the change.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description discloses the critical two-step behavior: the first call writes nothing and only returns a preview plus token. This is exactly the kind of non-obvious side-effect behavior an agent must know, and it is stated explicitly.

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 sentences, zero filler, and the confirm-token protocol is front-loaded with the key constraint ('nothing is written') emphasized. Every clause carries actionable information.

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 output schema, the description still describes what the first call returns (a preview and a confirm_token) and what the second call does, which is the essential return/confirm information for this workflow. Nothing needed to invoke it correctly 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?

confirm_token already carries a schema description, and the tool description reinforces its role ('no confirm_token' yields a preview; pass the token with identical arguments to apply). follow_up_id is left to its pattern/name, but its meaning is self-evident for this resource.

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 opening sentence states a specific verb and resource ('Mark a follow-up as done'), which cleanly separates it from siblings like add_follow_up, list_follow_ups, and log_activity. An agent knows exactly what state change this tool produces.

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 explicit when-to-use guidance and a precise call sequence: first call without confirm_token to preview, then call again with identical arguments plus the token after user approval. It does not name alternative tools for adjacent tasks, but the operational protocol is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_contactDelete contactA
DestructiveIdempotent

Permanently delete a contact AND their deals, follow-ups and activities. TWO-STEP: the first call (no confirm_token) only returns a preview and a confirm_token; nothing is written. Show the preview to the user, and only after they approve call again with the same arguments plus confirm_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYes
confirm_tokenNoOmit on the first call to get a preview. Pass the token from the preview (with identical arguments) to apply the change.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=true, but the description adds the crucial detail that the first call is non-writing (a dry-run preview) and that deletion cascades to related deals, follow-ups and activities. That cascade and the two-phase safety mechanism are not derivable from the annotations or schema.

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?

Three tight sentences, front-loaded with the destructive cascade, then the two-step mechanics. No filler, no repetition of the title, and the riskiest fact comes first.

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?

For a destructive mutation with no output schema, the description covers the safety model, the write semantics, the cascade blast radius, and the return behavior of the preview call. An agent has everything needed to call it correctly and safely.

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 50% (contact_id is undocumented in the schema), but the description compensates by explaining the confirm_token lifecycle: omitted on the first call, passed from the preview with identical arguments on the second. The pattern/format of contact_id itself remains 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?

States a specific verb ('Permanently delete') and resource ('a contact'), and immediately clarifies the cascade scope ('AND their deals, follow-ups and activities'). This distinguishes it cleanly from delete_deal and the other siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit two-step protocol: first call without confirm_token returns only a preview, the agent must show it to the user, and only after approval re-call with identical arguments plus the token. The when-to-call-each-form condition is spelled out with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_dealDelete dealA
DestructiveIdempotent

Permanently delete a deal (follow-ups linked to it are unlinked, not deleted). TWO-STEP: the first call (no confirm_token) only returns a preview and a confirm_token; nothing is written. Show the preview to the user, and only after they approve call again with the same arguments plus confirm_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
deal_idYes
confirm_tokenNoOmit on the first call to get a preview. Pass the token from the preview (with identical arguments) to apply the change.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds materially new behavior: the delete is permanent, linked follow-ups are unlinked rather than removed, and the first invocation is a no-write preview. That confirmation-gate detail is not derivable from any annotation or schema field.

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 compact sentences, no filler. The permanence and cascade facts are front-loaded, and the two-step workflow follows immediately, so an agent reads the risky semantics before the mechanics.

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?

For a destructive mutation with no output schema, the description supplies the missing return-value context (preview plus confirm_token) and the full apply protocol. Nothing required to invoke it correctly is absent.

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 50%: confirm_token is well described in the schema itself, while deal_id carries only a regex pattern. The description reinforces confirm_token usage but adds little about deal_id beyond its name, so it neither compensates for the gap nor goes beyond 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 specific verb and resource ('Permanently delete a deal') and immediately scopes the blast radius ('follow-ups linked to it are unlinked, not deleted'). That cascade note is exactly what distinguishes it from siblings like upsert_deal or delete_contact, which an agent can differentiate 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit two-call protocol: first call with no confirm_token returns only a preview, then a second call with identical arguments plus the token applies the change, gated on user approval. There is no inference required about when to call which way.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

draft_outreachDraft outreach (never sends)A
Read-onlyIdempotent

Draft an email/DM for a contact using their CRM context (deal, last activity). Returns text only; this server has no ability to send messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
toneNo
channelNo
purposeYes
contact_idYes
key_pointsNo
sender_nameNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is covered. The description adds real value beyond that by stating output is text only and that the server has no send capability, preventing an agent from treating this as an outbound-action tool. It does not mention rate limits or whether drafting leaves any trace in the CRM.

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 sentences, front-loaded with the action and scoped immediately after by the no-send caveat. Every clause carries information; nothing is restated from the title beyond useful confirmation.

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 six-parameter tool with 0% schema description coverage and no output schema, the description covers the behavioral side adequately (text-only return, no sending) but is silent on the parameter set an agent must fill in. It is minimum-viable: enough to know what the tool is, not enough to call it confidently without guessing at tone/purpose/channel semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across six parameters, so the description must carry the semantic load and does not. It alludes to contact and channel ('email/DM') but says nothing about tone, purpose, key_points, or sender_name, leaving enum choices and constraints unexplained. With three enum parameters and no per-field guidance, an agent gets almost no help beyond the schema's literal names.

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 pairs a specific verb (draft) with a specific resource (email/DM for a contact) and names the data it consumes (CRM deal, last activity). No sibling tool drafts messages, so an agent can separate this from log_activity, add_follow_up, or get_contact without opening a 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?

It establishes clear usage context: use it when you need composed text for a contact, drawing on deal and last-activity context. There is no explicit 'when not to use' or named alternative, but the emphasis that this server cannot send bounds the tool's role well enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contactGet contact with historyA
Read-onlyIdempotent

Full contact record with their deals, open follow-ups and the 20 most recent activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safe read-only, idempotent, closed-world profile, so the description's job is to add context beyond that. It does add real value by disclosing the response composition and an explicit truncation limit of 20 activities, which the annotations cannot convey; it stops short of saying whether that cap is silent or how a missing contact behaves.

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 with no filler. The scope and the activity cap are stated up front, and every clause carries 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?

With no output schema, the description must carry the return-value burden, and it reasonably does by naming the included collections and the activity cap. It is slightly incomplete on edge cases such as nonexistent contacts and whether the deals or follow-up lists are themselves bounded.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description is expected to compensate for the undocumented parameter, and it does not: contact_id is never mentioned, nor is its c_<hex> format or that it is required. The schema's pattern constraint is the only signal about the parameter's shape.

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 the specific resource (a full contact record) and enumerates the associated payload: deals, open follow-ups, and the 20 most recent activities. It implicitly separates itself from list_contacts by being a single, full-detail fetch, but it never names that sibling or any alternative explicitly.

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?

Usage is only implied: an agent can infer this is the detailed single-contact lookup to use when it already has an ID and needs the full picture, versus list_contacts for browsing. There is no explicit when-to-use, when-not-to-use, or named alternative, so the routing burden falls on inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_contactsList / search contactsA
Read-onlyIdempotent

List contacts, optionally filtered by a search string (name, email, company, notes) or tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo
limitNo
queryNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context that the query spans name, email, company and notes, but says nothing about pagination, default limit, or result ordering.

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 with the resource first and the filterable fields parenthetically grouped. Zero filler; every clause adds information.

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 read-only list tool with annotations covering safety and no output schema, the description is serviceable but thin: it omits pagination behavior, the significance of the limit cap, default ordering, and whether results are truncated. An agent could call it correctly but not predict result shape.

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 0%, so the description carries the burden, and it does explain the semantics of 'query' (fields searched) and implies 'tag' filtering. However 'limit' is completely unexplained and the tag matching rule (exact vs partial, max 40 chars) is left to the schema's constraints alone.

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 verb and resource ('List contacts') plus the filtering dimensions, which clearly separates it from get_contact (single record) and the upsert/delete siblings. It stops short of explicitly naming a sibling or contrasting scopes, so it is clear but not maximally differentiated.

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 word 'optionally' implies the tool works with or without filters, which is implicit usage guidance. There is no statement of when to prefer this over get_contact, no mention that an empty result is normal, and no guidance on combining query with tag.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_dealsList dealsB
Read-onlyIdempotent

List deals, optionally by stage or contact. Includes the contact name.

ParametersJSON Schema
NameRequiredDescriptionDefault
stageNo
open_onlyNo
contact_idNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the useful disclosure that the contact name is included in results, but says nothing about pagination, ordering, or result volume.

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?

Two short sentences with the action and filters front-loaded; there is no filler. The only weakness is that the same brevity leaves the open_only parameter undocumented.

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 simple read-only list tool with annotations covering safety and no output schema, a brief description is largely sufficient. However, the undocumented open_only parameter and the absence of any pagination or result-shape guidance leave gaps an agent would need to guess at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load. It explains stage and contact filtering, but never mentions open_only, and gives no format or semantics for contact_id (the schema supplies only a regex pattern). One of three parameters is entirely undocumented in prose.

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 verb and resource ('List deals') and names the optional filters, which separates it from siblings like upsert_deal or pipeline_summary. It does not explicitly name an alternative tool, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It hints at filtering ('optionally by stage or contact') but never states when to call this versus pipeline_summary (which presumably aggregates) or search-style siblings. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_follow_upsList follow-upsA
Read-onlyIdempotent

Open follow-ups sorted by due date, flagged overdue / due today. Use due_within_days to limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNoTreat this date as today (default: today)
include_doneNo
due_within_daysNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description still adds real behavior: default filtering to open items, sort order by due date, and overdue/due-today flagging. It omits return shape and pagination, but the added flags and ordering justify a 4 over the annotation baseline.

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 no waste; the scope and ordering are front-loaded before the parameter hint. Nothing could be cut without losing information.

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 3-parameter read tool with no output schema, the description covers default scope and ordering but leaves include_done and as_of behavior unexplained, and says nothing about the shape of results an agent will receive. Adequate 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 33%: only as_of carries a schema description. The description explains due_within_days' limiting role, which compensates for part of the gap, but include_done semantics and any detail on due_within_days units/edge values are left entirely to inference.

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 verb (list) and resource (follow-ups) plus the scope: open items only, sorted by due date. The resource name and 'open' qualifier effectively separate it from add_follow_up and complete_follow_up, though no sibling is named explicitly.

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?

'Use due_within_days to limit' gives one usage hint, and 'Open follow-ups' implies done items are excluded unless include_done is set. There is no explicit statement of when to prefer this over the sibling list tools or when to set include_done, so guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_activityLog activityA

Record a call, email, meeting, DM or note against a contact (and optionally a deal). TWO-STEP: the first call (no confirm_token) only returns a preview and a confirm_token; nothing is written. Show the preview to the user, and only after they approve call again with the same arguments plus confirm_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoISO timestamp (default now)
typeYes
deal_idNo
summaryYes
contact_idYes
confirm_tokenNoOmit on the first call to get a preview. Pass the token from the preview (with identical arguments) to apply the change.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only state that this is a non-read-only, non-idempotent, non-destructive write. The description adds the critical behavioral fact that the first call writes nothing and returns only a preview plus token, which is not derivable from structured fields. It stops short of covering stale/expired tokens or what the preview contains.

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 zero filler; the write-confirmation constraint is front-loaded immediately after the purpose statement, which is exactly the ordering an agent needs.

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 mutation tool with no output schema, the description covers the highest-risk unknown (preview-only first call, nothing persisted). It omits token expiry/error behavior and preview contents, which are minor for correct invocation but would complete the picture.

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 33%, but the description confirms the key semantics: contact_id is required, deal_id is optional, and the activity type set. The 'at' timestamp and the identifier patterns are left to the schema, so value is added but the coverage gap is only partly compensated. Baseline 3 is appropriate.

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 and resource with scope: record a call, email, meeting, DM or note against a contact, optionally a deal. This cleanly distinguishes it from the read tools (list_contacts, get_contact) and the upsert/delete siblings.

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 when-to-use guidance for the two invocation modes: first call without confirm_token to preview, second call with the token after user approval. It does not name any alternative tool (e.g. when to prefer draft_outreach), but the sequencing guidance is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pipeline_summaryPipeline summaryB
Read-onlyIdempotent

Deals and value per stage, weighted forecast, win rate, overdue follow-ups and stale open deals (no activity in N days).

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNo
stale_after_daysNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds useful context about what is computed, including the stale-deal rule tied to inactivity, but says nothing about cost, freshness, or scope limits of the aggregation.

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 dense sentence that front-loads the primary metrics and appends the stale-deal qualifier. It wastes no words, though it reads as a fragment without a clear verb.

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, the description does the job of naming the returned metrics, which is helpful. However, it leaves as_of undefined and gives no sense of how the metrics are scoped (all deals? filtered by owner?), leaving gaps for a zero-required-parameter aggregation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%: neither parameter is documented in the schema. The description's phrase 'no activity in N days' gives real meaning to stale_after_days, but the as_of parameter — a date the agent must format as YYYY-MM-DD — is entirely unexplained, so compensation is only partial.

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 the resource (deals/pipeline) and enumerates the specific outputs — stage breakdown, weighted forecast, win rate, overdue follow-ups, stale deals — which clearly distinguishes it from sibling list tools like list_deals. The verb is implicit ('summary'), but the aggregate nature is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this summary versus list_deals or list_follow_ups, nor any mention of prerequisites. The reporting intent is inferable from the enumerated metrics, but the agent is left to guess the trigger conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upsert_contactCreate or update contactA
Destructive

Create a contact, or update one when contact_id is given (only provided fields change). TWO-STEP: the first call (no confirm_token) only returns a preview and a confirm_token; nothing is written. Show the preview to the user, and only after they approve call again with the same arguments plus confirm_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
tagsNo
emailNo
notesNo
phoneNo
companyNo
contact_idNo
confirm_tokenNoOmit on the first call to get a preview. Pass the token from the preview (with identical arguments) to apply the change.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true but say nothing about the mechanism; the description supplies exactly the missing context: the first call writes nothing and returns a preview plus confirm_token, and nothing is persisted until the token is replayed with identical arguments. That is disclosure well beyond the annotation layer.

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?

Three compact sentences, front-loaded with purpose followed by the two-step constraint. No filler, and the highest-risk information (nothing is written on the first call) is stated plainly rather than buried.

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 output schema, the description compensates by describing what the first call returns (a preview and a confirm_token). Together with the partial-update semantics and the confirmation gate, an agent has everything needed to call this mutation tool correctly.

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 13%, so the description must carry the load. It does add key semantics for contact_id (selects update mode) and confirm_token (two-step gating) plus the important partial-update rule that 'only provided fields change', but the six field parameters (name, email, tags, notes, phone, company) 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?

The description states the specific verb and resource (create/update a contact) and, critically, the rule that selects the mode: update happens 'when contact_id is given'. An agent can distinguish this from delete_contact, get_contact, and upsert_deal 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit operational condition (contact_id present → update; absent → create) and a mandatory workflow (preview first, apply only after user approval). It does not name sibling alternatives or exclusions, so it falls short of a full when/when-not/alternative statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upsert_dealCreate or update dealA
Destructive

Create a deal for a contact, or update an existing deal (e.g. move stage, change value) when deal_id is given. TWO-STEP: the first call (no confirm_token) only returns a preview and a confirm_token; nothing is written. Show the preview to the user, and only after they approve call again with the same arguments plus confirm_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
stageNo
titleNo
valueNo
deal_idNo
currencyNo
contact_idNo
confirm_tokenNoOmit on the first call to get a preview. Pass the token from the preview (with identical arguments) to apply the change.
expected_closeNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations flag destructiveHint=true and idempotentHint=false, and the description adds genuinely new behavior: the first call writes nothing and returns a preview plus confirm_token. That materially changes how an agent should behave. It does not clarify whether updating with omitted fields clears existing values or what the applied result looks like, which is the main remaining behavioral gap for a destructive mutation.

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-loaded with the core action, then the critical TWO-STEP constraint, with zero filler sentences. Every clause either identifies create-vs-update or prevents an agent from accidentally writing on the first call.

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?

With no output schema, the description correctly explains what the first call returns (preview + confirm_token), which is the essential return behavior. It is nearly sufficient for a mid-complexity mutation tool, though it omits error/failure behavior and the effect of partial updates.

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 13%, so the description has to carry the load and it partly does: it explains deal_id's role and reinforces the confirm_token semantics. The other six parameters (stage, title, value, currency, contact_id, expected_close) are left to their patterns/enum in the schema, with no added meaning, so it only partially compensates for the coverage 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 both verbs and the resource precisely ('create a deal', 'update an existing deal') and gives concrete update examples (move stage, change value). The conditional 'when deal_id is given' makes the upsert branch unambiguous and clearly separates it from siblings like delete_deal, list_deals, and upsert_contact.

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?

Explicitly states the create-vs-update selection rule (deal_id present) and gives a strong procedural instruction for the two-step confirm flow, including telling the caller to show the preview to the user before re-calling. It lacks any 'do not use this when…' exclusions relative to siblings, so it falls just short of a 5.

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. 13 tool updatesv1.0.0
    • First observedadd_follow_up
    • First observedcomplete_follow_up
    • First observeddelete_contact
    • First observeddelete_deal
    • First observeddraft_outreach
    • First observedget_contact
    • First observedlist_contacts
    • First observedlist_deals
    • First observedlist_follow_ups
    • First observedlog_activity
    • First observedpipeline_summary
    • First observedupsert_contact
    • First observedupsert_deal

TDQS

A4/5.0

Scored across 13 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: contacts (list/get/upsert/delete), deals (list/upsert/delete), follow-ups (list/add/complete), activities (log), analytics (pipeline_summary), and outreach drafting. No two tools overlap in function, and the two-step confirmation applies uniformly to all mutating tools, so there is no ambiguity about which tool to use for a given operation.

Naming Consistency5/5

All tool names follow a consistent verb_noun or noun_verb pattern (list_contacts, get_contact, upsert_deal, add_follow_up, complete_follow_up, pipeline_summary). Verbs are standard CRM terms and suffixes are predictable, making the naming pattern easy to learn.

Tool Count5/5

13 tools is well-scoped for a CRM: read operations (list/get/pipeline_summary), full create/update/delete for contacts and deals, and follow-up lifecycle management. No redundant or trivial tools; each earns its place.

Completeness5/5

The surface covers the core CRM lifecycle: contact CRUD, deal CRUD, follow-up scheduling/completion, activity logging, pipeline analytics, and outreach drafting. There are no obvious gaps for the stated domain; the only limitation (no message sending) is explicitly noted and is not a CRUD gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to manage CRM data including companies, contacts, prospects, pipelines, forecasts, and tasks via typed MCP tools, with local SQLite storage and a JSON CLI.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI clients to inspect and carefully edit a bounded local workspace via stdio, with a read-only default, conflict-safe updates, and no network listener or telemetry.
    10
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude Desktop to manage personal notes stored in a JSON file, supporting add, get, update, delete, and list operations with atomic saves.
    MIT