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.