logo
FlexLists
Developers · MCP server

Connect an AI agent to Flexlists

Claude, ChatGPT, Cursor, VS Code, n8n and every other app that speaks MCP (Model Context Protocol) can read and work with your lists — with exactly the rights you give them.

The MCP server of this Flexlists
https://flexlists.com/mcp

1. What it is

The Flexlists MCP server gives an AI agent the tools to work in your Flexlists: find lists, read and filter rows, add and change rows, add fields, build views such as a Kanban or a calendar, attach files, share lists, look at forms and automations. The agent calls these tools itself when you ask it something in plain words.

Ask things like:

“Add a row to my CRM for Acme, stage Lead, value 12,000”
“Which tasks are overdue? Group them by owner”
“Build a Kanban for my hiring pipeline”

It works over the internet (Streamable HTTP, MCP version 2025-06-18) at https://flexlists.com/mcp. Apps that can sign in — claude.ai, Claude Desktop, ChatGPT — only need that address: you sign in to Flexlists and approve. Apps that take a header use an API key.

2. Get a key

1. In Flexlists open Integrations (left menu) → the AI agents (MCP) tab.

In Flexlists open Integrations (left menu) → the AI agents (MCP) tab.

2. Under "Create key for MCP": give it a name, pick Read only or Read & write, and the scope: your full account or one workspace. Click Create key for MCP.

Under "Create key for MCP": give it a name, pick Read only or Read & write, and the scope: your full account or one workspace. Click Create key for MCP.

3. Copy the key now — it is shown only once — or copy the ready-made setup for Claude Code, Cursor or VS Code with the key filled in.

Copy the key now — it is shown only once — or copy the ready-made setup for Claude Code, Cursor or VS Code with the key filled in.

4. A key for some lists only, or with another expiry date: Integrations → API keys → Create new API key, scope "Specific tables", Read or Write, and the expiry date. Every key (also OAuth connections) is listed there and can be revoked.

A key for some lists only, or with another expiry date: Integrations → API keys → Create new API key, scope "Specific tables", Read or Write, and the expiry date. Every key (also OAuth connections) is listed there and can be revoked.

Keep the key secret like a password. It works until it expires or you revoke it, for the lists in its scope, with your rights on them.

3. Add it to your app

Claude Code
API key or OAuth
  1. Run this in a terminal (add --scope user to use it in every project):
  2. Check it with claude mcp list, then ask Claude: "which lists do I have in Flexlists?"
With an API key
claude mcp add --transport http flexlists https://flexlists.com/mcp --header "Authorization: Bearer <your Flexlists API key>"
Or sign in with OAuth (then run /mcp in Claude Code and pick flexlists → Authenticate)
claude mcp add --transport http flexlists https://flexlists.com/mcp

4. Use it

Just ask. The agent picks the tools. Good to know: a list is identified by its listId (from list_lists), rows are keyed by field name, and every tool that deletes asks for confirm: true — the agent has to tell you what goes and wait for your yes.

