@runcontext/mcp 0.4.2 → 0.4.4

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/dist/index.cjs CHANGED
@@ -661,7 +661,7 @@ function registerGuardrailsTool(server, manifest) {
661
661
  function createServer(manifest, graph) {
662
662
  const server = new (0, _mcpjs.McpServer)({
663
663
  name: "contextkit",
664
- version: "0.4.2"
664
+ version: "0.4.4"
665
665
  });
666
666
  registerManifestResource(server, manifest);
667
667
  registerModelResource(server, manifest);
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/erickittelson/Desktop/ContextKit/packages/mcp/dist/index.cjs","../src/server.ts","../src/resources/manifest.ts","../src/resources/model.ts","../src/resources/glossary.ts","../src/resources/tier.ts","../src/resources/data-product.ts","../src/tools/search.ts","../src/tools/explain.ts","../src/tools/validate.ts","../src/tools/tier.ts","../src/tools/golden-query.ts","../src/tools/guardrails.ts"],"names":["ResourceTemplate"],"mappings":"AAAA;ACAA,gEAA0B;AAC1B,oEAAqC;AACrC,sFAA8C;AAC9C,wEAAoC;AAEpC,wCAAkD;ADClD;AACA;AEAO,SAAS,wBAAA,CAAyB,MAAA,EAAmB,QAAA,EAA0B;AACpF,EAAA,MAAA,CAAO,QAAA;AAAA,IACL,UAAA;AAAA,IACA,oBAAA;AAAA,IACA,EAAE,WAAA,EAAa,2FAA2F,CAAA;AAAA,IAC1G,MAAA,CAAO,GAAA,EAAA,GAAA,CAAS;AAAA,MACd,QAAA,EAAU;AAAA,QACR;AAAA,UACE,GAAA,EAAK,GAAA,CAAI,IAAA;AAAA,UACT,QAAA,EAAU,kBAAA;AAAA,UACV,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EACF,CAAA;AACF;AFEA;AACA;AGzBA;AAMO,SAAS,cAAA,CAAe,IAAA,EAAc,QAAA,EAAoD;AAC/F,EAAA,MAAM,MAAA,EAAQ,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAClC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO,OAAO,IAAA;AAEnB,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,mBAAY,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,UAAK,MAAA;AAAA,IACzC,KAAA,mBAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,UAAK,MAAA;AAAA,IAC/B,OAAA,mBAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,UAAK,MAAA;AAAA,IACnC,IAAA,mBAAM,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,UAAK;AAAA,EAChC,CAAA;AACF;AAMO,SAAS,qBAAA,CAAsB,MAAA,EAAmB,QAAA,EAA0B;AACjF,EAAA,MAAA,CAAO,QAAA;AAAA,IACL,OAAA;AAAA,IACA,IAAI,4BAAA,CAAiB,wBAAA,EAA0B;AAAA,MAC7C,IAAA,EAAM,MAAA,CAAA,EAAA,GAAA,CAAa;AAAA,QACjB,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,EAAA,GAAA,CAAU;AAAA,UACrD,GAAA,EAAK,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA;AAC5B,UAAA;AAC6B,UAAA;AAC7B,QAAA;AACJ,MAAA;AACD,IAAA;AACc,IAAA;AACU,IAAA;AACM,MAAA;AACD,MAAA;AACjB,MAAA;AACiB,QAAA;AAC5B,MAAA;AACO,MAAA;AACK,QAAA;AACR,UAAA;AACW,YAAA;AACC,YAAA;AACiB,YAAA;AAC7B,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AHgBuC;AACA;AI/DE;AAChC,EAAA;AACL,IAAA;AACA,IAAA;AACe,IAAA;AACC,IAAA;AACJ,MAAA;AACR,QAAA;AACW,UAAA;AACC,UAAA;AACW,UAAA;AACvB,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AJiEuC;AACA;AKxFnBA;AAOoC;AAC/C,EAAA;AACL,IAAA;AACqB,IAAA;AACA,MAAA;AACM,QAAA;AACM,UAAA;AAC3B,UAAA;AACa,UAAA;AACb,QAAA;AACJ,MAAA;AACD,IAAA;AACc,IAAA;AACU,IAAA;AACM,MAAA;AACD,MAAA;AACjB,MAAA;AACO,QAAA;AAClB,MAAA;AACO,MAAA;AACK,QAAA;AACR,UAAA;AACW,YAAA;AACC,YAAA;AACiB,YAAA;AAC7B,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;ALoFuC;AACA;AM1HnBA;AAIU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+Ec;AAEnC,EAAA;AACL,IAAA;AACA,IAAA;AACe,IAAA;AACC,IAAA;AACJ,MAAA;AACR,QAAA;AACW,UAAA;AACC,UAAA;AACJ,UAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AAGO,EAAA;AACL,IAAA;AACqB,IAAA;AACA,MAAA;AACM,QAAA;AAChB,UAAA;AACQ,UAAA;AACA,UAAA;AACb,QAAA;AACJ,MAAA;AACD,IAAA;AACc,IAAA;AACU,IAAA;AACM,MAAA;AACD,MAAA;AACjB,MAAA;AACiB,QAAA;AAC5B,MAAA;AAE6B,MAAA;AACtB,MAAA;AACK,QAAA;AACR,UAAA;AACW,YAAA;AACC,YAAA;AACJ,YAAA;AACR,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAKsE;AACjD,EAAA;AACK,EAAA;AACL,EAAA;AACD,EAAA;AAEM,EAAA;AACb,IAAA;AACT,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACe,IAAA;AACjB,EAAA;AAE8B,EAAA;AACoB,IAAA;AAC3B,IAAA;AACvB,EAAA;AAEgB,EAAA;AACF,IAAA;AACc,IAAA;AACO,IAAA;AACnC,EAAA;AAEU,EAAA;AACE,IAAA;AACgB,IAAA;AAC5B,EAAA;AAGuB,EAAA;AACS,EAAA;AACF,IAAA;AACM,IAAA;AACpB,MAAA;AACc,MAAA;AACK,MAAA;AACjC,IAAA;AACF,EAAA;AAGW,EAAA;AACC,IAAA;AACS,IAAA;AACe,IAAA;AACJ,MAAA;AACD,MAAA;AACI,QAAA;AACE,QAAA;AACL,QAAA;AACD,QAAA;AAEP,QAAA;AACY,QAAA;AACF,UAAA;AACF,UAAA;AACX,YAAA;AACa,YAAA;AACC,YAAA;AACE,YAAA;AACJ,YAAA;AACC,YAAA;AAC1B,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAGe,IAAA;AACc,IAAA;AACM,MAAA;AACX,MAAA;AACQ,QAAA;AACb,QAAA;AACF,QAAA;AACH,QAAA;AACgB,UAAA;AACb,UAAA;AACkB,UAAA;AAC/B,QAAA;AACQ,QAAA;AACgB,UAAA;AACX,UAAA;AACgB,UAAA;AAC7B,QAAA;AACF,MAAA;AACF,IAAA;AAGkB,IAAA;AACiB,IAAA;AACN,MAAA;AACA,MAAA;AACK,QAAA;AACC,QAAA;AACJ,QAAA;AAC7B,MAAA;AACF,IAAA;AACF,EAAA;AAG8B,EAAA;AACO,IAAA;AACP,IAAA;AACX,MAAA;AACc,MAAA;AACjB,QAAA;AACgB,QAAA;AACI,QAAA;AACP,QAAA;AACzB,MAAA;AACF,IAAA;AACF,EAAA;AAG8B,EAAA;AAClB,IAAA;AACc,IAAA;AACW,IAAA;AAClB,MAAA;AACiB,MAAA;AACD,QAAA;AACE,QAAA;AACnB,QAAA;AACe,UAAA;AACE,UAAA;AACA,UAAA;AACC,YAAA;AAC5B,UAAA;AACF,QAAA;AAC8B,QAAA;AAChC,MAAA;AACF,IAAA;AACF,EAAA;AAEa,EAAA;AACS,EAAA;AACxB;AN0FuC;AACA;AOhXrB;AAciC;AAChB,EAAA;AACL,EAAA;AAGO,EAAA;AAEF,IAAA;AAGhB,MAAA;AACL,QAAA;AACN,QAAA;AACmB,QAAA;AACpB,MAAA;AACH,IAAA;AAGmC,IAAA;AAET,MAAA;AAGT,QAAA;AACL,UAAA;AACG,UAAA;AACO,UAAA;AACT,UAAA;AACR,QAAA;AACH,MAAA;AAGe,MAAA;AACkB,QAAA;AAEF,UAAA;AAIZ,YAAA;AACL,cAAA;AACM,cAAA;AACO,cAAA;AACZ,cAAA;AACK,cAAA;AACb,YAAA;AACH,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AAGgC,EAAA;AAED,IAAA;AAId,MAAA;AACL,QAAA;AACA,QAAA;AACY,QAAA;AACnB,MAAA;AACH,IAAA;AACF,EAAA;AAGiC,EAAA;AAEF,IAAA;AAId,MAAA;AACL,QAAA;AACA,QAAA;AACa,QAAA;AACpB,MAAA;AACH,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAMsD;AAC7C,EAAA;AACL,IAAA;AACA,IAAA;AAC6B,IAAA;AACR,IAAA;AACY,MAAA;AACxB,MAAA;AACI,QAAA;AACP,UAAA;AACQ,YAAA;AACe,YAAA;AACvB,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;APmUuC;AACA;AQ5brB;AAgBmE;AACjD,EAAA;AACf,EAAA;AAES,EAAA;AACK,EAAA;AACI,EAAA;AACA,EAAA;AAGR,EAAA;AACM,EAAA;AAGL,EAAA;AACmB,EAAA;AACnB,EAAA;AACG,IAAA;AACI,IAAA;AACD,IAAA;AACH,IAAA;AAC+B,MAAA;AAC9D,IAAA;AACF,EAAA;AAEO,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAMuD;AAC9C,EAAA;AACL,IAAA;AACA,IAAA;AAC6B,IAAA;AACR,IAAA;AACS,MAAA;AACf,MAAA;AACJ,QAAA;AACI,UAAA;AACP,YAAA;AACQ,cAAA;AACiB,cAAA;AACzB,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACO,MAAA;AACI,QAAA;AACP,UAAA;AACQ,YAAA;AACe,YAAA;AACvB,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;ARoauC;AACA;AStfD;AAY6B;AACnC,EAAA;AACA,EAAA;AACR,IAAA;AACtB,EAAA;AAEoC,EAAA;AACD,EAAA;AACE,EAAA;AAE9B,EAAA;AACyB,IAAA;AAC9B,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAMwD;AAC/C,EAAA;AACL,IAAA;AACA,IAAA;AACC,IAAA;AACW,IAAA;AACmB,MAAA;AACtB,MAAA;AACI,QAAA;AACP,UAAA;AACQ,YAAA;AACe,YAAA;AACvB,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;ATseuC;AACA;AU5hBrB;AAEU;AAKwB;AAChB,EAAA;AACC,EAAA;AACrC;AAMoD;AAC3C,EAAA;AACL,IAAA;AACA,IAAA;AAC6B,IAAA;AACR,IAAA;AACa,MAAA;AACnB,MAAA;AACJ,QAAA;AACI,UAAA;AACP,YAAA;AACQ,cAAA;AACiB,cAAA;AACzB,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACO,MAAA;AACI,QAAA;AACP,UAAA;AACQ,YAAA;AACe,YAAA;AACvB,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AVohBuC;AACA;AWhkBrB;AAaoC;AAClC,EAAA;AACkB,EAAA;AACC,EAAA;AAEJ,EAAA;AACJ,IAAA;AAEJ,IAAA;AACO,MAAA;AACG,MAAA;AACd,MAAA;AACF,QAAA;AACJ,UAAA;AACA,UAAA;AACmB,UAAA;AAC3B,QAAA;AACH,MAAA;AACF,IAAA;AACF,EAAA;AAGmC,EAAA;AAC5B,EAAA;AACT;AAMwC;AAC/B,EAAA;AACL,IAAA;AACA,IAAA;AACgC,IAAA;AACR,IAAA;AACN,MAAA;AACT,MAAA;AACI,QAAA;AACP,UAAA;AACQ,YAAA;AACe,YAAA;AACvB,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AX6iBuC;AACA;AY1mBrB;AAWiC;AACd,EAAA;AACE,EAAA;AAEJ,EAAA;AACD,IAAA;AAEP,IAAA;AAMhB,MAAA;AAGQ,MAAA;AACE,QAAA;AACJ,UAAA;AACC,UAAA;AACT,QAAA;AACH,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAMuC;AAC9B,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AAC8B,MAAA;AAC9B,IAAA;AACsB,IAAA;AACW,MAAA;AACxB,MAAA;AACI,QAAA;AACP,UAAA;AACQ,YAAA;AACe,YAAA;AACvB,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AZmlBuC;AACA;AC1nB0C;AAClD,EAAA;AACrB,IAAA;AACG,IAAA;AACV,EAAA;AAGgC,EAAA;AACH,EAAA;AACG,EAAA;AACI,EAAA;AACD,EAAA;AAGD,EAAA;AACC,EAAA;AACF,EAAA;AACJ,EAAA;AACE,EAAA;AACD,EAAA;AAExB,EAAA;AACT;AAUuB;AACe,EAAA;AACH,EAAA;AACL,EAAA;AAEM,EAAA;AACG,EAAA;AACT,EAAA;AAEN,EAAA;AACQ,EAAA;AAEvB,EAAA;AACT;AAQsC;AAMA,EAAA;AACH,EAAA;AACL,EAAA;AAEM,EAAA;AACG,EAAA;AAEP,EAAA;AACI,EAAA;AAGG,EAAA;AAC/B,IAAA;AAC0B,MAAA;AACN,MAAA;AACA,QAAA;AACrB,MAAA;AAC6B,MAAA;AACA,MAAA;AACR,MAAA;AACJ,QAAA;AACH,QAAA;AACd,MAAA;AACa,IAAA;AACQ,MAAA;AACC,QAAA;AACV,UAAA;AACc,UAAA;AACnB,UAAA;AACL,QAAA;AACH,MAAA;AACF,IAAA;AACD,EAAA;AAG8B,EAAA;AACD,IAAA;AACjB,MAAA;AACuB,MAAA;AAC5B,MAAA;AACJ,IAAA;AACH,EAAA;AAEiC,EAAA;AACJ,IAAA;AACjB,MAAA;AACuB,MAAA;AAC5B,MAAA;AACJ,IAAA;AACH,EAAA;AAGiC,EAAA;AACE,IAAA;AACnC,EAAA;AAE6B,EAAA;AACD,EAAA;AACb,IAAA;AACA,IAAA;AACf,EAAA;AACH;ADqlBuC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/erickittelson/Desktop/ContextKit/packages/mcp/dist/index.cjs","sourcesContent":[null,"import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';\nimport type { Manifest, ContextGraph, ContextKitConfig } from '@runcontext/core';\nimport { compile, emitManifest, loadConfig } from '@runcontext/core';\n\nimport { registerManifestResource } from './resources/manifest.js';\nimport { registerModelResource } from './resources/model.js';\nimport { registerGlossaryResource } from './resources/glossary.js';\nimport { registerTierResource } from './resources/tier.js';\nimport { registerDataProductResource } from './resources/data-product.js';\n\nimport { registerSearchTool } from './tools/search.js';\nimport { registerExplainTool } from './tools/explain.js';\nimport { registerValidateTool } from './tools/validate.js';\nimport { registerTierTool } from './tools/tier.js';\nimport { registerGoldenQueryTool } from './tools/golden-query.js';\nimport { registerGuardrailsTool } from './tools/guardrails.js';\n\n/**\n * Create and configure an MCP server with all ContextKit resources and tools.\n *\n * Use this for testing or embedding — no transport is connected.\n */\nexport function createServer(manifest: Manifest, graph: ContextGraph): McpServer {\n const server = new McpServer({\n name: 'contextkit',\n version: '0.4.2',\n });\n\n // Register resources (5)\n registerManifestResource(server, manifest);\n registerModelResource(server, manifest);\n registerGlossaryResource(server, manifest);\n registerTierResource(server, manifest);\n registerDataProductResource(server, manifest);\n\n // Register tools (6)\n registerSearchTool(server, manifest);\n registerExplainTool(server, manifest);\n registerValidateTool(server, graph);\n registerTierTool(server, graph);\n registerGoldenQueryTool(server, manifest);\n registerGuardrailsTool(server, manifest);\n\n return server;\n}\n\n/**\n * Compile context, create server, and connect stdio transport.\n *\n * This is the main entry point for running the MCP server as a process.\n */\nexport async function startServer(options?: {\n contextDir?: string;\n rootDir?: string;\n}): Promise<McpServer> {\n const rootDir = options?.rootDir ?? process.cwd();\n const config = loadConfig(rootDir);\n const contextDir = options?.contextDir ?? config.context_dir;\n\n const { graph } = await compile({ contextDir, config });\n const manifest = emitManifest(graph, config);\n const server = createServer(manifest, graph);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n return server;\n}\n\n/**\n * Compile context, create server, and serve over HTTP.\n *\n * Each request gets a fresh McpServer + transport (stateless mode).\n * The graph is compiled once at startup and reused for all requests.\n */\nexport async function startServerHttp(options?: {\n contextDir?: string;\n rootDir?: string;\n port?: number;\n host?: string;\n}): Promise<void> {\n const rootDir = options?.rootDir ?? process.cwd();\n const config = loadConfig(rootDir);\n const contextDir = options?.contextDir ?? config.context_dir;\n\n const { graph } = await compile({ contextDir, config });\n const manifest = emitManifest(graph, config);\n\n const host = options?.host ?? '0.0.0.0';\n const app = createMcpExpressApp({ host });\n\n // Stateless: new server + transport per POST (per MCP SDK pattern)\n app.post('/mcp', async (req, res) => {\n try {\n const server = createServer(manifest, graph);\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, req.body);\n res.on('close', () => {\n transport.close();\n server.close();\n });\n } catch (error) {\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n });\n }\n }\n });\n\n // GET /mcp and DELETE /mcp are not supported in stateless mode\n app.get('/mcp', (_req, res) => {\n res.writeHead(405).end(JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed.' },\n id: null,\n }));\n });\n\n app.delete('/mcp', (_req, res) => {\n res.writeHead(405).end(JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed.' },\n id: null,\n }));\n });\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', models: [...graph.models.keys()] });\n });\n\n const port = options?.port ?? 3000;\n app.listen(port, host, () => {\n console.error(`ContextKit MCP server listening on http://${host}:${port}/mcp`);\n console.error(`Health check: http://${host}:${port}/health`);\n });\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://manifest` resource.\n * Returns the full compiled manifest as JSON.\n */\nexport function registerManifestResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'manifest',\n 'context://manifest',\n { description: 'Full ContextKit manifest JSON (models, governance, rules, lineage, terms, owners, tiers)' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest, null, 2),\n },\n ],\n }),\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Build a merged view of a model: OSI model + governance + rules + lineage + tier.\n */\nexport function buildModelView(name: string, manifest: Manifest): Record<string, unknown> | null {\n const model = manifest.models[name];\n if (!model) return null;\n\n return {\n model,\n governance: manifest.governance[name] ?? null,\n rules: manifest.rules[name] ?? null,\n lineage: manifest.lineage[name] ?? null,\n tier: manifest.tiers[name] ?? null,\n };\n}\n\n/**\n * Register the `context://model/{name}` resource template.\n * Returns the OSI model merged with governance, rules, lineage, and tier data.\n */\nexport function registerModelResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'model',\n new ResourceTemplate('context://model/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.models).map((name) => ({\n uri: `context://model/${name}`,\n name,\n description: manifest.models[name]?.description ?? `Model: ${name}`,\n })),\n }),\n }),\n { description: 'OSI semantic model merged with governance, rules, lineage, and tier' },\n async (uri, { name }) => {\n const modelName = String(name);\n const view = buildModelView(modelName, manifest);\n if (!view) {\n throw new Error(`Model '${modelName}' not found`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(view, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://glossary` resource.\n * Returns all glossary terms as JSON.\n */\nexport function registerGlossaryResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'glossary',\n 'context://glossary',\n { description: 'All ContextKit glossary terms with definitions, synonyms, and mappings' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest.terms, null, 2),\n },\n ],\n }),\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://tier/{name}` resource template.\n * Returns the tier scorecard for a specific model.\n */\nexport function registerTierResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'tier',\n new ResourceTemplate('context://tier/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.tiers).map((name) => ({\n uri: `context://tier/${name}`,\n name,\n description: `Tier scorecard for model: ${name} (${manifest.tiers[name]?.tier ?? 'unknown'})`,\n })),\n }),\n }),\n { description: 'Tier scorecard for a model (bronze/silver/gold checks and results)' },\n async (uri, { name }) => {\n const modelName = String(name);\n const tier = manifest.tiers[modelName];\n if (!tier) {\n throw new Error(`Tier data for model '${modelName}' not found`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(tier, null, 2),\n },\n ],\n };\n },\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\nimport { buildModelView } from './model.js';\n\nconst DATA_PRODUCT_TEMPLATE = `# data-product.osi.yaml\n# AI Blueprint — Open Semantic Interchange (OSI) v1.0\n# The complete semantic spec for a data product, ready for any AI agent.\n# Fill in the sections below to describe your data model.\n\nosi_version: \"1.0\"\n\nsemantic_model:\n name: my_data_product\n description: >\n Describe the purpose and scope of this data product.\n\n # ── Governance ──────────────────────────────────────────────\n owner: team-name\n tier: bronze # bronze | silver | gold\n trust_status: draft # draft | reviewed | verified\n grain: One row per ...\n tags: []\n\n # ── Glossary ────────────────────────────────────────────────\n glossary: []\n # - term: Business Term\n # definition: What this term means in your organization.\n # related_fields:\n # - dataset_name.field_name\n\n # ── Datasets ────────────────────────────────────────────────\n datasets:\n - name: example_table\n description: Describe this table\n schema: public\n table: example_table\n grain: primary_key_column\n fields:\n - name: id\n expression: id\n description: Primary key\n semantic_role: identifier\n\n - name: created_at\n expression: created_at\n description: Row creation timestamp\n semantic_role: time\n\n # Add more fields...\n\n # ── Relationships ───────────────────────────────────────────\n relationships: []\n # - name: table_a_to_table_b\n # from:\n # dataset: table_a\n # columns: [foreign_key]\n # to:\n # dataset: table_b\n # columns: [primary_key]\n # cardinality: many_to_one\n\n # ── Metrics ─────────────────────────────────────────────────\n metrics: []\n # - name: total_revenue\n # expression: SUM(amount)\n # description: Total revenue\n # ai_context:\n # instructions: Always filter to completed transactions.\n # synonyms: [revenue, sales]\n\n # ── Golden Queries ──────────────────────────────────────────\n golden_queries: []\n # - name: example_query\n # description: What this query answers\n # sql: |\n # SELECT ...\n # verified: false\n`;\n\n/**\n * Register the `context://data-product/template` resource.\n * Returns a blank OSI-compliant data product YAML template.\n */\nexport function registerDataProductResource(server: McpServer, manifest: Manifest): void {\n // Static resource: blank template\n server.resource(\n 'data-product-template',\n 'context://data-product/template',\n { description: 'Blank AI Blueprint template — use as a starting point for new data products (OSI v1.0)' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/yaml',\n text: DATA_PRODUCT_TEMPLATE,\n },\n ],\n }),\n );\n\n // Dynamic resource: export a model as a data product YAML\n server.resource(\n 'data-product',\n new ResourceTemplate('context://data-product/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.models).map((name) => ({\n uri: `context://data-product/${name}`,\n name: `${name} AI Blueprint`,\n description: `AI Blueprint for ${name} — full semantic spec as portable OSI YAML`,\n })),\n }),\n }),\n { description: 'Export a data product as an AI Blueprint — the complete semantic spec in portable OSI YAML' },\n async (uri, { name }) => {\n const modelName = String(name);\n const view = buildModelView(modelName, manifest);\n if (!view) {\n throw new Error(`Model '${modelName}' not found`);\n }\n\n const yaml = modelViewToYaml(modelName, view, manifest);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/yaml',\n text: yaml,\n },\n ],\n };\n },\n );\n}\n\n/**\n * Convert a model view into an OSI-compliant data product YAML string.\n */\nfunction modelViewToYaml(name: string, view: Record<string, unknown>, manifest: Manifest): string {\n const model = view.model as Record<string, unknown> | undefined;\n const governance = view.governance as Record<string, unknown> | undefined;\n const rules = view.rules as Record<string, unknown> | undefined;\n const tier = view.tier as Record<string, unknown> | undefined;\n\n const lines: string[] = [\n `# ${name}.data-product.osi.yaml`,\n `# AI Blueprint — Open Semantic Interchange (OSI) v1.0`,\n `# Exported from ContextKit`,\n ``,\n `osi_version: \"1.0\"`,\n ``,\n `semantic_model:`,\n ` name: ${name}`,\n ];\n\n if (model && typeof model === 'object') {\n const desc = (model as Record<string, unknown>).description;\n if (desc) lines.push(` description: ${JSON.stringify(String(desc))}`);\n }\n\n if (governance) {\n const gov = governance as Record<string, unknown>;\n if (gov.owner) lines.push(` owner: ${gov.owner}`);\n if (gov.trust_status) lines.push(` trust_status: ${gov.trust_status}`);\n }\n\n if (tier) {\n const t = tier as Record<string, unknown>;\n if (t.current) lines.push(` tier: ${t.current}`);\n }\n\n // Glossary\n const terms = manifest.terms;\n if (terms && Object.keys(terms).length > 0) {\n lines.push(``, ` glossary:`);\n for (const [termName, termDef] of Object.entries(terms)) {\n const def = termDef as unknown as Record<string, unknown>;\n lines.push(` - term: ${termName}`);\n if (def.definition) lines.push(` definition: ${JSON.stringify(String(def.definition))}`);\n }\n }\n\n // Datasets (from model)\n if (model) {\n const m = model as Record<string, unknown>;\n const datasets = m.datasets as Array<Record<string, unknown>> | undefined;\n if (datasets && datasets.length > 0) {\n lines.push(``, ` datasets:`);\n for (const ds of datasets) {\n lines.push(` - name: ${ds.name}`);\n if (ds.description) lines.push(` description: ${JSON.stringify(String(ds.description))}`);\n if (ds.schema) lines.push(` schema: ${ds.schema}`);\n if (ds.table) lines.push(` table: ${ds.table}`);\n\n const fields = ds.fields as Array<Record<string, unknown>> | undefined;\n if (fields && fields.length > 0) {\n lines.push(` fields:`);\n for (const f of fields) {\n lines.push(` - name: ${f.name}`);\n if (f.expression) lines.push(` expression: ${f.expression}`);\n if (f.description) lines.push(` description: ${JSON.stringify(String(f.description))}`);\n if (f.semantic_role) lines.push(` semantic_role: ${f.semantic_role}`);\n if (f.dimension) lines.push(` dimension: true`);\n if (f.label) lines.push(` label: true`);\n }\n }\n }\n }\n\n // Relationships\n const rels = m.relationships as Array<Record<string, unknown>> | undefined;\n if (rels && rels.length > 0) {\n lines.push(``, ` relationships:`);\n for (const r of rels) {\n lines.push(` - name: ${r.name}`);\n const from = r.from as Record<string, unknown> | undefined;\n const to = r.to as Record<string, unknown> | undefined;\n if (from) {\n lines.push(` from:`);\n lines.push(` dataset: ${from.dataset}`);\n if (from.columns) lines.push(` columns: ${JSON.stringify(from.columns)}`);\n }\n if (to) {\n lines.push(` to:`);\n lines.push(` dataset: ${to.dataset}`);\n if (to.columns) lines.push(` columns: ${JSON.stringify(to.columns)}`);\n }\n }\n }\n\n // Metrics\n const metrics = m.metrics as Array<Record<string, unknown>> | undefined;\n if (metrics && metrics.length > 0) {\n lines.push(``, ` metrics:`);\n for (const met of metrics) {\n lines.push(` - name: ${met.name}`);\n if (met.expression) lines.push(` expression: ${met.expression}`);\n if (met.description) lines.push(` description: ${JSON.stringify(String(met.description))}`);\n }\n }\n }\n\n // Business rules\n if (rules && typeof rules === 'object') {\n const ruleEntries = Object.entries(rules);\n if (ruleEntries.length > 0) {\n lines.push(``, ` business_rules:`);\n for (const [ruleName, ruleDef] of ruleEntries) {\n const r = ruleDef as Record<string, unknown>;\n lines.push(` - name: ${ruleName}`);\n if (r.description) lines.push(` description: ${JSON.stringify(String(r.description))}`);\n if (r.rule) lines.push(` rule: ${JSON.stringify(String(r.rule))}`);\n }\n }\n }\n\n // Golden queries from rules\n if (rules && typeof rules === 'object') {\n const r = rules as Record<string, unknown>;\n const goldenQueries = r.golden_queries as Array<Record<string, unknown>> | undefined;\n if (goldenQueries && goldenQueries.length > 0) {\n lines.push(``, ` golden_queries:`);\n for (const gq of goldenQueries) {\n lines.push(` - name: ${gq.name}`);\n if (gq.description) lines.push(` description: ${JSON.stringify(String(gq.description))}`);\n if (gq.sql) {\n lines.push(` sql: |`);\n const sqlLines = String(gq.sql).split('\\n');\n for (const sl of sqlLines) {\n lines.push(` ${sl}`);\n }\n }\n lines.push(` verified: ${gq.verified ?? false}`);\n }\n }\n }\n\n lines.push(``);\n return lines.join('\\n');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest } from '@runcontext/core';\n\nexport interface SearchResult {\n type: 'model' | 'dataset' | 'field' | 'term' | 'owner';\n name: string;\n description?: string;\n model?: string;\n dataset?: string;\n}\n\n/**\n * Perform keyword search across all node types in the manifest.\n */\nexport function searchManifest(manifest: Manifest, query: string): SearchResult[] {\n const results: SearchResult[] = [];\n const q = query.toLowerCase();\n\n // Search models\n for (const [name, model] of Object.entries(manifest.models)) {\n if (\n name.toLowerCase().includes(q) ||\n model.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'model',\n name,\n description: model.description,\n });\n }\n\n // Search datasets\n for (const ds of model.datasets ?? []) {\n if (\n ds.name.toLowerCase().includes(q) ||\n ds.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'dataset',\n name: ds.name,\n description: ds.description,\n model: name,\n });\n }\n\n // Search fields\n if (ds.fields) {\n for (const field of ds.fields) {\n if (\n field.name.toLowerCase().includes(q) ||\n field.description?.toLowerCase().includes(q) ||\n field.label?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'field',\n name: field.name,\n description: field.description,\n model: name,\n dataset: ds.name,\n });\n }\n }\n }\n }\n }\n\n // Search terms\n for (const [id, term] of Object.entries(manifest.terms)) {\n if (\n id.toLowerCase().includes(q) ||\n term.definition.toLowerCase().includes(q) ||\n term.synonyms?.some((s) => s.toLowerCase().includes(q))\n ) {\n results.push({\n type: 'term',\n name: id,\n description: term.definition,\n });\n }\n }\n\n // Search owners\n for (const [id, owner] of Object.entries(manifest.owners)) {\n if (\n id.toLowerCase().includes(q) ||\n owner.display_name.toLowerCase().includes(q) ||\n owner.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'owner',\n name: id,\n description: owner.display_name,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Register the `context_search` tool.\n * Keyword search across all node types (models, datasets, fields, terms, owners).\n */\nexport function registerSearchTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_search',\n 'Search across all ContextKit nodes (models, datasets, fields, terms, owners) by keyword',\n { query: z.string().describe('Keyword to search for') },\n async ({ query }) => {\n const results = searchManifest(manifest, query);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest } from '@runcontext/core';\n\nexport interface ExplainResult {\n model: Record<string, unknown>;\n governance: Record<string, unknown> | null;\n rules: Record<string, unknown> | null;\n lineage: Record<string, unknown> | null;\n tier: Record<string, unknown> | null;\n owner: Record<string, unknown> | null;\n relatedTerms: Record<string, unknown>[];\n}\n\n/**\n * Deep lookup for a model with all related governance context.\n */\nexport function explainModel(name: string, manifest: Manifest): ExplainResult | null {\n const model = manifest.models[name];\n if (!model) return null;\n\n const governance = manifest.governance[name] ?? null;\n const rules = manifest.rules[name] ?? null;\n const lineage = manifest.lineage[name] ?? null;\n const tier = manifest.tiers[name] ?? null;\n\n // Find the owner\n const ownerKey = governance?.owner;\n const owner = ownerKey ? (manifest.owners[ownerKey] ?? null) : null;\n\n // Find related glossary terms — terms whose tags overlap with model tags\n const modelTags = governance?.tags ?? [];\n const relatedTerms: Record<string, unknown>[] = [];\n for (const [, term] of Object.entries(manifest.terms)) {\n const termTags = term.tags ?? [];\n const hasOverlap = modelTags.some((t) => termTags.includes(t));\n const mapsToModel = term.maps_to?.some((m) => m === name);\n if (hasOverlap || mapsToModel) {\n relatedTerms.push(term as unknown as Record<string, unknown>);\n }\n }\n\n return {\n model: model as unknown as Record<string, unknown>,\n governance: governance as unknown as Record<string, unknown> | null,\n rules: rules as unknown as Record<string, unknown> | null,\n lineage: lineage as unknown as Record<string, unknown> | null,\n tier: tier as unknown as Record<string, unknown> | null,\n owner: owner as unknown as Record<string, unknown> | null,\n relatedTerms,\n };\n}\n\n/**\n * Register the `context_explain` tool.\n * Deep lookup with related governance for a model.\n */\nexport function registerExplainTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_explain',\n 'Deep lookup of a model with all related governance, rules, lineage, tier, owner, and glossary terms',\n { model: z.string().describe('Name of the model to explain') },\n async ({ model }) => {\n const result = explainModel(model, manifest);\n if (!result) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Model '${model}' not found` }),\n },\n ],\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ContextGraph, Diagnostic } from '@runcontext/core';\nimport { LintEngine, ALL_RULES } from '@runcontext/core';\n\nexport interface ValidateResult {\n totalDiagnostics: number;\n errors: number;\n warnings: number;\n diagnostics: Diagnostic[];\n}\n\n/**\n * Run the full linter against the context graph.\n */\nexport function validateGraph(graph: ContextGraph): ValidateResult {\n const engine = new LintEngine();\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n\n const diagnostics = engine.run(graph);\n const errors = diagnostics.filter((d) => d.severity === 'error').length;\n const warnings = diagnostics.filter((d) => d.severity === 'warning').length;\n\n return {\n totalDiagnostics: diagnostics.length,\n errors,\n warnings,\n diagnostics,\n };\n}\n\n/**\n * Register the `context_validate` tool.\n * Runs the linter and returns diagnostics.\n */\nexport function registerValidateTool(server: McpServer, graph: ContextGraph): void {\n server.tool(\n 'context_validate',\n 'Run ContextKit linter against the context graph and return diagnostics',\n {},\n async () => {\n const result = validateGraph(graph);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ContextGraph, TierScore } from '@runcontext/core';\nimport { computeTier } from '@runcontext/core';\n\n/**\n * Compute the tier for a model from the context graph.\n */\nexport function computeModelTier(modelName: string, graph: ContextGraph): TierScore | null {\n if (!graph.models.has(modelName)) return null;\n return computeTier(modelName, graph);\n}\n\n/**\n * Register the `context_tier` tool.\n * Computes the tier scorecard for a specified model.\n */\nexport function registerTierTool(server: McpServer, graph: ContextGraph): void {\n server.tool(\n 'context_tier',\n 'Compute the metadata tier (none/bronze/silver/gold) for a model with detailed check results',\n { model: z.string().describe('Name of the model to tier') },\n async ({ model }) => {\n const result = computeModelTier(model, graph);\n if (!result) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Model '${model}' not found` }),\n },\n ],\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest, GoldenQuery } from '@runcontext/core';\n\nexport interface GoldenQueryMatch {\n model: string;\n query: GoldenQuery;\n score: number;\n}\n\n/**\n * Find golden queries matching a natural-language question.\n * Uses simple keyword overlap scoring.\n */\nexport function findGoldenQueries(manifest: Manifest, question: string): GoldenQueryMatch[] {\n const stopWords = new Set(['a', 'an', 'the', 'is', 'in', 'on', 'at', 'to', 'of', 'for', 'and', 'or', 'not']);\n const qWords = question.toLowerCase().split(/\\s+/).filter((w) => w.length > 0 && !stopWords.has(w));\n const matches: GoldenQueryMatch[] = [];\n\n for (const [modelName, rules] of Object.entries(manifest.rules)) {\n if (!rules.golden_queries) continue;\n\n for (const gq of rules.golden_queries) {\n const gqWords = gq.question.toLowerCase().split(/\\s+/);\n const overlap = qWords.filter((w) => gqWords.some((gw) => gw.includes(w))).length;\n if (overlap > 0) {\n matches.push({\n model: modelName,\n query: gq,\n score: overlap / Math.max(qWords.length, 1),\n });\n }\n }\n }\n\n // Sort by score descending\n matches.sort((a, b) => b.score - a.score);\n return matches;\n}\n\n/**\n * Register the `context_golden_query` tool.\n * Finds golden queries matching a given question.\n */\nexport function registerGoldenQueryTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_golden_query',\n 'Find golden SQL queries that match a natural-language question',\n { question: z.string().describe('Natural-language question to match against golden queries') },\n async ({ question }) => {\n const results = findGoldenQueries(manifest, question);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest, GuardrailFilter } from '@runcontext/core';\n\nexport interface GuardrailMatch {\n model: string;\n filter: GuardrailFilter;\n}\n\n/**\n * Find guardrail filters that apply to the given tables.\n */\nexport function findGuardrails(manifest: Manifest, tables: string[]): GuardrailMatch[] {\n const matches: GuardrailMatch[] = [];\n const tableSet = new Set(tables.map((t) => t.toLowerCase()));\n\n for (const [modelName, rules] of Object.entries(manifest.rules)) {\n if (!rules.guardrail_filters) continue;\n\n for (const gf of rules.guardrail_filters) {\n // A guardrail matches if:\n // 1. It has no tables restriction (applies globally), or\n // 2. Any of its tables match the requested tables\n const applies =\n !gf.tables ||\n gf.tables.length === 0 ||\n gf.tables.some((t) => tableSet.has(t.toLowerCase()));\n\n if (applies) {\n matches.push({\n model: modelName,\n filter: gf,\n });\n }\n }\n }\n\n return matches;\n}\n\n/**\n * Register the `context_guardrails` tool.\n * Returns guardrail filters for given tables.\n */\nexport function registerGuardrailsTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_guardrails',\n 'Return guardrail filters that apply to the specified tables',\n {\n tables: z.array(z.string()).describe('List of table names to check guardrails for'),\n },\n async ({ tables }) => {\n const results = findGuardrails(manifest, tables);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n"]}
1
+ {"version":3,"sources":["/Users/erickittelson/Desktop/ContextKit/packages/mcp/dist/index.cjs","../src/server.ts","../src/resources/manifest.ts","../src/resources/model.ts","../src/resources/glossary.ts","../src/resources/tier.ts","../src/resources/data-product.ts","../src/tools/search.ts","../src/tools/explain.ts","../src/tools/validate.ts","../src/tools/tier.ts","../src/tools/golden-query.ts","../src/tools/guardrails.ts"],"names":["ResourceTemplate"],"mappings":"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","file":"/Users/erickittelson/Desktop/ContextKit/packages/mcp/dist/index.cjs","sourcesContent":[null,"import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';\nimport type { Manifest, ContextGraph, ContextKitConfig } from '@runcontext/core';\nimport { compile, emitManifest, loadConfig } from '@runcontext/core';\n\nimport { registerManifestResource } from './resources/manifest.js';\nimport { registerModelResource } from './resources/model.js';\nimport { registerGlossaryResource } from './resources/glossary.js';\nimport { registerTierResource } from './resources/tier.js';\nimport { registerDataProductResource } from './resources/data-product.js';\n\nimport { registerSearchTool } from './tools/search.js';\nimport { registerExplainTool } from './tools/explain.js';\nimport { registerValidateTool } from './tools/validate.js';\nimport { registerTierTool } from './tools/tier.js';\nimport { registerGoldenQueryTool } from './tools/golden-query.js';\nimport { registerGuardrailsTool } from './tools/guardrails.js';\n\n/**\n * Create and configure an MCP server with all ContextKit resources and tools.\n *\n * Use this for testing or embedding — no transport is connected.\n */\nexport function createServer(manifest: Manifest, graph: ContextGraph): McpServer {\n const server = new McpServer({\n name: 'contextkit',\n version: '0.4.4',\n });\n\n // Register resources (5)\n registerManifestResource(server, manifest);\n registerModelResource(server, manifest);\n registerGlossaryResource(server, manifest);\n registerTierResource(server, manifest);\n registerDataProductResource(server, manifest);\n\n // Register tools (6)\n registerSearchTool(server, manifest);\n registerExplainTool(server, manifest);\n registerValidateTool(server, graph);\n registerTierTool(server, graph);\n registerGoldenQueryTool(server, manifest);\n registerGuardrailsTool(server, manifest);\n\n return server;\n}\n\n/**\n * Compile context, create server, and connect stdio transport.\n *\n * This is the main entry point for running the MCP server as a process.\n */\nexport async function startServer(options?: {\n contextDir?: string;\n rootDir?: string;\n}): Promise<McpServer> {\n const rootDir = options?.rootDir ?? process.cwd();\n const config = loadConfig(rootDir);\n const contextDir = options?.contextDir ?? config.context_dir;\n\n const { graph } = await compile({ contextDir, config });\n const manifest = emitManifest(graph, config);\n const server = createServer(manifest, graph);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n return server;\n}\n\n/**\n * Compile context, create server, and serve over HTTP.\n *\n * Each request gets a fresh McpServer + transport (stateless mode).\n * The graph is compiled once at startup and reused for all requests.\n */\nexport async function startServerHttp(options?: {\n contextDir?: string;\n rootDir?: string;\n port?: number;\n host?: string;\n}): Promise<void> {\n const rootDir = options?.rootDir ?? process.cwd();\n const config = loadConfig(rootDir);\n const contextDir = options?.contextDir ?? config.context_dir;\n\n const { graph } = await compile({ contextDir, config });\n const manifest = emitManifest(graph, config);\n\n const host = options?.host ?? '0.0.0.0';\n const app = createMcpExpressApp({ host });\n\n // Stateless: new server + transport per POST (per MCP SDK pattern)\n app.post('/mcp', async (req, res) => {\n try {\n const server = createServer(manifest, graph);\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, req.body);\n res.on('close', () => {\n transport.close();\n server.close();\n });\n } catch (error) {\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n });\n }\n }\n });\n\n // GET /mcp and DELETE /mcp are not supported in stateless mode\n app.get('/mcp', (_req, res) => {\n res.writeHead(405).end(JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed.' },\n id: null,\n }));\n });\n\n app.delete('/mcp', (_req, res) => {\n res.writeHead(405).end(JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed.' },\n id: null,\n }));\n });\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', models: [...graph.models.keys()] });\n });\n\n const port = options?.port ?? 3000;\n app.listen(port, host, () => {\n console.error(`ContextKit MCP server listening on http://${host}:${port}/mcp`);\n console.error(`Health check: http://${host}:${port}/health`);\n });\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://manifest` resource.\n * Returns the full compiled manifest as JSON.\n */\nexport function registerManifestResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'manifest',\n 'context://manifest',\n { description: 'Full ContextKit manifest JSON (models, governance, rules, lineage, terms, owners, tiers)' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest, null, 2),\n },\n ],\n }),\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Build a merged view of a model: OSI model + governance + rules + lineage + tier.\n */\nexport function buildModelView(name: string, manifest: Manifest): Record<string, unknown> | null {\n const model = manifest.models[name];\n if (!model) return null;\n\n return {\n model,\n governance: manifest.governance[name] ?? null,\n rules: manifest.rules[name] ?? null,\n lineage: manifest.lineage[name] ?? null,\n tier: manifest.tiers[name] ?? null,\n };\n}\n\n/**\n * Register the `context://model/{name}` resource template.\n * Returns the OSI model merged with governance, rules, lineage, and tier data.\n */\nexport function registerModelResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'model',\n new ResourceTemplate('context://model/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.models).map((name) => ({\n uri: `context://model/${name}`,\n name,\n description: manifest.models[name]?.description ?? `Model: ${name}`,\n })),\n }),\n }),\n { description: 'OSI semantic model merged with governance, rules, lineage, and tier' },\n async (uri, { name }) => {\n const modelName = String(name);\n const view = buildModelView(modelName, manifest);\n if (!view) {\n throw new Error(`Model '${modelName}' not found`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(view, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://glossary` resource.\n * Returns all glossary terms as JSON.\n */\nexport function registerGlossaryResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'glossary',\n 'context://glossary',\n { description: 'All ContextKit glossary terms with definitions, synonyms, and mappings' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest.terms, null, 2),\n },\n ],\n }),\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://tier/{name}` resource template.\n * Returns the tier scorecard for a specific model.\n */\nexport function registerTierResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'tier',\n new ResourceTemplate('context://tier/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.tiers).map((name) => ({\n uri: `context://tier/${name}`,\n name,\n description: `Tier scorecard for model: ${name} (${manifest.tiers[name]?.tier ?? 'unknown'})`,\n })),\n }),\n }),\n { description: 'Tier scorecard for a model (bronze/silver/gold checks and results)' },\n async (uri, { name }) => {\n const modelName = String(name);\n const tier = manifest.tiers[modelName];\n if (!tier) {\n throw new Error(`Tier data for model '${modelName}' not found`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(tier, null, 2),\n },\n ],\n };\n },\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\nimport { buildModelView } from './model.js';\n\nconst DATA_PRODUCT_TEMPLATE = `# data-product.osi.yaml\n# AI Blueprint — Open Semantic Interchange (OSI) v1.0\n# The complete semantic spec for a data product, ready for any AI agent.\n# Fill in the sections below to describe your data model.\n\nosi_version: \"1.0\"\n\nsemantic_model:\n name: my_data_product\n description: >\n Describe the purpose and scope of this data product.\n\n # ── Governance ──────────────────────────────────────────────\n owner: team-name\n tier: bronze # bronze | silver | gold\n trust_status: draft # draft | reviewed | verified\n grain: One row per ...\n tags: []\n\n # ── Glossary ────────────────────────────────────────────────\n glossary: []\n # - term: Business Term\n # definition: What this term means in your organization.\n # related_fields:\n # - dataset_name.field_name\n\n # ── Datasets ────────────────────────────────────────────────\n datasets:\n - name: example_table\n description: Describe this table\n schema: public\n table: example_table\n grain: primary_key_column\n fields:\n - name: id\n expression: id\n description: Primary key\n semantic_role: identifier\n\n - name: created_at\n expression: created_at\n description: Row creation timestamp\n semantic_role: time\n\n # Add more fields...\n\n # ── Relationships ───────────────────────────────────────────\n relationships: []\n # - name: table_a_to_table_b\n # from:\n # dataset: table_a\n # columns: [foreign_key]\n # to:\n # dataset: table_b\n # columns: [primary_key]\n # cardinality: many_to_one\n\n # ── Metrics ─────────────────────────────────────────────────\n metrics: []\n # - name: total_revenue\n # expression: SUM(amount)\n # description: Total revenue\n # ai_context:\n # instructions: Always filter to completed transactions.\n # synonyms: [revenue, sales]\n\n # ── Golden Queries ──────────────────────────────────────────\n golden_queries: []\n # - name: example_query\n # description: What this query answers\n # sql: |\n # SELECT ...\n # verified: false\n`;\n\n/**\n * Register the `context://data-product/template` resource.\n * Returns a blank OSI-compliant data product YAML template.\n */\nexport function registerDataProductResource(server: McpServer, manifest: Manifest): void {\n // Static resource: blank template\n server.resource(\n 'data-product-template',\n 'context://data-product/template',\n { description: 'Blank AI Blueprint template — use as a starting point for new data products (OSI v1.0)' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/yaml',\n text: DATA_PRODUCT_TEMPLATE,\n },\n ],\n }),\n );\n\n // Dynamic resource: export a model as a data product YAML\n server.resource(\n 'data-product',\n new ResourceTemplate('context://data-product/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.models).map((name) => ({\n uri: `context://data-product/${name}`,\n name: `${name} AI Blueprint`,\n description: `AI Blueprint for ${name} — full semantic spec as portable OSI YAML`,\n })),\n }),\n }),\n { description: 'Export a data product as an AI Blueprint — the complete semantic spec in portable OSI YAML' },\n async (uri, { name }) => {\n const modelName = String(name);\n const view = buildModelView(modelName, manifest);\n if (!view) {\n throw new Error(`Model '${modelName}' not found`);\n }\n\n const yaml = modelViewToYaml(modelName, view, manifest);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/yaml',\n text: yaml,\n },\n ],\n };\n },\n );\n}\n\n/**\n * Convert a model view into an OSI-compliant data product YAML string.\n */\nfunction modelViewToYaml(name: string, view: Record<string, unknown>, manifest: Manifest): string {\n const model = view.model as Record<string, unknown> | undefined;\n const governance = view.governance as Record<string, unknown> | undefined;\n const rules = view.rules as Record<string, unknown> | undefined;\n const tier = view.tier as Record<string, unknown> | undefined;\n\n const lines: string[] = [\n `# ${name}.data-product.osi.yaml`,\n `# AI Blueprint — Open Semantic Interchange (OSI) v1.0`,\n `# Exported from ContextKit`,\n ``,\n `osi_version: \"1.0\"`,\n ``,\n `semantic_model:`,\n ` name: ${name}`,\n ];\n\n if (model && typeof model === 'object') {\n const desc = (model as Record<string, unknown>).description;\n if (desc) lines.push(` description: ${JSON.stringify(String(desc))}`);\n }\n\n if (governance) {\n const gov = governance as Record<string, unknown>;\n if (gov.owner) lines.push(` owner: ${gov.owner}`);\n if (gov.trust_status) lines.push(` trust_status: ${gov.trust_status}`);\n }\n\n if (tier) {\n const t = tier as Record<string, unknown>;\n if (t.current) lines.push(` tier: ${t.current}`);\n }\n\n // Glossary\n const terms = manifest.terms;\n if (terms && Object.keys(terms).length > 0) {\n lines.push(``, ` glossary:`);\n for (const [termName, termDef] of Object.entries(terms)) {\n const def = termDef as unknown as Record<string, unknown>;\n lines.push(` - term: ${termName}`);\n if (def.definition) lines.push(` definition: ${JSON.stringify(String(def.definition))}`);\n }\n }\n\n // Datasets (from model)\n if (model) {\n const m = model as Record<string, unknown>;\n const datasets = m.datasets as Array<Record<string, unknown>> | undefined;\n if (datasets && datasets.length > 0) {\n lines.push(``, ` datasets:`);\n for (const ds of datasets) {\n lines.push(` - name: ${ds.name}`);\n if (ds.description) lines.push(` description: ${JSON.stringify(String(ds.description))}`);\n if (ds.schema) lines.push(` schema: ${ds.schema}`);\n if (ds.table) lines.push(` table: ${ds.table}`);\n\n const fields = ds.fields as Array<Record<string, unknown>> | undefined;\n if (fields && fields.length > 0) {\n lines.push(` fields:`);\n for (const f of fields) {\n lines.push(` - name: ${f.name}`);\n if (f.expression) lines.push(` expression: ${f.expression}`);\n if (f.description) lines.push(` description: ${JSON.stringify(String(f.description))}`);\n if (f.semantic_role) lines.push(` semantic_role: ${f.semantic_role}`);\n if (f.dimension) lines.push(` dimension: true`);\n if (f.label) lines.push(` label: true`);\n }\n }\n }\n }\n\n // Relationships\n const rels = m.relationships as Array<Record<string, unknown>> | undefined;\n if (rels && rels.length > 0) {\n lines.push(``, ` relationships:`);\n for (const r of rels) {\n lines.push(` - name: ${r.name}`);\n const from = r.from as Record<string, unknown> | undefined;\n const to = r.to as Record<string, unknown> | undefined;\n if (from) {\n lines.push(` from:`);\n lines.push(` dataset: ${from.dataset}`);\n if (from.columns) lines.push(` columns: ${JSON.stringify(from.columns)}`);\n }\n if (to) {\n lines.push(` to:`);\n lines.push(` dataset: ${to.dataset}`);\n if (to.columns) lines.push(` columns: ${JSON.stringify(to.columns)}`);\n }\n }\n }\n\n // Metrics\n const metrics = m.metrics as Array<Record<string, unknown>> | undefined;\n if (metrics && metrics.length > 0) {\n lines.push(``, ` metrics:`);\n for (const met of metrics) {\n lines.push(` - name: ${met.name}`);\n if (met.expression) lines.push(` expression: ${met.expression}`);\n if (met.description) lines.push(` description: ${JSON.stringify(String(met.description))}`);\n }\n }\n }\n\n // Business rules\n if (rules && typeof rules === 'object') {\n const ruleEntries = Object.entries(rules);\n if (ruleEntries.length > 0) {\n lines.push(``, ` business_rules:`);\n for (const [ruleName, ruleDef] of ruleEntries) {\n const r = ruleDef as Record<string, unknown>;\n lines.push(` - name: ${ruleName}`);\n if (r.description) lines.push(` description: ${JSON.stringify(String(r.description))}`);\n if (r.rule) lines.push(` rule: ${JSON.stringify(String(r.rule))}`);\n }\n }\n }\n\n // Golden queries from rules\n if (rules && typeof rules === 'object') {\n const r = rules as Record<string, unknown>;\n const goldenQueries = r.golden_queries as Array<Record<string, unknown>> | undefined;\n if (goldenQueries && goldenQueries.length > 0) {\n lines.push(``, ` golden_queries:`);\n for (const gq of goldenQueries) {\n lines.push(` - name: ${gq.name}`);\n if (gq.description) lines.push(` description: ${JSON.stringify(String(gq.description))}`);\n if (gq.sql) {\n lines.push(` sql: |`);\n const sqlLines = String(gq.sql).split('\\n');\n for (const sl of sqlLines) {\n lines.push(` ${sl}`);\n }\n }\n lines.push(` verified: ${gq.verified ?? false}`);\n }\n }\n }\n\n lines.push(``);\n return lines.join('\\n');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest } from '@runcontext/core';\n\nexport interface SearchResult {\n type: 'model' | 'dataset' | 'field' | 'term' | 'owner';\n name: string;\n description?: string;\n model?: string;\n dataset?: string;\n}\n\n/**\n * Perform keyword search across all node types in the manifest.\n */\nexport function searchManifest(manifest: Manifest, query: string): SearchResult[] {\n const results: SearchResult[] = [];\n const q = query.toLowerCase();\n\n // Search models\n for (const [name, model] of Object.entries(manifest.models)) {\n if (\n name.toLowerCase().includes(q) ||\n model.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'model',\n name,\n description: model.description,\n });\n }\n\n // Search datasets\n for (const ds of model.datasets ?? []) {\n if (\n ds.name.toLowerCase().includes(q) ||\n ds.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'dataset',\n name: ds.name,\n description: ds.description,\n model: name,\n });\n }\n\n // Search fields\n if (ds.fields) {\n for (const field of ds.fields) {\n if (\n field.name.toLowerCase().includes(q) ||\n field.description?.toLowerCase().includes(q) ||\n field.label?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'field',\n name: field.name,\n description: field.description,\n model: name,\n dataset: ds.name,\n });\n }\n }\n }\n }\n }\n\n // Search terms\n for (const [id, term] of Object.entries(manifest.terms)) {\n if (\n id.toLowerCase().includes(q) ||\n term.definition.toLowerCase().includes(q) ||\n term.synonyms?.some((s) => s.toLowerCase().includes(q))\n ) {\n results.push({\n type: 'term',\n name: id,\n description: term.definition,\n });\n }\n }\n\n // Search owners\n for (const [id, owner] of Object.entries(manifest.owners)) {\n if (\n id.toLowerCase().includes(q) ||\n owner.display_name.toLowerCase().includes(q) ||\n owner.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'owner',\n name: id,\n description: owner.display_name,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Register the `context_search` tool.\n * Keyword search across all node types (models, datasets, fields, terms, owners).\n */\nexport function registerSearchTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_search',\n 'Search across all ContextKit nodes (models, datasets, fields, terms, owners) by keyword',\n { query: z.string().describe('Keyword to search for') },\n async ({ query }) => {\n const results = searchManifest(manifest, query);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest } from '@runcontext/core';\n\nexport interface ExplainResult {\n model: Record<string, unknown>;\n governance: Record<string, unknown> | null;\n rules: Record<string, unknown> | null;\n lineage: Record<string, unknown> | null;\n tier: Record<string, unknown> | null;\n owner: Record<string, unknown> | null;\n relatedTerms: Record<string, unknown>[];\n}\n\n/**\n * Deep lookup for a model with all related governance context.\n */\nexport function explainModel(name: string, manifest: Manifest): ExplainResult | null {\n const model = manifest.models[name];\n if (!model) return null;\n\n const governance = manifest.governance[name] ?? null;\n const rules = manifest.rules[name] ?? null;\n const lineage = manifest.lineage[name] ?? null;\n const tier = manifest.tiers[name] ?? null;\n\n // Find the owner\n const ownerKey = governance?.owner;\n const owner = ownerKey ? (manifest.owners[ownerKey] ?? null) : null;\n\n // Find related glossary terms — terms whose tags overlap with model tags\n const modelTags = governance?.tags ?? [];\n const relatedTerms: Record<string, unknown>[] = [];\n for (const [, term] of Object.entries(manifest.terms)) {\n const termTags = term.tags ?? [];\n const hasOverlap = modelTags.some((t) => termTags.includes(t));\n const mapsToModel = term.maps_to?.some((m) => m === name);\n if (hasOverlap || mapsToModel) {\n relatedTerms.push(term as unknown as Record<string, unknown>);\n }\n }\n\n return {\n model: model as unknown as Record<string, unknown>,\n governance: governance as unknown as Record<string, unknown> | null,\n rules: rules as unknown as Record<string, unknown> | null,\n lineage: lineage as unknown as Record<string, unknown> | null,\n tier: tier as unknown as Record<string, unknown> | null,\n owner: owner as unknown as Record<string, unknown> | null,\n relatedTerms,\n };\n}\n\n/**\n * Register the `context_explain` tool.\n * Deep lookup with related governance for a model.\n */\nexport function registerExplainTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_explain',\n 'Deep lookup of a model with all related governance, rules, lineage, tier, owner, and glossary terms',\n { model: z.string().describe('Name of the model to explain') },\n async ({ model }) => {\n const result = explainModel(model, manifest);\n if (!result) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Model '${model}' not found` }),\n },\n ],\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ContextGraph, Diagnostic } from '@runcontext/core';\nimport { LintEngine, ALL_RULES } from '@runcontext/core';\n\nexport interface ValidateResult {\n totalDiagnostics: number;\n errors: number;\n warnings: number;\n diagnostics: Diagnostic[];\n}\n\n/**\n * Run the full linter against the context graph.\n */\nexport function validateGraph(graph: ContextGraph): ValidateResult {\n const engine = new LintEngine();\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n\n const diagnostics = engine.run(graph);\n const errors = diagnostics.filter((d) => d.severity === 'error').length;\n const warnings = diagnostics.filter((d) => d.severity === 'warning').length;\n\n return {\n totalDiagnostics: diagnostics.length,\n errors,\n warnings,\n diagnostics,\n };\n}\n\n/**\n * Register the `context_validate` tool.\n * Runs the linter and returns diagnostics.\n */\nexport function registerValidateTool(server: McpServer, graph: ContextGraph): void {\n server.tool(\n 'context_validate',\n 'Run ContextKit linter against the context graph and return diagnostics',\n {},\n async () => {\n const result = validateGraph(graph);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ContextGraph, TierScore } from '@runcontext/core';\nimport { computeTier } from '@runcontext/core';\n\n/**\n * Compute the tier for a model from the context graph.\n */\nexport function computeModelTier(modelName: string, graph: ContextGraph): TierScore | null {\n if (!graph.models.has(modelName)) return null;\n return computeTier(modelName, graph);\n}\n\n/**\n * Register the `context_tier` tool.\n * Computes the tier scorecard for a specified model.\n */\nexport function registerTierTool(server: McpServer, graph: ContextGraph): void {\n server.tool(\n 'context_tier',\n 'Compute the metadata tier (none/bronze/silver/gold) for a model with detailed check results',\n { model: z.string().describe('Name of the model to tier') },\n async ({ model }) => {\n const result = computeModelTier(model, graph);\n if (!result) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Model '${model}' not found` }),\n },\n ],\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest, GoldenQuery } from '@runcontext/core';\n\nexport interface GoldenQueryMatch {\n model: string;\n query: GoldenQuery;\n score: number;\n}\n\n/**\n * Find golden queries matching a natural-language question.\n * Uses simple keyword overlap scoring.\n */\nexport function findGoldenQueries(manifest: Manifest, question: string): GoldenQueryMatch[] {\n const stopWords = new Set(['a', 'an', 'the', 'is', 'in', 'on', 'at', 'to', 'of', 'for', 'and', 'or', 'not']);\n const qWords = question.toLowerCase().split(/\\s+/).filter((w) => w.length > 0 && !stopWords.has(w));\n const matches: GoldenQueryMatch[] = [];\n\n for (const [modelName, rules] of Object.entries(manifest.rules)) {\n if (!rules.golden_queries) continue;\n\n for (const gq of rules.golden_queries) {\n const gqWords = gq.question.toLowerCase().split(/\\s+/);\n const overlap = qWords.filter((w) => gqWords.some((gw) => gw.includes(w))).length;\n if (overlap > 0) {\n matches.push({\n model: modelName,\n query: gq,\n score: overlap / Math.max(qWords.length, 1),\n });\n }\n }\n }\n\n // Sort by score descending\n matches.sort((a, b) => b.score - a.score);\n return matches;\n}\n\n/**\n * Register the `context_golden_query` tool.\n * Finds golden queries matching a given question.\n */\nexport function registerGoldenQueryTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_golden_query',\n 'Find golden SQL queries that match a natural-language question',\n { question: z.string().describe('Natural-language question to match against golden queries') },\n async ({ question }) => {\n const results = findGoldenQueries(manifest, question);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest, GuardrailFilter } from '@runcontext/core';\n\nexport interface GuardrailMatch {\n model: string;\n filter: GuardrailFilter;\n}\n\n/**\n * Find guardrail filters that apply to the given tables.\n */\nexport function findGuardrails(manifest: Manifest, tables: string[]): GuardrailMatch[] {\n const matches: GuardrailMatch[] = [];\n const tableSet = new Set(tables.map((t) => t.toLowerCase()));\n\n for (const [modelName, rules] of Object.entries(manifest.rules)) {\n if (!rules.guardrail_filters) continue;\n\n for (const gf of rules.guardrail_filters) {\n // A guardrail matches if:\n // 1. It has no tables restriction (applies globally), or\n // 2. Any of its tables match the requested tables\n const applies =\n !gf.tables ||\n gf.tables.length === 0 ||\n gf.tables.some((t) => tableSet.has(t.toLowerCase()));\n\n if (applies) {\n matches.push({\n model: modelName,\n filter: gf,\n });\n }\n }\n }\n\n return matches;\n}\n\n/**\n * Register the `context_guardrails` tool.\n * Returns guardrail filters for given tables.\n */\nexport function registerGuardrailsTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_guardrails',\n 'Return guardrail filters that apply to the specified tables',\n {\n tables: z.array(z.string()).describe('List of table names to check guardrails for'),\n },\n async ({ tables }) => {\n const results = findGuardrails(manifest, tables);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n"]}
package/dist/index.mjs CHANGED
@@ -661,7 +661,7 @@ function registerGuardrailsTool(server, manifest) {
661
661
  function createServer(manifest, graph) {
662
662
  const server = new McpServer4({
663
663
  name: "contextkit",
664
- version: "0.4.2"
664
+ version: "0.4.4"
665
665
  });
666
666
  registerManifestResource(server, manifest);
667
667
  registerModelResource(server, manifest);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/resources/manifest.ts","../src/resources/model.ts","../src/resources/glossary.ts","../src/resources/tier.ts","../src/resources/data-product.ts","../src/tools/search.ts","../src/tools/explain.ts","../src/tools/validate.ts","../src/tools/tier.ts","../src/tools/golden-query.ts","../src/tools/guardrails.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';\nimport type { Manifest, ContextGraph, ContextKitConfig } from '@runcontext/core';\nimport { compile, emitManifest, loadConfig } from '@runcontext/core';\n\nimport { registerManifestResource } from './resources/manifest.js';\nimport { registerModelResource } from './resources/model.js';\nimport { registerGlossaryResource } from './resources/glossary.js';\nimport { registerTierResource } from './resources/tier.js';\nimport { registerDataProductResource } from './resources/data-product.js';\n\nimport { registerSearchTool } from './tools/search.js';\nimport { registerExplainTool } from './tools/explain.js';\nimport { registerValidateTool } from './tools/validate.js';\nimport { registerTierTool } from './tools/tier.js';\nimport { registerGoldenQueryTool } from './tools/golden-query.js';\nimport { registerGuardrailsTool } from './tools/guardrails.js';\n\n/**\n * Create and configure an MCP server with all ContextKit resources and tools.\n *\n * Use this for testing or embedding — no transport is connected.\n */\nexport function createServer(manifest: Manifest, graph: ContextGraph): McpServer {\n const server = new McpServer({\n name: 'contextkit',\n version: '0.4.2',\n });\n\n // Register resources (5)\n registerManifestResource(server, manifest);\n registerModelResource(server, manifest);\n registerGlossaryResource(server, manifest);\n registerTierResource(server, manifest);\n registerDataProductResource(server, manifest);\n\n // Register tools (6)\n registerSearchTool(server, manifest);\n registerExplainTool(server, manifest);\n registerValidateTool(server, graph);\n registerTierTool(server, graph);\n registerGoldenQueryTool(server, manifest);\n registerGuardrailsTool(server, manifest);\n\n return server;\n}\n\n/**\n * Compile context, create server, and connect stdio transport.\n *\n * This is the main entry point for running the MCP server as a process.\n */\nexport async function startServer(options?: {\n contextDir?: string;\n rootDir?: string;\n}): Promise<McpServer> {\n const rootDir = options?.rootDir ?? process.cwd();\n const config = loadConfig(rootDir);\n const contextDir = options?.contextDir ?? config.context_dir;\n\n const { graph } = await compile({ contextDir, config });\n const manifest = emitManifest(graph, config);\n const server = createServer(manifest, graph);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n return server;\n}\n\n/**\n * Compile context, create server, and serve over HTTP.\n *\n * Each request gets a fresh McpServer + transport (stateless mode).\n * The graph is compiled once at startup and reused for all requests.\n */\nexport async function startServerHttp(options?: {\n contextDir?: string;\n rootDir?: string;\n port?: number;\n host?: string;\n}): Promise<void> {\n const rootDir = options?.rootDir ?? process.cwd();\n const config = loadConfig(rootDir);\n const contextDir = options?.contextDir ?? config.context_dir;\n\n const { graph } = await compile({ contextDir, config });\n const manifest = emitManifest(graph, config);\n\n const host = options?.host ?? '0.0.0.0';\n const app = createMcpExpressApp({ host });\n\n // Stateless: new server + transport per POST (per MCP SDK pattern)\n app.post('/mcp', async (req, res) => {\n try {\n const server = createServer(manifest, graph);\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, req.body);\n res.on('close', () => {\n transport.close();\n server.close();\n });\n } catch (error) {\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n });\n }\n }\n });\n\n // GET /mcp and DELETE /mcp are not supported in stateless mode\n app.get('/mcp', (_req, res) => {\n res.writeHead(405).end(JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed.' },\n id: null,\n }));\n });\n\n app.delete('/mcp', (_req, res) => {\n res.writeHead(405).end(JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed.' },\n id: null,\n }));\n });\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', models: [...graph.models.keys()] });\n });\n\n const port = options?.port ?? 3000;\n app.listen(port, host, () => {\n console.error(`ContextKit MCP server listening on http://${host}:${port}/mcp`);\n console.error(`Health check: http://${host}:${port}/health`);\n });\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://manifest` resource.\n * Returns the full compiled manifest as JSON.\n */\nexport function registerManifestResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'manifest',\n 'context://manifest',\n { description: 'Full ContextKit manifest JSON (models, governance, rules, lineage, terms, owners, tiers)' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest, null, 2),\n },\n ],\n }),\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Build a merged view of a model: OSI model + governance + rules + lineage + tier.\n */\nexport function buildModelView(name: string, manifest: Manifest): Record<string, unknown> | null {\n const model = manifest.models[name];\n if (!model) return null;\n\n return {\n model,\n governance: manifest.governance[name] ?? null,\n rules: manifest.rules[name] ?? null,\n lineage: manifest.lineage[name] ?? null,\n tier: manifest.tiers[name] ?? null,\n };\n}\n\n/**\n * Register the `context://model/{name}` resource template.\n * Returns the OSI model merged with governance, rules, lineage, and tier data.\n */\nexport function registerModelResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'model',\n new ResourceTemplate('context://model/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.models).map((name) => ({\n uri: `context://model/${name}`,\n name,\n description: manifest.models[name]?.description ?? `Model: ${name}`,\n })),\n }),\n }),\n { description: 'OSI semantic model merged with governance, rules, lineage, and tier' },\n async (uri, { name }) => {\n const modelName = String(name);\n const view = buildModelView(modelName, manifest);\n if (!view) {\n throw new Error(`Model '${modelName}' not found`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(view, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://glossary` resource.\n * Returns all glossary terms as JSON.\n */\nexport function registerGlossaryResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'glossary',\n 'context://glossary',\n { description: 'All ContextKit glossary terms with definitions, synonyms, and mappings' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest.terms, null, 2),\n },\n ],\n }),\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://tier/{name}` resource template.\n * Returns the tier scorecard for a specific model.\n */\nexport function registerTierResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'tier',\n new ResourceTemplate('context://tier/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.tiers).map((name) => ({\n uri: `context://tier/${name}`,\n name,\n description: `Tier scorecard for model: ${name} (${manifest.tiers[name]?.tier ?? 'unknown'})`,\n })),\n }),\n }),\n { description: 'Tier scorecard for a model (bronze/silver/gold checks and results)' },\n async (uri, { name }) => {\n const modelName = String(name);\n const tier = manifest.tiers[modelName];\n if (!tier) {\n throw new Error(`Tier data for model '${modelName}' not found`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(tier, null, 2),\n },\n ],\n };\n },\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\nimport { buildModelView } from './model.js';\n\nconst DATA_PRODUCT_TEMPLATE = `# data-product.osi.yaml\n# AI Blueprint — Open Semantic Interchange (OSI) v1.0\n# The complete semantic spec for a data product, ready for any AI agent.\n# Fill in the sections below to describe your data model.\n\nosi_version: \"1.0\"\n\nsemantic_model:\n name: my_data_product\n description: >\n Describe the purpose and scope of this data product.\n\n # ── Governance ──────────────────────────────────────────────\n owner: team-name\n tier: bronze # bronze | silver | gold\n trust_status: draft # draft | reviewed | verified\n grain: One row per ...\n tags: []\n\n # ── Glossary ────────────────────────────────────────────────\n glossary: []\n # - term: Business Term\n # definition: What this term means in your organization.\n # related_fields:\n # - dataset_name.field_name\n\n # ── Datasets ────────────────────────────────────────────────\n datasets:\n - name: example_table\n description: Describe this table\n schema: public\n table: example_table\n grain: primary_key_column\n fields:\n - name: id\n expression: id\n description: Primary key\n semantic_role: identifier\n\n - name: created_at\n expression: created_at\n description: Row creation timestamp\n semantic_role: time\n\n # Add more fields...\n\n # ── Relationships ───────────────────────────────────────────\n relationships: []\n # - name: table_a_to_table_b\n # from:\n # dataset: table_a\n # columns: [foreign_key]\n # to:\n # dataset: table_b\n # columns: [primary_key]\n # cardinality: many_to_one\n\n # ── Metrics ─────────────────────────────────────────────────\n metrics: []\n # - name: total_revenue\n # expression: SUM(amount)\n # description: Total revenue\n # ai_context:\n # instructions: Always filter to completed transactions.\n # synonyms: [revenue, sales]\n\n # ── Golden Queries ──────────────────────────────────────────\n golden_queries: []\n # - name: example_query\n # description: What this query answers\n # sql: |\n # SELECT ...\n # verified: false\n`;\n\n/**\n * Register the `context://data-product/template` resource.\n * Returns a blank OSI-compliant data product YAML template.\n */\nexport function registerDataProductResource(server: McpServer, manifest: Manifest): void {\n // Static resource: blank template\n server.resource(\n 'data-product-template',\n 'context://data-product/template',\n { description: 'Blank AI Blueprint template — use as a starting point for new data products (OSI v1.0)' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/yaml',\n text: DATA_PRODUCT_TEMPLATE,\n },\n ],\n }),\n );\n\n // Dynamic resource: export a model as a data product YAML\n server.resource(\n 'data-product',\n new ResourceTemplate('context://data-product/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.models).map((name) => ({\n uri: `context://data-product/${name}`,\n name: `${name} AI Blueprint`,\n description: `AI Blueprint for ${name} — full semantic spec as portable OSI YAML`,\n })),\n }),\n }),\n { description: 'Export a data product as an AI Blueprint — the complete semantic spec in portable OSI YAML' },\n async (uri, { name }) => {\n const modelName = String(name);\n const view = buildModelView(modelName, manifest);\n if (!view) {\n throw new Error(`Model '${modelName}' not found`);\n }\n\n const yaml = modelViewToYaml(modelName, view, manifest);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/yaml',\n text: yaml,\n },\n ],\n };\n },\n );\n}\n\n/**\n * Convert a model view into an OSI-compliant data product YAML string.\n */\nfunction modelViewToYaml(name: string, view: Record<string, unknown>, manifest: Manifest): string {\n const model = view.model as Record<string, unknown> | undefined;\n const governance = view.governance as Record<string, unknown> | undefined;\n const rules = view.rules as Record<string, unknown> | undefined;\n const tier = view.tier as Record<string, unknown> | undefined;\n\n const lines: string[] = [\n `# ${name}.data-product.osi.yaml`,\n `# AI Blueprint — Open Semantic Interchange (OSI) v1.0`,\n `# Exported from ContextKit`,\n ``,\n `osi_version: \"1.0\"`,\n ``,\n `semantic_model:`,\n ` name: ${name}`,\n ];\n\n if (model && typeof model === 'object') {\n const desc = (model as Record<string, unknown>).description;\n if (desc) lines.push(` description: ${JSON.stringify(String(desc))}`);\n }\n\n if (governance) {\n const gov = governance as Record<string, unknown>;\n if (gov.owner) lines.push(` owner: ${gov.owner}`);\n if (gov.trust_status) lines.push(` trust_status: ${gov.trust_status}`);\n }\n\n if (tier) {\n const t = tier as Record<string, unknown>;\n if (t.current) lines.push(` tier: ${t.current}`);\n }\n\n // Glossary\n const terms = manifest.terms;\n if (terms && Object.keys(terms).length > 0) {\n lines.push(``, ` glossary:`);\n for (const [termName, termDef] of Object.entries(terms)) {\n const def = termDef as unknown as Record<string, unknown>;\n lines.push(` - term: ${termName}`);\n if (def.definition) lines.push(` definition: ${JSON.stringify(String(def.definition))}`);\n }\n }\n\n // Datasets (from model)\n if (model) {\n const m = model as Record<string, unknown>;\n const datasets = m.datasets as Array<Record<string, unknown>> | undefined;\n if (datasets && datasets.length > 0) {\n lines.push(``, ` datasets:`);\n for (const ds of datasets) {\n lines.push(` - name: ${ds.name}`);\n if (ds.description) lines.push(` description: ${JSON.stringify(String(ds.description))}`);\n if (ds.schema) lines.push(` schema: ${ds.schema}`);\n if (ds.table) lines.push(` table: ${ds.table}`);\n\n const fields = ds.fields as Array<Record<string, unknown>> | undefined;\n if (fields && fields.length > 0) {\n lines.push(` fields:`);\n for (const f of fields) {\n lines.push(` - name: ${f.name}`);\n if (f.expression) lines.push(` expression: ${f.expression}`);\n if (f.description) lines.push(` description: ${JSON.stringify(String(f.description))}`);\n if (f.semantic_role) lines.push(` semantic_role: ${f.semantic_role}`);\n if (f.dimension) lines.push(` dimension: true`);\n if (f.label) lines.push(` label: true`);\n }\n }\n }\n }\n\n // Relationships\n const rels = m.relationships as Array<Record<string, unknown>> | undefined;\n if (rels && rels.length > 0) {\n lines.push(``, ` relationships:`);\n for (const r of rels) {\n lines.push(` - name: ${r.name}`);\n const from = r.from as Record<string, unknown> | undefined;\n const to = r.to as Record<string, unknown> | undefined;\n if (from) {\n lines.push(` from:`);\n lines.push(` dataset: ${from.dataset}`);\n if (from.columns) lines.push(` columns: ${JSON.stringify(from.columns)}`);\n }\n if (to) {\n lines.push(` to:`);\n lines.push(` dataset: ${to.dataset}`);\n if (to.columns) lines.push(` columns: ${JSON.stringify(to.columns)}`);\n }\n }\n }\n\n // Metrics\n const metrics = m.metrics as Array<Record<string, unknown>> | undefined;\n if (metrics && metrics.length > 0) {\n lines.push(``, ` metrics:`);\n for (const met of metrics) {\n lines.push(` - name: ${met.name}`);\n if (met.expression) lines.push(` expression: ${met.expression}`);\n if (met.description) lines.push(` description: ${JSON.stringify(String(met.description))}`);\n }\n }\n }\n\n // Business rules\n if (rules && typeof rules === 'object') {\n const ruleEntries = Object.entries(rules);\n if (ruleEntries.length > 0) {\n lines.push(``, ` business_rules:`);\n for (const [ruleName, ruleDef] of ruleEntries) {\n const r = ruleDef as Record<string, unknown>;\n lines.push(` - name: ${ruleName}`);\n if (r.description) lines.push(` description: ${JSON.stringify(String(r.description))}`);\n if (r.rule) lines.push(` rule: ${JSON.stringify(String(r.rule))}`);\n }\n }\n }\n\n // Golden queries from rules\n if (rules && typeof rules === 'object') {\n const r = rules as Record<string, unknown>;\n const goldenQueries = r.golden_queries as Array<Record<string, unknown>> | undefined;\n if (goldenQueries && goldenQueries.length > 0) {\n lines.push(``, ` golden_queries:`);\n for (const gq of goldenQueries) {\n lines.push(` - name: ${gq.name}`);\n if (gq.description) lines.push(` description: ${JSON.stringify(String(gq.description))}`);\n if (gq.sql) {\n lines.push(` sql: |`);\n const sqlLines = String(gq.sql).split('\\n');\n for (const sl of sqlLines) {\n lines.push(` ${sl}`);\n }\n }\n lines.push(` verified: ${gq.verified ?? false}`);\n }\n }\n }\n\n lines.push(``);\n return lines.join('\\n');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest } from '@runcontext/core';\n\nexport interface SearchResult {\n type: 'model' | 'dataset' | 'field' | 'term' | 'owner';\n name: string;\n description?: string;\n model?: string;\n dataset?: string;\n}\n\n/**\n * Perform keyword search across all node types in the manifest.\n */\nexport function searchManifest(manifest: Manifest, query: string): SearchResult[] {\n const results: SearchResult[] = [];\n const q = query.toLowerCase();\n\n // Search models\n for (const [name, model] of Object.entries(manifest.models)) {\n if (\n name.toLowerCase().includes(q) ||\n model.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'model',\n name,\n description: model.description,\n });\n }\n\n // Search datasets\n for (const ds of model.datasets ?? []) {\n if (\n ds.name.toLowerCase().includes(q) ||\n ds.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'dataset',\n name: ds.name,\n description: ds.description,\n model: name,\n });\n }\n\n // Search fields\n if (ds.fields) {\n for (const field of ds.fields) {\n if (\n field.name.toLowerCase().includes(q) ||\n field.description?.toLowerCase().includes(q) ||\n field.label?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'field',\n name: field.name,\n description: field.description,\n model: name,\n dataset: ds.name,\n });\n }\n }\n }\n }\n }\n\n // Search terms\n for (const [id, term] of Object.entries(manifest.terms)) {\n if (\n id.toLowerCase().includes(q) ||\n term.definition.toLowerCase().includes(q) ||\n term.synonyms?.some((s) => s.toLowerCase().includes(q))\n ) {\n results.push({\n type: 'term',\n name: id,\n description: term.definition,\n });\n }\n }\n\n // Search owners\n for (const [id, owner] of Object.entries(manifest.owners)) {\n if (\n id.toLowerCase().includes(q) ||\n owner.display_name.toLowerCase().includes(q) ||\n owner.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'owner',\n name: id,\n description: owner.display_name,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Register the `context_search` tool.\n * Keyword search across all node types (models, datasets, fields, terms, owners).\n */\nexport function registerSearchTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_search',\n 'Search across all ContextKit nodes (models, datasets, fields, terms, owners) by keyword',\n { query: z.string().describe('Keyword to search for') },\n async ({ query }) => {\n const results = searchManifest(manifest, query);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest } from '@runcontext/core';\n\nexport interface ExplainResult {\n model: Record<string, unknown>;\n governance: Record<string, unknown> | null;\n rules: Record<string, unknown> | null;\n lineage: Record<string, unknown> | null;\n tier: Record<string, unknown> | null;\n owner: Record<string, unknown> | null;\n relatedTerms: Record<string, unknown>[];\n}\n\n/**\n * Deep lookup for a model with all related governance context.\n */\nexport function explainModel(name: string, manifest: Manifest): ExplainResult | null {\n const model = manifest.models[name];\n if (!model) return null;\n\n const governance = manifest.governance[name] ?? null;\n const rules = manifest.rules[name] ?? null;\n const lineage = manifest.lineage[name] ?? null;\n const tier = manifest.tiers[name] ?? null;\n\n // Find the owner\n const ownerKey = governance?.owner;\n const owner = ownerKey ? (manifest.owners[ownerKey] ?? null) : null;\n\n // Find related glossary terms — terms whose tags overlap with model tags\n const modelTags = governance?.tags ?? [];\n const relatedTerms: Record<string, unknown>[] = [];\n for (const [, term] of Object.entries(manifest.terms)) {\n const termTags = term.tags ?? [];\n const hasOverlap = modelTags.some((t) => termTags.includes(t));\n const mapsToModel = term.maps_to?.some((m) => m === name);\n if (hasOverlap || mapsToModel) {\n relatedTerms.push(term as unknown as Record<string, unknown>);\n }\n }\n\n return {\n model: model as unknown as Record<string, unknown>,\n governance: governance as unknown as Record<string, unknown> | null,\n rules: rules as unknown as Record<string, unknown> | null,\n lineage: lineage as unknown as Record<string, unknown> | null,\n tier: tier as unknown as Record<string, unknown> | null,\n owner: owner as unknown as Record<string, unknown> | null,\n relatedTerms,\n };\n}\n\n/**\n * Register the `context_explain` tool.\n * Deep lookup with related governance for a model.\n */\nexport function registerExplainTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_explain',\n 'Deep lookup of a model with all related governance, rules, lineage, tier, owner, and glossary terms',\n { model: z.string().describe('Name of the model to explain') },\n async ({ model }) => {\n const result = explainModel(model, manifest);\n if (!result) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Model '${model}' not found` }),\n },\n ],\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ContextGraph, Diagnostic } from '@runcontext/core';\nimport { LintEngine, ALL_RULES } from '@runcontext/core';\n\nexport interface ValidateResult {\n totalDiagnostics: number;\n errors: number;\n warnings: number;\n diagnostics: Diagnostic[];\n}\n\n/**\n * Run the full linter against the context graph.\n */\nexport function validateGraph(graph: ContextGraph): ValidateResult {\n const engine = new LintEngine();\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n\n const diagnostics = engine.run(graph);\n const errors = diagnostics.filter((d) => d.severity === 'error').length;\n const warnings = diagnostics.filter((d) => d.severity === 'warning').length;\n\n return {\n totalDiagnostics: diagnostics.length,\n errors,\n warnings,\n diagnostics,\n };\n}\n\n/**\n * Register the `context_validate` tool.\n * Runs the linter and returns diagnostics.\n */\nexport function registerValidateTool(server: McpServer, graph: ContextGraph): void {\n server.tool(\n 'context_validate',\n 'Run ContextKit linter against the context graph and return diagnostics',\n {},\n async () => {\n const result = validateGraph(graph);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ContextGraph, TierScore } from '@runcontext/core';\nimport { computeTier } from '@runcontext/core';\n\n/**\n * Compute the tier for a model from the context graph.\n */\nexport function computeModelTier(modelName: string, graph: ContextGraph): TierScore | null {\n if (!graph.models.has(modelName)) return null;\n return computeTier(modelName, graph);\n}\n\n/**\n * Register the `context_tier` tool.\n * Computes the tier scorecard for a specified model.\n */\nexport function registerTierTool(server: McpServer, graph: ContextGraph): void {\n server.tool(\n 'context_tier',\n 'Compute the metadata tier (none/bronze/silver/gold) for a model with detailed check results',\n { model: z.string().describe('Name of the model to tier') },\n async ({ model }) => {\n const result = computeModelTier(model, graph);\n if (!result) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Model '${model}' not found` }),\n },\n ],\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest, GoldenQuery } from '@runcontext/core';\n\nexport interface GoldenQueryMatch {\n model: string;\n query: GoldenQuery;\n score: number;\n}\n\n/**\n * Find golden queries matching a natural-language question.\n * Uses simple keyword overlap scoring.\n */\nexport function findGoldenQueries(manifest: Manifest, question: string): GoldenQueryMatch[] {\n const stopWords = new Set(['a', 'an', 'the', 'is', 'in', 'on', 'at', 'to', 'of', 'for', 'and', 'or', 'not']);\n const qWords = question.toLowerCase().split(/\\s+/).filter((w) => w.length > 0 && !stopWords.has(w));\n const matches: GoldenQueryMatch[] = [];\n\n for (const [modelName, rules] of Object.entries(manifest.rules)) {\n if (!rules.golden_queries) continue;\n\n for (const gq of rules.golden_queries) {\n const gqWords = gq.question.toLowerCase().split(/\\s+/);\n const overlap = qWords.filter((w) => gqWords.some((gw) => gw.includes(w))).length;\n if (overlap > 0) {\n matches.push({\n model: modelName,\n query: gq,\n score: overlap / Math.max(qWords.length, 1),\n });\n }\n }\n }\n\n // Sort by score descending\n matches.sort((a, b) => b.score - a.score);\n return matches;\n}\n\n/**\n * Register the `context_golden_query` tool.\n * Finds golden queries matching a given question.\n */\nexport function registerGoldenQueryTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_golden_query',\n 'Find golden SQL queries that match a natural-language question',\n { question: z.string().describe('Natural-language question to match against golden queries') },\n async ({ question }) => {\n const results = findGoldenQueries(manifest, question);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest, GuardrailFilter } from '@runcontext/core';\n\nexport interface GuardrailMatch {\n model: string;\n filter: GuardrailFilter;\n}\n\n/**\n * Find guardrail filters that apply to the given tables.\n */\nexport function findGuardrails(manifest: Manifest, tables: string[]): GuardrailMatch[] {\n const matches: GuardrailMatch[] = [];\n const tableSet = new Set(tables.map((t) => t.toLowerCase()));\n\n for (const [modelName, rules] of Object.entries(manifest.rules)) {\n if (!rules.guardrail_filters) continue;\n\n for (const gf of rules.guardrail_filters) {\n // A guardrail matches if:\n // 1. It has no tables restriction (applies globally), or\n // 2. Any of its tables match the requested tables\n const applies =\n !gf.tables ||\n gf.tables.length === 0 ||\n gf.tables.some((t) => tableSet.has(t.toLowerCase()));\n\n if (applies) {\n matches.push({\n model: modelName,\n filter: gf,\n });\n }\n }\n }\n\n return matches;\n}\n\n/**\n * Register the `context_guardrails` tool.\n * Returns guardrail filters for given tables.\n */\nexport function registerGuardrailsTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_guardrails',\n 'Return guardrail filters that apply to the specified tables',\n {\n tables: z.array(z.string()).describe('List of table names to check guardrails for'),\n },\n async ({ tables }) => {\n const results = findGuardrails(manifest, tables);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n"],"mappings":"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","names":["McpServer","ResourceTemplate","ResourceTemplate","ResourceTemplate","z","z","z","z","McpServer"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/resources/manifest.ts","../src/resources/model.ts","../src/resources/glossary.ts","../src/resources/tier.ts","../src/resources/data-product.ts","../src/tools/search.ts","../src/tools/explain.ts","../src/tools/validate.ts","../src/tools/tier.ts","../src/tools/golden-query.ts","../src/tools/guardrails.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';\nimport type { Manifest, ContextGraph, ContextKitConfig } from '@runcontext/core';\nimport { compile, emitManifest, loadConfig } from '@runcontext/core';\n\nimport { registerManifestResource } from './resources/manifest.js';\nimport { registerModelResource } from './resources/model.js';\nimport { registerGlossaryResource } from './resources/glossary.js';\nimport { registerTierResource } from './resources/tier.js';\nimport { registerDataProductResource } from './resources/data-product.js';\n\nimport { registerSearchTool } from './tools/search.js';\nimport { registerExplainTool } from './tools/explain.js';\nimport { registerValidateTool } from './tools/validate.js';\nimport { registerTierTool } from './tools/tier.js';\nimport { registerGoldenQueryTool } from './tools/golden-query.js';\nimport { registerGuardrailsTool } from './tools/guardrails.js';\n\n/**\n * Create and configure an MCP server with all ContextKit resources and tools.\n *\n * Use this for testing or embedding — no transport is connected.\n */\nexport function createServer(manifest: Manifest, graph: ContextGraph): McpServer {\n const server = new McpServer({\n name: 'contextkit',\n version: '0.4.4',\n });\n\n // Register resources (5)\n registerManifestResource(server, manifest);\n registerModelResource(server, manifest);\n registerGlossaryResource(server, manifest);\n registerTierResource(server, manifest);\n registerDataProductResource(server, manifest);\n\n // Register tools (6)\n registerSearchTool(server, manifest);\n registerExplainTool(server, manifest);\n registerValidateTool(server, graph);\n registerTierTool(server, graph);\n registerGoldenQueryTool(server, manifest);\n registerGuardrailsTool(server, manifest);\n\n return server;\n}\n\n/**\n * Compile context, create server, and connect stdio transport.\n *\n * This is the main entry point for running the MCP server as a process.\n */\nexport async function startServer(options?: {\n contextDir?: string;\n rootDir?: string;\n}): Promise<McpServer> {\n const rootDir = options?.rootDir ?? process.cwd();\n const config = loadConfig(rootDir);\n const contextDir = options?.contextDir ?? config.context_dir;\n\n const { graph } = await compile({ contextDir, config });\n const manifest = emitManifest(graph, config);\n const server = createServer(manifest, graph);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n return server;\n}\n\n/**\n * Compile context, create server, and serve over HTTP.\n *\n * Each request gets a fresh McpServer + transport (stateless mode).\n * The graph is compiled once at startup and reused for all requests.\n */\nexport async function startServerHttp(options?: {\n contextDir?: string;\n rootDir?: string;\n port?: number;\n host?: string;\n}): Promise<void> {\n const rootDir = options?.rootDir ?? process.cwd();\n const config = loadConfig(rootDir);\n const contextDir = options?.contextDir ?? config.context_dir;\n\n const { graph } = await compile({ contextDir, config });\n const manifest = emitManifest(graph, config);\n\n const host = options?.host ?? '0.0.0.0';\n const app = createMcpExpressApp({ host });\n\n // Stateless: new server + transport per POST (per MCP SDK pattern)\n app.post('/mcp', async (req, res) => {\n try {\n const server = createServer(manifest, graph);\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, req.body);\n res.on('close', () => {\n transport.close();\n server.close();\n });\n } catch (error) {\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n });\n }\n }\n });\n\n // GET /mcp and DELETE /mcp are not supported in stateless mode\n app.get('/mcp', (_req, res) => {\n res.writeHead(405).end(JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed.' },\n id: null,\n }));\n });\n\n app.delete('/mcp', (_req, res) => {\n res.writeHead(405).end(JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed.' },\n id: null,\n }));\n });\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', models: [...graph.models.keys()] });\n });\n\n const port = options?.port ?? 3000;\n app.listen(port, host, () => {\n console.error(`ContextKit MCP server listening on http://${host}:${port}/mcp`);\n console.error(`Health check: http://${host}:${port}/health`);\n });\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://manifest` resource.\n * Returns the full compiled manifest as JSON.\n */\nexport function registerManifestResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'manifest',\n 'context://manifest',\n { description: 'Full ContextKit manifest JSON (models, governance, rules, lineage, terms, owners, tiers)' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest, null, 2),\n },\n ],\n }),\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Build a merged view of a model: OSI model + governance + rules + lineage + tier.\n */\nexport function buildModelView(name: string, manifest: Manifest): Record<string, unknown> | null {\n const model = manifest.models[name];\n if (!model) return null;\n\n return {\n model,\n governance: manifest.governance[name] ?? null,\n rules: manifest.rules[name] ?? null,\n lineage: manifest.lineage[name] ?? null,\n tier: manifest.tiers[name] ?? null,\n };\n}\n\n/**\n * Register the `context://model/{name}` resource template.\n * Returns the OSI model merged with governance, rules, lineage, and tier data.\n */\nexport function registerModelResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'model',\n new ResourceTemplate('context://model/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.models).map((name) => ({\n uri: `context://model/${name}`,\n name,\n description: manifest.models[name]?.description ?? `Model: ${name}`,\n })),\n }),\n }),\n { description: 'OSI semantic model merged with governance, rules, lineage, and tier' },\n async (uri, { name }) => {\n const modelName = String(name);\n const view = buildModelView(modelName, manifest);\n if (!view) {\n throw new Error(`Model '${modelName}' not found`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(view, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://glossary` resource.\n * Returns all glossary terms as JSON.\n */\nexport function registerGlossaryResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'glossary',\n 'context://glossary',\n { description: 'All ContextKit glossary terms with definitions, synonyms, and mappings' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest.terms, null, 2),\n },\n ],\n }),\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\n\n/**\n * Register the `context://tier/{name}` resource template.\n * Returns the tier scorecard for a specific model.\n */\nexport function registerTierResource(server: McpServer, manifest: Manifest): void {\n server.resource(\n 'tier',\n new ResourceTemplate('context://tier/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.tiers).map((name) => ({\n uri: `context://tier/${name}`,\n name,\n description: `Tier scorecard for model: ${name} (${manifest.tiers[name]?.tier ?? 'unknown'})`,\n })),\n }),\n }),\n { description: 'Tier scorecard for a model (bronze/silver/gold checks and results)' },\n async (uri, { name }) => {\n const modelName = String(name);\n const tier = manifest.tiers[modelName];\n if (!tier) {\n throw new Error(`Tier data for model '${modelName}' not found`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(tier, null, 2),\n },\n ],\n };\n },\n );\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Manifest } from '@runcontext/core';\nimport { buildModelView } from './model.js';\n\nconst DATA_PRODUCT_TEMPLATE = `# data-product.osi.yaml\n# AI Blueprint — Open Semantic Interchange (OSI) v1.0\n# The complete semantic spec for a data product, ready for any AI agent.\n# Fill in the sections below to describe your data model.\n\nosi_version: \"1.0\"\n\nsemantic_model:\n name: my_data_product\n description: >\n Describe the purpose and scope of this data product.\n\n # ── Governance ──────────────────────────────────────────────\n owner: team-name\n tier: bronze # bronze | silver | gold\n trust_status: draft # draft | reviewed | verified\n grain: One row per ...\n tags: []\n\n # ── Glossary ────────────────────────────────────────────────\n glossary: []\n # - term: Business Term\n # definition: What this term means in your organization.\n # related_fields:\n # - dataset_name.field_name\n\n # ── Datasets ────────────────────────────────────────────────\n datasets:\n - name: example_table\n description: Describe this table\n schema: public\n table: example_table\n grain: primary_key_column\n fields:\n - name: id\n expression: id\n description: Primary key\n semantic_role: identifier\n\n - name: created_at\n expression: created_at\n description: Row creation timestamp\n semantic_role: time\n\n # Add more fields...\n\n # ── Relationships ───────────────────────────────────────────\n relationships: []\n # - name: table_a_to_table_b\n # from:\n # dataset: table_a\n # columns: [foreign_key]\n # to:\n # dataset: table_b\n # columns: [primary_key]\n # cardinality: many_to_one\n\n # ── Metrics ─────────────────────────────────────────────────\n metrics: []\n # - name: total_revenue\n # expression: SUM(amount)\n # description: Total revenue\n # ai_context:\n # instructions: Always filter to completed transactions.\n # synonyms: [revenue, sales]\n\n # ── Golden Queries ──────────────────────────────────────────\n golden_queries: []\n # - name: example_query\n # description: What this query answers\n # sql: |\n # SELECT ...\n # verified: false\n`;\n\n/**\n * Register the `context://data-product/template` resource.\n * Returns a blank OSI-compliant data product YAML template.\n */\nexport function registerDataProductResource(server: McpServer, manifest: Manifest): void {\n // Static resource: blank template\n server.resource(\n 'data-product-template',\n 'context://data-product/template',\n { description: 'Blank AI Blueprint template — use as a starting point for new data products (OSI v1.0)' },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/yaml',\n text: DATA_PRODUCT_TEMPLATE,\n },\n ],\n }),\n );\n\n // Dynamic resource: export a model as a data product YAML\n server.resource(\n 'data-product',\n new ResourceTemplate('context://data-product/{name}', {\n list: async () => ({\n resources: Object.keys(manifest.models).map((name) => ({\n uri: `context://data-product/${name}`,\n name: `${name} AI Blueprint`,\n description: `AI Blueprint for ${name} — full semantic spec as portable OSI YAML`,\n })),\n }),\n }),\n { description: 'Export a data product as an AI Blueprint — the complete semantic spec in portable OSI YAML' },\n async (uri, { name }) => {\n const modelName = String(name);\n const view = buildModelView(modelName, manifest);\n if (!view) {\n throw new Error(`Model '${modelName}' not found`);\n }\n\n const yaml = modelViewToYaml(modelName, view, manifest);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/yaml',\n text: yaml,\n },\n ],\n };\n },\n );\n}\n\n/**\n * Convert a model view into an OSI-compliant data product YAML string.\n */\nfunction modelViewToYaml(name: string, view: Record<string, unknown>, manifest: Manifest): string {\n const model = view.model as Record<string, unknown> | undefined;\n const governance = view.governance as Record<string, unknown> | undefined;\n const rules = view.rules as Record<string, unknown> | undefined;\n const tier = view.tier as Record<string, unknown> | undefined;\n\n const lines: string[] = [\n `# ${name}.data-product.osi.yaml`,\n `# AI Blueprint — Open Semantic Interchange (OSI) v1.0`,\n `# Exported from ContextKit`,\n ``,\n `osi_version: \"1.0\"`,\n ``,\n `semantic_model:`,\n ` name: ${name}`,\n ];\n\n if (model && typeof model === 'object') {\n const desc = (model as Record<string, unknown>).description;\n if (desc) lines.push(` description: ${JSON.stringify(String(desc))}`);\n }\n\n if (governance) {\n const gov = governance as Record<string, unknown>;\n if (gov.owner) lines.push(` owner: ${gov.owner}`);\n if (gov.trust_status) lines.push(` trust_status: ${gov.trust_status}`);\n }\n\n if (tier) {\n const t = tier as Record<string, unknown>;\n if (t.current) lines.push(` tier: ${t.current}`);\n }\n\n // Glossary\n const terms = manifest.terms;\n if (terms && Object.keys(terms).length > 0) {\n lines.push(``, ` glossary:`);\n for (const [termName, termDef] of Object.entries(terms)) {\n const def = termDef as unknown as Record<string, unknown>;\n lines.push(` - term: ${termName}`);\n if (def.definition) lines.push(` definition: ${JSON.stringify(String(def.definition))}`);\n }\n }\n\n // Datasets (from model)\n if (model) {\n const m = model as Record<string, unknown>;\n const datasets = m.datasets as Array<Record<string, unknown>> | undefined;\n if (datasets && datasets.length > 0) {\n lines.push(``, ` datasets:`);\n for (const ds of datasets) {\n lines.push(` - name: ${ds.name}`);\n if (ds.description) lines.push(` description: ${JSON.stringify(String(ds.description))}`);\n if (ds.schema) lines.push(` schema: ${ds.schema}`);\n if (ds.table) lines.push(` table: ${ds.table}`);\n\n const fields = ds.fields as Array<Record<string, unknown>> | undefined;\n if (fields && fields.length > 0) {\n lines.push(` fields:`);\n for (const f of fields) {\n lines.push(` - name: ${f.name}`);\n if (f.expression) lines.push(` expression: ${f.expression}`);\n if (f.description) lines.push(` description: ${JSON.stringify(String(f.description))}`);\n if (f.semantic_role) lines.push(` semantic_role: ${f.semantic_role}`);\n if (f.dimension) lines.push(` dimension: true`);\n if (f.label) lines.push(` label: true`);\n }\n }\n }\n }\n\n // Relationships\n const rels = m.relationships as Array<Record<string, unknown>> | undefined;\n if (rels && rels.length > 0) {\n lines.push(``, ` relationships:`);\n for (const r of rels) {\n lines.push(` - name: ${r.name}`);\n const from = r.from as Record<string, unknown> | undefined;\n const to = r.to as Record<string, unknown> | undefined;\n if (from) {\n lines.push(` from:`);\n lines.push(` dataset: ${from.dataset}`);\n if (from.columns) lines.push(` columns: ${JSON.stringify(from.columns)}`);\n }\n if (to) {\n lines.push(` to:`);\n lines.push(` dataset: ${to.dataset}`);\n if (to.columns) lines.push(` columns: ${JSON.stringify(to.columns)}`);\n }\n }\n }\n\n // Metrics\n const metrics = m.metrics as Array<Record<string, unknown>> | undefined;\n if (metrics && metrics.length > 0) {\n lines.push(``, ` metrics:`);\n for (const met of metrics) {\n lines.push(` - name: ${met.name}`);\n if (met.expression) lines.push(` expression: ${met.expression}`);\n if (met.description) lines.push(` description: ${JSON.stringify(String(met.description))}`);\n }\n }\n }\n\n // Business rules\n if (rules && typeof rules === 'object') {\n const ruleEntries = Object.entries(rules);\n if (ruleEntries.length > 0) {\n lines.push(``, ` business_rules:`);\n for (const [ruleName, ruleDef] of ruleEntries) {\n const r = ruleDef as Record<string, unknown>;\n lines.push(` - name: ${ruleName}`);\n if (r.description) lines.push(` description: ${JSON.stringify(String(r.description))}`);\n if (r.rule) lines.push(` rule: ${JSON.stringify(String(r.rule))}`);\n }\n }\n }\n\n // Golden queries from rules\n if (rules && typeof rules === 'object') {\n const r = rules as Record<string, unknown>;\n const goldenQueries = r.golden_queries as Array<Record<string, unknown>> | undefined;\n if (goldenQueries && goldenQueries.length > 0) {\n lines.push(``, ` golden_queries:`);\n for (const gq of goldenQueries) {\n lines.push(` - name: ${gq.name}`);\n if (gq.description) lines.push(` description: ${JSON.stringify(String(gq.description))}`);\n if (gq.sql) {\n lines.push(` sql: |`);\n const sqlLines = String(gq.sql).split('\\n');\n for (const sl of sqlLines) {\n lines.push(` ${sl}`);\n }\n }\n lines.push(` verified: ${gq.verified ?? false}`);\n }\n }\n }\n\n lines.push(``);\n return lines.join('\\n');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest } from '@runcontext/core';\n\nexport interface SearchResult {\n type: 'model' | 'dataset' | 'field' | 'term' | 'owner';\n name: string;\n description?: string;\n model?: string;\n dataset?: string;\n}\n\n/**\n * Perform keyword search across all node types in the manifest.\n */\nexport function searchManifest(manifest: Manifest, query: string): SearchResult[] {\n const results: SearchResult[] = [];\n const q = query.toLowerCase();\n\n // Search models\n for (const [name, model] of Object.entries(manifest.models)) {\n if (\n name.toLowerCase().includes(q) ||\n model.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'model',\n name,\n description: model.description,\n });\n }\n\n // Search datasets\n for (const ds of model.datasets ?? []) {\n if (\n ds.name.toLowerCase().includes(q) ||\n ds.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'dataset',\n name: ds.name,\n description: ds.description,\n model: name,\n });\n }\n\n // Search fields\n if (ds.fields) {\n for (const field of ds.fields) {\n if (\n field.name.toLowerCase().includes(q) ||\n field.description?.toLowerCase().includes(q) ||\n field.label?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'field',\n name: field.name,\n description: field.description,\n model: name,\n dataset: ds.name,\n });\n }\n }\n }\n }\n }\n\n // Search terms\n for (const [id, term] of Object.entries(manifest.terms)) {\n if (\n id.toLowerCase().includes(q) ||\n term.definition.toLowerCase().includes(q) ||\n term.synonyms?.some((s) => s.toLowerCase().includes(q))\n ) {\n results.push({\n type: 'term',\n name: id,\n description: term.definition,\n });\n }\n }\n\n // Search owners\n for (const [id, owner] of Object.entries(manifest.owners)) {\n if (\n id.toLowerCase().includes(q) ||\n owner.display_name.toLowerCase().includes(q) ||\n owner.description?.toLowerCase().includes(q)\n ) {\n results.push({\n type: 'owner',\n name: id,\n description: owner.display_name,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Register the `context_search` tool.\n * Keyword search across all node types (models, datasets, fields, terms, owners).\n */\nexport function registerSearchTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_search',\n 'Search across all ContextKit nodes (models, datasets, fields, terms, owners) by keyword',\n { query: z.string().describe('Keyword to search for') },\n async ({ query }) => {\n const results = searchManifest(manifest, query);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest } from '@runcontext/core';\n\nexport interface ExplainResult {\n model: Record<string, unknown>;\n governance: Record<string, unknown> | null;\n rules: Record<string, unknown> | null;\n lineage: Record<string, unknown> | null;\n tier: Record<string, unknown> | null;\n owner: Record<string, unknown> | null;\n relatedTerms: Record<string, unknown>[];\n}\n\n/**\n * Deep lookup for a model with all related governance context.\n */\nexport function explainModel(name: string, manifest: Manifest): ExplainResult | null {\n const model = manifest.models[name];\n if (!model) return null;\n\n const governance = manifest.governance[name] ?? null;\n const rules = manifest.rules[name] ?? null;\n const lineage = manifest.lineage[name] ?? null;\n const tier = manifest.tiers[name] ?? null;\n\n // Find the owner\n const ownerKey = governance?.owner;\n const owner = ownerKey ? (manifest.owners[ownerKey] ?? null) : null;\n\n // Find related glossary terms — terms whose tags overlap with model tags\n const modelTags = governance?.tags ?? [];\n const relatedTerms: Record<string, unknown>[] = [];\n for (const [, term] of Object.entries(manifest.terms)) {\n const termTags = term.tags ?? [];\n const hasOverlap = modelTags.some((t) => termTags.includes(t));\n const mapsToModel = term.maps_to?.some((m) => m === name);\n if (hasOverlap || mapsToModel) {\n relatedTerms.push(term as unknown as Record<string, unknown>);\n }\n }\n\n return {\n model: model as unknown as Record<string, unknown>,\n governance: governance as unknown as Record<string, unknown> | null,\n rules: rules as unknown as Record<string, unknown> | null,\n lineage: lineage as unknown as Record<string, unknown> | null,\n tier: tier as unknown as Record<string, unknown> | null,\n owner: owner as unknown as Record<string, unknown> | null,\n relatedTerms,\n };\n}\n\n/**\n * Register the `context_explain` tool.\n * Deep lookup with related governance for a model.\n */\nexport function registerExplainTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_explain',\n 'Deep lookup of a model with all related governance, rules, lineage, tier, owner, and glossary terms',\n { model: z.string().describe('Name of the model to explain') },\n async ({ model }) => {\n const result = explainModel(model, manifest);\n if (!result) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Model '${model}' not found` }),\n },\n ],\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ContextGraph, Diagnostic } from '@runcontext/core';\nimport { LintEngine, ALL_RULES } from '@runcontext/core';\n\nexport interface ValidateResult {\n totalDiagnostics: number;\n errors: number;\n warnings: number;\n diagnostics: Diagnostic[];\n}\n\n/**\n * Run the full linter against the context graph.\n */\nexport function validateGraph(graph: ContextGraph): ValidateResult {\n const engine = new LintEngine();\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n\n const diagnostics = engine.run(graph);\n const errors = diagnostics.filter((d) => d.severity === 'error').length;\n const warnings = diagnostics.filter((d) => d.severity === 'warning').length;\n\n return {\n totalDiagnostics: diagnostics.length,\n errors,\n warnings,\n diagnostics,\n };\n}\n\n/**\n * Register the `context_validate` tool.\n * Runs the linter and returns diagnostics.\n */\nexport function registerValidateTool(server: McpServer, graph: ContextGraph): void {\n server.tool(\n 'context_validate',\n 'Run ContextKit linter against the context graph and return diagnostics',\n {},\n async () => {\n const result = validateGraph(graph);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ContextGraph, TierScore } from '@runcontext/core';\nimport { computeTier } from '@runcontext/core';\n\n/**\n * Compute the tier for a model from the context graph.\n */\nexport function computeModelTier(modelName: string, graph: ContextGraph): TierScore | null {\n if (!graph.models.has(modelName)) return null;\n return computeTier(modelName, graph);\n}\n\n/**\n * Register the `context_tier` tool.\n * Computes the tier scorecard for a specified model.\n */\nexport function registerTierTool(server: McpServer, graph: ContextGraph): void {\n server.tool(\n 'context_tier',\n 'Compute the metadata tier (none/bronze/silver/gold) for a model with detailed check results',\n { model: z.string().describe('Name of the model to tier') },\n async ({ model }) => {\n const result = computeModelTier(model, graph);\n if (!result) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Model '${model}' not found` }),\n },\n ],\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest, GoldenQuery } from '@runcontext/core';\n\nexport interface GoldenQueryMatch {\n model: string;\n query: GoldenQuery;\n score: number;\n}\n\n/**\n * Find golden queries matching a natural-language question.\n * Uses simple keyword overlap scoring.\n */\nexport function findGoldenQueries(manifest: Manifest, question: string): GoldenQueryMatch[] {\n const stopWords = new Set(['a', 'an', 'the', 'is', 'in', 'on', 'at', 'to', 'of', 'for', 'and', 'or', 'not']);\n const qWords = question.toLowerCase().split(/\\s+/).filter((w) => w.length > 0 && !stopWords.has(w));\n const matches: GoldenQueryMatch[] = [];\n\n for (const [modelName, rules] of Object.entries(manifest.rules)) {\n if (!rules.golden_queries) continue;\n\n for (const gq of rules.golden_queries) {\n const gqWords = gq.question.toLowerCase().split(/\\s+/);\n const overlap = qWords.filter((w) => gqWords.some((gw) => gw.includes(w))).length;\n if (overlap > 0) {\n matches.push({\n model: modelName,\n query: gq,\n score: overlap / Math.max(qWords.length, 1),\n });\n }\n }\n }\n\n // Sort by score descending\n matches.sort((a, b) => b.score - a.score);\n return matches;\n}\n\n/**\n * Register the `context_golden_query` tool.\n * Finds golden queries matching a given question.\n */\nexport function registerGoldenQueryTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_golden_query',\n 'Find golden SQL queries that match a natural-language question',\n { question: z.string().describe('Natural-language question to match against golden queries') },\n async ({ question }) => {\n const results = findGoldenQueries(manifest, question);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { Manifest, GuardrailFilter } from '@runcontext/core';\n\nexport interface GuardrailMatch {\n model: string;\n filter: GuardrailFilter;\n}\n\n/**\n * Find guardrail filters that apply to the given tables.\n */\nexport function findGuardrails(manifest: Manifest, tables: string[]): GuardrailMatch[] {\n const matches: GuardrailMatch[] = [];\n const tableSet = new Set(tables.map((t) => t.toLowerCase()));\n\n for (const [modelName, rules] of Object.entries(manifest.rules)) {\n if (!rules.guardrail_filters) continue;\n\n for (const gf of rules.guardrail_filters) {\n // A guardrail matches if:\n // 1. It has no tables restriction (applies globally), or\n // 2. Any of its tables match the requested tables\n const applies =\n !gf.tables ||\n gf.tables.length === 0 ||\n gf.tables.some((t) => tableSet.has(t.toLowerCase()));\n\n if (applies) {\n matches.push({\n model: modelName,\n filter: gf,\n });\n }\n }\n }\n\n return matches;\n}\n\n/**\n * Register the `context_guardrails` tool.\n * Returns guardrail filters for given tables.\n */\nexport function registerGuardrailsTool(server: McpServer, manifest: Manifest): void {\n server.tool(\n 'context_guardrails',\n 'Return guardrail filters that apply to the specified tables',\n {\n tables: z.array(z.string()).describe('List of table names to check guardrails for'),\n },\n async ({ tables }) => {\n const results = findGuardrails(manifest, tables);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(results, null, 2),\n },\n ],\n };\n },\n );\n}\n"],"mappings":";AAAA,SAAS,aAAAA,kBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,qCAAqC;AAC9C,SAAS,2BAA2B;AAEpC,SAAS,SAAS,cAAc,kBAAkB;;;ACE3C,SAAS,yBAAyB,QAAmB,UAA0B;AACpF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,aAAa,2FAA2F;AAAA,IAC1G,OAAO,SAAS;AAAA,MACd,UAAU;AAAA,QACR;AAAA,UACE,KAAK,IAAI;AAAA,UACT,UAAU;AAAA,UACV,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACtBA,SAAoB,wBAAwB;AAMrC,SAAS,eAAe,MAAc,UAAoD;AAC/F,QAAM,QAAQ,SAAS,OAAO,IAAI;AAClC,MAAI,CAAC,MAAO,QAAO;AAEnB,SAAO;AAAA,IACL;AAAA,IACA,YAAY,SAAS,WAAW,IAAI,KAAK;AAAA,IACzC,OAAO,SAAS,MAAM,IAAI,KAAK;AAAA,IAC/B,SAAS,SAAS,QAAQ,IAAI,KAAK;AAAA,IACnC,MAAM,SAAS,MAAM,IAAI,KAAK;AAAA,EAChC;AACF;AAMO,SAAS,sBAAsB,QAAmB,UAA0B;AACjF,SAAO;AAAA,IACL;AAAA,IACA,IAAI,iBAAiB,0BAA0B;AAAA,MAC7C,MAAM,aAAa;AAAA,QACjB,WAAW,OAAO,KAAK,SAAS,MAAM,EAAE,IAAI,CAAC,UAAU;AAAA,UACrD,KAAK,mBAAmB,IAAI;AAAA,UAC5B;AAAA,UACA,aAAa,SAAS,OAAO,IAAI,GAAG,eAAe,UAAU,IAAI;AAAA,QACnE,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,IACD,EAAE,aAAa,sEAAsE;AAAA,IACrF,OAAO,KAAK,EAAE,KAAK,MAAM;AACvB,YAAM,YAAY,OAAO,IAAI;AAC7B,YAAM,OAAO,eAAe,WAAW,QAAQ;AAC/C,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,UAAU,SAAS,aAAa;AAAA,MAClD;AACA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK,IAAI;AAAA,YACT,UAAU;AAAA,YACV,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC9CO,SAAS,yBAAyB,QAAmB,UAA0B;AACpF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,aAAa,yEAAyE;AAAA,IACxF,OAAO,SAAS;AAAA,MACd,UAAU;AAAA,QACR;AAAA,UACE,KAAK,IAAI;AAAA,UACT,UAAU;AAAA,UACV,MAAM,KAAK,UAAU,SAAS,OAAO,MAAM,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACtBA,SAAoB,oBAAAC,yBAAwB;AAOrC,SAAS,qBAAqB,QAAmB,UAA0B;AAChF,SAAO;AAAA,IACL;AAAA,IACA,IAAIA,kBAAiB,yBAAyB;AAAA,MAC5C,MAAM,aAAa;AAAA,QACjB,WAAW,OAAO,KAAK,SAAS,KAAK,EAAE,IAAI,CAAC,UAAU;AAAA,UACpD,KAAK,kBAAkB,IAAI;AAAA,UAC3B;AAAA,UACA,aAAa,6BAA6B,IAAI,KAAK,SAAS,MAAM,IAAI,GAAG,QAAQ,SAAS;AAAA,QAC5F,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,IACD,EAAE,aAAa,qEAAqE;AAAA,IACpF,OAAO,KAAK,EAAE,KAAK,MAAM;AACvB,YAAM,YAAY,OAAO,IAAI;AAC7B,YAAM,OAAO,SAAS,MAAM,SAAS;AACrC,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,wBAAwB,SAAS,aAAa;AAAA,MAChE;AACA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK,IAAI;AAAA,YACT,UAAU;AAAA,YACV,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrCA,SAAoB,oBAAAC,yBAAwB;AAI5C,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+EvB,SAAS,4BAA4B,QAAmB,UAA0B;AAEvF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,aAAa,8FAAyF;AAAA,IACxG,OAAO,SAAS;AAAA,MACd,UAAU;AAAA,QACR;AAAA,UACE,KAAK,IAAI;AAAA,UACT,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA,IAAIC,kBAAiB,iCAAiC;AAAA,MACpD,MAAM,aAAa;AAAA,QACjB,WAAW,OAAO,KAAK,SAAS,MAAM,EAAE,IAAI,CAAC,UAAU;AAAA,UACrD,KAAK,0BAA0B,IAAI;AAAA,UACnC,MAAM,GAAG,IAAI;AAAA,UACb,aAAa,oBAAoB,IAAI;AAAA,QACvC,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,IACD,EAAE,aAAa,kGAA6F;AAAA,IAC5G,OAAO,KAAK,EAAE,KAAK,MAAM;AACvB,YAAM,YAAY,OAAO,IAAI;AAC7B,YAAM,OAAO,eAAe,WAAW,QAAQ;AAC/C,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,UAAU,SAAS,aAAa;AAAA,MAClD;AAEA,YAAM,OAAO,gBAAgB,WAAW,MAAM,QAAQ;AACtD,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK,IAAI;AAAA,YACT,UAAU;AAAA,YACV,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,gBAAgB,MAAc,MAA+B,UAA4B;AAChG,QAAM,QAAQ,KAAK;AACnB,QAAM,aAAa,KAAK;AACxB,QAAM,QAAQ,KAAK;AACnB,QAAM,OAAO,KAAK;AAElB,QAAM,QAAkB;AAAA,IACtB,KAAK,IAAI;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,IAAI;AAAA,EACjB;AAEA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,OAAQ,MAAkC;AAChD,QAAI,KAAM,OAAM,KAAK,kBAAkB,KAAK,UAAU,OAAO,IAAI,CAAC,CAAC,EAAE;AAAA,EACvE;AAEA,MAAI,YAAY;AACd,UAAM,MAAM;AACZ,QAAI,IAAI,MAAO,OAAM,KAAK,YAAY,IAAI,KAAK,EAAE;AACjD,QAAI,IAAI,aAAc,OAAM,KAAK,mBAAmB,IAAI,YAAY,EAAE;AAAA,EACxE;AAEA,MAAI,MAAM;AACR,UAAM,IAAI;AACV,QAAI,EAAE,QAAS,OAAM,KAAK,WAAW,EAAE,OAAO,EAAE;AAAA,EAClD;AAGA,QAAM,QAAQ,SAAS;AACvB,MAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAC1C,UAAM,KAAK,IAAI,aAAa;AAC5B,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACvD,YAAM,MAAM;AACZ,YAAM,KAAK,eAAe,QAAQ,EAAE;AACpC,UAAI,IAAI,WAAY,OAAM,KAAK,qBAAqB,KAAK,UAAU,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE;AAAA,IAC9F;AAAA,EACF;AAGA,MAAI,OAAO;AACT,UAAM,IAAI;AACV,UAAM,WAAW,EAAE;AACnB,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,YAAM,KAAK,IAAI,aAAa;AAC5B,iBAAW,MAAM,UAAU;AACzB,cAAM,KAAK,eAAe,GAAG,IAAI,EAAE;AACnC,YAAI,GAAG,YAAa,OAAM,KAAK,sBAAsB,KAAK,UAAU,OAAO,GAAG,WAAW,CAAC,CAAC,EAAE;AAC7F,YAAI,GAAG,OAAQ,OAAM,KAAK,iBAAiB,GAAG,MAAM,EAAE;AACtD,YAAI,GAAG,MAAO,OAAM,KAAK,gBAAgB,GAAG,KAAK,EAAE;AAEnD,cAAM,SAAS,GAAG;AAClB,YAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,gBAAM,KAAK,eAAe;AAC1B,qBAAW,KAAK,QAAQ;AACtB,kBAAM,KAAK,mBAAmB,EAAE,IAAI,EAAE;AACtC,gBAAI,EAAE,WAAY,OAAM,KAAK,yBAAyB,EAAE,UAAU,EAAE;AACpE,gBAAI,EAAE,YAAa,OAAM,KAAK,0BAA0B,KAAK,UAAU,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE;AAC/F,gBAAI,EAAE,cAAe,OAAM,KAAK,4BAA4B,EAAE,aAAa,EAAE;AAC7E,gBAAI,EAAE,UAAW,OAAM,KAAK,2BAA2B;AACvD,gBAAI,EAAE,MAAO,OAAM,KAAK,uBAAuB;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,OAAO,EAAE;AACf,QAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,YAAM,KAAK,IAAI,kBAAkB;AACjC,iBAAW,KAAK,MAAM;AACpB,cAAM,KAAK,eAAe,EAAE,IAAI,EAAE;AAClC,cAAM,OAAO,EAAE;AACf,cAAM,KAAK,EAAE;AACb,YAAI,MAAM;AACR,gBAAM,KAAK,aAAa;AACxB,gBAAM,KAAK,oBAAoB,KAAK,OAAO,EAAE;AAC7C,cAAI,KAAK,QAAS,OAAM,KAAK,oBAAoB,KAAK,UAAU,KAAK,OAAO,CAAC,EAAE;AAAA,QACjF;AACA,YAAI,IAAI;AACN,gBAAM,KAAK,WAAW;AACtB,gBAAM,KAAK,oBAAoB,GAAG,OAAO,EAAE;AAC3C,cAAI,GAAG,QAAS,OAAM,KAAK,oBAAoB,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,EAAE;AAClB,QAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,YAAM,KAAK,IAAI,YAAY;AAC3B,iBAAW,OAAO,SAAS;AACzB,cAAM,KAAK,eAAe,IAAI,IAAI,EAAE;AACpC,YAAI,IAAI,WAAY,OAAM,KAAK,qBAAqB,IAAI,UAAU,EAAE;AACpE,YAAI,IAAI,YAAa,OAAM,KAAK,sBAAsB,KAAK,UAAU,OAAO,IAAI,WAAW,CAAC,CAAC,EAAE;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AAGA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,cAAc,OAAO,QAAQ,KAAK;AACxC,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,KAAK,IAAI,mBAAmB;AAClC,iBAAW,CAAC,UAAU,OAAO,KAAK,aAAa;AAC7C,cAAM,IAAI;AACV,cAAM,KAAK,eAAe,QAAQ,EAAE;AACpC,YAAI,EAAE,YAAa,OAAM,KAAK,sBAAsB,KAAK,UAAU,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE;AAC3F,YAAI,EAAE,KAAM,OAAM,KAAK,eAAe,KAAK,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAGA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,IAAI;AACV,UAAM,gBAAgB,EAAE;AACxB,QAAI,iBAAiB,cAAc,SAAS,GAAG;AAC7C,YAAM,KAAK,IAAI,mBAAmB;AAClC,iBAAW,MAAM,eAAe;AAC9B,cAAM,KAAK,eAAe,GAAG,IAAI,EAAE;AACnC,YAAI,GAAG,YAAa,OAAM,KAAK,sBAAsB,KAAK,UAAU,OAAO,GAAG,WAAW,CAAC,CAAC,EAAE;AAC7F,YAAI,GAAG,KAAK;AACV,gBAAM,KAAK,cAAc;AACzB,gBAAM,WAAW,OAAO,GAAG,GAAG,EAAE,MAAM,IAAI;AAC1C,qBAAW,MAAM,UAAU;AACzB,kBAAM,KAAK,WAAW,EAAE,EAAE;AAAA,UAC5B;AAAA,QACF;AACA,cAAM,KAAK,mBAAmB,GAAG,YAAY,KAAK,EAAE;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACrRA,SAAS,SAAS;AAcX,SAAS,eAAe,UAAoB,OAA+B;AAChF,QAAM,UAA0B,CAAC;AACjC,QAAM,IAAI,MAAM,YAAY;AAG5B,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AAC3D,QACE,KAAK,YAAY,EAAE,SAAS,CAAC,KAC7B,MAAM,aAAa,YAAY,EAAE,SAAS,CAAC,GAC3C;AACA,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAGA,eAAW,MAAM,MAAM,YAAY,CAAC,GAAG;AACrC,UACE,GAAG,KAAK,YAAY,EAAE,SAAS,CAAC,KAChC,GAAG,aAAa,YAAY,EAAE,SAAS,CAAC,GACxC;AACA,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,MAAM,GAAG;AAAA,UACT,aAAa,GAAG;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAGA,UAAI,GAAG,QAAQ;AACb,mBAAW,SAAS,GAAG,QAAQ;AAC7B,cACE,MAAM,KAAK,YAAY,EAAE,SAAS,CAAC,KACnC,MAAM,aAAa,YAAY,EAAE,SAAS,CAAC,KAC3C,MAAM,OAAO,YAAY,EAAE,SAAS,CAAC,GACrC;AACA,oBAAQ,KAAK;AAAA,cACX,MAAM;AAAA,cACN,MAAM,MAAM;AAAA,cACZ,aAAa,MAAM;AAAA,cACnB,OAAO;AAAA,cACP,SAAS,GAAG;AAAA,YACd,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,SAAS,KAAK,GAAG;AACvD,QACE,GAAG,YAAY,EAAE,SAAS,CAAC,KAC3B,KAAK,WAAW,YAAY,EAAE,SAAS,CAAC,KACxC,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,GACtD;AACA,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AACzD,QACE,GAAG,YAAY,EAAE,SAAS,CAAC,KAC3B,MAAM,aAAa,YAAY,EAAE,SAAS,CAAC,KAC3C,MAAM,aAAa,YAAY,EAAE,SAAS,CAAC,GAC3C;AACA,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,mBAAmB,QAAmB,UAA0B;AAC9E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,uBAAuB,EAAE;AAAA,IACtD,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,UAAU,eAAe,UAAU,KAAK;AAC9C,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxHA,SAAS,KAAAC,UAAS;AAgBX,SAAS,aAAa,MAAc,UAA0C;AACnF,QAAM,QAAQ,SAAS,OAAO,IAAI;AAClC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,aAAa,SAAS,WAAW,IAAI,KAAK;AAChD,QAAM,QAAQ,SAAS,MAAM,IAAI,KAAK;AACtC,QAAM,UAAU,SAAS,QAAQ,IAAI,KAAK;AAC1C,QAAM,OAAO,SAAS,MAAM,IAAI,KAAK;AAGrC,QAAM,WAAW,YAAY;AAC7B,QAAM,QAAQ,WAAY,SAAS,OAAO,QAAQ,KAAK,OAAQ;AAG/D,QAAM,YAAY,YAAY,QAAQ,CAAC;AACvC,QAAM,eAA0C,CAAC;AACjD,aAAW,CAAC,EAAE,IAAI,KAAK,OAAO,QAAQ,SAAS,KAAK,GAAG;AACrD,UAAM,WAAW,KAAK,QAAQ,CAAC;AAC/B,UAAM,aAAa,UAAU,KAAK,CAAC,MAAM,SAAS,SAAS,CAAC,CAAC;AAC7D,UAAM,cAAc,KAAK,SAAS,KAAK,CAAC,MAAM,MAAM,IAAI;AACxD,QAAI,cAAc,aAAa;AAC7B,mBAAa,KAAK,IAA0C;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,oBAAoB,QAAmB,UAA0B;AAC/E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,OAAOA,GAAE,OAAO,EAAE,SAAS,8BAA8B,EAAE;AAAA,IAC7D,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,SAAS,aAAa,OAAO,QAAQ;AAC3C,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,KAAK,cAAc,CAAC;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACjFA,SAAS,YAAY,iBAAiB;AAY/B,SAAS,cAAc,OAAqC;AACjE,QAAM,SAAS,IAAI,WAAW;AAC9B,aAAW,QAAQ,WAAW;AAC5B,WAAO,SAAS,IAAI;AAAA,EACtB;AAEA,QAAM,cAAc,OAAO,IAAI,KAAK;AACpC,QAAM,SAAS,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE;AACjE,QAAM,WAAW,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,EAAE;AAErE,SAAO;AAAA,IACL,kBAAkB,YAAY;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,qBAAqB,QAAmB,OAA2B;AACjF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,YAAM,SAAS,cAAc,KAAK;AAClC,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrDA,SAAS,KAAAC,UAAS;AAElB,SAAS,mBAAmB;AAKrB,SAAS,iBAAiB,WAAmB,OAAuC;AACzF,MAAI,CAAC,MAAM,OAAO,IAAI,SAAS,EAAG,QAAO;AACzC,SAAO,YAAY,WAAW,KAAK;AACrC;AAMO,SAAS,iBAAiB,QAAmB,OAA2B;AAC7E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,OAAOA,GAAE,OAAO,EAAE,SAAS,2BAA2B,EAAE;AAAA,IAC1D,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,SAAS,iBAAiB,OAAO,KAAK;AAC5C,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,KAAK,cAAc,CAAC;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC3CA,SAAS,KAAAC,UAAS;AAaX,SAAS,kBAAkB,UAAoB,UAAsC;AAC1F,QAAM,YAAY,oBAAI,IAAI,CAAC,KAAK,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO,MAAM,KAAK,CAAC;AAC3G,QAAM,SAAS,SAAS,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;AAClG,QAAM,UAA8B,CAAC;AAErC,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,SAAS,KAAK,GAAG;AAC/D,QAAI,CAAC,MAAM,eAAgB;AAE3B,eAAW,MAAM,MAAM,gBAAgB;AACrC,YAAM,UAAU,GAAG,SAAS,YAAY,EAAE,MAAM,KAAK;AACrD,YAAM,UAAU,OAAO,OAAO,CAAC,MAAM,QAAQ,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE;AAC3E,UAAI,UAAU,GAAG;AACf,gBAAQ,KAAK;AAAA,UACX,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO,UAAU,KAAK,IAAI,OAAO,QAAQ,CAAC;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACxC,SAAO;AACT;AAMO,SAAS,wBAAwB,QAAmB,UAA0B;AACnF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,UAAUA,GAAE,OAAO,EAAE,SAAS,2DAA2D,EAAE;AAAA,IAC7F,OAAO,EAAE,SAAS,MAAM;AACtB,YAAM,UAAU,kBAAkB,UAAU,QAAQ;AACpD,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC5DA,SAAS,KAAAC,UAAS;AAWX,SAAS,eAAe,UAAoB,QAAoC;AACrF,QAAM,UAA4B,CAAC;AACnC,QAAM,WAAW,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAE3D,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,SAAS,KAAK,GAAG;AAC/D,QAAI,CAAC,MAAM,kBAAmB;AAE9B,eAAW,MAAM,MAAM,mBAAmB;AAIxC,YAAM,UACJ,CAAC,GAAG,UACJ,GAAG,OAAO,WAAW,KACrB,GAAG,OAAO,KAAK,CAAC,MAAM,SAAS,IAAI,EAAE,YAAY,CAAC,CAAC;AAErD,UAAI,SAAS;AACX,gBAAQ,KAAK;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,uBAAuB,QAAmB,UAA0B;AAClF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,6CAA6C;AAAA,IACpF;AAAA,IACA,OAAO,EAAE,OAAO,MAAM;AACpB,YAAM,UAAU,eAAe,UAAU,MAAM;AAC/C,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AXtCO,SAAS,aAAa,UAAoB,OAAgC;AAC/E,QAAM,SAAS,IAAIC,WAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAGD,2BAAyB,QAAQ,QAAQ;AACzC,wBAAsB,QAAQ,QAAQ;AACtC,2BAAyB,QAAQ,QAAQ;AACzC,uBAAqB,QAAQ,QAAQ;AACrC,8BAA4B,QAAQ,QAAQ;AAG5C,qBAAmB,QAAQ,QAAQ;AACnC,sBAAoB,QAAQ,QAAQ;AACpC,uBAAqB,QAAQ,KAAK;AAClC,mBAAiB,QAAQ,KAAK;AAC9B,0BAAwB,QAAQ,QAAQ;AACxC,yBAAuB,QAAQ,QAAQ;AAEvC,SAAO;AACT;AAOA,eAAsB,YAAY,SAGX;AACrB,QAAM,UAAU,SAAS,WAAW,QAAQ,IAAI;AAChD,QAAM,SAAS,WAAW,OAAO;AACjC,QAAM,aAAa,SAAS,cAAc,OAAO;AAEjD,QAAM,EAAE,MAAM,IAAI,MAAM,QAAQ,EAAE,YAAY,OAAO,CAAC;AACtD,QAAM,WAAW,aAAa,OAAO,MAAM;AAC3C,QAAM,SAAS,aAAa,UAAU,KAAK;AAE3C,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAE9B,SAAO;AACT;AAQA,eAAsB,gBAAgB,SAKpB;AAChB,QAAM,UAAU,SAAS,WAAW,QAAQ,IAAI;AAChD,QAAM,SAAS,WAAW,OAAO;AACjC,QAAM,aAAa,SAAS,cAAc,OAAO;AAEjD,QAAM,EAAE,MAAM,IAAI,MAAM,QAAQ,EAAE,YAAY,OAAO,CAAC;AACtD,QAAM,WAAW,aAAa,OAAO,MAAM;AAE3C,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,MAAM,oBAAoB,EAAE,KAAK,CAAC;AAGxC,MAAI,KAAK,QAAQ,OAAO,KAAK,QAAQ;AACnC,QAAI;AACF,YAAM,SAAS,aAAa,UAAU,KAAK;AAC3C,YAAM,YAAY,IAAI,8BAA8B;AAAA,QAClD,oBAAoB;AAAA,MACtB,CAAC;AACD,YAAM,OAAO,QAAQ,SAAS;AAC9B,YAAM,UAAU,cAAc,KAAK,KAAK,IAAI,IAAI;AAChD,UAAI,GAAG,SAAS,MAAM;AACpB,kBAAU,MAAM;AAChB,eAAO,MAAM;AAAA,MACf,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,CAAC,IAAI,aAAa;AACpB,YAAI,OAAO,GAAG,EAAE,KAAK;AAAA,UACnB,SAAS;AAAA,UACT,OAAO,EAAE,MAAM,QAAQ,SAAS,wBAAwB;AAAA,UACxD,IAAI;AAAA,QACN,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAGD,MAAI,IAAI,QAAQ,CAAC,MAAM,QAAQ;AAC7B,QAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,EAAE,MAAM,OAAQ,SAAS,sBAAsB;AAAA,MACtD,IAAI;AAAA,IACN,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,MAAI,OAAO,QAAQ,CAAC,MAAM,QAAQ;AAChC,QAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,EAAE,MAAM,OAAQ,SAAS,sBAAsB;AAAA,MACtD,IAAI;AAAA,IACN,CAAC,CAAC;AAAA,EACJ,CAAC;AAGD,MAAI,IAAI,WAAW,CAAC,MAAM,QAAQ;AAChC,QAAI,KAAK,EAAE,QAAQ,MAAM,QAAQ,CAAC,GAAG,MAAM,OAAO,KAAK,CAAC,EAAE,CAAC;AAAA,EAC7D,CAAC;AAED,QAAM,OAAO,SAAS,QAAQ;AAC9B,MAAI,OAAO,MAAM,MAAM,MAAM;AAC3B,YAAQ,MAAM,6CAA6C,IAAI,IAAI,IAAI,MAAM;AAC7E,YAAQ,MAAM,wBAAwB,IAAI,IAAI,IAAI,SAAS;AAAA,EAC7D,CAAC;AACH;","names":["McpServer","ResourceTemplate","ResourceTemplate","ResourceTemplate","z","z","z","z","McpServer"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runcontext/mcp",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "description": "ContextKit MCP server — expose semantic layers and data context to AI agents via Model Context Protocol",
5
5
  "license": "MIT",
6
6
  "author": "Eric Kittelson",
@@ -54,7 +54,7 @@
54
54
  "@modelcontextprotocol/sdk": "^1.12.0",
55
55
  "express": "^5.1.0",
56
56
  "zod": "^3.24.0",
57
- "@runcontext/core": "^0.4.2"
57
+ "@runcontext/core": "^0.4.4"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/express": "^5.0.0",