Skip to main content
Glama
soil-dev

capsulemcp

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
CAPSULE_API_TOKENYesYour Capsule API token
CAPSULE_MCP_READONLYNoSet to '1' to enable read-only mode (disables write tools)0

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
search_partiesA

Free-text search or list people and organisations in Capsule CRM. Returns results in Capsule's default order (no sort parameter is supported here). For structured queries — 'most recent', 'tagged X', 'added this month' — use filter_parties instead.

filter_partiesA

Filter parties by structured conditions (date ranges, tags, fields). Use this — not search_parties — for questions like 'most recent client', 'parties added this week', 'parties tagged VIP'. Capsule's API does not support ad-hoc sort, but for 'most recent X' you can filter by a date field (e.g. {field: 'addedOn', operator: 'is within last', value: 30}) and pick the highest-id row from the result — Capsule IDs are monotonic, so newest id = newest record.

get_partyA

Fetch a single party (person or organisation) by its numeric ID.

get_partiesA

Batch-fetch up to 10 parties by ID in a single call. Use this when Claude already knows several party IDs to avoid N round trips of get_party.

list_party_opportunitiesC

List all opportunities linked to a given party.

list_party_projectsC

List all projects (cases) linked to a given party.

list_employeesA

List the people who work at a given organisation party. Returns the parties whose organisation field references the given partyId. Use this to answer 'who works at X?' rather than enumerating all parties.

list_custom_fieldsA

List custom field DEFINITIONS for an entity type (parties, opportunities, or projects/kases). Returns the schema — name, type, options for list-type fields, etc. — NOT the values on any specific record. To read values on a record, use get_party / get_opportunity / get_project with embed=fields.

get_custom_fieldA

Show a single custom field DEFINITION by id. Use list_custom_fields first to discover field ids.

list_deleted_partiesA

Audit feature: list parties deleted on or after a given timestamp. The since parameter is REQUIRED (Capsule rejects the call without it). Response also includes a restrictedParties key — records the integration user can see were deleted but cannot read fully.

create_partyA

