Skip to content

Commit 37cc501

Browse files
waleedlatif1claude
andcommitted
feat(agiloft): add Agiloft CLM integration with token-based auth
Add 12 tools (CRUD, search, select, saved search, attachments, lock), block, icon, docs, and internal API route for file attachments. Uses EWLogin/EWLogout for short-lived Bearer tokens — credentials are never embedded in API request URLs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent eba48e8 commit 37cc501

File tree

27 files changed

+2902
-1
lines changed

27 files changed

+2902
-1
lines changed

apps/docs/components/icons.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4835,6 +4835,17 @@ export function WordpressIcon(props: SVGProps<SVGSVGElement>) {
48354835
)
48364836
}
48374837

4838+
export function AgiloftIcon(props: SVGProps<SVGSVGElement>) {
4839+
return (
4840+
<svg {...props} viewBox='0 0 47.3 47.2' xmlns='http://www.w3.org/2000/svg'>
4841+
<path d='M47.3,21.4H0v-4.3l4.3-4.2h43V21.4z' fill='#263A5C' />
4842+
<path d='M47.3,8.6H8.6L17.2,0h30.1V8.6z' fill='#001028' />
4843+
<path d='M0,25.7h47.3V30L43,34.4H0V25.7z' fill='#4A6587' />
4844+
<path d='M0,38.7h38.8l-8.6,8.5H0V38.7z' fill='#6D8DAF' />
4845+
</svg>
4846+
)
4847+
}
4848+
48384849
export function AhrefsIcon(props: SVGProps<SVGSVGElement>) {
48394850
return (
48404851
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1065 1300'>

apps/docs/components/ui/icon-mapping.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { ComponentType, SVGProps } from 'react'
66
import {
77
A2AIcon,
88
AgentMailIcon,
9+
AgiloftIcon,
910
AhrefsIcon,
1011
AirtableIcon,
1112
AirweaveIcon,
@@ -197,6 +198,7 @@ type IconComponent = ComponentType<SVGProps<SVGSVGElement>>
197198
export const blockTypeToIconMap: Record<string, IconComponent> = {
198199
a2a: A2AIcon,
199200
agentmail: AgentMailIcon,
201+
agiloft: AgiloftIcon,
200202
ahrefs: AhrefsIcon,
201203
airtable: AirtableIcon,
202204
airweave: AirweaveIcon,
Lines changed: 332 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,332 @@
1+
---
2+
title: Agiloft
3+
description: Manage records in Agiloft CLM
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="agiloft"
10+
color="#263A5C"
11+
/>
12+
13+
{/* MANUAL-CONTENT-START:intro */}
14+
[Agiloft](https://www.agiloft.com/) is an enterprise contract lifecycle management (CLM) platform that helps organizations automate and manage contracts, agreements, and related business processes across any knowledge base.
15+
16+
With the Agiloft integration in Sim, you can:
17+
18+
- **Create records**: Add new records to any Agiloft table with custom field values
19+
- **Read records**: Retrieve individual records by ID with optional field selection
20+
- **Update records**: Modify existing record fields in any table
21+
- **Delete records**: Remove records from your knowledge base
22+
- **Search records**: Find records using Agiloft's query syntax with pagination support
23+
- **Select records**: Query records using SQL WHERE clauses for advanced filtering
24+
- **Saved searches**: List saved search definitions available for a table
25+
- **Attach files**: Upload and attach files to record fields
26+
- **Retrieve attachments**: Download attached files from record fields
27+
- **Remove attachments**: Delete attached files from record fields by position
28+
- **Attachment info**: Get metadata about all files attached to a record field
29+
- **Lock records**: Check, acquire, or release locks on records for concurrent editing
30+
31+
In Sim, the Agiloft integration enables your agents to manage contracts and records programmatically as part of automated workflows. Agents can create and update records, search across tables, handle file attachments, and manage record locks — enabling intelligent contract lifecycle automation.
32+
{/* MANUAL-CONTENT-END */}
33+
34+
35+
## Usage Instructions
36+
37+
Integrate with Agiloft contract lifecycle management to create, read, update, delete, and search records. Supports file attachments, SQL-based selection, saved searches, and record locking across any table in your knowledge base.
38+
39+
40+
41+
## Tools
42+
43+
### `agiloft_attach_file`
44+
45+
Attach a file to a field in an Agiloft record.
46+
47+
#### Input
48+
49+
| Parameter | Type | Required | Description |
50+
| --------- | ---- | -------- | ----------- |
51+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
52+
| `knowledgeBase` | string | Yes | Knowledge base name |
53+
| `login` | string | Yes | Agiloft username |
54+
| `password` | string | Yes | Agiloft password |
55+
| `table` | string | Yes | Table name \(e.g., "contracts"\) |
56+
| `recordId` | string | Yes | ID of the record to attach the file to |
57+
| `fieldName` | string | Yes | Name of the attachment field |
58+
| `file` | file | No | File to attach |
59+
| `fileName` | string | No | Name to assign to the file \(defaults to original file name\) |
60+
61+
#### Output
62+
63+
| Parameter | Type | Description |
64+
| --------- | ---- | ----------- |
65+
| `recordId` | string | ID of the record the file was attached to |
66+
| `fieldName` | string | Name of the field the file was attached to |
67+
| `fileName` | string | Name of the attached file |
68+
| `totalAttachments` | number | Total number of files attached in the field after the operation |
69+
70+
### `agiloft_attachment_info`
71+
72+
Get information about file attachments on a record field.
73+
74+
#### Input
75+
76+
| Parameter | Type | Required | Description |
77+
| --------- | ---- | -------- | ----------- |
78+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
79+
| `knowledgeBase` | string | Yes | Knowledge base name |
80+
| `login` | string | Yes | Agiloft username |
81+
| `password` | string | Yes | Agiloft password |
82+
| `table` | string | Yes | Table name \(e.g., "contracts"\) |
83+
| `recordId` | string | Yes | ID of the record to check attachments on |
84+
| `fieldName` | string | Yes | Name of the attachment field to inspect |
85+
86+
#### Output
87+
88+
| Parameter | Type | Description |
89+
| --------- | ---- | ----------- |
90+
| `attachments` | array | List of attachments with position, name, and size |
91+
|`position` | number | Position index of the attachment in the field |
92+
|`name` | string | File name of the attachment |
93+
|`size` | number | File size in bytes |
94+
| `totalCount` | number | Total number of attachments in the field |
95+
96+
### `agiloft_create_record`
97+
98+
Create a new record in an Agiloft table.
99+
100+
#### Input
101+
102+
| Parameter | Type | Required | Description |
103+
| --------- | ---- | -------- | ----------- |
104+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
105+
| `knowledgeBase` | string | Yes | Knowledge base name |
106+
| `login` | string | Yes | Agiloft username |
107+
| `password` | string | Yes | Agiloft password |
108+
| `table` | string | Yes | Table name \(e.g., "contracts", "contacts.employees"\) |
109+
| `data` | string | Yes | Record field values as a JSON object \(e.g., \{"first_name": "John", "status": "Active"\}\) |
110+
111+
#### Output
112+
113+
| Parameter | Type | Description |
114+
| --------- | ---- | ----------- |
115+
| `id` | string | ID of the created record |
116+
| `fields` | json | Field values of the created record |
117+
118+
### `agiloft_delete_record`
119+
120+
Delete a record from an Agiloft table.
121+
122+
#### Input
123+
124+
| Parameter | Type | Required | Description |
125+
| --------- | ---- | -------- | ----------- |
126+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
127+
| `knowledgeBase` | string | Yes | Knowledge base name |
128+
| `login` | string | Yes | Agiloft username |
129+
| `password` | string | Yes | Agiloft password |
130+
| `table` | string | Yes | Table name \(e.g., "contracts", "contacts.employees"\) |
131+
| `recordId` | string | Yes | ID of the record to delete |
132+
133+
#### Output
134+
135+
| Parameter | Type | Description |
136+
| --------- | ---- | ----------- |
137+
| `id` | string | ID of the deleted record |
138+
| `deleted` | boolean | Whether the record was successfully deleted |
139+
140+
### `agiloft_lock_record`
141+
142+
Lock, unlock, or check the lock status of an Agiloft record.
143+
144+
#### Input
145+
146+
| Parameter | Type | Required | Description |
147+
| --------- | ---- | -------- | ----------- |
148+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
149+
| `knowledgeBase` | string | Yes | Knowledge base name |
150+
| `login` | string | Yes | Agiloft username |
151+
| `password` | string | Yes | Agiloft password |
152+
| `table` | string | Yes | Table name \(e.g., "contracts"\) |
153+
| `recordId` | string | Yes | ID of the record to lock, unlock, or check |
154+
| `lockAction` | string | Yes | Action to perform: "lock", "unlock", or "check" |
155+
156+
#### Output
157+
158+
| Parameter | Type | Description |
159+
| --------- | ---- | ----------- |
160+
| `id` | string | Record ID |
161+
| `lockStatus` | string | Lock status \(e.g., "LOCKED", "UNLOCKED"\) |
162+
| `lockedBy` | string | Username of the user who locked the record |
163+
| `lockExpiresInMinutes` | number | Minutes until the lock expires |
164+
165+
### `agiloft_read_record`
166+
167+
Read a record by ID from an Agiloft table.
168+
169+
#### Input
170+
171+
| Parameter | Type | Required | Description |
172+
| --------- | ---- | -------- | ----------- |
173+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
174+
| `knowledgeBase` | string | Yes | Knowledge base name |
175+
| `login` | string | Yes | Agiloft username |
176+
| `password` | string | Yes | Agiloft password |
177+
| `table` | string | Yes | Table name \(e.g., "contracts", "contacts.employees"\) |
178+
| `recordId` | string | Yes | ID of the record to read |
179+
| `fields` | string | No | Comma-separated list of field names to include in the response |
180+
181+
#### Output
182+
183+
| Parameter | Type | Description |
184+
| --------- | ---- | ----------- |
185+
| `id` | string | ID of the record |
186+
| `fields` | json | Field values of the record |
187+
188+
### `agiloft_remove_attachment`
189+
190+
Remove an attached file from a field in an Agiloft record.
191+
192+
#### Input
193+
194+
| Parameter | Type | Required | Description |
195+
| --------- | ---- | -------- | ----------- |
196+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
197+
| `knowledgeBase` | string | Yes | Knowledge base name |
198+
| `login` | string | Yes | Agiloft username |
199+
| `password` | string | Yes | Agiloft password |
200+
| `table` | string | Yes | Table name \(e.g., "contracts"\) |
201+
| `recordId` | string | Yes | ID of the record containing the attachment |
202+
| `fieldName` | string | Yes | Name of the attachment field |
203+
| `position` | string | Yes | Position index of the file to remove \(starting from 0\) |
204+
205+
#### Output
206+
207+
| Parameter | Type | Description |
208+
| --------- | ---- | ----------- |
209+
| `recordId` | string | ID of the record |
210+
| `fieldName` | string | Name of the attachment field |
211+
| `remainingAttachments` | number | Number of attachments remaining in the field after removal |
212+
213+
### `agiloft_retrieve_attachment`
214+
215+
Download an attached file from an Agiloft record field.
216+
217+
#### Input
218+
219+
| Parameter | Type | Required | Description |
220+
| --------- | ---- | -------- | ----------- |
221+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
222+
| `knowledgeBase` | string | Yes | Knowledge base name |
223+
| `login` | string | Yes | Agiloft username |
224+
| `password` | string | Yes | Agiloft password |
225+
| `table` | string | Yes | Table name \(e.g., "contracts"\) |
226+
| `recordId` | string | Yes | ID of the record containing the attachment |
227+
| `fieldName` | string | Yes | Name of the attachment field |
228+
| `position` | string | Yes | Position index of the file in the field \(starting from 0\) |
229+
230+
#### Output
231+
232+
| Parameter | Type | Description |
233+
| --------- | ---- | ----------- |
234+
| `file` | file | Downloaded attachment file |
235+
236+
### `agiloft_saved_search`
237+
238+
List saved searches defined for an Agiloft table.
239+
240+
#### Input
241+
242+
| Parameter | Type | Required | Description |
243+
| --------- | ---- | -------- | ----------- |
244+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
245+
| `knowledgeBase` | string | Yes | Knowledge base name |
246+
| `login` | string | Yes | Agiloft username |
247+
| `password` | string | Yes | Agiloft password |
248+
| `table` | string | Yes | Table name to list saved searches for \(e.g., "contracts"\) |
249+
250+
#### Output
251+
252+
| Parameter | Type | Description |
253+
| --------- | ---- | ----------- |
254+
| `searches` | array | List of saved searches for the table |
255+
|`name` | string | Saved search name |
256+
|`label` | string | Saved search display label |
257+
|`id` | string | Saved search database identifier |
258+
|`description` | string | Saved search description |
259+
260+
### `agiloft_search_records`
261+
262+
Search for records in an Agiloft table using a query.
263+
264+
#### Input
265+
266+
| Parameter | Type | Required | Description |
267+
| --------- | ---- | -------- | ----------- |
268+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
269+
| `knowledgeBase` | string | Yes | Knowledge base name |
270+
| `login` | string | Yes | Agiloft username |
271+
| `password` | string | Yes | Agiloft password |
272+
| `table` | string | Yes | Table name to search in \(e.g., "contracts", "contacts.employees"\) |
273+
| `query` | string | Yes | Search query using Agiloft query syntax \(e.g., "status=\'Active\'" or "company_name~=\'Acme\'"\) |
274+
| `fields` | string | No | Comma-separated list of field names to include in the results |
275+
| `page` | string | No | Page number for paginated results \(starting from 0\) |
276+
| `limit` | string | No | Maximum number of records to return per page |
277+
278+
#### Output
279+
280+
| Parameter | Type | Description |
281+
| --------- | ---- | ----------- |
282+
| `records` | json | Array of matching records with their field values |
283+
| `totalCount` | number | Total number of matching records |
284+
| `page` | number | Current page number |
285+
| `limit` | number | Records per page |
286+
287+
### `agiloft_select_records`
288+
289+
Select record IDs matching a SQL WHERE clause from an Agiloft table.
290+
291+
#### Input
292+
293+
| Parameter | Type | Required | Description |
294+
| --------- | ---- | -------- | ----------- |
295+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
296+
| `knowledgeBase` | string | Yes | Knowledge base name |
297+
| `login` | string | Yes | Agiloft username |
298+
| `password` | string | Yes | Agiloft password |
299+
| `table` | string | Yes | Table name \(e.g., "contracts", "contacts.employees"\) |
300+
| `where` | string | Yes | SQL WHERE clause using database column names \(e.g., "summary like \'%new%\'" or "assigned_person=\'John Doe\'"\) |
301+
302+
#### Output
303+
304+
| Parameter | Type | Description |
305+
| --------- | ---- | ----------- |
306+
| `recordIds` | array | Array of record IDs matching the query |
307+
| `totalCount` | number | Total number of matching records |
308+
309+
### `agiloft_update_record`
310+
311+
Update an existing record in an Agiloft table.
312+
313+
#### Input
314+
315+
| Parameter | Type | Required | Description |
316+
| --------- | ---- | -------- | ----------- |
317+
| `instanceUrl` | string | Yes | Agiloft instance URL \(e.g., https://mycompany.agiloft.com\) |
318+
| `knowledgeBase` | string | Yes | Knowledge base name |
319+
| `login` | string | Yes | Agiloft username |
320+
| `password` | string | Yes | Agiloft password |
321+
| `table` | string | Yes | Table name \(e.g., "contracts", "contacts.employees"\) |
322+
| `recordId` | string | Yes | ID of the record to update |
323+
| `data` | string | Yes | Updated field values as a JSON object \(e.g., \{"status": "Active", "priority": "High"\}\) |
324+
325+
#### Output
326+
327+
| Parameter | Type | Description |
328+
| --------- | ---- | ----------- |
329+
| `id` | string | ID of the updated record |
330+
| `fields` | json | Updated field values of the record |
331+
332+

apps/docs/content/docs/en/tools/meta.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"index",
44
"a2a",
55
"agentmail",
6+
"agiloft",
67
"ahrefs",
78
"airtable",
89
"airweave",

apps/docs/content/docs/en/tools/trello.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ Before connecting Trello in Sim, add your Sim app origin to the **Allowed Origin
3636
Trello's authorization flow redirects back to Sim using a `return_url`. If your Sim origin is not whitelisted in Trello, Trello will block the redirect and the connection flow will fail before Sim can save the token.
3737
{/* MANUAL-CONTENT-END */}
3838

39+
3940
Integrate with Trello to list board lists, list cards, create cards, update cards, review activity, and add comments.
4041

4142

apps/sim/app/(landing)/integrations/data/icon-mapping.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { ComponentType, SVGProps } from 'react'
66
import {
77
A2AIcon,
88
AgentMailIcon,
9+
AgiloftIcon,
910
AhrefsIcon,
1011
AirtableIcon,
1112
AirweaveIcon,
@@ -197,6 +198,7 @@ type IconComponent = ComponentType<SVGProps<SVGSVGElement>>
197198
export const blockTypeToIconMap: Record<string, IconComponent> = {
198199
a2a: A2AIcon,
199200
agentmail: AgentMailIcon,
201+
agiloft: AgiloftIcon,
200202
ahrefs: AhrefsIcon,
201203
airtable: AirtableIcon,
202204
airweave: AirweaveIcon,

0 commit comments

Comments
 (0)