freshsales-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@freshsales-mcpshow me the records in my Open Deals view"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 buildCopy .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
GETrequests — this server cannot create, update, or delete anything in your CRM.
License
MIT — see LICENSE.
Available Tools
5 toolsfreshsales_get_recordGet a single recordB
Fetch full details of a single lead, contact, deal, or account by its id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The record id | |
| module | Yes | ||
| include | No | Optional related data to include, e.g. ['owner','notes','tasks'] |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| module | Yes | ||
| view_id | Yes | The saved view/filter id | |
| per_page | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| module | Yes | Which CRM module to list views for |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | API path starting with '/', relative to /crm/sales/api | |
| params | No | Query string parameters |
TDQS
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.
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.
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.
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.
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.
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.
freshsales_searchSearch FreshsalesA
Global search across Freshsales CRM (leads, contacts, deals, accounts) by name, email, phone, or company. Use this first when the user asks about a specific person or company.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. a name, email, phone number, or company | |
| entities | No | Restrict the search to these entity types. Omit to search all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only states the operation is a search, implying a read-only action, but does not disclose return format, pagination, search behavior (e.g., fuzzy matching), or any limitations. Without explicit behavioral context, an agent cannot fully anticipate the tool's response or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The first sentence states the core function, the second gives usage context. Every word earns its place, and front-loading is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with 2 parameters and no output schema, so the description covers the core purpose and usage. However, it omits the return structure and any search semantics (e.g., whether it returns a list, ranking, or partial matches). Given no annotations, the description is somewhat minimal for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% description coverage for both parameters. The description repeats that search can be by name, email, phone, or company, aligning with the query parameter, but adds no new semantic nuance beyond what the schema states. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs a global search across Freshsales CRM entities (leads, contacts, deals, accounts) by name, email, phone, or company. It uses a specific verb 'search' and resource 'Freshsales CRM', and the scope distinguishes it from sibling tools like list_records or get_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this first when the user asks about a specific person or company', which provides clear when-to-use guidance. However, it does not explicitly mention when not to use it or name alternative tools, so it lacks full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v1.0.0- First observed
freshsales_get_record - First observed
freshsales_list_records - First observed
freshsales_list_views - First observed
freshsales_raw_request - First observed
freshsales_search
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
MCP server for the HubSpot Integrations Center HubDB: search and retrieve integration data.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
MCP server for LeadDelta — manage LinkedIn connections and CRM data via AI assistants.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenancePublic read-only MCP server for FoxTrove Voice, enabling LLMs to query call logs, customer records, assistant stats, and analytics via secure OAuth.MIT
- AlicenseNot gradedqualityDmaintenanceA 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.1Mozilla Public 2.0
- AlicenseAqualityDmaintenanceA read-only MCP server that exposes HubSpot CRM data (contacts, deals, companies, quotes) to AI agents, enabling natural language queries.9MIT
- FlicenseNot gradedqualityBmaintenanceRead-only MCP server connecting Claude to Vtiger CRM for leads, deals, and overdue follow-ups.-