Productive.io MCP服务器
  
用于将Productive.io集成到AI工作流中的模型上下文协议(MCP)服务器。该服务器允许AI助手和工具访问项目、文件夹、工作流状态、时间条目、任务、评论、页面、附件、待办事项和人员。内置于 FastMCP.
此实现针对以读取为中心的操作进行了优化,具有可选的保护写入功能(例如任务创建)和LLM友好的输出选项(JSON和TOON)。它针对效率和简单性进行了优化,只显示必要的信息。要获得更全面的解决方案,请考虑BerwickGeek的实施: BerwickGeek的高效MCP.
特性
阅读工具
- 列出项目:检索所有包含基本信息的项目
- 列出文件夹:检索项目中的文件夹
- 获取文件夹:按ID检索特定文件夹
- 列出工作流状态:使用可选筛选器检索工作流状态
- 列出时间条目:使用可选的日期和关系筛选器检索时间条目
- 列出任务:使用筛选和分页检索任务
- 获取任务:通过内部ID检索特定任务
- 获取任务历史记录:检索任务状态更改、分配、里程碑和活动摘要
- 列出评论:通过筛选检索评论
- 列表页面:使用筛选检索页面/文档
- 获取页面:按ID检索特定页面/文档
- 列出附件:使用筛选检索附件/文件
- 全部列表:通过筛选检索待办事项清单项
- 获取Todo:按ID检索特定待办事项
- 列出人员:使用分页检索人员/团队成员
- 获取人员:按ID检索特定人员
- 列出最近的活动:状态更新的活动提要摘要
- 快速搜索:跨项目、任务、页面和操作进行快速、全面的搜索
写入工具(READ_ONLY=true时被阻止)
- 创建任务:在项目中创建新任务
- 更新任务:更新任务字段--标题、描述、受让人、截止日期、状态、板、任务列表
- 删除任务:按ID永久删除任务(不可逆)
- 创建评论:为任务或项目创建新注释
- 更新评论:更新评论正文
- 删除评论:按ID永久删除评论(不可逆)
- 创建时间条目:记录在任务或服务上花费的时间
- 更新时间条目:修改现有时间条目
- 删除时间条目:删除时间条目(不可逆)
- 创建页面:在项目中创建新文档/页面
- 更新页面:编辑页面内容和标题
- 删除页面:删除页面/文档(不可逆)
- 创建待办事项:将检查表项目添加到任务中
- 更新待办事项:修改待办事项和完成状态
- 删除待办事项:删除todo项目(不可逆)
附加功能
- LLM优化响应:过滤后的输出消除了噪声,剥离了HTML,并减少了令牌消耗
需求
- Python 3.10+
- 生产性API代币
- FastMCP 3.x
安装
- 克隆或下载此存储库
- 安装依赖项:
pip install -r requirements.txt或
uv venv && uv sync配置
服务器使用环境变量进行配置:
PRODUCTIVE_API_KEY:您的高效API令牌(必需)PRODUCTIVE_ORGANIZATION:您的生产组织ID(必填)PRODUCTIVE_BASE_URL:生产API的基本URL(默认值:https://api.productive.io/api/v2)PRODUCTIVE_TIMEOUT:请求超时(秒)(默认值:30)OUTPUT_FORMAT:工具响应的输出格式(toon或json,默认:toon)READ_ONLY:用于写工具的全局写保护切换--create_task、update_task,delete_task和create_comment,update_comment、delete_comment和create_time_entry,delete_time_entrys,create_page,update_page,delete_page,create_todo,update_todo和delete_todo(“true”或“false”,默认值:“true”)
用法
使用 uvx 来自GitHub(推荐给MCP客户端)
"productive": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/druellan/Productive-Simple-MCP",
"productive-mcp"
],
"env": {
"PRODUCTIVE_API_KEY": "",
"PRODUCTIVE_ORGANIZATION": ""
}
}使用 uvx 从启用了TOON输出的GitHub
"productive": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/druellan/Productive-Simple-MCP",
"productive-mcp"
],
"env": {
"PRODUCTIVE_API_KEY": "",
"PRODUCTIVE_ORGANIZATION": "",
"OUTPUT_FORMAT": "toon"
}
}本地开发(直接执行Python)
"productive": {
"command": "python",
"args": [
"server.py"
],
"env": {
"PRODUCTIVE_API_KEY": "",
"PRODUCTIVE_ORGANIZATION": ""
}
}利用紫外线进行地方发展
"productive": {
"command": "uv",
"args": [
"--directory", "
",
"run", "server.py"
],
"env": {
"PRODUCTIVE_API_KEY": "",
"PRODUCTIVE_ORGANIZATION": ""
}
}可用工具
阅读工具
list_projects
检索所有包含基本信息的项目。
属性:
- 无参数(返回所有项目)
list_folders
检索特定项目中的文件夹。
Productive的API通过 /folders 终点。
属性:
project_id(int,必填):按生产项目ID筛选文件夹status(int,可选):文件夹状态过滤器(1活跃,2存档)。默认为1limit(int,可选):要返回的最大文件夹数(默认值:50,最大值:200)
get_folder
按ID检索特定文件夹。
Productive的API通过 /folders 终点。
属性:
folder_id(int):唯一的Productive文件夹标识符
list_workflow_statuses
使用可选筛选器检索工作流状态。
属性:
workflow_id(int,可选):按工作流ID筛选状态category_id(int,可选):按类别筛选(1未开始,2起动,3关闭)limit(int,可选):返回的最大状态数(默认值:50,最大值:200)
list_time_entries
使用可选的日期和关系筛选器检索时间条目。
属性:
date(str,可选):精确日期过滤器(YYYY-MM-DD)after(str,可选):下限日期过滤器(YYYY-MM-DD)before(str,可选):上限日期过滤器(YYYY-MM-DD)person_id(int,可选):按人员ID筛选project_id(int,可选):按项目ID筛选task_id(int,可选):按任务ID筛选service_id(int,可选):按服务ID筛选page_number(int,可选):分页页码limit(int,可选):返回的最大条目数(默认值:50,最大值:200)
list_people
使用可选分页检索人员/团队成员。
属性:
page_number(int,可选):分页页码page_size(int,可选):每页返回的人数(最多200人)
get_person
按ID检索特定人员。
属性:
person_id(int):唯一的生产人员标识符
list_tasks
使用可选的筛选和分页检索任务。
属性:
project_id(int,可选):按生产项目ID筛选任务user_id(int,可选):按受让人/用户ID筛选任务page_number(int,可选):分页页码page_size(int,可选):分页页面大小(默认值:50)sort(str,可选):排序参数(例如,“last_activity_at”、“-last_activity_at”、“created_at”和“due_date”)extra_filters(dict,可选):额外的高效API过滤器(例如。,{'filter[status][eq]': 1}对于开放任务,{'filter[status][eq]': 2}对于已关闭的任务)
get_task
通过内部ID检索特定任务。返回任务详细信息,包括标题、描述、状态、日期、, 时间跟踪指标 (initial_estimate, worked_time, billable_time, remaining_time),待办事项很重要。
属性:
task_id(int):唯一的生产任务标识符(内部ID,例如14677418)
get_task_history
检索特定任务的完整历史记录,包括状态更改、分配历史记录、里程碑和活动摘要。
属性:
task_id(int):唯一的生产任务标识符(内部ID,例如14677418)hours(int,可选):回顾活动历史的小时数(默认值:720=30天,最大值:8760)
退货:
status_history:带有时间戳的状态更改时间线(从/到状态和changed_at)assignment_history:分配更改,显示分配给谁以及何时分配(assigned_to和changed_at)milestones:评论和活动中的关键交付成果和完成标记activity_summary:评论、更改、状态更新、任务和里程碑的计数
例子:
get_task_history(14677921) # Default 30-day history
get_task_history(14677921, hours=168) # Last week only
get_task_history(14677921, hours=24) # Last 24 hourslist_comments
使用可选的过滤和分页功能检索评论。
属性:
project_id(int,可选):按生产项目ID过滤评论task_id(int,可选):按生产任务ID筛选评论page_number(int,可选):分页页码page_size(int,可选):分页页面大小extra_filters(dict,可选):额外的高效API过滤器(例如。,{'filter[discussion_id]': '123'})
list_pages
使用可选的过滤和分页功能检索页面/文档。
属性:
project_id(int,可选):按生产项目ID筛选页面creator_id(int,可选):按创建者ID过滤页面page_number(int,可选):分页页码page_size(int,可选):分页页面大小
get_page
按ID检索特定页面/文档。
属性:
page_id(int):唯一的生产页面标识符
list_attachments
使用可选的过滤和分页功能检索附件/文件。
属性:
page_number(int,可选):分页页码page_size(int,可选):分页页面大小extra_filters(dict,可选):额外的高效API过滤器
list_recent_activity
获取最近活动和更新的摘要提要。非常适合状态更新。
属性:
hours(int,可选):回顾的小时数(默认值:24,一周使用168)user_id(int,可选):按特定用户/个人ID筛选project_id(int,可选):按特定项目ID筛选activity_type(int,可选):按活动类型筛选(1:评论,2:变更集,3:电子邮件)item_type(str,可选):按项目类型筛选(例如,“任务”、“页面”、“交易”、“工作区”)event_type(str,可选):按事件类型筛选(例如,“创建”、“复制”、“更新”、“删除”)task_id(int,可选):按特定任务ID筛选max_results(int,可选):要返回的最大活动数(默认值:100,最大值:200)
list_todos
使用可选的过滤和分页功能检索待办事项清单项。
属性:
task_id(int,可选):按生产任务ID筛选待办事项page_number(int,可选):分页页码page_size(int,可选):分页页面大小extra_filters(dict,可选):额外的高效API过滤器
quick_search
跨项目、任务、页面和操作快速搜索。
属性:
query(str):搜索查询字符串search_types(list\[str\],可选):要搜索的类型列表(动作、项目、任务、页面)。默认为全部。deep_search(bool,可选):是否执行深度搜索(默认值:True)page(int,可选):分页页码(默认值:1)per_page(int,可选):每页结果(默认值:50)
说明: 提供跨所有生产性内容类型(包括项目、任务、页面和操作)的快速、全面的搜索。它针对快速查找和一般搜索查询进行了优化。
响应格式: 返回针对LLM消费优化的筛选结果,仅包含基本字段:
record_id:资源的唯一标识符record_type:资源类型(项目、任务、页面等)title:显示标题(删除搜索突出显示)subtitle:附加上下文或描述icon_url:资源图标/头像的URL(如果可用)status:当前状态(活动、关闭等)project_name:关联项目的名称updated_at:上次更新时间戳webapp_url:直接链接查看Productive web界面中的资源
示例:
quick_search("deployment") # Search for "deployment" across all content types
quick_search("meeting notes", search_types=["project"]) # Search only in projects
quick_search("this week summary", deep_search=False) # Quick search without deep scanget_todo
按ID检索特定待办事项清单项。
属性:
todo_id(int):唯一的生产待办事项清单项目标识符
写入工具
create_task
在Productive中创建新任务。
什么时候 READ_ONLY=true,此工具被全局阻止并返回写保护错误。
属性:
title(str,必填):任务标题project_id(int,必填):创建任务的生产项目IDdescription(str,可选):任务描述board_id(int,可选):板IDtask_list_id(int,可选):任务列表IDassignee_id(int,可选):受让人/个人IDdue_date(str,可选):截止日期(YYYY-MM-DD)status(str,可选):open或closed(默认值:open)
update_task
在Productive中更新现有任务。仅修改提供的字段(部分PATCH)。 必须至少给出一个字段。什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
task_id(int,必填):要更新的生产任务IDtitle(str,可选):新任务标题description(str,可选):新任务描述assignee_id(int,可选):新的受让人ID。使用0或负数取消分配。due_date(str,可选):新的截止日期(YYYY-MM-DD)status(str,可选):新状态--open或closedboard_id(int,可选):将任务移动到此板task_list_id(int,可选):将任务移动到此任务列表
delete_task
按ID从Productive中永久删除任务。此操作是不可逆的-- 任务和所有相关数据将被删除。什么时候 READ_ONLY=true,这个工具是 全球封锁。
属性:
task_id(int,必填):要删除的生产任务ID
create_comment
在Productive中为任务或项目创建新注释。必须附上评论 任务或项目中的至少一个。什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
body(str,必填):评论正文(支持HTML)task_id(int,可选):用于附加注释的生产任务IDproject_id(int,可选):用于附加注释的生产项目ID
update_comment
在Productive中更新现有评论。只能修改body属性。 什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
comment_id(int,必填):要更新的生产性评论IDbody(str,必填):新的评论正文(支持HTML)
delete_comment
按ID从Productive中永久删除评论。此操作是不可逆的-- 注释将从任务或项目中删除。什么时候 READ_ONLY=true,这个工具 被全球封锁。
属性:
comment_id(int,必填):要删除的生产性评论ID
create_time_entry
在Productive中创建新的时间条目以进行时间跟踪。
记录在任务或服务上花费的时间。必须提供task_id或service_id。 什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
date(str,必填):输入时间的日期(YYYY-MM-DD)time(浮点数,必填):花费的时间(以小时为单位)(例如2.5)person_id(int,必填):记录时间的人员IDtask_id(int,可选):将时间条目与任务ID相关联service_id(int,可选):将时间条目与关联的服务IDnote(str,可选):可选注释或描述
update_time_entry
更新生产中的现有时间条目。仅修改提供的字段(部分PATCH)。 必须至少给出一个字段。什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
time_entry_id(int,必填):要更新的生产时间条目IDdate(str,可选):新日期(YYYY-MM-DD)time(浮动,可选):以小时为单位的新时间person_id(int,可选):新人员IDtask_id(int,可选):新任务IDservice_id(int,可选):新服务IDnote(str,可选):新注释
delete_time_entry
按ID从Productive中永久删除时间条目。此操作是不可逆的-- 时间条目将从时间跟踪记录中删除。什么时候 READ_ONLY=true,这个工具 被全球封锁。
属性:
time_entry_id(int,必填):要删除的生产时间条目ID
create_page
在生产项目中创建新页面/文档。
页面是可以包含富文本内容并在项目中组织的文档。 什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
title(str,必填):页面标题project_id(int,必填):创建页面的生产项目IDcontent(str,可选):页面内容(支持HTML)
update_page
在Productive中更新现有页面/文档。仅修改提供的字段(部分PATCH)。 必须至少给出一个字段。什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
page_id(int,必填):要更新的生产页面IDtitle(str,可选):新页面标题content(str,可选):新页面内容(支持HTML)
delete_page
按ID从Productive中永久删除页面/文档。此操作是不可逆的-- 页面及其所有内容都将被删除。什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
page_id(int,必填):要删除的生产页面ID
create_todo
在Productive中为任务创建一个新的待办事项清单项。
待办事项是任务中的复选框项,用于精细跟踪工作项。 什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
content(str,必填):待办事项内容/描述task_id(int,必填):用于添加待办事项的生产任务ID
update_todo
在Productive中更新现有的待办事项清单项。仅修改提供的字段(部分PATCH)。 必须至少给出一个字段。什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
todo_id(int,必填):要更新的生产待办事项IDcontent(str,可选):新建待办事项内容completed(bool,可选):将todo标记为已完成(true)或未完成(false)
delete_todo
按ID从Productive中永久删除待办事项清单项。此操作是不可逆的-- todo项将从任务中删除。什么时候 READ_ONLY=true,此工具在全球范围内被阻止。
属性:
todo_id(int,必填):要删除的生产待办事项ID
输出格式
所有工具都返回针对LLM处理优化的过滤数据。输出格式可以通过配置 OUTPUT_FORMAT 环境变量:
- 卡通 (默认):与JSON相比,令牌优化对象表示法可将令牌消耗减少30-60%,是LLM交互的理想选择
- JSON:标准JSON格式,与现有工具和工作流兼容
所有工具都返回针对LLM处理优化的过滤数据:
LLM优化:
- 删除不需要的字段(例如。,
creation_method_id,email_key,placement来自任务) - 从描述和评论中删除HTML
- 空/null值已删除
- 分页链接已删除
- 列表视图使用轻量级输出(例如。,
get_project_tasks不包括描述和关系) - 包括Web应用程序URL:每个资源包括一个
webapp_url直接链接到Productive web界面的字段
响应结构:
data:主要资源数据(数组用于集合,对象用于单个项目)meta:分页和元数据included:相关资源数据(如适用)webapp_url:直接链接查看Productive中的资源(例如。,https://app.productive.io/12345/tasks/67890)
错误处理
服务器提供全面的错误处理:
- 401未经授权:API令牌无效
- 404未找到:未找到资源
- 429价格有限:请求太多
- 500服务器错误:生产性API问题
所有错误都通过MCP上下文记录,并具有适当的严重级别。
安全
- API令牌从环境变量加载
- 未记录敏感数据
- HTTPS用于所有API请求
- 错误消息不公开内部详细信息
许可证
MIT许可证。
