@mhalder/qdrant-mcp-server 3.1.2 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dagger/.gitattributes +1 -0
- package/.dagger/package.json +6 -0
- package/.dagger/src/index.ts +83 -0
- package/.dagger/tsconfig.json +13 -0
- package/.dagger/yarn.lock +8 -0
- package/.github/workflows/ci.yml +17 -27
- package/.github/workflows/release.yml +16 -19
- package/CHANGELOG.md +18 -0
- package/CONTRIBUTING.md +28 -130
- package/README.md +63 -31
- package/build/tools/federated.d.ts +96 -0
- package/build/tools/federated.d.ts.map +1 -0
- package/build/tools/federated.js +375 -0
- package/build/tools/federated.js.map +1 -0
- package/build/tools/federated.test.d.ts +2 -0
- package/build/tools/federated.test.d.ts.map +1 -0
- package/build/tools/federated.test.js +592 -0
- package/build/tools/federated.test.js.map +1 -0
- package/build/tools/index.d.ts.map +1 -1
- package/build/tools/index.js +5 -0
- package/build/tools/index.js.map +1 -1
- package/build/tools/schemas.d.ts +13 -0
- package/build/tools/schemas.d.ts.map +1 -1
- package/build/tools/schemas.js +35 -0
- package/build/tools/schemas.js.map +1 -1
- package/dagger.json +8 -0
- package/examples/README.md +32 -0
- package/examples/advanced-search/README.md +348 -0
- package/package.json +1 -1
- package/prompts.example.json +102 -0
- package/src/tools/federated.test.ts +752 -0
- package/src/tools/federated.ts +569 -0
- package/src/tools/index.ts +6 -0
- package/src/tools/schemas.ts +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/sdk/** linguist-generated
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {
|
|
2
|
+
dag,
|
|
3
|
+
Container,
|
|
4
|
+
Directory,
|
|
5
|
+
object,
|
|
6
|
+
func,
|
|
7
|
+
argument,
|
|
8
|
+
} from "@dagger.io/dagger"
|
|
9
|
+
|
|
10
|
+
const SUPPORTED_NODE_VERSIONS = ["22", "24"]
|
|
11
|
+
|
|
12
|
+
@object()
|
|
13
|
+
export class Ci {
|
|
14
|
+
private base(source: Directory, nodeVersion: string): Container {
|
|
15
|
+
if (!SUPPORTED_NODE_VERSIONS.includes(nodeVersion)) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
`Unsupported Node version "${nodeVersion}". Must be one of: ${SUPPORTED_NODE_VERSIONS.join(", ")}`,
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let ctr = dag
|
|
22
|
+
.container()
|
|
23
|
+
.from(`node:${nodeVersion}-slim`)
|
|
24
|
+
.withExec(["apt-get", "update"])
|
|
25
|
+
.withExec([
|
|
26
|
+
"apt-get",
|
|
27
|
+
"install",
|
|
28
|
+
"-y",
|
|
29
|
+
"--no-install-recommends",
|
|
30
|
+
"python3",
|
|
31
|
+
"make",
|
|
32
|
+
"g++",
|
|
33
|
+
"git",
|
|
34
|
+
])
|
|
35
|
+
.withMountedDirectory("/app", source)
|
|
36
|
+
.withWorkdir("/app")
|
|
37
|
+
// Dagger context directories exclude .git dirs but may include
|
|
38
|
+
// a .git worktree file pointing to a host path. Remove it and
|
|
39
|
+
// init a fresh repo so integration tests pass.
|
|
40
|
+
.withExec(["rm", "-rf", ".git"])
|
|
41
|
+
.withExec(["git", "init"])
|
|
42
|
+
.withExec(["git", "config", "user.email", "ci@dagger"])
|
|
43
|
+
.withExec(["git", "config", "user.name", "CI"])
|
|
44
|
+
.withExec(["git", "add", "."])
|
|
45
|
+
.withExec(["git", "commit", "-m", "init", "--allow-empty"])
|
|
46
|
+
|
|
47
|
+
if (nodeVersion.startsWith("24")) {
|
|
48
|
+
ctr = ctr.withEnvVariable("CXXFLAGS", "-std=c++20")
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return ctr.withExec(["npm", "ci"])
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@func()
|
|
55
|
+
check(
|
|
56
|
+
@argument({ defaultPath: "/" }) source: Directory,
|
|
57
|
+
nodeVersion: string = "22",
|
|
58
|
+
): Container {
|
|
59
|
+
return this.base(source, nodeVersion)
|
|
60
|
+
.withExec(["npm", "run", "type-check"])
|
|
61
|
+
.withExec(["npm", "run", "build"])
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@func()
|
|
65
|
+
async test(
|
|
66
|
+
@argument({ defaultPath: "/" }) source: Directory,
|
|
67
|
+
nodeVersion: string = "22",
|
|
68
|
+
): Promise<Directory> {
|
|
69
|
+
return this.check(source, nodeVersion)
|
|
70
|
+
.withExec(["npm", "run", "test:coverage"])
|
|
71
|
+
.withExec(["npm", "run", "test:providers"])
|
|
72
|
+
.directory("/app/coverage")
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@func()
|
|
76
|
+
async testAll(
|
|
77
|
+
@argument({ defaultPath: "/" }) source: Directory,
|
|
78
|
+
): Promise<string> {
|
|
79
|
+
const versions = ["22", "24"]
|
|
80
|
+
await Promise.all(versions.map((v) => this.test(source, v)))
|
|
81
|
+
return `All tests passed on Node ${versions.join(", ")}`
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"moduleResolution": "Node",
|
|
5
|
+
"experimentalDecorators": true,
|
|
6
|
+
"strict": true,
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"paths": {
|
|
9
|
+
"@dagger.io/dagger": ["./sdk/index.ts"],
|
|
10
|
+
"@dagger.io/dagger/telemetry": ["./sdk/telemetry.ts"]
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
2
|
+
# yarn lockfile v1
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
typescript@5.9.3:
|
|
6
|
+
version "5.9.3"
|
|
7
|
+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
|
|
8
|
+
integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -7,43 +7,33 @@ on:
|
|
|
7
7
|
branches: [main]
|
|
8
8
|
|
|
9
9
|
jobs:
|
|
10
|
-
|
|
11
|
-
name:
|
|
10
|
+
test:
|
|
11
|
+
name: Test (Node ${{ matrix.node-version }})
|
|
12
12
|
runs-on: ubuntu-latest
|
|
13
|
-
|
|
14
13
|
strategy:
|
|
15
14
|
matrix:
|
|
16
|
-
node-version: [22
|
|
15
|
+
node-version: ["22", "24"]
|
|
17
16
|
|
|
18
17
|
steps:
|
|
19
|
-
-
|
|
20
|
-
uses: actions/checkout@v4
|
|
18
|
+
- uses: actions/checkout@v4
|
|
21
19
|
|
|
22
|
-
- name:
|
|
23
|
-
uses:
|
|
20
|
+
- name: Run tests via Dagger
|
|
21
|
+
uses: dagger/dagger-for-github@v7
|
|
24
22
|
with:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
- name: Install dependencies
|
|
29
|
-
run: npm ci
|
|
30
|
-
env:
|
|
31
|
-
# Node 24 requires C++20 for native modules
|
|
32
|
-
CXXFLAGS: ${{ matrix.node-version == '24.x' && '-std=c++20' || '' }}
|
|
33
|
-
|
|
34
|
-
- name: Type check
|
|
35
|
-
run: npm run type-check
|
|
23
|
+
verb: call
|
|
24
|
+
args: test --source=. --node-version=${{ matrix.node-version }}
|
|
25
|
+
version: "0.19.10"
|
|
36
26
|
|
|
37
|
-
- name:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
run: npm run test:providers
|
|
27
|
+
- name: Export coverage
|
|
28
|
+
if: matrix.node-version == '22'
|
|
29
|
+
uses: dagger/dagger-for-github@v7
|
|
30
|
+
with:
|
|
31
|
+
verb: call
|
|
32
|
+
args: test --source=. --node-version=22 export --path=./coverage
|
|
33
|
+
version: "0.19.10"
|
|
45
34
|
|
|
46
35
|
- name: Upload coverage to Codecov
|
|
36
|
+
if: matrix.node-version == '22'
|
|
47
37
|
uses: codecov/codecov-action@v4
|
|
48
38
|
continue-on-error: true
|
|
49
39
|
with:
|
|
@@ -18,32 +18,29 @@ jobs:
|
|
|
18
18
|
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
|
19
19
|
|
|
20
20
|
steps:
|
|
21
|
-
-
|
|
22
|
-
uses: actions/checkout@v4
|
|
21
|
+
- uses: actions/checkout@v4
|
|
23
22
|
with:
|
|
24
23
|
fetch-depth: 0
|
|
25
24
|
persist-credentials: false
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
# Dagger gate: type-check + build validation
|
|
27
|
+
- name: Check via Dagger
|
|
28
|
+
uses: dagger/dagger-for-github@v7
|
|
29
29
|
with:
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
verb: call
|
|
31
|
+
args: check --source=. --node-version=22
|
|
32
|
+
version: "0.19.10"
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- name: Build project
|
|
40
|
-
run: npm run build
|
|
41
|
-
|
|
42
|
-
- name: Run tests
|
|
43
|
-
run: npm test -- --run
|
|
34
|
+
# Native release (needs OIDC token for npm provenance)
|
|
35
|
+
- uses: actions/setup-node@v4
|
|
36
|
+
with:
|
|
37
|
+
node-version: "22.x"
|
|
38
|
+
cache: "npm"
|
|
44
39
|
|
|
45
|
-
-
|
|
46
|
-
|
|
40
|
+
- run: npm ci
|
|
41
|
+
- run: npm run build
|
|
42
|
+
- run: npm test -- --run
|
|
43
|
+
- run: npm run test:providers
|
|
47
44
|
|
|
48
45
|
- name: Release
|
|
49
46
|
env:
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
## <small>3.2.1 (2026-01-30)</small>
|
|
2
|
+
|
|
3
|
+
* Merge pull request #52 from mhalder/feat/dagger ([da115bb](https://github.com/mhalder/qdrant-mcp-server/commit/da115bb)), closes [#52](https://github.com/mhalder/qdrant-mcp-server/issues/52)
|
|
4
|
+
* fix(dagger): validate node version and pin engine version ([61625b9](https://github.com/mhalder/qdrant-mcp-server/commit/61625b9))
|
|
5
|
+
* style(dagger): reformat package.json ([c22ca40](https://github.com/mhalder/qdrant-mcp-server/commit/c22ca40))
|
|
6
|
+
* ci(dagger): replace GHA CI with Dagger TypeScript module ([d79a77e](https://github.com/mhalder/qdrant-mcp-server/commit/d79a77e))
|
|
7
|
+
|
|
8
|
+
## 3.2.0 (2026-01-24)
|
|
9
|
+
|
|
10
|
+
* Merge pull request #51 from mhalder/feat/advanced-search ([e99311b](https://github.com/mhalder/qdrant-mcp-server/commit/e99311b)), closes [#51](https://github.com/mhalder/qdrant-mcp-server/issues/51)
|
|
11
|
+
* fix(federated): rank within repo+type groups for fair RRF interleaving ([958411a](https://github.com/mhalder/qdrant-mcp-server/commit/958411a))
|
|
12
|
+
* fix(federated): use segment comparison for path matching ([9de2b85](https://github.com/mhalder/qdrant-mcp-server/commit/9de2b85))
|
|
13
|
+
* docs(contributing): simplify and remove redundancy ([393a918](https://github.com/mhalder/qdrant-mcp-server/commit/393a918))
|
|
14
|
+
* docs(readme): fix Claude Code MCP config path and format ([4c338f0](https://github.com/mhalder/qdrant-mcp-server/commit/4c338f0))
|
|
15
|
+
* docs(readme): simplify quick start config and add usage examples ([e3a8978](https://github.com/mhalder/qdrant-mcp-server/commit/e3a8978))
|
|
16
|
+
* feat(tools): add contextual and federated search tools ([48d880e](https://github.com/mhalder/qdrant-mcp-server/commit/48d880e))
|
|
17
|
+
* chore(prompts): add git indexing prompt templates ([38607a8](https://github.com/mhalder/qdrant-mcp-server/commit/38607a8))
|
|
18
|
+
|
|
1
19
|
## <small>3.1.2 (2026-01-23)</small>
|
|
2
20
|
|
|
3
21
|
* Merge pull request #50 from mhalder/fix/pathpattern-filter ([b12517f](https://github.com/mhalder/qdrant-mcp-server/commit/b12517f)), closes [#50](https://github.com/mhalder/qdrant-mcp-server/issues/50)
|
package/CONTRIBUTING.md
CHANGED
|
@@ -2,171 +2,69 @@
|
|
|
2
2
|
|
|
3
3
|
Thank you for your interest in contributing!
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Quick Start
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
#
|
|
8
|
+
# Fork and clone
|
|
9
9
|
git clone https://github.com/YOUR_USERNAME/qdrant-mcp-server.git
|
|
10
10
|
cd qdrant-mcp-server
|
|
11
11
|
npm install
|
|
12
12
|
|
|
13
|
-
#
|
|
13
|
+
# Create feature branch
|
|
14
14
|
git checkout -b feat/your-feature-name
|
|
15
15
|
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
-
# 4. Verify
|
|
16
|
+
# Make changes, then verify
|
|
19
17
|
npm test -- --run
|
|
20
18
|
npm run type-check
|
|
21
19
|
npm run build
|
|
22
20
|
|
|
23
|
-
#
|
|
21
|
+
# Commit with conventional format
|
|
24
22
|
git commit -m "feat: add new feature"
|
|
25
23
|
```
|
|
26
24
|
|
|
27
25
|
## Development Commands
|
|
28
26
|
|
|
29
|
-
| Command
|
|
30
|
-
|
|
|
31
|
-
| `npm run build`
|
|
32
|
-
| `npm run dev`
|
|
33
|
-
| `npm test`
|
|
34
|
-
| `npm run test:
|
|
35
|
-
| `npm run
|
|
36
|
-
| `npm run test:providers` | Provider verification |
|
|
37
|
-
| `npm run type-check` | TypeScript validation |
|
|
27
|
+
| Command | Purpose |
|
|
28
|
+
| ----------------------- | -------------------- |
|
|
29
|
+
| `npm run build` | Build for production |
|
|
30
|
+
| `npm run dev` | Dev with auto-reload |
|
|
31
|
+
| `npm test` | Run test suite |
|
|
32
|
+
| `npm run test:coverage` | Coverage report |
|
|
33
|
+
| `npm run type-check` | TypeScript check |
|
|
38
34
|
|
|
39
35
|
## Commit Convention
|
|
40
36
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
### Format
|
|
37
|
+
Use [Conventional Commits](https://www.conventionalcommits.org/):
|
|
44
38
|
|
|
45
39
|
```
|
|
46
40
|
<type>(<scope>): <subject>
|
|
47
|
-
|
|
48
|
-
<body>
|
|
49
|
-
|
|
50
|
-
<footer>
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Types
|
|
54
|
-
|
|
55
|
-
| Type | Description | Version Bump |
|
|
56
|
-
| ---------- | ----------------------- | ------------- |
|
|
57
|
-
| `feat` | New feature | Minor (1.x.0) |
|
|
58
|
-
| `fix` | Bug fix | Patch (1.0.x) |
|
|
59
|
-
| `docs` | Documentation | Patch |
|
|
60
|
-
| `refactor` | Code refactoring | Patch |
|
|
61
|
-
| `perf` | Performance improvement | Patch |
|
|
62
|
-
| `test` | Adding/updating tests | None |
|
|
63
|
-
| `chore` | Build/dependencies | None |
|
|
64
|
-
| `ci` | CI/CD changes | None |
|
|
65
|
-
| `style` | Code style/formatting | None |
|
|
66
|
-
|
|
67
|
-
### Breaking Changes
|
|
68
|
-
|
|
69
|
-
Add `BREAKING CHANGE:` in body/footer or append `!` after type:
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
feat!: remove Node 16 support
|
|
73
|
-
|
|
74
|
-
BREAKING CHANGE: Node 16 is no longer supported
|
|
75
41
|
```
|
|
76
42
|
|
|
77
|
-
|
|
43
|
+
**Types:** `feat`, `fix`, `docs`, `refactor`, `perf`, `test`, `chore`, `ci`
|
|
78
44
|
|
|
79
|
-
|
|
45
|
+
**Examples:**
|
|
80
46
|
|
|
81
47
|
```bash
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
fix(search): correct similarity score calculation
|
|
87
|
-
|
|
88
|
-
# Documentation
|
|
89
|
-
docs: update installation instructions
|
|
90
|
-
|
|
91
|
-
# Breaking change
|
|
92
|
-
feat!: change collection schema format
|
|
48
|
+
feat(embeddings): add new provider
|
|
49
|
+
fix(search): correct score calculation
|
|
50
|
+
docs: update installation guide
|
|
51
|
+
feat!: breaking change (major version bump)
|
|
93
52
|
```
|
|
94
53
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
Commitlint enforces:
|
|
54
|
+
## Pull Requests
|
|
98
55
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- Subject must not start with uppercase
|
|
56
|
+
1. Add tests for changes
|
|
57
|
+
2. Update docs if needed
|
|
58
|
+
3. Pass CI checks (build, type-check, tests)
|
|
59
|
+
4. Use conventional commit format for PR title
|
|
104
60
|
|
|
105
|
-
##
|
|
61
|
+
## Releases
|
|
106
62
|
|
|
107
|
-
|
|
108
|
-
2. **Add tests** for changes
|
|
109
|
-
3. **Pass CI checks** (build, type-check, tests)
|
|
110
|
-
4. **Request review**
|
|
111
|
-
5. **Merge** after approval
|
|
112
|
-
|
|
113
|
-
### PR Title
|
|
114
|
-
|
|
115
|
-
Use conventional commit format:
|
|
116
|
-
|
|
117
|
-
```
|
|
118
|
-
feat: add new search feature
|
|
119
|
-
fix: resolve connection timeout
|
|
120
|
-
docs: improve setup documentation
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## Release Process
|
|
124
|
-
|
|
125
|
-
Automated via [semantic-release](https://semantic-release.gitbook.io/):
|
|
126
|
-
|
|
127
|
-
- Releases on merge to `main`
|
|
128
|
-
- Version follows [Semantic Versioning](https://semver.org/)
|
|
129
|
-
- Changelog auto-generated from commits
|
|
130
|
-
- Packages published to npm
|
|
131
|
-
|
|
132
|
-
### Version Bumps
|
|
63
|
+
Automated via [semantic-release](https://semantic-release.gitbook.io/) on merge to `main`:
|
|
133
64
|
|
|
134
65
|
- `feat` → minor (1.x.0)
|
|
135
|
-
- `fix`, `
|
|
136
|
-
- `BREAKING CHANGE` → major (x.0.0)
|
|
137
|
-
|
|
138
|
-
## Testing
|
|
139
|
-
|
|
140
|
-
- Write tests for all new features and bug fixes
|
|
141
|
-
- Maintain or improve code coverage
|
|
142
|
-
- Run full test suite before submitting PRs
|
|
143
|
-
- Include both unit and integration tests
|
|
144
|
-
|
|
145
|
-
## Project Structure
|
|
146
|
-
|
|
147
|
-
```
|
|
148
|
-
qdrant-mcp-server/
|
|
149
|
-
├── src/ # Source code
|
|
150
|
-
│ ├── code/ # Code indexing and vectorization
|
|
151
|
-
│ │ ├── chunker/ # AST-aware code chunking
|
|
152
|
-
│ │ └── sync/ # File synchronization with Merkle trees
|
|
153
|
-
│ ├── embeddings/ # Embedding providers (Ollama, OpenAI, Cohere, Voyage)
|
|
154
|
-
│ ├── prompts/ # MCP prompt templates and registration
|
|
155
|
-
│ ├── qdrant/ # Qdrant vector database client
|
|
156
|
-
│ ├── resources/ # MCP resource definitions
|
|
157
|
-
│ └── tools/ # MCP tool implementations
|
|
158
|
-
│ ├── code.ts # Code indexing tools
|
|
159
|
-
│ ├── collection.ts # Collection management
|
|
160
|
-
│ ├── document.ts # Document operations
|
|
161
|
-
│ ├── search.ts # Search tools (semantic + hybrid)
|
|
162
|
-
│ ├── schemas.ts # Zod validation schemas
|
|
163
|
-
│ └── index.ts # Tool registration orchestrator
|
|
164
|
-
├── build/ # Compiled output
|
|
165
|
-
├── examples/ # Usage examples
|
|
166
|
-
├── scripts/ # Utility scripts
|
|
167
|
-
├── .github/ # GitHub Actions workflows
|
|
168
|
-
└── .husky/ # Git hooks
|
|
169
|
-
```
|
|
66
|
+
- `fix`, `docs`, `refactor`, `perf` → patch (1.0.x)
|
|
67
|
+
- `BREAKING CHANGE` or `!` → major (x.0.0)
|
|
170
68
|
|
|
171
69
|
## Questions?
|
|
172
70
|
|
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ A Model Context Protocol (MCP) server providing semantic search capabilities usi
|
|
|
11
11
|
- **Privacy-First**: Local embeddings and vector storage - data never leaves your machine
|
|
12
12
|
- **Code Vectorization**: Intelligent codebase indexing with AST-aware chunking and semantic code search
|
|
13
13
|
- **Git History Search**: Index commit history for semantic search over past changes, fixes, and patterns
|
|
14
|
+
- **Advanced Search**: Contextual search (code + git with correlations) and federated search across multiple repositories
|
|
14
15
|
- **Multiple Providers**: Ollama (default), OpenAI, Cohere, and Voyage AI
|
|
15
16
|
- **Hybrid Search**: Combine semantic and keyword search for better results
|
|
16
17
|
- **Semantic Search**: Natural language search with metadata filtering
|
|
@@ -57,42 +58,33 @@ npm run build
|
|
|
57
58
|
|
|
58
59
|
#### Local Setup (stdio transport)
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
```bash
|
|
62
|
+
claude mcp add --transport stdio qdrant -- node /path/to/qdrant-mcp-server/build/index.js
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Or add to `~/.claude.json`:
|
|
61
66
|
|
|
62
67
|
```json
|
|
63
68
|
{
|
|
64
69
|
"mcpServers": {
|
|
65
70
|
"qdrant": {
|
|
71
|
+
"type": "stdio",
|
|
66
72
|
"command": "node",
|
|
67
|
-
"args": ["/path/to/qdrant-mcp-server/build/index.js"]
|
|
68
|
-
"env": {
|
|
69
|
-
"QDRANT_URL": "http://localhost:6333",
|
|
70
|
-
"EMBEDDING_BASE_URL": "http://localhost:11434"
|
|
71
|
-
}
|
|
73
|
+
"args": ["/path/to/qdrant-mcp-server/build/index.js"]
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
77
|
```
|
|
76
78
|
|
|
77
|
-
|
|
79
|
+
For Qdrant Cloud or secured instances, add `--env QDRANT_API_KEY=your-key` or set in env config.
|
|
78
80
|
|
|
79
|
-
|
|
81
|
+
**Try it:**
|
|
80
82
|
|
|
81
|
-
```json
|
|
82
|
-
{
|
|
83
|
-
"mcpServers": {
|
|
84
|
-
"qdrant": {
|
|
85
|
-
"command": "node",
|
|
86
|
-
"args": ["/path/to/qdrant-mcp-server/build/index.js"],
|
|
87
|
-
"env": {
|
|
88
|
-
"QDRANT_URL": "https://your-cluster.qdrant.io:6333",
|
|
89
|
-
"QDRANT_API_KEY": "your-api-key-here",
|
|
90
|
-
"EMBEDDING_BASE_URL": "http://localhost:11434"
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
83
|
```
|
|
84
|
+
Create a collection called "notes" and add a document about machine learning
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Enable example prompts:** Copy `prompts.example.json` to `prompts.json` and restart. Use `/prompt` to list available prompts.
|
|
96
88
|
|
|
97
89
|
#### Remote Setup (HTTP transport)
|
|
98
90
|
|
|
@@ -111,12 +103,19 @@ For Qdrant Cloud or self-hosted instances with API key authentication:
|
|
|
111
103
|
TRANSPORT_MODE=http HTTP_PORT=3000 node build/index.js
|
|
112
104
|
```
|
|
113
105
|
|
|
114
|
-
**
|
|
106
|
+
**Option 1: Using `claude mcp add`**
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
claude mcp add --transport http qdrant http://your-server:3000/mcp
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Option 2: Add to `~/.claude.json`**
|
|
115
113
|
|
|
116
114
|
```json
|
|
117
115
|
{
|
|
118
116
|
"mcpServers": {
|
|
119
117
|
"qdrant": {
|
|
118
|
+
"type": "http",
|
|
120
119
|
"url": "http://your-server:3000/mcp"
|
|
121
120
|
}
|
|
122
121
|
}
|
|
@@ -177,6 +176,13 @@ See [Advanced Configuration](#advanced-configuration) section below for all opti
|
|
|
177
176
|
| `get_git_index_status` | Get indexing status and statistics for a repository's git history |
|
|
178
177
|
| `clear_git_index` | Delete all indexed git history data for a repository |
|
|
179
178
|
|
|
179
|
+
### Advanced Search
|
|
180
|
+
|
|
181
|
+
| Tool | Description |
|
|
182
|
+
| ------------------- | ----------------------------------------------------------------------------- |
|
|
183
|
+
| `contextual_search` | Combined code + git history search with file-commit correlations |
|
|
184
|
+
| `federated_search` | Search across multiple repositories with Reciprocal Rank Fusion (RRF) ranking |
|
|
185
|
+
|
|
180
186
|
### Resources
|
|
181
187
|
|
|
182
188
|
- `qdrant://collections` - List all collections
|
|
@@ -231,14 +237,18 @@ If you place `prompts.json` in the project root, no additional configuration is
|
|
|
231
237
|
|
|
232
238
|
See [`prompts.example.json`](prompts.example.json) for ready-to-use prompts including:
|
|
233
239
|
|
|
234
|
-
- `find_similar_docs` - Semantic search with result explanation
|
|
235
240
|
- `setup_rag_collection` - Create RAG-optimized collections
|
|
236
|
-
- `
|
|
237
|
-
- `
|
|
238
|
-
- `search_with_filter` - Metadata filtering assistance
|
|
239
|
-
- `compare_search_methods` - Semantic vs hybrid search comparison
|
|
240
|
-
- `collection_maintenance` - Maintenance and cleanup workflows
|
|
241
|
+
- `analyze_and_optimize` - Collection insights and recommendations
|
|
242
|
+
- `compare_search_strategies` - Semantic vs hybrid search comparison
|
|
241
243
|
- `migrate_to_hybrid` - Collection migration guide
|
|
244
|
+
- `debug_search_quality` - Troubleshoot poor search results
|
|
245
|
+
- `build_knowledge_base` - Structured documentation with metadata
|
|
246
|
+
- `index_git_history` - Index repository commit history for semantic search
|
|
247
|
+
- `search_project_history` - Search git history to understand feature implementations
|
|
248
|
+
- `investigate_code_with_history` - Deep dive into code with contextual search
|
|
249
|
+
- `cross_repo_search` - Search patterns across multiple repositories
|
|
250
|
+
- `trace_feature_evolution` - Track how features evolved over time
|
|
251
|
+
- `security_audit_search` - Find security-related code and fixes
|
|
242
252
|
|
|
243
253
|
### Template Syntax
|
|
244
254
|
|
|
@@ -484,6 +494,15 @@ Index and search your repository's git commit history using natural language. Pe
|
|
|
484
494
|
- **Learning from History**: "Show me examples of API endpoint implementations"
|
|
485
495
|
- **Code Archaeology**: "What changes were made to the payment system last year?"
|
|
486
496
|
|
|
497
|
+
## Advanced Search
|
|
498
|
+
|
|
499
|
+
Combine code and git history search for deeper codebase understanding. Requires repositories to be indexed with both `index_codebase` and `index_git_history` first.
|
|
500
|
+
|
|
501
|
+
- **Contextual Search**: Query code + git history together with automatic file-commit correlations
|
|
502
|
+
- **Federated Search**: Search across multiple repositories with RRF ranking
|
|
503
|
+
|
|
504
|
+
See **[Advanced Search Examples](examples/advanced-search/)** for detailed usage, workflows, and scenarios.
|
|
505
|
+
|
|
487
506
|
## Examples
|
|
488
507
|
|
|
489
508
|
See [examples/](examples/) directory for detailed guides:
|
|
@@ -494,6 +513,7 @@ See [examples/](examples/) directory for detailed guides:
|
|
|
494
513
|
- **[Advanced Filtering](examples/filters/)** - Complex boolean filters
|
|
495
514
|
- **[Rate Limiting](examples/rate-limiting/)** - Batch processing with cloud providers
|
|
496
515
|
- **[Code Search](examples/code-search/)** - Index codebases and semantic code search
|
|
516
|
+
- **[Advanced Search](examples/advanced-search/)** - Contextual and federated search across repositories
|
|
497
517
|
|
|
498
518
|
## Advanced Configuration
|
|
499
519
|
|
|
@@ -594,15 +614,27 @@ npm test # Run test suite
|
|
|
594
614
|
npm run test:coverage # Coverage report
|
|
595
615
|
```
|
|
596
616
|
|
|
617
|
+
### Dagger (Portable CI)
|
|
618
|
+
|
|
619
|
+
The CI pipeline is implemented as a [Dagger](https://dagger.io/) TypeScript module, making it runnable locally or in any CI system:
|
|
620
|
+
|
|
621
|
+
```bash
|
|
622
|
+
dagger call check --source=. # Type-check + build (Node 22)
|
|
623
|
+
dagger call check --source=. --node-version=24 # Type-check + build (Node 24)
|
|
624
|
+
dagger call test --source=. # Full test suite + coverage
|
|
625
|
+
dagger call test-all --source=. # Test on Node 22 + 24 in parallel
|
|
626
|
+
```
|
|
627
|
+
|
|
597
628
|
### Testing
|
|
598
629
|
|
|
599
|
-
**
|
|
630
|
+
**748 tests** across 27 test files with **97%+ coverage**:
|
|
600
631
|
|
|
601
632
|
- **Unit Tests**: QdrantManager (56), Ollama (41), OpenAI (25), Cohere (29), Voyage (31), Factory (43), Prompts (50), Transport (15), MCP Server (19)
|
|
602
633
|
- **Integration Tests**: Code indexer (56), scanner (15), chunker (24), synchronizer (42), snapshot (26), merkle tree (28)
|
|
603
634
|
- **Git History Tests**: Git extractor (28), extractor integration (11), chunker (30), indexer (42), synchronizer (18)
|
|
635
|
+
- **Advanced Search Tests**: Federated tools (30) - normalizeScores, calculateRRFScore, buildCorrelations, contextual_search, federated_search
|
|
604
636
|
|
|
605
|
-
**CI/CD**:
|
|
637
|
+
**CI/CD**: [Dagger](https://dagger.io/) module runs build, type-check, and tests on Node.js 22 and 24. GitHub Actions invokes Dagger for CI and uses native `semantic-release` for publishing.
|
|
606
638
|
|
|
607
639
|
## Contributing
|
|
608
640
|
|