@yourtechtribe-labs/koncept-mcp-server 0.1.0-alpha.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/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/_shared.d.ts +3 -0
- package/dist/tools/_shared.d.ts.map +1 -0
- package/dist/tools/_shared.js +5 -0
- package/dist/tools/_shared.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/koncept-for-file.d.ts +4 -0
- package/dist/tools/koncept-for-file.d.ts.map +1 -0
- package/dist/tools/koncept-for-file.js +47 -0
- package/dist/tools/koncept-for-file.js.map +1 -0
- package/dist/tools/koncept-get.d.ts +4 -0
- package/dist/tools/koncept-get.d.ts.map +1 -0
- package/dist/tools/koncept-get.js +47 -0
- package/dist/tools/koncept-get.js.map +1 -0
- package/dist/tools/koncept-invariants-at-scope.d.ts +4 -0
- package/dist/tools/koncept-invariants-at-scope.d.ts.map +1 -0
- package/dist/tools/koncept-invariants-at-scope.js +49 -0
- package/dist/tools/koncept-invariants-at-scope.js.map +1 -0
- package/dist/tools/koncept-search.d.ts +4 -0
- package/dist/tools/koncept-search.d.ts.map +1 -0
- package/dist/tools/koncept-search.js +41 -0
- package/dist/tools/koncept-search.js.map +1 -0
- package/package.json +38 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Albert Gil López — yourtechtribe-labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# @yourtechtribe-labs/koncept-mcp-server
|
|
2
|
+
|
|
3
|
+
> MCP stdio server exposing [koncepto](https://github.com/yourtechtribe-labs/koncept-mcp) — semantic concept graph tools for AI coding agents.
|
|
4
|
+
|
|
5
|
+
**Status**: pre-alpha (`v0.1.0-alpha.1`).
|
|
6
|
+
|
|
7
|
+
## What it does
|
|
8
|
+
|
|
9
|
+
Reads a project's `.koncept/concepts/*.yaml` registry and exposes 4 read-only tools over the [Model Context Protocol](https://modelcontextprotocol.io):
|
|
10
|
+
|
|
11
|
+
| Tool | Purpose |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `koncept-search` | Full-text + tag search across concepts |
|
|
14
|
+
| `koncept-get` | Fetch a concept by id (full payload) |
|
|
15
|
+
| `koncept-for-file` | List concepts where a file appears as participant |
|
|
16
|
+
| `koncept-invariants-at-scope` | Return invariants whose concept overlaps a scope |
|
|
17
|
+
|
|
18
|
+
Drop this in front of Claude Code, Cursor, or any other MCP client and the agent gains read-Step-0 awareness of cross-cutting semantic facts that don't show up in the AST.
|
|
19
|
+
|
|
20
|
+
## Install (Claude Code)
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
claude mcp add --scope user koncepto -- \
|
|
24
|
+
npx -y @yourtechtribe-labs/koncept-mcp-server@alpha "$PWD"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Install (other MCP clients)
|
|
28
|
+
|
|
29
|
+
The server expects a single positional arg: the project root containing a `.koncept/` directory.
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx -y @yourtechtribe-labs/koncept-mcp-server@alpha /path/to/project
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Bootstrap your project
|
|
36
|
+
|
|
37
|
+
Use the CLI ([`@yourtechtribe-labs/koncept-cli`](https://www.npmjs.com/package/@yourtechtribe-labs/koncept-cli)) to initialize the registry:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pnpm add -D @yourtechtribe-labs/koncept-cli@alpha
|
|
41
|
+
npx koncepto init
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Then write concepts under `.koncept/concepts/<id>.yaml` and `npx koncepto verify`.
|
|
45
|
+
|
|
46
|
+
## License
|
|
47
|
+
|
|
48
|
+
MIT — see [LICENSE](./LICENSE).
|
|
49
|
+
|
|
50
|
+
## Repository
|
|
51
|
+
|
|
52
|
+
Source, issues, schema docs, and roadmap at [github.com/yourtechtribe-labs/koncept-mcp](https://github.com/yourtechtribe-labs/koncept-mcp).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { createServer } from './server.js';
|
|
5
|
+
import { registerAllTools } from './tools/index.js';
|
|
6
|
+
async function main() {
|
|
7
|
+
const rawRoot = process.argv[2] ?? process.cwd();
|
|
8
|
+
const rootDir = resolve(rawRoot);
|
|
9
|
+
const { mcp } = createServer({ rootDir });
|
|
10
|
+
registerAllTools(mcp, { rootDir });
|
|
11
|
+
const transport = new StdioServerTransport();
|
|
12
|
+
await mcp.connect(transport);
|
|
13
|
+
}
|
|
14
|
+
main().catch((err) => {
|
|
15
|
+
process.stderr.write(`koncept-mcp-server fatal: ${String(err)}\n`);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACzC,gBAAgB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IAElC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AAC9B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
export interface ServerOptions {
|
|
3
|
+
rootDir: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function createServer(opts: ServerOptions): {
|
|
6
|
+
mcp: McpServer;
|
|
7
|
+
rootDir: string;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG;IACjD,GAAG,EAAE,SAAS,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAMA"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { VERSION } from '@yourtechtribe-labs/koncept-core';
|
|
3
|
+
export function createServer(opts) {
|
|
4
|
+
const mcp = new McpServer({
|
|
5
|
+
name: 'koncepto',
|
|
6
|
+
version: VERSION,
|
|
7
|
+
});
|
|
8
|
+
return { mcp, rootDir: opts.rootDir };
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAA;AAM1D,MAAM,UAAU,YAAY,CAAC,IAAmB;IAI9C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;QACxB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../src/tools/_shared.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,QAAsB,CAAA;AAEjD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../src/tools/_shared.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAA;AAEjD,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAMxE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAKvE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { registerKonceptGet } from './koncept-get.js';
|
|
2
|
+
import { registerKonceptSearch } from './koncept-search.js';
|
|
3
|
+
import { registerKonceptForFile } from './koncept-for-file.js';
|
|
4
|
+
import { registerKonceptInvariantsAtScope } from './koncept-invariants-at-scope.js';
|
|
5
|
+
export function registerAllTools(mcp, ctx) {
|
|
6
|
+
registerKonceptGet(mcp, ctx);
|
|
7
|
+
registerKonceptSearch(mcp, ctx);
|
|
8
|
+
registerKonceptForFile(mcp, ctx);
|
|
9
|
+
registerKonceptInvariantsAtScope(mcp, ctx);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,gCAAgC,EAAE,MAAM,kCAAkC,CAAA;AAMnF,MAAM,UAAU,gBAAgB,CAAC,GAAc,EAAE,GAAgB;IAC/D,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC5B,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/B,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAChC,gCAAgC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koncept-for-file.d.ts","sourceRoot":"","sources":["../../src/tools/koncept-for-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAOxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAiB7C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAyC7E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ConceptTypeEnum, RoleEnum, indexConcepts, parseConceptFile, } from '@yourtechtribe-labs/koncept-core';
|
|
3
|
+
import { normalizePath } from './_shared.js';
|
|
4
|
+
const inputSchema = { path: z.string().min(1) };
|
|
5
|
+
const outputSchema = {
|
|
6
|
+
matches: z.array(z.object({
|
|
7
|
+
id: z.string(),
|
|
8
|
+
name: z.string(),
|
|
9
|
+
type: ConceptTypeEnum,
|
|
10
|
+
role: RoleEnum,
|
|
11
|
+
purpose: z.string(),
|
|
12
|
+
})),
|
|
13
|
+
};
|
|
14
|
+
export function registerKonceptForFile(mcp, ctx) {
|
|
15
|
+
mcp.registerTool('koncept_for_file', {
|
|
16
|
+
title: 'Concepts for file',
|
|
17
|
+
description: 'List concepts that participate in a given file path. Returns each concept with its role and purpose for that file.',
|
|
18
|
+
inputSchema,
|
|
19
|
+
outputSchema,
|
|
20
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
21
|
+
}, async ({ path: target }) => {
|
|
22
|
+
const normalized = normalizePath(target);
|
|
23
|
+
const index = await indexConcepts(ctx.rootDir);
|
|
24
|
+
const candidates = index.entries.filter((e) => e.participants_paths.some((p) => normalizePath(p) === normalized));
|
|
25
|
+
const matches = await Promise.all(candidates.map(async (entry) => {
|
|
26
|
+
const parsed = await parseConceptFile(entry.file);
|
|
27
|
+
if (!parsed.concept)
|
|
28
|
+
return null;
|
|
29
|
+
const part = parsed.concept.participants.find((p) => normalizePath(p.file) === normalized);
|
|
30
|
+
if (!part)
|
|
31
|
+
return null;
|
|
32
|
+
return {
|
|
33
|
+
id: entry.id,
|
|
34
|
+
name: entry.name,
|
|
35
|
+
type: entry.type,
|
|
36
|
+
role: part.role,
|
|
37
|
+
purpose: part.purpose,
|
|
38
|
+
};
|
|
39
|
+
}));
|
|
40
|
+
const payload = { matches: matches.filter((m) => m !== null) };
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
|
|
43
|
+
structuredContent: payload,
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=koncept-for-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koncept-for-file.js","sourceRoot":"","sources":["../../src/tools/koncept-for-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EACL,eAAe,EACf,QAAQ,EACR,aAAa,EACb,gBAAgB,GACjB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;AAE/C,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CACH;CACF,CAAA;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAc,EAAE,GAAgB;IACrE,GAAG,CAAC,YAAY,CACd,kBAAkB,EAClB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,oHAAoH;QACtH,WAAW;QACX,YAAY;QACZ,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;KAC1D,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAClE,CAAA;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACjD,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAA;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAC3C,CAAC,CAAmB,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,UAAU,CAC9D,CAAA;YACD,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAA;YACtB,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAA;QACH,CAAC,CAAC,CACH,CAAA;QACD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAA;QAC9D,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5E,iBAAiB,EAAE,OAAO;SAC3B,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koncept-get.d.ts","sourceRoot":"","sources":["../../src/tools/koncept-get.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAMxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAY7C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiCzE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ConceptSchema, indexConcepts, parseConceptFile, } from '@yourtechtribe-labs/koncept-core';
|
|
3
|
+
import { KEBAB_ID_REGEX } from './_shared.js';
|
|
4
|
+
const inputSchema = { id: z.string().min(1) };
|
|
5
|
+
const outputSchema = {
|
|
6
|
+
concept: ConceptSchema.optional(),
|
|
7
|
+
error: z.enum(['not_found', 'invalid_id', 'parse_failed']).optional(),
|
|
8
|
+
id: z.string().optional(),
|
|
9
|
+
reason: z.string().optional(),
|
|
10
|
+
};
|
|
11
|
+
export function registerKonceptGet(mcp, ctx) {
|
|
12
|
+
mcp.registerTool('koncept_get', {
|
|
13
|
+
title: 'Get concept by id',
|
|
14
|
+
description: 'Fetch a concept document by its kebab-case id. Returns the full Concept (purpose, participants, invariants, related_concepts).',
|
|
15
|
+
inputSchema,
|
|
16
|
+
outputSchema,
|
|
17
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
18
|
+
}, async ({ id }) => {
|
|
19
|
+
if (!KEBAB_ID_REGEX.test(id))
|
|
20
|
+
return errorResult({ error: 'invalid_id', id });
|
|
21
|
+
const index = await indexConcepts(ctx.rootDir);
|
|
22
|
+
const entry = index.entries.find((e) => e.id === id);
|
|
23
|
+
if (!entry)
|
|
24
|
+
return errorResult({ error: 'not_found', id });
|
|
25
|
+
const parsed = await parseConceptFile(entry.file);
|
|
26
|
+
if (!parsed.concept) {
|
|
27
|
+
return errorResult({
|
|
28
|
+
error: 'parse_failed',
|
|
29
|
+
id,
|
|
30
|
+
reason: parsed.errors[0]?.type ?? 'unknown',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const payload = { concept: parsed.concept };
|
|
34
|
+
return {
|
|
35
|
+
content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
|
|
36
|
+
structuredContent: payload,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function errorResult(payload) {
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
|
|
43
|
+
structuredContent: payload,
|
|
44
|
+
isError: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=koncept-get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koncept-get.js","sourceRoot":"","sources":["../../src/tools/koncept-get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;AAE7C,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAA;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAc,EAAE,GAAgB;IACjE,GAAG,CAAC,YAAY,CACd,aAAa,EACb;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,gIAAgI;QAClI,WAAW;QACX,YAAY;QACZ,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;KAC1D,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;QAE7E,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,KAAK;YAAE,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QAE1D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,WAAW,CAAC;gBACjB,KAAK,EAAE,cAAc;gBACrB,EAAE;gBACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,SAAS;aAC5C,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAA;QAC3C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5E,iBAAiB,EAAE,OAAO;SAC3B,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAA+B;IAClD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5E,iBAAiB,EAAE,OAAO;QAC1B,OAAO,EAAE,IAAI;KACd,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ToolContext } from './index.js';
|
|
3
|
+
export declare function registerKonceptInvariantsAtScope(mcp: McpServer, ctx: ToolContext): void;
|
|
4
|
+
//# sourceMappingURL=koncept-invariants-at-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koncept-invariants-at-scope.d.ts","sourceRoot":"","sources":["../../src/tools/koncept-invariants-at-scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAMxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAiB7C,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,WAAW,GACf,IAAI,CA6CN"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { SeverityEnum, indexConcepts, parseConceptFile, } from '@yourtechtribe-labs/koncept-core';
|
|
3
|
+
import { KEBAB_ID_REGEX, normalizePath } from './_shared.js';
|
|
4
|
+
const inputSchema = { scope: z.string().min(1) };
|
|
5
|
+
const outputSchema = {
|
|
6
|
+
invariants: z.array(z.object({
|
|
7
|
+
concept_id: z.string(),
|
|
8
|
+
invariant_id: z.string(),
|
|
9
|
+
description: z.string(),
|
|
10
|
+
severity: SeverityEnum,
|
|
11
|
+
source_file: z.string(),
|
|
12
|
+
})),
|
|
13
|
+
};
|
|
14
|
+
export function registerKonceptInvariantsAtScope(mcp, ctx) {
|
|
15
|
+
mcp.registerTool('koncept_invariants_at_scope', {
|
|
16
|
+
title: 'Invariants at scope',
|
|
17
|
+
description: 'List invariants that apply within a scope. Scope can be a file path or a concept id (kebab-case).',
|
|
18
|
+
inputSchema,
|
|
19
|
+
outputSchema,
|
|
20
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
21
|
+
}, async ({ scope }) => {
|
|
22
|
+
const index = await indexConcepts(ctx.rootDir);
|
|
23
|
+
const isConceptId = KEBAB_ID_REGEX.test(scope);
|
|
24
|
+
const target = isConceptId ? null : normalizePath(scope);
|
|
25
|
+
const conceptsToInspect = isConceptId
|
|
26
|
+
? index.entries.filter((e) => e.id === scope)
|
|
27
|
+
: index.entries.filter((e) => e.participants_paths.some((p) => normalizePath(p) === target));
|
|
28
|
+
const parsedAll = await Promise.all(conceptsToInspect.map((e) => parseConceptFile(e.file)));
|
|
29
|
+
const invariants = parsedAll.flatMap((parsed, i) => {
|
|
30
|
+
if (!parsed.concept)
|
|
31
|
+
return [];
|
|
32
|
+
const concept = parsed.concept;
|
|
33
|
+
const sourceFile = conceptsToInspect[i].file;
|
|
34
|
+
return concept.invariants.map((inv) => ({
|
|
35
|
+
concept_id: concept.id,
|
|
36
|
+
invariant_id: inv.id,
|
|
37
|
+
description: inv.description,
|
|
38
|
+
severity: inv.severity,
|
|
39
|
+
source_file: sourceFile,
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
42
|
+
const payload = { invariants };
|
|
43
|
+
return {
|
|
44
|
+
content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
|
|
45
|
+
structuredContent: payload,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=koncept-invariants-at-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koncept-invariants-at-scope.js","sourceRoot":"","sources":["../../src/tools/koncept-invariants-at-scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koncept-search.d.ts","sourceRoot":"","sources":["../../src/tools/koncept-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAMxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAmB7C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA6B5E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ConceptTypeEnum, indexConcepts, searchEntries, } from '@yourtechtribe-labs/koncept-core';
|
|
3
|
+
const inputSchema = {
|
|
4
|
+
query: z.string().min(1),
|
|
5
|
+
limit: z.number().int().positive().max(50).optional(),
|
|
6
|
+
};
|
|
7
|
+
const outputSchema = {
|
|
8
|
+
matches: z.array(z.object({
|
|
9
|
+
id: z.string(),
|
|
10
|
+
name: z.string(),
|
|
11
|
+
type: ConceptTypeEnum,
|
|
12
|
+
score: z.number(),
|
|
13
|
+
matched_on: z.array(z.enum(['id', 'name', 'tags'])),
|
|
14
|
+
})),
|
|
15
|
+
};
|
|
16
|
+
export function registerKonceptSearch(mcp, ctx) {
|
|
17
|
+
mcp.registerTool('koncept_search', {
|
|
18
|
+
title: 'Search concepts',
|
|
19
|
+
description: 'Fuzzy-search concepts by id/name/tag. Returns ranked matches with score and which fields matched.',
|
|
20
|
+
inputSchema,
|
|
21
|
+
outputSchema,
|
|
22
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
23
|
+
}, async ({ query, limit }) => {
|
|
24
|
+
const index = await indexConcepts(ctx.rootDir);
|
|
25
|
+
const hits = searchEntries(index.entries, query, limit ?? 10);
|
|
26
|
+
const payload = {
|
|
27
|
+
matches: hits.map((h) => ({
|
|
28
|
+
id: h.entry.id,
|
|
29
|
+
name: h.entry.name,
|
|
30
|
+
type: h.entry.type,
|
|
31
|
+
score: h.score,
|
|
32
|
+
matched_on: h.matchedOn,
|
|
33
|
+
})),
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
|
|
37
|
+
structuredContent: payload,
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=koncept-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koncept-search.js","sourceRoot":"","sources":["../../src/tools/koncept-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,kCAAkC,CAAA;AAGzC,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CACtD,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;KACpD,CAAC,CACH;CACF,CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAc,EAAE,GAAgB;IACpE,GAAG,CAAC,YAAY,CACd,gBAAgB,EAChB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,mGAAmG;QACrG,WAAW;QACX,YAAY;QACZ,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;KAC1D,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAA;QAC7D,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;gBACd,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;gBAClB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;gBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,UAAU,EAAE,CAAC,CAAC,SAAS;aACxB,CAAC,CAAC;SACJ,CAAA;QACD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5E,iBAAiB,EAAE,OAAO;SAC3B,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yourtechtribe-labs/koncept-mcp-server",
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
|
+
"description": "MCP server exposing semantic concept graph tools (koncept_get, koncept_for_file, koncept_search, koncept_invariants_at_scope).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"koncept-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
17
|
+
"@yourtechtribe-labs/koncept-core": "^0.1.0-alpha.1",
|
|
18
|
+
"zod": "4.4.2"
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public",
|
|
22
|
+
"tag": "alpha"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"homepage": "https://github.com/yourtechtribe-labs/koncept-mcp",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "https://github.com/yourtechtribe-labs/koncept-mcp",
|
|
29
|
+
"directory": "packages/koncept-mcp-server"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"lint": "echo 'lint stub'",
|
|
35
|
+
"clean": "rm -rf dist",
|
|
36
|
+
"start": "node dist/index.js"
|
|
37
|
+
}
|
|
38
|
+
}
|