@yourtechtribe-labs/koncept-mcp-server 0.1.0-alpha.6 → 0.2.0-alpha.0

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/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  > MCP stdio server exposing [koncepto](https://github.com/yourtechtribe-labs/koncept-mcp) — semantic concept graph tools for AI coding agents.
4
4
 
5
- **Status**: pre-alpha (`v0.1.0-alpha.1`).
5
+ **Status**: pre-alpha (`v0.2.0-alpha.0`).
6
6
 
7
7
  ## What it does
8
8
 
9
- Reads a project's `.koncept/concepts/*.yaml` registry and exposes 4 read-only tools over the [Model Context Protocol](https://modelcontextprotocol.io):
9
+ Reads a project's `.koncept/concepts/*.yaml` registry and exposes 5 read-only tools and 2 resource families over the [Model Context Protocol](https://modelcontextprotocol.io):
10
10
 
11
11
  | Tool | Purpose |
12
12
  |---|---|
@@ -14,6 +14,12 @@ Reads a project's `.koncept/concepts/*.yaml` registry and exposes 4 read-only to
14
14
  | `koncept_get` | Fetch a concept by id (full payload) |
15
15
  | `koncept_for_file` | List concepts where a file appears as participant |
16
16
  | `koncept_invariants_at_scope` | Return invariants whose concept overlaps a scope |
17
+ | `koncept_affected` | Given a list of changed file paths, report touched concepts/invariants ordered by max severity |
18
+
19
+ | Resource | Purpose |
20
+ |---|---|
21
+ | `koncept://concepts` | JSON index of every concept (id, name, type, status, uri) |
22
+ | `koncept://concept/{id}` | Full concept document by id |
17
23
 
18
24
  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
25
 
package/dist/index.js CHANGED
@@ -3,11 +3,13 @@ import { resolve } from 'node:path';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
4
  import { createServer } from './server.js';
5
5
  import { registerAllTools } from './tools/index.js';
6
+ import { registerAllResources } from './resources/index.js';
6
7
  async function main() {
7
8
  const rawRoot = process.argv[2] ?? process.cwd();
8
9
  const rootDir = resolve(rawRoot);
9
10
  const { mcp } = createServer({ rootDir });
10
11
  registerAllTools(mcp, { rootDir });
12
+ registerAllResources(mcp, { rootDir });
11
13
  const transport = new StdioServerTransport();
12
14
  await mcp.connect(transport);
13
15
  }
package/dist/index.js.map CHANGED
@@ -1 +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"}
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;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAE3D,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;IAClC,oBAAoB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IAEtC,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"}
@@ -0,0 +1,6 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../tools/index.js';
3
+ export interface ResourceContext extends ToolContext {
4
+ }
5
+ export declare function registerAllResources(mcp: McpServer, ctx: ResourceContext): void;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAOxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,WAAW,eAAgB,SAAQ,WAAW;CAAG;AAKvD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI,CAG/E"}
@@ -0,0 +1,87 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { indexConcepts, loadConcepts, } from '@yourtechtribe-labs/koncept-core';
3
+ import { KEBAB_ID_REGEX } from '../tools/_shared.js';
4
+ const LIST_URI = 'koncept://concepts';
5
+ const TEMPLATE_URI = 'koncept://concept/{id}';
6
+ export function registerAllResources(mcp, ctx) {
7
+ registerConceptsList(mcp, ctx);
8
+ registerConceptTemplate(mcp, ctx);
9
+ }
10
+ function registerConceptsList(mcp, ctx) {
11
+ mcp.registerResource('concepts-index', LIST_URI, {
12
+ title: 'Concepts index',
13
+ description: 'JSON array of every concept in the registry: {id, name, type, status, uri, source_file}.',
14
+ mimeType: 'application/json',
15
+ }, async () => {
16
+ const result = await indexConcepts(ctx.rootDir);
17
+ const payload = result.entries.map((e) => ({
18
+ id: e.id,
19
+ name: e.name,
20
+ type: e.type,
21
+ status: e.status,
22
+ uri: `koncept://concept/${e.id}`,
23
+ source_file: e.file,
24
+ }));
25
+ return {
26
+ contents: [
27
+ {
28
+ uri: LIST_URI,
29
+ mimeType: 'application/json',
30
+ text: JSON.stringify(payload, null, 2),
31
+ },
32
+ ],
33
+ };
34
+ });
35
+ }
36
+ function registerConceptTemplate(mcp, ctx) {
37
+ const template = new ResourceTemplate(TEMPLATE_URI, {
38
+ list: async () => {
39
+ const result = await indexConcepts(ctx.rootDir);
40
+ return {
41
+ resources: result.entries.map((e) => ({
42
+ uri: `koncept://concept/${e.id}`,
43
+ name: e.id,
44
+ title: e.name,
45
+ mimeType: 'application/json',
46
+ description: `${e.type} — status: ${e.status}`,
47
+ })),
48
+ };
49
+ },
50
+ });
51
+ mcp.registerResource('concept', template, {
52
+ title: 'Concept',
53
+ description: 'A single concept document by id. URI: koncept://concept/<id>. Returns the full Concept (participants, invariants with check payload, related_concepts, tags, references) as JSON.',
54
+ mimeType: 'application/json',
55
+ }, async (uri, variables) => {
56
+ const id = String(variables.id ?? '');
57
+ if (!KEBAB_ID_REGEX.test(id)) {
58
+ return errorResult(uri.href, 'invalid_id', `id "${id}" is not kebab-case`);
59
+ }
60
+ const loaded = await loadConcepts(ctx.rootDir);
61
+ const concept = loaded.concepts.find((c) => c.id === id);
62
+ if (!concept) {
63
+ return errorResult(uri.href, 'not_found', `concept "${id}" not found`);
64
+ }
65
+ return {
66
+ contents: [
67
+ {
68
+ uri: uri.href,
69
+ mimeType: 'application/json',
70
+ text: JSON.stringify(concept, null, 2),
71
+ },
72
+ ],
73
+ };
74
+ });
75
+ }
76
+ function errorResult(uri, code, message) {
77
+ return {
78
+ contents: [
79
+ {
80
+ uri,
81
+ mimeType: 'application/json',
82
+ text: JSON.stringify({ error: code, message }, null, 2),
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAOxE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAMvE"}
@@ -2,10 +2,12 @@ import { registerKonceptGet } from './koncept-get.js';
2
2
  import { registerKonceptSearch } from './koncept-search.js';
3
3
  import { registerKonceptForFile } from './koncept-for-file.js';
4
4
  import { registerKonceptInvariantsAtScope } from './koncept-invariants-at-scope.js';
5
+ import { registerKonceptAffected } from './koncept-affected.js';
5
6
  export function registerAllTools(mcp, ctx) {
6
7
  registerKonceptGet(mcp, ctx);
7
8
  registerKonceptSearch(mcp, ctx);
8
9
  registerKonceptForFile(mcp, ctx);
9
10
  registerKonceptInvariantsAtScope(mcp, ctx);
11
+ registerKonceptAffected(mcp, ctx);
10
12
  }
11
13
  //# sourceMappingURL=index.js.map
@@ -1 +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"}
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;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAM/D,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;IAC1C,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AACnC,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 registerKonceptAffected(mcp: McpServer, ctx: ToolContext): void;
4
+ //# sourceMappingURL=koncept-affected.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koncept-affected.d.ts","sourceRoot":"","sources":["../../src/tools/koncept-affected.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AASxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAsC7C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAyB9E"}
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ import { AutomatedCheckSchema, ConceptTypeEnum, RoleEnum, SeverityEnum, computeAffected, loadConcepts, } from '@yourtechtribe-labs/koncept-core';
3
+ const MatchedRoleEnum = z.union([RoleEnum, z.literal('source_of_truth')]);
4
+ const inputSchema = {
5
+ files: z
6
+ .array(z.string().min(1))
7
+ .min(1)
8
+ .describe('Changed file paths (forward-slash, repo-relative). Caller supplies the diff.'),
9
+ };
10
+ const outputSchema = {
11
+ changed_files: z.array(z.string()),
12
+ concepts: z.array(z.object({
13
+ id: z.string(),
14
+ name: z.string(),
15
+ type: ConceptTypeEnum,
16
+ max_severity: SeverityEnum.nullable(),
17
+ matched_files: z.array(z.object({ file: z.string(), role: MatchedRoleEnum })),
18
+ other_participants: z.array(z.string()),
19
+ invariants: z.array(z.object({
20
+ concept_id: z.string(),
21
+ concept_name: z.string(),
22
+ invariant_id: z.string(),
23
+ description: z.string(),
24
+ severity: SeverityEnum,
25
+ check: AutomatedCheckSchema,
26
+ })),
27
+ })),
28
+ unmatched_files: z.array(z.string()),
29
+ };
30
+ export function registerKonceptAffected(mcp, ctx) {
31
+ mcp.registerTool('koncept_affected', {
32
+ title: 'Affected concepts and invariants',
33
+ description: 'Given a list of changed file paths, return the concepts and invariants touched by those files. Use this BEFORE editing or reviewing a diff to surface the invariants the change must respect. Concepts are ordered by max severity (high first).',
34
+ inputSchema,
35
+ outputSchema,
36
+ annotations: { readOnlyHint: true, idempotentHint: true },
37
+ }, async ({ files }) => {
38
+ const loaded = await loadConcepts(ctx.rootDir);
39
+ const report = computeAffected(loaded.concepts, files);
40
+ const payload = {
41
+ changed_files: report.changed_files,
42
+ concepts: report.concepts,
43
+ unmatched_files: report.unmatched_files,
44
+ };
45
+ return {
46
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
47
+ structuredContent: payload,
48
+ };
49
+ });
50
+ }
51
+ //# sourceMappingURL=koncept-affected.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koncept-affected.js","sourceRoot":"","sources":["../../src/tools/koncept-affected.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,YAAY,GACb,MAAM,kCAAkC,CAAA;AAGzC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;AAEzE,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,8EAA8E,CAAC;CAC5F,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,eAAe;QACrB,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE;QACrC,aAAa,EAAE,CAAC,CAAC,KAAK,CACpB,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CACtD;QACD,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC,CAAC,KAAK,CACjB,CAAC,CAAC,MAAM,CAAC;YACP,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;YACtB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;YACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;YACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;YACvB,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,oBAAoB;SAC5B,CAAC,CACH;KACF,CAAC,CACH;IACD,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACrC,CAAA;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAc,EAAE,GAAgB;IACtE,GAAG,CAAC,YAAY,CACd,kBAAkB,EAClB;QACE,KAAK,EAAE,kCAAkC;QACzC,WAAW,EACT,kPAAkP;QACpP,WAAW;QACX,YAAY;QACZ,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;KAC1D,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACtD,MAAM,OAAO,GAAG;YACd,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC,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"}
@@ -11,7 +11,7 @@ const outputSchema = {
11
11
  export function registerKonceptGet(mcp, ctx) {
12
12
  mcp.registerTool('koncept_get', {
13
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).',
14
+ description: 'Fetch a concept document by its kebab-case id. Returns the full Concept (participants, invariants with structured `check` payload, related_concepts which may be plain id strings or {id, type} objects, tags, references).',
15
15
  inputSchema,
16
16
  outputSchema,
17
17
  annotations: { readOnlyHint: true, idempotentHint: true },
@@ -1 +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"}
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,6NAA6N;QAC/N,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yourtechtribe-labs/koncept-mcp-server",
3
- "version": "0.1.0-alpha.6",
3
+ "version": "0.2.0-alpha.0",
4
4
  "mcpName": "io.github.yourtechtribe-labs/koncept-mcp-server",
5
5
  "description": "MCP server exposing semantic concept graph tools (koncept_search, koncept_get, koncept_for_file, koncept_invariants_at_scope).",
6
6
  "keywords": [
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@modelcontextprotocol/sdk": "1.29.0",
37
- "@yourtechtribe-labs/koncept-core": "^0.1.0-alpha.6",
37
+ "@yourtechtribe-labs/koncept-core": "^0.2.0-alpha.0",
38
38
  "zod": "4.4.2"
39
39
  },
40
40
  "publishConfig": {