Skip to main content
Glama

Grok Bot MCP

Let Claude Code, Codex, Cursor — or any MCP client — drive the Grok Bot desktop app on your Mac.

List your Bots, read their chats, send them messages and answer their questions without leaving your coding agent. Every click happens live in the real app, right in front of you.

CI MCP server Claude Code plugin Codex Agent Skill macOS Zero dependencies License: MIT

Install · Try it · Tools · How it works · Troubleshooting · FAQ


Why

Grok Bot gives you Bots: AI teammates with names, jobs and their own cloud computers. Your coding agent lives in your terminal or editor. Grok Bot MCP connects the two.

  • Delegate. "Ask my Researcher bot to dig into this, then summarize what it finds."

  • Catch up. "What did my Bots get done today? One line each."

  • Unblock. Bots ask multiple-choice questions. Answer them from Claude Code or Codex.

  • Watch it work. Your agent drives the real Grok Bot app on your screen, so nothing happens out of sight.

No API keys. No cloud relay. No dependencies. It drives the app you already use.

Related MCP server: mac-use

Install in one line

You need: a Mac · Node.js 18+ · the Grok Bot desktop app, open and signed in.

Claude Code

Plugin (recommended): the MCP server plus a skill that teaches Claude how to work with your Bots.

claude plugin marketplace add rthomas24/grok-bot-mcp && claude plugin install grok-bot@grok-bot-mcp

Or just the MCP server:

claude mcp add grok-bot --scope user -- npx -y github:rthomas24/grok-bot-mcp

Codex

codex mcp add grok-bot -- npx -y github:rthomas24/grok-bot-mcp

Codex gives a tool call 60 seconds by default, and a Bot can take longer than that to answer. Give it more time in ~/.codex/config.toml:

[mcp_servers.grok-bot]
command = "npx"
args = ["-y", "github:rthomas24/grok-bot-mcp"]
startup_timeout_sec = 60
tool_timeout_sec = 900

Cursor and VS Code

Install in Cursor Install in VS Code

Claude Desktop, Windsurf, Zed, Cline or any other MCP client

{
  "mcpServers": {
    "grok-bot": {
      "command": "npx",
      "args": ["-y", "github:rthomas24/grok-bot-mcp"]
    }
  }
}
TIP

If your app says it can't findnpx, put the full path from which npx in "command".

Add the skill to any agent (optional)

The grok-bot skill teaches your agent the workflow: check the app first, read a chat before writing in it, summarize replies, and ask you before committing you to anything. The Claude Code plugin already includes it. For Codex, Cursor, Gemini CLI and other agents that support Agent Skills:

npx skills add rthomas24/grok-bot-mcp

Or let your agent install it

Paste this into Claude Code, Codex or Cursor:

Install the Grok Bot MCP server for me from https://github.com/rthomas24/grok-bot-mcp (follow llms-install.md).

First run: allow macOS access

Grok Bot MCP reads and clicks the Grok Bot app through the macOS Accessibility API, the same way VoiceOver does. macOS asks for permission once:

  1. Run the doctor in the app your agent runs in (Terminal, iTerm2, Cursor, VS Code…):

    npx -y github:rthomas24/grok-bot-mcp doctor
  2. Automation: when macOS asks whether that app may control "System Events" or "Grok Bot", click Allow.

  3. Accessibility: open System Settings → Privacy & Security → Accessibility, turn on that app, then restart it.

When everything is green you're set:

✓ macOS 26.0
✓ Node.js v22.20.0
✓ Grok Bot 0.70.2 installed at /Applications/Grok Bot.app
✓ Grok Bot is running (pid 4242)
✓ Accessibility and Automation access work. Found 4 agents: Grok Bot, Researcher, Coder, Marketer (open: Researcher)

All good! Ask your agent: "List my Grok Bot agents".

Try it

Talk to your agent like you'd talk to a teammate who can see your Grok Bot window:

  • "List my Grok Bot agents and tell me what each one is working on."

  • "Ask my Researcher bot for three recent sources on solid-state batteries, then summarize its answer."

  • "Check whether the Coder bot finished the landing page. Show me what it said."

  • "The Marketer bot asked me a multiple-choice question. Show me the options and recommend one."

  • "Tell the Coder bot 'ship it'. Don't wait for a reply."

Tools

Tool

What it does

Parameters

list_agents

Lists the Bots in the sidebar and which chat is open.

none

read_messages

Reads a chat's recent messages, including a multiple-choice question the Bot is waiting on.

agent, count (1–50, default 10)

send_message

Opens the chat, types your message, presses Enter and waits for the reply.

agent, message, wait_for_reply (default true), timeout_seconds (default 180, max 900), quiet_seconds (default 12)

answer_choice

Clicks an option on a multiple-choice question, by letter or by text.

choice ("A" or the start of the option text), agent, plus the same wait options

Agent names are case-insensitive, and a unique prefix works ("res" → Researcher). A reply looks like this:

{
  "agent": "Researcher",
  "timedOut": false,
  "replies": [
    {
      "sender": "Researcher",
      "time": "9:41:14 AM",
      "text": "I found two directions. Which one should I take?",
      "question": "Which one should I take?",
      "choices": ["Go deep on one paper", "Survey ten papers", "Something else"]
    }
  ]
}

How it works

flowchart LR
    A["Claude Code · Codex · Cursor<br/>(any MCP client)"] <-->|"MCP over stdio"| B["grok-bot-mcp<br/>Node.js, zero dependencies"]
    B <-->|"osascript (JXA)"| C["macOS Accessibility API"]
    C <-->|"reads · clicks · keystrokes"| D["Grok Bot desktop app"]
  • Reads the app's accessibility tree: sidebar, chat transcript, choice buttons. Grok Bot is an Electron app, so when Chromium's tree is switched off the server switches it back on (AXManualAccessibility).

  • Types by pasting. It saves everything on your clipboard (text, images, files), pastes your message, presses Enter, then puts your clipboard back. The temporary text is marked so clipboard managers skip it.

  • Waits by watching for new messages after the one it sent, until the chat goes quiet for quiet_seconds or the Bot asks a question. It sends MCP progress updates while it waits and stops if your client cancels.

  • Takes turns. All calls run one at a time, because they share one window.

  • Stays local. No network calls, no telemetry, no API keys. Only the Grok Bot app talks to the internet.

Set these environment variables in your MCP client's server config if you need them:

Variable

Default

Use

GROK_BOT_APP_NAME

Grok Bot

The app's name, if yours differs.

GROK_BOT_BUNDLE_ID

com.anysphere.sand

The app's bundle ID, used to switch on its accessibility tree.

GROK_BOT_POLL_MS

2000

How often to check for a reply, in milliseconds.

Troubleshooting

Run npx -y github:rthomas24/grok-bot-mcp doctor first. It checks every requirement and says how to fix what's missing.

Problem

Fix

"macOS blocked Accessibility access"

System Settings → Privacy & Security → Accessibility: turn on the app your agent runs in, then restart it.

"macOS blocked Automation access"

System Settings → Privacy & Security → Automation: let that app control "System Events" and "Grok Bot".

"Grok Bot is not running"

Open Grok Bot and sign in.

"No agent named …"

Use a name from list_agents; the error lists them.

send_message returns timedOut: true

The Bot is still working. Ask your agent to check again with read_messages, or raise timeout_seconds.

Codex says the tool call timed out

Raise tool_timeout_sec (see Codex).

The tools don't show up

Restart your agent after installing. In Claude Code, run /mcp to see the server's status.

FAQ

No. Grok Bot MCP is an independent open-source project and isn't affiliated with or endorsed by SpaceXAI, xAI, Anysphere (Cursor), Anthropic or OpenAI.

No. It drives the Grok Bot desktop app you're already signed in to, so there's nothing to configure and no extra cost beyond your Grok Bot plan.

Not yet. Grok Bot runs on Windows and Linux too, but this server uses the macOS Accessibility API. Pull requests for Windows (UI Automation) or Linux (AT-SPI) are welcome.

To type, it has to focus the message box. Reading doesn't need focus, though opening a different chat clicks it in the sidebar.

No. It saves every item and format on the clipboard before pasting and restores them right after.

Only by asking a Bot to, the same as you typing it. The server's instructions and the skill tell agents to get your OK before sending anything that commits you to something: emails, applications, payments, account changes. Your agent's own permission prompts still apply to every tool call.

The server finds things by their accessibility labels, which an app update can change. Please open an issue with your doctor output and Grok Bot version.

Development

git clone https://github.com/rthomas24/grok-bot-mcp && cd grok-bot-mcp
npm test                   # protocol and tool tests against a fake Grok Bot, no app needed
node src/index.js doctor   # check the real app
npx @modelcontextprotocol/inspector node src/index.js   # poke at the tools in a browser
src/index.js           CLI entry: MCP server, `doctor`, `--version`
src/server.js          MCP over stdio (JSON-RPC 2.0), no SDK needed
src/tools.js           Tool definitions, argument checks, waiting for replies
src/grok.js            Runs the JXA script and explains macOS permission errors
src/jxa/grok-bot.js    The part that reads and clicks the Grok Bot window
skills/grok-bot/       Agent Skill for Claude Code, Codex and others
.claude-plugin/        Claude Code plugin and marketplace manifests
test/                  Tests and the fake osascript they run against

Contributions are welcome. See CONTRIBUTING.md, and report security issues privately as described in SECURITY.md.

License

MIT © Ryan Thomas

Grok and Grok Bot are trademarks of their respective owners. This project is not affiliated with, endorsed by or sponsored by SpaceXAI, xAI, Anysphere, Anthropic or OpenAI.

If Grok Bot MCP saves you time, star the repo so others can find it.

Available Tools

4 tools
answer_choiceAnswer a Grok Bot questionA

Click an option on a multiple-choice question an agent asked in Grok Bot (e.g. "What should we tackle next?"). Pass a letter ("A", "B"…) or the start of the option text. Waits for the reply by default.

NameRequiredDescriptionDefault
agentNoAgent name as shown by list_agents, e.g. "Researcher". Case-insensitive; a unique prefix works too. Defaults to the open chat.
choiceYesLetter ("A", "B"…) or the start of the option text.
quiet_secondsNoTreat the reply as finished after this many seconds with no new messages (default 12).
wait_for_replyNoWait for the agent to reply and return the reply (default true).
timeout_secondsNoLongest time to wait for a reply, in seconds (default 180).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose non-read-only, open-world, non-idempotent, and non-destructive behavior, so the description needn't carry the safety profile. It adds useful context by saying it waits for the agent's reply by default, though it does not explain ambiguity handling or the exact side effect of submitting an answer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences front-load the action and input format, include a compact example, and state the default wait behavior without filler. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With full schema coverage and annotations, the definition gives enough to call the tool correctly: the action, accepted choice format, and default wait behavior are all clear. However, there is no output schema and the description does not specify what is returned when wait_for_reply is false, leaving a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, documenting all five parameters including choice format, agent matching, wait behavior, timeout, and quiet period. The description restates the choice format with examples but adds no new syntax or constraints beyond the schema, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Click an option') and resource ('multiple-choice question an agent asked in Grok Bot'), with an example and input format. It distinguishes itself from a general send_message action by scoping to multiple-choice prompts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use it: when an agent has asked a multiple-choice question. It does not explicitly name alternatives such as send_message for free-form replies or state when not to use it, but the context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_agentsList Grok Bot agentsA
Read-only

List the agents (Bots) in the Grok Bot desktop app sidebar, and which chat is open. Call this first to check that the app is reachable.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safe-read profile is structurally covered. The description adds useful behavioral context beyond that: it is a connectivity probe for the desktop app and reports the currently open chat. It does not describe error behavior or response shape, but it adds meaningful operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with what the tool returns and followed by the key operational instruction. There is no filler, and every sentence contributes to correct invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameters, the description carries most of the burden for explaining what comes back. It identifies the returned entities (agents/Bots in the sidebar) and the open-chat state, and it explains the tool's role as a reachability check. It could say more about the shape of the result, but it is sufficient for a simple read-only discovery tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics burden on the description. Baseline for a zero-parameter tool is 4, and nothing in the description misrepresents the parameter surface.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List the agents (Bots) in the Grok Bot desktop app sidebar, and which chat is open.' It clearly distinguishes the resource and scope from siblings like read_messages and send_message, which operate on messages rather than the agent list. An agent can tell immediately what this tool returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit sequencing guidance: 'Call this first to check that the app is reachable.' That tells the agent when this tool is appropriate as a prerequisite or connectivity check. It does not explicitly state when not to use it or name alternatives, but the usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_messagesRead Grok Bot messagesA
Read-only

Read recent messages from an agent chat in Grok Bot, including any multiple-choice question the agent is waiting on. Opens that chat in the app if an agent is given.

