Vtiger MCP by usefulapi
Search, read, create and update Vtiger CRM leads, contacts, deals, cases and more; tag records.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"vtiger": {
"url": "https://vtiger.usefulapi.io/mcp"
}
}
}Remote endpoints
https://vtiger.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (13)
🟢vtiger_get_me
The Vtiger user the credentials belong to (id, user name, name, email). GET /me.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_list_modules
The CRM modules this user can access (Leads, Contacts, Accounts, Potentials, Cases, ...) with label and whether each holds records. GET /listtypes.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_describe_module(module)
A module's fields (name, label, type, mandatory, editable, reference targets, picklist values) and whether it can be created, updated or deleted. Read this before creating or filtering. GET /describe?elementType=<module>.
Input Schema
{
"type": "object",
"properties": {
"module": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
"description": "Module name, for example Contacts, Accounts, Leads, Potentials (deals), Cases, Calendar (tasks and events). Names come from vtiger_list_modules."
}
},
"required": [
"module"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_list_records(module, fields, filters, order_by, descending, ...)
Records of one module, optionally filtered (all filters AND-ed), sorted and paged. Builds a SELECT for GET /query. The vendor returns at most 100 records per call; pass next_offset as offset for the next page. Name the fields you need: a full record has 100+ fields.
Input Schema
{
"type": "object",
"properties": {
"module": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
"description": "Module name, for example Contacts, Accounts, Leads, Potentials (deals), Cases, Calendar (tasks and events). Names come from vtiger_list_modules."
},
"fields": {
"description": "Fields to return (default all). Example: [\"id\",\"firstname\",\"lastname\",\"email\"].",
"maxItems": 60,
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$"
}
},
"filters": {
"description": "Conditions combined with AND. Example: [{field:'leadstatus',op:'=',value:'Hot'},{field:'lastname',op:'like',value:'Sm%'}].",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$"
},
"op": {
"type": "string",
"enum": [
"=",
"!=",
"<",
">",
"<=",
">=",
"like"
],
"description": "=, !=, <, >, <=, >= or like (use % as a wildcard)."
},
"value": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"field",
"op",
"value"
]
}
},
"order_by": {
"description": "Field to sort by (default id).",
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$"
},
"descending": {
"description": "Sort descending (default false).",
"type": "boolean"
},
"limit": {
"description": "Records per page, 1-100 (default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Use next_offset from the previous reply.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"required": [
"module"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_count_records(module, filters)
How many records of a module match the filters (same filters as vtiger_list_records). GET /query with count(*).
Input Schema
{
"type": "object",
"properties": {
"module": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
"description": "Module name, for example Contacts, Accounts, Leads, Potentials (deals), Cases, Calendar (tasks and events). Names come from vtiger_list_modules."
},
"filters": {
"description": "Conditions combined with AND.",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$"
},
"op": {
"type": "string",
"enum": [
"=",
"!=",
"<",
">",
"<=",
">=",
"like"
]
},
"value": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"field",
"op",
"value"
]
}
}
},
"required": [
"module"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_query(query)
Run your own read-only query: SELECT <fields|*|count(*)> FROM <Module> [WHERE ...] [ORDER BY ...] [LIMIT offset,count]. One module only, no joins, no grouping brackets; at most 100 records per call. Only SELECT is accepted. GET /query.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 8,
"maxLength": 2000,
"description": "Example: select id,firstname,lastname from Contacts where mailingcity = 'Boston' or mailingcity = 'Austin' order by createdtime desc limit 0,25"
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_get_record(id)
One record with all its fields, by id (for example 4x2063). GET /retrieve?id=<id>.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9]{1,6}x[0-9]{1,18}$",
"description": "Record id of the form <moduleTypeId>x<recordId>, for example 4x2063."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_lookup(type, value, modules)
Find records in one or more modules by an exact email address or phone number. GET /lookup.
Input Schema
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"email",
"phone"
],
"description": "What the value is."
},
"value": {
"type": "string",
"minLength": 3,
"maxLength": 200,
"description": "The email address or phone number."
},
"modules": {
"description": "Modules to search (default Contacts, Leads, Accounts).",
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
"description": "Module name, for example Contacts, Accounts, Leads, Potentials (deals), Cases, Calendar (tasks and events). Names come from vtiger_list_modules."
}
}
},
"required": [
"type",
"value"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_list_related_modules(module)
The modules a module can be related to (for example Accounts relate to Contacts, Potentials, Cases, Documents). GET /relatedtypes?elementType=<module>.
Input Schema
{
"type": "object",
"properties": {
"module": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
"description": "Module name, for example Contacts, Accounts, Leads, Potentials (deals), Cases, Calendar (tasks and events). Names come from vtiger_list_modules."
}
},
"required": [
"module"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢vtiger_get_tags(id)
The tags on one record. GET /tags_retrieve?id=<id>.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9]{1,6}x[0-9]{1,18}$",
"description": "Record id of the form <moduleTypeId>x<recordId>, for example 4x2063."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡vtiger_create_record(module, fields)
WRITE: create one record in a module (a lead, contact, account, deal, case, ...). Send every mandatory field (vtiger_describe_module lists them; assigned_user_id is usually mandatory, use the id from vtiger_get_me). Returns the new record. POST /create. Not retried.
Input Schema
{
"type": "object",
"properties": {
"module": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
"description": "Module name, for example Contacts, Accounts, Leads, Potentials (deals), Cases, Calendar (tasks and events). Names come from vtiger_list_modules."
},
"fields": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 20000
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"description": "Field values keyed by field name (see vtiger_describe_module). Reference fields take a record id like 3x12; picklists take the exact value."
}
},
"required": [
"module",
"fields"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴vtiger_update_record(id, fields)
WRITE: change only the named fields of an existing record (the vendor's revise call; other fields stay as they are). Returns the updated record. POST /revise. Not retried.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9]{1,6}x[0-9]{1,18}$",
"description": "Record id of the form <moduleTypeId>x<recordId>, for example 4x2063."
},
"fields": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 20000
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"description": "Field values keyed by field name (see vtiger_describe_module). Reference fields take a record id like 3x12; picklists take the exact value."
}
},
"required": [
"id",
"fields"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡vtiger_add_tags(id, tags)
WRITE: add tags to one record (existing tags stay). POST /tags_add. Not retried.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9]{1,6}x[0-9]{1,18}$",
"description": "Record id of the form <moduleTypeId>x<recordId>, for example 4x2063."
},
"tags": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 50
},
"description": "Tag names to add."
}
},
"required": [
"id",
"tags"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence