{"_id":"@dn-inc/seahorse-mcp-seahorse","_rev":"9-60cd7b7f8bbf36741e5ec6dc4ac484fb","name":"@dn-inc/seahorse-mcp-seahorse","dist-tags":{"latest":"0.6.0"},"versions":{"0.2.0":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.2.0","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25","fastmcp"],"author":"","license":"MIT","_id":"@dn-inc/seahorse-mcp-seahorse@0.2.0","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"bin":{"seahorse-mcp-seahorse":"bin/cli.js"},"dist":{"shasum":"76949f556cf5cb1be3c2b168679b9f7c3f6f3359","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.2.0.tgz","fileCount":5,"integrity":"sha512-0D44nOl81FA5b6ebB9ahf7F9EhdC7ydZnuMbmPIYvHO0N6HgNjNyr94Z9uEzzNIwAHnmRrg4J1/uynhNCymWSA==","signatures":[{"sig":"MEYCIQCYmgmBtAC2k0V5ASKB6aLPusyP+eUk/KF1BrHMYxheIwIhAIBilW6jAkILa1Dfg+eX+Er0NvQ+k3DUyXMVyRHPV774","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33637},"type":"commonjs","engines":{"node":">=18"},"gitHead":"2ac7e34d696a3b41bf8a9fd8befbfe7980b4ecb7","scripts":{"pack":"npm pack","prepublishOnly":"node -e \"require('fs').chmodSync('bin/cli.js', 0o755)\""},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"_npmVersion":"11.5.1","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API)","directories":{},"_nodeVersion":"24.6.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/seahorse-mcp-seahorse_0.2.0_1765634869342_0.8241192919576934","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.2.1","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25","fastmcp"],"author":"","license":"MIT","_id":"@dn-inc/seahorse-mcp-seahorse@0.2.1","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"bin":{"seahorse-mcp-seahorse":"bin/cli.js"},"dist":{"shasum":"f92398dac496a483d1be6317acd72b2da9c5d06a","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.2.1.tgz","fileCount":5,"integrity":"sha512-8LdvxNVefA2J3U9uwirOcpcGaKZlumzFPLW6C0H8VN3hBGY6CcdIKzfdFL4jSpiG6jdMejSMejZS2XYTjcwhhQ==","signatures":[{"sig":"MEYCIQCbe64cPveE3FUOv6SsYlBJGIVwPEQ36PMxe9uYAxu5qwIhAIws8GxFP9qmBYSO25xDKv6iF1B21jCkHdBalxlehQpd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33669},"type":"commonjs","engines":{"node":">=18"},"gitHead":"2ac7e34d696a3b41bf8a9fd8befbfe7980b4ecb7","scripts":{"pack":"npm pack","prepublishOnly":"node -e \"require('fs').chmodSync('bin/cli.js', 0o755)\""},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"_npmVersion":"11.5.1","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API)","directories":{},"_nodeVersion":"24.6.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/seahorse-mcp-seahorse_0.2.1_1765634986364_0.6394566147381668","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.2.2","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25","fastmcp"],"author":"","license":"MIT","_id":"@dn-inc/seahorse-mcp-seahorse@0.2.2","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"bin":{"seahorse-mcp-seahorse":"bin/cli.js"},"dist":{"shasum":"0f36da7ba38f858c3779920d518d3de1cb010917","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.2.2.tgz","fileCount":5,"integrity":"sha512-HBhq6drpY4LeN81Yy9uSKl6SSCH7X5Qn4J1q0uylIMHCxPhzMggc3xa3kLvX02o6sLetI/avOmf517wyR4KhtA==","signatures":[{"sig":"MEQCIEfjVkW1cTVoNXvOi5VXtK+/YGvx/Hn3AsQKEQdAHRt1AiADu1s/mMtZS21gET1RbkyUy/3U38gmz5xQHhKdxvqEtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33894},"type":"commonjs","engines":{"node":">=18"},"gitHead":"2ac7e34d696a3b41bf8a9fd8befbfe7980b4ecb7","scripts":{"pack":"npm pack","prepublishOnly":"node -e \"require('fs').chmodSync('bin/cli.js', 0o755)\""},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"_npmVersion":"11.5.1","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API)","directories":{},"_nodeVersion":"24.6.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/seahorse-mcp-seahorse_0.2.2_1765635677025_0.14627872722860324","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.3.0","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25"],"author":{"name":"DN Inc."},"license":"MIT","_id":"@dn-inc/seahorse-mcp-seahorse@0.3.0","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"bin":{"seahorse-mcp-seahorse":"dist/index.js"},"dist":{"shasum":"ed33e9a1a4542f3691a4c0f034081873f37d2e7d","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.3.0.tgz","fileCount":4,"integrity":"sha512-6f9qBSYy73LmRup+nLLwrtzpPpSFFTfTi8lis1tjK/Sirc9ryt4dDWQQY5I52w9dKZQ6hA9GZbRRHkZ7tEx6XQ==","signatures":[{"sig":"MEYCIQCQBUiblF5kGcSC3Ugx/LkybFAL89DMFi/2fMNzVBAe8AIhALA2MzS5fBpB3t+QJJN9HAbXza3kSUTdeWWlY+Z2SijH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21193},"type":"module","engines":{"node":">=18"},"gitHead":"2ac7e34d696a3b41bf8a9fd8befbfe7980b4ecb7","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"_npmVersion":"11.5.1","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API)","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seahorse-mcp-seahorse_0.3.0_1765635987736_0.43046006705354434","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.3.1","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25"],"author":{"name":"DN Inc."},"license":"MIT","_id":"@dn-inc/seahorse-mcp-seahorse@0.3.1","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"bin":{"seahorse-mcp-seahorse":"dist/index.js"},"dist":{"shasum":"d921f2918de02b056459159d085bb32bade29407","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.3.1.tgz","fileCount":4,"integrity":"sha512-yhgotb5nmH554vNNoOSzJP79kPs1G/4+2Doe0hziSCntEmPZg3hOrHU6ojIm4vJf+5yAbStFX36bRcPZ+ZCFEA==","signatures":[{"sig":"MEUCIQC1zcfjcrxMybYawFTGo6YnLXwrwYfx0iAZF9FCslzRQAIgHA5tuJWEq2jyeRV/N5Pt6WfAXDyWohmjdayx7G5h8Ks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22197},"type":"module","engines":{"node":">=18"},"gitHead":"2ac7e34d696a3b41bf8a9fd8befbfe7980b4ecb7","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"_npmVersion":"11.5.1","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API)","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seahorse-mcp-seahorse_0.3.1_1765636582724_0.07684964994538612","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.3.2","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25"],"author":{"name":"DN Inc."},"license":"MIT","_id":"@dn-inc/seahorse-mcp-seahorse@0.3.2","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"bin":{"seahorse-mcp-seahorse":"dist/index.js"},"dist":{"shasum":"ea9ec44c56d06723732f643fad1c112454fea24b","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.3.2.tgz","fileCount":4,"integrity":"sha512-BDIdv+MhS7xqv2eN32y2/zR3s6vujq9geQqmJLF3uSWf4YbClVFTvKeBQy7y2DF6y0wYg2f9Z2IlmvHjZbltRg==","signatures":[{"sig":"MEUCIQDkkHJks+ZujZcCFZ7POrZa386zIRQ+HCWo5KMWsU5P5AIgYjXJwwbyPrDJOCsjsuhKL4kFY9NQhKDS3k+mZ6c6mD8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22246},"type":"module","engines":{"node":">=18"},"gitHead":"2ac7e34d696a3b41bf8a9fd8befbfe7980b4ecb7","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"_npmVersion":"11.5.1","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API)","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seahorse-mcp-seahorse_0.3.2_1765636709219_0.1392091906311259","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.4.0","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25"],"author":{"name":"DN Inc."},"license":"MIT","_id":"@dn-inc/seahorse-mcp-seahorse@0.4.0","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"bin":{"seahorse-mcp-seahorse":"dist/index.js"},"dist":{"shasum":"8c80bd60c3488fc60feb9a5eb6e7d8ce950fad76","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.4.0.tgz","fileCount":4,"integrity":"sha512-uPiexW2lI/TuPSgYQkO0doY+Hf2tq8+/SOAvNI5KbTxSob7I37fp5dLJ2gjZpTsHJedIsrWyPfj4gpUYwsm7ww==","signatures":[{"sig":"MEUCIHyKL4VYfwlTymdS0PycAbQ8OgeMI8/rfaOOIKxNNgxYAiEAk08iugIS2DWvu8jhV9TGFPay+yOfTK5+9UGrD/4VTNw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23516},"type":"module","engines":{"node":">=18"},"gitHead":"c41045d513282621410883fd636240248cf3a8a6","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"_npmVersion":"11.5.1","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API)","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seahorse-mcp-seahorse_0.4.0_1765638522143_0.9857133461362513","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.5.0","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25"],"author":{"name":"DN Inc."},"license":"MIT","_id":"@dn-inc/seahorse-mcp-seahorse@0.5.0","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"bin":{"seahorse-mcp-seahorse":"dist/index.js"},"dist":{"shasum":"3ba9250524124f278169fc9f4e4fe6721aafc18f","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.5.0.tgz","fileCount":4,"integrity":"sha512-iYbtN80G1QvNsbCOO8juZEzIiHqnL82P/cLP5zE8iy+Nxp8tTOYATmD+lZhMGlK4B9Swv4MighCMDo5iUgHouw==","signatures":[{"sig":"MEUCIQD9wnSilIOH/b4U253syH2VGuMUlqDRvQxY4a+528aciAIgcZSH/Vt7oM9qnaKWeGwPdH610r6erzNNucyCQ+LIA3w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28592},"type":"module","engines":{"node":">=18"},"gitHead":"ed70e8f83889e27c4f10bf3c8a35aa038518d60d","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"_npmVersion":"11.5.1","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API)","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seahorse-mcp-seahorse_0.5.0_1765639675900_0.07661628624141748","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@dn-inc/seahorse-mcp-seahorse","version":"0.6.0","description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API, optional Cohere/OpenRouter reranking)","type":"module","bin":{"seahorse-mcp-seahorse":"dist/index.js"},"keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25"],"author":{"name":"DN Inc."},"license":"MIT","engines":{"node":">=18"},"scripts":{"build":"tsc","prepublishOnly":"npm run build"},"dependencies":{"@modelcontextprotocol/sdk":"^1.0.0"},"devDependencies":{"@types/node":"^20.0.0","typescript":"^5.0.0"},"publishConfig":{"access":"public"},"_id":"@dn-inc/seahorse-mcp-seahorse@0.6.0","gitHead":"af8b1aa1daf45942c377f4013bb3947673db95d1","_nodeVersion":"24.6.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-T9yq8CVEaP4MLqRGaFlq+p54n4SRWELIuqOgWLnk5GnyP75crOTuU1M/rX22nr/rkZIwFa2q/jFjwke9HY8QGQ==","shasum":"c199f7afbfa304f19ce52022478ea5aeccfb4f21","tarball":"https://registry.npmjs.org/@dn-inc/seahorse-mcp-seahorse/-/seahorse-mcp-seahorse-0.6.0.tgz","fileCount":4,"unpackedSize":39145,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBv9dlQfm2xUeDbMpdu58wm1uECYkGl0/ndvgEEOlnbQAiApZBS7tgpX01uRY9rgBxGeMwm3fZXaU02R7sBVXyQhjw=="}]},"_npmUser":{"name":"dnotitia","email":"support@dnotitia.com"},"directories":{},"maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/seahorse-mcp-seahorse_0.6.0_1776968687227_0.5386116559476157"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-13T14:07:49.223Z","modified":"2026-04-23T18:24:47.537Z","0.2.0":"2025-12-13T14:07:49.503Z","0.2.1":"2025-12-13T14:09:46.512Z","0.2.2":"2025-12-13T14:21:17.190Z","0.3.0":"2025-12-13T14:26:27.895Z","0.3.1":"2025-12-13T14:36:22.937Z","0.3.2":"2025-12-13T14:38:29.359Z","0.4.0":"2025-12-13T15:08:42.304Z","0.5.0":"2025-12-13T15:27:56.073Z","0.6.0":"2026-04-23T18:24:47.382Z"},"author":{"name":"DN Inc."},"license":"MIT","keywords":["mcp","claude","seahorse","semantic-search","hybrid-search","vector-search","bm25"],"description":"Seahorse Hybrid Search MCP server (dense/sparse/hybrid search with v2 API, optional Cohere/OpenRouter reranking)","maintainers":[{"name":"dnotitia","email":"support@dnotitia.com"}],"readme":"# Seahorse MCP Hybrid Search Server (npx)\n\nRun the Seahorse Hybrid Search MCP server anywhere via npx. This package wraps a Python FastMCP server and bootstraps a local Python virtual environment on first run.\n\n## Features\n\n- **v2 API Support**: Uses the new `POST /v2/data/search` endpoint\n- **Search Modes**:\n  - `dense`: Semantic vector search using BGE-M3 embeddings\n  - `sparse`: Keyword search using BM25 tokenization\n  - `hybrid`: RRF (Reciprocal Rank Fusion) of dense and sparse results\n- **Auto-embedding**: Natural language queries are automatically converted to embeddings server-side\n- **Adjacent Chunks**: Retrieve previous/next chunks for context expansion\n\n## Install and Run\n\n```bash\nnpx @dn-inc/seahorse-mcp-seahorse --api-url https://YOUR_TABLE_ID.api.seahorse.dnotitia.com --api-key YOUR_API_KEY\n```\n\n### Options\n\n| Flag | Environment Variable | Description |\n|------|---------------------|-------------|\n| `--api-url` | `SEAHORSE_API_URL` | Seahorse API base URL (required) |\n| `--api-key` | `SEAHORSE_API_KEY` | Seahorse API key (required) |\n| `--verify-ssl` | `SEAHORSE_VERIFY_SSL` | Verify SSL certificates (default: false) |\n| `--tool-desc` | `TOOL_DESC` | Knowledge-domain description surfaced in the `search` tool description |\n| `--reranker-url` | `RERANKER_URL` | Reranker endpoint (Cohere/OpenRouter-compatible). Rerank is **off** unless both URL and model are set |\n| `--reranker-api-key` | `RERANKER_API_KEY` | Reranker Bearer token (optional; required by OpenRouter) |\n| `--reranker-model` | `RERANKER_MODEL` | Reranker model id, e.g. `cohere/rerank-4-fast` |\n| `--rerank-multiplier` | `RERANK_MULTIPLIER` | Candidate over-fetch factor (default: 3, capped at Seahorse `top_k` max of 20) |\n\n### Reranking\n\nWhen `RERANKER_URL` + `RERANKER_MODEL` are both configured, `search` over-fetches\n`min(20, top_k × RERANK_MULTIPLIER)` candidates from Seahorse, reranks them with\nthe external reranker, and returns the top `top_k` by relevance score. If the\nreranker is unreachable, the original ranking is returned instead (search stays\navailable). Rerank status is surfaced in `debug_info.rerank`.\n\nTested OpenRouter models (`POST https://openrouter.ai/api/v1/rerank`):\n\n| Model | Latency* | Price | Notes |\n|-------|----------|-------|-------|\n| `cohere/rerank-4-fast` | ~0.7s | $0.002/search | Balanced |\n| `cohere/rerank-4-pro` | ~0.5s | $0.0025/search | Highest confidence scores |\n| `cohere/rerank-v3.5` | ~0.7s | $0.001/search | Cheapest, conservative scoring |\n\n\\* 8-document Korean query in ad-hoc testing; not a benchmark.\n\n### Quick Install (Claude Desktop)\n\n```bash\nnpx @dn-inc/seahorse-mcp-seahorse install \\\n  --api-url https://YOUR_TABLE_ID.api.seahorse.dnotitia.com \\\n  --api-key YOUR_API_KEY\n```\n\nThis automatically adds the server to your Claude Desktop configuration.\n\n## Available Tools\n\n### `search`\n\nPerform hybrid search with automatic embedding generation.\n\n**Parameters:**\n- `query` (string, required): Natural language search query\n- `search_mode` (string): \"dense\" | \"sparse\" | \"hybrid\" (default: \"hybrid\")\n- `top_k` (int): Number of results (default: 3, max: 20)\n- `metadata_filter` (string): Filter by metadata content\n- `filter` (string): SQL WHERE clause for advanced filtering\n- `ef_search` (int): HNSW ef_search parameter (default: 150)\n- `rrf_k` (int): RRF k parameter for hybrid fusion (default: 60)\n\n**Example:**\n```json\n{\n  \"query\": \"machine learning algorithms\",\n  \"search_mode\": \"hybrid\",\n  \"top_k\": 5,\n  \"metadata_filter\": \"research-paper\"\n}\n```\n\n### `get_adjacent_chunks`\n\nRetrieve previous and next chunks for context expansion.\n\n**Parameters:**\n- `document_id` (string, required): Document identifier from search results\n- `chunk_sequence` (string, required): Chunk sequence number (e.g., \"0151\")\n\n## MCP Client Configuration\n\n### Claude Desktop\n\nAdd to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"seahorse-hybrid-search\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@dn-inc/seahorse-mcp-seahorse\"],\n      \"env\": {\n        \"SEAHORSE_API_URL\": \"https://YOUR_TABLE_ID.api.seahorse.dnotitia.com\",\n        \"SEAHORSE_API_KEY\": \"YOUR_API_KEY\"\n      }\n    }\n  }\n}\n```\n\n### Custom MCP Clients\n\nPoint your MCP client to run this command and connect via stdio. No host/port configuration needed.\n\n## How It Works\n\n1. Creates `.seahorse-mcp-venv` in your OS cache directory for isolation\n2. Installs minimal Python dependencies (fastmcp, requests, urllib3)\n3. Launches `seahorse_mcp_hybrid_search.py` as a stdio MCP server\n\n## API Details\n\nThis server uses the Seahorse v2 API:\n\n- **Endpoint**: `POST {api_url}/v2/data/search`\n- **Scan Endpoint**: `POST {api_url}/v2/data/scan` (for adjacent chunks)\n- **Schema**: `GET {api_url}/v1/data/schema`\n\n### Search Request Format\n\n```json\n{\n  \"top_k\": 5,\n  \"search_mode\": \"hybrid\",\n  \"dense\": {\n    \"column\": \"dense_vector\",\n    \"text\": [\"your query here\"],\n    \"parameters\": { \"ef_search\": 150 }\n  },\n  \"sparse\": {\n    \"column\": \"sparse_vector\",\n    \"text\": [\"your query here\"],\n    \"parameters\": { \"k\": 1.2, \"b\": 0.75 }\n  },\n  \"fusion\": {\n    \"type\": \"rrf\",\n    \"parameters\": { \"k\": 60 }\n  },\n  \"projection\": \"id, text, metadata\"\n}\n```\n\n## Requirements\n\n- Node.js >= 18\n- Python 3.8+\n\n## License\n\nMIT\n","readmeFilename":"README.md"}