is.team logois.team
MCP Server
AI Agents

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:

terminal
npx @isteam/mcp@latest setup

The setup wizard walks you through connecting your project:

  1. Checks Claude CLI and Node.js
  2. Asks for your API token
  3. Writes an .mcp.json entry and permission allowlist for this project
  4. Asks for a 6-character agent name (e.g. LAPTP1, DEV001, HOME01) so you can tell terminals apart in the is.team dashboard
  5. 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:

terminal
npx @isteam/mcp@latest setup --token ist_your_token_here

Tip

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

  1. Go to is.team and open Account Settings
  2. Navigate to the API tab
  3. Select the workspaces you want the agent to access
  4. Click Generate and copy the ist_xxx token
Requirements: API tokens require a Pro or Max plan. Each user can generate up to 10 tokens.

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

ToolDescriptionAvailability
list_cardsDiscover all cards you can access — IDs, titles, workspacesRemote + Local
read_cardRead card as markdown — tasks, details, notes, connectionsRemote + Local
create_taskCreate a new task with title, type, priority, and moreRemote + Local
update_taskUpdate any task field — set to null to clearRemote + Local
complete_taskMark a task as done, get move suggestionsRemote + Local
move_taskMove a task to a connected cardRemote + Local
add_commentAdd a comment to any taskRemote + Local
log_timeRecord a worklog entry — duration, description, dateRemote + Local
reorder_tasksReorder tasks — provide task numbers in desired orderRemote + Local
create_noteCreate a canvas note with markdown content. Use nearNodeId to position next to a card and auto-connect.Remote + Local
update_noteUpdate a note's title, content (markdown), or colorRemote + Local
create_edgeConnect two canvas nodes with a directional edge. Specify sourceHandle/targetHandle (top, right, bottom, left) to control connection points.Remote + Local
delete_edgeRemove a connection (edge) between two canvas nodesRemote + Local
move_nodeMove a canvas node (card or note) to a new x/y positionRemote + Local
create_stackGroup multiple notes into a stack — visually collapsed into a single nodeRemote + Local
add_to_stackAdd one or more notes to an existing stackRemote + Local
dissolve_stackDissolve a stack, restoring all notes as independent nodesRemote + Local
subscribe_cardGet real-time notifications when new tasks appear on a cardLocal only
unsubscribe_cardStop listening to a cardLocal only
chat_respondSend a message in the card's live chat as the AI agentLocal only
ask_chatAsk an interactive question in the card chat (text input, multiple choice, or yes/no) and wait for the user's answerLocal only
chat_historyFetch 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.

ToolDescriptionService
list_integrationsList all connected integrations for a workspace
GitHub — Repositories
github_list_reposList repositories connected to workspaceGitHub
github_create_repoCreate a new repositoryGitHub
github_update_repoUpdate repo name, description, visibilityGitHub
GitHub — Issues
github_search_issuesSearch issues in a repositoryGitHub
github_create_issueCreate a new issueGitHub
github_close_issueClose an issueGitHub
GitHub — Pull Requests
github_search_prsSearch pull requests in a repositoryGitHub
github_create_prCreate a pull requestGitHub
github_merge_prMerge a PR (merge, squash, or rebase)GitHub
github_close_prClose a PR without mergingGitHub
GitHub — Code
github_get_fileRead file contents from a repositoryGitHub
github_create_branchCreate a new branchGitHub
Google Drive — Files
drive_search_filesSearch files in connected DriveGoogle Drive
drive_get_fileGet file metadata and embed URLGoogle Drive
drive_create_docCreate a Google Docs documentGoogle Drive
drive_create_sheetCreate a Google Sheets spreadsheetGoogle Drive
drive_update_fileRename a file or update its descriptionGoogle Drive
drive_delete_fileDelete a file or folderGoogle Drive
Google Drive — Folders
drive_create_folderCreate a folderGoogle Drive
drive_move_fileMove a file to a different folderGoogle Drive
Slack — Channels
slack_list_channelsList available channelsSlack
slack_create_channelCreate a new channel (public or private)Slack
slack_update_channelRename, set topic or purposeSlack
slack_archive_channelArchive a channelSlack
Slack — Messages
slack_send_messageSend a message to a channelSlack
slack_send_thread_replyReply in a message threadSlack
slack_get_channel_historyRead recent messages from a channelSlack
Figma
figma_get_fileGet file metadata, pages, and thumbnailFigma
figma_get_commentsRead comments on a Figma fileFigma
figma_post_commentPost a comment on a Figma fileFigma
Google Calendar
calendar_list_eventsList upcoming calendar eventsGoogle Calendar
calendar_get_eventGet details of a specific eventGoogle Calendar
calendar_create_eventCreate a new calendar eventGoogle Calendar
calendar_update_eventUpdate an existing eventGoogle Calendar
calendar_delete_eventDelete a calendar eventGoogle 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_cards tool, or copy it from the AI Integration modal (e.g. col-1773256154568)