Create a new person or organisation in Capsule CRM. For type='person', firstName or lastName is required (one suffices); the name field is silently ignored. For type='organisation', name is required and firstName/lastName/title/jobTitle are silently ignored. Passing organisationId pointing at a non-organisation party (e.g. another person's id) returns 404 'organisation not found' — Capsule filters lookups by type.

update_partyA

Update top-level fields on an existing party (about, firstName/lastName/name/title/jobTitle, ownerId). Only the fields you provide are changed. Child arrays (emailAddresses / phoneNumbers / addresses / websites) on this tool are APPEND-ONLY: items are merged into the existing list, not replaced. For surgical changes — replacing one email, removing one phone number, fixing the type on one address — use the dedicated atomic tools: add_party_email_address / remove_party_email_address_by_id (and the phone/address/website equivalents).

delete_partyA

DESTRUCTIVE & IRREVERSIBLE: permanently delete a party (person or organisation). Cascades to all linked notes, tasks, opportunities, AND projects (kases). Deleting an organisation does NOT delete people linked to it via organisationId — their organisation field is silently cleared to null and they survive as standalone records. TRACK INSTANCES applied to cascaded opportunities/projects are NOT cleaned up either — they survive as orphan records reachable only by track id via show_track. Use remove_track on each track explicitly before deleting the parent party if orphan accumulation matters (rare in practice — orphans are unreachable from normal navigation). Requires confirm=true. Always read the party first with get_party and confirm with the user before calling. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the party was already gone (Capsule's 404 is caught internally so reconciliation loops can re-issue safely).

add_party_email_addressA

Append a single email address to a party. Atomic — one PUT to Capsule. Use this instead of update_party.emailAddresses when you want to add exactly one entry; the bulk array on update_party is append-only and won't replace.

remove_party_email_address_by_idA

Remove one email-address entry from a party by its row id. Atomic and reversible — no confirm: true gate (re-add with add_party_email_address). Discover the id via get_party — each entry in the emailAddresses array carries one. Use this to replace an existing entry: remove the old id, then call add_party_email_address with the new value (any associated server-side metadata on the old row is discarded along with the row). Idempotent on retry: response is {removed: true, alreadyRemoved: false, partyId, emailAddressId, party} on a fresh remove (the updated party shape is included) or {removed: true, alreadyRemoved: true, partyId, emailAddressId} if the row was already gone (Capsule's 404 is caught).

add_party_phone_numberA

Append a single phone number to a party. Atomic — one PUT to Capsule. Use this instead of update_party.phoneNumbers for single-entry adds.

remove_party_phone_number_by_idA

Remove one phone-number entry from a party by its row id. Atomic and reversible — no confirm: true gate (re-add with add_party_phone_number). Discover the id via get_party. Idempotent on retry: response is {removed: true, alreadyRemoved: false, partyId, phoneNumberId, party} on a fresh remove or {removed: true, alreadyRemoved: true, partyId, phoneNumberId} if the row was already gone.

add_party_addressA

Append a single postal address to a party. Atomic — one PUT to Capsule. Use this instead of update_party.addresses for single-entry adds.

remove_party_address_by_idA

Remove one address entry from a party by its row id. Atomic and reversible — no confirm: true gate (re-add with add_party_address). Discover the id via get_party. Idempotent on retry: response is {removed: true, alreadyRemoved: false, partyId, addressId, party} on a fresh remove or {removed: true, alreadyRemoved: true, partyId, addressId} if the row was already gone.

add_party_websiteA

Append a single website / social handle to a party. Atomic — one PUT to Capsule. Use this instead of update_party.websites for single-entry adds. The 'address' field is a URL when service='URL' or a handle (e.g. '@acmeco') for social services.

remove_party_website_by_idA

Remove one website entry from a party by its row id. Atomic and reversible — no confirm: true gate (re-add with add_party_website). Discover the id via get_party. Idempotent on retry: response is {removed: true, alreadyRemoved: false, partyId, websiteId, party} on a fresh remove or {removed: true, alreadyRemoved: true, partyId, websiteId} if the row was already gone.

search_opportunitiesA

Free-text search or list opportunities in Capsule CRM. Returns results in Capsule's default order (no sort parameter is supported here). For structured queries — 'most recent', 'won this quarter', 'in pipeline X at milestone Y' — use filter_opportunities instead.

filter_opportunitiesA

Filter opportunities by structured conditions (milestone, value, close date, tags). Use this — not search_opportunities — for questions like 'last won deal', 'opportunities closed this month', 'pipeline X at milestone Y'. Capsule's API does not support ad-hoc sort, but for 'most recent X' you can filter by a date field (e.g. {field: 'closedOn', operator: 'is within last', value: 90}) and pick the highest-id row — Capsule IDs are monotonic, so newest id = newest record.

get_opportunityB

Fetch a single opportunity by its numeric ID.

get_opportunitiesA

Batch-fetch up to 10 opportunities by ID in a single call.

list_deleted_opportunitiesA

Audit feature: list opportunities deleted on or after a given timestamp. The since parameter is REQUIRED. Response also includes a restrictedOpportunities key for records the integration user can't read fully.

list_additional_partiesA

List secondary party links on an opportunity or project. The 'main' party is on the entity itself (opportunity.party); additional parties are e.g. partners, consultants, or referrers also involved in the deal. Set entity to 'opportunities' or 'kases' (Capsule's term for projects).

list_associated_projectsB

List projects (cases) associated with a given opportunity. The inverse direction (project → opportunity) is on each project's opportunity field directly.

create_opportunityC

Create a new opportunity linked to a party and a pipeline milestone.

update_opportunityA

Update fields on an existing opportunity. Only the fields you provide are changed. Closed (Won/Lost) opportunities ARE editable — Capsule does not enforce closed-record immutability, so value, description, etc. can be changed on a Won opp without warning. If the workflow needs historical revenue numbers to be stable, enforce that caller-side.

delete_opportunityA

DESTRUCTIVE & IRREVERSIBLE: permanently delete an opportunity. Requires confirm=true. Always read the opportunity first with get_opportunity and confirm with the user before calling. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the opportunity was already gone.

list_projectsA

List projects (cases) in Capsule CRM, optionally filtered by status. Returns results in Capsule's default order (no sort parameter is supported here). For structured queries — 'most recent project', 'projects opened this month', 'projects tagged X' — use filter_projects instead.

filter_projectsA

Filter projects (cases) by structured conditions (date ranges, status, tags, owner). Use this — not list_projects — for questions like 'most recent project', 'projects opened this month'. Capsule's API does not support ad-hoc sort, but for 'most recent X' you can filter by a date field and pick the highest-id row — Capsule IDs are monotonic, so newest id = newest record.

get_projectA

Fetch a single project (case) by its numeric ID.

get_projectsA

Batch-fetch up to 10 projects (cases) by ID in a single call.

list_deleted_projectsA

Audit feature: list projects deleted on or after a given timestamp. The since parameter is REQUIRED. Response also includes a restrictedKases key for records the integration user can't read fully.

create_projectB

Create a new project (case) in Capsule CRM linked to a party.

update_projectA

Update fields on an existing project. Only the fields you provide are changed. Use status='CLOSED' to close a project. CLOSED projects remain fully editable — Capsule does not enforce closed-record immutability. Stage moves and description edits on a CLOSED project are accepted without warning.

delete_projectA

DESTRUCTIVE & IRREVERSIBLE: permanently delete a project (case). Prefer update_project with status='CLOSED' to close a project while preserving history. Requires confirm=true. Always read the project first with get_project and confirm with the user before calling. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the project was already gone.

add_additional_partyA

Link an existing party as an additional (secondary) party on an opportunity or project. The 'main' party is set via update_opportunity / update_project; this adds additional parties beyond the main one. Idempotent — re-adding a linked party is harmless. Response: {linked: true, alreadyLinked: false} on a fresh link, {linked: true, alreadyLinked: true} if the party was already linked (Capsule's 422 'already a contact' / 'already related' is caught internally and converted).

remove_additional_partyA

Remove an additional-party link between an opportunity/project and a party. The party itself is NOT deleted. Requires confirm=true. Reversible by re-adding via add_additional_party. Idempotent on retry: response is {removed: true, alreadyRemoved: false, entity, entityId, partyId} on a fresh remove or {removed: true, alreadyRemoved: true, ...} if the link was already gone (Capsule's 404 is caught and converted).

apply_trackA

Apply a track definition to an opportunity or project. Creates a track instance and auto-creates tasks per the track's task definitions; tasks' dueOn is computed from startDate (defaults to today) plus each task's daysAfter offset. Use list_track_definitions to discover available templates. NOT IDEMPOTENT — applying the same trackDefinitionId twice creates two independent track instances and two sets of auto-tasks (no de-duplication). If you want to apply only once, call list_entity_tracks first and check for an existing instance with the same trackDefinition.id (but mind that list_entity_tracks can include auto-applied tracks from board stage rules, not just manual applies).

update_trackA

Update a track instance. Capsule's PUT semantics are partial — provide only the fields you want to change in fields. Common: { complete: true } to mark a track completed.

remove_trackA

Remove a track instance from its entity. Capsule also deletes the auto-tasks the track created when it was applied; copy any task details you need before removing the track. Requires confirm=true. Idempotent on retry: response is {removed: true, alreadyRemoved: false, trackId} on a fresh remove or {removed: true, alreadyRemoved: true, trackId} if the track was already gone.

list_tasksA

List tasks in Capsule CRM. Defaults to OPEN tasks; pass status to broaden. Optionally filter to a specific owner via ownerId. Capsule does not expose a due-date filter on this endpoint — for that use filter_* tools elsewhere or iterate.

get_taskB

Fetch a single task by its numeric ID.

get_tasksA

Batch-fetch up to 10 tasks by ID in a single call.

create_taskA

Create a new task, optionally linked to a party, opportunity, or project. Pass at most ONE of partyId / opportunityId / projectId — the connector rejects multi-target inputs before the HTTP call. Omitting all three is also valid: Capsule creates the task as a STANDALONE task (no parent link), useful for personal reminders or workflow tasks that aren't tied to a specific CRM record.

update_taskA

Update fields on an existing task. Only the fields you provide are changed. To mark a task done prefer complete_task.

complete_taskA

Mark a task as done / completed / finished. Sets status=COMPLETED on the task, populating completedBy and completedAt while preserving the task in history (unlike delete_task which removes it permanently). Use this whenever a user says 'mark done', 'complete', 'finish', or similar — equivalent to update_task with status:COMPLETED but more discoverable.

delete_taskA

DESTRUCTIVE & IRREVERSIBLE: permanently delete a task. Prefer complete_task to mark a task done while keeping it in history. Requires confirm=true. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the task was already gone.

list_party_entriesA

List timeline entries (notes, captured emails, completed-task records) for a party. Use this to read the conversation history with a contact or organisation.

list_opportunity_entriesB

List timeline entries (notes, captured emails, completed-task records) for an opportunity.

list_project_entriesB

List timeline entries (notes, captured emails, completed-task records) for a project (case).

get_entryA

Fetch a single timeline entry by its numeric ID. Returns full content (note body, email subject + body, etc.).

list_entriesA

Global timeline feed: every note, captured email, and completed-task record across the whole Capsule account, paginated. Default order is most-recent-first. Use this for 'what activity happened today/this week across the company?' rather than iterating list_party_entries / list_opportunity_entries / list_project_entries.

get_attachmentA

Download an attachment by id. Returns image content for image/* types (Claude can describe it natively); decoded text for text/* and application/json (small files); JSON metadata + base64 payload for other binary types (PDF, Office docs, etc.). Files exceeding maxSizeBytes (default 5MB) return metadata only with a truncated: true flag.

add_noteA

Add a note to a party, opportunity, or project. Provide exactly one of partyId, opportunityId, or projectId. The note is always attributed to the API-token owner — there is no override for the author (a creatorId parameter would enable audit-attribution spoofing on shared-connector deployments, so it is intentionally not exposed). Optional entryAt lets you backdate the note's authored-at timestamp for legitimate historical-import workflows.

update_entryA

Edit an existing timeline entry — typically a note. Provide the entry id plus the fields you want to change (content, subject). Only the fields you supply are modified; other fields keep their current values. Cannot change the entry's type. Use this to correct or extend a note added previously.

upload_attachmentA

Upload a file as a new note attachment, linked to a party, opportunity, or project. Provide the file as base64-encoded dataBase64 along with filename and contentType (MIME). Also provide exactly one of partyId / opportunityId / projectId to anchor the note. Optionally pass content to set the note body (defaults to '[attachment]'). Two-step orchestration server-side: bytes upload → token → note creation. Adding to an existing entry is not supported.

delete_entryA

DESTRUCTIVE & IRREVERSIBLE: permanently delete a note (or other entry) by its ID. Requires confirm=true. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the entry was already gone.

list_pipelinesB

List all sales pipelines defined in Capsule CRM.

list_milestonesC

List all milestones (stages) within a specific opportunity pipeline.

list_boardsB

List all project (kase) boards defined in Capsule. A board is a grouping of stages that projects flow through — the project equivalent of an opportunity pipeline.

list_stagesA

List project stages. Without arguments returns every stage across every board (each carries a .board reference). Pass boardId to scope to one specific board.

list_teamsA

List all teams configured in the Capsule account. Useful as input for filter_* queries that scope by team, and for reporting. LIMITATION: returns team identity only (id, name, description, timestamps). Capsule's v2 API does not expose team↔user membership through any endpoint — GET /teams/{id}/users 404s, embed=users is silently ignored, and GET /users/{id} doesn't include a teams field. To determine whether a given user belongs to a given team, either check Capsule's web UI Team Membership page, or probe via update_project { ownerId: U, teamId: T } and read the response — 422 'owner is not a member of the team' means U ∉ T.

list_lostreasonsA

List all configured opportunity-loss reasons (e.g. 'Poor Qualification', 'Lost to competitor'). Useful for analysing closed-lost opportunities by reason.

list_activitytypesB

List all configured activity types (e.g. Call, Meeting, Email). These are the categories used when logging timeline entries.

list_categoriesA

List configured entry/task categories (Call, Email, Meeting, Follow-up, etc.) with their colours. Used to label and filter timeline entries and tasks.

list_track_definitionsA

List workflow track definitions: reusable templates that auto-create tasks at configured intervals when applied to an opportunity or project. Each track includes nested taskDefinitions specifying what to create and when. Use this to understand what automations exist.

list_entity_tracksA

List track INSTANCES on a specific record — i.e., which tracks have been applied to this opportunity / project / party. Distinct from list_track_definitions, which lists the templates. NOTE: some boards have stage-triggered automation that auto-applies tracks when an entity enters specific stages — tracks returned here may include BOTH manually-applied tracks (via apply_track) and auto-applied tracks from Capsule board rules. To distinguish, compare each track's trackDefinition.id against your application's apply_track call history.

show_trackA

Fetch a single track instance by id. Returns the minimal Capsule projection: id, description, trackDateOn, direction, and the array of tasks attached to the track. Capsule's GET /tracks/{id} does NOT include a trackDefinition link, an entity reference, or a completion field — to find the entity a track is applied to, use list_entity_tracks (which lists track instances by their parent entity); to check completion, the track-tasks' own statuses are the proxy.

list_goalsA

List sales / activity goals configured in the account (per-user or per-team revenue or activity targets). Returns an empty list for accounts that don't use the Goals feature.

get_siteA

Return the Capsule account this connector is currently authenticated against (subdomain, display name, URL). Diagnostic for 'which Capsule account is this?'. For the PAT owner's user identity, use get_current_user.

list_saved_filtersA

List all filters that users have saved in Capsule's web UI for an entity type. Saved filters are reusable — they bundle conditions, columns, and (importantly) sort. Use this to discover what queries are already configured before building a one-off filter_* call.

run_saved_filterA

Run a saved filter by id and return its results, paginated. Unlike filter_parties / filter_opportunities / filter_projects (which use the ad-hoc filter endpoint and CANNOT sort), saved filters DO support sort — the orderBy is configured in Capsule's web UI when the filter is created. So 'most recent X by Y' questions are answerable in one call IF a saved filter exists; use list_saved_filters first to find one.

list_tagsB

List all tags available for a given entity type (parties, opportunities, or kases).

add_tagA

Attach a tag to a party, opportunity, or project (kase) by NAME. Capsule resolves to an existing tag in the tenant or creates a fresh one with this name. Matching is case-insensitive — 'VIP' and 'vip' attach the same tag, preserving the canonical casing from whichever variant was created first. To avoid creating a genuinely-distinct near-duplicate (e.g. 'VIP' vs 'V.I.P.'), call list_tags first and reuse the exact name. Idempotent — re-attaching an already-attached tag is harmless. To DETACH a tag, use remove_tag_by_id with the tag's id (read via get_party/get_opportunity/get_project with embed='tags').

remove_tag_by_idA

Detach a tag from a party, opportunity, or project (kase). Atomic — one PUT to Capsule. Reversible — no confirm: true gate (re-attach with add_tag using the same tag name). The tagId parameter is the tag's id, readable via get_party/get_opportunity/get_project with embed='tags' (list_tags returns the same ids and also works, but reading via embed first confirms the tag is actually attached to this entity). The tag definition itself remains in the tenant for other entities that still share it. Idempotent on retry: response is {removed: true, alreadyRemoved: false, entity, entityId, tagId, ...<updated entity>} on a fresh detach or {removed: true, alreadyRemoved: true, entity, entityId, tagId} if the tag was already detached (Capsule's 422 'tag not found to delete' is caught and converted).

list_usersC

List all users in the Capsule account.

get_current_userA

Show the user owning the API token this connector is using. Useful for audit ('under whose Capsule identity is the connector running?') and for confirming a token rotation moved ownership to the expected account. Wraps Capsule's GET /users/current — note the endpoint is /users/current, not /users/me.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/soil-dev/capsulemcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server