* feat: add TenantExtension auth to MCP endpoint Replace static MCP_AUTH_TOKEN check with TenantExtension authentication, making MCP use the same auth path as REST API. - MCPMiddleware now calls tenant_extension.authenticate() - Sets _current_schema from TenantContext for multi-tenant isolation - Returns 401 on AuthenticationError (same as REST API) - DefaultTenantExtension: no auth (local dev) - ApiKeyTenantExtension: validates against env var - CloudTenantExtension: HMAC + DB lookup (production) Adds tests for middleware auth rejection, acceptance, and schema routing. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Address PR review: backwards compatibility for MCP auth - Keep MCP_AUTH_TOKEN env var for legacy MCP servers - Add authenticate_mcp() method to TenantExtension base class - Default implementation calls authenticate() - Extensions can override to opt-out of MCP auth - Add mcp_auth_disabled config option to ApiKeyTenantExtension - Set HINDSIGHT_API_TENANT_MCP_AUTH_DISABLED=true to skip MCP auth - Remove CloudTenantExtension from public docstring - Add tests for legacy auth token and mcp_auth_disabled flag - Update MCP docs with new auth configuration Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add search_docs MCP tool for documentation search Implements a new MCP tool that searches Hindsight documentation using Vectorize RAG pipelines. The tool supports: - Searching core (OSS) docs, cloud docs, or both - Configurable number of results (1-10) - Returns ranked results with URLs, similarity scores, and text snippets New environment variables: - HINDSIGHT_API_VECTORIZE_ORG_ID - HINDSIGHT_API_VECTORIZE_API_TOKEN - HINDSIGHT_API_VECTORIZE_CORE_PIPELINE_ID - HINDSIGHT_API_VECTORIZE_CLOUD_PIPELINE_ID - HINDSIGHT_API_VECTORIZE_API_BASE_URL Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add documentation for search_docs MCP tool - Add Vectorize environment variables to configuration.md - Add search_docs tool to MCP server available tools - Add reflect tool documentation (was missing) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add tests for search_docs MCP tool Tests cover: - DocsSource enum values and parsing - _clean_text HTML stripping helper - _search_vectorize_pipeline with mocked httpx - Tool registration and function execution - Source filtering (core/cloud/all) - Result sorting by similarity - Error handling for pipeline failures - HTML cleaning in results - Invalid source defaulting to 'all' Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Move search_docs to hindsight-cloud, add MCPExtension pattern - Add MCPExtension base class for registering additional MCP tools - Load MCPExtension in create_mcp_server when configured - Remove search_docs tool (moved to hindsight-cloud CloudMCPExtension) - Remove Vectorize config from hindsight-core - Add tests for MCPExtension pattern - Update docs to remove search_docs references The MCPExtension pattern allows cloud (or any extension package) to register additional MCP tools via: HINDSIGHT_API_MCP_EXTENSION=package.module:ExtensionClass Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Address PR review feedback - Remove CloudTenantExtension mention from MCPMiddleware docstring - Fix docs: clarify that ApiKeyTenantExtension must be explicitly enabled - Revert changes to versioned docs (0.3 and 0.4) - synced automatically on release Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Format mcp.py line length Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
204 lines
5.3 KiB
Markdown
204 lines
5.3 KiB
Markdown
---
|
|
sidebar_position: 5
|
|
---
|
|
|
|
# MCP Server
|
|
|
|
Hindsight includes a built-in [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that allows AI assistants to store and retrieve memories directly.
|
|
|
|
## Access
|
|
|
|
The MCP server is **enabled by default** and mounted at `/mcp` on the API server. Each memory bank has its own MCP endpoint:
|
|
|
|
```
|
|
http://localhost:8888/mcp/{bank_id}/
|
|
```
|
|
|
|
For example, to connect to the memory bank `alice`:
|
|
```
|
|
http://localhost:8888/mcp/alice/
|
|
```
|
|
|
|
To disable the MCP server, set the environment variable:
|
|
|
|
```bash
|
|
export HINDSIGHT_API_MCP_ENABLED=false
|
|
```
|
|
|
|
## Authentication
|
|
|
|
By default, the MCP endpoint is **open** (no authentication required).
|
|
|
|
To enable authentication, configure the API key tenant extension:
|
|
|
|
```bash
|
|
export HINDSIGHT_API_TENANT_EXTENSION=hindsight_api.extensions.builtin.tenant:ApiKeyTenantExtension
|
|
export HINDSIGHT_API_TENANT_API_KEY=your-secret-key
|
|
```
|
|
|
|
When authentication is enabled, include your API key in the `Authorization` header:
|
|
|
|
### Claude Code
|
|
|
|
```bash
|
|
claude mcp add --transport http hindsight http://localhost:8888/mcp \
|
|
--header "Authorization: Bearer your-secret-key" \
|
|
--header "X-Bank-Id: my-bank"
|
|
```
|
|
|
|
### Claude Desktop
|
|
|
|
Add to `~/.claude_desktop_config.json`:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"hindsight": {
|
|
"url": "http://localhost:8888/mcp",
|
|
"headers": {
|
|
"Authorization": "Bearer your-secret-key",
|
|
"X-Bank-Id": "my-bank"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Direct HTTP Request
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8888/mcp \
|
|
-H "Authorization: Bearer your-secret-key" \
|
|
-H "X-Bank-Id: my-bank" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"jsonrpc": "2.0", "method": "tools/list", "id": 1}'
|
|
```
|
|
|
|
If the key is missing or invalid, requests will receive a `401 Unauthorized` response.
|
|
|
|
## Bank Selection
|
|
|
|
Specify the memory bank via:
|
|
|
|
1. **X-Bank-Id header** (recommended): `--header "X-Bank-Id: my-bank"`
|
|
2. **URL path**: `http://localhost:8888/mcp/my-bank/`
|
|
3. **Default**: Uses `HINDSIGHT_MCP_BANK_ID` env var (default: "default")
|
|
|
|
## Per-Bank Endpoints
|
|
|
|
Unlike traditional MCP servers where tools require explicit identifiers, Hindsight uses **per-bank endpoints**. The `bank_id` is part of the URL path, so tools don't need to specify which bank to use—it's implicit from the connection.
|
|
|
|
This design:
|
|
- **Simplifies tool usage** — no need to pass `bank_id` with every call
|
|
- **Enforces isolation** — each MCP connection is scoped to a single bank
|
|
- **Enables multi-tenant setups** — connect different users to different endpoints
|
|
|
|
---
|
|
|
|
## Available Tools
|
|
|
|
### retain
|
|
|
|
Store information to long-term memory.
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `content` | string | Yes | The fact or memory to store |
|
|
| `context` | string | No | Category for the memory (default: `general`) |
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"name": "retain",
|
|
"arguments": {
|
|
"content": "User prefers Python over JavaScript for backend development",
|
|
"context": "programming_preferences"
|
|
}
|
|
}
|
|
```
|
|
|
|
**When to use:**
|
|
- User shares personal facts, preferences, or interests
|
|
- Important events or milestones are mentioned
|
|
- Decisions, opinions, or goals are stated
|
|
- Work context or project details are discussed
|
|
|
|
---
|
|
|
|
### recall
|
|
|
|
Search memories to provide personalized responses.
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `query` | string | Yes | Natural language search query |
|
|
| `max_results` | integer | No | Maximum results to return (default: 10) |
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"name": "recall",
|
|
"arguments": {
|
|
"query": "What are the user's programming language preferences?"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"results": [
|
|
{
|
|
"id": "fact_abc123",
|
|
"text": "User prefers Python over JavaScript for backend development",
|
|
"type": "world",
|
|
"context": "programming_preferences",
|
|
"event_date": null
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**When to use:**
|
|
- Start of conversation to recall relevant context
|
|
- Before making recommendations
|
|
- When user asks about something they may have mentioned before
|
|
- To provide continuity across conversations
|
|
|
|
---
|
|
|
|
### reflect
|
|
|
|
Generate thoughtful analysis by synthesizing stored memories with the bank's personality.
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `query` | string | Yes | The question or topic to reflect on |
|
|
| `context` | string | No | Optional context about why this reflection is needed |
|
|
| `budget` | string | No | Search budget: `low`, `mid`, or `high` (default: `low`) |
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"name": "reflect",
|
|
"arguments": {
|
|
"query": "Based on my past decisions, what architectural style do I prefer?",
|
|
"budget": "mid"
|
|
}
|
|
}
|
|
```
|
|
|
|
**When to use:**
|
|
- When reasoned analysis is needed, not just fact retrieval
|
|
- Questions like "What should I do?" rather than "What did I say?"
|
|
- Synthesizing patterns across multiple memories
|
|
|
|
---
|
|
|
|
## Integration with AI Assistants
|
|
|
|
The MCP server can be used with any MCP-compatible AI assistant. See the [Authentication](#authentication) section above for Claude Code and Claude Desktop configuration examples.
|
|
|
|
Each user can have their own configuration pointing to their personal memory bank using either:
|
|
- The `X-Bank-Id` header (recommended)
|
|
- A bank-specific URL path like `/mcp/alice/`
|