Groove MCP by usefulapi

Read Groove shared-inbox conversations, contacts, agents and tags; close, assign, snooze and tag.

Should I use this

Quality & Safety

A
Description quality
86%
Schema completeness
96%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • LOWTool 'groove_snooze_conversation' description lacks action verbin groove_snooze_conversation
  • LOWTool 'groove_star_conversation' description lacks action verbin groove_star_conversation
  • LOWTool 'groove_assign_conversation' description lacks action verbin groove_assign_conversation

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,349Tokens (tool definitions)
~1.0 KBTypical response size
Moderate attention impact (1.84% 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": {
    "groove-hq": {
      "url": "https://groove-hq.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://groove-hq.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (16)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded16 tools
verifiedversion not recorded16 tools
verifiedversion not recorded16 tools
failed observationversion not recorded—
failed observationversion not recorded—