AI meets TeamworkFX

Connect TeamAI, Claude, Cursor, and other AI assistants to TeamworkFX. Create todos, manage projects, and collaborate using natural language.

TeamAI Setup

Connect TeamworkFX to the TeamAI platform

1

Generate an API Key

Go to app.webfx.com/my-info/api-keys and click New API Key.

Give it a name like TeamAI MCP and copy the generated key.

2

Open TeamAI Tools

In TeamAI, click Tools in the sidebar, then click Create tool in the upper right.

3

Configure Tool Settings

In the modal that appears:

  • Set Visibility to Personal
  • Set Tool Type to MCP Server
4

Add Basic Details

Name your tool something like TeamworkFX MCP, then click Server Setup.

5

Configure Server Connection

Enter the MCP Server URL:

MCP Server URL
https://teamworkfx-mcp.com/mcp
6

Add Authentication

Select Header-based authentication, then:

  • Click Add header
  • Set the header key to x-twfx-api-key
  • Paste your API key as the value
  • Check the Secret checkbox
7

Save & Start Using

Click Save. You can now use TeamworkFX tools in your chats!

Cursor Setup

Connect TeamworkFX to Cursor IDE

1

Generate an API Key

Go to app.webfx.com/my-info/api-keys and click New API Key.

Give it a name like Cursor MCP and copy the generated key.

2

Open MCP Settings

In Cursor, go to SettingsMCP Servers, or press Cmd+Shift+P / Ctrl+Shift+P and search for "MCP".

3

Add Configuration

Add this to your MCP configuration, replacing YOUR_API_KEY:

~/.cursor/mcp.json
{
  "mcpServers": {
    "teamworkfx": {
      "url": "https://teamworkfx-mcp.com/mcp",
      "headers": {
        "x-twfx-api-key": "YOUR_API_KEY"
      }
    }
  }
}
4

Restart & Test

Restart Cursor, then try: "Search for projects with 'Website' in the name"

Zed Setup

Connect TeamworkFX to Zed editor

1

Generate an API Key

Go to app.webfx.com/my-info/api-keys and click New API Key.

Give it a name like Zed MCP and copy the generated key.

2

Open Zed Settings

In Zed, press Cmd+, (macOS) or Ctrl+, (Linux/Windows) to open your settings.json file.

3

Add MCP Server

Add this to your settings, replacing YOUR_API_KEY:

settings.json
{
  "context_servers": {
    "teamworkfx": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://teamworkfx-mcp.com/mcp",
        "--header",
        "x-twfx-api-key: YOUR_API_KEY"
      ]
    }
  }
}

Zed uses mcp-remote to connect to HTTP-based MCP servers. It will be installed automatically via npx.

4

Restart & Test

Restart Zed to apply the changes. Open the Assistant Panel and start using TeamworkFX tools.

Claude Desktop Setup

Connect TeamworkFX to the Claude Desktop app

1

Generate an API Key

Go to app.webfx.com/my-info/api-keys and click New API Key.

Give it a name like Claude Desktop MCP and copy the key.

2

Open Config File

In Claude Desktop, go to SettingsDeveloperEdit Config.

Or open the file directly:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
3

Add MCP Server

Add this configuration, replacing YOUR_API_KEY:

claude_desktop_config.json
{
  "mcpServers": {
    "teamworkfx": {
      "url": "https://teamworkfx-mcp.com/mcp",
      "headers": {
        "x-twfx-api-key": "YOUR_API_KEY"
      }
    }
  }
}
4

Restart Claude

Fully quit Claude Desktop (check the menu bar on macOS) and restart it. The TeamworkFX tools will appear in your chat.

Claude Code Setup

Connect TeamworkFX to Claude Code (CLI)

1

Install Claude Code

If you haven't already, install Claude Code:

Terminal
npm install -g @anthropic-ai/claude-code
2

Generate an API Key

Go to app.webfx.com/my-info/api-keys and click New API Key.

Give it a name like Claude Code MCP and copy the key.

3

Add MCP Server

Run this command to add the TeamworkFX MCP server:

Terminal
claude mcp add teamworkfx \
  --transport http \
  --url https://teamworkfx-mcp.com/mcp \
  --header "x-twfx-api-key: YOUR_API_KEY"

Replace YOUR_API_KEY with your actual API key.

4

Start Using

Launch Claude Code and start using TeamworkFX tools:

Terminal
claude

Tool Documentation

Complete reference for all 44 tools

Todos

Create, search, update, and manage todos

