Groove MCP by usefulapi
Read Groove shared-inbox conversations, contacts, agents and tags; close, assign, snooze and tag.
Should I use this
Quality & Safety
Findings (3)
- LOWin groove_snooze_conversation
- LOWin groove_star_conversation
- LOWin groove_assign_conversation
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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": {
"groove-hq": {
"url": "https://groove-hq.usefulapi.io/mcp"
}
}
}Remote endpoints
https://groove-hq.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (16)
🟢groove_list_conversations(state, channel_id, folder_id, tag_name, assigned, ...)
List support conversations (tickets) in the shared inbox, with rich filters. Filter by state, channel_id, folder_id, tag_name, assigned, starred, or keywords; paginate with first/after. Groove GraphQL: conversations(filter: ConversationFilter).
Input Schema
{
"type": "object",
"properties": {
"state": {
"description": "Filter by conversation state.",
"type": "string",
"enum": [
"unread",
"opened",
"closed",
"snoozed",
"spam"
]
},
"channel_id": {
"description": "Filter to a single channel (mailbox) id.",
"type": "string"
},
"folder_id": {
"description": "Filter to a single folder id.",
"type": "string"
},
"tag_name": {
"description": "Filter to conversations carrying this tag name.",
"type": "string"
},
"assigned": {
"description": "If set, filter to assigned (true) or unassigned (false) conversations.",
"type": "boolean"
},
"starred": {
"description": "If set, filter to starred (true) or unstarred (false) conversations.",
"type": "boolean"
},
"keywords": {
"description": "Full-text keyword search across conversations.",
"type": "string"
},
"first": {
"description": "How many records to return (Relay pagination `first`).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"after": {
"description": "Relay pagination cursor — pass the previous page's `endCursor` to get the next page.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢groove_get_conversation(id)
Get a single conversation by id — subject, state, assignment, contact, channel, counts, and tags. Groove GraphQL: conversation(id: ID!).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The Groove object id (opaque GraphQL ID, passed as a string)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢groove_list_contacts(keywords, first, after)
List customer contacts (people who wrote in). Optional keyword search over name/email; paginate with first/after. Groove GraphQL: contacts(keywords: String).
Input Schema
{
"type": "object",
"properties": {
"keywords": {
"description": "Keyword search across contacts (name/email).",
"type": "string"
},
"first": {
"description": "How many records to return (Relay pagination `first`).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"after": {
"description": "Relay pagination cursor — pass the previous page's `endCursor` to get the next page.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢groove_get_contact(id)
Get a single contact by id — name, email, role, type, and conversation count. Groove GraphQL: contact(contactId: ID!).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The Groove object id (opaque GraphQL ID, passed as a string)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢groove_list_agents(first, after)
List agents (support staff / users) in the account, with role and state. Paginate with first/after. Groove GraphQL: agents.
Input Schema
{
"type": "object",
"properties": {
"first": {
"description": "How many records to return (Relay pagination `first`).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"after": {
"description": "Relay pagination cursor — pass the previous page's `endCursor` to get the next page.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢groove_list_channels(first, after)
List channels (mailboxes / inboxes — email, chat, etc.) configured in the account. Paginate with first/after. Groove GraphQL: channels.
Input Schema
{
"type": "object",
"properties": {
"first": {
"description": "How many records to return (Relay pagination `first`).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"after": {
"description": "Relay pagination cursor — pass the previous page's `endCursor` to get the next page.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢groove_list_tags(first, after)
List tags defined in the account (id, name, color) — use tag ids with the tag/untag write tools. Paginate with first/after. Groove GraphQL: tags.
Input Schema
{
"type": "object",
"properties": {
"first": {
"description": "How many records to return (Relay pagination `first`).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"after": {
"description": "Relay pagination cursor — pass the previous page's `endCursor` to get the next page.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢groove_list_folders(first, after)
List folders (saved views / smart folders that group conversations), with conversation counts. Paginate with first/after. Groove GraphQL: folders.
Input Schema
{
"type": "object",
"properties": {
"first": {
"description": "How many records to return (Relay pagination `first`).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"after": {
"description": "Relay pagination cursor — pass the previous page's `endCursor` to get the next page.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢groove_list_teams(first, after)
List teams (groups of agents that conversations can be assigned to). Paginate with first/after. Groove GraphQL: teams.
Input Schema
{
"type": "object",
"properties": {
"first": {
"description": "How many records to return (Relay pagination `first`).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"after": {
"description": "Relay pagination cursor — pass the previous page's `endCursor` to get the next page.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴groove_close_conversation(id)
CLOSES a conversation (marks it resolved) in the shared inbox. Groove GraphQL: conversationClose.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The conversation id (opaque GraphQL ID)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴groove_open_conversation(id)
RE-OPENS a closed/snoozed conversation in the shared inbox. Groove GraphQL: conversationOpen.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The conversation id (opaque GraphQL ID)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴groove_snooze_conversation(id, until)
SNOOZES a conversation until the given time (ISO8601) — it drops out of the inbox until then. Groove GraphQL: conversationSnooze.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The conversation id (opaque GraphQL ID)."
},
"until": {
"type": "string",
"description": "When to un-snooze, as an ISO8601 timestamp (e.g. 2026-08-01T09:00:00Z)."
}
},
"required": [
"id",
"until"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴groove_star_conversation(id)
STARS a conversation (flags it for attention) in the shared inbox. Groove GraphQL: conversationStar.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The conversation id (opaque GraphQL ID)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴groove_assign_conversation(id, agent_id, team_id)
ASSIGNS a conversation to an agent and/or team. Pass agent_id, team_id, or both (at least one is required). Groove GraphQL: conversationAssign.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The conversation id (opaque GraphQL ID)."
},
"agent_id": {
"description": "Agent id to assign the conversation to.",
"type": "string"
},
"team_id": {
"description": "Team id to assign the conversation to.",
"type": "string"
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴groove_tag_conversation(id, tag_ids)
ADDS tags (by tag id) to a conversation. Use groove_list_tags to find tag ids. Groove GraphQL: conversationTag.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The conversation id (opaque GraphQL ID)."
},
"tag_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tag ids to add to the conversation."
}
},
"required": [
"id",
"tag_ids"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴groove_untag_conversation(id, tag_ids)
REMOVES tags (by tag id) from a conversation. Use groove_list_tags to find tag ids. Groove GraphQL: conversationUntag.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The conversation id (opaque GraphQL ID)."
},
"tag_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tag ids to remove from the conversation."
}
},
"required": [
"id",
"tag_ids"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence