Project Feed holds a team's projects, tasks, posts, docs and agent handoffs. A connection works in one workspace: call check_auth to see it, and reconnect with a /api/mcp/w/<slug> URL to change it. Never invent IDs; copy them from list, search and get results. For local handoff waits, use pf handoffs wait. Otherwise poll 30 seconds apart, or 60 seconds when empty. Read lists page by page with the cursor they return. Use Project Feed tools and resources only within the authenticated workspace. After a rate_limit_exceeded result, wait retryAfterSeconds before calling again. When you retry a write that accepts requestKey or idempotencyKey, send the same value. To find something by keyword or by an identifier such as PRO-42, call search. To enumerate, call a list_ tool with its filters. A parameter that accepts an identifier like PRO-42 says so; every other ID parameter needs the ID from a list or search result. Change several tasks with bulk_update_tasks and read several handoff statuses at once instead of looping. List and get tools reply concisely by default; set response_format to detailed for every field and the full text, especially when a result says truncated. Continue a list with the cursor it returns, nextCursor for most lists and continueCursor for handoffs, instead of starting over. Add ?toolset=core, tasks, content, portals or workspace to the connection URL to load fewer tools. A tool missing from the list means the connection lacks that permission or the URL limits the toolset; check_auth shows the effective permissions.
Discoverability
1 pass · 1 partial1 passed · 1 partial25/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
The MCP Server Card declares this server's exact endpoint.
Align the title with the capability actually described by this tool.
Description95/100
Show the current credential's user ID, effective permissions, and bound workspace. Use userId to recognize your own writes and assignments. Does not return credentials.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "check_auth",
"title": "Check connection",
"description": "Show the current credential's user ID, effective permissions, and bound workspace. Use userId to recognize your own writes and assignments. Does not return credentials.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
List the projects you can open: id, name, slug, color, visibility. Active only unless archived is include or only. Filter by visibility, prefix or q, sort with sort and order, and add include for counts or links. Use the id as projectId elsewhere; to find one by keyword use search.
Describe the returned information so the agent knows whether it will answer the request.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Explain the meaning of this value, not just its name.
archived
Default exclude.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
visibility
Only public or only private projects.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
q
Matches the name, slug, or description.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
prefix
Task identifier prefix such as PRO.
Clear enough to supply this argument.
sort
createdAt and updatedAt page the whole workspace; name works up to 1,000 projects. Not available with updatedSince.
Clear enough to supply this argument.
order
Default asc.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include
Add post and storage counts or links to each project.
Clear enough to supply this argument.
updatedSince
Epoch milliseconds or an ISO 8601 time. Returns projects changed after it, oldest change first. To poll, start 5s before the newest updatedAt and skip repeats.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Get one project by ID or slug: name, slug, description, color, visibility, archived. Add include for post and storage counts (stats), what you can do in it (permissions), or its links.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
Project ID or slug.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
include
Add counts, your permissions, or links to the project.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response_format
Default concise. detailed: all fields, full text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
List posts newest first, 50 per page, without content. Published by default; set status draft for drafts. projectId takes an ID or slug. Filter by author, tag, created or published dates, release details, source, or text. Sort by createdAt, updatedAt, or lastPublishedAt and set order; with updatedSince the oldest change comes first. Pass nextCursor as cursor until hasMore is false, even if posts is empty, and keep the other arguments unchanged. Use get_post for content.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
Only this project's posts.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
status
Default published.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
authorId
Only posts by this user: a user ID, or "me".
Clear enough to supply this argument.
tagId
Only posts with this tag. Not with updatedSince or includeDeleted.
Clear enough to supply this argument.
q
Match words in the title or text. Not with updatedSince or includeDeleted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sort
Default createdAt; updatedAt with updatedSince or includeDeleted.
Clear enough to supply this argument.
order
Default desc, or asc with updatedSince.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAfter
Posts created after this time. Epoch milliseconds or an ISO 8601 time with a timezone.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdBefore
Posts created before this time. Epoch milliseconds or an ISO 8601 time with a timezone.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
publishedAfter
Posts first published after this time. Epoch milliseconds or an ISO 8601 time with a timezone.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
publishedBefore
Posts first published before this time. Epoch milliseconds or an ISO 8601 time with a timezone.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
updatedSince
Posts changed after this time, oldest change first. To poll, start 5s before the newest updatedAt and skip repeats. Epoch milliseconds or an ISO 8601 time with a timezone.
Clear enough to supply this argument.
includeDeleted
Include deleted posts, which carry deletedAt.
Clear enough to supply this argument.
hasRelease
true: posts with release details. false: the rest.
Clear enough to supply this argument.
releaseType
Only this release type.
Clear enough to supply this argument.
createdVia
Only posts created from this source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include
Extra parts to return with each post.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size. Default 50.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response_format
Default concise. detailed: all fields, full text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "list_posts",
"title": "List posts",
"description": "List posts newest first, 50 per page, without content. Published by default; set status draft for drafts. projectId takes an ID or slug. Filter by author, tag, created or published dates, release details, source, or text. Sort by createdAt, updatedAt, or lastPublishedAt and set order; with updatedSince the oldest change comes first. Pass nextCursor as cursor until hasMore is false, even if posts is empty, and keep the other arguments unchanged. Use get_post for content.",
"inputSchema": {
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Match words in the title or text. Not with updatedSince or includeDeleted.",
"x-project-feed-text-limit": {
"maxLength": 200,
"minLength": 1,
"lengthUnit": "utf16"
}
},
"sort": {
"enum": [
"createdAt",
"updatedAt",
"lastPublishedAt"
],
"type": "string",
"description": "Default createdAt; updatedAt with updatedSince or includeDeleted."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size. Default 50."
},
"order": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Default desc, or asc with updatedSince."
},
"tagId": {
"type": "string",
"description": "Only posts with this tag. Not with updatedSince or includeDeleted."
},
"cursor": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Previous nextCursor."
},
"status": {
"enum": [
"draft",
"published"
],
"type": "string",
"description": "Default published."
},
"include": {
"type": "array",
"items": {
"enum": [
"tags",
"attachments",
"links",
"counts"
],
"type": "string"
},
"description": "Extra parts to return with each post.",
"uniqueItems": true
},
"authorId": {
"type": "string",
"description": "Only posts by this user: a user ID, or \"me\"."
},
"projectId": {
"type": "string",
"description": "Only this project's posts."
},
"createdVia": {
"enum": [
"web",
"api",
"slack_bot",
"discord_bot",
"github_app",
"ai_aggregation",
"inbound_webhook",
"mobile"
],
"type": "string",
"description": "Only posts created from this source."
},
"hasRelease": {
"type": "boolean",
"description": "true: posts with release details. false: the rest."
},
"releaseType": {
"enum": [
"release",
"beta",
"alpha"
],
"type": "string",
"description": "Only this release type."
},
"createdAfter": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Posts created after this time. Epoch milliseconds or an ISO 8601 time with a timezone."
},
"updatedSince": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Posts changed after this time, oldest change first. To poll, start 5s before the newest updatedAt and skip repeats. Epoch milliseconds or an ISO 8601 time with a timezone."
},
"createdBefore": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Posts created before this time. Epoch milliseconds or an ISO 8601 time with a timezone."
},
"includeDeleted": {
"type": "boolean",
"description": "Include deleted posts, which carry deletedAt."
},
"publishedAfter": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Posts first published after this time. Epoch milliseconds or an ISO 8601 time with a timezone."
},
"publishedBefore": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Posts first published before this time. Epoch milliseconds or an ISO 8601 time with a timezone."
},
"response_format": {
"enum": [
"concise",
"detailed"
],
"type": "string",
"description": "Default concise. detailed: all fields, full text."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"posts"
],
"properties": {
"posts": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "string"
},
"identifier": {
"type": [
"string",
"null"
]
},
"contentText": {
"type": "string"
}
}
}
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": [
"string",
"null"
]
}
}
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Get one post by ID, post number, or identifier such as UD-42: title, content, status, release, author, project, attached web links. include adds tags, attachments, providerFiles, counts, viewer (following and bookmarked), or shareLinks. Next: list_post_comments, list_post_versions.
The description explains the capability, when to use it, and what to expect.
Inputs58/100
Explain the meaning of this value, not just its name.
postId
Post ID.
Explain the meaning of this value, not just its name.
include
Extra parts to return.
Explain the meaning of this value, not just its name.
response_format
Default concise. detailed: all fields, full text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
List public share links. With postId, lists that post's links that are not revoked. Without it, lists every link in the workspace, for owners and admins only, and status narrows that list. Links never include the token or URL; create_share_link returns those once. Pass nextCursor back as cursor.
Describe the returned information so the agent knows whether it will answer the request.
Inputs63/100
Explain the meaning of this value, not just its name.
postId
Only this post's links.
Explain the meaning of this value, not just its name.
status
Only links in this state. Workspace list only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_share_links",
"title": "List share links",
"description": "List public share links. With postId, lists that post's links that are not revoked. Without it, lists every link in the workspace, for owners and admins only, and status narrows that list. Links never include the token or URL; create_share_link returns those once. Pass nextCursor back as cursor.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size."
},
"cursor": {
"type": "string",
"description": "Previous nextCursor."
},
"postId": {
"type": "string",
"description": "Only this post's links."
},
"status": {
"enum": [
"active",
"expired",
"revoked"
],
"type": "string",
"description": "Only links in this state. Workspace list only."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
List what happened to a post, newest first: publishing, new versions, title and project changes, tag changes, deletion and restore. Comments are not included; use list_post_comments. Pass nextCursor back as cursor.
Describe the returned information so the agent knows whether it will answer the request.
Inputs58/100
Explain the meaning of this value, not just its name.
postId
Post ID.
Explain the meaning of this value, not just its name.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
List the posts you bookmarked in this workspace, newest bookmark first. Posts you can no longer open are left out, so a page can hold fewer than limit; keep following nextCursor while hasMore is true.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Explain the meaning of this value, not just its name.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_bookmarks",
"title": "List bookmarks",
"description": "List the posts you bookmarked in this workspace, newest bookmark first. Posts you can no longer open are left out, so a page can hold fewer than limit; keep following nextCursor while hasMore is true.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size."
},
"cursor": {
"type": "string",
"description": "Previous nextCursor."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
List comments and media annotations on a post, oldest first unless order is desc, up to 100 per page: comments, hasMore, nextCursor (pass nextCursor as cursor). annotation is null for plain comments and replies. An annotation pins feedback to one media item (attachmentId): x and y are percent of its width and height, timeMs and endTimeMs milliseconds, frame 0-based, page and lines 1-based, camera the 3D view, drawing the marks. reviewStatus is comment, needs_changes, approved, question or suggestion; resolved says whether it is addressed. Filter with attachmentId (one media item and its replies), status (open or resolved annotations), reviewStatus (an annotation's review status), annotated (true: annotations only, false: the rest), parentId (replies to one comment), authorId (a user ID or me), createdVia, or since (comments created after that time). include=attachments adds each comment's files.
Resolve contradictions between the description, input schema, and annotations.
Inputs84/100
Explain the meaning of this value, not just its name.
postId
Post ID.
Explain the meaning of this value, not just its name.
attachmentId
Only this media item and its replies.
Clear enough to supply this argument.
parentId
Only replies to this comment.
Clear enough to supply this argument.
status
Only annotations in this state.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reviewStatus
Only annotations with this review status.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
annotated
true: annotations only. false: the rest.
Clear enough to supply this argument.
authorId
Only comments by this user: a user ID, or "me".
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
createdVia
Only comments created from this source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Comments created after this time. Epoch milliseconds or an ISO 8601 time with a timezone.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
order
Default asc.
Clear enough to supply this argument.
include
attachments adds each comment's files.
Clear enough to supply this argument.
limit
Maximum comments per page (1-100).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Shorten the title to an action and subject; move usage details into the description.
Description90/100
List comments and media annotations across every post you can read, newest first (oldest first when since is set, or order is asc). Use it to find open review feedback without visiting each post: filter with projectId, reviewStatus, status (open or resolved annotations), annotated, authorId (a user ID or me), createdVia, or since. Each comment carries its post. A page can hold fewer comments than limit when filters skip some, so keep following nextCursor while hasMore is true. An annotation pins feedback to one media item (attachmentId): x and y are percent of its width and height, timeMs and endTimeMs milliseconds, frame 0-based, page and lines 1-based, camera the 3D view, drawing the marks. reviewStatus is comment, needs_changes, approved, question or suggestion; resolved says whether it is addressed.
The description explains the capability, when to use it, and what to expect.
Inputs73/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
A project ID or slug.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Only annotations in this state.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reviewStatus
Only annotations with this review status.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
annotated
true: annotations only. false: the rest.
Clear enough to supply this argument.
authorId
A user ID, or "me".
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
createdVia
Only comments created from this source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Comments created after this time. Epoch milliseconds or an ISO 8601 time with a timezone.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
order
Default desc, or asc with since.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include
attachments adds each comment's files.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_comments",
"title": "List comments across the workspace",
"description": "List comments and media annotations across every post you can read, newest first (oldest first when since is set, or order is asc). Use it to find open review feedback without visiting each post: filter with projectId, reviewStatus, status (open or resolved annotations), annotated, authorId (a user ID or me), createdVia, or since. Each comment carries its post. A page can hold fewer comments than limit when filters skip some, so keep following nextCursor while hasMore is true. An annotation pins feedback to one media item (attachmentId): x and y are percent of its width and height, timeMs and endTimeMs milliseconds, frame 0-based, page and lines 1-based, camera the 3D view, drawing the marks. reviewStatus is comment, needs_changes, approved, question or suggestion; resolved says whether it is addressed.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size."
},
"order": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Default desc, or asc with since."
},
"since": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Comments created after this time. Epoch milliseconds or an ISO 8601 time with a timezone."
},
"cursor": {
"type": "string",
"description": "Previous nextCursor."
},
"status": {
"enum": [
"open",
"resolved"
],
"type": "string",
"description": "Only annotations in this state."
},
"include": {
"type": "array",
"items": {
"enum": [
"attachments"
],
"type": "string"
},
"description": "attachments adds each comment's files.",
"uniqueItems": true
},
"authorId": {
"type": "string",
"description": "A user ID, or \"me\"."
},
"annotated": {
"type": "boolean",
"description": "true: annotations only. false: the rest."
},
"projectId": {
"type": "string",
"description": "A project ID or slug."
},
"createdVia": {
"enum": [
"web",
"api",
"slack_bot",
"discord_bot",
"ai_aggregation",
"inbound_webhook",
"mobile"
],
"type": "string",
"description": "Only comments created from this source."
},
"reviewStatus": {
"enum": [
"comment",
"needs_changes",
"approved",
"question",
"suggestion"
],
"type": "string",
"description": "Only annotations with this review status."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Wait for new comments or annotations on a post and return them as soon as they exist, oldest first, in the list_post_comments shape. Use it in an agent loop instead of polling list_post_comments: handle the comments, then call it again with the returned since. With no since it waits for comments created after the call starts. On timeout it returns an empty list and the since to reuse. Holds the request open for timeoutSeconds (default 25, max 50). Filter with attachmentId or annotated like list_post_comments.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
postId
Post ID.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
attachmentId
Only comments on this media item.
Clear enough to supply this argument.
annotated
true: annotations only. false: the rest.
Clear enough to supply this argument.
since
since from the last call, or an ISO time.
Clear enough to supply this argument.
timeoutSeconds
Seconds to wait, 0 to 50. Default 25.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response_format
Default concise. detailed: all fields, full text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "wait_for_comments",
"title": "Wait for post comments",
"description": "Wait for new comments or annotations on a post and return them as soon as they exist, oldest first, in the list_post_comments shape. Use it in an agent loop instead of polling list_post_comments: handle the comments, then call it again with the returned since. With no since it waits for comments created after the call starts. On timeout it returns an empty list and the since to reuse. Holds the request open for timeoutSeconds (default 25, max 50). Filter with attachmentId or annotated like list_post_comments.",
"inputSchema": {
"type": "object",
"required": [
"postId"
],
"properties": {
"since": {
"type": "string",
"description": "since from the last call, or an ISO time."
},
"postId": {
"type": "string",
"description": "Post ID."
},
"annotated": {
"type": "boolean",
"description": "true: annotations only. false: the rest."
},
"attachmentId": {
"type": "string",
"description": "Only comments on this media item."
},
"timeoutSeconds": {
"type": "integer",
"maximum": 50,
"minimum": 0,
"description": "Seconds to wait, 0 to 50. Default 25."
},
"response_format": {
"enum": [
"concise",
"detailed"
],
"type": "string",
"description": "Default concise. detailed: all fields, full text."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"comments",
"since"
],
"properties": {
"since": {
"type": "string"
},
"comments": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"postId"
],
"properties": {
"id": {
"type": "string"
},
"postId": {
"type": "string"
},
"parentId": {
"type": [
"string",
"null"
]
},
"contentText": {
"type": "string"
}
}
}
}
}
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
Get one post comment or annotation by ID with its author, review status, reply count and linked task. An annotation pins feedback to one media item (attachmentId): x and y are percent of its width and height, timeMs and endTimeMs milliseconds, frame 0-based, page and lines 1-based, camera the 3D view, drawing the marks. reviewStatus is comment, needs_changes, approved, question or suggestion; resolved says whether it is addressed.
Resolve contradictions between the description, input schema, and annotations.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
commentId
Comment or annotation ID.
Clear enough to supply this argument.
postId
Post ID; defaults to the comment's post.
Clear enough to supply this argument.
response_format
Default concise. detailed: all fields, full text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
List reactions on a post with counts, whether you reacted, and how many came from client portal guests. truncated is true when the result is partial: more guest reactions than one call counts, reactors left unnamed, or custom reactions left without their image. includeUsers adds who reacted, up to 50 per reaction; guests appear by name only to workspace admins. Use toggle_post_reaction to add or remove yours.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Explain the meaning of this value, not just its name.
postId
Post ID.
Explain the meaning of this value, not just its name.
includeUsers
Add who reacted, up to 50 per reaction.
Explain what happens when this optional value is omitted.
{
"name": "list_post_reactions",
"title": "List post reactions",
"description": "List reactions on a post with counts, whether you reacted, and how many came from client portal guests. truncated is true when the result is partial: more guest reactions than one call counts, reactors left unnamed, or custom reactions left without their image. includeUsers adds who reacted, up to 50 per reaction; guests appear by name only to workspace admins. Use toggle_post_reaction to add or remove yours.",
"inputSchema": {
"type": "object",
"required": [
"postId"
],
"properties": {
"postId": {
"type": "string",
"description": "Post ID."
},
"includeUsers": {
"type": "boolean",
"description": "Add who reacted, up to 50 per reaction."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"reactions"
],
"properties": {
"total": {
"type": "integer"
},
"reactions": {
"type": "array",
"items": {
"type": "object",
"required": [
"emoji"
],
"properties": {
"count": {
"type": "integer"
},
"emoji": {
"type": "string"
}
}
}
}
}
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
List tasks, newest first, with filters. Times (dueBefore, dueAfter, startAfter, updatedSince) are epoch ms or ISO 8601; due filters leave out tasks without a due date. To poll for changes, pass assigneeId "me" and updatedSince set to the newest updatedAt you have seen minus 5 seconds, skip repeats, then follow nextCursor until it is null. A custom sort, tagIds, q, and ids read a window of up to 500 tasks; truncated marks a longer result. Subtasks are left out unless includeSubtasks or parentTaskId is set. Rows leave out descriptions unless response_format is detailed; get_task returns one task's description.
The description explains the capability, when to use it, and what to expect.
Inputs57/100
18 of 26 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
projectId
Not provided
Missing description. Explain what this value means and how to supply it.
status
Comma-separated statuses.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
priority
Comma-separated priorities.
Clear enough to supply this argument.
assigneeId
A user ID, or "me" for the caller. Matches tasks where that user is any of the assignees. Without updatedSince, the most recently updated come first.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creatorId
User ID or "me".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tagIds
Any of these tags.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
q
Title words.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dueBefore
Not provided
Missing description. Explain what this value means and how to supply it.
dueAfter
Not provided
Missing description. Explain what this value means and how to supply it.
startAfter
Not provided
Missing description. Explain what this value means and how to supply it.
parentTaskId
Its subtasks. ID or PRO-42 identifier.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
includeSubtasks
Not provided
Missing description. Explain what this value means and how to supply it.
deleted
List deleted tasks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
externalSource
Provider, such as github.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
externalId
ID at the provider. Needs externalSource.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sort
Not provided
Missing description. Explain what this value means and how to supply it.
order
Default desc for created and updated.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include
Embed up to 20 rows per task; 25 tasks per page.
Clear enough to supply this argument.
viewId
Saved view; your filters win.
Clear enough to supply this argument.
ids
IDs or identifiers; unreadable ones come back in missing.
Clear enough to supply this argument.
updatedSince
Epoch milliseconds or an ISO 8601 time. Returns tasks updated after it, oldest update first. New comments do not change a task's updatedAt. To poll, start 5s before the newest updatedAt and skip repeats.
Clear enough to supply this argument.
includeRemoved
With assigneeId and updatedSince: also return removed tasks (unassigned or trashed): id, updatedAt, deletedAt.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
cursor
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Prefer cursor; not with it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response_format
Default concise. detailed: all fields, full text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List the tasks linked to a post, newest link first, as full task rows with linkId and linkedAt. postId accepts an ID, number, or identifier. Tasks in projects you cannot open are left out, so a page can be short while hasMore is true. Needs posts:read and tasks:read.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
postId
Post ID or number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Explain the meaning of this value, not just its name.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_post_tasks",
"title": "List tasks linked to a post",
"description": "List the tasks linked to a post, newest link first, as full task rows with linkId and linkedAt. postId accepts an ID, number, or identifier. Tasks in projects you cannot open are left out, so a page can be short while hasMore is true. Needs posts:read and tasks:read.",
"inputSchema": {
"type": "object",
"required": [
"postId"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size."
},
"cursor": {
"type": "string",
"description": "Previous nextCursor."
},
"postId": {
"type": "string",
"description": "Post ID or number."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
Check whether a GitHub or Jira issue can be created from a task. A provider is available when the task's project has a repository or Jira project set up for two-way sync, the task is not already linked to an external issue, and you can edit it. taskId accepts an ID, number, or identifier such as PRO-42.
Describe the returned information so the agent knows whether it will answer the request.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_external_issue_options",
"title": "Get external issue options",
"description": "Check whether a GitHub or Jira issue can be created from a task. A provider is available when the task's project has a repository or Jira project set up for two-way sync, the task is not already linked to an external issue, and you can edit it. taskId accepts an ID, number, or identifier such as PRO-42.",
"inputSchema": {
"type": "object",
"required": [
"taskId"
],
"properties": {
"taskId": {
"type": "string",
"description": "Task ID or PRO-42 identifier."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Count the open tasks assigned to the caller in this workspace. Pass projectId to add that project's attention summary: your open and overdue tasks there, the next due task, and unread mentions. assigneeId accepts only me or your own user ID.
Describe the returned information so the agent knows whether it will answer the request.
Inputs63/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assigneeId
Only "me" or your own ID.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
Add this project's summary.
Explain the meaning of this value, not just its name.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_my_task_counts",
"title": "Get my task counts",
"description": "Count the open tasks assigned to the caller in this workspace. Pass projectId to add that project's attention summary: your open and overdue tasks there, the next due task, and unread mentions. assigneeId accepts only me or your own user ID.",
"inputSchema": {
"type": "object",
"properties": {
"projectId": {
"type": "string",
"description": "Add this project's summary."
},
"assigneeId": {
"type": "string",
"description": "Only \"me\" or your own ID."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Get one task by ID or identifier like PRO-42: title, description text, status, priority, dates, assignees, tags, project, subtask and checklist counts. Pass include to embed up to 20 subtasks or checklist items.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
taskId
Task ID or PRO-42 identifier.
Clear enough to supply this argument.
include
Embed up to 20 subtasks or checklist items.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response_format
Default concise. detailed: all fields, full text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
List comments for a task, newest first unless order says otherwise. Each comment carries reactionCount and its attachments. Pass nextCursor as cursor for bounded subsequent pages; total remains exact. To poll, pass the largest createdAt you have seen as since to get only newer comments, oldest first.
The description explains the capability, when to use it, and what to expect.
Inputs25/100
2 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
taskId
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
cursor
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Not provided
Missing description. Explain what this value means and how to supply it.
since
Epoch milliseconds or an ISO 8601 time. Returns comments created after it, oldest first, and cannot be combined with offset. total still counts every comment on the task.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
order
Default desc, or asc when since is set. Changing it restarts paging.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_task_comments",
"title": "List task comments",
"description": "List comments for a task, newest first unless order says otherwise. Each comment carries reactionCount and its attachments. Pass nextCursor as cursor for bounded subsequent pages; total remains exact. To poll, pass the largest createdAt you have seen as since to get only newer comments, oldest first.",
"inputSchema": {
"type": "object",
"required": [
"taskId"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"order": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Default desc, or asc when since is set. Changing it restarts paging."
},
"since": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Epoch milliseconds or an ISO 8601 time. Returns comments created after it, oldest first, and cannot be combined with offset. total still counts every comment on the task."
},
"cursor": {
"type": "string"
},
"offset": {
"type": "integer",
"maximum": 10000,
"minimum": 0
},
"taskId": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
List what changed on a task, newest first: status, priority, assignee, date, title, tag, checklist, subtask, link, attachment, time and timer events. taskId accepts an ID, number, or identifier such as PRO-42. Filter with types. Concise rows carry the type, actor name, old and new value, and time; detailed adds actor and project details. Comments are listed by list_task_comments.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
taskId
Task ID or PRO-42 identifier.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
types
Only these event types.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response_format
Default concise. detailed: all fields, full text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
List a parent task's subtasks, one page at a time. Accepts a task ID or identifier like PRO-42. Rows leave out descriptions unless response_format is detailed.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
taskId
Task ID or PRO-42 identifier.
Clear enough to supply this argument.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
List workspace tags and the project tags you can see. Pass projectId for the tags usable in one project, q to find tags by name, scope for workspace or project tags only, and sort=usage to put the most used first. Sorting by name or usage reads a window of up to 500 tags; truncated marks a longer list. Needs tags:read, tasks:read, or posts:read.
Describe the returned information so the agent knows whether it will answer the request.
Inputs61/100
Explain the meaning of this value, not just its name.
projectId
Project tags plus workspace tags.
Explain the meaning of this value, not just its name.
q
Find by name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
scope
Only workspace or project tags.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sort
Sort key.
Explain the meaning of this value, not just its name.
order
Direction.
Explain the meaning of this value, not just its name.
limit
Page size. Default 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Check this authenticated tool's personal connection without registering or enabling it. Returns readiness, setup reasons, the connection's status and accessible intake projects, and advisory request budgets. Budget reads consume no request tokens. Readiness does not authorize a later request or claim. Requires task read access. Missing write access or workspace policy can make tool access unavailable.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_tool_connection",
"title": "Get tool connection",
"description": "Check this authenticated tool's personal connection without registering or enabling it. Returns readiness, setup reasons, the connection's status and accessible intake projects, and advisory request budgets. Budget reads consume no request tokens. Readiness does not authorize a later request or claim. Requires task read access. Missing write access or workspace policy can make tool access unavailable.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description70/100
Search words, meaning or identifiers. Hybrid ranking is the default with keyword fallback; mode=keyword uses words only. Default types: project, post, task, doc, canvas, discussion and media. Each type needs its read scope; comments, annotations and files also need their source's read scope. Published posts only. authorId accepts a user ID or me and excludes records without an author. 20 per page.
Resolve contradictions between the description, input schema, and annotations.
Inputs61/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
mode
Default hybrid ranks keywords and meaning. keyword skips meaning retrieval.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Search text, 2 to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
types
Any of: project, post, task, doc, canvas, discussion, comment, annotation, media, user, tag.
Resolve the mismatch between this description and its schema constraints.
projectId
Only this project.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
authorId
Only matches by this user: a user ID, or "me".
Clear enough to supply this argument.
limit
Page size. Default 20.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Previous nextCursor.
Explain the meaning of this value, not just its name.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "revoke_current_token",
"title": "Revoke the current API token",
"description": "Revoke the API key or personal token this connection uses. Later calls with it fail. Not available to OAuth connections.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search workspaceSearch words, meaning or identifiers.
02Get projectGet one project by ID or slug: name, slug, description, color, visibility, archived.
03Get taskGet one task by ID or identifier like PRO-42: title, description text, status, priority, dates, assignees, tags, project, subtask and checklist counts.
04List projectsList the projects you can open: id, name, slug, color, visibility.
05List tasks, newest first, with filters
Want to run these tasks against your MCP server with us?
project-feed setup, tools, quality score, publishing readiness, and alternatives.
How do I add project-feed to Claude, ChatGPT, or Cursor?
Add project-feed to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://projectfeed.app/api/mcp.
Is project-feed MCP ready for ChatGPT and Claude?
As of November 11, 2026, project-feed scores 100/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is project-feed's MCP tool documentation?
As of November 11, 2026, project-feed scores 77/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 47 of 47 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to project-feed?
As of November 12, 2026, alternatives to project-feed in productivity on the Manufact MCP leaderboard include AdaptlyPost, Notion MCP, Paperpal, VantagePeers, and Date Calculator.
How can project-feed improve its MCP documentation?
list_doc_comment_reactions is the lowest-scoring reviewed tool at 65/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.