MCP Server
Connect Claude, ChatGPT, Cursor, VS Code and any other MCP client to your boards using the Model Context Protocol (MCP). Paste one URL, approve access in your browser, and your AI can read and update your tasks. Available on every plan, including Free.
Connect in 1 minute
Connecting with OAuth is the recommended setup. Your AI client only needs the server URL: it opens is.team in your browser, you choose which workspaces it can use, and the access token is handed over automatically. There is nothing to copy or rotate.
https://is.team/mcp- 1
Add the URL to your AI client
Pick your client below for the exact steps.
- 2
Sign in and choose workspaces
Your browser opens is.team. Sign in if asked, select the workspaces the app may use and click Allow.
- 3
Start working
Ask your AI to list your cards, create tasks or log time. It only sees the workspaces you selected.
Tip
Available on every plan, including Free — no API token needed. Every app you connect is listed in Account Settings → Connected apps, where you can disconnect it anytime (see Connected Apps). Inside is.team, Connect AI client in the team panel or your account menu (top right) walks you through the same steps and confirms when your client has connected.
Claude
claude.ai, Claude Desktop and the mobile apps
- 1
Open Customize → Connectors
In claude.ai or Claude Desktop, go to Customize → Connectors.
- 2
Add a custom connector
Click + → Add custom connector, name it "is.team" and paste the server URL. Leave Advanced settings empty, then click Add.
- 3
Connect and approve
Click Connect, sign in to is.team in the browser window and choose which workspaces Claude can use.
- 4
Turn it on in a chat
In a conversation, open + → Connectors and switch on is.team. The connector also works in Claude Desktop and the mobile apps.
https://is.team/mcpInfo
Claude's Free plan allows one custom connector. On Team and Enterprise, an owner adds it under Organization settings → Connectors first; members then click Connect.
ChatGPT
Developer mode apps on chatgpt.com
- 1
Turn on Developer mode
In ChatGPT on the web, open Settings → Security and login and turn on Developer mode.
- 2
Create an app
Go to chatgpt.com/plugins and select the + button to create a developer-mode app.
- 3
Enter the server details
Name it "is.team", paste the server URL as the MCP server URL and choose OAuth as the authentication.
- 4
Approve in the browser
Create the app, sign in to is.team and choose which workspaces ChatGPT can use. Then pick is.team from the composer's Developer mode tools.
https://is.team/mcpInfo
Developer mode is available on ChatGPT Plus, Pro, Business, Enterprise and Edu, on the web.
Claude Code
Anthropic's coding agent in the terminal
- 1
Add the server
Run this in your terminal. Add --scope user to make it available in every project.
- 2
Authenticate
Start Claude Code, run /mcp, select is-team and choose Authenticate. Approve access in the browser window that opens.
claude mcp add --transport http is-team https://is.team/mcp/mcpInfo
Real-time card chat and the background agent need the local agent (stdio package).
Cursor
AI code editor
- 1
Install with one click
Click Add to Cursor and confirm the install in Cursor.
- 2
Or edit mcp.json
Add the server to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (this project only).
- 3
Sign in
When Cursor shows that is-team needs authentication, start the sign-in and approve access to is.team in the browser.
{ "mcpServers": { "is-team": { "url": "https://is.team/mcp" } }}VS Code
GitHub Copilot agent mode
- 1
Install with one click
Click Install in VS Code and confirm in VS Code.
- 2
Or add it manually
Run MCP: Add Server from the Command Palette and choose HTTP, or add the server to .vscode/mcp.json (workspace) or your user mcp.json (MCP: Open User Configuration).
- 3
Allow sign-in
When VS Code asks to authenticate with is.team, allow it and approve access in the browser.
{ "servers": { "is-team": { "type": "http", "url": "https://is.team/mcp" } }}Windsurf
Devin Desktop, formerly Windsurf
- 1
Open the MCP config file
In the agent panel, open the … menu and choose Open MCP config file (~/.config/devin/mcp_config.json; older Windsurf builds use ~/.codeium/windsurf/mcp_config.json).
- 2
Add is.team
Add the server under mcpServers. Use the serverUrl key for remote servers.
- 3
Refresh and sign in
Save, refresh the MCP server list and approve access to is.team in the browser when asked.
{ "mcpServers": { "is-team": { "serverUrl": "https://is.team/mcp" } }}Codex CLI
OpenAI's coding agent in the terminal
- 1
Add the server
Run codex mcp add, or add the server to ~/.codex/config.toml.
- 2
Sign in
Run codex mcp login is-team and approve access in the browser.
codex mcp add is-team --url https://is.team/mcpcodex mcp login is-team[mcp_servers.is-team]url = "https://is.team/mcp"Gemini CLI
Google's agent in the terminal
- 1
Add the server
Run gemini mcp add, or add it to ~/.gemini/settings.json with the httpUrl key (url is for SSE servers).
- 2
Sign in
Start Gemini CLI, run /mcp auth is-team and approve access in the browser.
gemini mcp add --transport http is-team https://is.team/mcp{ "mcpServers": { "is-team": { "httpUrl": "https://is.team/mcp" } }}/mcp auth is-teamOther MCP client
Any client with Streamable HTTP and OAuth
- 1
Paste the server URL
Add a remote (Streamable HTTP) MCP server with this URL. Clients that support MCP OAuth open a browser to approve access — no token needed.
- 2
No OAuth support?
Create an API token under Advanced and send it as an Authorization: Bearer header.
https://is.team/mcp{ "mcpServers": { "is-team": { "url": "https://is.team/mcp" } }}What is MCP?
MCP (Model Context Protocol) is an open standard that lets AI assistants connect to external tools and data sources. Instead of copying prompts and pasting API responses, your AI agent talks directly to is.team — reading your tasks, creating new ones, and managing your workflow.
Remote server or local agent?
is.team runs the MCP server for you at https://is.team/mcp — that's what the guides above connect to. The optional local agent (@isteam/mcp) runs on your machine and adds the full toolset, real-time card chat and a background daemon.
| Feature | Remote server | Local agent |
|---|---|---|
| How you connect | Paste the URL and approve in the browser (OAuth). An API token also works. | Run the setup wizard with an API token. Needs Node.js. |
| Clients | Claude (web, desktop, mobile), ChatGPT, Claude Code, Cursor, VS Code, Windsurf, Codex CLI, Gemini CLI and any Streamable HTTP client | Stdio clients. Real-time features need Claude Code. |
| Tools | 17 — cards, tasks, comments, time logs, notes and canvas | 110+ — adds boards, members, invites, sprints, worklogs, attachments, notifications and integrations |
Real-time card chat (subscribe_card, chat_respond, ask_chat) | No | Yes in Claude Code |
| Integration tools (GitHub, Drive, Slack, Figma, Calendar) | No | Yes |
| Background daemon | No | Yes macOS and Linux |
| Plans | All plans | All plans |
| Best for | Everyday work from any AI client | Coding agents that live on a card and pick up tasks on their own |
Tip
Our recommendation: start with the remote server — it takes a minute and works in every client. Add the local agent when you want Claude Code to answer in a card's chat or work through tasks in the background.
What the remote server exposes (17 tools)
If a tool is not in this list, it needs the local agent. See Available Tools for what each one does.
list_cardsread_cardcreate_taskupdate_taskcomplete_taskmove_taskadd_commentlog_timereorder_taskscreate_noteupdate_notecreate_edgedelete_edgecreate_stackadd_to_stackdissolve_stackmove_node
API Token (Advanced / CI)
Use an API token when a browser sign-in isn't possible: CI pipelines, headless scripts, MCP clients without OAuth support, and the local agent. API tokens are available on every plan.
- 1
Open Account Settings → API
Click your avatar in the top-right corner, choose Account (Account Settings) and open the API tab.
- 2
Name the token and choose workspaces
Give the token a name you'll recognize later and select the workspaces it may reach.
- 3
Generate and copy
Click Generate and copy the
ist_…token. It is shown only once. - 4
Send it as a Bearer header
Use one of the snippets below and replace
ist_xxxwith your token.
claude mcp add --transport http is-team https://is.team/mcp --header "Authorization: Bearer ist_xxx"{ "mcpServers": { "is-team": { "url": "https://is.team/mcp", "headers": { "Authorization": "Bearer ist_xxx" } } }}curl -sS -X POST "https://is.team/mcp" \ -H "Authorization: Bearer ist_xxx" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'Warning
Treat tokens like passwords — never commit them or ship them in client-side code. Each user can create up to 10 tokens. A token only reaches workspaces you still belong to, and you can delete it anytime from the API tab.
Local Agent (stdio package)
The @isteam/mcp package runs on your machine and talks to is.team over stdio. It exposes the full toolset (110+ tools), real-time card chat in Claude Code, workspace integrations and an optional background daemon. It signs in with an API token and needs Node.js.
Quick setup
Run this in your project directory:
npx @isteam/mcp@latest setupThe setup wizard walks you through connecting your project:
- Checks Claude CLI and Node.js
- Asks for your API token
- Writes an
.mcp.jsonentry and permission allowlist for this project - Asks for a 6-character agent name (e.g.
LAPTP1,DEV001,HOME01) so you can tell terminals apart in the is.team dashboard - Asks whether to run in background daemon mode. Answer no for a normal stdio MCP that stays alive only while the terminal is open. Answer yes to install a launchd/systemd service that watches a card and auto-executes assigned tasks.
Warning
Paste the token when the wizard asks for it rather than passing it on the command line, so it stays out of your shell history. The wizard writes the token into .mcp.json — add that file to .gitignore so it is never committed.
Tip
You can also click the agent badge slot on any card header to open a setup dialog with a ready-to-copy command.
Manual configuration
Prefer to edit the config yourself? Add the package to Claude Code:
claude mcp add is-team -e IST_API_TOKEN=ist_xxx -- npx -y @isteam/mcpOther stdio clients (Claude Desktop, Cursor, Windsurf) take the same entry in their JSON config. They get the full toolset, but only Claude Code receives real-time task and chat notifications.
{ "mcpServers": { "is-team": { "command": "npx", "args": [ "-y", "@isteam/mcp" ], "env": { "IST_API_TOKEN": "ist_xxx" } } }}Environment variables
IST_API_TOKEN(required) — yourist_API tokenIST_BASE_URL(optional) — defaults tohttps://is.team
Warning
Real-time subscriptions require an experimental flag. The local package uses Claude Code's experimental channel notifications to deliver real-time task and chat updates, so you may see a warning about "development channels" — this is expected. The subscribe_card and chat_respond tools rely on this feature. Without it, the local package works but real-time notifications aren't delivered — poll with read_card instead.
Background Daemon
Daemon mode runs Claude as a persistent background service on your machine. It watches a single card — any task dragged or created on that card is picked up automatically, processed by a headless claude --print subprocess, and the result is posted back to the card chat. The daemon survives terminal closure, auto-restarts on crash, and stays invisible to everyone except through the is.team UI.
Info
The daemon is a superset of the local agent. Platform support: macOS (launchd) and Linux (systemd user). Windows is not supported for daemon mode.
Setup
Re-run the setup wizard and answer yes when it asks about background mode:
npx @isteam/mcp@latest setupThe daemon prompts add three extra steps after the regular wizard:
- Card selector — pick the card the daemon should watch. Only tasks added to this card trigger Claude. Everything else is ignored.
- Permission mode for the spawned Claude subprocess:
acceptEdits— auto-approve file edits, prompt for shell commands (recommended)bypassPermissions— fully autonomous, no prompts (risky, only for trusted cards)plan— planning mode only, no writes
- Working directory — the path Claude runs in (defaults to the project directory).
Config is written to ~/.isteam/daemon.json, the service is installed and started, and the card shows an agent badge matching the 6-character label you chose.
How task dispatch works
- The daemon subscribes to the card via Firestore and sets a baseline of existing tasks (never acts on what's already there).
- When a new task arrives, it's queued and dispatched one at a time (no parallel spawning).
- Claude is spawned with
claude --print --permission-mode <mode>and a prompt that instructs it toread_card, work the task, then callcomplete_task. - Tasks have a 30-minute timeout. On success, failure, or timeout, the daemon posts a summary back to the card chat via
chat_respond. - Use
ask_chatfrom within the agent to ask the user questions — they see it in the card chat, not the terminal.
Stopping the daemon
The daemon has two stop paths, depending on whether you want it gone or just paused:
- From the is.team UI — click the agent badge on the card and confirm removal. The daemon detects the unassignment, cleans up its session and presence, and exits cleanly. launchd/systemd respect the clean exit and don't restart it. Run
daemon startlater or re-run the setup wizard to bring it back. - From the CLI — use
daemon stopto pause ordaemon uninstallto remove the service entirely.
Management commands
| Command | Description |
|---|---|
| npx @isteam/mcp daemon status | Show service state, PID, config summary, and log paths |
| npx @isteam/mcp daemon logs --follow | Tail daemon stdout + stderr in real time |
| npx @isteam/mcp daemon start | Start the service (if stopped) |
| npx @isteam/mcp daemon stop | Stop the service without removing it |
| npx @isteam/mcp daemon restart | Restart the service (picks up config changes) |
| npx @isteam/mcp daemon install | (Re-)install the launchd/systemd unit from ~/.isteam/daemon.json |
| npx @isteam/mcp daemon uninstall | Stop and remove the service unit (config stays) |
Warning
One daemon watches one card. To run agents on multiple cards at once, install the daemon on separate machines (or containers) with different agent names. Re-running setup on the same machine overwrites the previous daemon's config.
Real-time Subscriptions
Use subscribe_card to watch a card for new tasks in real time. When a task is created or dragged into the card, the AI agent receives an instant notification — no polling needed.
"Subscribe to my task card and start working on any new tasks that appear."The subscription uses Firestore real-time listeners with a 2-second settlement delay to filter out drag pass-throughs. Only tasks that remain on the card after the delay trigger a notification.
Info
Real-time subscriptions need the local agent running in Claude Code. The remote server is stateless and can't hold a listener open, and other clients (Claude Desktop, Cursor, Windsurf, VS Code, ChatGPT) don't receive the notifications. They can still read and update cards — poll with read_card instead.
Start Claude Code with the channel
Launch Claude Code with the local MCP server attached as a development channel:
claude --dangerously-load-development-channels server:is-teamThis starts Claude Code with the local is-team MCP server attached as a persistent channel, so it receives real-time task notifications. Then ask the agent to subscribe to a card.
Live Chat
When an AI agent subscribes to a card, the card's built-in chat switches to MCP mode. Team members can talk directly to the agent from the is.team UI — no terminal or IDE required.
How it works
- The agent calls
subscribe_card— the card's chat indicator turns amber and shows "Claude (MCP)". - A team member types a message in the card chat. The message is saved to Firestore and forwarded to the subscribed agent as a
chat_messagenotification. - The agent reads the message (optionally using
chat_historyfor context), then replies withchat_respond. - The reply appears instantly in every team member's chat window. A "Claude is thinking..." indicator shows while waiting for the agent's response.
- When the agent calls
unsubscribe_card, the chat reverts to the default AI Card Assistant mode.
Example conversation
Agent: "Subscribe to Claude's Card and respond to chat messages." → Agent calls subscribe_card (card turns amber)[Team member in is.team UI]: "Create a task for fixing the login bug" → Agent receives chat_message notification → Agent calls create_task + chat_respond[Agent reply in chat]: "Done! Created task #42 — Fix login bug (priority: high)"Chat tools
| Tool | Parameters | Description |
|---|---|---|
| chat_respond | cardId, content | Send a reply in the card chat. Appears as "Claude (MCP)". |
| ask_chat | cardId, question, type, options? | Ask an interactive question (text/options/confirm). The user's answer arrives as a chat notification. |
| chat_history | cardId, limit? | Fetch up to 100 recent messages for context (default 30). |
Info
Live chat requires the local agent in Claude Code and an active subscription. The agent must call subscribe_card first — without it, chat messages are handled by the built-in AI Card Assistant instead.
Tip
If the agent disconnects or doesn't respond within 60 seconds, the UI automatically shows an error message. The chat reverts to normal mode once the subscription ends.
Available Tools
The remote server — what OAuth-connected apps use — exposes 17 tools for cards, tasks, comments, time logs and the canvas. The local agent exposes 110+: everything below, including board/card CRUD, members & invites, sprints, comments, worklogs, attachments, notifications, real-time subscriptions and workspace integrations. Tools marked Local only need the local agent. Integration tools also need the service connected in Workspace Settings → Integrations. Rate limit: 120 calls per minute per token.
Task Management & Canvas
| Tool | Description | Availability |
|---|---|---|
| list_cards | Discover all cards you can access — IDs, titles, workspaces | Remote + Local |
| read_card | Read card as markdown — tasks, details, notes, connections | Remote + Local |
| create_task | Create a new task with title, type, priority, and more | Remote + Local |
| update_task | Update any task field — set to null to clear | Remote + Local |
| complete_task | Mark a task as done, get move suggestions | Remote + Local |
| move_task | Move a task to a connected card | Remote + Local |
| add_comment | Add a comment to any task | Remote + Local |
| log_time | Record a worklog entry — duration, description, date | Remote + Local |
| reorder_tasks | Reorder tasks — provide task numbers in desired order | Remote + Local |
| create_note | Create a canvas note with markdown content. Use nearNodeId to position next to a card and auto-connect. | Remote + Local |
| update_note | Update a note's title, content (markdown), or color | Remote + Local |
| create_edge | Connect two canvas nodes with a directional edge. Specify sourceHandle/targetHandle (top, right, bottom, left) to control connection points. | Remote + Local |
| delete_edge | Remove a connection (edge) between two canvas nodes | Remote + Local |
| move_node | Move a canvas node (card or note) to a new x/y position | Remote + Local |
| create_stack | Group multiple notes into a stack — visually collapsed into a single node | Remote + Local |
| add_to_stack | Add one or more notes to an existing stack | Remote + Local |
| dissolve_stack | Dissolve a stack, restoring all notes as independent nodes | Remote + Local |
| subscribe_card | Get real-time notifications when new tasks appear on a card | Local only |
| unsubscribe_card | Stop listening to a card | Local only |
| chat_respond | Send a message in the card's live chat as the AI agent | Local only |
| ask_chat | Ask an interactive question in the card chat (text input, multiple choice, or yes/no) and wait for the user's answer | Local only |
| chat_history | Fetch recent chat messages from a card (up to 100) | Local only |
Boards & Cards Local only
Full board lifecycle and kanban card (column) CRUD. delete_board cascades through nodes + edges. update_card_settings tunes auto-assign, auto-label, auto-archive and the AI automation prompt evaluated when tasks enter the card.
| Tool | Description | Notes |
|---|---|---|
| list_boards | List boards in a workspace (visibility-aware) | read |
| create_board | Create a new board (name + icon + visibility) | — |
| update_board | Rename, change icon/visibility/allowed members, set budget | — |
| delete_board | Permanently delete board + every card/note/edge inside it | Owner only |
| create_card | Add a kanban card (column) to a board | — |
| update_card | Title, color, icon, llmAccess, llmFlow, llmComment, llmContext | — |
| update_card_settings | autoAssignee, autoReporter, autoDueDays, maxActiveTasks, autoArchive, autoLabel, notifyOnEnter, autoMoveStale, aiAutomation + aiAutomationPrompt | — |
| delete_card | Delete card and connected edges; tasks inside are removed | — |
| list_notes | List notes on a board with id, title, color, hasEdges. orphansOnly=true for cleanup. | read |
| delete_note | Delete a note + connected edges | — |
| delete_task | Permanently remove a task (prefer archived=true via update_task to keep history) | — |
| restore_task | Set archived=false on a task | — |
| list_all_tasks | List every task on a card (active or active+archived) | read |
| list_archived_tasks | Archived tasks only | read |
| batch_move_nodes | Move up to 200 canvas nodes in one call (positions map) | — |
| batch_delete_nodes | Delete up to 200 nodes + connected edges | — |
Members, Invites & Subscribers Local only
Workspace membership lifecycle: invite by email, change roles with last-owner protection, edit profiles (hourlyRate is owner-only), and manage per-task subscribers for notifications.
| Tool | Description | Notes |
|---|---|---|
| list_members | uid, displayName, email, role, jobTitle for every member | read |
| invite_members | Send bulk invitations (email + jobTitle? + role?). Email + in-app notification. | Seat-limit checked |
| list_pending_invites | Unaccepted/unrevoked invites with token, expiry | read |
| revoke_invite | Mark a pending invite as revoked | Owner only |
| update_member_role | Promote/demote member ↔ owner. Last-owner protection enforced. | Owner only |
| remove_member | Remove a member from the workspace | Owner only |
| update_member_profile | Edit jobTitle (self/owner) or hourlyRate (owner only) | — |
| add_task_subscriber | Subscribe a member to a task's updates | — |
| remove_task_subscriber | Remove a subscriber | — |
| list_task_subscribers | List subscribers (uid + displayName + email) | read |
Comments, Worklog & Attachments Local only
Full comment lifecycle, flexible worklog queries by task / member / date range, and attachment management bound to the workspace file library.
| Tool | Description | Notes |
|---|---|---|
| list_comments | Comments on a task (newest first) | read |
| update_comment | Edit comment text. Activity-log rows can't be edited. | Author/owner |
| delete_comment | Delete a comment | Author/owner |
| list_worklogs | Filter by task / uid / dateFrom / dateTo | read |
| get_worklog | Single worklog by ID | read |
| update_worklog | Change duration, description, or date | Author/owner |
| delete_worklog | Delete a worklog entry | Author/owner |
| get_active_timer | Currently-running timer for a member (own if uid omitted) | read |
| list_files | Workspace file library (mimeFilter, search, cursor) | read |
| delete_file | Delete file from storage + Firestore record | Uploader/owner |
| add_task_attachment | Attach an existing file to a task | — |
| remove_task_attachment | Detach a file from a task (file is kept) | — |
| list_task_attachments | Attachments on a task | read |
Sprints & Subtasks Local only
Agile sprint lifecycle (PLANNING → ACTIVE → COMPLETED) with snapshot generation on completion. Subtask hierarchy via paired parentTask and subtaskRefs updates.
| Tool | Description | Notes |
|---|---|---|
| create_sprint | Create with name + dates + goal? (max 90 days) | — |
| update_sprint | Edit name, goal, dates, status | — |
| complete_sprint | Mark COMPLETED + auto-snapshot (totalTasks, completedTasks, totalStoryPoints, completedStoryPoints, carriedOverTaskIds) | — |
| list_sprints | All sprints for a board, newest first | read |
| get_active_sprint | Current ACTIVE sprint (or active=false) | read |
| add_subtask | Link two tasks parent ↔ child (same board, any cards) | — |
| remove_subtask | Unlink subtask | — |
| list_subtasks | Show parentTask + subtaskRefs of a task | read |
Notifications, Forms (RO) & Settings Local only
Read & manage caller-only notifications, inspect forms and submissions (read-only — form CREATE/UPDATE/DELETE land in v3.1), tune workspace settings, and manage the caller's own preferences.
| Tool | Description | Notes |
|---|---|---|
| list_notifications | Caller's own notifications (unread by default) | read |
| mark_notification_read | Mark as read | Recipient only |
| delete_notification | Delete a notification | Recipient only |
| list_forms | Forms in workspace, optionally filtered by board/card | read |
| get_form | Full form definition (fields, settings, count) | read |
| list_form_submissions | Submissions for a form (paginated) | read |
| get_workspace_settings | name, timezone, currency, hoursPerDay, plan, storage | read |
| update_workspace_settings | Edit metadata | Owner only |
| get_user_preferences | Caller's timezone, emailNotifications, canvasSettings | read |
| update_user_preferences | Update caller's own prefs (self-only) | — |
Workspace Integrations Local only
AI agents can interact with your connected services. Use list_integrations to discover which services are available in a workspace. Integration tools require the local agent and are not available on the remote server.
| Tool | Description | Service |
|---|---|---|
| list_integrations | List all connected integrations for a workspace | — |
| GitHub — Repositories | ||
| github_list_repos | List repositories connected to workspace | GitHub |
| github_create_repo | Create a new repository | GitHub |
| github_update_repo | Update repo name, description, visibility | GitHub |
| GitHub — Issues | ||
| github_search_issues | Search issues in a repository | GitHub |
| github_create_issue | Create a new issue | GitHub |
| github_close_issue | Close an issue | GitHub |
| GitHub — Pull Requests | ||
| github_search_prs | Search pull requests in a repository | GitHub |
| github_create_pr | Create a pull request | GitHub |
| github_merge_pr | Merge a PR (merge, squash, or rebase) | GitHub |
| github_close_pr | Close a PR without merging | GitHub |
| GitHub — Code | ||
| github_get_file | Read file contents from a repository | GitHub |
| github_create_branch | Create a new branch | GitHub |
| Google Drive — Files | ||
| drive_search_files | Search files in connected Drive | Google Drive |
| drive_get_file | Get file metadata and embed URL | Google Drive |
| drive_create_doc | Create a Google Docs document | Google Drive |
| drive_create_sheet | Create a Google Sheets spreadsheet | Google Drive |
| drive_update_file | Rename a file or update its description | Google Drive |
| drive_delete_file | Delete a file or folder | Google Drive |
| Google Drive — Folders | ||
| drive_create_folder | Create a folder | Google Drive |
| drive_move_file | Move a file to a different folder | Google Drive |
| Slack — Channels | ||
| slack_list_channels | List available channels | Slack |
| slack_create_channel | Create a new channel (public or private) | Slack |
| slack_update_channel | Rename, set topic or purpose | Slack |
| slack_archive_channel | Archive a channel | Slack |
| Slack — Messages | ||
| slack_send_message | Send a message to a channel | Slack |
| slack_send_thread_reply | Reply in a message thread | Slack |
| slack_get_channel_history | Read recent messages from a channel | Slack |
| Figma | ||
| figma_get_file | Get file metadata, pages, and thumbnail | Figma |
| figma_get_comments | Read comments on a Figma file | Figma |
| figma_post_comment | Post a comment on a Figma file | Figma |
| Google Calendar | ||
| calendar_list_events | List upcoming calendar events | Google Calendar |
| calendar_get_event | Get details of a specific event | Google Calendar |
| calendar_create_event | Create a new calendar event | Google Calendar |
| calendar_update_event | Update an existing event | Google Calendar |
| calendar_delete_event | Delete a calendar event | Google Calendar |
Access Control
Access is granted per workspace, not per card. When you approve an app on the consent screen or create an API token, you choose the workspaces it can reach — every board and card in those workspaces is available to its tools.
- Tools act as you. They can only do what your workspace role allows — owner-only tools stay owner-only.
- Access follows your membership. If you leave a workspace or are removed from it, connected apps and tokens lose access to it within a minute.
- OAuth tokens are short-lived. Access tokens expire after an hour and are refreshed automatically; refresh tokens rotate on every use.
- Real-time access needs the local agent. Real-time card chat signs in with an
ist_API token. Apps connected through the consent screen can call tools, but their tokens are refused for real-time access. - Failures come back as tool errors. A call that can't run — for example, on a card in a workspace you didn't select — returns a result with
isError: trueand a message your AI can read. - Revoke anytime. Disconnect an app in Account Settings → Connected apps or delete a token in Account Settings → API to cut access immediately.
Permission Configuration
When running AI agents with Claude Code, you can control exactly which tools the agent is allowed to use — so it never asks for permission in the terminal. This is especially useful for headless or autonomous workflows.
Permission Modes
Set the agent's overall permission behavior with --permission-mode:
| Mode | Behavior | Best for |
|---|---|---|
| default | Asks before edits and bash commands | Interactive work |
| acceptEdits | Auto-approves file edits, still asks for bash | Code iteration |
| plan | Read-only, no edits or execution | Exploration |
| auto | Auto-approves safe actions, blocks risky ones | Long autonomous tasks |
| bypassPermissions | Skips all permission prompts | Isolated containers only |
Tool Allow / Deny Rules
Use --allowedTools and --disallowedTools to pre-approve or block specific tools without interactive prompts:
# Pattern syntaxRead # All file readsEdit # All file editsBash(npm *) # npm commands onlyBash(git commit *) # git commit onlymcp__is-team__* # All is.team MCP toolsmcp__is-team__read_card # Specific tool onlyWebFetch(domain:github.com) # Domain-specificExample Configurations
Read-only agent (safe):
claude -p "Check my tasks and summarize" \ --allowedTools "mcp__is-team__list_cards,mcp__is-team__read_card,Read"Task management agent:
claude -p "Fix this bug and update the task" \ --allowedTools "mcp__is-team__*,Read,Edit,Bash(npm *)" \ --disallowedTools "Bash(rm *),Bash(git push *)"Fully autonomous agent:
claude -p "Work through all sprint tasks" \ --permission-mode auto \ --allowedTools "mcp__is-team__*,Read,Edit,Bash" \ --disallowedTools "Bash(rm *),Bash(git push --force *)" \ --max-turns 50Headless CI/CD:
claude --bare \ -p "Run tests and report results" \ --permission-mode bypassPermissions \ --allowedTools "Bash(npm test),Read,mcp__is-team__add_comment" \ --output-format json \ --max-turns 10Persistent Rules (settings.json)
Save permission rules permanently in your .claude/settings.json so they apply to every session:
{ "permissions": { "allow": [ "mcp__is-team__read_card", "mcp__is-team__list_cards", "Read" ], "deny": [ "Bash(rm *)", "Bash(curl * | bash)" ] }}Info
Rule priority: deny → ask → allow. A deny rule at any level always wins — no flag or setting can override it.
Additional Control Flags
| Flag | Description |
|---|---|
| --max-turns N | Limit the number of agentic loops |
| --max-budget-usd X.XX | Set a cost limit in USD |
| --output-format json|text | Control response format |
| --bare | Skip hook/skill/MCP discovery (faster for scripts) |
| --continue | Resume a previous session |
Troubleshooting
My client says it needs authentication (401)
Access tokens last an hour and your client refreshes them on its own. A 401 that doesn't go away means the refresh failed — for example, you disconnected the app, left every workspace you selected, or didn't use it for 30 days. Reconnect: in Claude or ChatGPT, open the connector and click Connect; in Claude Code, run /mcp and choose Authenticate; in Codex CLI, run codex mcp login is-team; in Gemini CLI, run /mcp auth is-team. Using an API token? Check that it still exists in Account Settings → API. Also check the server URL is exactly https://is.team/mcp — older configs pointing at /api/mcp can't complete the sign-in.
Sign-in keeps failing with mcp-remote
Older setups bridge the remote server through mcp-remote, which caches OAuth state on disk. Clear the cache and restart your client:
rm -rf ~/.mcp-authMost clients now connect to remote servers natively — if yours does, switch to the URL setup for your client.
Tools I expected are missing
The remote server has 17 tools. Board, member, sprint, worklog, attachment, notification, real-time chat and integration tools need the local agent.
A workspace doesn't show up
Apps only see the workspaces you selected on the consent screen. Disconnect the app in Account Settings → Connected apps and connect again to change the selection. For API tokens, create a new token that includes the workspace.
429 Too Many Requests
Each token can make 120 calls per minute. Wait for the number of seconds in the Retry-After header — most clients retry automatically.
The browser didn't switch back to my app
After you click Allow, desktop apps such as Cursor, VS Code and Claude Code are opened through a link. If your browser asks for permission to open the app, allow it. The confirmation page also has a link to open the app again.
Corporate networks and proxies
Both your browser and your AI client must reach https://is.team, including /mcp, /.well-known/, /oauth/ and /api/oauth/. Proxies that strip the Authorization header, block streaming responses or inspect TLS with their own certificate can break the connection. Node-based clients may need your company's CA certificate via NODE_EXTRA_CA_CERTS.
Tip
The cardId is passed as an argument to each tool call — use list_cards to find it. You can work with multiple cards in the same MCP session.
