autocatalog-agents-mcp 0.2.3 → 0.2.5

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.
@@ -132,7 +132,7 @@ var drift = async (cat, args) => {
132
132
  // src/server.ts
133
133
  var RefSchema = z.string().min(3).regex(/^[a-z]+\/[a-zA-Z0-9_-]+$/, "expected <kind>/<id>");
134
134
  var asText = (data) => ({
135
- content: [{ type: "text", text: JSON.stringify(data, null, 2) }]
135
+ content: [{ type: "text", text: JSON.stringify(data) }]
136
136
  });
137
137
  var asError = (cause) => ({
138
138
  isError: true,
@@ -275,4 +275,4 @@ var createServer = (catalog) => {
275
275
  export {
276
276
  createServer
277
277
  };
278
- //# sourceMappingURL=chunk-UJNEDUVP.js.map
278
+ //# sourceMappingURL=chunk-DPGZIUZF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/tools.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { EntityKindSchema, type Catalog } from 'autocatalog-agents-core';\nimport {\n audit,\n cost,\n describeEntity,\n drift,\n findBy,\n impactEntity,\n listEntities,\n searchEntities,\n} from './tools.js';\n\nconst RefSchema = z\n .string()\n .min(3)\n .regex(/^[a-z]+\\/[a-zA-Z0-9_-]+$/, 'expected <kind>/<id>');\n\nconst asText = <T>(data: T) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(data) }],\n});\n\nconst asError = (cause: unknown) => ({\n isError: true,\n content: [\n { type: 'text' as const, text: cause instanceof Error ? cause.message : String(cause) },\n ],\n});\n\nexport const createServer = (catalog: Catalog): McpServer => {\n const server = new McpServer({ name: 'autocatalog-agents', version: '0.0.0' });\n\n server.registerTool(\n 'list',\n {\n title: 'List entities of a kind',\n description:\n 'Enumerate every entity of a given kind (agent, tool, model, workflow, domain, eval, policy).',\n inputSchema: { kind: EntityKindSchema },\n },\n async ({ kind }) => {\n try {\n return asText(listEntities(catalog, kind));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'describe',\n {\n title: 'Describe one entity',\n description:\n 'Return the full record (frontmatter + edges) for a single entity by \"<kind>/<id>\" ref.',\n inputSchema: { ref: RefSchema },\n },\n async ({ ref }) => {\n try {\n return asText(describeEntity(catalog, ref));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'impact',\n {\n title: 'Impact analysis',\n description:\n 'Show what an entity depends on and what depends on it, and for an agent or tool the events it produces and consumes. Use this before changing a prompt, tool, model, or policy. For who consumes an event, ask the event catalog MCP server (assess_impact): it includes agents.',\n inputSchema: { ref: RefSchema },\n },\n async ({ ref }) => {\n try {\n return asText(impactEntity(catalog, ref));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'search',\n {\n title: 'Full-text search',\n description:\n \"Substring match across every entity's id, name, description, and owner. Returns summarised hits.\",\n inputSchema: { query: z.string().min(1) },\n },\n async ({ query }) => {\n try {\n return asText(searchEntities(catalog, query));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'find_by',\n {\n title: 'Find entities by attribute',\n description:\n 'Return entities where a top-level attribute equals (or array-includes) the given value. Examples: attribute=owner value=support-platform; attribute=tools value=issue-refund; attribute=risk value=high.',\n inputSchema: { attribute: z.string().min(1), value: z.string().min(1) },\n },\n async ({ attribute, value }) => {\n try {\n return asText(findBy(catalog, attribute, value));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'cost',\n {\n title: 'Cost estimate / rollup',\n description:\n \"Estimated monthly cost for one Agent (pass `agent`), or a rollup across the catalog by domain/owner/model (pass `by`). With neither, returns just the catalog total. Uses each Agent's declared `expected_traffic` and the referenced Model's `cost_per_million_*` rates.\",\n inputSchema: {\n agent: z.string().optional(),\n by: z.enum(['domain', 'owner', 'model']).optional(),\n },\n },\n async ({ agent, by }) => {\n try {\n return asText(cost(catalog, { agent, by }));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'audit',\n {\n title: 'Run the catalog audit',\n description:\n 'Run the built-in audit ruleset (high-risk agents without evals, agents using destructive tools without policies, cost-unestimated agents, orphan tools/models/policies, missing prompts, missing domains). Optionally filter to findings at or above a minimum severity (P0 strictest). Returns counts and a sorted finding list.',\n inputSchema: {\n minSeverity: z.enum(['P0', 'P1', 'P2']).optional(),\n },\n },\n async ({ minSeverity }) => {\n try {\n return asText(audit(catalog, { minSeverity }));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'drift',\n {\n title: 'Detect drift between observed traces and the declared catalog',\n description:\n 'Load an OTLP JSON file (from autotel, OpenLLMetry, or any OTel emitter), extract observed agent → tool / agent → model edges, and diff against the declared catalog. Returns drifts: undeclared tools called in production, model mismatches, agents that emit traces but are not in the catalog, declared tools never observed.',\n inputSchema: {\n file: z.string().min(1),\n },\n },\n async ({ file }) => {\n try {\n return asText(await drift(catalog, { file }));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n return server;\n};\n","import {\n auditCatalog,\n computeImpact,\n ENTITY_KINDS,\n EntityKindSchema,\n estimateAgentCost,\n filterForAudience,\n groupFindings,\n refKey,\n rollupCost,\n totalMonthlyCost,\n type Catalog,\n type Entity,\n type EntityKind,\n type EntityRef,\n type ImpactReport,\n type RollupKey,\n type Severity,\n} from 'autocatalog-agents-core';\nimport { computeDrift, loadObservations } from 'autocatalog-agents-adapter-autotel';\n\nconst parseRef = (s: string): EntityRef => {\n const idx = s.indexOf('/');\n\n if (idx <= 0 || idx === s.length - 1) {\n throw new Error(`invalid ref \"${s}\" — expected <kind>/<id>`);\n }\n\n const rawKind = s.slice(0, idx);\n const kind = EntityKindSchema.safeParse(rawKind);\n\n if (!kind.success) {\n throw new Error(`unknown kind \"${rawKind}\" — must be one of ${ENTITY_KINDS.join(', ')}`);\n }\n\n return { kind: kind.data, id: s.slice(idx + 1) };\n};\n\ntype EntitySummary = {\n ref: string;\n id: string;\n name: string;\n status: Entity['status'];\n owner: string;\n description?: string;\n};\n\nconst summarise = (kind: EntityKind, e: Entity): EntitySummary => {\n const summary: EntitySummary = {\n ref: `${kind}/${e.id}`,\n id: e.id,\n name: e.name,\n status: e.status,\n owner: e.owner,\n };\n\n if (e.description) summary.description = e.description;\n\n return summary;\n};\n\nexport const listEntities = (cat: Catalog, kind: EntityKind) => {\n const bucket = cat.entities.get(kind);\n\n if (!bucket) return [];\n\n return [...bucket.values()].map((e) => summarise(kind, e));\n};\n\nexport const describeEntity = (cat: Catalog, refStr: string) => {\n const ref = parseRef(refStr);\n const entity = cat.entities.get(ref.kind)?.get(ref.id);\n\n if (!entity) throw new Error(`not found: ${refStr}`);\n const meta = cat.meta.get(refKey(ref.kind, ref.id));\n const body = meta?.body ? filterForAudience(meta.body, 'agent').trim() : '';\n\n return body ? { ref: refStr, ...entity, body } : { ref: refStr, ...entity };\n};\n\n/** An impact report with refs flattened to `kind/id`, for a client reading JSON. */\ntype ImpactResult = {\n subject: string;\n dependsOn: string[];\n dependedOnBy: string[];\n events?: ImpactReport['events'];\n};\n\nexport const impactEntity = (cat: Catalog, refStr: string) => {\n const ref = parseRef(refStr);\n\n if (!cat.entities.get(ref.kind)?.has(ref.id)) {\n throw new Error(`not found: ${refStr}`);\n }\n\n const report = computeImpact(cat, ref);\n\n const result: ImpactResult = {\n subject: `${report.subject.kind}/${report.subject.id}`,\n dependsOn: report.dependencies.map((d) => `${d.kind}/${d.id}`),\n dependedOnBy: report.dependents.map((d) => `${d.kind}/${d.id}`),\n };\n\n if (report.events) result.events = report.events;\n\n return result;\n};\n\nconst matchesQuery = (query: string, e: Entity): boolean => {\n const q = query.toLowerCase();\n const haystack = [e.id, e.name, e.description ?? '', e.owner].join(' ').toLowerCase();\n\n return haystack.includes(q);\n};\n\nexport const searchEntities = (cat: Catalog, query: string) => {\n const results: Array<ReturnType<typeof summarise>> = [];\n\n for (const kind of ENTITY_KINDS) {\n for (const e of cat.entities.get(kind)?.values() ?? []) {\n if (matchesQuery(query, e)) results.push(summarise(kind, e));\n }\n }\n\n return results;\n};\n\nconst attrMatches = (entity: Entity, attribute: string, value: string): boolean => {\n const raw = Object.entries(entity).find(([key]) => key === attribute)?.[1];\n\n if (raw === undefined || raw === null) return false;\n\n if (Array.isArray(raw)) return raw.some((v) => String(v) === value);\n\n return String(raw) === value;\n};\n\nexport const findBy = (cat: Catalog, attribute: string, value: string) => {\n const results: Array<ReturnType<typeof summarise>> = [];\n\n for (const kind of ENTITY_KINDS) {\n for (const e of cat.entities.get(kind)?.values() ?? []) {\n if (attrMatches(e, attribute, value)) results.push(summarise(kind, e));\n }\n }\n\n return results;\n};\n\nexport const cost = (cat: Catalog, args: { agent?: string; by?: RollupKey }) => {\n if (args.by) {\n return {\n rollup: rollupCost(cat, args.by),\n total: totalMonthlyCost(cat),\n };\n }\n\n if (args.agent) {\n const id = args.agent.startsWith('agent/') ? args.agent.slice('agent/'.length) : args.agent;\n\n if (!cat.entities.get('agent')?.has(id)) {\n throw new Error(`unknown agent: ${id}`);\n }\n\n return estimateAgentCost(cat, id);\n }\n\n return { total: totalMonthlyCost(cat) };\n};\n\nexport const audit = (cat: Catalog, args: { minSeverity?: Severity } = {}) => {\n const findings = auditCatalog(cat);\n\n const filtered = args.minSeverity\n ? findings.filter((f) => {\n const order = { P0: 0, P1: 1, P2: 2 };\n\n return order[f.severity] <= order[args.minSeverity!];\n })\n : findings;\n\n const grouped = groupFindings(filtered);\n\n return {\n counts: { P0: grouped.P0.length, P1: grouped.P1.length, P2: grouped.P2.length },\n findings: filtered,\n };\n};\n\nexport const drift = async (cat: Catalog, args: { file: string }) => {\n const obs = await loadObservations(args.file);\n\n return computeDrift(cat, obs);\n};\n"],"mappings":"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","names":["EntityKindSchema","EntityKindSchema"]}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-UJNEDUVP.js";
3
+ } from "./chunk-DPGZIUZF.js";
4
4
 
5
5
  // src/index.ts
6
6
  import { resolve } from "path";
package/dist/server.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-UJNEDUVP.js";
3
+ } from "./chunk-DPGZIUZF.js";
4
4
  export {
5
5
  createServer
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autocatalog-agents-mcp",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "MCP server that answers questions about an agent catalog over stdio.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -32,8 +32,8 @@
32
32
  "dependencies": {
33
33
  "@modelcontextprotocol/sdk": "^1.32.1",
34
34
  "zod": "^4.6.5",
35
- "autocatalog-agents-core": "0.2.3",
36
- "autocatalog-agents-adapter-autotel": "0.2.3"
35
+ "autocatalog-agents-adapter-autotel": "0.2.4",
36
+ "autocatalog-agents-core": "0.2.4"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^26.6.4",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts","../src/tools.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { EntityKindSchema, type Catalog } from 'autocatalog-agents-core';\nimport {\n audit,\n cost,\n describeEntity,\n drift,\n findBy,\n impactEntity,\n listEntities,\n searchEntities,\n} from './tools.js';\n\nconst RefSchema = z\n .string()\n .min(3)\n .regex(/^[a-z]+\\/[a-zA-Z0-9_-]+$/, 'expected <kind>/<id>');\n\nconst asText = <T>(data: T) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }],\n});\n\nconst asError = (cause: unknown) => ({\n isError: true,\n content: [\n { type: 'text' as const, text: cause instanceof Error ? cause.message : String(cause) },\n ],\n});\n\nexport const createServer = (catalog: Catalog): McpServer => {\n const server = new McpServer({ name: 'autocatalog-agents', version: '0.0.0' });\n\n server.registerTool(\n 'list',\n {\n title: 'List entities of a kind',\n description:\n 'Enumerate every entity of a given kind (agent, tool, model, workflow, domain, eval, policy).',\n inputSchema: { kind: EntityKindSchema },\n },\n async ({ kind }) => {\n try {\n return asText(listEntities(catalog, kind));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'describe',\n {\n title: 'Describe one entity',\n description:\n 'Return the full record (frontmatter + edges) for a single entity by \"<kind>/<id>\" ref.',\n inputSchema: { ref: RefSchema },\n },\n async ({ ref }) => {\n try {\n return asText(describeEntity(catalog, ref));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'impact',\n {\n title: 'Impact analysis',\n description:\n 'Show what an entity depends on and what depends on it, and for an agent or tool the events it produces and consumes. Use this before changing a prompt, tool, model, or policy. For who consumes an event, ask the event catalog MCP server (assess_impact): it includes agents.',\n inputSchema: { ref: RefSchema },\n },\n async ({ ref }) => {\n try {\n return asText(impactEntity(catalog, ref));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'search',\n {\n title: 'Full-text search',\n description:\n \"Substring match across every entity's id, name, description, and owner. Returns summarised hits.\",\n inputSchema: { query: z.string().min(1) },\n },\n async ({ query }) => {\n try {\n return asText(searchEntities(catalog, query));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'find_by',\n {\n title: 'Find entities by attribute',\n description:\n 'Return entities where a top-level attribute equals (or array-includes) the given value. Examples: attribute=owner value=support-platform; attribute=tools value=issue-refund; attribute=risk value=high.',\n inputSchema: { attribute: z.string().min(1), value: z.string().min(1) },\n },\n async ({ attribute, value }) => {\n try {\n return asText(findBy(catalog, attribute, value));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'cost',\n {\n title: 'Cost estimate / rollup',\n description:\n \"Estimated monthly cost for one Agent (pass `agent`), or a rollup across the catalog by domain/owner/model (pass `by`). With neither, returns just the catalog total. Uses each Agent's declared `expected_traffic` and the referenced Model's `cost_per_million_*` rates.\",\n inputSchema: {\n agent: z.string().optional(),\n by: z.enum(['domain', 'owner', 'model']).optional(),\n },\n },\n async ({ agent, by }) => {\n try {\n return asText(cost(catalog, { agent, by }));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'audit',\n {\n title: 'Run the catalog audit',\n description:\n 'Run the built-in audit ruleset (high-risk agents without evals, agents using destructive tools without policies, cost-unestimated agents, orphan tools/models/policies, missing prompts, missing domains). Optionally filter to findings at or above a minimum severity (P0 strictest). Returns counts and a sorted finding list.',\n inputSchema: {\n minSeverity: z.enum(['P0', 'P1', 'P2']).optional(),\n },\n },\n async ({ minSeverity }) => {\n try {\n return asText(audit(catalog, { minSeverity }));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n server.registerTool(\n 'drift',\n {\n title: 'Detect drift between observed traces and the declared catalog',\n description:\n 'Load an OTLP JSON file (from autotel, OpenLLMetry, or any OTel emitter), extract observed agent → tool / agent → model edges, and diff against the declared catalog. Returns drifts: undeclared tools called in production, model mismatches, agents that emit traces but are not in the catalog, declared tools never observed.',\n inputSchema: {\n file: z.string().min(1),\n },\n },\n async ({ file }) => {\n try {\n return asText(await drift(catalog, { file }));\n } catch (e) {\n return asError(e);\n }\n },\n );\n\n return server;\n};\n","import {\n auditCatalog,\n computeImpact,\n ENTITY_KINDS,\n EntityKindSchema,\n estimateAgentCost,\n filterForAudience,\n groupFindings,\n refKey,\n rollupCost,\n totalMonthlyCost,\n type Catalog,\n type Entity,\n type EntityKind,\n type EntityRef,\n type ImpactReport,\n type RollupKey,\n type Severity,\n} from 'autocatalog-agents-core';\nimport { computeDrift, loadObservations } from 'autocatalog-agents-adapter-autotel';\n\nconst parseRef = (s: string): EntityRef => {\n const idx = s.indexOf('/');\n\n if (idx <= 0 || idx === s.length - 1) {\n throw new Error(`invalid ref \"${s}\" — expected <kind>/<id>`);\n }\n\n const rawKind = s.slice(0, idx);\n const kind = EntityKindSchema.safeParse(rawKind);\n\n if (!kind.success) {\n throw new Error(`unknown kind \"${rawKind}\" — must be one of ${ENTITY_KINDS.join(', ')}`);\n }\n\n return { kind: kind.data, id: s.slice(idx + 1) };\n};\n\ntype EntitySummary = {\n ref: string;\n id: string;\n name: string;\n status: Entity['status'];\n owner: string;\n description?: string;\n};\n\nconst summarise = (kind: EntityKind, e: Entity): EntitySummary => {\n const summary: EntitySummary = {\n ref: `${kind}/${e.id}`,\n id: e.id,\n name: e.name,\n status: e.status,\n owner: e.owner,\n };\n\n if (e.description) summary.description = e.description;\n\n return summary;\n};\n\nexport const listEntities = (cat: Catalog, kind: EntityKind) => {\n const bucket = cat.entities.get(kind);\n\n if (!bucket) return [];\n\n return [...bucket.values()].map((e) => summarise(kind, e));\n};\n\nexport const describeEntity = (cat: Catalog, refStr: string) => {\n const ref = parseRef(refStr);\n const entity = cat.entities.get(ref.kind)?.get(ref.id);\n\n if (!entity) throw new Error(`not found: ${refStr}`);\n const meta = cat.meta.get(refKey(ref.kind, ref.id));\n const body = meta?.body ? filterForAudience(meta.body, 'agent').trim() : '';\n\n return body ? { ref: refStr, ...entity, body } : { ref: refStr, ...entity };\n};\n\n/** An impact report with refs flattened to `kind/id`, for a client reading JSON. */\ntype ImpactResult = {\n subject: string;\n dependsOn: string[];\n dependedOnBy: string[];\n events?: ImpactReport['events'];\n};\n\nexport const impactEntity = (cat: Catalog, refStr: string) => {\n const ref = parseRef(refStr);\n\n if (!cat.entities.get(ref.kind)?.has(ref.id)) {\n throw new Error(`not found: ${refStr}`);\n }\n\n const report = computeImpact(cat, ref);\n\n const result: ImpactResult = {\n subject: `${report.subject.kind}/${report.subject.id}`,\n dependsOn: report.dependencies.map((d) => `${d.kind}/${d.id}`),\n dependedOnBy: report.dependents.map((d) => `${d.kind}/${d.id}`),\n };\n\n if (report.events) result.events = report.events;\n\n return result;\n};\n\nconst matchesQuery = (query: string, e: Entity): boolean => {\n const q = query.toLowerCase();\n const haystack = [e.id, e.name, e.description ?? '', e.owner].join(' ').toLowerCase();\n\n return haystack.includes(q);\n};\n\nexport const searchEntities = (cat: Catalog, query: string) => {\n const results: Array<ReturnType<typeof summarise>> = [];\n\n for (const kind of ENTITY_KINDS) {\n for (const e of cat.entities.get(kind)?.values() ?? []) {\n if (matchesQuery(query, e)) results.push(summarise(kind, e));\n }\n }\n\n return results;\n};\n\nconst attrMatches = (entity: Entity, attribute: string, value: string): boolean => {\n const raw = Object.entries(entity).find(([key]) => key === attribute)?.[1];\n\n if (raw === undefined || raw === null) return false;\n\n if (Array.isArray(raw)) return raw.some((v) => String(v) === value);\n\n return String(raw) === value;\n};\n\nexport const findBy = (cat: Catalog, attribute: string, value: string) => {\n const results: Array<ReturnType<typeof summarise>> = [];\n\n for (const kind of ENTITY_KINDS) {\n for (const e of cat.entities.get(kind)?.values() ?? []) {\n if (attrMatches(e, attribute, value)) results.push(summarise(kind, e));\n }\n }\n\n return results;\n};\n\nexport const cost = (cat: Catalog, args: { agent?: string; by?: RollupKey }) => {\n if (args.by) {\n return {\n rollup: rollupCost(cat, args.by),\n total: totalMonthlyCost(cat),\n };\n }\n\n if (args.agent) {\n const id = args.agent.startsWith('agent/') ? args.agent.slice('agent/'.length) : args.agent;\n\n if (!cat.entities.get('agent')?.has(id)) {\n throw new Error(`unknown agent: ${id}`);\n }\n\n return estimateAgentCost(cat, id);\n }\n\n return { total: totalMonthlyCost(cat) };\n};\n\nexport const audit = (cat: Catalog, args: { minSeverity?: Severity } = {}) => {\n const findings = auditCatalog(cat);\n\n const filtered = args.minSeverity\n ? findings.filter((f) => {\n const order = { P0: 0, P1: 1, P2: 2 };\n\n return order[f.severity] <= order[args.minSeverity!];\n })\n : findings;\n\n const grouped = groupFindings(filtered);\n\n return {\n counts: { P0: grouped.P0.length, P1: grouped.P1.length, P2: grouped.P2.length },\n findings: filtered,\n };\n};\n\nexport const drift = async (cat: Catalog, args: { file: string }) => {\n const obs = await loadObservations(args.file);\n\n return computeDrift(cat, obs);\n};\n"],"mappings":"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","names":["EntityKindSchema","EntityKindSchema"]}