Which option should I use?

Remote ServerLocal Package
SetupURL + token, no installRequires Node.js + npx
Task & canvas tools17 tools17 tools
Integration tools35 tools (GitHub, Drive, Slack, Figma, Calendar)
Real-time subscriptions
Live chat & ask_chat
Best forQuick setup, one-off tasksAutonomous 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:

data.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:

terminal
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:

data.json
{  "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

data.json
{  "mcpServers": {    "is-team": {      "command": "npx",      "args": ["@isteam/mcp"],      "env": {        "IST_API_TOKEN": "ist_your_token_here"      }    }  }}

Claude Code

terminal
claude mcp add is-team -e IST_API_TOKEN=ist_your_token_here -- npx @isteam/mcp

Environment variables

  • IST_API_TOKEN (required) — your ist_ API token
  • IST_BASE_URL (optional) — defaults to https://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:

terminal
npx @isteam/mcp@latest setup

The daemon prompts add three extra steps after the regular wizard:

  1. Card selector — pick the card the daemon should watch. Only tasks added to this card trigger Claude. Everything else is ignored.
  2. 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
  3. 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

  1. The daemon subscribes to the card via Firestore and sets a baseline of existing tasks (never acts on what's already there).
  2. When a new task arrives, it's queued and dispatched one at a time (no parallel spawning).
  3. Claude is spawned with claude --print --permission-mode <mode> and a prompt that instructs it to read_card, work the task, then call complete_task.
  4. Tasks have a 30-minute timeout. On success, failure, or timeout, the daemon posts a summary back to the card chat via chat_respond.
  5. Use ask_chat from 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 start later or re-run the setup wizard to bring it back.
  • From the CLI — use daemon stop to pause or daemon uninstall to remove the service entirely.

Management commands

CommandDescription
npx @isteam/mcp daemon statusShow service state, PID, config summary, and log paths
npx @isteam/mcp daemon logs --followTail daemon stdout + stderr in real time
npx @isteam/mcp daemon startStart the service (if stopped)
npx @isteam/mcp daemon stopStop the service without removing it
npx @isteam/mcp daemon restartRestart 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 uninstallStop 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.

output.txt
"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:

terminal
claude --dangerously-load-development-channels server:is-team

This 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:

data.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

  1. The agent calls subscribe_card — the card's chat indicator turns amber and shows "Claude (MCP)".
  2. 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_message notification.
  3. The agent reads the message (optionally using chat_history for context), then replies with chat_respond.
  4. The reply appears instantly in every team member's chat window. A "Claude is thinking..."indicator shows while waiting for the agent's response.
  5. When the agent calls unsubscribe_card, the chat reverts to the default AI Card Assistant mode.

Example conversation

output.txt
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

ToolParametersDescription
chat_respondcardId, contentSend a reply in the card chat. Appears as "Claude (MCP)".
ask_chatcardId, question, type, options?Ask an interactive question (text/options/confirm). The user's answer arrives as a chat notification.
chat_historycardId, 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:

ModeBehaviorBest for
defaultAsks before edits and bash commandsInteractive work
acceptEditsAuto-approves file edits, still asks for bashCode iteration
planRead-only, no edits or executionExploration
autoAuto-approves safe actions, blocks risky onesLong autonomous tasks
bypassPermissionsSkips all permission promptsIsolated containers only

Tool Allow / Deny Rules

Use --allowedTools and --disallowedTools to pre-approve or block specific tools without interactive prompts:

terminal
# 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-specific

Example Configurations

Read-only agent (safe):

terminal
claude -p "Check my tasks and summarize" \  --allowedTools "mcp__is-team__list_cards,mcp__is-team__read_card,Read"

Task management agent:

terminal
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:

terminal
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 50

Headless CI/CD:

terminal
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 10

Persistent Rules (settings.json)

Save permission rules permanently in your .claude/settings.json so they apply to every session:

data.json
{  "permissions": {    "allow": [      "mcp__is-team__read_card",      "mcp__is-team__list_cards",      "Read"    ],    "deny": [      "Bash(rm *)",      "Bash(curl * | bash)"    ]  }}

Info

Rule priority: denyaskallow. A deny rule at any level always wins — no flag or setting can override it.

Additional Control Flags

FlagDescription
--max-turns NLimit the number of agentic loops
--max-budget-usd X.XXSet a cost limit in USD
--output-format json|textControl response format
--bareSkip hook/skill/MCP discovery (faster for scripts)
--continueResume 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.

© 2026 IS.TEAM LLC. All rights reserved.