airtable
airtable.
A row in an Airtable table: list, read, create, update, upsert, delete.
setup & usage
⚠ personal access token airtable
crée un personal access token sur airtable.com/create/tokens, puis colle-le dans oto (il commence par pat…).
1. scopes : data.records:read + data.records:write, data.recordComments:read + data.recordComments:write, schema.bases:read + schema.bases:write
2. access : ajouter explicitement chaque base (ou le workspace entier) que le token doit voir
200 avec une liste vide, jamais une erreur : le bouton « tester la connexion » d'oto le détecte et le dit▸ lire et écrire dans une base
airtable_base() (rend les appXXXXXXXX — le point de départ de tout le reste)airtable_table(base_id="app…") (tables, champs, types, options, vues)airtable_field(base_id="app…", table_id="tbl…")airtable_record(base_id="app…", table="tbl…", filter_by_formula="{Status}='Done'")airtable_record(op="create", records=[{"Nom": "…", "Email": "…"}, …]) (découpé en lots de 10 tout seul)airtable_record(op="upsert", records=[…], merge_on=["Email"])airtable_record(op="update", record_id="rec…", fields={"Statut": "Signé"})airtable_comment(op="create", base_id=…, table=…, record_id=…, text="relance envoyée")airtable_attachment(base_id=…, record_id=…, field="Pièces jointes", filename="devis.pdf", content_type="application/pdf", file_base64=…)airtable_table(op="create", name="Suivi", fields=[{"name": "Nom", "type": "singleLineText"}, {"name": "Statut", "type": "singleSelect", "options": {"choices": [{"name": "À faire"}, {"name": "Fait"}]}}])· noms vs identifiants, typecast, lots
tbl…, fld… sont stables ; un nom de table ou de colonne change dès que quelqu'un le renomme dans l'interface, et l'automatisation casse en silence. airtable_table et airtable_field rendent les identifiants.typecast=True quand on VEUT ce comportement.aborted: "rate_limit" et le nombre de lignes réellement écrites — relancer 30 secondes plus tard avec le reste.airtable_record suit la pagination jusqu'à max_records (100 par défaut) et pose more: true + offset s'il reste des lignes. rien n'est tronqué en silence.airtable_record(op="update", fields={"Pièces jointes": [{"url": "https://…"}]}). airtable va le chercher lui-même.airtable_record(op="create").DELETE de champ (404), pas de suppression de table, et un PATCH de champ portant options est refusé (422 « Changing a field's type or number precision is not currently supported »). concrètement : une option de select créée par erreur avec typecast=True ne se retire QUE dans l'interface Airtable. une raison de plus de laisser typecast à faux.airtable_base(op="create") n'a pas de réciproque, ça se fait dans l'interface.outils
chargement…
utilisation
claude code — installe le plugin oto —
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.cli —
pipx install oto-cli puis oto airtable …