Skip to main content
Glama
Thesidman

freshsales-mcp

by Thesidman

freshsales-mcp

A small MCP server that lets an AI assistant (Claude, or any other MCP-compatible client) fetch and query data from Freshsales CRM — leads, contacts, deals, and accounts — directly in conversation.

The Freshsales API can do a lot more than this (creating/updating/deleting records, managing tasks, webhooks, bulk operations, etc.). This server is deliberately read-only — every tool issues a GET request and nothing else touches your CRM data. That scope is intentional, not a limitation of the API: it's easy to extend with write tools later if you decide you want an assistant that can also create leads, update deal stages, log activities, and so on, but for now it only ever reads.

Setup

npm install
npm run build

Copy .env.example to .env and fill in your Freshsales bundle domain and API key (Admin Settings > API Settings in Freshsales), or set the same two variables in your MCP client config instead of a .env file.

Related MCP server: odoo-mcp-uvx

Tools

  • freshsales_search — global search by name/email/phone/company across leads, contacts, deals, accounts.

  • freshsales_list_views — list saved views/filters for a module (e.g. "Open Deals").

  • freshsales_list_records — paginated list of records within a saved view.

  • freshsales_get_record — fetch a single lead/contact/deal/account by id.

  • freshsales_raw_request — escape hatch for any other GET endpoint under /crm/sales/api.

Register with Claude Code

claude mcp add freshsales -- node "/Users/apple/aevy resource/freshsales mcp/dist/index.js"

Or add to your MCP config JSON directly:

{
  "mcpServers": {
    "freshsales": {
      "command": "node",
      "args": ["/Users/apple/aevy resource/freshsales mcp/dist/index.js"],
      "env": {
        "FRESHSALES_DOMAIN": "aevytv.myfreshworks.com",
        "FRESHSALES_API_KEY": "your-api-key"
      }
    }
  }
}

Restart Claude Code / Claude Desktop after registering so it picks up the new server.

Security

  • Never commit .env — it holds your Freshsales API key. It's already gitignored; only .env.example (a blank template) is tracked.

  • The API key is sent only to your own Freshsales domain, over HTTPS.

  • All tools are read-only GET requests — this server cannot create, update, or delete anything in your CRM.

License

MIT — see LICENSE.

Available Tools

5 tools
freshsales_get_recordGet a single recordB

Fetch full details of a single lead, contact, deal, or account by its id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe record id
moduleYes
includeNoOptional related data to include, e.g. ['owner','notes','tasks']

TDQS

B3/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden for behavioral disclosure. It says 'Fetch full details,' which implies a read operation, but doesn't explicitly state read-only behavior, discuss permissions, or mention the impact of the 'include' parameter on response content. This is a significant gap for a tool with no annotation support.

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?

The description is a single, clear, front-loaded sentence with no unnecessary words. It efficiently conveys the primary purpose without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 3 parameters, no output schema, and no annotations, the description is too thin. It doesn't explain the 'include' parameter, omits supported modules, and doesn't outline what 'full details' entails. Even for a simple get-by-id tool, this is insufficient for an agent to use it correctly across all valid inputs.

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?

The input schema already provides descriptions for 'id' and 'include', and the description merely says 'by its id,' adding little new meaning. It partially lists module values but omits two enum options, making the parameter information less complete than the schema. The 'include' parameter is not explained in the description at all.

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 clearly states the tool fetches full details of a single record by id, using the specific verb 'Fetch' and naming the resource types. However, it omits 'tasks' and 'appointments' from the schema enum, making the module list incomplete and therefore slightly imprecise.

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 description implies use when you have a record id and need full details, but it doesn't explicitly contrast with sibling tools like search or list_records. No explicit 'when to use' or 'when not to use' guidance is provided.

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

freshsales_list_recordsList records in a viewA

List records (leads, contacts, deals, accounts, tasks, appointments) belonging to a saved view, with pagination. Get view_id from freshsales_list_views first.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
moduleYes
view_idYesThe saved view/filter id
per_pageNo

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose the behavioral profile. It mentions listing and pagination but does not describe the response format, sorting, authorization requirements, rate limits, or any other side effects. For a read operation, this is minimal transparency.

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?

The description is two sentences, front-loaded with the core function and a practical prerequisite. It is concise with no filler, achieving high information density.

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?

Given no output schema and no annotations, the description omits the return structure and any additional filtering or sorting behaviors. It covers the essential action and pagination but leaves the agent guessing about response fields and edge cases. It is adequate but not comprehensive.

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 low (25%). The description adds context that view_id comes from freshsales_list_views and lists the record types, which maps to the module enum. However, it does not elaborate on page or per_page semantics beyond what the schema already provides via defaults and minimum/maximum. The added value is moderate.

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 clearly states the tool lists records of multiple types (leads, contacts, deals, accounts, tasks, appointments) belonging to a saved view, with pagination. This distinguishes it from sibling tools like freshsales_search (which searches across criteria) and freshsales_get_record (which retrieves a single record).

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 description provides a useful prerequisite: 'Get view_id from freshsales_list_views first.' However, it does not explicitly explain when to use this tool versus freshsales_search for dynamic queries, nor does it state when not to use it. Usage guidance is implied but not explicit.

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

