Skip to main content
Glama
alloufj

Grips Intelligence MCP Server

by alloufj
README.md
# Grips Intelligence MCP server (v2)

A Model Context Protocol (MCP) server that exposes the [Grips Intelligence](https://gripsintelligence.com/) e-commerce data API to any MCP client — Claude Desktop, Cowork, Claude Code, etc.

v2 is a clean rebuild of v1 with defensive data handling baked in from day one. It fixes the "`.map is not a function`" class of bugs that v1.x needed a runtime patch to address — thin or unknown domains now degrade to a clean "no data" response instead of crashing the tool call.

## What's in it

| Tool | What it does |
|---|---|
| `grips_get_domain_performance` | Monthly revenue / transactions / sessions / ad cost / AOV / CR / CPC for one or more domains |
| `grips_get_daily_performance` | Daily revenue / transactions / sessions (limited coverage) |
| `grips_get_channels` | Organic / Paid Search / Direct / Referral / Social breakdown — timeseries + aggregated |
| `grips_get_adwords` | Paid-media spend, clicks, and CPC — timeseries + aggregated |
| `grips_get_devices` | Mobile / desktop / tablet revenue, sessions, CR, AOV |
| `grips_compare_domains` | Parallel per-domain pull with leaderboard ranking; per-domain errors are isolated |
| `grips_raw_query` | Escape hatch — send an arbitrary Grips GraphQL query |

All tools default to markdown output for readability. Pass `format: "json"` for machine-parseable output.

## Installation

```bash
npm install
```

The `prepare` script auto-builds `dist/` when you run `npm install`.

## Configuration

Set your Grips API key in the MCP client's server config. For Claude Desktop, that's `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "grips": {
      "command": "node",
      "args": [
        "/ABSOLUTE/PATH/TO/grips-mcp-server-v2/dist/index.js"
      ],
      "env": {
        "GRIPS_API_KEY": "your-api-key-here",
        "GRIPS_DEFAULT_COUNTRY": "US"
      }
    }
  }
}
```

Required env:

- `GRIPS_API_KEY` — your Grips API token (sent as the `grips-api-key` header).

Optional env:

- `GRIPS_DEFAULT_COUNTRY` — `US`, `GB`, or `DE`. Defaults to `US` if unset or invalid.

After editing the config, fully quit Claude Desktop (`Cmd+Q` — not just closing the window) and reopen.

## What's different from v1

v1 crashed on a specific API response shape: when Grips returned a thinly-covered or unknown domain, the `timeseries` field came back as `{}` rather than `null`, `undefined`, or `[]`. The code used `(data.timeseries ?? []).map(...)`, which only guards against `null`/`undefined` — not against `{}`. Result: `"data.timeseries ?? []).map is not a function"`.

v2 routes **every** payload field through `toArray<T>()` (for arrays) or `toObject<T>()` (for dict-shaped responses like the devices endpoint) before use. Any non-array / non-object value falls through to a safe empty default, and the tool returns a clean "no data" response instead of throwing.

Other changes:

- **Date normalisation** is consistent (every date becomes `YYYY-MM-DD` in UTC) across all tools, so rows don't slip across day boundaries in non-UTC timezones.
- **Currency / integer / percent formatters** render `—` for missing values instead of `$NaN` or `0.00%`.
- **Error messages** now include actionable hints — 401 → "check your API key", 429 → "rate-limited, narrow your window", etc.
- **Per-domain error isolation** in `grips_compare_domains` — one thin domain in an 8-domain compare no longer breaks the other seven.
- **Character-budget truncation** — responses cap at ~200KB with a visible notice so multi-domain pulls don't blow up the context window.

## Development

```bash
npm run dev    # watch mode, rebuilds on change
npm run build  # one-shot build to dist/
```

## Testing from the command line

Test that the server boots without errors (it will exit on EOF from stdin):

```bash
GRIPS_API_KEY=your-key node dist/index.js < /dev/null
```

You should see `[grips-mcp] grips-mcp-server v2.0.0 ready (default country: US).` on stderr and no crash.

For interactive testing, use [`@modelcontextprotocol/inspector`](https://github.com/modelcontextprotocol/inspector):

```bash
npx @modelcontextprotocol/inspector node dist/index.js
```

## API reference

Grips documents their public schema at <https://gripsintelligence.com/knowledge-base/api>. The queries this server uses are copied verbatim from that page.

Supported countries today: `US`, `GB`, `DE`. Everything else will error at the API.

## Licence

Private — not for external distribution.

TDQS

A4.3/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct data dimension (domain performance, adwords, channels, devices, daily performance, comparison, raw query) with clear separation. No two tools have overlapping purposes.

Naming Consistency5/5

All tools follow a consistent `grips_<verb>_<noun>` pattern in snake_case, with verbs like 'get' and 'compare', and a single exception 'raw_query' still fits the pattern. No mixing of conventions.

Tool Count5/5

With 7 tools, the set is well-scoped for an analytics server covering multiple metrics and dimensions. Not too few to be limited, not too many to be overwhelming.

Completeness4/5

Core analytics needs are covered, and the raw query tool fills potential gaps. Minor missing areas like product-level data exist, but the surface is largely complete for the stated purpose.