
Security News
MCP Steering Committee Launches Official MCP Registry in Preview
The MCP Steering Committee has launched the official MCP Registry in preview, a central hub for discovering and publishing MCP servers.
@skynetxbt/flow-airtable
Advanced tools
A comprehensive Airtable integration flow for SkynetXBT that provides full CRUD (Create, Read, Update, Delete) operations with advanced filtering, sorting, and data manipulation capabilities.
npm install @skynetxbt/flow-airtable
Set the following environment variables:
AIRTABLE_API_KEY=your_airtable_api_key
AIRTABLE_BASE_ID=your_airtable_base_id
import AirtableFlow from '@skynetxbt/flow-airtable';
// Initialize with environment variables
const airtableFlow = new AirtableFlow();
// Or initialize with explicit credentials
const airtableFlow = new AirtableFlow({
apiKey: 'your-api-key',
baseId: 'your-base-id'
});
// Read all records from a table
const result = await airtableFlow.readAll('Customers', {
maxRecords: 100,
sort: [{ field: 'Name', direction: 'asc' }]
});
console.log(result.data); // Array of records
console.log(result.recordCount); // Number of records returned
// Filter active customers in New York
const result = await airtableFlow.readWithFilter(
'Customers',
"AND({Status} = 'Active', {City} = 'New York')",
{ maxRecords: 50 }
);
// Filter using helper methods
import { AirtableFormulas } from '@skynetxbt/flow-airtable';
const filter = AirtableFormulas.and(
AirtableFormulas.exactMatch('Status', 'Active'),
AirtableFormulas.exactMatch('City', 'New York')
);
const result = await airtableFlow.readWithFilter('Customers', filter);
// Date range filter
const dateFilter = "AND(IS_AFTER({Created}, '2024-01-01'), IS_BEFORE({Created}, '2024-12-31'))";
// Numeric range filter
const priceFilter = "AND({Price} >= 100, {Price} <= 500)";
// Text search filter
const searchFilter = "SEARCH('premium', LOWER({Product Name}))";
// Multiple conditions
const complexFilter = `
AND(
OR({Status} = 'Pending', {Status} = 'Processing'),
{Amount} > 100,
NOT({Customer} = '')
)
`;
// Create a single record
const result = await airtableFlow.create('Customers', {
'Name': 'John Doe',
'Email': 'john@example.com',
'Status': 'Active',
'City': 'San Francisco'
});
console.log(result.recordId); // ID of created record
// Update an existing record
const result = await airtableFlow.update('Customers', 'recXXXXXXXXXXXXXX', {
'Status': 'Inactive',
'Notes': 'Customer requested deactivation'
});
// Delete a record
const result = await airtableFlow.delete('Customers', 'recXXXXXXXXXXXXXX');
// Create a flow with predefined operations
const customerReaderFlow = new AirtableFlow({
operation: {
action: 'read',
tableName: 'Customers',
filterByFormula: "AND({Status} = 'Active', {City} = '${{input}}')",
maxRecords: 10
}
});
// Execute with dynamic input
const context = {
agentId: { generation: 0, familyCode: "", serialNumber: "" },
userPublicKey: "user123",
message: "New York", // This replaces ${{input}} in the filter
variables: {}
};
const result = await customerReaderFlow.execute(context);
import { AirtableFormulas, AirtableFilters } from '@skynetxbt/flow-airtable';
// Use built-in filter presets
const activeCustomersFilter = AirtableFilters.activeCustomers();
const recentOrdersFilter = AirtableFilters.recentOrders();
const highValueOrdersFilter = AirtableFilters.highValueOrders(1000);
// Create custom filters with formula helpers
const customFilter = AirtableFormulas.and(
AirtableFormulas.exactMatch('Status', 'Active'),
AirtableFormulas.textSearch('Name', 'john'),
AirtableFormulas.numericRange('Age', 25, 65)
);
// Use the filters
const result = await airtableFlow.readWithFilter('Customers', customFilter);
// Create multiple records
const customers = [
{ 'Name': 'Alice Johnson', 'Email': 'alice@example.com' },
{ 'Name': 'Bob Wilson', 'Email': 'bob@example.com' },
{ 'Name': 'Carol Brown', 'Email': 'carol@example.com' }
];
const createdRecords = [];
for (const customer of customers) {
const result = await airtableFlow.create('Customers', customer);
if (result.success) {
createdRecords.push(result);
}
}
The flow includes comprehensive TypeScript types:
import {
AirtableOperation,
AirtableResponse,
CustomerFields,
OrderFields,
ProductFields,
AirtableFormulas,
AirtableFilters
} from '@skynetxbt/flow-airtable';
// Use typed field definitions
const customer: CustomerFields = {
'Name': 'John Doe',
'Email': 'john@example.com',
'Status': 'Active'
};
try {
const result = await airtableFlow.readAll('Customers');
if (result.success) {
console.log('Data:', result.data);
} else {
console.error('Error:', result.error);
}
} catch (error) {
console.error('Exception:', error.message);
}
// Get all active customers
const activeCustomers = await airtableFlow.readWithFilter(
'Customers',
AirtableFilters.activeCustomers()
);
// Create new customer
const newCustomer = await airtableFlow.create('Customers', {
'Name': 'Jane Smith',
'Email': 'jane@example.com',
'Status': 'Active'
});
// Get recent high-value orders
const filter = AirtableFormulas.and(
AirtableFilters.recentOrders(),
AirtableFilters.highValueOrders(500)
);
const orders = await airtableFlow.readWithFilter('Orders', filter);
// Update order status
await airtableFlow.update('Orders', orderId, {
'Status': 'Shipped',
'Tracking Number': 'TRK123456789'
});
// Get low stock products
const lowStockFilter = "{In Stock} <= {Reorder Level}";
const lowStockProducts = await airtableFlow.readWithFilter('Products', lowStockFilter);
// Update stock levels
await airtableFlow.update('Products', productId, {
'In Stock': newStockLevel,
'Last Updated': new Date().toISOString()
});
readAll(tableName, options?)
: Read all records from a tablereadWithFilter(tableName, filter, options?)
: Read records with filtercreate(tableName, fields)
: Create a new recordupdate(tableName, recordId, fields)
: Update an existing recorddelete(tableName, recordId)
: Delete a recordexecute(context)
: Execute with FlowContext (for use in flow system)AirtableOperation
: Operation configuration interfaceAirtableResponse
: Response format interfaceCustomerFields
, OrderFields
, ProductFields
: Common field type definitionsAirtableFormulas
: Static class with formula helper methodsAirtableFilters
: Static class with common filter presetsContributions are welcome! Please read the contributing guidelines and submit pull requests for any improvements.
MIT License - see LICENSE file for details.
FAQs
Airtable integration for Skynet
We found that @skynetxbt/flow-airtable demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
The MCP Steering Committee has launched the official MCP Registry in preview, a central hub for discovering and publishing MCP servers.
Product
Socket’s new Pull Request Stories give security teams clear visibility into dependency risks and outcomes across scanned pull requests.
Research
/Security News
npm author Qix’s account was compromised, with malicious versions of popular packages like chalk-template, color-convert, and strip-ansi published.