Skip to main content
Glama
kicito

xai-search-mcp

by kicito
README.md
# xAI Search MCP Server

An MCP (Model Context Protocol) server that provides real-time web search and X (Twitter) search capabilities via the [xAI API](https://docs.x.ai/).

## Quick Start

Requires Node.js 22 or newer. The easiest way to use this server is via `npx` — no clone or build required:

```bash
XAI_API_KEY=your_key npx @kicito/xai-search-mcp
```

On Windows PowerShell:

```powershell
$env:XAI_API_KEY = "your_key"
npx @kicito/xai-search-mcp
```

Just set your `XAI_API_KEY` environment variable and configure your MCP client (see [Configuration](#configuration) below).

## Tools

### `web_search`
Search the web in real-time. Returns results with source citations.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `query` | string | ✅ | The search query; trimmed and must not be empty |
| `allowed_domains` | string[] | ❌ | Only search within these domains (max 5) |
| `excluded_domains` | string[] | ❌ | Exclude these domains from search (max 5) |

### `x_search`
Search X (Twitter) posts, users, and threads. Returns results with source citations.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `query` | string | ✅ | The search query for X posts; trimmed and must not be empty |
| `allowed_x_handles` | string[] | ❌ | Only consider posts from these handles (max 10) |
| `excluded_x_handles` | string[] | ❌ | Exclude posts from these handles (max 10) |
| `from_date` | string | ❌ | Inclusive start date (valid calendar date in `YYYY-MM-DD`, e.g. `2025-01-01`) |
| `to_date` | string | ❌ | Exclusive end date (valid calendar date in `YYYY-MM-DD`, e.g. `2025-06-01`) |

### Input validation

- Queries are trimmed; empty or whitespace-only queries are rejected.
- Domains are trimmed, lowercased and IDNA-normalized, with a trailing root dot removed. Supply bare domains (for example, `example.com`) rather than URLs. Empty or invalid entries are rejected.
- X handles are trimmed and a leading `@` is removed. Handles must contain 1–15 letters, digits or underscores; case is preserved. Profile URLs are not accepted.
- For each tool, nonempty allow and exclude lists cannot be combined. Empty filter arrays (and `null` or omitted filters) are treated as absent.
- Dates must be real calendar dates in exactly `YYYY-MM-DD` format, not timestamps. When both dates are provided, `from_date` must be on or before `to_date`.

X handle/date filters apply to search, not thread fetches. Handle lists are conservatively capped at 10 entries.

## Setup

### Prerequisites

- [Node.js](https://nodejs.org/) 22 or newer
- An [xAI API key](https://console.x.ai/)

### Install & Build

```bash
npm ci
npm run build
```

Run these commands from a cloned checkout. The build uses TypeScript and a Node.js helper, with no POSIX `chmod` command required; it works on Linux, macOS, and Windows.

### Configuration

#### OpenCode V2 (MCP server and optional agent skill)

The optional [xai-search skill](.opencode/skills/xai-search/SKILL.md) tells OpenCode agents **when and how** to use `web_search` and `x_search`, including filters and source citations. It is guidance, not an executable tool or an MCP server. In this checkout, OpenCode can load the skill from `.opencode/skills/xai-search/SKILL.md`. To use it in another project, copy the `xai-search` skill directory to `~/.config/opencode/skills/xai-search/` for your user, or to that project's `.opencode/skills/xai-search/`.

Configure the MCP server **separately**. With Node.js 22+ and an [xAI API key](https://console.x.ai/), put the following in your OpenCode `opencode.jsonc` (merge with any existing config):

```jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "servers": {
      "xai-search": {
        "type": "local",
        "command": ["npx", "-y", "@kicito/xai-search-mcp"],
        "environment": {
          "XAI_API_KEY": "{env:XAI_API_KEY}"
        }
      }
    }
  }
}
```

Set `XAI_API_KEY` in the environment that launches OpenCode; do not commit your key to git. Check the server connection with `opencode mcp list`. The skill alone cannot supply the server or API key. This OpenCode V2 config uses `mcp.servers`, not the `mcpServers` format shown below for Claude Desktop and Cursor.

#### Claude Desktop

Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "xai-search": {
      "command": "npx",
      "args": ["-y", "@kicito/xai-search-mcp"],
      "env": {
        "XAI_API_KEY": "your-xai-api-key-here"
      }
    }
  }
}
```

#### Cursor

Add to your Cursor MCP settings:

```json
{
  "mcpServers": {
    "xai-search": {
      "command": "npx",
      "args": ["-y", "@kicito/xai-search-mcp"],
      "env": {
        "XAI_API_KEY": "your-xai-api-key-here"
      }
    }
  }
}
```

<details>
<summary>Alternative: Local build</summary>

If you prefer to clone and build manually:

```bash
git clone https://github.com/kicito/x_search_mcp.git
cd x_search_mcp
npm ci
npm run build
```

Then use the full path in your config:

```json
{
  "mcpServers": {
    "xai-search": {
      "command": "node",
      "args": ["/absolute/path/to/x_search_mcp/build/index.js"],
      "env": {
        "XAI_API_KEY": "your-xai-api-key-here"
      }
    }
  }
}
```

</details>

### Environment Variables

| Variable | Required | Default | Description |
|---|---|---|---|
| `XAI_API_KEY` | ✅ | — | Your xAI API key |
| `XAI_MODEL` | ❌ | `grok-4-1-fast-reasoning` | The xAI model to use |
| `XAI_TIMEOUT_MS` | ❌ | `120000` | Application request timeout in milliseconds; positive integer, maximum `2147483647` |

Requests are bounded by the application timeout, including response-body processing. MCP request cancellation aborts the upstream request and stops processing without a response. Timeouts and upstream failures return tool errors; upstream error details are sanitized and bounded rather than returning arbitrary raw response bodies. Requests are not automatically retried.

## How It Works

The server uses the [xAI Responses API](https://docs.x.ai/developers/tools/overview) with built-in server-side tools (`web_search` and `x_search`). When an MCP client calls one of the tools, the server:

1. Sends the query to `POST https://api.x.ai/v1/responses` with the appropriate tool configuration
2. Grok executes the search, gathers results, and generates a response
3. Citations (source URLs) are extracted from the response annotations
4. The response text and formatted citations are returned to the MCP client

## Development

```bash
# Install the locked dependencies
npm ci

# Type-check without emitting build output
npm run typecheck

# Build
npm run build

# Build and run offline tests
npm test

# Build and verify npm package contents and executable metadata (offline dry-run)
npm run test:package

# Start after setting XAI_API_KEY in your shell or MCP client
npm start
```

`npm run check:package` checks an existing build without rebuilding. Package checks verify the CLI entrypoint, executable metadata, build files, README, manifest, and MIT license using `npm pack --dry-run --json`; they do not publish or require an API key. Tests use mocked requests, not live xAI searches.

CI runs type-checking, tests, and package checks on Node.js 22 and 24 on Linux, plus Node.js 22 on Windows. Tag-triggered npm publishing is gated on the same checks and uses Node.js 22.

## License

MIT — see [LICENSE](LICENSE).

TDQS

A3.9/5.0

Scored across 2 tools

Disambiguation5/5

The two tools target completely distinct domains: web_search is for general web content, while x_search is specifically for X (Twitter). There is no overlap in their search scopes, so an agent can easily distinguish between them.

Naming Consistency5/5

Both tools use a consistent verb_noun pattern (web_search, x_search), with the verb 'search' followed by a clear domain identifier. The naming is uniform and predictable.

Tool Count4/5

With only 2 tools, the server is minimal but justified for its focused purpose of providing real-time search across two specific sources (web and X). It could potentially include more search types, but the current count is reasonable for a specialized search server.

Completeness4/5

The server covers the primary search needs implied by its name: web and X/Twitter searches. Minor gaps like additional search options or filters are missing, but the core functionality is adequately addressed for basic real-time searches.

Maintenance

ActivityMaintained
ResponsivenessNo issues