MCP Server
Connect AI agents directly to your tasks using the Model Context Protocol (MCP). Works with Claude Desktop, Claude Code, Cursor, Windsurf, and any MCP-compatible client.
Quick Setup
Get started in under a minute. Run this command 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.
If you already have your API token, pass it directly to skip the prompt:
npx @isteam/mcp@latest setup --token ist_your_token_hereTip
You can also click the agent badge slot on any card header to open a setup dialog with a ready-to-copy command.
Get Your API Token
- Go to is.team and open Account Settings
- Navigate to the API tab
- Select the workspaces you want the agent to access
- Click Generate and copy the
ist_xxxtoken
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 in real time.
Available Tools
The MCP server exposes 57 tools across task management, canvas operations, real-time subscriptions, and workspace integrations. Tools marked with local only require the local package. Integration tools require the corresponding service to be connected in Workspace Settings → Integrations. Rate limits: remote server 10 req/min, exec endpoint 60 req/min.
Task Management
| 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 |
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 package 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 |
Prerequisites
- Enable AI Integration on the board card you want to expose (card context menu → AI Integration)
- Generate an API token from Account Settings → API tab
- Find your card ID using the
list_cardstool, or copy it from the AI Integration modal (e.g.col-1773256154568)
Which option should I use?
| Remote Server | Local Package | |
|---|---|---|
| Setup | URL + token, no install | Requires Node.js + npx |
| Task & canvas tools | 17 tools | 17 tools |
| Integration tools | ✕ | 35 tools (GitHub, Drive, Slack, Figma, Calendar) |
| Real-time subscriptions | ✕ | ✓ |
| Live chat & ask_chat | ✕ | ✓ |
| Best for | Quick setup, one-off tasks | Autonomous agents, continuous workflows |
Tip
Our recommendation: Use the local packageif your client supports it. It unlocks real-time subscriptions and live chat — the features that make AI agents truly autonomous. Use the remote server only if you need a zero-install setup or your client doesn't support stdio.
Option 1: Remote Server
The remote MCP server is hosted at https://is.team/mcp. No installation required — just add the URL to your MCP client configuration. Good for quick setup and one-off tasks, but does not support real-time subscriptions or live chat.
Info
The remote server runs on serverless infrastructure. Each request creates a fresh connection — there is no persistent state between calls. This means subscribe_card, unsubscribe_card, chat_respond, ask_chat, chat_history, and all workspace integration tools (GitHub, Drive, Slack, Figma, Calendar) are not available. Use the local package for these features.
Claude Desktop
Add to your claude_desktop_config.json:
{ "mcpServers": { "is-team": { "url": "https://is.team/mcp", "headers": { "Authorization": "Bearer ist_your_token_here" } } }}Claude Code
Add the remote server from the CLI:
claude mcp add is-team \ --transport http \ --url https://is.team/mcp \ --header "Authorization: Bearer ist_your_token_here"Cursor / Windsurf
Add to your project's .cursor/mcp.json or global MCP config:
{ "mcpServers": { "is-team": { "url": "https://is.team/mcp", "headers": { "Authorization": "Bearer ist_your_token_here" } } }}Option 2: Local Package (Recommended)
The local package runs as a persistent process on your machine via stdio, giving you access to all tools including real-time subscriptions and live chat. It requires Node.js and communicates with the is.team API on your behalf.
Claude Desktop
{ "mcpServers": { "is-team": { "command": "npx", "args": ["@isteam/mcp"], "env": { "IST_API_TOKEN": "ist_your_token_here" } } }}Claude Code
claude mcp add is-team -e IST_API_TOKEN=ist_your_token_here -- npx @isteam/mcpEnvironment 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's experimental channel notification system to deliver real-time task and chat updates. When running with Claude Code, 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 won't be delivered — you'll need to 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 package. 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 require the local package (Option 2). The remote server runs on serverless infrastructure and cannot maintain the persistent connection needed for real-time listeners.
Claude Code
Launch Claude Code with the MCP server name to enable real-time subscriptions:
claude --dangerously-load-development-channels server:is-teamThis starts Claude Code with the local is-team MCP server attached as a persistent channel, allowing it to receive real-time task notifications.
Claude Desktop
Claude Desktop supports real-time subscriptions out of the box. Once you add the local stdio config (Option 2), subscriptions work automatically — no extra flags needed.
Cursor / Windsurf
Add the local stdio config (Option 2) to your project's .cursor/mcp.json:
{ "mcpServers": { "is-team": { "command": "npx", "args": ["@isteam/mcp"], "env": { "IST_API_TOKEN": "ist_your_token_here" } } }}Once connected, ask the agent to subscribe to a card. Real-time notifications will appear as the agent processes incoming tasks.
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 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.
Access Control
AI access is controlled per card. Enable AI Integration on a card to allow all MCP tools to interact with it — reading tasks, creating, updating, commenting, and more.
Configure from the card's context menu → AI Integration. Cards without AI Integration enabled will return a "not found" error for all tool calls except list_cards, which only requires a valid API token.
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 |
Tip
The cardId is passed as an argument to each tool call. You can work with multiple cards in the same MCP session.
