Skip to main content
Glama
gamesme

chatlab-mcp

by gamesme
README.md
# chatlab-mcp

**[English](./README.md) | [简体中文](./README.zh-CN.md) | [繁體中文](./README.zh-TW.md) | [日本語](./README.ja.md)**

MCP server that connects [ChatLab](https://github.com/hellodigua/ChatLab) to AI assistants (Claude Desktop, Cursor, custom agents). Query your local chat history with natural language.

> Tracks ChatLab v0.19.0

## Requirements

- [ChatLab](https://github.com/hellodigua/ChatLab) installed and running
- API enabled in ChatLab Settings → API, with a token generated
- Node.js 18+

## Installation

### npx (recommended)

No installation needed. Configure your AI client directly:

```json
{
  "mcpServers": {
    "chatlab": {
      "command": "npx",
      "args": ["-y", "chatlab-mcp"],
      "env": {
        "CHATLAB_TOKEN": "clb_xxxxxxxxxxxx",
        "CHATLAB_URL": "http://127.0.0.1:5200"
      }
    }
  }
}
```

### From source

```bash
git clone https://github.com/gamesme/chatlab-mcp
cd chatlab-mcp
npm install && npm run build
```

## Claude Desktop

Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:

**With npx:**
```json
{
  "mcpServers": {
    "chatlab": {
      "command": "npx",
      "args": ["-y", "chatlab-mcp"],
      "env": {
        "CHATLAB_TOKEN": "clb_xxxxxxxxxxxx",
        "CHATLAB_URL": "http://127.0.0.1:5200"
      }
    }
  }
}
```

**From source (use your Homebrew node to avoid version issues):**
```json
{
  "mcpServers": {
    "chatlab": {
      "command": "/opt/homebrew/bin/node",
      "args": ["/absolute/path/to/chatlab-mcp/dist/index.js"],
      "env": {
        "CHATLAB_TOKEN": "clb_xxxxxxxxxxxx",
        "CHATLAB_URL": "http://127.0.0.1:5200"
      }
    }
  }
}
```

Restart Claude Desktop after saving. The `chatlab` tools will appear in the tools list.

## Tools

### Core (6)
| Tool | Description |
|------|-------------|
| `list_sessions` | List all imported chat sessions with name, platform, and message count |
| `get_session` | Get details of a single session by ID |
| `get_messages` | Retrieve messages with filters: keyword, time range, sender, pagination (max 100/call) |
| `get_members` | List all members in a session with their platformId and message count |
| `get_stats_overview` | Statistical overview: message counts, member activity, type distribution, time range |
| `execute_sql` | Run aggregation queries (COUNT/GROUP BY) against the session database |

### Analytics (v0.19.0+, 9)
| Tool | Description |
|------|-------------|
| `get_message_context` | N messages before/after one or more target message IDs |
| `get_conversation_between` | Interleaved messages between two specific members (numeric IDs) |
| `get_session_summaries` | AI-generated chat sub-session summaries (from the chat_session table) |
| `deep_search_messages` | FTS5 keyword search with surrounding context window |
| `get_time_stats` | Hourly / weekday / daily distribution, timezone-aware |
| `get_member_activity` | Top-N members by message count with percentage of total |
| `get_member_name_history` | Historical account name / nickname entries for a member |
| `get_response_time_analysis` | Reply intervals between sender pairs (LAG window function) |
| `keyword_frequency` | Stub — returns guidance (NLP segmentation not bundled in MCP) |

### Notes

- `get_messages` returns at most 100 messages per call. Use the `page` parameter to paginate. Responses include `has_more` and a `hint` when more results exist.
- `execute_sql` is for statistical aggregation only. Use `get_messages` or `get_message_context` to read message content.
- Analytics tools issue their own SQL through the same `/sql` endpoint (no 200-row LIMIT injection).
- All avatar/binary fields are stripped from responses to minimize context usage.

## CLI Options

```bash
node dist/index.js --token <token> --url <url>
# or via env vars
CHATLAB_TOKEN=clb_xxx CHATLAB_URL=http://127.0.0.1:5200 node dist/index.js
```

`CHATLAB_URL` defaults to `http://127.0.0.1:5200`.

## Development

```bash
npm test             # run all tests
npm run test:watch   # watch mode
npm run dev          # run with ts-node (no build step)
npm run build        # compile TypeScript → dist/
```

TDQS

A3.9/5.0

Scored across 17 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but there is slight overlap between get_messages, get_conversation_text, and get_full_conversation. However, descriptions clarify when to use each, so ambiguity is low.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with snake_case. Most use 'get_' prefix, except deep_search_, execute_sql, keyword_frequency, and list_sessions, which are still clear and consistent with their verb choice.

Tool Count4/5

17 tools is slightly above the typical well-scoped range (3-15), but each tool serves a distinct analytical purpose for chat sessions, so it feels appropriate rather than bloated.

Completeness4/5

The tool set covers all major aspects of chat analysis (listing, messages, members, activity, time stats, context, summaries). The only gap is the stub keyword_frequency tool, which is acknowledged but not implemented.

Maintenance

ActivityInactive
ResponsivenessNo issues