Folk MCP by usefulapi

Read and write Folk CRM people, companies, groups and notes.

Should I use this

Quality & Safety

A
Description quality
90%
Schema completeness
91%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,323Tokens (tool definitions)
~2.3 KBTypical response size
Significant attention impact (2.60% of 128k context)

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": {
    "folk": {
      "url": "https://folk.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://folk.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (14)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢folk_get_current_user

Get the user associated with the current Folk API key. Folk REST: GET /v1/users/me.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢folk_list_users(limit, cursor)

List users in the Folk workspace (id, name, email) — useful for resolving owner ids. Folk REST: GET /v1/users.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Results per page (1-100, default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Pagination cursor — pass the value from a previous page's pagination.nextLink to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢folk_list_people(limit, cursor, combinator, filter)

List/filter people (contacts). Supports cursor pagination and structured filters. Folk REST: GET /v1/people.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Results per page (1-100, default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Pagination cursor — pass the value from a previous page's pagination.nextLink to fetch the next page.",
      "type": "string"
    },
    "combinator": {
      "description": "How to combine multiple filters — 'and' (all must match) or 'or' (any). Default 'and'.",
      "type": "string",
      "enum": [
        "and",
        "or"
      ]
    },
    "filter": {
      "description": "Structured filter: attribute → operator → value, expanded to filter[attribute][operator]=value query keys. Example: {\"firstName\":{\"eq\":\"John\"}}.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {
          "type": [
            "string",
            "number",
            "boolean"
          ]
        }
      }
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢folk_get_person(id)

Get a single person (contact) by id. Folk REST: GET /v1/people/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The person id."
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢folk_list_companies(limit, cursor, combinator, filter)

List/filter companies. Supports cursor pagination and structured filters. Folk REST: GET /v1/companies.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Results per page (1-100, default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Pagination cursor — pass the value from a previous page's pagination.nextLink to fetch the next page.",
      "type": "string"
    },
    "combinator": {
      "description": "How to combine multiple filters — 'and' (all must match) or 'or' (any). Default 'and'.",
      "type": "string",
      "enum": [
        "and",
        "or"
      ]
    },
    "filter": {
      "description": "Structured filter: attribute → operator → value, expanded to filter[attribute][operator]=value query keys. Example: {\"firstName\":{\"eq\":\"John\"}}.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {
          "type": [
            "string",
            "number",
            "boolean"
          ]
        }
      }
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢folk_get_company(id)

Get a single company by id. Folk REST: GET /v1/companies/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The company id."
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢folk_list_groups(limit, cursor)