get_todo

Get single todo by ID with full details

Parameters
todoId*
Todo ID to retrieve
fields
Fields to return: description, parentTodoId, status, project, todolist, responsibleUser, creatorUser, startDate, dueDate, completedAt, createdAt, updatedAt, estimatedHours, milestoneId, subTodoCounts, commentCount
get_todos

Search todos with advanced filtering. Excludes completed todos by default.

Parameters
projectId
Single project ID. Use get_projects to find ID by name
projectIdIn
Multiple project IDs (OR logic)
todolistId
Single todolist ID
todolistIdIn
Multiple todolist IDs (OR logic)
responsibleUserId
Single assignee user ID
responsibleUserIdIn
Multiple assignee user IDs (OR logic)
content
Search todo title (fuzzy matching)
description
Search todo description (fuzzy matching)
status
Status filter (e.g., "In Progress")
statusIn
Multiple statuses (OR logic)
priority
Priority level filter
includeCompleted
Include completed todos (default: false)
dueDateBefore
Todos due before this date (YYYY-MM-DD)
dueDateAfter
Todos due after this date (YYYY-MM-DD)
overdue
Only overdue todos
skip
Number of todos to skip (default: 0)
limit
Maximum todos to return (default: 1000, max: 1000)
sortBy
Field to sort by (default: position)
sortOrder
Sort direction: asc or desc (default: asc)
fields
Fields to return: description, parentTodoId, status, project, todolist, responsibleUser, creatorUser, startDate, dueDate, completedAt, createdAt, updatedAt, estimatedHours, milestoneId, subTodoCounts, commentCount
create_todo

Create new todo in a todolist

Parameters
name*
Todo title/name
todolistId*
Todolist ID to add todo to
description
Todo description in Markdown format
parentTodoId
Parent todo ID to create subtask under
assignTo
User ID to assign todo to
startDate
Start date in YYYY-MM-DD format
dueDate
Due date in YYYY-MM-DD format
priority
Priority: low, normal, high, or crazy urgent
estimatedHours
Estimated hours to complete
update_todo

Update todo properties (not assignment or move)

Parameters
todoId*
Todo ID to update
content
New todo title/name
description
New description in Markdown format
startDate
New start date (YYYY-MM-DD)
dueDate
New due date (YYYY-MM-DD)
priority
New priority level
estimatedHours
New estimated hours
assign_todo

Assign/reassign todo to a user

Parameters
todoId*
Todo ID to assign
userId*
User ID to assign todo to
move_todo

Move todo to different todolist

Parameters
todoId*
Todo ID to move
todolistId*
Destination todolist ID
delete_todo

⚠️ USE WITH CAUTION: Permanently deletes a todo and all its subtodos

Parameters
todoId*
Todo ID to delete

Todolists

Organize todos into lists within projects

get_todolist

Get single todolist by ID

Parameters
todolistId*
Todolist ID to retrieve
fields
Fields to return: name, projectId, completed, url
get_todolists

Get todolists for a project with optional name search

Parameters
projectId*
Project ID to filter by
name
Todolist name to search (fuzzy matching)
limit
Maximum todolists to return (default: 100, max: 1000)
skip
Number to skip for pagination (default: 0)
fields
Fields to return: name, projectId, completed, url
create_todolist

Create new todolist in a project

Parameters
projectId*
Project ID to create todolist in
name*
Todolist name
update_todolist

Update todolist properties

Parameters
todolistId*
Todolist ID to update
name
New name for the todolist
description
New description
completed
Mark as completed (true/false)
private
Whether the todolist is private
milestoneId
Associate with milestone ID (null to remove)
delete_todolist

⚠️ USE WITH CAUTION: Permanently deletes a todolist and all its todos

Parameters
todolistId*
Todolist ID to delete

Milestones

Track major deliverables and goals

get_milestone

Get single milestone by ID

Parameters
milestoneId*
Milestone ID to retrieve
fields
Fields to return: description, dueDate, responsibleUserId, responsibleCompanyId, completedAt, completed, todolistId, creatorUser, completerUserId, private, createdAt, updatedAt
get_milestones

Get milestones for a project with filters

Parameters
projectId*
Project ID to get milestones from
name
Milestone name to search (fuzzy matching)
completed
Filter by completion status
beforeDueDate
Milestones due before this date (YYYY-MM-DD)
afterDueDate
Milestones due after this date (YYYY-MM-DD)
limit
Maximum to return (default: 100, max: 1000)
skip
Number to skip for pagination (default: 0)
sortOrder
Sort by due date: asc or desc (default: asc)
fields
Fields to return: description, dueDate, completedAt, completed, todolistId, responsibleUserId, responsibleCompanyId, creatorUserId, private, createdAt, updatedAt
create_milestone

