From airtable
Audits Airtable bases for field health (unused fields, fill rates, duplicates), performance (records, attachments, formulas), and schema quality, providing A-F scores and recommendations.
npx claudepluginhub ebbe-method/airtable-skills --plugin airtableThis skill uses the workspace's default tool permissions.
You are an expert at analyzing Airtable bases for health issues. Help users identify problems across field usage, performance, and schema design.
Explains Airtable data model including bases, tables, fields, records, views, automations, and interfaces. Use when Airtable context is needed.
Automates Airtable CRUD operations on records, bases, tables, fields, and views via Composio toolkit and Rube MCP. Requires active connections for schema-aware workflows.
Automates Airtable CRUD on records, bases, tables, fields, views via Rube MCP (Composio) tools. Lists schemas, filters records; requires prior tool search and active connection.
Share bugs, ideas, or general feedback.
You are an expert at analyzing Airtable bases for health issues. Help users identify problems across field usage, performance, and schema design.
/airtable-base-auditThis skill performs comprehensive base health analysis:
Produces a letter grade (A-F) with percentage breakdown and actionable recommendations.
Ask the user's plan to set correct limits:
What Airtable plan are you on?
1. Teams (50K records/base, 20GB attachments)
2. Business (125K records/base, 100GB attachments)
3. Enterprise (500K records/base, 1TB attachments)
4. I don't know (will use Business defaults)
| Plan | Records/Base | Attachment Storage |
|---|---|---|
| Teams | 50,000 | 20GB |
| Business | 125,000 | 100GB |
| Enterprise | 500,000 | 1TB |
List available bases and let user choose:
# Get bases using MCP
mcp__airtable__list_bases
Present numbered list:
Which base would you like to audit?
1. Projects (appXXX)
2. CRM (appYYY)
3. Inventory (appZZZ)
# Get all tables
mcp__airtable__list_tables
baseId: "appXXX"
detailLevel: "fullSchema"
# For each table, get detailed field info
mcp__airtable__describe_table
baseId: "appXXX"
tableId: "tblXXX"
To calculate fill rates and uniqueness, sample records from each table:
# Sample records (first 100-1000 depending on table size)
mcp__airtable__list_records
baseId: "appXXX"
tableIdOrName: "tblXXX"
maxRecords: 100
For large tables (>1000 records), sample in chunks to get representative data.
Airtable API has a 5 requests/second limit. For bases with many tables:
Analyzing "Projects" base...
- Fetching tables (5 found)
- Analyzing fields (47 total)
- Tasks: 24 fields, sampling records...
- Milestones: 12 fields, sampling records...
- ...
- Checking performance metrics
- Evaluating schema patterns
Detection: Field has no data in any sampled records.
fill_rate = (records_with_value / total_records) * 100
unused = fill_rate === 0
Severity: Warning (may be new field or intentionally empty)
Auto-Fix: Can hide field (reversible)
Detection: Field has data in less than 10% of records.
Severity: Info (flag for review)
Auto-Fix: None (requires human judgment)
Detection: Fields with names containing "email", "id", "key", "code" should have high uniqueness.
uniqueness = (unique_values / total_non_empty_values) * 100
Expected uniqueness:
Severity: Warning if below threshold
Auto-Fix: None (data quality issue)
Detection: Field name contains "(copy)" - indicates UI duplication never renamed.
/\(copy\)/i.test(fieldName)
Severity: Warning
Auto-Fix: Suggest rename (removing "(copy)")
Detection: Same non-trivial values appearing across multiple fields or tables.
Look for:
Severity: Info (may be intentional)
Auto-Fix: None (requires schema redesign)
usage_percent = (record_count / plan_limit) * 100
Thresholds:
90%: Critical
Note: Attachment size cannot be directly queried via API. Estimate by:
Thresholds: Same as record count
Detection: Search formula fields for performance-impacting functions.
// Flag these in formulas
/TODAY\(\)/i
/NOW\(\)/i
Why it matters: These formulas recalculate on every base load, causing performance issues at scale.
Severity: Warning (suggest alternatives)
Alternatives to suggest:
Detection: Formula text longer than 500 characters.
Severity: Info (may indicate formula should be split or simplified)
Detection: Lookups that reference other lookups, or rollups of lookups.
Severity: Warning (performance impact, harder to debug)
Detection: Same text values appearing in multiple tables without linked records.
Example: "Acme Corp" appears as text in Contacts, Projects, and Invoices tables.
Recommendation: Create a Companies table and link to it.
Severity: Warning
Detection: Table has >10 single-select fields.
Severity: Info
Recommendation: Consider grouping related selects or extracting to separate table.
Detection: Data patterns suggesting need for linked records:
Severity: Info
Detection: Many-to-many relationship patterns without junction table.
Look for:
Severity: Info
Detection: Fields that could be lookups instead of duplicated data.
Example: "Client Email" in Projects table when there's already a Client link field.
Severity: Info
// Weight by category
fieldHealthWeight = 0.35;
performanceWeight = 0.35;
schemaQualityWeight = 0.30;
// Each category scores 0-100
overallScore = (fieldHealth * fieldHealthWeight) +
(performance * performanceWeight) +
(schemaQuality * schemaQualityWeight);
Deduct points for issues:
Field Health (100 base):
Performance (100 base):
Schema Quality (100 base):
10 single-selects: -5
| Score | Grade |
|---|---|
| 90-100 | A |
| 80-89 | B |
| 70-79 | C |
| 60-69 | D |
| <60 | F |
═══════════════════════════════════════════════
Base Health Report: [Base Name]
═══════════════════════════════════════════════
Overall Score: [Grade] ([Score]/100)
📊 Field Health: [Grade] ([Score]/100)
✓ [N] fields analyzed
✓ [N] fields have good fill rates (>10%)
⚠ [N] fields with <10% fill rate
⚠ [N] fields appear unused (0% fill)
⚠ "[Field Name]" should be renamed (has "(copy)")
ℹ "[Field]" field: [N]% unique (good!/needs review)
📈 Performance: [Grade] ([Score]/100)
✓ [N] records ([N]% of [Limit] limit)
⚠ [N] formulas use TODAY() - consider alternatives
⚠ [N] complex formulas (>[N] chars)
⚠ Attachment storage approaching limit
🔗 Schema Quality: [Grade] ([Score]/100)
⚠ "[Value]" repeated in [N] tables - consider linked record
⚠ [Table] has [N] single-select fields
💡 Consider extracting "[Pattern]" to separate table
───────────────────────────────────────────────
Safe fixes available:
• Hide [N] unused fields
How would you like to proceed?
[1] Apply safe fixes
[2] Export full report
[3] View detailed recommendations
═══════════════════════════════════════════════
Safe fixes are low-risk, reversible changes:
Can auto-fix:
Cannot auto-fix (too risky):
Applying safe fixes...
✓ Hidden "Old Status" in Tasks (was unused)
✓ Hidden "Notes Backup" in Projects (was unused)
Done! 2 fields hidden.
Note: Hidden fields can be restored via Field menu → "Show hidden fields"
Generate detailed markdown report:
# Base Health Audit Report
**Base:** [Name]
**Generated:** [Date]
**Plan:** [Plan Type]
## Summary
| Category | Score | Grade |
|----------|-------|-------|
| Overall | [N]/100 | [Grade] |
| Field Health | [N]/100 | [Grade] |
| Performance | [N]/100 | [Grade] |
| Schema Quality | [N]/100 | [Grade] |
## Field Health Issues
### Unused Fields (0% fill rate)
| Table | Field | Type | Recommendation |
|-------|-------|------|----------------|
| Tasks | Old Status | Single Select | Hide or delete |
| ... | ... | ... | ... |
### Low Fill Rate Fields (<10%)
| Table | Field | Fill Rate | Recommendation |
|-------|-------|-----------|----------------|
| ... | ... | ... | ... |
### Fields Needing Rename
| Table | Current Name | Suggested Name |
|-------|--------------|----------------|
| Tasks | Status (copy) | [User decides] |
## Performance Issues
### TODAY() Formulas
| Table | Field | Formula | Alternative |
|-------|-------|---------|-------------|
| Tasks | Days Open | TODAY()-{Created} | Use automation to update daily |
### Complex Formulas
| Table | Field | Length | Recommendation |
|-------|-------|--------|----------------|
| ... | ... | ... | Consider splitting |
## Schema Quality Issues
### Repeated Data
| Value | Found In | Recommendation |
|-------|----------|----------------|
| "Acme Corp" | Contacts, Projects, Invoices | Create Companies table with links |
### Relationship Opportunities
| Pattern | Tables | Suggestion |
|---------|--------|------------|
| Company Name | Contacts, Projects | Link to shared Companies table |
## Manual Action Checklist
- [ ] Review and delete/keep unused fields
- [ ] Rename "(copy)" fields appropriately
- [ ] Replace TODAY() formulas with alternatives
- [ ] Consider schema changes for repeated data
Interactive drill-down for each issue:
Issue 1 of [N]: TODAY() Formula in "Days Open"
📍 Location: Tasks table → Days Open field
📝 Current formula: TODAY()-{Created}
⚠ Why this matters:
TODAY() recalculates every time the base loads.
With [N] records, this causes noticeable slowdown.
💡 Recommended alternatives:
1. Automation approach:
- Create a "Days Open Snapshot" number field
- Set up daily automation to update: TODAY()-{Created}
- Runs once per day instead of on every load
2. Script approach:
- Run a script weekly to update stale values
- Better for bases with less frequent access
3. Keep as-is:
- Acceptable if real-time accuracy is critical
- Consider if <1000 records
Would you like step-by-step instructions for any approach?
[1] Automation setup
[2] Script setup
[3] Skip to next issue
Airtable MCP tools not available. To use this skill:
Option 1: Configure Airtable MCP
- Add AIRTABLE_PAT to your environment
- Restart Claude Code
Option 2: Manual audit (limited)
- Open your base in Airtable
- Go to Help → API documentation
- Share field lists for analysis
For bases with >20 tables or >100 fields:
This base has [N] tables and [N] fields.
A full audit may take several minutes.
How would you like to proceed?
1. Full audit (recommended for first-time)
2. Quick scan (field health only)
3. Audit specific tables
⚠ Unable to access some tables. You may need:
- schema.bases:read scope on your token
- Access permissions to all tables
Continuing with accessible tables...
Consider running both for comprehensive base maintenance:
/airtable-base-audit first for overall health/airtable-field-audit after for naming cleanup