Context
ToolWhat it doesAccessTry
whoamiWho the key belongs to, its scope and whether it can write
read
“What can you do in my Flexlists?”
list_workspacesThe workspaces the key can see
read
“Which workspaces do I have?”
Lists
ToolWhat it doesAccessTry
list_listsLists, by workspace, folder or name
read
“Show my lists in the Sales folder”
get_list_schemaFields with types, Choice options and relations
read
“Which fields does my CRM have?”
create_listA new list with fields and first rows
write
“Make a list for my book collection”
rename_listRename a list or change its description
write
“Rename "Leads 2024" to "Leads"”
delete_listDelete a list (asks for confirm)
write · confirm
“Delete the old Test list”
list_foldersThe folders of My Lists and My Views
read
“How are my lists organised?”
create_folderA new folder
write
“Make a folder Q4 inside Sales”
move_to_folderMove lists and views into a folder
write
“Put the CRM in the Sales folder”
list_templatesList and view templates
read
“Which templates are there for projects?”
create_from_templateA list (+ view) from a template
write
“Start a sales pipeline from the template, without demo data”
Fields
ToolWhat it doesAccessTry
add_fieldAdd a field, also a relation to another list
write
“Add a Priority field with Low, Medium, High”
update_fieldRename, required, description, Choice options
write
“Add "Lost" to the Stage options”
delete_fieldDelete a field (asks for confirm)
write · confirm
“Remove the Fax field”
Rows
ToolWhat it doesAccessTry
search_rowsFilter, full-text search, sort, page with a cursor
read
“Which tasks are overdue?”
get_rowOne row by id
read
“Show me order 1043”
create_rowsAdd up to 100 rows
write
“Add a row to my CRM for Acme”
update_rowsChange up to 100 rows (only the given fields)
write
“Mark the Acme deal as won”
delete_rowsDelete up to 100 rows (asks for confirm)
write · confirm
“Delete the duplicate contacts”
count_rowsHow many rows match a filter
read
“How many open tickets are there?”
aggregate_rowsCount / sum / avg / min / max, grouped by a field or month
read
“Total deal value per stage”
Views
ToolWhat it doesAccessTry
list_viewsThe views of a list
read
“Which views does the Tasks list have?”
list_view_typesThe view types and the fields they need
read
“Which views could I make for my events?”
create_viewKanban, Calendar, Timeline, Gantt, Map, Gallery, Chart, Mind map, …
write
“Build a Kanban for my hiring pipeline”
get_view_rowsRows as a view filters and sorts them
read
“What is in my "This week" view?”
create_checklistA checklist (items, runs, results + view)
write
“Make a weekly safety checklist”
Comments & history
ToolWhat it doesAccessTry
list_commentsThe comments on a row
read
“What did the team say about Acme?”
add_commentComment on a row
write
“Note on Acme that they want a quote by Friday”
get_row_historyWho changed what, recently
read
“Who changed the price of this product?”
Files
ToolWhat it doesAccessTry
attach_file_to_rowA file from a URL (25 MB) or base64 (5 MB)
write
“Attach this PDF to the Acme contract row”
get_fileDownload links (1 hour) of a row's files
read
“Give me the invoice of order 1043”
read_spreadsheetColumns and first rows of a CSV / XLSX
read
“What is in this spreadsheet? (URL)”
import_spreadsheet_rowsAdd a CSV / XLSX to a list
write
“Import these leads into my CRM”
create_list_from_spreadsheetA new list from a CSV / XLSX
write
“Turn this spreadsheet into a list”
Sharing & groups
ToolWhat it doesAccessTry
get_sharingWho has access to a list
read
“Who can see the Salaries list?”
share_listShare a list by email
write
“Let ann@example.com edit the CRM”
share_list_with_groupShare a list with a group
write
“Give the Sales group read access to Leads”
set_share_roleChange someone's role on a list
write
“Make Bob read-only on the CRM”
unshareTake away access (asks for confirm)
write · confirm
“Remove Bob from the CRM”
list_groupsYour groups and their members
read
“Who is in the Sales group?”
create_groupA new group
write
“Make a group Volunteers with these emails”
update_groupRename a group
write
“Rename Sales to Sales EU”
delete_groupDelete a group (asks for confirm)
write · confirm
“Delete the old Interns group”
add_group_membersAdd people to a group
write
“Add cy@example.com to Sales”
remove_group_memberRemove someone from a group (asks for confirm)
write · confirm
“Take Bob out of Sales”
Forms
ToolWhat it doesAccessTry
list_formsYour forms with their public links
read
“Which forms do I have?”
get_formA form's questions, lists and public URL
read
“What does the signup form ask?”
create_formA public form, planned and built by AI
write
“Make a signup form for the open day”
list_form_submissionsThe latest submissions
read
“Who signed up today?”
set_form_enabledTurn a form on or off
write
“Close the signup form”
Automations & apps
ToolWhat it doesAccessTry
list_automationsYour integrations and workflows
read
“Which automations are on?”
create_automationA link to the builder with your request
write
“Mail me the open tasks every Monday”
set_automation_enabledSwitch an automation on or off
write
“Pause the Slack notification”
run_automationRun an automation now
write
“Run the weekly report now”
list_applicationsYour applications and their links
read
“Which apps did I build?”
create_applicationA link to the app builder with your request
write
“Build a portal where volunteers pick shifts”
Webhooks
ToolWhat it doesAccessTry
list_webhooksYour row-change webhooks
read
“Which webhooks are set up?”
create_webhookSend row changes to a URL
write
“Post new orders to https://hooks.example.com/orders”
delete_webhookRemove a webhook (asks for confirm)
write · confirm
“Remove the old orders webhook”
Help
ToolWhat it doesAccessTry
explain_itemHow an automation, form, app or view template works
read
“Why is my Telegram integration off?”
contact_supportFile a ticket with the Flexlists team
write
“Report to support that my import fails”
Filters