Create new milestone in a project

Parameters
projectId*
Project ID to create milestone in
title*
Title of the milestone
dueDate*
Due date (YYYY-MM-DD format)
responsibleUserId
User ID responsible for milestone
responsibleCompanyId
Company ID responsible for milestone
description
Optional description
private
Whether the milestone is private (default: false)
update_milestone

Update milestone properties

Parameters
milestoneId*
Milestone ID to update
title
New title
description
New description
dueDate
New due date (YYYY-MM-DD)
responsibleUserId
New responsible user ID
responsibleCompanyId
New responsible company ID
completedAt
Completion date (ISO format) or null
completerUserId
User ID who completed milestone
private
Whether the milestone is private
delete_milestone

⚠️ USE WITH CAUTION: Permanently deletes a milestone

Parameters
milestoneId*
Milestone ID to delete

Comments

Discussion on todos, messages, and milestones

get_comment

Get single comment by ID

Parameters
commentId*
Comment ID to retrieve
fields
Fields to return: body, isMarkdown, creatorUser, projectId, todoId, messageId, milestoneId, createdAt, updatedAt
get_comments

Get comments for a todo, message, or milestone

Parameters
todoId
Todo ID to get comments for
messageId
Message ID to get comments for
milestoneId
Milestone ID to get comments for
limit
Maximum comments to return (default: 100, max: 500)
skip
Number to skip for pagination (default: 0)
sortOrder
Sort order: asc or desc (default: desc)
fields
Fields to return: body, isMarkdown, creatorUser, projectId, createdAt, updatedAt
create_comment

Create comment on todo, message, or milestone

Parameters
body*
Comment text (plain text or Markdown)
todoId
Todo ID to comment on
messageId
Message ID to comment on
milestoneId
Milestone ID to comment on
isMarkdown
Whether body is Markdown (default: false)
mentions
User IDs mentioned in body
subscribers
User IDs to notify
update_comment

Update comment within 15 minutes of creation

Parameters
commentId*
Comment ID to update
body
New comment text
isMarkdown
Whether body is Markdown
mentions
User IDs mentioned in body
subscribers
User IDs to notify
delete_comment

⚠️ USE WITH CAUTION: Permanently deletes a comment

Parameters
commentId*
Comment ID to delete

Messages

Project announcements and discussions

get_message

Get single message by ID

Parameters
messageId*
Message ID to retrieve
fields
Fields to return: title, content, isMarkdown, private, projectId, creatorUser, categoryId, milestoneId, todoId, pinnedAt, createdAt, updatedAt
get_messages

Get messages for a project with filters

Parameters
projectId*
Project ID to search messages in
title
Message title to search (fuzzy matching)
creatorUserId
User ID who created message
limit
Maximum to return (default: 100, max: 500)
skip
Number to skip for pagination (default: 0)
sortOrder
Sort order: asc or desc (default: desc)
fields
Fields to return: title, content, isMarkdown, private, projectId, creatorUser, categoryId, pinnedAt, createdAt, updatedAt
create_message

Create new message in a project

Parameters
projectId*
Project ID to create message in
title*
Message title/subject
content*
Message body (plain text or Markdown)
categoryId
Category ID for message organization
todoId
Todo ID to associate message with
milestoneId
Milestone ID to associate message with
isMarkdown
Whether content is Markdown (default: false)
private
Whether message is private (default: false)
mentions
User IDs mentioned in body
subscribers
User IDs to notify
update_message

Update message properties

Parameters
messageId*
Message ID to update
title
New title
content
New content/body
categoryId
Category ID, or null to remove
todoId
Todo ID to associate, or null to remove
milestoneId
Milestone ID to associate, or null to remove
isMarkdown
Whether content is Markdown
private
Whether the message is private
delete_message

⚠️ USE WITH CAUTION: Permanently deletes a message

Parameters
messageId*
Message ID to delete

Message Categories

Organize messages into categories

get_message_category

Get single message category by ID

Parameters
categoryId*
Category ID to retrieve
get_message_categories

Get message categories for a project

Parameters
projectId*
Project ID to get categories from
name
Filter by category name (partial match)
limit
Maximum to return (default: 100, max: 100)
skip
Number to skip for pagination (default: 0)
create_message_category

