Productivity & teams
Redmine
Issues, time entries and projects in your Redmine, from your agent.
12 endpoints
Connect Mode to Claude, ChatGPT or a script. Your agent runs reports, reads the result tables and fixes failing queries. It also sets up the Slack and email digests, with no API key to create.
14 tools Read and write
Mode has a REST API for reports, queries, runs, exports, schedules and subscriptions, and no MCP server of its own that we found (checked 6 Nov 2026). Cotlet gives your agent 14 Mode tools over MCP for chat apps and over REST for scripts. There is no API key or developer setup, it works inside the ChatGPT and Claude apps, and it runs 24/7 on our servers.
| What you need | Mode REST API | mode-mcp on GitHub | Cotlet |
|---|---|---|---|
| List reports, read SQL and run results | Yes, you write the calls | Yes | Yes |
| Start a report run | Yes | No, left out on purpose | Yes, after your OK |
| Create a schedule with Slack or email | Yes, schedules and subscriptions | No | Yes, after your OK |
| Share a report once to Slack or email | No | No | Yes, after your OK |
| Works in the ChatGPT and Claude apps without a developer setup | No, you build the agent layer | Local install with a key and secret | Yes |
| Runs 24/7 without your computer | If you host your script | No, runs on your computer | Yes, hosted |
Checked 6 Nov 2026. Sources: Mode Developer: API introduction · Mode Help: API tokens · Mode: Compare plans · Mode Help: Webhooks · github.com/nataliemona/mode_mcp
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your Mode password, and no query change, schedule or Slack post happens until you approve it. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Sign in to Mode. Sign up, sign in to Mode in its Cloud Browser, then press Enable for agents.
Add the Cotlet address. Add https://cotlet.dev/mcp/v1 as an MCP server or connector in your agent.
Approve the connection. Chat apps ask you to sign in to Cotlet. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries Mode next to your other apps. If you enable Mode after connecting, refresh the connector so the new tools show up.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-mode-analytics \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-mode-analytics": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-mode-analytics]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: mode_analytics_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: mode_analytics_write Sign in to your Mode account in its Cotlet Cloud Browser and enable the app for agents. Editing and scheduling a report need edit access to it in Mode.
Create a Cotlet API key with access to Mode and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store. You do not create a Mode token.
curl "https://cotlet.dev/api/v1/mode-analytics/reports?workspace=acme-analytics&collection=Growth" \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "mode-analytics",
"tool": "list_reports",
"result": {
"reports": [
{
"token": "a1b2c3d4e5f6",
"title": "Weekly signups by channel",
"description": "Signups per channel, last 8 weeks",
"collection": "Growth",
"last_edited": "2026-11-03",
"latest_run": "succeeded"
},
{
"token": "b7c8d9e0f1a2",
"title": "Trial to paid conversion",
"description": "",
"collection": "Growth",
"last_edited": "2026-09-18",
"latest_run": "succeeded"
}
],
"next_cursor": null
}
} Read result.reports and pass result.next_cursor unchanged as cursor until it is empty. Keep the report token in your workflow so later runs update the same report.
Run results come back as column names and rows. When a result is cut at your limit, the response says so with truncated.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Call run_report on a schedule, then get_run_results, and write the rows to a sheet or database. |
| Python or Node.js | REST API | Page through list_report_runs for each report and collect failed runs with their error text. |
| Make | HTTP > Make a request | Call list_schedules and post a weekly list of what each report delivers and where. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads and changes Mode; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Reports are found by Collection or by words in the title. No tool deletes a report; archive and unarchive are both here.
Returns each Collection with its name, whether it is your personal Collection and how many reports it holds. Collections you cannot open are not listed. Pass a name to list_reports to look inside one.
MCP callmode_analytics_read → list_collections
REST endpointGET https://cotlet.dev/api/v1/mode-analytics/collections
| Name | Type | Description |
|---|---|---|
| workspace string required | string | Workspace username, the first part of the URL (app.mode.com/{workspace}). |
{
"workspace": "workspace"
} {
"collections": [
{
"name": "Growth",
"token": "c4f1a9b2d7e3",
"personal": false,
"reports": 14
},
{
"name": "Finance",
"token": "8d2b6e0a51c9",
"personal": false,
"reports": 9
},
{
"name": "Maya Chen",
"token": "f3a7c1e8b406",
"personal": true,
"reports": 3
}
]
} Returns each report with its token, title, description, Collection, last edited date and the state of its latest run. Without collection or query it lists the reports you can open in the Workspace. Pass next_cursor back as cursor until it is empty.
MCP callmode_analytics_read → list_reports
REST endpointGET https://cotlet.dev/api/v1/mode-analytics/reports
| Name | Type | Description |
|---|---|---|
| workspace string required | string | Workspace username, the first part of the URL. |
| collection string | string | Collection name or token from list_collections. |
| query string | string | Words to search for in report titles. |
| archived boolean | boolean | true lists archived reports instead of active ones. |
| cursor string | string | Next page cursor from the previous call. |
{
"workspace": "workspace"
} {
"reports": [
{
"token": "a1b2c3d4e5f6",
"title": "Weekly signups by channel",
"description": "Signups per channel, last 8 weeks",
"collection": "Growth",
"last_edited": "2026-11-03",
"latest_run": "succeeded"
},
{
"token": "b7c8d9e0f1a2",
"title": "Trial to paid conversion",
"description": "",
"collection": "Growth",
"last_edited": "2026-09-18",
"latest_run": "succeeded"
}
],
"next_cursor": null
} Returns the report details with the name and token of each query and the data source it runs on. It also returns who created the report, when it was last edited and whether it is archived. Use get_query for the SQL.
MCP callmode_analytics_read → get_report
REST endpointGET https://cotlet.dev/api/v1/mode-analytics/report
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
{
"report": "report"
} {
"token": "a1b2c3d4e5f6",
"title": "Weekly signups by channel",
"description": "Signups per channel, last 8 weeks",
"collection": "Growth",
"created_by": "Maya Chen",
"last_edited": "2026-11-03",
"archived": false,
"queries": [
{
"name": "Signups by channel",
"token": "q9z8y7x6w5v4",
"data_source": "Production warehouse"
}
]
} Returns the query name, its SQL as written in the query editor and its data source. With no query it returns all queries of the report in the order the report lists them.
MCP callmode_analytics_read → get_query
REST endpointGET https://cotlet.dev/api/v1/mode-analytics/query
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
| query string | string | Query name or token from get_report. Leave out to read every query in the report. |
{
"report": "report"
} {
"queries": [
{
"name": "Signups by channel",
"token": "q9z8y7x6w5v4",
"data_source": "Production warehouse",
"sql": "SELECT channel, COUNT(*) AS signups FROM signups WHERE created_at >= CURRENT_DATE - 56 GROUP BY channel"
}
]
} Saves the new title or description and returns the old ones. It reaches no one and one more call undoes it, so it needs no confirmation.
MCP callmode_analytics_write → update_report
REST endpointPATCH https://cotlet.dev/api/v1/mode-analytics/report
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
| title string | string | New report title. |
| description string | string | New report description. |
{
"report": "report"
} {
"token": "b7c8d9e0f1a2",
"title": "Trial to paid conversion",
"description": "Share of trials that become paid, by signup week",
"previous_description": ""
} Archives the report. It reaches no one and unarchive_report puts it back, so it needs no confirmation. Archived reports can still be found with list_reports and archived set to true.
MCP callmode_analytics_write → archive_report
REST endpointPOST https://cotlet.dev/api/v1/mode-analytics/report/archive
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
{
"report": "report"
} {
"token": "c2d3e4f5a6b7",
"title": "Pricing test, Q1",
"archived": true
} Unarchives the report so it shows in its Collection again. It reaches no one, so it needs no confirmation.
MCP callmode_analytics_write → unarchive_report
REST endpointPOST https://cotlet.dev/api/v1/mode-analytics/report/unarchive
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
{
"report": "report"
} {
"token": "c2d3e4f5a6b7",
"title": "Pricing test, Q1",
"archived": false
} A run uses your own data source. Results can be cut at a row limit, and the answer says when they were.
Returns the run history as the View Details page shows it: run token, started time, finished time and state. A failed run carries the error text from the run. Use it to see whether the last scheduled run worked.
MCP callmode_analytics_read → list_report_runs
REST endpointGET https://cotlet.dev/api/v1/mode-analytics/report-runs
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
| cursor string | string | Next page cursor from the previous call. |
{
"report": "report"
} {
"runs": [
{
"token": "r5t6y7u8i9o0",
"started": "2026-11-05T07:00:12Z",
"finished": "2026-11-05T07:00:41Z",
"state": "succeeded"
},
{
"token": "r1q2w3e4r5t6",
"started": "2026-11-04T07:00:10Z",
"finished": "2026-11-04T07:00:19Z",
"state": "failed",
"error": "column \"channel\" does not exist"
}
],
"next_cursor": null
} Returns the column names, the rows and the total row count of the run, with the time the run finished. It reads a run that already exists and starts nothing; use run_report for fresh data.
MCP callmode_analytics_read → get_run_results
REST endpointGET https://cotlet.dev/api/v1/mode-analytics/run-results
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
| query string required | string | Query name or token from get_report. |
| run string | string | Run token from list_report_runs. Defaults to the latest successful run. |
| limit integer | integer | Most rows to return. The result says when it was cut. |
{
"report": "report",
"query": "query"
} {
"run": "r5t6y7u8i9o0",
"finished": "2026-11-05T07:00:41Z",
"columns": [
"channel",
"signups"
],
"rows": [
[
"Organic",
412
],
[
"Paid",
268
],
[
"Referral",
96
]
],
"total_rows": 3,
"truncated": false
} Returns the run token and its final state, succeeded or failed, with the error text when it failed. The run sends the report queries to your data source, so it uses your warehouse. It does not email or post anywhere. By default you confirm each call; you can switch that off for this tool.
MCP callmode_analytics_write → run_report
REST endpointPOST https://cotlet.dev/api/v1/mode-analytics/report/run
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
| parameters object | object | Parameter values as name and value, for reports that have parameters. |
{
"report": "a1b2c3d4e5f6",
"parameters": {
"weeks": 8
}
} {
"run": "r9p8o7i6u5y4",
"state": "succeeded",
"started": "2026-11-05T09:12:03Z",
"finished": "2026-11-05T09:12:31Z"
} Saves the change in the query editor and returns the SQL as it was before, so one more call puts it back. The change reaches everyone who opens the report and every later scheduled run. It does not run the query; call run_report for that. By default you confirm each call; you can switch that off for this tool.
MCP callmode_analytics_write → update_query
REST endpointPATCH https://cotlet.dev/api/v1/mode-analytics/query
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
| query string required | string | Query name or token from get_report. |
| name string | string | New query name. |
| sql string | string | New SQL for the query. |
{
"report": "report",
"query": "query"
} {
"query": "q9z8y7x6w5v4",
"name": "Signups by channel",
"previous_sql": "SELECT channel, COUNT(*) AS signups FROM signups GROUP BY channel",
"saved": true
} Slack needs Mode connected to your Slack, and a private channel needs the @Mode bot added. Email recipients must be Workspace members or in a claimed domain unless external sharing is on.
Returns each schedule with its name, refresh frequency, parameter values and where it delivers: email subscribers and Slack channels. A report can have several schedules for different groups.
MCP callmode_analytics_read → list_schedules
REST endpointGET https://cotlet.dev/api/v1/mode-analytics/schedules
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
{
"report": "report"
} {
"schedules": [
{
"name": "Monday digest",
"frequency": "Every Monday at 08:00",
"parameters": {},
"delivers_to": {
"slack": [
"#growth"
],
"email": 2
},
"created_by": "Maya Chen"
}
]
} Creates the schedule from the report header, Schedule then New Schedule, and returns its name and where it delivers. The schedule keeps running until the report or the schedule is deleted. Recipients must be Workspace members or in a claimed domain unless external sharing is on. By default you confirm each call; you can switch that off for this tool.
MCP callmode_analytics_write → create_schedule
REST endpointPOST https://cotlet.dev/api/v1/mode-analytics/schedules
| Name | Type | Description |
|---|---|---|
| report string required | string | Report token, the last part of the report URL (app.mode.com/{workspace}/reports/{token}). list_reports returns it. |
| name string required | string | Schedule name that describes its purpose. |
| frequency string required | string | Refresh frequency in words, for example "every Monday at 8:00". The tool picks the matching choice in the Schedule form and fails if there is none. |
| parameters object | object | Parameter values for the scheduled runs. |
| slack_channel string | string | Slack channel to post the report to. A private channel needs the @Mode bot added. |
| subscribers array | array | Email addresses to subscribe. They always get an email that says they were subscribed. |
{
"report": "report",
"name": "Jane Doe",
"frequency": "frequency"
} {
"report": "a1b2c3d4e5f6",
"name": "Monday digest",
"frequency": "Every Monday at 08:00",
"delivers_to": {
"slack": [
"#growth"
],
"email": 1
},
"created": true
} Your signed-in Mode profile, encrypted with AES-256-GCM, in the EU. Not the password.
The 14 Mode tools. Never the cookie.
Your Workspace: the reports, queries and schedules you can open.
Data sources, members, billing, API keys, password and two-factor.
A new device may need a code. You type it in, we never do.
Disable for agents or reset the browser in the console, or sign out in Mode.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
Mode's own Member API keys follow each user's access, and an Admin has to switch them on first (Mode Help: API tokens, checked 6 Nov 2026). Cotlet works in your signed-in Mode session, so it follows your access the same way and needs no key.
Schedules and Slack or email sharing follow your Mode plan. Mode's plan page lists them under Pro, not Studio (checked 6 Nov 2026).
When Mode moves a button or renames a field, the fix happens on our side and your prompts keep working. status.cotlet.dev watches the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Run a report | No, but the run is kept in the report's run history |
| Edit a query | Put the old SQL back; the tool returns it |
| Change a title or description | Change it back; the tool returns the old text |
| Archive a report | Unarchive it with one call |
| Create a schedule | Delete the schedule in Mode |
| Share to Slack or email | No, the post or email is out |
4 of 14 tools ask first: run_report, update_query, create_schedule and share_report. Reads, archiving and title changes reach no one, so they run at once. Switch the wait off per tool for a scheduled run.
A schedule keeps running until the report or the schedule is deleted.
{
"name": "run_report",
"arguments": {
"report": "a1b2c3d4e5f6",
"parameters": {
"weeks": 8
}
}
} curl -X POST https://cotlet.dev/api/v1/mode-analytics/report/run \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"report":"a1b2c3d4e5f6","parameters":{"weeks":8}}' {
"run": "r9p8o7i6u5y4",
"state": "succeeded",
"started": "2026-11-05T09:12:03Z",
"finished": "2026-11-05T09:12:31Z"
} Scripts and cron jobs reach the same tools over REST with the same key and price. A failed call costs nothing. The tools table lists the REST path of each tool.
About $16 a monthfor one analyst refreshing a report every workday, 2,800 credits. Your Mode plan is billed by Mode as before.
| Job | Calls | Credits |
|---|---|---|
| Refresh a report and read the numbers, workdays | 3 × 20 | 600 |
| Check failed scheduled runs, weekly | 3 × 4 | 120 |
| Find the report that answers a question | 5 × 8 | 400 |
| New Slack digest schedule | 2 × 3 | 60 |
| Archive old reports, monthly | 12 × 1 | 120 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,800 |
The month is our example: about 130 calls, with one report refreshed on 20 workdays. We found no public figure for a typical Mode workspace. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| nataliemona/mode_mcp | Python MCP server on the Mode API, 15 tools: browse, read results, create and edit reports and queries, archive. MIT licence. | Runs on your computer with a token and secret. No run, schedule or share tool. 0 stars, last commit 16 Oct 2026. |
| Pipedream Mode MCP | A hosted server on Pipedream Connect. | Its page showed no list of Mode tools when we checked. |
| Mode REST API | Official. Reports, queries, runs, exports, schedules and subscriptions, with JSON or CSV results. | You write and host the code. Mode's plan page lists API access under Pro. No one-off share to Slack or email. |
| Mode webhooks | Official. Posts to your URL when a report is created or a run starts or finishes. | The payload is the event name and a link to the run. |
If you have a developer and want one narrow job, the Mode API or the GitHub server is free to use. Cotlet adds what they leave to you: no API key to create, a connector that works in the ChatGPT and Claude apps, hosting around the clock, one account for many apps, and run, schedule and share tools that ask before they act.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the Mode tools.
Sign up at cotlet.dev, log in to Mode Analytics once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your Mode Analytics account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in Mode Analytics: refresh a report and read the numbers; send a report to Slack every Monday; find the report that answers a question. You ask in plain words, and anything that reaches other people waits for your OK first.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Create a free account at https://cotlet.dev, open Mode under Integrations in the console and sign in to Mode in its Cloud Browser. The trial starts with your first app, no card asked.
No token is needed, because Cotlet works in your own signed-in Mode account. Mode requires a paid plan for its own API. Its plan comparison lists schedules and Slack and email sharing under Pro, and the Studio column lists no API access, so those tools follow your plan. Mode: Compare plans, checked 5 Nov 2026.
Mode emails the report creator, the schedule creator and the last editor on every failed run until the error is fixed or the schedule is deleted. Your agent can read the failed run with list_report_runs and the SQL with get_query. Mode Help: Report scheduling and sharing, checked 5 Nov 2026.
Yes. Mode posts to a URL you choose when a report is created or a run starts or finishes, with the event name and a link to the run (Mode Help: Webhooks, checked 6 Nov 2026). Cotlet does not receive them; run your agent on a schedule or point the webhook at your own workflow.
No. It can archive a report and bring it back with unarchive_report. No tool deletes a report or a query.
Only the door is different. Both expose the same 14 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Mode Analytics, Inc. or ThoughtSpot.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy