Anythink-MCP
OfficialManage Anythink accounts, projects, and project backends through MCP, with dedicated auth/config/project tools plus a generic CLI passthrough for all other commands.
Create/sign up/log in via email/password, Google, or direct org credentials, and log out/remove saved profiles.
Inspect, switch, and remove local CLI profiles/config.
List, create, and select billing accounts.
List, create, connect to, and delete projects.
Run any
anythinkCLI command through theclitool, covering entities, fields, data, search, workflows, users, files, roles, api-keys, menus, integrations, pay, oauth, migrate, plans, api/docs, and more.Use
--jsonwhere supported for machine-readable output and--yesfor destructive command confirmation.
Allows logging in via Google OAuth for authentication.
Anythink CLI
The official command-line interface for Anythink — the headless backend platform for developers and founders. Manage your projects, entities, data, workflows, users, files, and payments without leaving the terminal.
░███ ░██ ░██ ░██ ░██
░██░██ ░██ ░██ ░██
░██ ░██ ░████████ ░██ ░██ ░████████ ░████████ ░██░████████ ░██ ░██
░█████████ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██░██ ░██ ░██ ░██
░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██░██ ░██ ░███████
░██ ░██ ░██ ░██ ░██ ░███ ░██ ░██ ░██ ░██░██ ░██ ░██ ░██
░██ ░██ ░██ ░██ ░█████░██ ░████ ░██ ░██ ░██░██ ░██ ░██ ░██
░██
░███████Contents
Related MCP server: stripe
Installation
Both the anythink CLI and the anythink-mcp server are distributed together. The quickest way to get both is Homebrew.
Homebrew (macOS / Linux) — recommended
brew install anythink-cloud/tap/anythinkThis installs both commands onto your PATH:
anythink— the CLIanythink-mcp— the MCP server (see MCP server)
Or tap first, then install:
brew tap anythink-cloud/tap
brew install anythinkUpdate to the latest release:
brew upgrade anythinkUninstall:
brew uninstall anythinkmacOS / Linux — download binary
Grab the latest release for your platform from the Releases page:
Platform | Binary |
macOS (Apple Silicon) |
|
macOS (Intel) |
|
Linux (x86_64) |
|
Linux (ARM64) |
|
# Example — macOS Apple Silicon
curl -Lo anythink https://github.com/anythink-cloud/anythink-cli/releases/latest/download/anythink-osx-arm64
chmod +x anythink
sudo mv anythink /usr/local/bin/The MCP server ships as a matching anythink-mcp-<platform> binary on the same release — download and install it the same way (e.g. anythink-mcp-osx-arm64).
Verify the download against checksums.txt in the release assets:
sha256sum -c checksums.txt --ignore-missing.NET global tool
If you have the .NET 8 SDK installed:
dotnet tool install --global anythink-cliBuild from source
git clone https://github.com/anythink-cloud/anythink-cli
cd anythink-cli
dotnet build
dotnet run --project src/AnythinkCli.csproj -- --helpGetting started
# 1. Create an account (or log in if you already have one)
anythink signup
# 2. Create a billing account
anythink accounts create --name "My Company"
# 3. Create a project
anythink projects create "My App" --region lon1
# 4. Connect to the project
anythink projects use <project-id>
# 5. Start building
anythink entities list
anythink workflows listYour credentials and project profiles are stored in ~/.anythink/config.json. You can manage multiple projects by running projects use to switch between them.
Command reference
signup / login / logout
anythink signup Create a new Anythink account
anythink login Log in to the platform
anythink logout Remove saved credentials for a project profilesignup and login are interactive — they prompt for email and password and walk you through connecting to a billing account and project on first run.
accounts
Manage billing accounts. A billing account is the container for one or more projects and holds your subscription and payment details.
anythink accounts list List your billing accounts
anythink accounts create Create a new billing account
anythink accounts use <id> Set the active billing accountExamples
anythink accounts create --name "Acme Ltd" --email billing@acme.com
anythink accounts use a1b2c3d4projects
Create and manage Anythink projects. Each project is an isolated backend instance with its own database, auth, files, and workflows.
anythink projects list List projects in the active billing account
anythink projects create <name> Create a new project
anythink projects use <id> Connect to a project (sets it as the active profile)
anythink projects delete <id> Delete a projectOptions — projects create
Flag | Description |
| Deployment region (e.g. |
| Plan ID (see |
Examples
anythink projects create "My App" --region lon1
anythink projects use a1b2c3d4
anythink projects delete a1b2c3d4 --yesconfig
View and manage saved CLI profiles.
anythink config show List all profiles and platform settings
anythink config use <profile> Set the active project profile
anythink config remove <profile> Remove a profileProfiles are named by project alias or ID and stored in ~/.anythink/config.json.
entities
Manage entities (database tables) in the active project.
anythink entities list List all entities
anythink entities get <name> Get entity details and fields
anythink entities create <name> Create a new entity
anythink entities update <name> Update entity settings
anythink entities delete <name> Delete an entity and all its dataOptions — entities create
Flag | Description |
| Enable row-level security |
| Make the entity publicly readable |
| Lock new records (prevent direct creation) |
| Mark as a junction (many-to-many) table |
Examples
anythink entities create orders --rls
anythink entities get customers
anythink entities delete temp_data --yesfields
Manage fields on an entity. Fields map directly to database columns.
anythink fields list <entity> List fields on an entity
anythink fields add <entity> <name> Add a field
anythink fields delete <entity> <id> Delete a fieldOptions — fields add
Flag | Description |
| Field type: |
| Mark the field as required |
| Enforce a unique constraint |
| Add a database index |
| Default value |
Examples
anythink fields list customers
anythink fields add customers email --type varchar --unique --required
anythink fields add products price --type float --required
anythink fields delete customers 1234 --yesdata
CRUD operations on entity records.
anythink data list <entity> List records
anythink data get <entity> <id> Get a single record by ID
anythink data create <entity> Create a new record
anythink data update <entity> <id> Update a record
anythink data delete <entity> <id> Delete a record
anythink data export <entity> <file> Export records to CSV, JSON or JSONL
anythink data import <entity> <file> Create records from CSV, JSON or JSONLOptions — data list
Flag | Description |
| Records per page (default: 20) |
| Page number (default: 1) |
| Field filters — JSON ( |
| Output raw JSON instead of table |
| Stream all pages as sequential JSON objects (requires |
Filter operators (JSON form) — {"field": value} matches exactly, {"field": [a, b]} matches any, {"field": null} matches empty. For anything else use an operator object, e.g. {"price": {"gte": 10, "lt": 100}}:
Operator | Meaning |
|
| Equal / not equal |
|
| Comparisons |
|
| Case-insensitive substring |
|
| Case-insensitive prefix/suffix |
|
| Any of a list |
|
| Empty / not empty |
|
| Has / lacks related records |
|
Options — data create / data update
Flag | Description |
| JSON object of field values |
Examples
anythink data list blog_posts --limit 10
anythink data get blog_posts 42
anythink data create blog_posts --data '{"title":"Hello World","status":"draft"}'
anythink data update blog_posts 42 --data '{"status":"approved"}'
anythink data delete blog_posts 42 --yesExport and import — data export streams records page by page to a file; data import creates one record per row. Always run an import with --dry-run first: it validates every row and sends nothing.
anythink data export customers customers.csv
anythink data export orders orders.jsonl --filter 'status=paid' --fields id,total
anythink data import customers customers.csv --dry-run
anythink data import customers customers.csv --errors rejected.csv --yesFlag ( | Description |
|
|
| Same syntax as |
| Columns to export, in order. CSV defaults to the entity's fields |
| Records per request (default 200, max 1000) |
| Overwrite an existing file. Without it an existing file is never touched. The file is written to a temporary name and renamed on success, so a failed export never leaves a partial file |
| CSV only: see below |
Flag ( | Description |
|
|
| Validate and report; nothing is sent |
| Parallel creates (default 4, max 16) |
| Write skipped and failed rows, with an |
| Drop columns that aren't fields on the entity instead of rejecting the row |
| Skip the confirmation prompt. Required when not running interactively (CI, scripts, agents), otherwise the import refuses before writing anything |
How values are handled:
CSV is RFC 4180: cells containing a comma, quote or line break are quoted, quotes are doubled, and quoted cells can span lines. Objects, arrays, JSON fields and relations are written as compact JSON text.
Formula guard (export): CSV text starting with
=,+,-,@, tab or carriage return is prefixed with'so spreadsheets don't run it as a formula. Numbers are never changed. This includes phone numbers such as+44 20 7946 0000and any text with a leading+or-. The guard is one-way: importing the file keeps the'unless the file was exported with--no-formula-guard.Types follow the entity's fields. Text keeps its exact characters (
00123stays00123); integers and decimals are parsed with.as the decimal separator (1,5is rejected, never guessed); booleans accepttrue/false,1/0andyes/no; dates must be ISO 8601 (2025-03-31,2025-03-31T09:30:00Z; no offset means UTC); JSON fields must be valid JSON.An empty CSV cell is sent as
null. In JSON and JSONL input an empty string stays an empty string.Bad rows are skipped, never sent. They are reported with a row number (CSV: record number, so the header is row 1; JSONL: line number; JSON: position in the array) and counted as skipped. Rows the server rejects are counted as failed. The exit code is non-zero if any row was skipped or failed.
Retries:
400,409and422are never retried, so a create is not repeated. See Uncertain failures below for what is retried.System columns are ignored on import:
id,created_at,updated_at,tenant_idandlockedare never sent, and the import says which it ignored. Importing an export back into the same project therefore creates duplicates with new ids and timestamps; it does not update the originals.One-to-many collections and secret fields are skipped on import (the import lists them), and one-to-many columns are left out of an export unless you name them in
--fields. Many-to-many, file and user columns are copied as ids, which only mean something inside the same project; the import warns once per column.Empty boolean cells are sent as
nullrather thanfalse.Uncertain failures: only
429/503responses and requests that never reached the server (DNS, connection or TLS failures) are retried. If a request times out or the connection drops after sending, the row is reported asUNCERTAIN: may have been created, in the errors file too; check the project before re-importing it. Rate-limit waits pause every worker together and are retried for over a minute before giving up.Ctrl+C stops reading the file, finishes the rows already queued and prints a partial summary (exit code 1). An interrupted export removes its temporary file.
data importanddata exportread and write local files, so they are not available through the hosted (HTTP) MCP server.
Not supported yet: updating or upserting existing records by key, looking up relations by a natural key (use the related record's id), and file uploads.
search
Full-text search across your entities, plus index lifecycle management.
anythink search query <text> Run a search
anythink search similar <entity> <id> Find similar documents
anythink search rehydrate [<entity>] Rebuild the search index (admin)
anythink search purge [<entity>] Wipe the search index (admin)
anythink search audit <entity> Compare configured public-searchable fields
with what public search actually returnsOptions — search query
Flag | Description |
| Comma-separated entity names. Default: all indexed entities. |
| Filter expression, e.g. |
| Comma-separated sort fields, e.g. |
| Comma-separated fields to compute facet counts on. |
| Highlight matched terms in results. |
| Page number (default: 1). |
| Results per page (1-100, default: 20). |
| Use the unauthenticated |
| Print the raw response JSON. |
Index lifecycle
rehydrate and purge are admin operations on the search index:
search rehydrate— rebuilds the index from the database (no data loss; just resyncs)search purge— deletes the index (runrehydrateafter to repopulate)
Both confirm by default; pass -y / --yes to skip the prompt for automation.
search audit — public-search data leak check
Compares what the entity's schema says should be public-searchable (fields with publicly_searchable=true and the entity's own is_public=true) against what /search/public actually returns. Any field appearing in public results that isn't on the allowlist is reported as a leak.
Exits with code 1 if a leak is detected — useful for CI/CD.
Examples
# Browse everything
anythink search query "*"
# Filtered search with sorting
anythink search query "anythink" --filter "status=published" --sort "created_at:desc"
# Compare what public visitors see vs what's in the database
anythink search audit posts
anythink search audit users --query "alice" --sample 10
# Reindex after a schema change
anythink search rehydrate posts
anythink search rehydrate --yes # everything (admin)
# Geo search (radius in metres)
anythink search query "*" --filter "_geoRadius(51.5074,-0.1278,5000)"workflows
Manage automation workflows. A workflow can have several triggers: a cron schedule, an entity event, an API route, or a manual run.
anythink workflows list List all workflows (--json for a compact summary)
anythink workflows get <id> Get workflow details and steps (--json for the full definition)
anythink workflows create <name> Create a new workflow
anythink workflows update <id> Rename a workflow or change its description
anythink workflows enable <id> Enable a workflow
anythink workflows disable <id> Disable a workflow
anythink workflows trigger <id> Manually trigger a workflow
anythink workflows delete <id> Delete a workflowTrigger types — workflows create --trigger <type> (not case-sensitive; default Manual)
Type | Fires | Required flag | Other flags |
| When run by hand, on an entity |
| |
| When an event happens, such as a record being created |
|
|
| On a cron schedule |
| |
| When its API route is called |
|
--event (not case-sensitive) is EntityCreated (default), EntityUpdated, EntityDeleted, UserRegistered, UserInvited, SubscriptionCreated, SubscriptionActivated, SubscriptionExpired, PaymentCreated, PaymentSucceeded, PaymentFailed, PaymentMethodCaptured, PaymentMethodCaptureFailed, PaymentMethodRemoved or PushActionTaken; only the three Entity... events need --entity. A trigger missing its required flag is rejected before anything is sent, and a flag that doesn't apply to the chosen type is ignored with a warning.
Other options — workflows create
Flag | Description |
| Workflow description |
| Enable the workflow straight away |
| Read the |
Examples
anythink workflows create daily-sync --trigger Timed --cron "0 6 * * *"
anythink workflows create on-post --trigger Event --entity blog_posts --event EntityUpdated
anythink workflows create import-hook --trigger Api --api-route hooks/import
anythink workflows create review-posts --entity blog_posts
anythink workflows trigger 76
anythink workflows disable 83users
Manage users in the active project.
anythink users list List all users
anythink users me Show the currently authenticated user
anythink users get <id> Get a user by ID
anythink users invite <email> <first> <last> Create a user and send an invitation email
anythink users delete <id> Delete a userOptions — users invite
Flag | Description |
| Assign a role to the new user |
Examples
anythink users list
anythink users invite alice@example.com Alice Smith --role-id 3
anythink users delete 42 --yesfiles
Manage uploaded files in the active project.
anythink files list List uploaded files
anythink files get <id> Get file metadata by ID
anythink files upload <path> Upload a file
anythink files delete <id> Delete a fileOptions — files list
Flag | Description |
| Page number |
| Files per page (default: 25) |
Options — files upload
Flag | Description |
| Make the file publicly accessible |
Examples
anythink files list
anythink files upload logo.png --public
anythink files upload export.csv
anythink files delete 12 --yesView and edit the project's transactional email templates (confirmation, invite, recovery and so on) and the HTML shell that wraps every email's body. Email commands need the project's email permissions; the API enforces them for whoever is signed in.
anythink email templates list List the project's email templates
anythink email templates show <type> Show a template's subject and content
anythink email templates update <type> Change a template's subject and/or content
anythink email preview Render an unsaved draft and print the HTML
anythink email shell show Show the shell HTML (custom or platform default)
anythink email shell update Save new shell HTML, or reset itOptions — email templates show
Flag | Description |
| Print the rendered HTML (with sample data) instead of the source |
Options — email templates update
Flag | Description |
| New subject line |
| File with the new content (use |
| The new content, passed inline (use this or |
Pass at least one of the subject or the content. Whatever you leave out keeps its current value. Empty content is refused.
Options — email preview (renders on the server and saves nothing)
Flag | Description |
| Subject to render (default: |
| File with the content (use |
| The content, passed inline |
| Optional shell HTML to render against (use |
| Optional shell HTML, passed inline |
Options — email shell update (pass exactly one)
Flag | Description |
| File with the new shell HTML (use |
| The new shell HTML, passed inline |
| Go back to the platform default shell |
HTML is limited to 1,000,000 characters. The shell and template commands print raw HTML, so you can redirect it to a file. Through the MCP server the file options are not offered, so agents pass the HTML inline with content_text, wrapper_text and html_text.
Examples
anythink email templates list
anythink email templates show confirmation --rendered > confirmation.html
anythink email templates update confirmation --subject "Welcome aboard"
anythink email templates update confirmation --content ./confirmation.html
cat confirmation.html | anythink email templates update confirmation --content -
anythink email preview --subject "Hi" --content ./draft.html --wrapper ./shell.html
anythink email shell show > shell.html
anythink email shell update --html ./shell.html
anythink email shell update --resetroles
Manage roles in the active project. Roles control what authenticated users can access.
anythink roles list List all roles
anythink roles create <name> Create a new role
anythink roles delete <id> Delete a roleOptions — roles create
Flag | Description |
| Human-readable description of the role |
Examples
anythink roles list
anythink roles create editor --description "Can edit content"
anythink roles delete 5 --yesapi-keys
Issue and manage API keys for non-interactive access (CI pipelines, scripts, integrations). Each key is scoped to a permission set, has an expiry, and is tied to the user that created it.
The raw key is shown once on creation and never retrievable — save it immediately or use --save-as to write it directly into a CLI profile.
anythink api-keys list List your API keys
anythink api-keys create <name> --permissions ... Create a new key
anythink api-keys revoke <id> Revoke a keyOptions — api-keys create
Flag | Description |
| Required. Comma-separated permission names, e.g. |
| Days until expiry (default: 90, max: 365) |
| Allow |
| Save the new key directly to a CLI profile instead of printing it |
| Print the response as JSON to stdout (the key is in this output — handle carefully) |
| Skip the confirmation prompt |
Output behaviour
By default, the success message goes to stdout and the raw key goes to stderr on its own line. This makes it easy to capture only the key:
anythink api-keys create ci-deploy --permissions data:read --yes 2> key.txtIf the server drops any of the requested permissions because the current user does not hold them, the CLI surfaces a loud warning so you do not end up with a quietly under-scoped key.
Examples
# Create a 90-day key for CI
anythink api-keys create github-actions --permissions "data:read,data:create" --yes 2> key.txt
# Create a key and save it directly into a profile (key never echoes)
anythink api-keys create scraper --permissions data:read --save-as scraper-bot --yes
anythink --profile scraper-bot data list posts
# Revoke a key
anythink api-keys revoke 42 --yesmenus
Manage dashboard sidebar menus in the active project. Menus control what entities appear in the Anythink dashboard and how they are grouped.
anythink menus list List all menus with tree structure
anythink menus get <menu_id> [--json] Show one menu (and its role) with its items and child items
anythink menus create <name> <role_id> Create a menu shown to a role
anythink menus update <menu_id> [--name <text>] [--role <id>]
Rename a menu or change its role
anythink menus delete <menu_id> [--yes] Delete a menu and all of its items
anythink menus add-item <menu_id> <entity> Add an entity to a dashboard menu
anythink menus update-item <menu_id> <item_id> [options] Change an item's name, icon, link or parent
anythink menus remove-item <menu_id> <item_id> [--yes] Remove an item, along with its child items
anythink menus reorder-items <menu_id> <item_ids> Set the order of items that share a parent
anythink menus reorder <menu_ids> Set the order of menusOptions — menus add-item
Flag | Description |
| Lucide icon name (e.g. |
| Display name (defaults to entity name, title-cased) |
| Parent menu item ID for nesting under a group |
Options — menus update-item (only the fields you pass change)
Flag | Description |
| New display name |
| New Lucide icon name |
| Point the item at an entity's page (instead of |
| Point the item at any path (instead of |
| Parent item ID to nest under; |
reorder-items and reorder take comma-separated IDs in the order you want them (301,299,300). The items you name take the first places within their group; items you leave out follow in their current order, and reorder-items needs all the items to share one parent. Locked items (the built-in ones) can't be changed, removed or moved; they keep their place, and the items between them reuse their own position numbers (they are only renumbered when two of them tie).
add-item and update-item --entity look the entity up first (system entities count), and stop only if it doesn't exist; if the lookup itself fails (for example, no permission), the item is saved and a warning says the entity couldn't be checked. Moving an item to a new parent with update-item --parent puts it last among its new siblings.
Removing an item also removes its direct child items. The command says so, and refuses when those children are locked or have items of their own.
A role is shown only its first menu, so create (and update --role) warns when the role already has one. delete removes the menu's locked built-in items with it, and says when the role is left with no menu.
Examples
# List all menus and their items
anythink menus list
# Show menu 250 with the item IDs you need for the commands below
anythink menus get 250
# Add "Check-ins" under the Profiles group (parent 168) in admin menu (250)
anythink menus add-item 250 check_ins --icon MessageCircle --parent 168
# Add a top-level menu item
anythink menus add-item 250 badges --icon Award
# Rename an item and give it another icon
anythink menus update-item 250 299 --name "Achievements" --icon Trophy
# Remove an item
anythink menus remove-item 250 299 --yes
# Put items 301, 299 and 300 first, in that order
anythink menus reorder-items 250 301,299,300charts
Build and manage the charts shown on dashboards in the active project. Every command takes --json, which prints a compact result with the ids the next step needs. In the MCP server each command is a tool of the same name (charts_create, charts_preview and so on).
anythink charts list [--entity <name>] List charts, newest first
anythink charts get <id> Show a chart's configuration
anythink charts create <name> [options] Create a chart
anythink charts update <id> [options] Change a chart; options you leave out keep their value
anythink charts delete <id> [--yes] Delete a chart
anythink charts preview [options] Show the data a configuration would draw, without saving it
anythink charts platform-metrics List the usage metrics a platform chart can plotOptions — charts create, charts update and charts preview
Flag | Description |
| Entity whose records the chart plots |
|
|
| Field for the x axis, or the slices of a pie |
| Bucket a date |
| Numeric field to aggregate (needed unless |
|
|
| Field that splits each bar or point into a second breakdown |
| Filter such as |
|
|
| Row limit, sort order and running total |
| A goal or warning level on a stat or gauge |
| Compare with the previous period |
| Where the data comes from. Platform charts use |
| Anything else, as a JSON object, e.g. |
|
|
A missing or unknown value is refused before anything is sent, with a message naming it. Check a chart with charts preview before charts create: it takes the same options and shows what the chart would draw.
Examples
# What would a pie of orders by status show?
anythink charts preview --entity orders --type pie --group-by status
# Save it, then a revenue chart with a filter
anythink charts create "Orders by status" --entity orders --type pie --group-by status
anythink charts create "UK revenue per month" --entity orders --type column --group-by created_at \
--interval month --measure total --agg sum --filter region:eq:uk --timeframe 365d
# A usage chart from the platform metrics
anythink charts create "Workflow runs" --source platform --platform-metric workflow_runs --type line
# Change one thing
anythink charts update 12 --timeframe 30ddashboards
Build and manage dashboards. A dashboard is a set of widgets (charts, lists, notes and so on) laid out on a 12-column grid. Every command takes --json.
anythink dashboards list List the dashboards you can see
anythink dashboards get <id> Show a dashboard with its widgets and their positions
anythink dashboards mine Show your landing dashboard, or the project default
anythink dashboards create <name> [options] Create a dashboard
anythink dashboards update <id> [options] Rename it, change who can see it, or replace its widgets and layout
anythink dashboards delete <id> [--yes] Delete a dashboard and its widgets (the charts are kept)
anythink dashboards add-chart <dashboard-id> <chart-id> Add a chart as a new widget
anythink dashboards remove-widget <dashboard-id> <widget-id> Remove a widget
anythink dashboards data <id> [--widget <id>] Show the data behind the widgets
anythink dashboards widget-preview --type <type> Show the data a widget would draw, without saving it
anythink dashboards set-home <id> Make it your landing dashboard
anythink dashboards promote-to-default <id> [--yes] Copy it over the project default (administrators only)add-chart and remove-widget read the dashboard, change only that widget, and write the rest back as it was.
Options
Command / flag | Description |
| Put a chart on the new dashboard. Repeat for several |
| Description, who can see or edit it, and whether it is your landing or the project default dashboard |
| Other settings as a JSON object: |
| The fields to change; the rest are left alone |
| Widget title (defaults to the chart's name) |
| Position and size on the grid (default width 4, height 3, placed below the existing widgets). Leave them all out and the dashboard places the widget itself |
| Only these widgets; most rows to show per widget (default 20) |
| Widget type ( |
Examples
# A dashboard with two charts already on it
anythink dashboards create Sales --chart 12 --chart 14
# Add a third, half the width of the grid
anythink dashboards add-chart 3 15 --width 6
# See what is on it, then take a widget off
anythink dashboards get 3
anythink dashboards remove-widget 3 41
# The numbers behind it
anythink dashboards data 3 --jsonsettings
View and change project settings in the active project, including the allowed application URLs that browsers may call the API from (CORS).
anythink settings get [--json] Show all project settings
anythink settings set <key> <value> [--yes] Set a single project setting
anythink settings cors list List allowed application URLs
anythink settings cors add <url> [--yes] Add an allowed origin
anythink settings cors remove <url> Remove an allowed originKeys — settings set
Key | Value |
| Text |
|
|
|
|
| Role ID for newly registered users |
|
|
| URL |
|
|
| Number of days |
|
|
| Text |
| Text |
Origins must be http/https with a host and optional port, with no path, query or fragment; a trailing / is stripped. A wildcard such as https://*.example.com is only safe on a domain you control, so wildcards under shared hosting domains (vercel.app, github.io, …) or a bare TLD are refused unless you pass --yes.
Some changes widen who can sign up: default_role_id pointing at an administrator role is refused unless you pass --yes, and allow_registrations true and require_email_confirmation false ask for confirmation (pass --yes when running non-interactively).
cors add and cors remove clear the project's CORS cache, so the change applies straight away. Matching is case-insensitive and adding a URL that is already present does nothing. Anythink's own domains and localhost are always allowed and don't need adding.
Examples
# Allow a deployed front end to call the API
anythink settings cors add https://my-app.vercel.app
# Allow every subdomain of a domain you own
anythink settings cors add "https://*.example.com"
# Remove an origin
anythink settings cors remove https://my-app.vercel.app
# Let users sign up on their own
anythink settings set allow_registrations trueintegrations
Manage integrations — both the catalog of available providers (Claude, OpenAI, Slack, Google, etc.) and the active connections that hold credentials for them.
anythink integrations list List available providers
anythink integrations get <provider> Show details and operations for one provider
anythink integrations connections list [--provider <p>] List your active connections
anythink integrations connect <provider> Create an API-key connection (Claude, OpenAI, etc.)
anythink integrations oauth status <provider> Show OAuth client setup status
anythink integrations oauth configure <provider> Set the OAuth client ID + secret
anythink integrations oauth connect <provider> Connect via the browser OAuth flow
anythink integrations test <connection-id> Test a connection
anythink integrations enable <connection-id> Enable a connection
anythink integrations disable <connection-id> Disable a connection
anythink integrations disconnect <connection-id> Delete a connection
anythink integrations execute <provider> <operation> Run an operation on a connected providerAPI-key providers — integrations connect
Flag | Description |
| API key for the provider. If omitted, you'll be prompted (input is hidden). |
| Friendly name for this connection (default: |
| Make this a user-scoped connection (only the current user sees it). Default: tenant-wide. |
OAuth providers — integrations oauth connect
The CLI starts a local HTTP listener on http://localhost:8745/callback, opens your browser to the provider's authorisation URL, and exchanges the returned code for a connection — no copy/paste of auth codes required.
Flag | Description |
| Friendly name for this connection |
| Make this a user-scoped connection |
| Local callback port (default: |
| Don't try to open the browser — just print the URL |
| How long to wait for the callback (default: |
OAuth credentials need to be set up once per provider before you can connect:
anythink integrations oauth configure slack # prompts for client_id + secret (hidden)
anythink integrations oauth connect slack --name mainRunning operations — integrations execute
Flag | Description |
| Input parameter as |
| All inputs as a JSON object. |
| Print the full JSON response (default: just the |
Examples
# Browse what's available
anythink integrations list
anythink integrations get claude
# API-key flow (Claude, OpenAI)
anythink integrations connect claude --name "main"
anythink integrations execute claude generate-text --input "prompt=Tell me a haiku"
# OAuth flow (Slack, Google, GitHub)
anythink integrations oauth configure slack
anythink integrations oauth connect slack --name main
# Manage connections
anythink integrations connections list
anythink integrations test <connection-id>
anythink integrations disable <connection-id>
anythink integrations disconnect <connection-id> --yespay
Manage AnythinkPay — Stripe Connect, Apple in-app purchases, payments, subscription plans, and live subscriptions.
anythink pay status Show Stripe Connect account status
anythink pay connect Set up a Stripe Connect account and start onboarding
anythink pay setup Guided setup: Stripe Connect, Apple IAP, and a first plan
anythink pay payments List recent payments
anythink pay methods List saved payment methods
anythink pay entitlement Show the current user's access / trial entitlement
anythink pay payment-options Show available payment providers for a platform/storefront
anythink pay trial status|enable|disable Manage the app engagement trial
anythink pay apple credentials set Set Apple IAP credentials (.p8 from a file)
anythink pay apple credentials show Show Apple IAP credentials (identifiers masked)
anythink pay apple credentials notification-url Print the URL to register in App Store Connect
anythink pay apple verify Verify an Apple transaction (testing)
anythink pay plans list|get|create|update|delete Manage subscription plans
anythink pay subscriptions list|get|events Inspect subscriptions and history
anythink pay subscriptions cancel|resume Standard lifecycle actions
anythink pay subscriptions delete|force-expire|relink|resync Admin recovery (project admin)
anythink pay offers list|get|create|update Manage promo and referral offers
anythink pay offers pause|activate Change an offer's status
anythink pay offers delete Permanently delete an offer, its codes and redemption records
anythink pay offers codes|add-code|redemptions Inspect and extend an offer
anythink pay offers user-code Look up a user's personal referral codeCommands that cancel, delete, expire, relink or pause (pay plans delete, pay subscriptions cancel|delete|force-expire|relink, pay offers pause|delete) ask for confirmation. Pass -y/--yes to skip the prompt; in a non-interactive shell they refuse to run without it.
pay plans update only changes the fields you pass: omitted flags keep the plan's current currency, interval, type and active state. Use --active or --inactive to change availability.
Options — pay payments
Flag | Description |
| Page number |
| Payments per page (default: 25) |
pay connect is interactive — it prompts for business type, country, and contact email, creates a Stripe Connect account, then opens the Stripe onboarding URL in your browser. pay setup chains Stripe Connect, Apple IAP credentials, and a first plan; each step is optional.
Subscription plans can carry an --apple-product-id (and optional --apple-subscription-group-id) so one plan covers both Stripe and Apple. pay apple credentials set reads the App Store Connect .p8 private key from a file and stores it encrypted — it is never printed or logged.
Required permissions
Command surface | Permission |
Plan / subscription reads, entitlement, payment-options |
|
Plan writes |
|
Payment reads/writes |
|
Apple credentials, admin recovery ( | project administrator |
Examples
anythink pay setup
anythink pay plans create --plan-name monthly --name Monthly --amount 9.99 --currency gbp --interval month --apple-product-id example_monthly
anythink pay apple credentials set --issuer-id <uuid> --key-id <id> --bundle-id com.example.app --private-key-file ./AuthKey.p8
anythink pay apple verify --signed-transaction <JWS>
anythink pay subscriptions events <subId>
anythink pay entitlementoauth
Configure OAuth social sign-in providers for the active project.
anythink oauth google status Show Google OAuth configuration status
anythink oauth google configure Set Google OAuth client ID and secretGoogle OAuth lets your project's users sign in with their Google account. You'll need a Google Cloud project with the OAuth 2.0 credentials created — see the Google Cloud Console.
Set the authorised redirect URI in your Google Cloud credentials to:
https://api.my.anythink.cloud/org/<your-org-id>/auth/v1/google/callbackExamples
anythink oauth google status
anythink oauth google configureapi
List all API endpoints available for the active project — both platform routes and the dynamically generated REST routes for your entities.
anythink api List all endpoints
anythink api --json Output as JSON (useful for AI tooling)docs
Print the full CLI reference.
anythink docs Print reference as markdown
anythink docs --json Print reference as JSON (for AI/tooling consumption)migrate
Copy the entity schema (entities + fields) from one project profile to another. Useful for promoting a schema from staging to production.
anythink migrate --from <profile> --to <profile>Options
Flag | Description |
| Source profile name (required) |
| Destination profile name (required) |
| Show what would be migrated without making changes |
Examples
anythink migrate --from my-app-staging --to my-app-prod
anythink migrate --from my-app-staging --to my-app-prod --dry-runplans
List available Anythink plans.
anythink plans List plans
anythink plans --json Output as JSONMCP server
The Anythink MCP server exposes the platform to AI assistants (Claude, Cursor, etc.) via the Model Context Protocol.
Install
No install needed — the recommended way is to run it on demand with npx:
npx -y @anythink-cloud/mcpPrefer a native binary on your PATH? Any of:
# Homebrew (bundled with the CLI — see Installation above)
brew install anythink-cloud/tap/anythink
# .NET global tool (requires the .NET 8 SDK)
dotnet tool install -g anythink-mcp
# Or download the anythink-mcp-<platform> binary from the Releases pageConfigure
For Claude Code, register it in one command:
claude mcp add anythink -- npx -y @anythink-cloud/mcpOr add it to your MCP client config manually (e.g. .mcp.json):
{
"mcpServers": {
"anythink": {
"command": "npx",
"args": ["-y", "@anythink-cloud/mcp"]
}
}
}To pin a profile, add it to args: ["-y", "@anythink-cloud/mcp", "--profile", "my-project"]
Works in any MCP client. Most use the same mcpServers JSON shown above — just add it to the client's config file:
Client | Config file |
Claude Code |
|
Claude Desktop |
|
Cursor |
|
VS Code |
|
Cline |
|
Windsurf |
|
A couple of clients use a different config shape:
mcpServers:
- name: anythink
command: npx
args:
- -y
- "@anythink-cloud/mcp"{
"context_servers": {
"anythink": {
"source": "custom",
"command": "npx",
"args": ["-y", "@anythink-cloud/mcp"]
}
}
}(Using a native binary instead of npx? Use "command": "anythink-mcp" with no args.)
Once connected, run the login tool, then accounts_use / projects_use to pick your working context.
Available tools
The MCP server provides dedicated tools for authentication, account/project management, and configuration — plus a generic cli tool that can run any CLI command:
Tool | Description |
| Create a new Anythink account |
| Log in with email and password |
| Store credentials directly (org ID + API key or JWT) |
| Remove a saved profile |
| List all profiles |
| Switch active profile |
| Remove a profile |
| List billing accounts |
| Create a billing account |
| Set the active billing account |
| List projects |
| Create a project |
| Connect to a project |
| Delete a project |
| Run any CLI command (entities, data, workflows, roles, etc.) |
The hosted MCP server (anythink-mcp --hosted) has no sign-in or profile tools. Its accounts_list, accounts_create, plans, projects_create and projects_delete tools run as the signed-in user and appear only when the user grants account access; see the MCP server docs.
Contributing
Prerequisites
An Anythink account (free tier works)
Setup
git clone https://github.com/anythink-cloud/anythink-cli
cd anythink-cli
dotnet buildRunning locally
dotnet run --project src/AnythinkCli.csproj -- --help
dotnet run --project src/AnythinkCli.csproj -- projects list
dotnet run --project src/AnythinkCli.csproj -- entities listReleases
Releases are automated via GitHub Actions. Push a version tag to trigger a build:
git tag v1.2.0
git push origin v1.2.0The workflow builds self-contained binaries for macOS (arm64, x64) and Linux (x64, arm64), computes SHA256 checksums, and publishes them as a GitHub release.
Project structure
anythink-cli/
├── src/ # CLI source
│ ├── Commands/ # Command implementations (signup, login, etc)
│ ├── Config/ # CliConfig.cs, Profile, ConfigService
│ ├── Models/ # ApiModels.cs, BillingModels.cs
│ ├── Client/ # HttpApiClient.cs, AnythinkClient.cs, BillingClient.cs
│ ├── Output/ # Renderer.cs (Spectre.Console helpers)
│ └── Program.cs # Application entry point & .env loader
├── mcp/ # MCP server source
│ ├── Tools/ # MCP tool implementations
│ ├── McpClientFactory.cs # Auth + client resolution
│ └── Program.cs # MCP server entry point
├── tests/ # CLI unit tests
├── mcp-tests/ # MCP unit tests
├── AnythinkCli.sln # Solution file
└── .gitignoreLicense
MIT — see LICENSE. This covers the Anythink CLI and MCP server source in this repository; it does not grant rights to the Anythink platform, APIs, or services, which are governed by separate terms at anythink.cloud.
Built with Spectre.Console · Powered by Anythink
Available Tools
175 toolsaccounts_createCreate a billing accountAInspect
Create a new billing account (organization) to hold projects and payment details. Requires a prior platform login (use the 'login' tool first). The new account is automatically set as the active account, so subsequent 'projects_create' / 'projects_list' calls target it without further setup. Returns the new account's id and name. Most users need only one account — call 'accounts_list' first to check whether a suitable one already exists.
Inputs: name (required), email (required), currency.
accounts_listList billing accountsARead-onlyInspect
List the billing accounts (organizations) the logged-in user belongs to. Requires a prior platform login (use the 'login' tool first). Returns each account's id, organization name, billing email, currency, and status (Active/Suspended/Canceled), and flags which one is currently active. A billing account holds your projects and payment details — pick one with 'accounts_use' before creating or listing projects.
Inputs: no named parameters.
accounts_useSwitch the active billing accountAInspect
Set the active billing account that project commands operate on. Call this after 'login' when you belong to more than one account, before using 'projects_list', 'projects_create', or 'projects_use'. Accepts a full account UUID or a unique prefix; run 'accounts_list' to see valid ids. Returns the resolved account name and id, or an error if no account matches.
Inputs: id (required).
apiApiARead-onlyInspect
List all API endpoints (platform + dynamically generated entity routes). Lists full URLs for a fixed set of core routes (auth, API keys, entities, fields, workflows), the five CRUD routes of every entity in the project plus public routes for public entities, and the route of each API-triggered workflow. Use it to give app developers endpoint URLs; to call one, use fetch. Returns JSON.
Inputs: base_url.
api_keys_createApi keys: createAInspect
Create an API key. The raw key is shown once and never retrievable. Creates a project API key with the named permissions (names from fetch on /permissions) that expires after 1 to 365 days, 90 by default. Permissions you don't hold yourself are dropped with a warning. The raw key appears only in this output, or goes straight into a CLI profile with save_as, so store it at once. Returns JSON.
Inputs: name (required), save_as, expires_in, permissions, +1 more.
api_keys_listApi keys: listARead-onlyInspect
List API keys for the current user. Shows each key's id, name, number of permissions, expiry date and whether it is active, expired or revoked; key values are never returned. Use the id with api_keys_revoke.
Inputs: no named parameters.
api_keys_revokeApi keys: revokeADestructiveInspect
Revoke an API key by ID. Revokes the key immediately and for good, so any script, CI job or CLI profile using it starts failing to authenticate. Create a replacement with api_keys_create first if something still needs access. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
charts_createCharts: createAInspect
Create a chart. Check it first with charts preview. Saves a chart that plots an entity's records, a platform usage metric (see charts_platform_metrics) or a plan quota. Settings are checked first and the call is refused with the problems listed. The new chart isn't shown anywhere until you put it on a dashboard with dashboards_add_chart or dashboards_create. Returns JSON.
Inputs: name (required), to, agg, from, +21 more.
charts_deleteCharts: deleteADestructiveInspect
Delete a chart. Dashboards that show it keep an empty widget until you remove it. Permanently removes a saved chart from the project. To take a chart off one dashboard but keep it, use dashboards_remove_widget instead. After deleting, find the widgets that showed it with dashboards_get and clear them with dashboards_remove_widget. Returns JSON. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
charts_getCharts: getARead-onlyInspect
Get a chart's full configuration. Shows every setting of one saved chart: type, data source, entity or metric, grouping, measure and aggregation, filters, time window, target and comparison. Read it before charts_update; to see the data it draws, use dashboards_widget_preview with type chart and its id. Returns JSON.
Inputs: id (required).
charts_listCharts: listARead-onlyInspect
List charts, newest first. Shows each saved chart's id, name, type, data source, the entity or metric it plots and when it last changed; pass entity to see only one entity's charts. A chart is saved on its own and appears on a dashboard only once added with dashboards_add_chart. Returns JSON.
Inputs: entity.
charts_platform_metricsCharts: platform metricsARead-onlyInspect
List the usage metrics a platform chart can plot. Shows each project usage metric a chart with source platform can plot: its id, label, shape, supported chart types and breakdowns. Pass a metric's id as platform_metric to charts_preview or charts_create, and one of its breakdowns as stack_by. Returns JSON.
Inputs: no named parameters.
charts_previewCharts: previewARead-onlyInspect
Show the data a chart configuration would draw, without saving it. Runs a chart configuration against the project's current data and shows the points, totals or rows it would plot, trimmed to rows. Use it to settle entity, grouping, measure and filters before charts_create or charts_update; for a chart already saved, use dashboards_widget_preview. Returns JSON.
Inputs: to, agg, from, rows, +21 more.
charts_updateCharts: updateADestructiveInspect
Change a chart. Only the settings you pass change; the rest stay as they were. Saves new settings on an existing chart; a filter replaces all of its existing filters. Dashboard widgets point at the chart rather than copying it, so every dashboard showing it draws the new version. Use charts_get first to see its current settings. Returns JSON. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), to, agg, from, +22 more.
cliRun an Anythink CLI commandADestructiveInspect
Run any Anythink CLI command and return its output. Prefer the dedicated tools; use this for anything they don't cover. Pass the command exactly as you would after 'anythink', e.g. 'entities list' or 'data list posts'. Destructive pay commands (delete, expire, relink, pause and similar) must be run by a person in a terminal; never add '--yes' on their behalf. 'data import' creates records (not destructive): run it with --dry-run first and only add '--yes' after the user approves the dry run. 'import directus' changes the project: run it with '--dry-run' first and only add '--yes' once the user has approved the plan. Add '--json' where supported for machine-readable output.
Inputs: command (required).
config_removeRemove a saved project profileADestructiveInspect
Delete a saved project profile from the local CLI configuration. Removes only the locally stored credentials and settings — it does not delete the project or revoke tokens server-side (to remove the project itself, use 'projects_delete'). Run 'config_show' to see profile names. Returns confirmation, or a not-found message.
Inputs: profile (required).
config_showShow saved profilesARead-onlyInspect
Show the local CLI configuration: all saved project profiles and platform logins, and which of each is active. For every profile it returns the name, org id, auth method (api-key or token), alias, and platform; for every platform it returns the URLs, billing account, and login status. Use this to discover profile names for 'config_use', 'config_remove', or 'logout', and to check which project the 'cli' tool currently targets. Reads local config only — makes no network calls.
Inputs: no named parameters.
config_useSwitch the active project profileAInspect
Switch the active project profile that the 'cli' tool's commands operate against. Use this to move between already-connected projects without re-authenticating. The profile must already exist (created by 'projects_use' or 'login_direct'); run 'config_show' to see available profile names. Returns confirmation, or an error if the profile does not exist.
Inputs: profile (required).
dashboards_add_chartDashboards: add chartAInspect
Add a chart to a dashboard as a new widget. Everything else on the dashboard stays as it was. This is how a saved chart gets onto a dashboard. The widget takes the chart's name as its title unless title is given, and goes after the existing widgets unless column, row, width or height place it on the 12-column grid. Create the chart first with charts_create; avoid dashboards_update for this, as it replaces every widget. Returns JSON.
Inputs: chart_id (required), dashboard_id (required), row, title, +3 more.
dashboards_createDashboards: createAInspect
Create a dashboard, optionally with charts already on it. Makes a new dashboard owned by you, visible only to you unless shared is set. Each chart id passed becomes a chart widget titled with the chart's name; add more later with dashboards_add_chart. Build the charts first with charts_create. Making it the project default needs an administrator. Returns JSON.
Inputs: name (required), home, chart, config, +4 more.
dashboards_dataDashboards: dataARead-onlyInspect
Get the data behind a dashboard's widgets. Runs a saved dashboard's widgets, or only the widget ids passed, and shows each one's id, title, type and current data, trimmed to rows per widget. Use it to read what a dashboard shows now; use dashboards_widget_preview to try a widget that isn't on a dashboard yet. Returns JSON.
Inputs: id (required), rows, widget.
dashboards_deleteDashboards: deleteADestructiveInspect
Delete a dashboard and its widgets. The charts on it are kept. Removes the dashboard for everyone who can see it. To take one chart off a dashboard, use dashboards_remove_widget; to delete a chart itself, use charts_delete. If it was your home dashboard, dashboards_mine falls back to the project default. Returns JSON. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
dashboards_getDashboards: getARead-onlyInspect
Get a dashboard with its widgets and their positions. Shows a dashboard's name, description, sharing settings, owner and each widget's id, type, title, the chart it shows and its grid position. Use it to find widget ids for dashboards_remove_widget and dashboards_data, and to see the current widgets before dashboards_update. Returns JSON.
Inputs: id (required).
dashboards_listDashboards: listARead-onlyInspect
List the dashboards you can see. Shows each dashboard's id, name, owner and whether it is your home, the project default or shared. A dashboard is a grid of widgets, most of them showing a saved chart; open one with dashboards_get to see its widgets, or dashboards_mine for the one you land on. Returns JSON.
Inputs: no named parameters.
dashboards_mineDashboards: mineARead-onlyInspect
Get your landing dashboard, or the project default if you have none. Shows the same detail as dashboards_get for the dashboard you see first when you open the project. Use it when you don't have a dashboard id; change which dashboard you land on with dashboards_set_home. Returns JSON.
Inputs: no named parameters.
dashboards_promote_to_defaultDashboards: promote to defaultADestructiveInspect
Copy a dashboard over the project default that new users start from (administrators only). Overwrites the project default dashboard with a copy of this one. The default is what new users start from and what anyone without a home dashboard lands on; the dashboard you copy from stays as it was. To change only your own landing dashboard, use dashboards_set_home. Returns JSON. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
dashboards_remove_widgetDashboards: remove widgetADestructiveInspect
Remove a widget from a dashboard. Everything else on the dashboard stays as it was. Takes the widget off the dashboard and out of its layout; the chart it showed is kept and can be added back with dashboards_add_chart. Get widget ids from dashboards_get. Use charts_delete only to remove the chart from the project entirely. Returns JSON. It changes or deletes existing data, so check with the user before running it.
Inputs: widget_id (required), dashboard_id (required).
dashboards_set_homeDashboards: set homeADestructiveInspect
Make a dashboard of yours your landing dashboard. Changes only your own landing dashboard, replacing your previous home; other users are unaffected. Check the result with dashboards_mine. To change what new users start from, use dashboards_promote_to_default. Returns JSON. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
dashboards_updateDashboards: updateADestructiveInspect
Rename a dashboard, change who can see it, or replace its widgets and layout. Changes a dashboard's name, description or sharing, or replaces its whole widget list and layout through config; widgets missing from a new list are removed. To add or remove one chart, use dashboards_add_chart or dashboards_remove_widget, which keep everything else. Only the owner can change sharing. Returns JSON. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), name, config, shared, +2 more.
dashboards_widget_previewDashboards: widget previewARead-onlyInspect
Show the data a widget would draw, without saving it. Works for a saved chart, given its id, and for list, materialised view, markdown and other widgets, given their config. Use it to see what a saved chart shows now, or to try a widget before adding it with dashboards_add_chart or dashboards_update; use dashboards_data for widgets already on a dashboard. Returns JSON.
Inputs: rows, type, chart, config.
data_createData: createAInspect
Create a new record. Inserts one record from a JSON object of field names to values and returns the created record with its new id. Objects or arrays given for jsonb fields are sent as JSON strings automatically. Workflows with an EntityCreated trigger on this entity will run. To load many rows from a file, use data_import.
Inputs: entity (required), data.
data_deleteData: deleteADestructiveInspect
Delete a record. Removes one record by its numeric id. Records in other entities that point to it through a relationship field follow that field's on-delete rule; with the default, CASCADE, they are deleted too. Workflows with an EntityDeleted trigger on this entity will run. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), entity (required).
data_exportData: exportAInspect
Export records to a CSV, JSON or JSONL file (streamed page by page). Writes every matching record to a file on the machine running the CLI, or to standard output when the file is -, fetching page by page. Uses the same filter syntax as data_list; one-to-many fields are left out unless named in the field list. It won't overwrite an existing file unless forced. For one page of records, use data_list.
Inputs: file (required), entity (required), force, fields, +4 more.
data_getData: getARead-onlyInspect
Get a single record by ID. Returns all of one record's field values by its numeric id. Use data_list with a filter when you don't know the id, search_query to find it by text, and data_rls to see which users can access it.
Inputs: id (required), entity (required).
data_importData: importAInspect
Create records from a CSV, JSON array or JSONL file. Always run with --dry-run first and only add --yes after the dry run is approved. Reads a file on the machine running the CLI and creates one new record per row, checking values against the entity's field types; rows with unknown columns are rejected unless told to ignore them. System columns such as id are ignored, so it never updates existing records. For a single record, use data_create.
Inputs: file (required), entity (required), errors, format, +3 more.
data_listData: listARead-onlyInspect
List records in an entity. Returns one page of records (rows), 20 by default. Filter by field values with JSON such as {"status":"draft","price":{"gte":10}} or pairs such as status=draft&price=GTE:10. Use data_get when you know the record id, or search_query to find records by text across entities. Returns JSON.
Inputs: entity (required), all, page, limit, +1 more.
data_rlsData: rlsADestructiveInspect
View or set RLS (row-level security) user access on a record. Without a user id, returns the users who have row-level security (RLS) access to the record, with their names and whether access is read-only. With a user id, grants that user access to the record, full by default or read-only when asked. It cannot remove access, and only matters on entities with RLS turned on. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), entity (required), user, readonly.
data_updateData: updateADestructiveInspect
Update a record. Changes only the fields named in the JSON object and returns the updated record; other fields keep their values. Objects or arrays given for jsonb fields are sent as JSON strings automatically. Workflows with an EntityUpdated trigger on this entity will run. To create a record instead, use data_create. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), entity (required), data.
docsDocsARead-onlyInspect
Print the full CLI reference (markdown or --json for AI/tooling consumption). Prints a hand-written reference of CLI commands, options and examples without calling the API or needing a project. It omits some groups, such as integrations, secrets, API keys and settings, so treat the tool list as the authority on what exists. Returns JSON.
Inputs: no named parameters.
email_previewEmail: previewARead-onlyInspect
Render uncommitted subject + content + optional wrapper, print HTML. Renders a draft subject and body with sample data, inside a draft shell if given or the project's current one otherwise, and returns the HTML. Nothing is saved and no email is sent. Use it to check edits before email_templates_update or email_shell_update.
Inputs: content, subject, wrapper, content_text, +1 more.
email_shell_showEmail: shell showARead-onlyInspect
Show the current shell HTML (custom or platform default). Returns the HTML layout that wraps the body of every email the project sends, and says whether it is customised or the platform default. The {{Content}} placeholder marks where each template's body goes. Read it before email_shell_update.
Inputs: no named parameters.
email_shell_updateEmail: shell updateADestructiveInspect
Save new shell HTML, or pass --reset to revert to the platform default. Replaces the HTML layout around every email the project sends, or with reset returns to the platform default. Keep the {{Content}} placeholder where the body goes; the server sanitises the HTML. Check a draft with email_preview first. It changes or deletes existing data, so check with the user before running it.
Inputs: html, reset, html_text.
email_templates_listEmail: templates listARead-onlyInspect
List all email templates for this project. Shows each template's type (such as confirmation, invite or recovery), subject, and whether it is locked or active. These are the account emails Anythink sends for the project; pass a type to email_templates_show to read one or email_templates_update to change it.
Inputs: no named parameters.
email_templates_showEmail: templates showARead-onlyInspect
Show a template's subject + content, or the rendered HTML with --rendered. By default returns the stored subject and content with their {{ placeholders }} intact, which is what to edit; with rendered it returns the full email HTML inside the project's shell, filled with sample data. Read it before email_templates_update.
Inputs: template_type (required), rendered.
email_templates_updateEmail: templates updateADestructiveInspect
Update a template's subject and/or content. Saves a new subject and/or body for one template type, keeping whichever you leave out; every email of that type the project sends from then on uses it. Pass the body inline in content_text. Check a draft first with email_preview, as the previous content isn't kept. It changes or deletes existing data, so check with the user before running it.
Inputs: template_type (required), content, subject, content_text.
entities_createEntities: createAInspect
Create a new entity. Creates an empty entity, which is a new database table in the active project; add its columns afterwards with fields_add. Options make it public (queryable without signing in), turn on row-level security (RLS), block new records through the API, or mark it as a many-to-many junction table.
Inputs: name (required), rls, public, junction, +1 more.
entities_deleteEntities: deleteADestructiveInspect
Delete an entity and all its data. Drops the entity's table, removing all of its fields and every record in it for good. To remove one column, use fields_delete; to remove one record, use data_delete. It changes or deletes existing data, so check with the user before running it.
Inputs: name (required).
entities_getEntities: getARead-onlyInspect
Get entity details and fields. Takes the entity name. Returns its table name, its public, RLS and lock-new-records flags, and each field's id, name, database type, display type and required, unique and indexed flags. For one field's full definition, including relationship and select options, use fields_get.
Inputs: name (required).
entities_listEntities: listARead-onlyInspect
List all entities. Returns each entity (table) in the active project with its database table name, field count, and whether it is public or has row-level security (RLS) on. System entities are not included. To see one entity's settings and field definitions, use entities_get.
Inputs: no named parameters.
entities_updateEntities: updateADestructiveInspect
Update entity settings. Changes an entity's public, row-level security (RLS) and lock-new-records settings; any you leave out keep their current value. It cannot rename the entity or change its fields, so use fields_update for columns. Making an entity public lets anyone query its records without signing in. It changes or deletes existing data, so check with the user before running it.
Inputs: name (required), rls, public, lock_records.
fetchFetchADestructiveInspect
Make an authenticated API request to the active project. Sends a request to any project endpoint, with the path relative to /org/{project}, using the CLI's credentials, and prints the response body. Use it only where no dedicated tool exists, such as /permissions or integration field options; POST, PUT and DELETE change data. all follows every page of a GET. It changes or deletes existing data, so check with the user before running it.
Inputs: path (required), all, body, method.
fields_addFields: addAInspect
Add a field to an entity. Adds a column to an existing entity; always pass the database type. The display type defaults from it (varchar to input, boolean to checkbox, relationships to relationship). Relationship types need the target entity's name, and on-delete defaults to CASCADE; user and file fields link to users and files automatically. Returns the new field's id.
Inputs: name (required), entity (required), type, label, +13 more.
fields_deleteFields: deleteADestructiveInspect
Delete a field from an entity. Takes the field's name, not its id, and drops that column from the entity, so the value it held is lost from every record. To remove the whole entity and its records, use entities_delete. It changes or deletes existing data, so check with the user before running it.
Inputs: entity (required), field_name (required).
fields_getFields: getARead-onlyInspect
Get the full definition of one field (including relationship config). Finds the field by name on the entity (not case-sensitive) and returns its full definition as a JSON object, including relationship settings, select options, default value and search flags. To see every field on an entity at once, use fields_list.
Inputs: entity (required), field_name (required).
fields_listFields: listARead-onlyInspect
List fields on an entity. Takes the entity name. Returns each field's id, name, label, database type, display type and its required, unique, indexed and locked flags. For one field's complete definition, including relationship target and select options, use fields_get; for the entity's own settings, use entities_get.
Inputs: entity (required).
fields_updateFields: updateADestructiveInspect
Update properties of an existing field. Changes a field's label, description, display type, default value, select options and its required, searchable, public-search and indexed flags. Settings you don't pass keep their value, except the description, which is cleared unless passed again. It cannot rename a field or change its database type, and locked fields are refused. It changes or deletes existing data, so check with the user before running it.
Inputs: entity (required), field_name (required), label, public, +13 more.
files_deleteFiles: deleteADestructiveInspect
Delete a file by ID. Removes the file from the project's storage by its id. Records that reference it through a file field follow that field's on-delete rule; with the default, CASCADE, they are deleted too. To see what is stored first, use files_get. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
files_getFiles: getARead-onlyInspect
Get file metadata by ID. Returns one file's original and stored names, type, size, whether it is public and when it was uploaded. It gives metadata only, not the file's contents or a download link. To browse all files, use files_list.
Inputs: id (required).
files_listFiles: listARead-onlyInspect
List uploaded files. Returns one page of the project's uploaded files, 25 by default, with each file's id, original name, type, size, whether it is public and when it was uploaded. Use files_get for one file's details, including its stored name.
Inputs: page, limit.
files_uploadFiles: uploadAInspect
Upload a file. Uploads a file from a path on the machine running the CLI to the project's file storage and returns its new id and stored name. Files are private by default; a public file can be fetched without signing in. Use the returned id as the value of a file field with data_create or data_update.
Inputs: path (required), public.
import_directusImport: directusADestructiveInspect
Import collections, fields, flows, and data from a Directus instance. Writes into the active project: run with --dry-run first and add --yes only once the user has approved the plan. Copies a Directus instance's collections and fields into the active project as entities and fields; flows, files, roles and records come across only with include_flows, include_files, include_roles and include_data. Call it with dry_run first and show the user the plan, because a call without dry_run applies the import straight away. Returns JSON. It changes or deletes existing data, so check with the user before running it.
Inputs: to, url, token, dry_run, +5 more.
integrations_connectIntegrations: connectAInspect
Connect to a provider with an API key (prompts for the key if not given). Only for providers whose auth type is api_key (see integrations_get); OAuth providers fail here and need integrations_oauth_configure. Stores the key encrypted on the server and creates a project-wide connection, or a private one with user_connection, printing its id. Pass the key in api_key, then check the connection with integrations_test.
Inputs: provider (required), name, api_key, user_connection.
integrations_connections_listIntegrations: connections listARead-onlyInspect
List your integration connections. Shows each connection's id, provider, name, scope (the whole project or one user) and whether it is enabled; stored credentials are never shown. Use the id with integrations_test, integrations_enable, integrations_disable and integrations_disconnect.
Inputs: provider.
integrations_disableIntegrations: disableAInspect
Disable a connection. Stops integrations_execute and workflow steps from using the connection but keeps its stored credentials, so integrations_enable can turn it back on. Prefer this to integrations_disconnect when the pause may be temporary.
Inputs: connection_id (required).
integrations_disconnectIntegrations: disconnectADestructiveInspect
Delete a connection. Removes the connection and its stored credentials from the project; workflow steps that rely on it fail until the provider is connected again with integrations_connect or the OAuth flow. Use integrations_disable to pause it instead. It changes or deletes existing data, so check with the user before running it.
Inputs: connection_id (required).
integrations_enableIntegrations: enableAInspect
Enable a connection. Turns a disabled connection back on so integrations_execute and workflow steps can use it again; its stored credentials are unchanged. Returns the connection's name and new state. The opposite is integrations_disable.
Inputs: connection_id (required).
integrations_executeIntegrations: executeAInspect
Run an operation on a connected provider. Calls the provider live with the project's first enabled connection to it, using inputs given as key=value pairs or a JSON object, and may incur the provider's charges. The API currently runs only the claude provider (inputs prompt, system_prompt, model, max_tokens); other providers return an error, so use them in workflow steps via workflows_integration_add. Returns JSON.
Inputs: provider (required), operation (required), input, inputs.
integrations_getIntegrations: getARead-onlyInspect
Show details and operations for one provider. Shows the provider's description, auth type and each operation's key, name and description. Operation keys are what integrations_execute and workflow integration steps (workflows_integration_add) take. It does not say whether the project is connected; integrations_connections_list does.
Inputs: provider (required).
integrations_listIntegrations: listARead-onlyInspect
List available integration providers. Start here when connecting a third-party service. Shows each provider's key, category, auth type (api_key or oauth2) and operation count; providers turned off for this project are left out. Next, read a provider with integrations_get, then connect it with integrations_connect (API key) or integrations_oauth_configure (OAuth).
Inputs: no named parameters.
integrations_oauth_callback_urlIntegrations: oauth callback urlARead-onlyInspect
Print the redirect URL to add to OAuth app configurations (same for every provider). Prints only the dashboard redirect URL for this project, worked out locally from the API address and project id without an API call. Give it to the user to add to their OAuth app at the provider before integrations_oauth_configure; integrations_oauth_status shows it with the provider's setup state.
Inputs: no named parameters.
integrations_oauth_configureIntegrations: oauth configureADestructiveInspect
Set the OAuth client ID + secret for a provider. Saves the client ID and secret of an OAuth app the user created at the provider and enables it for the project (disable saves it switched off). Each run replaces the previous settings, so social sign-in turns off unless use_social_sign_in is passed again. Afterwards users connect from the dashboard or with integrations_oauth_connect. It changes or deletes existing data, so check with the user before running it.
Inputs: provider (required), disable, client_id, client_secret, +1 more.
integrations_oauth_connectIntegrations: oauth connectAInspect
Connect via the browser OAuth flow (starts a local listener). Opens the provider's sign-in page in a browser on this machine and waits up to five minutes for the callback on localhost (port 8745 by default), then creates the connection. A person must complete the sign-in, and the provider must first be set up with integrations_oauth_configure; for API-key providers use integrations_connect.
Inputs: provider (required), name, port, no_open, +2 more.
integrations_oauth_statusIntegrations: oauth statusARead-onlyInspect
Show OAuth client setup status for a provider. Shows whether a client ID is saved for the provider, whether it is enabled and also used for end-user social sign-in, and the redirect URL its OAuth app must allow. Check it before integrations_oauth_configure, or after to confirm the credentials were saved.
Inputs: provider (required).
integrations_testIntegrations: testAInspect
Test a connection. Use after connecting, with an id from integrations_connections_list. The API currently only confirms the connection exists in this project and does not call the provider, so a pass does not prove the stored credentials work.
Inputs: connection_id (required).
loginSign inAInspect
Log in to the Anythink platform with email and password. Returns a session token used for account and project management. For Google sign-in, use the 'login_google' tool.
Inputs: email (required), password (required).
login_directSign in to a project directlyAInspect
Store credentials directly for a project (bypasses billing login). Use this when you already have an org ID and API key or JWT token.
Inputs: orgId (required), token, apiKey, baseUrl, +1 more.
login_googleSign in with GoogleAInspect
Sign in to the Anythink platform with Google. Opens the user's browser to Google's consent screen and waits for them to approve, then stores the session token. The browser step must be completed by the user; everything before and after is tool-driven. This does NOT pick a billing account or project — after it returns, call 'accounts_list' then 'accounts_use', and 'projects_list' then 'projects_use'. Needs a local browser, so it only works over stdio (not the hosted HTTP server).
Inputs: no named parameters.
logoutSign outAInspect
Remove the saved credentials for a project profile from local CLI config. Use this to disconnect from a project or clear a stale token; it deletes only the stored profile locally and does not revoke the token server-side or affect the project. Omit the profile to remove the currently active one. Run 'config_show' to see profile names.
Inputs: profile.
oauth_google_configureOauth: google configureADestructiveInspect
Set Google OAuth client ID and secret. Saves the Google Cloud OAuth client ID and secret that let the project's end users sign in with Google, and switches that sign-in on or off. It only works interactively, prompting for each value (blank keeps the current one), then prints the callback URL to add to the Google OAuth client. It changes or deletes existing data, so check with the user before running it.
Inputs: no named parameters.
oauth_google_statusOauth: google statusARead-onlyInspect
Show Google OAuth configuration status. Reports whether Google sign-in for the project's end users is enabled and whether a client ID and secret are saved, without showing them. This covers user sign-in only; Google as an integration is handled by integrations_oauth_status and integrations_oauth_configure.
Inputs: no named parameters.
pay_connectPay: connectAInspect
Set up a Stripe Connect account and start onboarding. Creates the project's Stripe Connect account and opens Stripe's hosted onboarding page in a browser, which must be finished before plans can take card payments. It prompts for business type, country and email, so it needs an interactive terminal. Check pay_status first.
Inputs: no named parameters.
pay_entitlementPay: entitlementARead-onlyInspect
Show the current user's access / trial entitlement. Reports whether the signed-in user (the one this tool runs as) has paid or trial access in the project's app: status, trial end and days left, subscription id, provider, product and expiry. Read-only. To look up another user, use pay_subscriptions_by_user.
Inputs: no named parameters.
pay_methodsPay: methodsARead-onlyInspect
List saved payment methods. Lists the cards and other payment methods saved by the signed-in user as a customer of this project: type, brand, last four digits and expiry. It does not list your end users' cards or the card on your Anythink billing account. Read-only.
Inputs: no named parameters.
pay_offers_activatePay: offers activateAInspect
Activate a paused offer. Sets an offer's status to active so its codes can be redeemed again, still subject to its validity dates and caps. Use it to undo pay_offers_pause or to reopen an expired offer.
Inputs: id (required).
pay_offers_add_codePay: offers add codeAInspect
Add a promo/referral code to an offer. Creates a code users enter to redeem the offer: a shared promo code, or with an owner user id, a personal referral code tied to that user. Returns the new code. There is no tool to remove a single code; codes go only when the offer is deleted with pay_offers_delete.
Inputs: id (required), slug, owner_user_id.
pay_offers_codesPay: offers codesARead-onlyInspect
List the promo/referral codes attached to an offer. Lists every code on one offer, both shared promo codes and per-user referral codes, with slug, owner (or shared), redemption count and created date. Read-only. To find a specific user's personal referral code, use pay_offers_user_code.
Inputs: id (required).
pay_offers_createPay: offers createAInspect
Create an offer (rewards via convenience flags or raw JSON). Creates an offer of kind discount, trial_extension or referral. A redeemer reward is required, as raw JSON or a shortcut such as trial days or discount percent; referrer reward, eligibility, caps and dates are optional. Discount offers also create a Stripe coupon. Add a code users can enter with pay_offers_add_code.
Inputs: kind, name, status, total_cap, +12 more.
pay_offers_deletePay: offers deleteADestructiveInspect
Permanently delete an offer and all its codes + redemptions (history is lost; trial bonuses already granted are preserved). Returns how many codes and redemptions were deleted and how many trial bonuses were kept. The offer's Stripe coupon is not removed. To stop redemptions while keeping the history, use pay_offers_pause instead. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
pay_offers_getPay: offers getARead-onlyInspect
Show one offer by id (guid). Shows one offer in full: kind, description, status, primary code, redeemer and referrer rewards, eligibility rules, per-user and total caps, validity dates and linked Stripe coupon id. Read-only; its codes and redemptions come from pay_offers_codes and pay_offers_redemptions.
Inputs: id (required).
pay_offers_listPay: offers listARead-onlyInspect
List offers. Lists the project's offers (discounts, trial extensions and referral schemes that users redeem with a code): id, name, kind, primary code, redeemer and referrer rewards, and status. Read-only. Offers are separate from subscription plans (pay_plans_list).
Inputs: no named parameters.
pay_offers_pausePay: offers pauseADestructiveInspect
Pause an offer. Sets an offer's status to paused so none of its codes can be redeemed; past redemptions and rewards already granted stay. Reversible with pay_offers_activate. Prefer this to pay_offers_delete to stop an offer without losing its history. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
pay_offers_redemptionsPay: offers redemptionsARead-onlyInspect
List redemptions for an offer. Lists who redeemed one offer, paged: the redeemer, the status of their reward, the referrer if any and the referrer's reward status, and when it was redeemed. Read-only; use it to check whether referral rewards were granted.
Inputs: id (required), page, limit.
pay_offers_updatePay: offers updateADestructiveInspect
Update an offer (patch — only supplied fields change; kind is immutable). Changes an offer's name, description, rewards, eligibility, caps, dates or status; omitted fields are kept. Setting status to paused or expired stops its codes being redeemed. Changing a discount reward does not update the Stripe coupon made at creation. For status alone, pay_offers_pause and pay_offers_activate are simpler. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), name, status, total_cap, +12 more.
pay_offers_user_codePay: offers user codeAInspect
Look up a user's personal referral code. Returns one user's personal referral code (by numeric user id) with its slug, offer name and redemption count. If the user has no code yet the server generates one, so this call can create a code. To list all codes on one offer, use pay_offers_codes.
Inputs: user_id (required).
pay_payment_optionsPay: payment optionsARead-onlyInspect
Show available payment providers for a platform/storefront. Shows which payment providers (such as Stripe or Apple in-app purchase) the project offers to an app on a platform (ios, android or web), optionally for an App Store storefront country code. Read-only; use it to see what a client app will be offered.
Inputs: platform, storefront.
pay_paymentsPay: paymentsARead-onlyInspect
List recent payments. Lists card payments the project has taken from its end users through AnythinkPay (Stripe), with id, amount, currency, status, description and date, paged by page and limit. Read-only; there is no refund tool. For recurring billing records use pay_subscriptions_list.
Inputs: page, limit.
pay_plans_createPay: plans createAInspect
Create a subscription plan (prompts for missing fields). Creates a subscription plan (a recurring price end users can buy), defaulting to gbp, monthly, type web and active, and once Stripe Connect is onboarded syncs a matching Stripe product and price. Nobody is charged until a user subscribes. Set the Apple product id to map an in-app purchase to it.
Inputs: name, type, amount, currency, +12 more.
pay_plans_deletePay: plans deleteADestructiveInspect
Delete a subscription plan. Removes a subscription plan so it can no longer be chosen. Existing subscriptions on it, and its Stripe product and price, are left in place and keep billing. To hide a plan reversibly, use pay_plans_update with inactive instead. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
pay_plans_getPay: plans getARead-onlyInspect
Show one plan by id. Shows one of the project's subscription plans in full, including type, price and interval, trial, Stripe product name and description, reference, Apple product and subscription group ids, and whether it is active. Read-only; browse plans with pay_plans_list.
Inputs: id (required).
pay_plans_listPay: plans listARead-onlyInspect
List subscription plans. Lists the project's own subscription plans, the recurring prices its end users can subscribe to: id, internal plan name, display name, price per interval, trial days, Apple product id and whether active. Read-only. Not the same as plans, which lists Anythink's hosting plans for projects.
Inputs: no named parameters.
pay_plans_updatePay: plans updateADestructiveInspect
Update a subscription plan (any --flag overrides; unset = keep). Changes a subscription plan; omitted fields keep their current values, and active or inactive shows or hides it from the plan picker. Changing the amount, currency or interval points the plan at a new Stripe price for new sign-ups; existing subscriptions keep their old price. Prefer inactive over pay_plans_delete. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), name, type, active, +14 more.
pay_statusPay: statusARead-onlyInspect
Show Stripe Connect account status. Reads the project's Stripe Connect account, the account your end users' card payments are paid into: account id, whether onboarding is complete, and whether charges and payouts are enabled. Read-only. If there is no account or onboarding is unfinished, use pay_connect.
Inputs: no named parameters.
pay_subscriptions_by_userPay: subscriptions by userARead-onlyInspect
List subscriptions accessible to a user. Lists the subscriptions one project user (by numeric user id) is linked to, with id, name, status, price and created date. Read-only. Use it to look up a customer's subscriptions; pay_entitlement and pay_subscriptions_check_access only report on the signed-in user.
Inputs: user_id (required).
pay_subscriptions_cancelPay: subscriptions cancelADestructiveInspect
Cancel a subscription. Schedules a Stripe subscription to cancel at the end of its current billing period: the customer keeps access until then and is not charged again. Reversible before the period ends with pay_subscriptions_resume. Apple subscriptions are cancelled by the customer in the App Store. To end access now, see pay_subscriptions_force_expire. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
pay_subscriptions_check_accessPay: subscriptions check accessARead-onlyInspect
Check whether the current user has access to a subscription by name. Checks whether the signed-in user (the one this tool runs as) holds a subscription with the given name, optionally requiring a status, and returns whether they have access plus that subscription's id, name and status. Read-only. For another user use pay_subscriptions_by_user.
Inputs: name (required), status.
pay_subscriptions_deletePay: subscriptions deleteADestructiveInspect
Hard-delete a subscription (project admin). Project-admin recovery tool that permanently removes a stuck or duplicate subscription record and its user links from Anythink. It does not cancel at Stripe or Apple, so the customer can still be billed; use pay_subscriptions_cancel first if billing should stop. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
pay_subscriptions_eventsPay: subscriptions eventsARead-onlyInspect
Show the lifecycle history of a subscription. Returns a subscription's lifecycle history, one row per event with time, event type, source, status change and summary. Read-only; check it to explain a subscription's state before using pay_subscriptions_cancel, pay_subscriptions_resync or pay_subscriptions_relink.
Inputs: id (required).
pay_subscriptions_force_expirePay: subscriptions force expireADestructiveInspect
Force-expire a subscription immediately (project admin). Project-admin recovery tool that sets a subscription's status to expired and clears its current period, so the user loses access at once while the record is kept. It changes only Anythink's record, not Stripe or Apple, so it does not stop future charges; use pay_subscriptions_cancel for that. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
pay_subscriptions_getPay: subscriptions getARead-onlyInspect
Show one subscription by id (guid). Shows one subscription in full: status, price, customer email and name, current billing period, trial end, cancellation and scheduled auto-cancel dates, reference and any checkout URL. Read-only; for how it got into this state use pay_subscriptions_events.
Inputs: id (required).
pay_subscriptions_listPay: subscriptions listARead-onlyInspect
List subscriptions (paginated, optionally filtered by --status). Lists the project's subscriptions (end users' recurring Stripe or Apple purchases of a plan) with id, name, status, price, customer email and created date, paged, optionally filtered by status such as active, trialing or cancelled. Read-only. Non-admins see only subscriptions they are linked to.
Inputs: page, limit, status.
pay_subscriptions_relinkPay: subscriptions relinkADestructiveInspect
Move a subscription to another user (project admin). Project-admin tool that moves a subscription to another project user (numeric user id), replacing all its existing user links, to fix a purchase bound to the wrong account. The previous user loses access; billing at Stripe or Apple is unchanged. Undo by relinking it back. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), to_user_id.
pay_subscriptions_resumePay: subscriptions resumeAInspect
Resume a cancelled subscription. Removes a scheduled cancellation from a Stripe subscription, so it renews and charges the customer again at the end of the current period. Use it to undo pay_subscriptions_cancel before the period ends.
Inputs: id (required).
pay_subscriptions_resyncPay: subscriptions resyncADestructiveInspect
Re-sync a subscription from the provider (project admin). Project-admin tool that fetches a Stripe subscription's live state from Stripe and overwrites the stored record, returning the result. Use it when the status shown disagrees with Stripe. Apple subscriptions aren't supported yet and return an error. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
pay_trial_disablePay: trial disableAInspect
Disable the app engagement trial. Turns off the project-wide app engagement trial, so users without a subscription no longer get free app access. Changes only this project setting and leaves the others as they were; undo with pay_trial_enable. Trial days granted by offers are separate and unaffected.
Inputs: no named parameters.
pay_trial_enablePay: trial enableAInspect
Enable the app engagement trial. Turns on the project-wide app engagement trial, so users without a subscription get free app access for the longest trial length among active plans. Changes only this project setting and leaves the others as they were; undo with pay_trial_disable. Unrelated to offer trial rewards (pay_offers_create).
Inputs: no named parameters.
pay_trial_statusPay: trial statusARead-onlyInspect
Show whether the trial is enabled and its derived length. Reports whether the project-wide app engagement trial is on and how long it lasts. The length is not set directly: it is the longest trial among active subscription plans, and that plan is named. Read-only; change it with pay_trial_enable, pay_trial_disable or a plan's trial days in pay_plans_update.
Inputs: no named parameters.
projects_createCreate a projectAInspect
Provision a new project — a dedicated, isolated Anythink backend instance with its own database, API, auth, and storage. Requires platform login and an active billing account (set one with 'accounts_use'). Provisioning runs asynchronously: the project starts in a Provisioning state, so poll 'projects_list' until it is Active. Returns the new project's id, name, org id, and API URL. Connect to it with 'projects_use'.
Inputs: name (required), planId (required), region, accountId, +1 more.
projects_deleteDelete a projectADestructiveInspect
Permanently delete a project and tear down its backend instance, including its database and stored data. This is destructive and irreversible — always confirm with the user first, and prefer matching by a specific id over a short prefix to avoid removing the wrong project. Requires an active billing account (set one with 'accounts_use'). Returns the deleted project's name and id on success.
Inputs: id (required), accountId.
projects_listList projectsARead-onlyInspect
List the projects (provisioned backend instances) in a billing account. Requires platform login and an active billing account (set one with 'accounts_use'). Returns each project's id, name, description, region, org id, status (Initializing/Provisioning/Active/Suspended/Terminated/Error), API URL, and creation date. Use this to find a project's id before connecting with 'projects_use' or removing it with 'projects_delete'.
Inputs: accountId.
projects_useSwitch the active projectAInspect
Connect to a project and save it as the active profile so the 'cli' tool's data, entities, users, and other commands target it. Resolves the project, then either stores the API key you pass or exchanges a transfer token for project-scoped credentials automatically. Requires an active billing account (set one with 'accounts_use'); the project must be Active (see 'projects_list'). Returns the saved profile name, org id, API URL, and auth method.
Inputs: id (required), apiKey, accountId.
roles_createRoles: createAInspect
Create a new role. Adds a role with no entity permissions yet, so its users can't reach any data until you grant actions with roles_permissions_add. Then give it to people by passing its id as role_id to users_invite. Role names must be unique in the project.
Inputs: name (required), description.
roles_deleteRoles: deleteADestructiveInspect
Delete a role by ID. Removes a role and the permissions it grants. The API refuses while any user still holds the role, and the built-in admin role can't be deleted, so check users_list for its holders first. To take away only some access, use roles_permissions_remove instead. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
roles_listRoles: listARead-onlyInspect
List all roles. Lists the project's roles with id, name, description and whether each is active. Access works through roles: each user holds one role, and a role grants actions (read, create, update, delete) per entity. Use roles_permissions_list to see what one role grants.
Inputs: no named parameters.
roles_permissions_addRoles: permissions addAInspect
Add entity permissions to a role. Grants a role one or more actions (read, create, update, delete; default read) on one entity, and every user holding the role gains them at once. Its other permissions are kept and actions it already has are skipped. An action with no matching permission for that entity is reported and skipped.
Inputs: entity (required), role_id (required), actions.
roles_permissions_listRoles: permissions listARead-onlyInspect
List entity permissions for a role. Shows, entity by entity, which actions (read, create, update, delete) a role grants. Use it before roles_permissions_add or roles_permissions_remove, or to explain why users with that role can or can't reach some data.
Inputs: role_id (required).
roles_permissions_removeRoles: permissions removeADestructiveInspect
Remove entity permissions from a role. Takes one or more actions (default read) on one entity away from a role; every user holding the role loses them at once, and its other permissions are kept. Actions the role doesn't have are ignored. Use roles_permissions_list first to see what it grants. It changes or deletes existing data, so check with the user before running it.
Inputs: entity (required), role_id (required), actions.
search_auditSearch: auditARead-onlyInspect
Compare configured public-searchable fields vs what public search actually returns. Flags any data leaks. Runs the same query (default *) through public and signed-in search for one entity, sampling 5 records by default, and reports any field public search returned that is not marked publicly searchable, plus marked fields that didn't appear. It ends with an error when a leak is found. Fix leaks with fields_update. Returns JSON.
Inputs: entity (required), query, sample.
search_purgeSearch: purgeADestructiveInspect
Purge the search index. Omit ENTITY to purge everything (admin only). Deletes the search index entries for the entity, or for every entity, so search_query and search_similar return nothing for them until search_rehydrate runs. The records in the database are not touched. It changes or deletes existing data, so check with the user before running it.
Inputs: entity.
search_querySearch: queryARead-onlyInspect
Run a search query. Searches the search index across all indexed entities or the ones listed, with optional filter (status=published AND category=news), sort, facets and highlighting; use * to browse. The public option searches as an anonymous visitor. To list one entity's records by exact field values, use data_list; if indexed records are missing, use search_rehydrate. Returns JSON.
Inputs: text (required), page, sort, facet, +5 more.
search_rehydrateSearch: rehydrateAInspect
Rehydrate the search index. Omit ENTITY to rehydrate everything (admin only). Re-sends the entity's records, or every entity's, from the database to the search index, replacing existing entries; it runs in the background and can take a while on large entities. Use it when search_query misses records or after changing which fields are searchable. It changes no data; to clear the index instead, use search_purge.
Inputs: entity.
search_similarSearch: similarARead-onlyInspect
Find documents similar to a given record (vector search). Takes an entity and a record id and returns the records closest in meaning to it, 10 by default, using vector embeddings in the search index. The public option searches as an anonymous visitor and returns only publicly searchable fields. To find records matching words you supply, use search_query. Returns JSON.
Inputs: id (required), entity (required), limit, public.
secrets_createSecrets: createAInspect
Store a new secret value. Stores the value encrypted in the project under the key, for workflows to reference as {{ $anythink.secrets.KEY }}; it can never be read back. Pass it in value, as the hidden prompt can't be answered by a tool. To change an existing secret use secrets_update.
Inputs: key (required), value.
secrets_deleteSecrets: deleteADestructiveInspect
Delete a secret. Removes the key and its encrypted value for good; workflows that reference it as {{ $anythink.secrets.KEY }} fail until it is created again. To change a value, use secrets_update instead. It changes or deletes existing data, so check with the user before running it.
Inputs: key (required).
secrets_listSecrets: listARead-onlyInspect
List all secret keys (metadata only, values never shown). Shows each secret's key, the users it is assigned to, and when it was created and updated; values are never returned. Use it to check a key exists before referencing it in a workflow as {{ $anythink.secrets.KEY }}, or before secrets_update or secrets_delete.
Inputs: no named parameters.
secrets_updateSecrets: updateADestructiveInspect
Rotate (overwrite) an existing secret value. Overwrites the stored value of an existing key, for example to rotate a credential; the old value is lost and workflows referencing the key use the new one from their next run. Pass the new value in value. Use secrets_create for a key that doesn't exist yet. It changes or deletes existing data, so check with the user before running it.
Inputs: key (required), value.
settings_cors_addSettings: cors addAInspect
Add an allowed origin (clears the CORS cache). Adds a web app origin (scheme, host and optional port, no path) or a wildcard such as https://*.example.com, so browser apps there can call the project's API straight away. A wildcard over shared hosting such as vercel.app trusts other people's sites, so check with the user first. An origin already listed is left as it is.
Inputs: url (required).
settings_cors_listSettings: cors listARead-onlyInspect
List allowed application URLs. Shows the web app origins allowed to call this project's API from a browser. Anythink's own domains and localhost are always allowed and aren't listed. Change the list with settings_cors_add and settings_cors_remove.
Inputs: no named parameters.
settings_cors_removeSettings: cors removeADestructiveInspect
Remove an allowed origin (clears the CORS cache). Removes an origin from the allow-list and clears the CORS cache, so browser apps on it are blocked straight away. Pass the origin as settings_cors_list shows it; a value not in the list is reported and nothing changes. It changes or deletes existing data, so check with the user before running it.
Inputs: url (required).
settings_getSettings: getARead-onlyInspect
Show all project settings. Shows the project's name, description, email confirmation and sign-up rules, default role for new users, group RLS, AI mode and model, payment redirect URLs, trial settings and allowed CORS origins. Secret-like values such as google_maps_key show only as set. Its field names are the keys settings_set takes. Returns JSON.
Inputs: no named parameters.
settings_setSettings: setADestructiveInspect
Set a single project setting. Changes one setting, named as in settings_get (for example allow_registrations, default_role_id, ai_mode or payment_success_url), and keeps the rest; booleans take true or false. Opening sign-ups, turning off email confirmation or giving new users an admin role goes through without a further prompt. For CORS origins use settings_cors_add. It changes or deletes existing data, so check with the user before running it.
Inputs: key (required), value (required).
signupSign up for AnythinkAInspect
Register a brand-new Anythink platform account with email and password. Use this only when the user has no account yet; if they already have one, use 'login' instead. This creates the top-level user identity — it does not create a billing account or project (do that with 'accounts_create' and 'projects_create' after logging in). On success the user may need to click an email confirmation link before 'login' works; tell them to confirm, then call 'login'.
Inputs: email (required), lastName (required), password (required), firstName (required), +1 more.
users_deleteUsers: deleteADestructiveInspect
Delete a user by ID. Removes the user from this project, so they can no longer sign in to it or use their role's access. The role and its permissions stay in place for everyone else. Make sure you have the right person with users_get first. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
users_getUsers: getARead-onlyInspect
Get a user by ID. Shows one user's name, email, role, whether they have confirmed their invitation and when they were created. Use it to check one person's role; use users_list to scan everyone, and roles_permissions_list to see what their role allows.
Inputs: id (required).
users_inviteUsers: inviteAInspect
Create a user and send an invitation email. Adds the person to this project with the role given by role_id, then emails them an invitation to confirm their account. Always pass role_id from roles_list: the API rejects an invite without an existing role, and administrator roles can't be given this way. Check users_list first so nobody is invited twice.
Inputs: email (required), last_name (required), first_name (required), role_id.
users_listUsers: listARead-onlyInspect
List all users. Shows each person who can sign in to this project with their id, name, email, role and whether they have confirmed their invitation. Use it to find a user's id, or to see who holds a role before changing it with roles_permissions_add or deleting it with roles_delete.
Inputs: no named parameters.
users_meUsers: meARead-onlyInspect
Show the currently authenticated user. Shows the user you are signed in as in this project: id, name, email, role, whether confirmed and when created. Your role decides what every other tool may do, so check it when a call is refused; use users_get to look up someone else.
Inputs: no named parameters.
workflows_createWorkflows: createAInspect
Create a new workflow. Creates the workflow with one trigger and no steps: Manual needs entity, Timed needs cron, Event needs entity plus an event (EntityCreated by default) and an optional filter, and Api needs api_route. It stays disabled unless enabled is set; add steps with workflows_step_add, then turn it on with workflows_enable.
Inputs: name (required), cron, event, entity, +6 more.
workflows_deleteWorkflows: deleteADestructiveInspect
Delete a workflow. Removes the workflow with its triggers and steps, so it stops running and can't be restored. To stop it for a while use workflows_disable; to keep a copy first, use workflows_export. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required).
workflows_disableWorkflows: disableAInspect
Disable a workflow. Stops the workflow running from its triggers but keeps its triggers, steps and job history, so workflows_enable turns it back on. Prefer this to workflows_delete when a workflow should only stop for a while.
Inputs: id (required).
workflows_enableWorkflows: enableAInspect
Enable a workflow. An enabled workflow runs on its own from its triggers: Timed on its cron schedule, Event when the matching event happens, Api when its route is called. Use workflows_disable to pause it without losing its steps.
Inputs: id (required).
workflows_exportWorkflows: exportADestructiveInspect
Export an existing workflow to JSON (round-trippable with seed). Gives the workflow's definition as JSON with no ids: its triggers, and its steps with their parameters, linked by step key through on_success/on_failure. Use it to back up or copy a workflow; for the ids the step tools need, use workflows_get. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), output.
workflows_file_handler_addWorkflows: file handler addAInspect
Add a FileHandler step with named flags (no hand-written params JSON). The step attaches a file to a record's file field: fetch_and_link downloads source_url, link_existing attaches existing_file_id, and detach unlinks it; entity, record_id (usually {{ $anythink.trigger.id }}) and field are always needed. Unlike workflows_step_add it can set on_success/on_failure in the same call, and the step is created disabled unless enabled is set.
Inputs: step_key (required), workflow_id (required), name, field, +14 more.
workflows_file_handler_exampleWorkflows: file handler exampleARead-onlyInspect
Print a copy-paste-ready FileHandler params JSON. The sample uses {{ $anythink... }} templates for the source URL, record id and folder, and changes nothing in the project. Adapt it as params for workflows_step_add or workflows_step_update; to add a FileHandler step directly, workflows_file_handler_add is simpler.
Inputs: no named parameters.
workflows_getWorkflows: getARead-onlyInspect
Get workflow details and steps. Includes each trigger with its last and next run, and every step with its id, key, action, parameters, start-step flag and on_success/on_failure step ids. Use those step ids with workflows_step_update, workflows_step_link and workflows_step_delete; for a copy without ids, use workflows_export. Returns JSON.
Inputs: id (required).
workflows_integration_addWorkflows: integration addAInspect
Add an Integration step (Claude, OpenAI, Slack…) with named flags (no hand-written params JSON). The step runs one provider operation, such as claude generate-text, with inputs given as key=value pairs that accept {{ $anythink... }} templates; find provider and operation keys with integrations_get. credential_source chooses the credentials (system, current_user, connection with connection_id, or entity_field), and the step is created disabled unless enabled is set.
Inputs: step_key (required), workflow_id (required), name, input, +11 more.
workflows_jobsWorkflows: jobsARead-onlyInspect
View job history for a workflow. Shows the 10 most recent runs, each with its status (Completed, Failed or Running), start time and error, plus every step's status, error and log. Use it after workflows_trigger, or when an event or schedule should have fired, to see whether a run worked and which step failed.
Inputs: id (required).
workflows_listWorkflows: listARead-onlyInspect
List all workflows. Each entry gives the workflow's id, name, description, enabled flag, step count and its triggers (Manual, Timed, Event or Api) with their config, but not the steps. Use workflows_get to see a workflow's steps and how they link. Returns JSON.
Inputs: no named parameters.
workflows_seedWorkflows: seedAInspect
Create a workflow and its steps from a JSON file. Reads a JSON file on this machine in the workflows_export format (name, trigger or triggers, and steps with key, action, parameters and on_success/on_failure by step key), fills {{KEY}} placeholders from var, then creates the workflow, adds its steps and links them. It always creates a new workflow, so running it twice makes two copies.
Inputs: file (required), var, enabled.
workflows_step_addWorkflows: step addAInspect
Add a step to a workflow. Params are the action's settings as JSON, e.g. {"script":"return {}"} for RunScript or {"entity":"orders","data":{...}} for CreateData. The new step is unlinked: set start on the workflow's first step and chain the rest with workflows_step_link. For FileHandler or Integration steps, workflows_file_handler_add and workflows_integration_add build the params for you.
Inputs: key (required), workflow_id (required), name, start, +3 more.
workflows_step_deleteWorkflows: step deleteADestructiveInspect
Delete a step from a workflow (warns if other steps link to it). The API refuses to delete a step that other steps still point to through on_success or on_failure, so re-point those with workflows_step_link first. Deleting the start step leaves the workflow with no entry point until a new step is added with start. It changes or deletes existing data, so check with the user before running it.
Inputs: step_id (required), workflow_id (required).
workflows_step_getWorkflows: step getARead-onlyInspect
View step details including parameters. Shows one step's key, action, enabled and start-step flags, on_success/on_failure step ids and its full parameters. Read it before workflows_step_update, because params passed there replace the step's parameters as a whole.
Inputs: step_id (required), workflow_id (required).
workflows_step_linkWorkflows: step linkADestructiveInspect
Link workflow steps together (set on-success/on-failure). Sets which step runs next when this one succeeds (on_success) or fails (on_failure), by step id from workflows_get; a link you leave out keeps its current value. Links can be changed but not cleared here, and the step's name, action and params stay as they are. It changes or deletes existing data, so check with the user before running it.
Inputs: step_id (required), workflow_id (required), on_failure, on_success.
workflows_step_updateWorkflows: step updateADestructiveInspect
Update step parameters and properties. Changes a step's name, params or enabled flag and keeps its action, start flag and links; it can enable a step but not disable one. Params replace the step's parameters as a whole, so read them with workflows_step_get first; to change which step runs next, use workflows_step_link. It changes or deletes existing data, so check with the user before running it.
Inputs: step_id (required), workflow_id (required), name, params, +1 more.
workflows_triggerWorkflows: triggerAInspect
Manually trigger a workflow. Starts a run now and returns without the run's result; check the outcome with workflows_jobs. A Manual-trigger workflow needs entity (and entity_id for a specific record), and payload is a JSON object the steps read as $anythink.trigger.data.
Inputs: id (required), entity, payload, entity_id.
workflows_updateWorkflows: updateADestructiveInspect
Update a workflow's name or description. Only the name and description change; the triggers, steps, group and enabled state are sent back unchanged, and no tool here edits a trigger. It refuses to run while an existing trigger is incomplete (e.g. a Timed trigger with no cron), which must be fixed in the dashboard first. To change a step, use workflows_step_update. It changes or deletes existing data, so check with the user before running it.
Inputs: id (required), name, description.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 175 tools
Descriptions are unusually thorough and cross-reference siblings explicitly ('use X instead of Y'), so most boundaries are clear. However, with 175 tools there are genuine overlaps: convenience wrappers (workflows_file_handler_add vs workflows_step_add), preview/get pairs (charts_preview vs dashboards_widget_preview vs dashboards_data), and catch-all escape hatches (cli, fetch, api) that duplicate the dedicated tools' scope. An agent must read carefully to pick correctly, so some overlap exists despite good prose.
Names overwhelmingly follow a snake_case prefix_noun_verb or prefix_verb convention (email_templates_update, menus_update_item, dashboards_add_chart, pay_subscriptions_cancel, workflows_step_add). Minor deviations exist: several unprefixed top-level tools (login, signup, logout, docs, cli, fetch, api) and shorthand pay_* names break the resource-prefix pattern. Still largely predictable.
175 tools is an extreme mismatch for a single MCP server, far past the 50+ threshold. Even granting that Anythink is a full backend platform, cramming project, entity, data, workflow, payment, email, auth, and search management into one surface is unwieldy and forces agents to select blind. This module should be decomposed into several scoped servers.
Coverage is remarkably broad: entities, fields, data, RLS, users, roles, menus, dashboards, charts, workflows, integrations, payments, email, search, secrets, files, API keys, projects and accounts all have full lifecycle tools. Only minor, explicitly acknowledged gaps exist (no refund tool, no way to remove a single offer code, no trigger-editing tool), which agents can work around.
Maintenance
Related MCP Connectors
Build and publish full-stack apps from your coding agent: models, rules, pages, auth, per-app MCP.
Build and run AI workflows, agents, data tables and 1000+ API integrations from any MCP client.
Build, deploy, and host full-stack web apps from any MCP client. DB, auth, storage, cron included.
A full backend your AI coding agent can set up over MCP
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceAn MCP server that provides tools for interacting with Supabase databases, storage, and edge functions.45MIT
- AlicenseNot gradedqualityCmaintenanceThe Stripe Model Context Protocol server allows you to integrate with Stripe APIs through function calling. This protocol supports various tools to interact with different Stripe services.25,970 npm2,053-
- AlicenseNot gradedqualityNot gradedmaintenanceA Model Context Protocol server that helps users migrate subscription businesses from RevenueCat to Adapty through natural language interactions with LLMs like Claude Desktop.MIT
- AlicenseAqualityDmaintenanceEnables comprehensive management of Directus instances through tools for schema manipulation, content CRUD operations, and dashboard management. It allows AI assistants to programmatically interact with collections, fields, relations, and workflow automation using the official Directus SDK.2021 npmMIT