Create new message category in a project

Parameters
name*
Category name
projectId*
Project ID to create category in
type
Category type: message or template (default: message)
update_message_category

Update message category name or type

Parameters
categoryId*
Category ID to update
name
New category name
type
New category type: message or template
delete_message_category

⚠️ USE WITH CAUTION: Permanently deletes a message category

Parameters
categoryId*
Category ID to delete

Projects

Search and retrieve project information

get_project

Get single project by ID

Parameters
projectId*
Project ID to retrieve
fields
Fields to return: name, company, private, url
get_projects

Search projects by name with optional company filter

Parameters
name*
Project name to search (fuzzy matching)
companyId
Company ID to filter by
limit
Maximum to return (default: 100, max: 100)
skip
Number to skip for pagination (default: 0)
fields
Fields to return: name, company, private, url

Companies

Search clients and companies

get_company

Get single company by ID

Parameters
companyId*
Company ID to retrieve
fields
Fields to return: name, active, qboId, category, netsuiteId, industry, rollupIndustry
get_companies

Search companies by name

Parameters
name*
Company name to search (fuzzy matching)
active
Filter by active status (default: true)
limit
Maximum to return (default: 1000, max: 1000)
skip
Number to skip for pagination (default: 0)
fields
Fields to return: name, active, qboId, category, netsuiteId, industry, rollupIndustry

Views

Custom todo views with saved filters and grouping

get_view

Get single view by ID

Parameters
viewId*
View ID to retrieve
fields
Specific fields to return to reduce token count
get_views

Find views with filters (requires scope: projectId, todolistId, companyId, or ownerUserId)

Parameters
projectId
Filter by project ID
todolistId
Filter by todolist ID
companyId
Filter by company ID
ownerUserId
Filter by owner user ID
name
Search by name (fuzzy matching)
type
Filter by type (list, table, timeline, board, calendar, chart)
limit
Maximum views to return (default: 100, max: 1000)
skip
Number to skip for pagination (default: 0)
fields
Specific fields to return to reduce token count
create_view

Create new custom view

Parameters
name*
Name of the view
type*
View type (list, table, timeline, board, calendar, chart)
projectId
Scope to project (at least one scope required)
companyId
Scope to company
todolistId
Scope to todolist
ownerUserId
Make personal to user
filters
Filter criteria as JSON object
grouping
Grouping configuration as JSON object
sort
Sort configuration as JSON object
update_view

Update existing view

Parameters
viewId*
View ID to update
name
New name
type
New type
filters
New filter criteria
grouping
New grouping configuration
sort
New sort configuration
get_todos_by_view

Fetch todos using view configuration (applies filters, grouping, sort)

Parameters
viewId*
View ID to use
limit
Maximum todos to return (default: 1000, max: 6000)
from
Pagination offset (default: 0)
delete_view

⚠️ USE WITH CAUTION: Permanently deletes a view

Parameters
viewId*
View ID to delete

Users

Find team members for assignments

get_user

Get single user by ID

Parameters
userId*
User ID to retrieve
fields
Fields to return: firstName, lastName, email, title, activeWebFXEmployee
get_users

Search users by name or email

Parameters
email
Email address to search (exact match)
firstName
First name to search
lastName
Last name to search
fields
Fields to return: firstName, lastName, email, title, activeWebFXEmployee

Frequently Asked Questions

Common questions about the TeamworkFX MCP server

What is MCP?

MCP (Model Context Protocol) is a standard for connecting AI assistants to external tools and data sources. It allows TeamAI, Claude, Cursor, and other AI tools to interact with services like TeamworkFX.

How do I get an API key?

Visit app.webfx.com/my-info/api-keys to generate a new API key for your account.

Is my data secure?

Yes. Your API key authenticates all requests, and data is transmitted securely over HTTPS. The MCP server only accesses data your API key has permission to view.

Can I delete items through MCP?

Yes. Delete tools are available for todos, todolists, milestones, messages, message categories, comments, and views. Use with caution as delete operations permanently remove data and cannot be undone.

Which AI tools are supported?

TeamAI, Cursor, Zed, Claude Desktop, and Claude Code are officially supported. Any MCP-compatible client should work with the HTTP transport.

What transport types are supported?

Only Streamable HTTP transport is supported.

How do I troubleshoot connection issues?

Verify your API key is correct, check the MCP server URL for typos, and ensure you've fully restarted your AI tool after configuration changes.