Skip to content
indraft
Start free

MCP

Paste one URL and your agent has a CRM

Indraft speaks the Model Context Protocol over Streamable HTTP. Connecting is an authorization flow, not a pasted secret, and you can revoke it from the workspace the moment you want to.

The endpoint

There is one, and this is it

Add it to Claude, ChatGPT, or anything that speaks MCP. Your client sends you through WorkOS AuthKit, you approve the connection, and the agent can start reading the schema.

Each connection is its own actor, so authorizing two clients gives you two identities in the history. Revoking one takes effect on its very next request and does not rewrite what it already did.

https://api.indraft.io/mcp

The catalogue

46 tools, and nothing your agent learns goes stale

Semantic rather than generic. advance_opportunity beats a generic record update, because Indraft can enforce what a stage means and add behaviour later without changing what your agent had to learn.

This page used to say the set was frozen. That was a stronger promise than it sounds and not one worth keeping: it would have meant a capability we could not give your agent rather than a name we would not take away. The promise is that nothing is removed or renamed without notice, and that the list grows only when there is genuinely a new thing to do. Everything your agent has learned keeps working.

Understand

One call and the agent knows the workspace it landed in, and one more answers how much and how many without reading a single record.

get_crm_schema
Describe the CRM: object types and whether they can be extended, pipelines and stages, custom fields, tags, your own capabilities, the workspace timezone and default currency, ID prefixes, every stated limit, every error code, and the derived values the database computes on read and nothing can write.
search_crm
Search companies, contacts, opportunities, tasks, interaction summaries, and this workspace's own records by keyword.
list_companies
List companies, newest first, with a cursor for the next page.
list_contacts
List contacts, newest first, with a cursor for the next page.
get_company_context
One bounded view of a company: the record, its contacts, open opportunities, open tasks, and recent interactions.
get_contact_context
One bounded view of a contact: the record, its companies, open opportunities, open tasks, and recent interactions.
list_opportunities
List opportunities by stage or status, newest first, with a cursor for the next page.
list_tasks
List tasks by status or assignee, newest first, with a cursor for the next page.
aggregate_crm
Count, sum, average, min or max over one object type, grouped by up to TWO dimensions.

Configure

The part other CRMs reserve for a human in an admin panel.

configure_pipeline
Create or reconfigure a pipeline and its ordered stages.
configure_custom_field
Define or update a typed custom field on a company, contact, opportunity, interaction, or task.
archive_custom_field
Retire a custom field definition.
set_exchange_rate
State an exchange rate this workspace stands behind, with the day it takes effect and where it came from.

Your own objects

Eight tools, whatever your schema looks like. A type you define gets a pipeline, a board and deduplication, exactly like an opportunity, and the tool set stays the same size in every workspace.

configure_object_type
Define a NEW object type this workspace needs and Indraft does not have: a Candidate, a Campaign, a Unit.
alter_object_type
Change a type this workspace has ALREADY defined; use configure_object_type to create one.
list_object_types
The custom object types this workspace has defined, with their fields and relationships.
list_object_records
Records of one custom object type, newest first, with a cursor for the next page.
upsert_object_record
Create or update one record of a custom object type.
advance_object_record
Move one record of a custom type to a stage of that type's pipeline.
merge_object_records
Merge a duplicate record of a custom type into a target.
archive_object_record
Archive one record of a type this workspace defined for itself, or restore it.

Write

Each one is idempotent and accepts the version it expected.

upsert_company
Create a company, or match and update an existing one.
upsert_contact
Create a contact, or match and update an existing one.
upsert_opportunity
Create a deal, or find the one another system already knows about and update it.
create_opportunity
Create an opportunity, always as a new one.
update_opportunity
Change an opportunity's name, amount, probability, expected close date, or owner.
advance_opportunity
Move an opportunity to a stage.
record_interaction
Record what happened: an email, call, meeting, message, or note, as a SUMMARY you write.
create_task
Create a follow-up, optionally due at a time and linked to CRM records.
update_task
Correct a task that already exists: its title, when it is due, who owns it, or how urgent it is.
complete_task
Mark a task done.
cancel_task
Call a task off.
bulk_upsert
Apply up to 100 operations in one call, so a first population session is not one call per record.

Correct

What makes the rest safe to let run unattended.

find_duplicates
Propose pairs of records that look like the same record, ranked by how alike their names are and whether they share a relationship.
merge_companies
Merge a duplicate company into a target.
merge_contacts
Merge a duplicate contact into a target.
link_contact_company
Attach a contact to a company, detach them, or change which company is their primary one.
unmerge
Invert a merge, restoring exactly the references it moved.
archive_record
Archive a company or contact, or restore one with restore=true.
list_recent_changes
Inspect what changed and who changed it: the mutation, the actor, the access path, and the field-level diff.
list_stale_records
Records nobody has touched for a while, quietest first, with how many days each has been quiet.
list_unconfirmed
Values an agent asserted that no person has checked.
revert_change
Compensate a previous field change.

Keep watching

The only tools here that do something when nobody is in the conversation. A watch is a question the workspace asks itself on a clock and reports when the answer moves, which is how it can tell you about something that did NOT happen.

create_watch
Save a question to be asked on a clock, and told to whoever subscribes when the answer moves.
list_watches
Every question this workspace asks itself on a clock, with what each last counted and when it last had something to say.
stop_watch
Stop asking a saved question.

The catalogue is fixed, so an agent that learned it once keeps working. Nothing here gets renamed underneath you, and it stays the same size whatever your workspace looks like: the four object tools take a type you declared rather than one tool appearing per type.

No back door

MCP is not a privileged path

Tools reach storage through the same domain layer the REST API and the web application use, and pass the same authorization checks. A read-only grant is not offered the write tools, and is refused if it calls one anyway.

So adding a second agent does not mean a second set of permissions to keep track of. It gets exactly what the person who authorized it has.

  • A grant never exceeds its human. The role is read from your identity provider at request time, so a demotion applies to the next call rather than whenever a token happens to expire.
  • Revocation is immediate. Checked per request against the connection, not left to a token lifetime.

Next

Connect the agent you already run

The free plan is enough to see what your agent builds. If it is Claude, start here. If you are writing your own service, the REST API covers the same ground.

What it costs to connect another one

Nothing. Agents are not the meter, and a workspace holds several connections on every plan including the free one.