MCP Asana 服务
在MCP客户端(例如Anthropic的Claude桌面应用程序)上执行Asana操作,还有更多功能。
MCP 服务配置
复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用
{
"mcpServers": {
"asana": {
"args": [
"-y",
"@roychri/mcp-server-asana"
],
"command": "npx",
"env": {
"ASANA_ACCESS_TOKEN": "your-asana-access-token"
}
}
}
}
该服务需要配置环境变量:ASANA_ACCESS_TOKEN
服务介绍
Asana 的 MCP 服务器
这个 Asana 的 Model Context Protocol 服务器实现允许你通过 MCP 客户端(如 Anthropic 的 Claude 桌面应用程序等)与 Asana API 进行通信。
更多关于 MCP 的信息:
- https://www.anthropic.com/news/model-context-protocol
- https://modelcontextprotocol.io/introduction
- https://github.com/modelcontextprotocol
使用方法
在您选择的 AI 工具中(例如:Claude 桌面应用),询问有关 asana 任务、项目、工作区和/或评论的信息。提到“asana”这个词将增加语言模型选择正确工具的机会。
示例:
我们在 Sprint 30 项目中有多少未完成的 asana 任务?
另一个示例:

工具
asana_list_workspaces- List all available workspaces in Asana
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: List of workspaces
asana_search_projects- Search for projects in Asana using name pattern matching
- Required input:
- workspace (string): The workspace to search in
- name_pattern (string): Regular expression pattern to match project names
- Optional input:
- archived (boolean): Only return archived projects (default: false)
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: List of matching projects
asana_search_tasks- Search tasks in a workspace with advanced filtering options
- Required input:
- workspace (string): The workspace to search in
- Optional input:
- text (string): Text to search for in task names and descriptions
- resource_subtype (string): Filter by task subtype (e.g. milestone)
- completed (boolean): Filter for completed tasks
- is_subtask (boolean): Filter for subtasks
- has_attachment (boolean): Filter for tasks with attachments
- is_blocked (boolean): Filter for tasks with incomplete dependencies
- is_blocking (boolean): Filter for incomplete tasks with dependents
- assignee, projects, sections, tags, teams, and many other advanced filters
- sort_by (string): Sort by due_date, created_at, completed_at, likes, modified_at (default: modified_at)
- sort_ascending (boolean): Sort in ascending order (default: false)
- opt_fields (string): Comma-separated list of optional fields to include
- custom_fields (object): Object containing custom field filters
- Returns: List of matching tasks
asana_get_task- Get detailed information about a specific task
- Required input:
- task_id (string): The task ID to retrieve
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: Detailed task information
asana_create_task- Create a new task in a project
- Required input:
- project_id (string): The project to create the task in
- name (string): Name of the task
- Optional input:
- notes (string): Description of the task
- html_notes (string): HTML-like formatted description of the task
- due_on (string): Due date in YYYY-MM-DD format
- assignee (string): Assignee (can be 'me' or a user ID)
- followers (array of strings): Array of user IDs to add as followers
- parent (string): The parent task ID to set this task under
- projects (array of strings): Array of project IDs to add this task to
- resource_subtype (string): The type of the task (default_task or milestone)
- custom_fields (object): Object mapping custom field GID strings to their values
- Returns: Created task information
asana_get_task_stories- Get comments and stories for a specific task
- Required input:
- task_id (string): The task ID to get stories for
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: List of task stories/comments
asana_update_task- Update an existing task's details
- Required input:
- task_id (string): The task ID to update
- Optional input:
- name (string): New name for the task
- notes (string): New description for the task
- due_on (string): New due date in YYYY-MM-DD format
- assignee (string): New assignee (can be 'me' or a user ID)
- completed (boolean): Mark task as completed or not
- resource_subtype (string): The type of the task (default_task or milestone)
- custom_fields (object): Object mapping custom field GID strings to their values
- Returns: Updated task information
asana_get_project- Get detailed information about a specific project
- Required input:
- project_id (string): The project ID to retrieve
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: Detailed project information
asana_get_project_task_counts- Get the number of tasks in a project
- Required input:
- project_id (string): The project ID to get task counts for
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: Task count information
asana_get_project_sections- Get sections in a project
- Required input:
- project_id (string): The project ID to get sections for
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: List of project sections
asana_create_task_story- Create a comment or story on a task
- Required input:
- task_id (string): The task ID to add the story to
- text (string): The text content of the story/comment
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: Created story information
asana_add_task_dependencies- Set dependencies for a task
- Required input:
- task_id (string): The task ID to add dependencies to
- dependencies (array of strings): Array of task IDs that this task depends on
- Returns: Updated task dependencies
asana_add_task_dependents- Set dependents for a task (tasks that depend on this task)
- Required input:
- task_id (string): The task ID to add dependents to
- dependents (array of strings): Array of task IDs that depend on this task
- Returns: Updated task dependents
asana_create_subtask- Create a new subtask for an existing task
- Required input:
- parent_task_id (string): The parent task ID to create the subtask under
- name (string): Name of the subtask
- Optional input:
- notes (string): Description of the subtask
- due_on (string): Due date in YYYY-MM-DD format
- assignee (string): Assignee (can be 'me' or a user ID)
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: Created subtask information
asana_get_multiple_tasks_by_gid- Get detailed information about multiple tasks by their GIDs (maximum 25 tasks)
- Required input:
- task_ids (array of strings or comma-separated string): Task GIDs to retrieve (max 25)
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: List of detailed task information
asana_get_project_status- Get a project status update
- Required input:
- project_status_gid (string): The project status GID to retrieve
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: Project status information
asana_get_project_statuses- Get all status updates for a project
- Required input:
- project_gid (string): The project GID to get statuses for
- Optional input:
- limit (number): Results per page (1-100)
- offset (string): Pagination offset token
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: List of project status updates
asana_create_project_status- Create a new status update for a project
- Required input:
- project_gid (string): The project GID to create the status for
- text (string): The text content of the status update
- Optional input:
- color (string): The color of the status (green, yellow, red)
- title (string): The title of the status update
- html_text (string): HTML formatted text for the status update
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: Created project status information
asana_delete_project_status- Delete a project status update
- Required input:
- project_status_gid (string): The project status GID to delete
- Returns: Deletion confirmation
asana_set_parent_for_task- Set the parent of a task and position the subtask within the other subtasks of that parent
- Required input:
- task_id (string): The task ID to operate on
- data (object):
- parent (string): The new parent of the task, or null for no parent
- Optional input:
- insert_after (string): A subtask of the parent to insert the task after, or null to insert at the beginning of the list
- insert_before (string): A subtask of the parent to insert the task before, or null to insert at the end of the list
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: Updated task information
asana_get_tasks_for_tag- Get tasks for a specific tag
- Required input:
- tag_gid (string): The tag GID to retrieve tasks for
- Optional input:
- opt_fields (string): Comma-separated list of optional fields to include
- opt_pretty (boolean): Provides the response in a 'pretty' format
- limit (integer): The number of objects to return per page. The value must be between 1 and 100.
- offset (string): An offset to the next page returned by the API.
- Returns: List of tasks for the specified tag
asana_get_tags_for_workspace- Get tags in a workspace
- Required input:
- workspace_gid (string): Globally unique identifier for the workspace or organization
- Optional input:
- limit (integer): Results per page. The number of objects to return per page. The value must be between 1 and 100.
- offset (string): Offset token. An offset to the next page returned by the API.
- opt_fields (string): Comma-separated list of optional fields to include
- Returns: List of tags in the workspace
提示
-
task-summary- 根据任务的备注、自定义字段和评论获取任务摘要和状态更新
- 必需输入:
- task_id (字符串): 要获取摘要的任务ID
- 返回: 用于生成任务摘要的详细提示
-
task-completeness- 分析任务描述是否包含完成所需的所有必要细节
- 必需输入:
- task_id (字符串): 要分析的任务ID或URL
- 返回: 用于分析任务完整性的详细提示
-
create-task- 使用指定的详情创建新任务
- 必需输入:
- project_name (字符串): 应该在其中创建任务的Asana项目名称
- title (字符串): 任务标题
- 可选输入:
- notes (字符串): 任务的备注或描述
- due_date (字符串): 任务截止日期 (YYYY-MM-DD 格式)
- 返回: 用于创建全面任务的详细提示
资源
-
工作区 -
asana://workspace/{workspace_gid}- 作为资源表示的Asana工作区
- 每个工作区都作为一个独立的资源展示
- URI 格式:
asana://workspace/{workspace_gid} - 返回: 包含工作区详情的JSON对象,包括:
name: 工作区名称 (字符串)id: 工作区全局ID (字符串)type: 资源类型 (字符串)is_organization: 工作区是否为组织 (布尔值)email_domains: 与工作区关联的电子邮件域名列表 (字符串数组)
- MIME 类型:
application/json
-
项目 -
asana://project/{project_gid}- 通过GID检索项目详情的模板资源
- URI 格式:
asana://project/{project_gid} - 返回: 包含项目详情的JSON对象,包括:
name: 项目名称 (字符串)id: 项目全局ID (字符串)type: 资源类型 (字符串)archived: 项目是否已归档 (布尔值)public: 项目是否公开 (布尔值)notes: 项目描述/备注 (字符串)color: 项目颜色 (字符串)default_view: 默认视图类型 (字符串)due_date,due_on,start_on: 项目日期信息 (字符串)workspace: 包含工作区信息的对象team: 包含团队信息的对象sections: 项目中的部分对象数组custom_fields: 项目的自定义字段定义数组
- MIME 类型:
application/json
设置
请注意,原文中的“Setup”部分没有具体内容,因此在翻译中也保持了这种形式。如果这部分有额外的信息需要添加,请告知我。
-
创建 Asana 账户:
- 访问 Asana。
- 点击“注册”。
-
获取 Asana 访问令牌:
- 您可以从 Asana 开发者控制台生成个人访问令牌。
- 更多详情请参阅:https://developers.asana.com/docs/personal-access-token
-
配置 Claude Desktop:
在您的claude_desktop_config.json文件中添加以下内容:{ "mcpServers": { "asana": { "command": "npx", "args": ["-y", "@roychri/mcp-server-asana"], "env": { "ASANA_ACCESS_TOKEN": "your-asana-access-token" } } } }
如果您想安装测试版(尚未发布),可以使用:
@roychri/mcp-server-asana@beta
您可以通过以下方式找到当前的测试版本(如果有):
- https://www.npmjs.com/package/@roychri/mcp-server-asana?activeTab=versions
npm dist-tag ls @roychri/mcp-server-asana
故障排除
如果遇到权限错误:
- 确保您的 Asana 计划允许 API 访问。
- 确认在
claude_desktop_config.json中正确设置了访问令牌和配置。
贡献
克隆此仓库并开始开发。
使用 MCP Inspector 本地测试
如果您想测试您的更改,可以这样使用 MCP Inspector:
npm run inspector
这将使客户端暴露在端口 5173 上,服务器暴露在端口 3000 上。
如果这些端口已被其他程序占用,您可以使用:
CLIENT_PORT=5009 SERVER_PORT=3009 npm run inspector
许可证
该 MCP 服务器根据 MIT 许可证授权。这意味着您可以在遵守 MIT 许可证条款和条件的前提下自由使用、修改和分发该软件。更多详细信息,请参见项目仓库中的 LICENSE 文件。