Some checks failed
CI / ci (push) Failing after 11s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
254 lines
9.3 KiB
Markdown
254 lines
9.3 KiB
Markdown
# MCP Server
|
|
|
|
GearBox includes a built-in MCP (Model Context Protocol) server that exposes your gear collection to AI assistants. It runs inside the Hono process — no separate service is needed.
|
|
|
|
The MCP server implements the [Streamable HTTP transport](https://modelcontextprotocol.io/specification) from `@modelcontextprotocol/sdk` and is mounted at `/mcp`.
|
|
|
|
---
|
|
|
|
## Table of Contents
|
|
|
|
- [Enabling and Disabling](#enabling-and-disabling)
|
|
- [Authentication](#authentication)
|
|
- [Connecting an AI Client](#connecting-an-ai-client)
|
|
- [Claude Code](#claude-code)
|
|
- [Claude Desktop](#claude-desktop)
|
|
- [Tools](#tools)
|
|
- [Resources](#resources)
|
|
- [Recommended Workflow](#recommended-workflow)
|
|
- [Example Session](#example-session)
|
|
- [Implementation Structure](#implementation-structure)
|
|
|
|
---
|
|
|
|
## Enabling and Disabling
|
|
|
|
The MCP server is **enabled by default**. To disable it, set the environment variable:
|
|
|
|
```bash
|
|
GEARBOX_MCP=false bun run dev:server
|
|
```
|
|
|
|
Or in your environment file:
|
|
|
|
```bash
|
|
GEARBOX_MCP=false
|
|
```
|
|
|
|
When disabled, the `/mcp` route is not registered and any requests to it return 404.
|
|
|
|
---
|
|
|
|
## Authentication
|
|
|
|
The MCP server requires an API key when the app has been set up (i.e., at least one user exists). Pass the key via the `X-API-Key` header in your MCP client configuration.
|
|
|
|
To create an API key:
|
|
1. Log in to the web UI.
|
|
2. Go to **Settings > API Keys**.
|
|
3. Click **New Key**, give it a name, and copy the full key shown.
|
|
|
|
The full key is only shown once. Store it in your client configuration immediately.
|
|
|
|
See [authentication.md](authentication.md) for full API key documentation.
|
|
|
|
---
|
|
|
|
## Connecting an AI Client
|
|
|
|
### Claude Code
|
|
|
|
Add the MCP server to `.claude/settings.json` in your project or globally at `~/.claude/settings.json`:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"gearbox": {
|
|
"type": "streamable-http",
|
|
"url": "http://localhost:3000/mcp",
|
|
"headers": {
|
|
"X-API-Key": "your-api-key-here"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Claude Desktop
|
|
|
|
Add the server to `claude_desktop_config.json`:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"gearbox": {
|
|
"type": "streamable-http",
|
|
"url": "http://localhost:3000/mcp",
|
|
"headers": {
|
|
"X-API-Key": "your-api-key-here"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
On macOS, the config file is at `~/Library/Application Support/Claude/claude_desktop_config.json`.
|
|
|
|
After updating the config, restart Claude Desktop (or reload the window in Claude Code) for the server to connect.
|
|
|
|
---
|
|
|
|
## Tools
|
|
|
|
The MCP server exposes 18 tools across five categories.
|
|
|
|
### Items
|
|
|
|
| Tool | Description |
|
|
|----------------|------------------------------------------------------------------------------------------------------------|
|
|
| `list_items` | List all items in the gear collection, optionally filtered by `categoryId`. |
|
|
| `get_item` | Get a single item by ID with all details. |
|
|
| `create_item` | Add a new item directly to the collection. Use for items already decided on; use `create_thread` for research. |
|
|
| `update_item` | Update an existing item's fields. |
|
|
| `delete_item` | Delete an item from the collection by ID. |
|
|
|
|
### Categories
|
|
|
|
| Tool | Description |
|
|
|-------------------|--------------------------------------|
|
|
| `list_categories` | List all gear categories. |
|
|
| `create_category` | Create a new gear category. |
|
|
|
|
### Threads
|
|
|
|
| Tool | Description |
|
|
|------------------|------------------------------------------------------------------------------------------------------|
|
|
| `list_threads` | List research threads. Pass `includeResolved: true` to include resolved threads. |
|
|
| `get_thread` | Get a thread with all its candidates for detailed comparison. |
|
|
| `create_thread` | Start a new research thread for a gear slot. Preferred entry point for gear research. |
|
|
| `resolve_thread` | Resolve a thread by picking the winning candidate. Automatically creates a new item in the collection. |
|
|
|
|
### Candidates
|
|
|
|
| Tool | Description |
|
|
|--------------------|-----------------------------------------------------------------------|
|
|
| `add_candidate` | Add a candidate option to a research thread for comparison. |
|
|
| `update_candidate` | Update a candidate's details (name, price, pros, cons, status, etc.).|
|
|
| `remove_candidate` | Remove a candidate from a research thread. |
|
|
|
|
### Setups
|
|
|
|
| Tool | Description |
|
|
|-----------------|-------------------------------------------------------------------------------------------------------|
|
|
| `list_setups` | List all gear setups with item counts and weight/cost totals. |
|
|
| `get_setup` | Get a setup with all its items and details. |
|
|
| `create_setup` | Create a new gear setup (e.g., "Bikepacking weekend"). |
|
|
| `update_setup` | Update a setup's name and/or replace its item list by passing `itemIds`. |
|
|
|
|
### Images
|
|
|
|
| Tool | Description |
|
|
|-------------------------|--------------------------------------------------------------------------------------------------|
|
|
| `upload_image_from_url` | Fetch an image from a URL and save it locally. Returns a `filename` to use with items or candidates. |
|
|
|
|
---
|
|
|
|
## Resources
|
|
|
|
### `gearbox://collection/summary`
|
|
|
|
Returns a JSON overview of the entire gear collection, including:
|
|
- Total item count, weight, and cost
|
|
- Per-category breakdowns
|
|
- Active research thread count
|
|
|
|
Read this resource first to orient yourself before running queries or making changes.
|
|
|
|
---
|
|
|
|
## Recommended Workflow
|
|
|
|
Tool descriptions are written to guide AI assistants toward the research thread workflow rather than creating items directly. The intended flow for evaluating a new piece of gear is:
|
|
|
|
1. **`create_thread`** — open a research thread for the gear slot (e.g., "Handlebar bag")
|
|
2. **`add_candidate`** — add options with prices, weights, pros, and cons
|
|
3. **`get_thread`** — review all candidates side by side
|
|
4. **`resolve_thread`** — pick the winner; it becomes a new item in the collection automatically
|
|
|
|
Use `create_item` directly only when you already know exactly what you're adding and no research is needed.
|
|
|
|
---
|
|
|
|
## Example Session
|
|
|
|
The following illustrates a typical assistant interaction via the MCP server.
|
|
|
|
**User:** "I need a new handlebar bag. Can you research some options and add them?"
|
|
|
|
**Assistant actions:**
|
|
|
|
```
|
|
1. list_categories
|
|
-> finds "Bags" category (id: 2)
|
|
|
|
2. create_thread { name: "Handlebar bag", categoryId: 2 }
|
|
-> thread id: 7
|
|
|
|
3. upload_image_from_url { url: "https://revelatedesigns.com/sweetroll.jpg" }
|
|
-> filename: "1710000000000-uuid.jpg"
|
|
|
|
4. add_candidate {
|
|
threadId: 7,
|
|
name: "Revelate Sweetroll",
|
|
categoryId: 2,
|
|
weightGrams: 290,
|
|
priceCents: 13500,
|
|
productUrl: "https://revelatedesigns.com/...",
|
|
imageFilename: "1710000000000-uuid.jpg",
|
|
pros: "Waterproof, 16L, fits most drop bars",
|
|
cons: "Expensive, bulky profile"
|
|
}
|
|
|
|
5. add_candidate {
|
|
threadId: 7,
|
|
name: "Apidura Backcountry Handlebar Pack",
|
|
categoryId: 2,
|
|
weightGrams: 230,
|
|
priceCents: 11000,
|
|
pros: "Lighter, packable, good attachment system",
|
|
cons: "Smaller capacity"
|
|
}
|
|
|
|
6. add_candidate { ... }
|
|
|
|
7. get_thread { id: 7 }
|
|
-> presents comparison to user
|
|
|
|
8. resolve_thread { threadId: 7, candidateId: 14 }
|
|
-> Revelate Sweetroll added to collection as item id: 42
|
|
```
|
|
|
|
---
|
|
|
|
## Implementation Structure
|
|
|
|
The MCP server source lives under `src/server/mcp/`:
|
|
|
|
```
|
|
src/server/mcp/
|
|
index.ts # Server factory, transport handling, auth middleware, Hono route registration
|
|
tools/
|
|
items.ts # list_items, get_item, create_item, update_item, delete_item
|
|
categories.ts # list_categories, create_category
|
|
threads.ts # list_threads, get_thread, create_thread, resolve_thread,
|
|
# add_candidate, update_candidate, remove_candidate
|
|
setups.ts # list_setups, get_setup, create_setup, update_setup
|
|
images.ts # upload_image_from_url
|
|
resources/
|
|
collection.ts # gearbox://collection/summary resource handler
|
|
```
|
|
|
|
Each tool file exports a `*ToolDefinitions` array (name, description, inputSchema) and a `register*Tools(db)` factory function that returns handler implementations. The server in `index.ts` iterates over definitions and registers each handler with the MCP `McpServer` instance.
|
|
|
|
Session management uses the `WebStandardStreamableHTTPServerTransport` with UUID-based session IDs tracked in an in-memory `Map`. Sessions are cleaned up when the transport closes.
|