API & Claude
Every tool is the same shape: resources you can list, create, update and delete, settings you can read and change, and a few actions. The web app is built on this API, so anything you can do on screen, Claude can do too.
Connect Claude (MCP)
- Claude app: Settings → Connectors → Add custom connector →
https://tools.ainoova.com/api/mcp→ Connect, sign in, Allow. - Claude Code:
claude mcp add --transport http ainoova https://tools.ainoova.com/api/mcp, then/mcpto sign in. With a key instead: add--header "Authorization: Bearer ainv_…". - Clients without headers:
https://tools.ainoova.com/api/mcp/<api-key>. Treat that URL like a password.
OAuth 2.1 with PKCE and dynamic client registration; metadata at /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource.
describe_toolsStart here. Lists the 10 tools, each resource's fields (with types and allowed values), computed fields, settings, actions, and the user's plan and usage.todayWhat needs the user today across every tool: tasks due or overdue, note reminders, renewals to act on, charges coming, people to catch up with, new form sign-ups, habits left, journal nudge.list_recordsList or search records. Filters are exact matches on fields (tags fields match one tag; booleans true/false); add _before/_after to a date/number field or created_at for ranges. Sort by a field, '-' for descending. Resources: notes: notes | tasks: tasks | later: links | habits: habits, checkins | journal: entries | renewals: items | subs: subs | people: people, touches | forms: forms, submissions | short: links.get_recordFetch one record by id, with its computed fields.create_recordCreate a record. Unknown fields are rejected with the list of valid ones; call describe_tools for field types. Returns the created record.update_recordChange some fields of a record (merge: fields you don't send stay as they are; null clears a field). Logged and undoable.delete_recordMove a record to the trash (restorable with restore_record or undo). permanent=true deletes it for good: only when the user explicitly asked.restore_recordBring a trashed record back.batchUp to 200 create/update/delete operations in one call (each runs on its own; failures are reported per operation). Use for imports and bulk edits.get_settingsCurrent settings of a tool (defaults filled in), or app='account' for time zone and date format.update_settingsChange some settings of a tool (or app='account'). Only the keys you send change. Logged and undoable.run_actionRun a tool-specific action (describe_tools lists their inputs). Actions: notes: quick_capture, labels, rename_label, duplicate, delete_label, attach_image, import_keep, empty_trash | tasks: quick_add, complete, lists | later: surprise | habits: check_in | journal: today, upsert_day, stats | renewals: renew | subs: summary, roll_forward | people: log_touch, due | forms: export_csv, mark_all | short: stats.quick_noteSave a note in Notes from free text. '- item' lines become a checklist; a short first line becomes the title.activityRecent changes with who made them (web, an API key, or Claude) and whether they can be undone.undoUndo one entry of the activity log (restores the previous version, un-trashes, or trashes what was created).REST
Base https://tools.ainoova.com/api/v1, JSON in and out, Authorization: Bearer ainv_… (create keys in Account). Machine-readable: /openapi.json.
GET /apps every tool, field, setting and action
GET /today what needs you today, across tools
GET /{app}/{resource}?q=&sort=&limit=&offset=&trashed=&<field>=&<field>_before=&<field>_after=
POST /{app}/{resource} create
GET /{app}/{resource}/{id}
PATCH /{app}/{resource}/{id} merge: only sent fields change, null clears
DELETE /{app}/{resource}/{id} to the trash (?permanent=true to erase)
POST /{app}/{resource}/{id}/restore
GET /{app}/settings PATCH /{app}/settings
POST /{app}/actions/{action}
POST /batch up to 200 create/update/delete operations
GET /activity POST /activity/{id}/undo
GET /export everything as JSONErrors: { "error": "…", "fields": { "due_date": "is required" } }. 402 means a free-plan limit was reached: reads keep working, Pro removes the limit.
Notes /notes
Quick notes and checklists, like Keep, that Claude can read and tidy.
titlestringTitlebodytextText. Plain text; line breaks are keptkindtext | checklistKinditemslist of {text, done, indent}Checklist items. Used when kind is checklistcolordefault | red | orange | yellow | green | teal | blue | cerulean | purple | pink | brown | grayColourlabelstagsLabelspinnedboolPinnedarchivedboolArchivedreminder_atdatetimeReminder. Notifies on your devices and shows in Today from this momentreminder_repeatnone | daily | weekly | monthly | yearlyRepeat reminderdefault_color (default | red | orange | yellow | green | teal | blue | cerulean | purple | pink | brown | gray)layout (grid | list)new_checklist_items_at (bottom | top)move_checked_to_bottom (bool)labels (tags)quick_captureCreate a note from free text. Lines like '- [ ] milk' or '- milk' become a checklist; a short first line becomes the title.labelsList every label in use with how many active notes carry it.rename_labelRename a label on every note (merge into an existing label if the new name is already used).duplicateMake a copy of a note (same text, checklist, colour, labels and images; not pinned, no reminder).delete_labelRemove a label from every note (the notes stay).attach_imageAttach an image to a note (or start a new image note when note_id is empty). Send the image as base64; JPEG, PNG, WebP or GIF up to 5 MB.import_keepImport notes from a Google Takeout export of Keep. Pass the parsed JSON objects of the .json files (one per note). Trashed notes are skipped; notes already imported are skipped.empty_trashPermanently delete every note in the trash. Cannot be undone.
Tasks /tasks
A to-do list you can type into like a sentence and Claude can work through.
title*stringTasknotestextNotesduedateDueliststringListprioritynone | low | medium | highPrioritystatusopen | doneStatusrecurrencenone | daily | weekdays | weekly | monthly | yearlyRepeatssubtaskslist of {text, done}SubtaskstagstagsTagsdone_atdatetime · read-onlyoverduebool · read-onlydue_inint · read-onlyDays until due (negative when overdue)subtasks_doneint · read-onlydefault_list (string)show_overdue_in_today (bool)upcoming_days (int)quick_addCreate a task from a sentence: 'pay rent friday #home !high every month'. Understands today, tomorrow, weekdays, 'in N days', 'next week', YYYY-MM-DD, DD/MM, #list, !high/!medium/!low and every day/weekday/week/month/year.completeMark a task done (repeating tasks move to their next date). Set done=false to reopen.listsEvery list with its number of open tasks.
Later /later
A read-later shelf you fill from the share sheet and Claude empties.
url*urlURLtitlestringTitle. Filled in from the page when left emptynotetextNotetagstagsTagsstatusunread | read | archivedStatusfavoriteboolFavouriteread_atdatetime · read-onlysitestring · read-onlyHost name of the URLfetch_titles (bool)open_marks_read (bool)surprisePick one random unread link, optionally within a tag.
Habits /habits
Tap once a day. Watch the streak. Let Claude keep you honest.
name*stringNameemojistringEmojitarget_per_weekintTimes per weekcolorteal | amber | rose | sky | violet | lime | slateColourarchivedboolArchiveddone_todaybool · read-onlythis_weekint · read-onlyCheck-ins this weekstreakint · read-onlystreak_unitstring · read-onlydays or weeksrecenttags · read-onlyDates checked in over the last 84 dayshabit_id*id of habitsHabitdatedateDay. Defaults to todaynotestringNoteweek_starts (monday | sunday)show_in_today (bool)check_inMark a habit done for a day (default today). Set done=false to undo. Idempotent.
Journal /journal
One line a day, a mood and an energy score. Claude spots the patterns.
datedateDay. Defaults to today; one entry per daymoodintMood (1–5)energyintEnergy (1–5)texttextEntrypromptstringPrompt answeredtagstagsTagsprompts (tags)nudge_after_hour (int)todayToday's entry (or null) and today's prompt.upsert_dayCreate or update the entry for a day (default today). Text is appended when append=true.statsAverage mood and energy, the daily series, entry streak and tag counts over the last N days (default 30).
Renewals /renewals
Every ID, policy and contract that expires, with the day you must act.
name*stringNamecategoryid | insurance | vehicle | property | contract | subscription | domain | health | tax | otherCategorydue_date*dateDue / expiry datenotice_daysintNotice (days). Act this many days before the due daterecurrencenone | monthly | quarterly | yearly | every_2_years | every_3_years | every_5_years | every_10_yearsRepeatsauto_renewsboolRenews automaticallystatusactive | doneStatusreferencestringReference / policy no.notestextNoteslinkurlLinkact_bydate · read-onlydue_date minus notice_daysdays_leftint · read-onlyDays until due_date (negative when overdue)stateoverdue | act_now | upcoming | ok | done · read-onlydefault_notice_days (int)upcoming_window_days (int)renewMark an item as renewed: moves due_date forward by its recurrence (or to new_due_date). Items that don't repeat become done.
Subs /subs
What you pay for every month, in one honest number.
name*stringNameamount*numberAmountcurrencystringCurrencycycleweekly | monthly | quarterly | yearlyBillednext_chargedateNext chargecategorysoftware | media | utilities | finance | health | home | transport | learning | otherCategorystatusactive | trial | paused | cancelledStatuspayment_methodstringPaid withcancel_urlurlCancel linknotestextNotesmonthly_costnumber · read-onlyamount per month in its own currencyyearly_costnumber · read-onlymonthly_cost_basenumber · read-onlyper month in the base currency (null if no FX rate set); 0 when paused/cancelleddays_to_chargeint · read-onlybase_currency (string)fx_rates (json)warn_days (int)summaryTotals per month and per year in the base currency, by category, plus subscriptions missing an FX rate.roll_forwardMove every next_charge date that is in the past forward by its cycle. Runs daily on its own.
People /people
A light personal CRM: who to call, when you last did, and what you talked about.
name*stringNameemailemailEmailphonestringPhonecompanystringCompanyrolestringRoletagstagsTagscadence_daysintCatch up every (days). 0 = no rhythmlast_contactdateLast contactbirthdaydateBirthday. Year is ignored; use 1900 if unknownnotestextNotespinnedboolPinnednext_followupdate · read-onlyduebool · read-onlynext_followup is today or earlierdays_since_contactint · read-onlynext_birthdaydate · read-onlydays_to_birthdayint · read-onlyperson_id*id of peoplePersondatedateDay. Defaults to todaychannelcall | whatsapp | message | email | meeting | otherHownotetextNotedefault_cadence_days (int)birthday_notice_days (int)log_touchRecord that you were in touch with someone (default today).duePeople due for a catch-up, most overdue first.
Forms /forms
Waitlists and contact forms that work on any site, with no backend.
name*stringNameintrotextIntro text. Shown above the hosted formfieldslist of {name, label, type, required, options}Fieldsbutton_labelstringButton labelsuccess_messagestringThank-you messageredirect_urlurlRedirect after submit. Optional; otherwise the thank-you message is shownallowed_originstagsAllowed sites. Origins allowed to POST from the browser, e.g. https://example.com. Empty = anyactiveboolAccepting submissionspublic_urlurl · read-onlypost_urlurl · read-onlysubmissionsint · read-onlynew_submissionsint · read-onlylast_submission_atdatetime · read-onlyform_id*id of formsFormdata*jsonAnswersstatusnew | done | spamStatusnotetextYour noteshow_in_today (bool)honeypot (bool)export_csvAll submissions of a form as CSV text (semicolon-safe, UTF-8).mark_allSet the status of every submission of a form that currently has from_status.
Short /short
Short links on a domain you trust, with honest click counts.
slugstringSlug. Leave empty for a random oneurl*urlDestination URLtitlestringTitletagstagsTagsactiveboolActiveexpires_atdatetimeExpiresclicksint · read-onlylast_click_atdatetime · read-onlyshort_urlurl · read-onlyslug_length (int)permanent_redirects (bool)statsTotal clicks and the most-clicked links.
Account settings /me
timezone (string)locale (en-GB | en-US | es-ES | ca-ES)