Resources
Read-only data sources that give AI context about your CRM.
Resources are read-only data sources exposed by the MCP server. AI assistants read them to understand your CRM structure, available pipelines, team members, and integration state — without modifying any data. Every resource returns application/json. They are scoped to the workspace and user identified by your API token, and an unauthenticated request returns {"error":"Unauthorized"}.
kasar://schema
Lists every active, non-hidden CRM object in your workspace with its field count. Use this to discover which objects exist before querying. System tables that aren't meant to be queried directly (for example tasks and notes) are intentionally excluded.
{
"objects": [
{
"name": "contacts",
"label": "Contact",
"labelPlural": "Contacts",
"description": "People you track",
"icon": "user",
"color": "#4F46E5",
"fieldCount": 24
},
{
"name": "companies",
"label": "Company",
"labelPlural": "Companies",
"icon": "building",
"color": "#0EA5E9",
"fieldCount": 18
}
]
}description is only present when the object has one. There is no recordCount — use crm_aggregate_records if you need counts.
kasar://schema/{object}
Returns the full schema for a single object: its fields with types and constraints, relation configurations, and writeNotes explaining how to write each kind of value. Read this before creating or updating records so you produce the correct value shapes.
URI example: kasar://schema/contacts
If the object name is unknown, the resource returns an INVALID_OBJECT error payload listing the valid object names instead of throwing.
{
"name": "contacts",
"label": "Contact",
"description": "People you track",
"writeNotes": {
"manyToMany": "M2M fields accept [{ targetId: uuid, junctionData: { ...junctionFields } }]. Keys are camelCase. On update, the array replaces the existing links.",
"manyToManyMultiTarget": "Multi-target M2M fields REQUIRE _objectType per item: [{ targetId: uuid, _objectType: \"contacts\"|\"companies\"|..., junctionData: {...} }]. Allowed _objectType values are in each field's writeShape.allowed_objectTypes.",
"morphRelation": "MORPH fields accept { id: uuid, _objectType: targetObjectName }.",
"belongsToOne": "BELONGS_TO_ONE fields accept the target UUID as a string.",
"composite": "ADDRESS / CURRENCY / DATE_RANGE / DATETIME_RANGE are composite: write a nested object under the PARENT field name. Never write to the flat children (flagged \"managed\": true).",
"emailsPhones": "EMAILS / PHONES are collections: on create pass an array under the field name. To mutate them on an EXISTING record use the dedicated email/phone child object, not crm_save_records on the parent."
},
"fields": [
{
"name": "first_name",
"label": "First Name",
"type": "TEXT",
"required": true
},
{
"name": "emails",
"label": "Emails",
"type": "EMAILS",
"required": false,
"relationType": "HAS_MANY",
"target": "contact_emails",
"writeShape": {
"description": "Liste d'emails. À la CRÉATION : passe un tableau [{ email_address, is_primary }]. Sur un record EXISTANT : utilise l'outil dédié, jamais crm_save_records.",
"example": [
{ "email_address": "contact@example.com", "is_primary": true }
],
"update_via": "manage_emails_phones"
}
},
{
"name": "company",
"label": "Company",
"type": "BELONGS_TO_ONE",
"required": false,
"relationType": "BELONGS_TO_ONE",
"target": "companies",
"writeShape": {
"description": "Foreign key. Pass the target record UUID as a string.",
"example": "<uuid>"
}
},
{
"name": "company_id",
"label": "Company",
"type": "UUID",
"required": false,
"managed": true,
"managedBy": "company"
}
],
"relations": [
{
"field": "company",
"type": "BELONGS_TO_ONE",
"target": "companies"
}
]
}Field annotations
options— present onSELECT/MULTI_SELECT(and similar enum-backed) fields, listing the allowed option values.writeShape— present on relation and compound fields. It carries adescriptionand a concreteexampleof the value to write (andallowed_objectTypes/requires_objectTypefor multi-target M2M,update_viaforEMAILS/PHONES).managed: true— a flat child column of a composite parent (e.g.address_city,currency_amount,company_id). Never write to these directly;managedBynames the parent field to write instead.junctionFields— onMANY_TO_MANYfields, the extra fields stored on each junction row (name, type, label, required, options).relations— a flat summary of every relation field (field,type,target, andjunctionTablefor M2M).
kasar://pipelines
Returns all pipelines, their ordered steps, AND the questions configured on each step (with their linked_field_name, informative_field_type, required_for_next_stage, required_for_closure, forced_value, default_value, hide_forced_field). The agent uses this to know:
- Which step IDs to pass to
crm_move_deal. - Which fields to fill on the record before changing the step. A forward step change requires the source step's
required_for_next_stagefields. A closure to awon/loststep requires the source's and target'srequired_for_closurefields. The server enforces this and returnsMISSING_REQUIRED_FIELDSotherwise.
{
"pipelines": [
{
"id": "a1b2c3d4-...",
"name": "Sales Pipeline",
"objectName": "opportunities",
"isActive": true,
"steps": [
{
"id": "step-001",
"name": "Qualification",
"order": 0,
"type": "ongoing",
"questions": [
{
"id": "q-101",
"label": "Budget approved",
"linked_field_name": "budget",
"informative_field_type": null,
"required_for_next_stage": true,
"required_for_closure": false,
"forced_value": null,
"default_value": null,
"hide_forced_field": false
}
]
},
{
"id": "step-002",
"name": "Closed Won",
"order": 4,
"type": "won",
"questions": [
{
"id": "q-201",
"label": "Close reason",
"linked_field_name": "close_reason",
"informative_field_type": null,
"required_for_next_stage": false,
"required_for_closure": true,
"forced_value": null,
"default_value": null,
"hide_forced_field": false
}
]
}
]
}
]
}The type field on each step is the step's outcome_type (ongoing, won, lost, ...).
Question semantics
forced_valueset → the server overwrites the linked field with this value when entering the step. The agent doesn't need to set it.default_valueset → the server fills the linked field on entry only if it is currently empty.required_for_next_stage: true→ must be set on the record before leaving this step (forward transition).required_for_closure: true→ must be set on the record before transitioning to awon/loststep.hide_forced_field: true→ the field is not shown in the UI form (it's auto-filled byforced_value).informative_field_type→ set when the question collects a free-form informative value not bound to a CRM field (linked_field_nameis thennull).
Backward transitions (target step before source in the order) skip required-field validation and do not record a witness row.
kasar://users
Returns all workspace members. Useful for assigning records, filtering by owner, or mentioning teammates. The id is the workspace user id — that's the value to use for owner / assigned_to fields.
{
"users": [
{
"id": "wsu_abc123",
"name": "Alice Martin",
"email": "alice@company.com"
},
{
"id": "wsu_def456",
"name": "Bob Dupont",
"email": "bob@company.com"
}
]
}name falls back to the email when the member has no first/last name set.
kasar://me
Returns the identity of the authenticated user — the person whose API token is being used — and their organization.
{
"id": "wsu_abc123",
"name": "Alice Martin",
"email": "alice@company.com",
"organizationId": "org_xyz789",
"organizationName": "Acme Corp"
}id is the caller's workspace user id (the same identifier used in kasar://users).
kasar://integrations/status
Returns the connection status of each messaging integration, keyed by provider (gmail, linkedin, microsoft, whatsapp). Each provider is { connected: false } when not connected, otherwise { connected: true, account?, lastUpdated }.
{
"gmail": {
"connected": true,
"account": "alice@company.com",
"lastUpdated": "2026-04-14T08:30:00Z"
},
"linkedin": {
"connected": true,
"lastUpdated": "2026-04-13T15:00:00Z"
},
"microsoft": {
"connected": false
},
"whatsapp": {
"connected": false
}
}account (the connected account identifier) is only present when the provider exposes one. lastUpdated is the last sync timestamp and may be null.
kasar://organization
Returns basic information about the current organization: its name, primary domain, any additional domains, and the company profile (business description + CRM objectives) when configured. Useful for understanding the business context.
{
"name": "Acme Corp",
"domain": "acme.kasar.app",
"additionalDomains": ["acme.io"],
"companyProfile": {
"description": "B2B SaaS for sales teams.",
"objectives": "Track pipeline and shorten sales cycles."
}
}additionalDomains and companyProfile are omitted when empty. Inside companyProfile, description and objectives are each present only when set.