parabol

Start Parabol retrospectives, standups and sprint poker; read teams/meetings/tasks; create tasks.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
92%
Naming quality
97%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,819Tokens (tool definitions)
~1.2 KBTypical response size
Significant attention impact (2.98% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "parabol": {
      "url": "https://parabol.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://parabol.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (21)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢get_viewer

Fetch the authenticated Parabol user (the token owner): id, preferredName, email, tier, and the team ids (tms) they belong to. Parabol GraphQL: query { viewer { ... } }. Requires the USERS_READ scope. Start here to discover your identity and team ids.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_teams(includeArchived)

List the teams the viewer belongs to, with each team's id, name, orgId, tier, and team lead. Parabol GraphQL: viewer.teams. Requires the TEAMS_READ scope.

Input Schema

{
  "type": "object",
  "properties": {
    "includeArchived": {
      "description": "Include archived teams (default false).",
      "type": "boolean"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_team(teamId)

Fetch one team by id: metadata, its team members (with each member's user), active meetings, and organization. Parabol GraphQL: viewer.team(teamId). Requires TEAMS_READ (+ MEETINGS_READ for activeMeetings, ORGS_READ for organization).

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "type": "string",
      "description": "The team id."
    }
  },
  "required": [
    "teamId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_team_members(teamId, sortBy)

List the members of a team, each with role flags (isLead, isOrgAdmin) and the underlying user (preferredName, email). Parabol GraphQL: viewer.team(teamId).teamMembers. Requires TEAMS_READ.

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "type": "string",
      "description": "The team id."
    },
    "sortBy": {
      "description": "Optional field to sort members by (e.g. 'preferredName').",
      "type": "string"
    }
  },
  "required": [
    "teamId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_organizations

List the organizations the viewer belongs to: id, name, tier, billingTier. Parabol GraphQL: viewer.organizations. Requires ORGS_READ.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_organization(orgId)

Fetch one organization by id, including its teams. Parabol GraphQL: viewer.organization(orgId). Requires ORGS_READ (+ TEAMS_READ for teams).

Input Schema

{
  "type": "object",
  "properties": {
    "orgId": {
      "type": "string",
      "description": "The organization id."
    }
  },
  "required": [
    "orgId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_organization_users(orgId, first, after)

List the users in an organization (Relay connection): each org-user's role, joinedAt, tier, and underlying user (preferredName, email). Paginate with `first` + `after` (pass the last edge's `cursor`). Parabol GraphQL: viewer.organization(orgId).organizationUsers. Requires ORGS_READ + USERS_READ.

Input Schema

{
  "type": "object",
  "properties": {
    "orgId": {
      "type": "string",
      "description": "The organization id."
    },
    "first": {
      "description": "Max org-users to return (page size).",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "after": {
      "description": "Cursor for the next page (the `cursor` of the last edge from a prior call).",
      "type": "string"
    }
  },
  "required": [
    "orgId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_meetings(teamIds, meetingTypes, first, after, before)

List past/ongoing meetings for one or more teams (Relay connection), newest first. `teamIds` is required. `meetingTypes` defaults to all four (retrospective, action, poker, teamPrompt). `before` bounds the window (defaults to now); paginate older with `after`. Parabol GraphQL: viewer.meetings. Requires MEETINGS_READ.

Input Schema

{
  "type": "object",
  "properties": {
    "teamIds": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Team ids to fetch meetings for (required)."
    },
    "meetingTypes": {
      "description": "Meeting types to include (MeetingTypeEnum). Defaults to all four.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "retrospective",
          "action",
          "poker",
          "teamPrompt"
        ]
      }
    },
    "first": {
      "description": "Max meetings to return (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "after": {
      "description": "DateTime cursor — return meetings before this ISO timestamp (older page).",
      "type": "string"
    },
    "before": {
      "description": "DateTime upper bound (ISO). Defaults to now.",
      "type": "string"
    }
  },
  "required": [
    "teamIds"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_meeting(meetingId)

Fetch one meeting by id with its phases and stages. For a retrospective it also returns the reflection groups and reflections plus vote/topic/task/comment counts. Uses __typename so you can tell meeting types apart. Parabol GraphQL: viewer.meeting(meetingId). Requires MEETINGS_READ.

Input Schema

{
  "type": "object",
  "properties": {
    "meetingId": {
      "type": "string",
      "description": "The meeting id."
    }
  },
  "required": [
    "meetingId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_active_meetings(teamId)

List a team's currently-active (in-progress) meetings. Parabol GraphQL: viewer.team(teamId).activeMeetings. Requires TEAMS_READ + MEETINGS_READ.

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "type": "string",
      "description": "The team id."
    }
  },
  "required": [
    "teamId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_tasks(first, after, teamIds, userIds, statusFilters, ...)

List the viewer's tasks (Relay connection), optionally filtered by team, user, status, archived state, or a text query. Paginate with `first` + the `after` DateTime cursor. Parabol GraphQL: viewer.tasks. Requires TASKS_READ.

Input Schema

{
  "type": "object",
  "properties": {
    "first": {
      "description": "Max tasks to return (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "after": {
      "description": "DateTime cursor for the next (older) page (the last edge's cursor).",
      "type": "string"
    },
    "teamIds": {
      "description": "Filter to these team ids.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "userIds": {
      "description": "Filter to tasks assigned to these user ids.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "statusFilters": {
      "description": "Filter by task status (TaskStatusEnum: active, stuck, done, future).",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "active",
          "stuck",
          "done",
          "future"
        ]
      }
    },
    "archived": {
      "description": "Include archived tasks (default false).",
      "type": "boolean"
    },
    "includeUnassigned": {
      "description": "Include unassigned tasks (default false).",
      "type": "boolean"
    },
    "filterQuery": {
      "description": "Free-text filter on task content.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢parabol_query(query, variables)

Escape hatch: run an arbitrary Parabol GraphQL QUERY (read-only) against action.parabol.co/graphql with optional variables. Mutations are REJECTED — use the dedicated write tools or parabol_graphql for those. Useful for fields not covered by the curated read tools. Requires the matching read scope(s) on your token.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "A GraphQL query document (must be a query, not a mutation)."
    },
    "variables": {
      "description": "Variables object for the query.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "query"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴create_task(teamId, status, plaintextContent, content, userId, ...)

MUTATES Parabol data: create a task on a team. Required: teamId and status (active|stuck|done|future). Provide `plaintextContent` for the task text (and/or `content`, which is a stringified TipTap/ProseMirror JSON document). Optionally assign to a userId or link to a meetingId/discussionId. Parabol GraphQL: createTask(newTask, area). Requires TASKS_WRITE.

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "type": "string",
      "description": "The team id to create the task on (required)."
    },
    "status": {
      "description": "Task status (TaskStatusEnum). Defaults to 'active'.",
      "type": "string",
      "enum": [
        "active",
        "stuck",
        "done",
        "future"
      ]
    },
    "plaintextContent": {
      "description": "Plain-text task content.",
      "type": "string"
    },
    "content": {
      "description": "Rich-text content as a stringified TipTap/ProseMirror JSON document.",
      "type": "string"
    },
    "userId": {
      "description": "Assign the task to this user id.",
      "type": "string"
    },
    "meetingId": {
      "description": "Link the task to this meeting id.",
      "type": "string"
    },
    "discussionId": {
      "description": "Link the task to this discussion id (meeting thread).",
      "type": "string"
    },
    "sortOrder": {
      "description": "Sort order (Float).",
      "type": "number"
    },
    "area": {
      "description": "Optional AreaEnum context for the task (e.g. 'teamDash', 'meeting').",
      "type": "string"
    },
    "fields": {
      "description": "Additional documented GraphQL input fields to send verbatim in this mutation's input (merged OVER the typed fields above).",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "teamId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴update_task(id, content, status, userId, sortOrder, ...)

MUTATES Parabol data: update an existing task. Required: id. Optionally change content (stringified TipTap JSON), status, assignee (userId), or sortOrder. Only included fields change. Parabol GraphQL: updateTask(updatedTask, area). Requires TASKS_WRITE.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The task id (required)."
    },
    "content": {
      "description": "New rich-text content as a stringified TipTap/ProseMirror JSON document.",
      "type": "string"
    },
    "status": {
      "description": "New status (TaskStatusEnum).",
      "type": "string",
      "enum": [
        "active",
        "stuck",
        "done",
        "future"
      ]
    },
    "userId": {
      "description": "Reassign the task to this user id.",
      "type": "string"
    },
    "sortOrder": {
      "description": "New sort order (Float).",
      "type": "number"
    },
    "area": {
      "description": "Optional AreaEnum context.",
      "type": "string"
    },
    "fields": {
      "description": "Additional documented GraphQL input fields to send verbatim in this mutation's input (merged OVER the typed fields above).",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "id"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴create_reflection(meetingId, promptId, sortOrder, content, fields)

MUTATES Parabol data: add a reflection card to a running retrospective's reflect phase. Required: meetingId, promptId (the reflect-prompt/column), sortOrder (Float). `content` (optional) is a stringified TipTap/ProseMirror JSON document (<=2000 chars). Parabol GraphQL: createReflection(input). Requires MEETINGS_WRITE.

Input Schema

{
  "type": "object",
  "properties": {
    "meetingId": {
      "type": "string",
      "description": "The retrospective meeting id (required)."
    },
    "promptId": {
      "type": "string",
      "description": "The reflect-prompt (column) id (required)."
    },
    "sortOrder": {
      "description": "Sort order within the column (Float). Defaults to 0.",
      "type": "number"
    },
    "content": {
      "description": "Reflection text as a stringified TipTap/ProseMirror JSON document.",
      "type": "string"
    },
    "fields": {
      "description": "Additional documented GraphQL input fields to send verbatim in this mutation's input (merged OVER the typed fields above).",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "meetingId",
    "promptId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴add_comment(content, discussionId, threadSortOrder, isAnonymous, threadParentId, ...)

MUTATES Parabol data: add a comment to a meeting discussion thread. Required: content (stringified TipTap/ProseMirror JSON document), discussionId, threadSortOrder (Int). Optionally isAnonymous or threadParentId (to reply). Parabol GraphQL: addComment(comment) → union. Requires COMMENTS_WRITE.

Input Schema

{
  "type": "object",
  "properties": {
    "content": {
      "type": "string",
      "description": "Comment body as a stringified TipTap/ProseMirror JSON document (required)."
    },
    "discussionId": {
      "type": "string",
      "description": "The discussion (meeting thread) id (required)."
    },
    "threadSortOrder": {
      "description": "Position within the thread (Int). Defaults to 0.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "isAnonymous": {
      "description": "Post the comment anonymously.",
      "type": "boolean"
    },
    "threadParentId": {
      "description": "Parent comment id, to post a threaded reply.",
      "type": "string"
    },
    "fields": {
      "description": "Additional documented GraphQL input fields to send verbatim in this mutation's input (merged OVER the typed fields above).",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "content",
    "discussionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴start_retrospective(teamId, name)

MUTATES Parabol data: start a new retrospective meeting for a team (returns the new meetingId). Required: teamId. Optionally name it. Parabol GraphQL: startRetrospective → union. Requires MEETINGS_WRITE.

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "type": "string",
      "description": "The team id to run the retro for (required)."
    },
    "name": {
      "description": "Optional meeting name.",
      "type": "string"
    }
  },
  "required": [
    "teamId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴start_checkin(teamId, name)

MUTATES Parabol data: start a new Check-in (Action) meeting for a team (returns the new meetingId). Required: teamId. Optionally name it. Parabol GraphQL: startCheckIn → union. Requires MEETINGS_WRITE.

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "type": "string",
      "description": "The team id (required)."
    },
    "name": {
      "description": "Optional meeting name.",
      "type": "string"
    }
  },
  "required": [
    "teamId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴start_team_prompt(teamId, name)

MUTATES Parabol data: start a new async Standup (Team Prompt) meeting for a team. Required: teamId. Optionally name it (default 'Standup'). Parabol GraphQL: startTeamPrompt → union. Requires MEETINGS_WRITE.

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "type": "string",
      "description": "The team id (required)."
    },
    "name": {
      "description": "Optional meeting name (default 'Standup').",
      "type": "string"
    }
  },
  "required": [
    "teamId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴invite_to_team(teamId, invitees, meetingId)

MUTATES Parabol data: send team invitations by email. Required: teamId and invitees (an array of email addresses). Optionally scope to a meetingId. Parabol GraphQL: inviteToTeam(teamId, invitees). Requires TEAMS_WRITE.

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "type": "string",
      "description": "The team id to invite into (required)."
    },
    "invitees": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Email addresses to invite (required)."
    },
    "meetingId": {
      "description": "Optionally associate the invitation with a meeting id.",
      "type": "string"
    }
  },
  "required": [
    "teamId",
    "invitees"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴parabol_graphql(query, variables)

MUTATES Parabol data (potentially): escape hatch to run an arbitrary Parabol GraphQL operation — including any mutation — against action.parabol.co/graphql with optional variables. Use for operations not covered by the curated tools. Your token must carry the scope the operation requires. Prefer parabol_query for read-only calls.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "A GraphQL query or mutation document."
    },
    "variables": {
      "description": "Variables object for the operation.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "query"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Recommended Prompts

search_research
Search for information about [topic] using parabol
Expected tools: parabol_query
find_specific
Find [specific item] using parabol
Expected tools: parabol_query
retrieve_data
Get details about [item] from parabol
Expected tools: get_viewer
fetch_info
Fetch [information type] using parabol
Expected tools: get_viewer
list_items
List all [items] available in parabol
Expected tools: list_teams

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded21 tools
verifiedversion not recorded21 tools