freshsales_list_viewsList saved views/filtersA

List the saved views (filters) available for a Freshsales module, e.g. 'My Leads', 'Open Deals'. Use this to discover a view_id before calling freshsales_list_records.

ParametersJSON Schema
NameRequiredDescriptionDefault
moduleYesWhich CRM module to list views for

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of conveying the tool's safe read-only nature. The verb 'List' implies a read operation, but the description does not disclose details about return values, pagination, or any potential side effects. It adds the context of filtering examples, which helps, but remains minimal for a tool with no annotations.

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 with no fluff. The first sentence leads with the action and resource, the second adds purpose and a workflow tip. Every word earns its place.

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?

The tool is simple (single parameter, no output schema), and the description covers its core purpose and usage. It implicitly indicates that returning view_id is part of the result ('Use this to discover a view_id'), which is sufficient for this low-complexity tool. A score lower than 4 would be overly harsh given the context.

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?

The schema fully describes the 'module' parameter with an enum, achieving 100% coverage. The description does not add parameter-specific information beyond the schema, so the baseline score of 3 applies.

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 clearly states the action ('List') and the resource ('saved views (filters) for a Freshsales module') with concrete examples ('My Leads', 'Open Deals'). It also differentiates from sibling tools by explicitly tying it to discovering a view_id for freshsales_list_records, which is distinct from listing records directly.

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?

Provides an explicit use case: 'Use this to discover a view_id before calling freshsales_list_records.' This effectively positions it relative to a sibling tool. However, it does not mention any when-not-to-use scenarios or alternative contexts, though sibling names imply other use cases.

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

freshsales_raw_requestRaw Freshsales API GET requestA

Escape hatch for any GET endpoint under https:///crm/sales/api not covered by the other tools (e.g. '/leads/filters', '/selector/owners'). Only use when the other tools can't answer the question.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAPI path starting with '/', relative to /crm/sales/api
paramsNoQuery string parameters

TDQS

A4.4/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It discloses the HTTP method (GET) and endpoint scope, which implies a read-only operation, but it does not mention authentication requirements, error behavior, or response format, leaving some behavioral ambiguity for a raw request tool.

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?

The description is only two sentences, front-loaded with purpose and examples, and contains no filler. Every word earns its place.

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 raw GET escape hatch, the description provides the base URL, path semantics, and usage guidance, which is largely sufficient. The lack of output schema and annotations is somewhat mitigated by the clear scope, though explicitly stating the return format would make it fully complete.

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 schema already covers both parameters fully, and the description adds value by specifying the base URL and giving example paths. This helps the agent understand how to construct the 'path' parameter beyond the schema's bare description.

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 clearly identifies this as an escape hatch for any GET endpoint under the Freshsales API base URL not covered by other tools, with concrete examples like '/leads/filters'. This specific verb+resource+scope fully distinguishes it from the sibling tools.

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?

It explicitly states 'Only use when the other tools can't answer the question' and frames the tool as a fallback for endpoints not covered by other tools. This is excellent when-to-use guidance and names the alternative approach.

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. 5 tool updatesv1.0.0
    • First observedfreshsales_get_record
    • First observedfreshsales_list_records
    • First observedfreshsales_list_views
    • First observedfreshsales_raw_request
    • First observedfreshsales_search

TDQS

A3.8/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: global search, listing saved views, listing records from a view, fetching a single record by ID, and an escape hatch for arbitrary GET endpoints. No two tools overlap in functionality.

Naming Consistency5/5

All tool names consistently follow the 'freshsales_' prefix with a verb_noun pattern (search, list_views, list_records, get_record, raw_request). The naming is uniform and predictable.

Tool Count5/5

With five tools, the server is well-scoped for a read-only CRM access layer. It covers search, view discovery, record listing, and detail retrieval without unnecessary bloat.

Completeness4/5

The main read workflow (search, discover views, list records, get record details) is well covered, and raw_request provides a fallback for any missing endpoints. However, get_record does not support tasks/appointments even though list_records can return them, leaving a minor gap.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A read-only MCP server that enables AI assistants to query Odoo instances via XML-RPC, supporting search, read, count, and field inspection without requiring custom modules.
    1
    Mozilla Public 2.0
  • A
    license
    A
    quality
    D
    maintenance
    A read-only MCP server that exposes HubSpot CRM data (contacts, deals, companies, quotes) to AI agents, enabling natural language queries.
    9
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Read-only MCP server connecting Claude to Vtiger CRM for leads, deals, and overdue follow-ups.
    -