Universal Tools Migration Guide
October 1, 2025 · View on GitHub
This guide helps you migrate from deprecated resource-specific tools to the new universal tool system. The universal tools consolidate 40+ individual tools into 13 powerful operations while maintaining full functionality.
Migration Overview
What Changed?
- Tool Count: Reduced from 40+ tools to 13 universal operations (68% reduction)
- Parameter Structure: Added
resource_typeparameter to specify target resource - Naming: Simplified tool names (e.g.,
search-companies→records.search) - Date Operators: Updated for Attio API compatibility
Benefits
- Consistent API: Same patterns across all resource types
- Better Performance: Fewer tools for AI systems to evaluate
- Future-Proof: Easy to add new resource types without new tools
Complete Tool Migration Reference
Company Tools → Universal Equivalents
| Deprecated Tool | Universal Tool | Resource Type | Additional Parameters |
|---|---|---|---|
search-companies | records.search | companies | - |
get-company-details | records.get_details | companies | - |
create-company | create-record | companies | - |
update-company | update-record | companies | - |
delete-company | delete-record | companies | - |
get-company-attributes | records.get_attributes | companies | - |
discover-company-attributes | records.discover_attributes | companies | - |
get-company-basic-info | records.get_info | companies | info_type: 'basic' |
get-company-contact-info | records.get_info | companies | info_type: 'contact' |
get-company-business-info | records.get_info | companies | info_type: 'business' |
get-company-social-info | records.get_info | companies | info_type: 'social' |
records.search_advanced-companies | records.search_advanced | companies | - |
search-companies-by-notes | records.search_by_content | companies | content_type: 'notes' |
search-companies-by-people | records.search_by_relationship | companies | relationship_type: 'people_to_company' |
People Tools → Universal Equivalents
| Deprecated Tool | Universal Tool | Resource Type | Additional Parameters |
|---|---|---|---|
search-people | records.search | people | - |
get-person-details | records.get_details | people | - |
create-person | create-record | people | - |
records.search_advanced-people | records.search_advanced | people | - |
search-people-by-company | records.search_by_relationship | people | relationship_type: 'company_to_people' |
search-people-by-activity | records.search_by_content | people | content_type: 'activity' |
search-people-by-notes | records.search_by_content | people | content_type: 'notes' |
search-people-by-creation-date | records.search_by_timeframe | people | timeframe_type: 'created' |
search-people-by-modification-date | records.search_by_timeframe | people | timeframe_type: 'modified' |
search-people-by-last-interaction | records.search_by_timeframe | people | timeframe_type: 'last_interaction' |
Record Tools → Universal Equivalents
| Deprecated Tool | Universal Tool | Resource Type | Additional Parameters |
|---|---|---|---|
create-record | create-record | records | Already universal |
get-record | records.get_details | records | - |
update-record | update-record | records | Already universal |
delete-record | delete-record | records | Already universal |
list-records | records.search | records | - |
batch-create-records | records.batch | records | operation_type: 'create' |
batch-update-records | records.batch | records | operation_type: 'update' |
Task Tools → Universal Equivalents
| Deprecated Tool | Universal Tool | Resource Type | Additional Parameters |
|---|---|---|---|
create-task | create-record | tasks | - |
update-task | update-record | tasks | - |
delete-task | delete-record | tasks | - |
list-tasks | records.search | tasks | - |
Batch Tools → Universal Equivalents
| Deprecated Tool | Universal Tool | Resource Type | Additional Parameters |
|---|---|---|---|
batch-create-companies | records.batch | companies | operation_type: 'create' |
batch-update-companies | records.batch | companies | operation_type: 'update' |
batch-delete-companies | records.batch | companies | operation_type: 'delete' |
records.search_batch-companies | records.batch | companies | operation_type: 'search' |
batch-get-company-details | records.batch | companies | operation_type: 'get' |
Visual Migration Comparison
🎯 Quick Before/After Reference
| ❌ Before (Deprecated) | ✅ After (Universal) | Key Changes |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Step-by-Step Migration Examples
Example 1: Basic Company Search
| ❌ Before (Deprecated) | ✅ After (Universal) |
|---|---|
|
|
|
Migration Steps:
|
|
Example 2: Advanced People Search with Filters
| ❌ Before (Deprecated) | ✅ After (Universal) |
|---|---|
|
|
|
Migration Steps:
|
|
Example 3: Company Information Retrieval
| ❌ Before (Deprecated) | ✅ After (Universal) |
|---|---|
|
|
|
Migration Steps:
|
|
Example 4: Batch Company Operations
| ❌ Before (Deprecated) | ✅ After (Universal) |
|---|---|
|
|
|
Migration Steps:
|
|
Example 5: Date-Based Searches
| ❌ Before (Deprecated) | ✅ After (Universal) |
|---|---|
|
|
|
Migration Steps:
|
|
Example 6: Content and Relationship Searches
| ❌ Before (Deprecated) | ✅ After (Universal) |
|---|---|
|
|
|
Migration Steps:
|
|
Example 2: People Search by Company
Before (deprecated):
await client.callTool('search-people-by-company', {
company_id: 'comp_123',
limit: 20,
});
After (universal):
await client.callTool('records.search_by_relationship', {
relationship_type: 'company_to_people',
source_id: 'comp_123',
limit: 20,
});
Example 3: Company Info Retrieval
Before (deprecated):
await client.callTool('get-company-contact-info', {
record_id: 'comp_123',
});
After (universal):
await client.callTool('records.get_info', {
resource_type: 'companies',
record_id: 'comp_123',
info_type: 'contact',
});
Example 4: Batch Company Creation
Before (deprecated):
await client.callTool('batch-create-companies', {
companies: [
{ name: 'Company A', domain: 'companya.com' },
{ name: 'Company B', domain: 'companyb.com' },
],
});
After (universal):
await client.callTool('records.batch', {
resource_type: 'companies',
operation_type: 'create',
records: [
{ name: 'Company A', domain: 'companya.com' },
{ name: 'Company B', domain: 'companyb.com' },
],
});
Example 5: Time-based People Search
Before (deprecated):
await client.callTool('search-people-by-creation-date', {
start_date: '2024-01-01T00:00:00Z',
end_date: '2024-01-31T23:59:59Z',
});
After (universal):
await client.callTool('records.search_by_timeframe', {
resource_type: 'people',
timeframe_type: 'created',
start_date: '2024-01-01T00:00:00Z',
end_date: '2024-01-31T23:59:59Z',
});
Breaking Changes and Important Updates
1. Date Filtering Operators ⚠️
The date operators have changed for Attio API compatibility:
❌ OLD (will cause API errors):
{
condition: 'greater_than_or_equals', // ❌ Invalid
condition: 'less_than_or_equals' // ❌ Invalid
}
✅ NEW (correct):
{
condition: 'after', // ✅ Use instead of greater_than_or_equals
condition: 'before' // ✅ Use instead of less_than_or_equals
}
2. Valid Date Presets
Only these date presets are valid:
✅ Valid presets:
('today',
'yesterday',
'this_week',
'last_week',
'this_month',
'last_month',
'this_quarter',
'last_quarter',
'this_year',
'last_year');
❌ Invalid preset:
'last_30_days'; // Will throw validation error
3. Query Parameter Requirements
- Universal tool queries cannot be empty strings
- Batch operations require meaningful search queries
- Use specific search terms, not empty or generic values
❌ Invalid:
{
resource_type: 'companies',
query: '' // Empty string not allowed
}
✅ Valid:
{
resource_type: 'companies',
query: 'tech startup' // Meaningful search term
}
Migration Automation
Using getMigrationParams Utility
The universal tools system includes a utility function to help with migration:
import {
getMigrationParams,
getUniversalEquivalent,
} from './universal/index.js';
// Get the universal tool equivalent
const universalTool = getUniversalEquivalent('search-companies');
// Returns: 'records.search'
// Get migration parameters
const newParams = getMigrationParams('search-companies', {
query: 'tech startup',
limit: 10,
});
// Returns: { resource_type: 'companies', query: 'tech startup', limit: 10 }
Validation and Testing
Testing Your Migration
- Parameter Validation: Ensure all required parameters are included
- Resource Type: Verify correct
resource_typevalues - Date Operators: Use
after/beforeinstead of old operators - Query Requirements: Provide meaningful search queries
Common Migration Errors
// ❌ Missing resource_type
await client.callTool('records.search', {
query: 'tech startup', // Missing resource_type parameter
});
// ✅ Correct migration
await client.callTool('records.search', {
resource_type: 'companies',
query: 'tech startup',
});
Next Steps
- Update your tool calls using the migration table above
- Test your changes with the new universal tools
- Review the API Reference for detailed parameter schemas
- Check Troubleshooting if you encounter issues
Need Help?
- Common errors: See Troubleshooting
- API details: Check API Reference
- Usage examples: Review User Guide
- Issues: Create a GitHub issue for support