Developers
MCP server Pro
Tylode's MCP server lets AI assistants that support the Model Context Protocol (Claude, Cursor, VS Code and many others) work with your Tylode: search it, read pages, create and move cards, add rows to a database, change events, answer chats and send internal mail, all by asking in plain language.
What it gives you
- 53 tools covering workspaces, pages, databases, boards, calendar, whiteboards, presentations, search, chats, internal mail, My drive and notifications.
- The same access as you. The assistant sees exactly what you can see in the app and nothing more, because every tool calls the REST API with your token.
- No code. You add the server to your assistant once, then ask things like "What's on my calendar this week?".
Requirements
- An account on Pro or Premium. The plan is checked on every request.
- From Claude or ChatGPT, nothing else: you sign in with your Tylode account (see Claude and ChatGPT, nothing to install).
- From other clients, a personal access token. Create one in Settings → API and webhooks → API and plugins → Personal access tokens (see Authentication). Give it a name like "Local MCP" so you can recognize and revoke it later.
URL and transport
| URL | https://app.tylode.com/api/mcp |
| Transport | Streamable HTTP, stateless (each request stands alone, no session) |
| Authentication | OAuth 2.1 sign-in (Claude, ChatGPT and any client that supports it) or Authorization: Bearer tylode_pat_xxx |
| Server name | tylode |
Responses come back as plain JSON rather than a stream. Clients that only speak stdio can connect through the mcp-remote bridge, shown below.
Set it up
Claude and ChatGPT, nothing to install
All you need is the address https://app.tylode.com/api/mcp:
- Claude (web, desktop and mobile): in Settings → Connectors, add a custom connector, name it Tylode and paste the address.
- ChatGPT: in the Connectors (or Apps) settings, create a new one with that address and OAuth authentication. Depending on your plan, ChatGPT may ask you to turn on developer mode first.
When you connect, Tylode opens: sign in with your account (if you weren't already), review the permissions the assistant asks for and click Authorize. The screen tells you which domain you'll return to (claude.ai, chatgpt.com…): if it isn't the one of the assistant you just connected, cancel.
The assistant only sees the tools for the permissions you authorize. The delete permissions appear separately, under It can also delete, unticked: the assistant can only delete what you tick. If you connected it before some permissions existed (such as databases, uploading files to My drive or deleting), it keeps the ones you authorized back then: to give it the new ones, disconnect it, connect it again and authorize it again. Until then, it can't change cards, whiteboard elements or what's inside slides either (those permissions used to only allow creating): it'll ask you to connect it again. You can remove its access at any time in Settings → API and webhooks → API and plugins → Applications connected to your account.
With a personal token
In every example, replace tylode_pat_xxx with your token. When the client lets you read it from an environment variable, do that instead of writing the token in the file.
Claude Code
Run:
claude mcp add --transport http tylode https://app.tylode.com/api/mcp --header "Authorization: Bearer tylode_pat_xxx"This adds it to the current project. Add --scope user to have it in all your projects. Then run /mcp inside Claude Code to check that tylode is connected and see its tools.
Claude Desktop
The easiest way is to add Tylode as a connector, with no token (see above). If you'd rather use a personal token, connect Claude Desktop through mcp-remote. You need Node.js installed.
- In Claude Desktop, open Settings → Developer → Edit Config. This opens
claude_desktop_config.json(on macOS in~/Library/Application Support/Claude/, on Windows in%APPDATA%\Claude\). - Add Tylode under
mcpServers:
{
"mcpServers": {
"tylode": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://app.tylode.com/api/mcp",
"--header",
"Authorization:${TYLODE_AUTH_HEADER}"
],
"env": {
"TYLODE_AUTH_HEADER": "Bearer tylode_pat_xxx"
}
}
}
}- Quit Claude Desktop completely and open it again. Tylode's tools appear in the tools menu of the chat box.
Writing Authorization:${TYLODE_AUTH_HEADER} without a space, with the whole Bearer … value in the variable, avoids a problem some clients have on Windows with spaces inside arguments.
Cursor
Add Tylode to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json in a project:
{
"mcpServers": {
"tylode": {
"url": "https://app.tylode.com/api/mcp",
"headers": {
"Authorization": "Bearer ${env:TYLODE_TOKEN}"
}
}
}
}Set TYLODE_TOKEN in your shell profile or system environment and restart Cursor. Check the connection in the MCP section of Cursor's settings. If you'd rather not use a variable, write the token directly, but then don't commit the file.
VS Code
Create .vscode/mcp.json in your project (or run MCP: Open User Configuration for all projects). VS Code asks for the token the first time and stores it securely:
{
"inputs": [
{
"type": "promptString",
"id": "tylode-token",
"description": "Tylode personal access token",
"password": true
}
],
"servers": {
"tylode": {
"type": "http",
"url": "https://app.tylode.com/api/mcp",
"headers": {
"Authorization": "Bearer ${input:tylode-token}"
}
}
}
}Start the server from the file (VS Code shows a Start action above it) and use the tools from Copilot Chat in agent mode.
Other MCP clients
Any client that supports Streamable HTTP and custom headers works with the URL and header from the table above. The equivalent JSON in most clients is:
{
"mcpServers": {
"tylode": {
"url": "https://app.tylode.com/api/mcp",
"headers": { "Authorization": "Bearer tylode_pat_xxx" }
}
}
}For clients that only support stdio, run the bridge as the server command:
TYLODE_TOKEN=tylode_pat_xxx npx -y mcp-remote https://app.tylode.com/api/mcp --header "Authorization: Bearer ${TYLODE_TOKEN}"To test the server by hand, call a tool with curl. The Accept header must list both JSON and event streams:
curl https://app.tylode.com/api/mcp \
-H "Authorization: Bearer tylode_pat_xxx" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_workspaces","arguments":{}}}'{
"result": {
"content": [
{
"type": "text",
"text": "[{\"id\":\"7c1e2a4b-3f5d-4e8a-9b21-6d0f5c8e1a37\",\"name\":\"Acme\",\"slug\":\"acme\",\"plan\":\"pro\",\"role\":\"owner\",\"frozen\":false}]"
}
]
},
"jsonrpc": "2.0",
"id": 1
}Use "method":"tools/list" to get every tool with its input schema.
Tools
Every tool returns the API's data as JSON text. When the API refuses a call, the tool returns an error result with the status code and message (for example Error 404: …), and the assistant usually explains it to you.
| Tool | Parameters | What it does |
|---|---|---|
list_workspaces | none | Lists your workspaces with their ID, name, plan, your role and whether they're frozen. Assistants call it first to get the workspace_id the other tools need. |
list_pages | workspace_id | Lists the pages of a workspace (without content). |
create_page | workspace_id, title?, parent_page_id? | Creates a page, optionally as a subpage. |
get_page | id | Returns a page with its title and content as block JSON. |
update_page | id, title?, content? (array of blocks) | Changes a page's title and/or replaces its content. |
delete_page | page_id | Moves a page, with its subpages, to the trash. It can be recovered. |
list_databases | workspace_id | Lists the databases of a workspace with their columns (ID, name, type and, for select columns, their options). |
list_database_rows | database_id | Returns the rows of a database. The keys of properties are column IDs; the names come from list_databases. |
add_database_row | database_id, properties (column → value) | Adds a row. Columns go by name or ID, and selects by the option's label. |
update_database_row | database_id, row_id, properties (column → value) | Changes only the cells you send; the rest of the row stays as it is. null or "" empties a cell. |
delete_database_row | database_id, row_id | Deletes a row from a database. It can't be recovered. |
list_boards | workspace_id | Lists the boards of a workspace. |
list_cards | board_id | Returns the lists (columns) of a board and its cards, with each card's list_id. |
create_card | board_id, title, description?, list_id? | Creates a card. Without list_id, it goes to the board's first list. |
update_card | board_id, card_id, title?, description?, list_id?, due_date?, start_date? | Changes a card's title, description or dates (YYYY-MM-DD, or null to remove them), or moves it to the end of another list on the same board. |
delete_card | board_id, card_id | Deletes a card. It can't be recovered. |
delete_board | board_id | Moves a board, with its lists and cards, to the trash. It can be recovered. |
list_calendar_events | workspace_id, from?, to? | Lists calendar events, optionally between two ISO 8601 dates. Recurring events are expanded into occurrences when you give a range. |
create_calendar_event | workspace_id, title, start_at, end_at?, all_day?, description? | Creates an event in the workspace calendar. |
update_calendar_event | event_id, title?, description?, start_at?, end_at?, all_day? | Changes an event. Only what you send changes; end_at accepts null to remove the end time. |
delete_calendar_event | event_id | Deletes an event; if it repeats, all its occurrences. It can't be recovered. |
list_whiteboards | workspace_id | Lists the whiteboards of a workspace. |
create_whiteboard | workspace_id, name? | Creates an empty whiteboard. |
list_whiteboard_elements | whiteboard_id | Returns the elements of a whiteboard (sticky notes, text, shapes…) with their position and size. |
create_whiteboard_element | whiteboard_id, type (sticky, text, rectangle or ellipse), content?, x?, y? | Adds a sticky note, text or shape to a whiteboard. |
update_whiteboard_element | whiteboard_id, element_id, x?, y?, width?, height?, content?, style? | Moves an element or changes its size, text or style. The style is merged with the one it had. |
delete_whiteboard_element | whiteboard_id, element_id | Deletes an element from a whiteboard. It can't be recovered. |
delete_whiteboard | whiteboard_id | Moves a whiteboard to the trash. It can be recovered. |
list_presentations | none | Lists your presentations and the ones shared with you. |
create_presentation | name? | Creates a personal presentation with one blank slide. It doesn't take a workspace_id. |
list_slides | presentation_id | Lists the slides of a presentation, in order. |
create_slide | presentation_id | Adds a blank slide at the end of a presentation. |
list_slide_elements | presentation_id, slide_id | Returns the elements of a slide (text, shapes, images). |
add_slide_element | presentation_id, slide_id, type? (text, rectangle or ellipse), content?, x?, y?, width?, height?, style? | Adds a text box (if you don't give a type), a rectangle or an ellipse to a slide. |
update_slide_element | presentation_id, slide_id, element_id, x?, y?, width?, height?, content?, style? | The same as update_whiteboard_element, on a slide. |
delete_slide_element | presentation_id, slide_id, element_id | Deletes an element from a slide. It can't be recovered. |
delete_slide | presentation_id, slide_id | Deletes a slide with everything on it. It can't be recovered. |
delete_presentation | presentation_id | Moves a presentation to the trash. It can be recovered. |
search_workspace | workspace_id, q, limit? | Searches pages, boards, whiteboards, presentations, mail and messages at once, by relevance. limit 1–50, 20 by default. |
list_chats | workspace_id | Lists the conversations you're in. |
read_chat | conversation_id, limit? | Returns the latest messages of a conversation, oldest first. limit 1–200, 50 by default. |
send_chat_message | conversation_id, body, reply_to_message_id?, mentions? (user IDs) | Sends a message to an existing conversation, as you. |
list_mail_threads | workspace_id, archived? ("true" or "all") | Lists internal mail threads. By default, only those that aren't archived. |
read_mail_thread | thread_id | Returns a thread's subject and all its messages. |
send_mail | workspace_id, subject, body, recipient_ids (user IDs) | Starts a new internal mail thread, as you. |
reply_mail_thread | thread_id, body | Replies to a thread, as you. |
update_mail_thread | thread_id, is_read?, archived? | Marks a thread as read or unread, or archives it or moves it back to the inbox. It only changes your own state, not the other participants'. |
list_drive | workspace_id, folder_id? | Lists folders and files in My drive. Without folder_id, the top level. The trash is never included. |
get_drive_file | file_id | Returns a file's details and a download link that expires after 10 minutes. |
upload_drive_file | workspace_id, filename, content_base64, mime_type?, folder_id? | Uploads a file of up to 3 MB to My drive, at the top level or in a folder. It counts toward your plan's storage and only accepts the file types the app accepts. |
delete_drive_file | file_id | Moves a file in My drive to its trash. It can be recovered. |
list_notifications | workspace_id, include_read? | Lists your unread notifications (mentions, replies, assigned cards, shared pages); all of them with include_read. |
mark_notifications_read | workspace_id | Marks all your notifications in the workspace as read. |
Parameters with ? are optional. The details of each call are in the API reference: pages, databases, boards, calendar, chats, mail and notifications, and whiteboards, presentations, search and My drive.
With a connector, the delete tools (delete_…) only appear if you authorize their :delete permission, which is unticked on the authorization screen; with a personal token, the assistant sees all of them. Anything with a trash in the app (pages, boards, whiteboards, presentations and My drive files) goes to the trash and can be recovered; cards, events, rows, slides and elements are deleted for good. See Deleting: trash or permanent.
Example prompts
- "List my Tylode workspaces and tell me which ones are on Pro."
- "Search Acme for 'Q4 budget' and summarize what the page says."
- "What's on my calendar next week? Group it by day."
- "Create a card called 'Prepare the demo' on the Launch board, in the 'Doing' list, with a checklist of steps in the description."
- "Read the last 30 messages in the Product team chat and draft a reply to the question about the release date. Show it to me before sending."
- "Move the 'Prepare the demo' card to the 'Done' list and set its due date to Friday."
- "Add an expense of 12.40 in Food with today's date to the Transactions table."
- "Create a page called 'Retro 23 September' with sections for what went well, what didn't and actions."
- "Do I have unread notifications? Tell me which ones need an answer, then mark them as read."
- "Find the PDF of the signed contract in My drive and give me the download link."
Rate limits
The MCP server shares the API limit of 60 requests per minute per user. Each tool call counts as 1 request (the API call it makes), except list_cards, which counts as 2 (it reads the lists and the cards), so an assistant can make about 60 tool calls a minute. Connecting and listing tools don't use those 60: they have their own, generous limit (120 a minute). Other scripts using your tokens in the same minute take from the same 60. See Rate limits.
Security
- The token has full access to your account. Through it, an assistant can read everything you can and write in your name: create pages, change cards and rows, upload files to My drive, send chat messages and mail.
- Keep the token private. Prefer environment variables or the client's secure input, and don't commit configuration files that contain it.
- Review what the assistant does. Most clients ask for approval before each tool call; keep that on for tools that write or send.
- With a connector, grant only what you need. The assistant doesn't see the tools for permissions you don't give it. Leave the delete permissions unticked if it doesn't need them.
- With a personal token, the assistant can delete too. It sees every tool, the delete ones included. If your client asks for approval before each call, keep that on for the
delete_…tools. - Use a dedicated token for each assistant. If it leaks, or you stop using the assistant, revoke it in Settings → API and webhooks → API and plugins and nothing else breaks.
- See what it has done. On that same screen, What your apps and tokens have done lists everything a connected app or a token has created, changed or deleted on your behalf (for example, "Claude · Deleted a card"), for 90 days.
- Be careful with content you didn't write. A page or message from someone else could contain instructions aimed at the assistant. Check before approving actions the assistant proposes after reading it.
Troubleshooting
| Problem | What to check |
|---|---|
401 | The token is wrong, revoked or missing the Bearer prefix. With mcp-remote, check the --header argument and the variable. |
403 | Your account isn't on Pro or Premium. With a Claude or ChatGPT connector, the connection works but every tool answers with this notice until you have Pro. |
429 | You've reached 60 requests in this minute (about 30 tool calls). Wait for the next minute. |
406 in a custom client | The request must send Accept: application/json, text/event-stream. |
| The server doesn't appear in Claude Desktop | Check the JSON is valid, Node.js is installed, and that you quit Claude Desktop completely before opening it again. |
| Tools are missing | With a connector, the assistant only sees the tools for the permissions you authorized. The delete ones only appear if you ticked their permission. If you connected it before they existed (databases, uploading files, deleting), disconnect it, connect it again and authorize it again. |
| Empty lists | The assistant used the wrong workspace_id. Ask it to call list_workspaces first, or tell it the workspace name. |
| A write tool fails | The workspace may be frozen for you, or your role may be read-only. The same action fails in the app. |
Related pages
- Authentication: create and revoke tokens.
- AI assistant: Tylode's built-in assistant, no setup needed.
- Developer platform: the REST API behind every tool.