Skip to main content
Glama
bulychauPI

shop-db MCP Server

by bulychauPI
README.md
# shop-db MCP Server

A read-only [Model Context Protocol](https://modelcontextprotocol.io) server
that gives AI agents analytical access to an e-commerce SQLite database
(`customers`, `orders`, `order_items`, `products`) — without any ability to
modify data.

Built for **Node.js v24.19+**, running TypeScript source files directly
(no build step) using native `node:sqlite` and `node:test`.

## Setup

```bash
npm install
```

The repository already includes a populated `./shop.db` at the project
root — no seeding step is needed. Nothing in `npm start` or `npm test`
writes to it: the server opens it read-only, and the test suite builds its
own throwaway databases under `tests/` from `tests/fixtures/seed.sql`.

## Run the server

```bash
npm start
```

The server communicates over stdio (`StdioServerTransport`) — it's meant to
be launched by an MCP client (Claude Code, Claude Desktop, etc.), not run
interactively.

## Tests

```bash
npm test
```

Runs `node --test` against `tests/`, covering SQL validation edge cases
(mutation keywords, comment-evasion, multi-statement injection, CTEs,
`EXPLAIN`) and the three MCP tools end-to-end against isolated test
databases built from `tests/fixtures/seed.sql`. The committed `./shop.db`
is never read or written by the test suite.

## Configuring the database path

By default the server reads `./shop.db` (relative to the working
directory it's launched from). Override with the `DB_PATH` environment
variable:

```bash
DB_PATH=/absolute/path/to/shop.db npm start
```

## Tools

- **`list_tables`** — lists the 4 tables with a short description of each.
- **`describe_table`** — column definitions, types, primary keys, and up to
  3 sample rows, for one table (`tableName`) or all tables (omit it).
- **`read_query`** — executes a read-only `SELECT`/`WITH`/`EXPLAIN`/`PRAGMA`
  query (`query`, required) and returns up to `limit` rows (optional,
  default 100, max 1000). Any mutation attempt (`INSERT`, `UPDATE`,
  `DELETE`, `DROP`, ...) is rejected with a clear error, even if disguised
  with SQL comments or wrapped in a CTE.

## AI agent config

```json
{
  "mcpServers": {
    "shop-db": {
      "command": "node",
      "args": ["/absolute/path/to/src/index.ts"],
      "env": {
        "DB_PATH": "/absolute/path/to/shop.db"
      }
    }
  }
}
```

## Project docs

- [`AGENTS.md`](./AGENTS.md) — instructions for AI coding agents working on
  this repo (also loaded as `CLAUDE.md` via symlink).
- [`CONTEXT.md`](./CONTEXT.md) — domain model and safety architecture.

TDQS

A4.2/5.0

Scored across 3 tools

Disambiguation5/5

The three tools have clearly distinct purposes: listing tables, describing schema, and running queries. There is no overlap or ambiguity, so an agent can easily select the right tool for each operation.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (list_tables, describe_table, read_query). The naming is predictable and adheres to a single convention throughout.

Tool Count4/5

With only 3 tools, the set is slightly minimal but well-scoped for a read-only database introspection server. Each tool serves a necessary function, and the count is reasonable for the apparent purpose.

Completeness5/5

The tool surface fully covers the core operations needed for read-only database access: enumerating tables, inspecting schemas, and executing arbitrary queries. No critical gaps are evident for the intended domain.

Maintenance

ActivitySlowing
ResponsivenessNo issues