NameRequiredDescriptionDefault
agentNoAgent name as shown by list_agents, e.g. "Researcher". Case-insensitive; a unique prefix works too. Defaults to the open chat.
countNoHow many recent messages to return (default 10).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the readOnlyHint/openWorldHint annotations by disclosing a real side effect: specifying an agent opens that chat in the app. It also tells the agent the response includes a pending multiple-choice question, which matters for follow-up calls. Ordering/pagination behavior is not covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler, and the core read purpose is front-loaded ahead of the secondary open-chat behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-parameter read tool with annotations and no output schema, the description covers what it returns (recent messages plus any pending question) and the side effect of specifying an agent. Minor gaps like message ordering are acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented (prefix matching, case-insensitivity, count default/max). The description only hints at the agent parameter's effect ('opens that chat'); the baseline 3 applies since the schema carries the semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read recent messages from an agent chat in Grok Bot') and adds the distinguishing capability of surfacing a pending multiple-choice question. That clearly separates it from send_message and answer_choice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: you read messages to see what an agent said or to discover a question awaiting an answer, which routes to answer_choice. There is no explicit 'use this when' or 'do not use for' statement naming the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_messageSend a message to a Grok Bot agentA

Send a message to an agent in the Grok Bot desktop app. Visibly switches to that chat, types the message and presses Enter. By default waits for the agent to finish replying and returns its reply messages (including any multiple-choice question). Ask the user first if the message would make the agent act outside the app (email, purchases, applications, account changes).

NameRequiredDescriptionDefault
agentYesAgent name as shown by list_agents, e.g. "Researcher". Case-insensitive; a unique prefix works too.
messageYesThe message to send.
quiet_secondsNoTreat the reply as finished after this many seconds with no new messages (default 12).
wait_for_replyNoWait for the agent to reply and return the reply (default true).
timeout_secondsNoLongest time to wait for a reply, in seconds (default 180).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag non-read-only, non-idempotent, open-world behavior; the description adds genuinely useful context beyond them — that the UI visibly switches chats and types/presses Enter, and that the call blocks until the agent replies unless configured otherwise. It does not cover failure modes such as an unknown agent name or what happens if the timeout elapses.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action, then the visible side effect, then the return behavior, then the safety caveat. Nothing is redundant or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description does the work of explaining what comes back (the agent's reply messages, possibly a multiple-choice question). Combined with the safety caveat and the blocking behavior, an agent has enough to invoke it correctly, though error/edge-case behavior is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so agent, message, quiet_seconds, timeout_seconds and wait_for_reply are all documented in structured fields. The description only restates the default wait-for-reply behavior and mentions the reply may contain a multiple-choice question; it adds no new semantics for quiet_seconds or timeout_seconds beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (send a message to an agent in the Grok Bot desktop app) and further specifies the mechanism (switches chat, types, presses Enter). It implicitly distinguishes itself from read_messages and answer_choice by mentioning it returns reply messages including multiple-choice questions, but never names the siblings to route between them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete precondition: ask the user first if the message would make the agent act outside the app, with examples (email, purchases, applications, account changes). It also clarifies default behavior (waits for the reply) so the agent knows the typical call shape. It stops short of stating when to prefer answer_choice over sending a new message.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv1.0.0
    • First observedanswer_choice
    • First observedlist_agents
    • First observedread_messages
    • First observedsend_message

TDQS

A4.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool maps to a distinct action on a distinct aspect of the Grok Bot app: enumerating bots, reading a chat, writing to a chat, and clicking a choice option. There is no plausible confusion between read_messages and send_message, and answer_choice is clearly the only tool for responding to multiple-choice prompts.

Naming Consistency5/5

All four names follow a clean verb_noun snake_case pattern (list_agents, read_messages, send_message, answer_choice). Verb choice is also semantically precise—list vs read vs send vs answer—reinforcing the distinction.

Tool Count5/5

Four tools is a tight, well-scoped surface for driving a single desktop chat app. Each tool covers an indispensable part of the interaction loop (discover, read, write, reply to prompt) with no filler.

Completeness4/5

The core lifecycle—find the app, read a chat, send a message, answer a prompt—is fully covered with no dead ends. Minor gaps exist around starting a brand-new agent/chat or retrieving fuller conversation history, but agents can work around these via send_message and read_messages.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Automates Grok web interface to provide chat, web search, and conversation management via MCP, supporting multiple accounts and local/remote deployment.
    -
  • A
    license
    C
    quality
    C
    maintenance
    Enables IDEs and MCP hosts to drive a user's Grok Bot cloud agents, including sending messages, waiting for replies, reading history, and managing agents, secrets, widgets, handoffs, and desktop access. It acts as an outbound bridge from Cursor, Claude, and VS Code to those cloud agents.
    21
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables any MCP client such as Cursor, Claude Code, or Codex to dispatch tasks to a Cursor Grok Bot running on its cloud computer, poll for its replies, and interrupt an in-progress run. It also lists the bots available for contact, without routing replies through an extra model.
    4
    1
    MIT