List groups in the Folk workspace (ids needed to place people/companies). Folk REST: GET /v1/groups.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Results per page (1-100, default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Pagination cursor — pass the value from a previous page's pagination.nextLink to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢folk_list_notes(limit, cursor, entity_id, query, created_after, ...)

List notes, optionally scoped to an entity or filtered by full text and creation date. Folk REST: GET /v1/notes.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Results per page (1-100, default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Pagination cursor — pass the value from a previous page's pagination.nextLink to fetch the next page.",
      "type": "string"
    },
    "entity_id": {
      "description": "Restrict to notes on this entity (person/company) id — maps to query key entity.id.",
      "type": "string"
    },
    "query": {
      "description": "Full-text search over note content.",
      "type": "string"
    },
    "created_after": {
      "description": "Only notes created after this ISO 8601 timestamp — maps to query createdAfter.",
      "type": "string"
    },
    "created_before": {
      "description": "Only notes created before this ISO 8601 timestamp — maps to query createdBefore.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢folk_get_note(id)

Get a single note by id. Folk REST: GET /v1/notes/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The note id."
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴folk_create_person(firstName, lastName, fullName, description, birthday, ...)

Create a new person (contact). All fields are optional. Folk REST: POST /v1/people.

Input Schema

{
  "type": "object",
  "properties": {
    "firstName": {
      "description": "First name.",
      "type": "string"
    },
    "lastName": {
      "description": "Last name.",
      "type": "string"
    },
    "fullName": {
      "description": "Full name (if not split into first/last).",
      "type": "string"
    },
    "description": {
      "description": "Freeform description / notes.",
      "type": "string"
    },
    "birthday": {
      "description": "Birthday, formatted YYYY-MM-DD.",
      "type": "string"
    },
    "gender": {
      "type": "string",
      "enum": [
        "Male",
        "Female",
        "Unknown",
        "Other"
      ],
      "description": "Gender — one of Male, Female, Unknown, Other."
    },
    "jobTitle": {
      "description": "Job title.",
      "type": "string"
    },
    "emails": {
      "description": "Email addresses.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "phones": {
      "description": "Phone numbers.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "addresses": {
      "description": "Postal addresses.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "urls": {
      "description": "URLs (website, social, etc.).",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "groups": {
      "description": "Groups to add this person to (array of {id}).",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The group id."
          }
        },
        "required": [
          "id"
        ],
        "description": "A reference to a group by id."
      }
    },
    "companies": {
      "description": "Companies this person is linked to (array of {id} or {name}).",
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "The company id."
              }
            },
            "required": [
              "id"
            ]
          },
          {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "The company name (creates/links by name)."
              }
            },
            "required": [
              "name"
            ]
          }
        ],
        "description": "A reference to a company by id or by name."
      }
    },
    "customFieldValues": {
      "description": "Custom field values, keyed by field.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴folk_update_person(id, firstName, lastName, fullName, description, ...)

Update fields on an existing person. Only provided fields are changed; list-valued fields (emails, phones, groups, companies, etc.) REPLACE the existing values. Folk REST: PATCH /v1/people/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The person id to update."
    },
    "firstName": {
      "description": "First name.",
      "type": "string"
    },
    "lastName": {
      "description": "Last name.",
      "type": "string"
    },
    "fullName": {
      "description": "Full name.",
      "type": "string"
    },
    "description": {
      "description": "Freeform description / notes.",
      "type": "string"
    },
    "birthday": {
      "description": "Birthday, formatted YYYY-MM-DD.",
      "type": "string"
    },
    "gender": {
      "type": "string",
      "enum": [
        "Male",
        "Female",
        "Unknown",
        "Other"
      ],
      "description": "Gender — one of Male, Female, Unknown, Other."
    },
    "jobTitle": {
      "description": "Job title.",
      "type": "string"
    },
    "emails": {
      "description": "Replace the person's email addresses.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "phones": {
      "description": "Replace the person's phone numbers.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "addresses": {
      "description": "Replace the person's addresses.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "urls": {
      "description": "Replace the person's URLs.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "groups": {
      "description": "Replace the person's groups (array of {id}).",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The group id."
          }
        },
        "required": [
          "id"
        ],
        "description": "A reference to a group by id."
      }
    },
    "companies": {
      "description": "Replace the person's linked companies (array of {id} or {name}).",
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "The company id."
              }
            },
            "required": [
              "id"
            ]
          },
          {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "The company name (creates/links by name)."
              }
            },
            "required": [
              "name"
            ]
          }
        ],
        "description": "A reference to a company by id or by name."
      }
    },
    "customFieldValues": {
      "description": "Custom field values, keyed by field.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴folk_create_company(name, description, fundingRaised, lastFundingDate, industry, ...)

Create a new company. `name` is required. Folk REST: POST /v1/companies.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The company name (required)."
    },
    "description": {
      "description": "Freeform description / notes.",
      "type": "string"
    },
    "fundingRaised": {
      "description": "Total funding raised.",
      "type": [
        "string",
        "number"
      ]
    },
    "lastFundingDate": {
      "description": "Date of last funding round, formatted YYYY-MM-DD.",
      "type": "string"
    },
    "industry": {
      "description": "Industry.",
      "type": "string"
    },
    "foundationYear": {
      "description": "Year the company was founded.",
      "type": [
        "string",
        "number"
      ]
    },
    "employeeRange": {
      "type": "string",
      "enum": [
        "1-10",
        "11-50",
        "51-200",
        "201-500",
        "501-1000",
        "1001-5000",
        "5001-10000",
        "10000+"
      ],
      "description": "Employee-count range bucket."
    },
    "groups": {
      "description": "Groups to add this company to (array of {id}).",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The group id."
          }
        },
        "required": [
          "id"
        ],
        "description": "A reference to a group by id."
      }
    },
    "addresses": {
      "description": "Postal addresses.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "emails": {
      "description": "Email addresses.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "phones": {
      "description": "Phone numbers.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "urls": {
      "description": "URLs (website, social, etc.).",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "customFieldValues": {
      "description": "Custom field values, keyed by field.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴folk_update_company(id, name, description, fundingRaised, lastFundingDate, ...)

Update fields on an existing company. Only provided fields are changed; list-valued fields REPLACE the existing values. Folk REST: PATCH /v1/companies/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The company id to update."
    },
    "name": {
      "description": "The company name.",
      "type": "string"
    },
    "description": {
      "description": "Freeform description / notes.",
      "type": "string"
    },
    "fundingRaised": {
      "description": "Total funding raised.",
      "type": [
        "string",
        "number"
      ]
    },
    "lastFundingDate": {
      "description": "Date of last funding round, formatted YYYY-MM-DD.",
      "type": "string"
    },
    "industry": {
      "description": "Industry.",
      "type": "string"
    },
    "foundationYear": {
      "description": "Year the company was founded.",
      "type": [
        "string",
        "number"
      ]
    },
    "employeeRange": {
      "type": "string",
      "enum": [
        "1-10",
        "11-50",
        "51-200",
        "201-500",
        "501-1000",
        "1001-5000",
        "5001-10000",
        "10000+"
      ],
      "description": "Employee-count range bucket."
    },
    "groups": {
      "description": "Replace the company's groups (array of {id}).",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The group id."
          }
        },
        "required": [
          "id"
        ],
        "description": "A reference to a group by id."
      }
    },
    "addresses": {
      "description": "Replace the company's addresses.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "emails": {
      "description": "Replace the company's email addresses.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "phones": {
      "description": "Replace the company's phone numbers.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "urls": {
      "description": "Replace the company's URLs.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "customFieldValues": {
      "description": "Custom field values, keyed by field.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴folk_create_note(entity_id, visibility, content, parent_note_id)

Create a note attached to an entity (person/company). Folk REST: POST /v1/notes.

Input Schema

{
  "type": "object",
  "properties": {
    "entity_id": {
      "type": "string",
      "description": "Id of the entity (person/company) to attach the note to — maps to body entity:{id}."
    },
    "visibility": {
      "type": "string",
      "enum": [
        "public",
        "private"
      ],
      "description": "Note visibility — 'public' (workspace) or 'private' (you)."
    },
    "content": {
      "type": "string",
      "description": "The note content."
    },
    "parent_note_id": {
      "description": "Id of a parent note to reply under — maps to body parentNote:{id}.",
      "type": "string"
    }
  },
  "required": [
    "entity_id",
    "visibility",
    "content"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded14 tools
verifiedversion not recorded14 tools