search_rows, count_rows and aggregate_rows take where, the same syntax as the REST API's row search: field name → value (equals), or { "op": …, "value": … } with eq, neq, contains, gt, gte, lt, lte, empty, notEmpty. All conditions must hold. query searches the text fields.

Example arguments of search_rows
{
  "listId": 1234,
  "where": {
    "Status": "Open",
    "Due": {
      "op": "lt",
      "value": "2025-01-31"
    }
  },
  "sort": "Due",
  "limit": 50
}
Pagination

At most 200 rows per call. When a result has a nextCursor, the agent asks again with cursor for the next page. Every result stays under 1 MB: a page with very long texts comes back shorter, with a note, and continues with the cursor.

Files

attach_file_to_row takes a public http(s) URL (Flexlists downloads it, up to 25 MB; private and internal addresses are refused) or base64 content up to 5 MB. get_file returns download links that work for one hour — the bytes never go through the chat. Spreadsheets (CSV, XLSX) are read and imported on the server from a URL or a file already in Flexlists.

Relations

A relation (Lookup) field comes back as { "id": 12, "label": "Acme" }. To set one, give the related row's id, { "id": 12 } or its label ("Acme", looked up in the related list). get_list_schema shows which list a relation points to.

Resources and prompts

Resources: flexlists://lists, flexlists://list/{listId}/schema and flexlists://docs/llm — the guide for agents (plain markdown). Prompts: analyze_list, build_tracker (“make me a list for …”), import_data.

5. Permissions & safety

  • Scope. A key (or OAuth connection) reaches your whole account, one workspace, or specific lists — never more. Lists outside it do not exist for the agent, also not in searches or resources.
  • Read only. A read-only key sees every tool, but a tool that changes data answers “this key is read-only”.
  • Your rights. The agent works as you: what you may not do in the app (e.g. change fields of a list you can only edit rows in, or only add rows as AddOnly), it may not do either.
  • API access configurations. A key of an API access configuration only reaches its own lists, with its permission per list (Read / Add / Edit / Full), its view and its endpoint allowlist — exactly like the REST API.
  • Destructive tools (delete rows, lists or fields, unshare, delete groups or webhooks) need confirm: true: the agent must name what goes and get your yes first. Deleted rows can be undone in the app.
  • Revoke a key under Integrations → API keys, and an OAuth connection under Integrations → AI agents (MCP) → Apps connected with OAuth (it is also in the API keys list). It stops at once.
  • Rate limit: 600 requests per minute per key. Every tool call is logged with its key, tool, result and duration (never your data) — see the usage on the AI agents (MCP) tab.

6. Troubleshooting

401No key, a wrong or revoked key, or an expired key. A login token of the website does not work: use an API key. OAuth apps sign in again by themselves.
403The key may not do this: the list is outside its scope, the configuration does not allow it, or the IP address is not on its allowlist.
429More than 600 requests in a minute: wait the seconds in Retry-After.
Tool not listedReload the server in your app (Claude Code: claude mcp list; Cursor: Settings → MCP). Some apps only show a limited number of tools, or let you switch tools on and off.
Behind a proxyEvery answer is plain JSON on its POST, so proxies that buffer server-sent events are no problem. A proxy must let the Authorization header through.

Test the connection with the MCP Inspector:

npx @modelcontextprotocol/inspector --cli https://flexlists.com/mcp --transport http --header "Authorization: Bearer <your Flexlists API key>" --method tools/list

Or run npx @modelcontextprotocol/inspector, choose “Streamable HTTP”, enter https://flexlists.com/mcp and either an Authorization header or “Open Auth Settings” → Quick OAuth Flow.


More: the REST API reference · the guide for agents (markdown) · Integrations → AI agents (MCP)