graph.do 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/chunk-SOVFPCTE.js +647 -0
- package/dist/chunk-SOVFPCTE.js.map +1 -0
- package/dist/chunk-VXRM2HKS.js +203 -0
- package/dist/chunk-VXRM2HKS.js.map +1 -0
- package/dist/cli/index.js +724 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index-BmsgR5Vk.d.ts +257 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +15 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/worker/index.d.ts +15 -0
- package/dist/worker/index.js +56 -0
- package/dist/worker/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/graph-manager.ts","../../src/types.ts","../../src/mcp/server.ts","../../src/mcp/stdio-transport.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { MongoClient } from 'mongo.do'\nimport { KnowledgeGraphManager } from '../graph-manager.js'\nimport { createGraphMcpServer, runStdioTransport } from '../mcp/index.js'\nimport type { CollectionLike, EntityDocument, RelationDocument } from '../types.js'\n\nconst DEFAULT_URL = 'https://graph.do'\n\ninterface CliOptions {\n url?: string\n help?: boolean\n}\n\nfunction parseArgs(args: string[]): CliOptions {\n const options: CliOptions = {}\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n if (arg === '--help' || arg === '-h') {\n options.help = true\n } else if (arg === '--url' || arg === '-u') {\n options.url = args[++i]\n }\n }\n\n return options\n}\n\nfunction printHelp() {\n console.log(`\ngraph.do - Knowledge Graph MCP Server\n\nUsage:\n graph.do [options]\n\nOptions:\n -u, --url <url> graph.do URL (default: https://graph.do)\n -h, --help Show this help message\n\nEnvironment Variables:\n GRAPH_URL graph.do URL (default: https://graph.do)\n\nExamples:\n # Start with defaults (uses https://graph.do)\n graph.do\n\n # Use a custom deployment\n graph.do --url https://my-graph.workers.dev\n\nThe server communicates via stdio using the MCP protocol.\n`)\n}\n\nasync function main() {\n const args = process.argv.slice(2)\n const options = parseArgs(args)\n\n if (options.help) {\n printHelp()\n process.exit(0)\n }\n\n const graphUrl = options.url || process.env.GRAPH_URL || DEFAULT_URL\n\n try {\n // Connect to graph.do (which has built-in MongoDB storage)\n const client = new MongoClient(graphUrl)\n const db = client.db('graph')\n\n // Create collections\n const entitiesCollection = db.collection('entities') as unknown as CollectionLike<EntityDocument>\n const relationsCollection = db.collection('relations') as unknown as CollectionLike<RelationDocument>\n\n // Create graph manager\n const graphManager = new KnowledgeGraphManager({\n entities: entitiesCollection,\n relations: relationsCollection,\n })\n\n // Create MCP server\n const server = createGraphMcpServer({\n name: 'graph.do',\n version: '0.1.0',\n graphManager,\n })\n\n // Run stdio transport\n await runStdioTransport(server)\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n console.error(`Fatal error: ${error.message}`)\n process.exit(1)\n }\n}\n\nmain()\n","import type {\n Entity,\n EntityDocument,\n Relation,\n RelationDocument,\n KnowledgeGraph,\n AddObservationsResult,\n OperationResult,\n CollectionLike,\n} from './types.js'\n\nexport interface GraphManagerConfig {\n entities: CollectionLike<EntityDocument>\n relations: CollectionLike<RelationDocument>\n}\n\n/**\n * KnowledgeGraphManager - Manages entities and relations stored in MongoDB\n */\nexport class KnowledgeGraphManager {\n private entities: CollectionLike<EntityDocument>\n private relations: CollectionLike<RelationDocument>\n\n constructor(config: GraphManagerConfig) {\n this.entities = config.entities\n this.relations = config.relations\n }\n\n /**\n * Create new entities (ignores duplicates)\n */\n async createEntities(entities: Entity[]): Promise<Entity[]> {\n const created: Entity[] = []\n\n for (const entity of entities) {\n // Check if entity already exists\n const existing = await this.entities.findOne({ name: entity.name })\n if (!existing) {\n await this.entities.insertOne({\n name: entity.name,\n entityType: entity.entityType,\n observations: entity.observations,\n })\n created.push(entity)\n }\n }\n\n return created\n }\n\n /**\n * Create new relations (skips duplicates)\n */\n async createRelations(relations: Relation[]): Promise<Relation[]> {\n const created: Relation[] = []\n\n for (const relation of relations) {\n // Check if relation already exists\n const existing = await this.relations.findOne({\n from: relation.from,\n to: relation.to,\n relationType: relation.relationType,\n })\n if (!existing) {\n await this.relations.insertOne({\n from: relation.from,\n to: relation.to,\n relationType: relation.relationType,\n })\n created.push(relation)\n }\n }\n\n return created\n }\n\n /**\n * Add observations to existing entities\n * Throws if entity doesn't exist\n */\n async addObservations(\n observations: Array<{ entityName: string; contents: string[] }>\n ): Promise<AddObservationsResult[]> {\n const results: AddObservationsResult[] = []\n\n for (const { entityName, contents } of observations) {\n const entity = await this.entities.findOne({ name: entityName })\n if (!entity) {\n throw new Error(`Entity with name \"${entityName}\" not found`)\n }\n\n // Filter out observations that already exist\n const existingObservations = new Set(entity.observations)\n const newObservations = contents.filter((obs) => !existingObservations.has(obs))\n\n if (newObservations.length > 0) {\n await this.entities.updateOne(\n { name: entityName },\n { $push: { observations: { $each: newObservations } } }\n )\n }\n\n results.push({\n entityName,\n addedObservations: newObservations,\n })\n }\n\n return results\n }\n\n /**\n * Delete entities and cascade delete their relations\n */\n async deleteEntities(entityNames: string[]): Promise<OperationResult> {\n // Delete all matching entities\n const deleteResult = await this.entities.deleteMany({\n name: { $in: entityNames },\n })\n\n // Cascade delete relations involving these entities\n await this.relations.deleteMany({\n $or: [{ from: { $in: entityNames } }, { to: { $in: entityNames } }],\n })\n\n return {\n success: true,\n message: `Deleted ${deleteResult.deletedCount} entities and their relations`,\n }\n }\n\n /**\n * Delete specific observations from entities (silent on non-existent)\n */\n async deleteObservations(\n deletions: Array<{ entityName: string; observations: string[] }>\n ): Promise<OperationResult> {\n let totalRemoved = 0\n\n for (const { entityName, observations } of deletions) {\n const entity = await this.entities.findOne({ name: entityName })\n if (entity) {\n const observationsToRemove = new Set(observations)\n const remaining = entity.observations.filter((obs) => !observationsToRemove.has(obs))\n const removed = entity.observations.length - remaining.length\n\n if (removed > 0) {\n await this.entities.updateOne({ name: entityName }, { $set: { observations: remaining } })\n totalRemoved += removed\n }\n }\n }\n\n return {\n success: true,\n message: `Removed ${totalRemoved} observations`,\n }\n }\n\n /**\n * Delete specific relations (silent on non-existent)\n */\n async deleteRelations(relations: Relation[]): Promise<OperationResult> {\n let totalDeleted = 0\n\n for (const relation of relations) {\n const result = await this.relations.deleteOne({\n from: relation.from,\n to: relation.to,\n relationType: relation.relationType,\n })\n totalDeleted += result.deletedCount\n }\n\n return {\n success: true,\n message: `Deleted ${totalDeleted} relations`,\n }\n }\n\n /**\n * Read the complete knowledge graph\n */\n async readGraph(): Promise<KnowledgeGraph> {\n const entities = await this.entities.find({}).toArray()\n const relations = await this.relations.find({}).toArray()\n\n return {\n entities: entities.map(({ _id, ...entity }) => entity),\n relations: relations.map(({ _id, ...relation }) => relation),\n }\n }\n\n /**\n * Search nodes by query (matches name, type, or observations)\n */\n async searchNodes(query: string): Promise<KnowledgeGraph> {\n const lowerQuery = query.toLowerCase()\n\n // Search entities where name, type, or any observation matches\n const allEntities = await this.entities.find({}).toArray()\n const matchingEntities = allEntities.filter((entity) => {\n const nameMatch = entity.name.toLowerCase().includes(lowerQuery)\n const typeMatch = entity.entityType.toLowerCase().includes(lowerQuery)\n const observationMatch = entity.observations.some((obs) =>\n obs.toLowerCase().includes(lowerQuery)\n )\n return nameMatch || typeMatch || observationMatch\n })\n\n const matchingNames = new Set(matchingEntities.map((e) => e.name))\n\n // Get relations between matching entities\n const relations = await this.relations.find({}).toArray()\n const matchingRelations = relations.filter(\n (rel) => matchingNames.has(rel.from) && matchingNames.has(rel.to)\n )\n\n return {\n entities: matchingEntities.map(({ _id, ...entity }) => entity),\n relations: matchingRelations.map(({ _id, ...relation }) => relation),\n }\n }\n\n /**\n * Open specific nodes by name and return them with their inter-relations\n */\n async openNodes(names: string[]): Promise<KnowledgeGraph> {\n const nameSet = new Set(names)\n\n // Find all requested entities\n const entities = await this.entities.find({ name: { $in: names } }).toArray()\n\n // Find relations between the requested entities\n const relations = await this.relations\n .find({\n from: { $in: names },\n to: { $in: names },\n })\n .toArray()\n\n return {\n entities: entities.map(({ _id, ...entity }) => entity),\n relations: relations.map(({ _id, ...relation }) => relation),\n }\n }\n\n /**\n * Get a single entity by name\n */\n async getEntity(name: string): Promise<Entity | null> {\n const entity = await this.entities.findOne({ name })\n if (!entity) return null\n const { _id, ...rest } = entity\n return rest\n }\n\n /**\n * Get all relations for an entity\n */\n async getRelationsFor(entityName: string): Promise<Relation[]> {\n const relations = await this.relations\n .find({\n $or: [{ from: entityName }, { to: entityName }],\n })\n .toArray()\n\n return relations.map(({ _id, ...relation }) => relation)\n }\n}\n","import { z } from 'zod'\n\n// Core entity schema - represents a node in the knowledge graph\nexport const EntitySchema = z.object({\n name: z.string().describe('Unique identifier for the entity'),\n entityType: z.string().describe('Type classification of the entity'),\n observations: z.array(z.string()).describe('Array of atomic facts about the entity'),\n})\n\nexport type Entity = z.infer<typeof EntitySchema>\n\n// Relation schema - represents a directed edge between entities\nexport const RelationSchema = z.object({\n from: z.string().describe('Source entity name'),\n to: z.string().describe('Target entity name'),\n relationType: z.string().describe('Type of relationship (active voice)'),\n})\n\nexport type Relation = z.infer<typeof RelationSchema>\n\n// Complete knowledge graph structure\nexport const KnowledgeGraphSchema = z.object({\n entities: z.array(EntitySchema),\n relations: z.array(RelationSchema),\n})\n\nexport type KnowledgeGraph = z.infer<typeof KnowledgeGraphSchema>\n\n// Input schemas for MCP tools\nexport const CreateEntitiesInputSchema = z.object({\n entities: z.array(EntitySchema).describe('Array of entities to create'),\n})\n\nexport const CreateRelationsInputSchema = z.object({\n relations: z.array(RelationSchema).describe('Array of relations to create'),\n})\n\nexport const AddObservationsInputSchema = z.object({\n observations: z.array(\n z.object({\n entityName: z.string().describe('Name of the entity to add observations to'),\n contents: z.array(z.string()).describe('Array of observations to add'),\n })\n ).describe('Array of observation additions'),\n})\n\nexport const DeleteEntitiesInputSchema = z.object({\n entityNames: z.array(z.string()).describe('Array of entity names to delete'),\n})\n\nexport const DeleteObservationsInputSchema = z.object({\n deletions: z.array(\n z.object({\n entityName: z.string().describe('Name of the entity'),\n observations: z.array(z.string()).describe('Observations to remove'),\n })\n ).describe('Array of observation deletions'),\n})\n\nexport const DeleteRelationsInputSchema = z.object({\n relations: z.array(RelationSchema).describe('Array of relations to delete'),\n})\n\nexport const SearchNodesInputSchema = z.object({\n query: z.string().describe('Search query to match against entity names, types, and observations'),\n})\n\nexport const OpenNodesInputSchema = z.object({\n names: z.array(z.string()).describe('Array of entity names to retrieve'),\n})\n\n// MongoDB document types (with _id)\nexport interface EntityDocument extends Entity {\n _id?: string\n [key: string]: unknown\n}\n\nexport interface RelationDocument extends Relation {\n _id?: string\n [key: string]: unknown\n}\n\n// Minimal collection interface for flexibility\nexport interface CollectionLike<T> {\n findOne(filter: Record<string, unknown>): Promise<T | null>\n find(filter: Record<string, unknown>): { toArray(): Promise<T[]> }\n insertOne(doc: Partial<T>): Promise<{ insertedId: string }>\n updateOne(filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{ modifiedCount: number }>\n deleteOne(filter: Record<string, unknown>): Promise<{ deletedCount: number }>\n deleteMany(filter: Record<string, unknown>): Promise<{ deletedCount: number }>\n}\n\n// Tool response types\nexport interface AddObservationsResult {\n entityName: string\n addedObservations: string[]\n}\n\nexport interface OperationResult {\n success: boolean\n message: string\n}\n","import { z } from 'zod'\nimport type { KnowledgeGraphManager } from '../graph-manager.js'\nimport {\n CreateEntitiesInputSchema,\n CreateRelationsInputSchema,\n AddObservationsInputSchema,\n DeleteEntitiesInputSchema,\n DeleteObservationsInputSchema,\n DeleteRelationsInputSchema,\n SearchNodesInputSchema,\n OpenNodesInputSchema,\n type KnowledgeGraph,\n} from '../types.js'\n\n// MCP Protocol Types\nexport interface McpToolDefinition {\n name: string\n description: string\n inputSchema: {\n type: 'object'\n properties: Record<string, unknown>\n required?: string[]\n }\n}\n\nexport interface McpToolResponse {\n content: Array<\n | { type: 'text'; text: string }\n | { type: 'resource'; resource: { uri: string; mimeType: string; text: string } }\n >\n isError?: boolean\n}\n\nexport interface McpRequest {\n jsonrpc: '2.0'\n id: string | number\n method: string\n params?: Record<string, unknown>\n}\n\nexport interface McpResponse {\n jsonrpc: '2.0'\n id: string | number\n result?: unknown\n error?: {\n code: number\n message: string\n data?: unknown\n }\n}\n\nexport interface McpServerConfig {\n name?: string\n version?: string\n graphManager: KnowledgeGraphManager\n}\n\n// MCP Error Codes\nconst McpErrorCode = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const\n\n/**\n * Creates an MCP server for the knowledge graph\n */\nexport function createGraphMcpServer(config: McpServerConfig) {\n const { name = 'graph.do', version = '0.1.0', graphManager } = config\n\n // Tool definitions matching the memory server schema\n const tools: McpToolDefinition[] = [\n {\n name: 'create_entities',\n description:\n 'Create multiple new entities in the knowledge graph. Entities are nodes with a unique name, type, and observations.',\n inputSchema: {\n type: 'object',\n properties: {\n entities: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Unique identifier for the entity' },\n entityType: { type: 'string', description: 'Type classification of the entity' },\n observations: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of atomic facts about the entity',\n },\n },\n required: ['name', 'entityType', 'observations'],\n },\n description: 'Array of entities to create',\n },\n },\n required: ['entities'],\n },\n },\n {\n name: 'create_relations',\n description:\n 'Create multiple new relations between entities. Relations are directed edges with a type.',\n inputSchema: {\n type: 'object',\n properties: {\n relations: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source entity name' },\n to: { type: 'string', description: 'Target entity name' },\n relationType: {\n type: 'string',\n description: 'Type of relationship (active voice)',\n },\n },\n required: ['from', 'to', 'relationType'],\n },\n description: 'Array of relations to create',\n },\n },\n required: ['relations'],\n },\n },\n {\n name: 'add_observations',\n description:\n 'Add new observations to existing entities. Observations are atomic facts about an entity.',\n inputSchema: {\n type: 'object',\n properties: {\n observations: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n entityName: {\n type: 'string',\n description: 'Name of the entity to add observations to',\n },\n contents: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of observations to add',\n },\n },\n required: ['entityName', 'contents'],\n },\n description: 'Array of observation additions',\n },\n },\n required: ['observations'],\n },\n },\n {\n name: 'delete_entities',\n description:\n 'Delete multiple entities and their relations from the knowledge graph by name.',\n inputSchema: {\n type: 'object',\n properties: {\n entityNames: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of entity names to delete',\n },\n },\n required: ['entityNames'],\n },\n },\n {\n name: 'delete_observations',\n description: 'Delete specific observations from entities.',\n inputSchema: {\n type: 'object',\n properties: {\n deletions: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n entityName: { type: 'string', description: 'Name of the entity' },\n observations: {\n type: 'array',\n items: { type: 'string' },\n description: 'Observations to remove',\n },\n },\n required: ['entityName', 'observations'],\n },\n description: 'Array of observation deletions',\n },\n },\n required: ['deletions'],\n },\n },\n {\n name: 'delete_relations',\n description: 'Delete specific relations from the knowledge graph.',\n inputSchema: {\n type: 'object',\n properties: {\n relations: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source entity name' },\n to: { type: 'string', description: 'Target entity name' },\n relationType: { type: 'string', description: 'Type of relationship' },\n },\n required: ['from', 'to', 'relationType'],\n },\n description: 'Array of relations to delete',\n },\n },\n required: ['relations'],\n },\n },\n {\n name: 'read_graph',\n description: 'Read the entire knowledge graph including all entities and relations.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'search_nodes',\n description: 'Search for nodes in the knowledge graph by matching names, types, or observations.',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query to match against entity names, types, and observations',\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'open_nodes',\n description: 'Open specific nodes by name and retrieve them with their inter-relations.',\n inputSchema: {\n type: 'object',\n properties: {\n names: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of entity names to retrieve',\n },\n },\n required: ['names'],\n },\n },\n ]\n\n // Tool handlers\n const toolHandlers: Record<string, (input: unknown) => Promise<McpToolResponse>> = {\n create_entities: async (input) => {\n const { entities } = CreateEntitiesInputSchema.parse(input)\n const created = await graphManager.createEntities(entities)\n return formatGraphResponse(created, `Created ${created.length} entities`)\n },\n\n create_relations: async (input) => {\n const { relations } = CreateRelationsInputSchema.parse(input)\n const created = await graphManager.createRelations(relations)\n return formatGraphResponse(created, `Created ${created.length} relations`)\n },\n\n add_observations: async (input) => {\n const { observations } = AddObservationsInputSchema.parse(input)\n const results = await graphManager.addObservations(observations)\n return formatGraphResponse(results, 'Observations added')\n },\n\n delete_entities: async (input) => {\n const { entityNames } = DeleteEntitiesInputSchema.parse(input)\n const result = await graphManager.deleteEntities(entityNames)\n return {\n content: [{ type: 'text', text: result.message }],\n }\n },\n\n delete_observations: async (input) => {\n const { deletions } = DeleteObservationsInputSchema.parse(input)\n const result = await graphManager.deleteObservations(deletions)\n return {\n content: [{ type: 'text', text: result.message }],\n }\n },\n\n delete_relations: async (input) => {\n const { relations } = DeleteRelationsInputSchema.parse(input)\n const result = await graphManager.deleteRelations(relations)\n return {\n content: [{ type: 'text', text: result.message }],\n }\n },\n\n read_graph: async () => {\n const graph = await graphManager.readGraph()\n return formatGraphResponse(graph, `Graph contains ${graph.entities.length} entities and ${graph.relations.length} relations`)\n },\n\n search_nodes: async (input) => {\n const { query } = SearchNodesInputSchema.parse(input)\n const graph = await graphManager.searchNodes(query)\n return formatGraphResponse(graph, `Found ${graph.entities.length} matching entities`)\n },\n\n open_nodes: async (input) => {\n const { names } = OpenNodesInputSchema.parse(input)\n const graph = await graphManager.openNodes(names)\n return formatGraphResponse(graph, `Opened ${graph.entities.length} entities`)\n },\n }\n\n function formatGraphResponse(data: unknown, summary: string): McpToolResponse {\n return {\n content: [\n { type: 'text', text: summary },\n {\n type: 'resource',\n resource: {\n uri: 'graph://result',\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n },\n },\n ],\n }\n }\n\n // Handle MCP JSON-RPC requests\n async function handleRequest(request: McpRequest): Promise<McpResponse> {\n const { id, method, params } = request\n\n try {\n switch (method) {\n case 'initialize':\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: '2024-11-05',\n capabilities: {\n tools: {},\n },\n serverInfo: {\n name,\n version,\n },\n },\n }\n\n case 'notifications/initialized':\n return { jsonrpc: '2.0', id, result: {} }\n\n case 'tools/list':\n return {\n jsonrpc: '2.0',\n id,\n result: { tools },\n }\n\n case 'tools/call': {\n const toolName = (params as { name: string })?.name\n const toolInput = (params as { arguments?: unknown })?.arguments ?? {}\n\n const handler = toolHandlers[toolName]\n if (!handler) {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: McpErrorCode.METHOD_NOT_FOUND,\n message: `Unknown tool: ${toolName}`,\n },\n }\n }\n\n try {\n const result = await handler(toolInput)\n return { jsonrpc: '2.0', id, result }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n return {\n jsonrpc: '2.0',\n id,\n result: {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n },\n }\n }\n }\n\n case 'ping':\n return { jsonrpc: '2.0', id, result: {} }\n\n default:\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: McpErrorCode.METHOD_NOT_FOUND,\n message: `Unknown method: ${method}`,\n },\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: McpErrorCode.INTERNAL_ERROR,\n message: error.message,\n },\n }\n }\n }\n\n return {\n name,\n version,\n tools,\n handleRequest,\n graphManager,\n }\n}\n\nexport type GraphMcpServer = ReturnType<typeof createGraphMcpServer>\n","import type { GraphMcpServer, McpRequest, McpResponse } from './server.js'\n\n/**\n * Stdio transport for MCP server\n * Reads JSON-RPC messages from stdin, writes responses to stdout\n */\nexport async function runStdioTransport(server: GraphMcpServer): Promise<void> {\n const stdin = process.stdin\n const stdout = process.stdout\n const stderr = process.stderr\n\n stdin.setEncoding('utf8')\n\n let buffer = ''\n\n stderr.write(`${server.name} v${server.version} MCP server started (stdio)\\n`)\n\n stdin.on('data', async (chunk: string) => {\n buffer += chunk\n\n // Process complete lines\n while (true) {\n const newlineIndex = buffer.indexOf('\\n')\n if (newlineIndex === -1) break\n\n const line = buffer.slice(0, newlineIndex).trim()\n buffer = buffer.slice(newlineIndex + 1)\n\n if (!line) continue\n\n try {\n const request = JSON.parse(line) as McpRequest\n const response = await server.handleRequest(request)\n stdout.write(JSON.stringify(response) + '\\n')\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n const errorResponse: McpResponse = {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32700,\n message: `Parse error: ${error.message}`,\n },\n }\n stdout.write(JSON.stringify(errorResponse) + '\\n')\n }\n }\n })\n\n stdin.on('end', () => {\n stderr.write('stdin closed, shutting down\\n')\n process.exit(0)\n })\n\n stdin.on('error', (err) => {\n stderr.write(`stdin error: ${err.message}\\n`)\n process.exit(1)\n })\n\n // Keep the process alive\n await new Promise(() => {})\n}\n\n/**\n * Create a simple in-process MCP client for testing\n */\nexport function createStdioClient(server: GraphMcpServer) {\n let requestId = 0\n\n async function call(method: string, params?: Record<string, unknown>): Promise<unknown> {\n const request: McpRequest = {\n jsonrpc: '2.0',\n id: ++requestId,\n method,\n params,\n }\n\n const response = await server.handleRequest(request)\n\n if (response.error) {\n throw new Error(`MCP Error ${response.error.code}: ${response.error.message}`)\n }\n\n return response.result\n }\n\n return {\n initialize: () => call('initialize'),\n listTools: () => call('tools/list'),\n callTool: (name: string, args?: unknown) =>\n call('tools/call', { name, arguments: args }),\n ping: () => call('ping'),\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
declare const EntitySchema: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
entityType: z.ZodString;
|
|
6
|
+
observations: z.ZodArray<z.ZodString>;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
type Entity = z.infer<typeof EntitySchema>;
|
|
9
|
+
declare const RelationSchema: z.ZodObject<{
|
|
10
|
+
from: z.ZodString;
|
|
11
|
+
to: z.ZodString;
|
|
12
|
+
relationType: z.ZodString;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
type Relation = z.infer<typeof RelationSchema>;
|
|
15
|
+
declare const KnowledgeGraphSchema: z.ZodObject<{
|
|
16
|
+
entities: z.ZodArray<z.ZodObject<{
|
|
17
|
+
name: z.ZodString;
|
|
18
|
+
entityType: z.ZodString;
|
|
19
|
+
observations: z.ZodArray<z.ZodString>;
|
|
20
|
+
}, z.core.$strip>>;
|
|
21
|
+
relations: z.ZodArray<z.ZodObject<{
|
|
22
|
+
from: z.ZodString;
|
|
23
|
+
to: z.ZodString;
|
|
24
|
+
relationType: z.ZodString;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
type KnowledgeGraph = z.infer<typeof KnowledgeGraphSchema>;
|
|
28
|
+
declare const CreateEntitiesInputSchema: z.ZodObject<{
|
|
29
|
+
entities: z.ZodArray<z.ZodObject<{
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
entityType: z.ZodString;
|
|
32
|
+
observations: z.ZodArray<z.ZodString>;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
declare const CreateRelationsInputSchema: z.ZodObject<{
|
|
36
|
+
relations: z.ZodArray<z.ZodObject<{
|
|
37
|
+
from: z.ZodString;
|
|
38
|
+
to: z.ZodString;
|
|
39
|
+
relationType: z.ZodString;
|
|
40
|
+
}, z.core.$strip>>;
|
|
41
|
+
}, z.core.$strip>;
|
|
42
|
+
declare const AddObservationsInputSchema: z.ZodObject<{
|
|
43
|
+
observations: z.ZodArray<z.ZodObject<{
|
|
44
|
+
entityName: z.ZodString;
|
|
45
|
+
contents: z.ZodArray<z.ZodString>;
|
|
46
|
+
}, z.core.$strip>>;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
declare const DeleteEntitiesInputSchema: z.ZodObject<{
|
|
49
|
+
entityNames: z.ZodArray<z.ZodString>;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
declare const DeleteObservationsInputSchema: z.ZodObject<{
|
|
52
|
+
deletions: z.ZodArray<z.ZodObject<{
|
|
53
|
+
entityName: z.ZodString;
|
|
54
|
+
observations: z.ZodArray<z.ZodString>;
|
|
55
|
+
}, z.core.$strip>>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
declare const DeleteRelationsInputSchema: z.ZodObject<{
|
|
58
|
+
relations: z.ZodArray<z.ZodObject<{
|
|
59
|
+
from: z.ZodString;
|
|
60
|
+
to: z.ZodString;
|
|
61
|
+
relationType: z.ZodString;
|
|
62
|
+
}, z.core.$strip>>;
|
|
63
|
+
}, z.core.$strip>;
|
|
64
|
+
declare const SearchNodesInputSchema: z.ZodObject<{
|
|
65
|
+
query: z.ZodString;
|
|
66
|
+
}, z.core.$strip>;
|
|
67
|
+
declare const OpenNodesInputSchema: z.ZodObject<{
|
|
68
|
+
names: z.ZodArray<z.ZodString>;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
interface EntityDocument extends Entity {
|
|
71
|
+
_id?: string;
|
|
72
|
+
[key: string]: unknown;
|
|
73
|
+
}
|
|
74
|
+
interface RelationDocument extends Relation {
|
|
75
|
+
_id?: string;
|
|
76
|
+
[key: string]: unknown;
|
|
77
|
+
}
|
|
78
|
+
interface CollectionLike<T> {
|
|
79
|
+
findOne(filter: Record<string, unknown>): Promise<T | null>;
|
|
80
|
+
find(filter: Record<string, unknown>): {
|
|
81
|
+
toArray(): Promise<T[]>;
|
|
82
|
+
};
|
|
83
|
+
insertOne(doc: Partial<T>): Promise<{
|
|
84
|
+
insertedId: string;
|
|
85
|
+
}>;
|
|
86
|
+
updateOne(filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{
|
|
87
|
+
modifiedCount: number;
|
|
88
|
+
}>;
|
|
89
|
+
deleteOne(filter: Record<string, unknown>): Promise<{
|
|
90
|
+
deletedCount: number;
|
|
91
|
+
}>;
|
|
92
|
+
deleteMany(filter: Record<string, unknown>): Promise<{
|
|
93
|
+
deletedCount: number;
|
|
94
|
+
}>;
|
|
95
|
+
}
|
|
96
|
+
interface AddObservationsResult {
|
|
97
|
+
entityName: string;
|
|
98
|
+
addedObservations: string[];
|
|
99
|
+
}
|
|
100
|
+
interface OperationResult {
|
|
101
|
+
success: boolean;
|
|
102
|
+
message: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
interface GraphManagerConfig {
|
|
106
|
+
entities: CollectionLike<EntityDocument>;
|
|
107
|
+
relations: CollectionLike<RelationDocument>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* KnowledgeGraphManager - Manages entities and relations stored in MongoDB
|
|
111
|
+
*/
|
|
112
|
+
declare class KnowledgeGraphManager {
|
|
113
|
+
private entities;
|
|
114
|
+
private relations;
|
|
115
|
+
constructor(config: GraphManagerConfig);
|
|
116
|
+
/**
|
|
117
|
+
* Create new entities (ignores duplicates)
|
|
118
|
+
*/
|
|
119
|
+
createEntities(entities: Entity[]): Promise<Entity[]>;
|
|
120
|
+
/**
|
|
121
|
+
* Create new relations (skips duplicates)
|
|
122
|
+
*/
|
|
123
|
+
createRelations(relations: Relation[]): Promise<Relation[]>;
|
|
124
|
+
/**
|
|
125
|
+
* Add observations to existing entities
|
|
126
|
+
* Throws if entity doesn't exist
|
|
127
|
+
*/
|
|
128
|
+
addObservations(observations: Array<{
|
|
129
|
+
entityName: string;
|
|
130
|
+
contents: string[];
|
|
131
|
+
}>): Promise<AddObservationsResult[]>;
|
|
132
|
+
/**
|
|
133
|
+
* Delete entities and cascade delete their relations
|
|
134
|
+
*/
|
|
135
|
+
deleteEntities(entityNames: string[]): Promise<OperationResult>;
|
|
136
|
+
/**
|
|
137
|
+
* Delete specific observations from entities (silent on non-existent)
|
|
138
|
+
*/
|
|
139
|
+
deleteObservations(deletions: Array<{
|
|
140
|
+
entityName: string;
|
|
141
|
+
observations: string[];
|
|
142
|
+
}>): Promise<OperationResult>;
|
|
143
|
+
/**
|
|
144
|
+
* Delete specific relations (silent on non-existent)
|
|
145
|
+
*/
|
|
146
|
+
deleteRelations(relations: Relation[]): Promise<OperationResult>;
|
|
147
|
+
/**
|
|
148
|
+
* Read the complete knowledge graph
|
|
149
|
+
*/
|
|
150
|
+
readGraph(): Promise<KnowledgeGraph>;
|
|
151
|
+
/**
|
|
152
|
+
* Search nodes by query (matches name, type, or observations)
|
|
153
|
+
*/
|
|
154
|
+
searchNodes(query: string): Promise<KnowledgeGraph>;
|
|
155
|
+
/**
|
|
156
|
+
* Open specific nodes by name and return them with their inter-relations
|
|
157
|
+
*/
|
|
158
|
+
openNodes(names: string[]): Promise<KnowledgeGraph>;
|
|
159
|
+
/**
|
|
160
|
+
* Get a single entity by name
|
|
161
|
+
*/
|
|
162
|
+
getEntity(name: string): Promise<Entity | null>;
|
|
163
|
+
/**
|
|
164
|
+
* Get all relations for an entity
|
|
165
|
+
*/
|
|
166
|
+
getRelationsFor(entityName: string): Promise<Relation[]>;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
interface McpToolDefinition {
|
|
170
|
+
name: string;
|
|
171
|
+
description: string;
|
|
172
|
+
inputSchema: {
|
|
173
|
+
type: 'object';
|
|
174
|
+
properties: Record<string, unknown>;
|
|
175
|
+
required?: string[];
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
interface McpToolResponse {
|
|
179
|
+
content: Array<{
|
|
180
|
+
type: 'text';
|
|
181
|
+
text: string;
|
|
182
|
+
} | {
|
|
183
|
+
type: 'resource';
|
|
184
|
+
resource: {
|
|
185
|
+
uri: string;
|
|
186
|
+
mimeType: string;
|
|
187
|
+
text: string;
|
|
188
|
+
};
|
|
189
|
+
}>;
|
|
190
|
+
isError?: boolean;
|
|
191
|
+
}
|
|
192
|
+
interface McpRequest {
|
|
193
|
+
jsonrpc: '2.0';
|
|
194
|
+
id: string | number;
|
|
195
|
+
method: string;
|
|
196
|
+
params?: Record<string, unknown>;
|
|
197
|
+
}
|
|
198
|
+
interface McpResponse {
|
|
199
|
+
jsonrpc: '2.0';
|
|
200
|
+
id: string | number;
|
|
201
|
+
result?: unknown;
|
|
202
|
+
error?: {
|
|
203
|
+
code: number;
|
|
204
|
+
message: string;
|
|
205
|
+
data?: unknown;
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
interface McpServerConfig {
|
|
209
|
+
name?: string;
|
|
210
|
+
version?: string;
|
|
211
|
+
graphManager: KnowledgeGraphManager;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Creates an MCP server for the knowledge graph
|
|
215
|
+
*/
|
|
216
|
+
declare function createGraphMcpServer(config: McpServerConfig): {
|
|
217
|
+
name: string;
|
|
218
|
+
version: string;
|
|
219
|
+
tools: McpToolDefinition[];
|
|
220
|
+
handleRequest: (request: McpRequest) => Promise<McpResponse>;
|
|
221
|
+
graphManager: KnowledgeGraphManager;
|
|
222
|
+
};
|
|
223
|
+
type GraphMcpServer = ReturnType<typeof createGraphMcpServer>;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Stdio transport for MCP server
|
|
227
|
+
* Reads JSON-RPC messages from stdin, writes responses to stdout
|
|
228
|
+
*/
|
|
229
|
+
declare function runStdioTransport(server: GraphMcpServer): Promise<void>;
|
|
230
|
+
/**
|
|
231
|
+
* Create a simple in-process MCP client for testing
|
|
232
|
+
*/
|
|
233
|
+
declare function createStdioClient(server: GraphMcpServer): {
|
|
234
|
+
initialize: () => Promise<unknown>;
|
|
235
|
+
listTools: () => Promise<unknown>;
|
|
236
|
+
callTool: (name: string, args?: unknown) => Promise<unknown>;
|
|
237
|
+
ping: () => Promise<unknown>;
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
interface HttpTransportConfig {
|
|
241
|
+
server: GraphMcpServer;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Create HTTP request handler for MCP server
|
|
245
|
+
* Compatible with Cloudflare Workers fetch handler
|
|
246
|
+
*/
|
|
247
|
+
declare function createHttpTransport(config: HttpTransportConfig): {
|
|
248
|
+
handleRequest: (request: Request) => Promise<Response>;
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* Server-Sent Events transport for streaming responses
|
|
252
|
+
*/
|
|
253
|
+
declare function createSseTransport(config: HttpTransportConfig): {
|
|
254
|
+
handleSse: (request: Request) => Response;
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
export { AddObservationsInputSchema as A, CreateEntitiesInputSchema as C, DeleteEntitiesInputSchema as D, EntitySchema as E, type GraphManagerConfig as G, type HttpTransportConfig as H, KnowledgeGraphManager as K, type McpToolDefinition as M, OpenNodesInputSchema as O, RelationSchema as R, SearchNodesInputSchema as S, KnowledgeGraphSchema as a, CreateRelationsInputSchema as b, DeleteObservationsInputSchema as c, DeleteRelationsInputSchema as d, type Entity as e, type Relation as f, type KnowledgeGraph as g, type EntityDocument as h, type RelationDocument as i, type AddObservationsResult as j, type OperationResult as k, type CollectionLike as l, createGraphMcpServer as m, createStdioClient as n, createHttpTransport as o, createSseTransport as p, type GraphMcpServer as q, runStdioTransport as r, type McpToolResponse as s, type McpRequest as t, type McpResponse as u, type McpServerConfig as v };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { K as KnowledgeGraphManager } from './index-BmsgR5Vk.js';
|
|
2
|
+
export { A as AddObservationsInputSchema, j as AddObservationsResult, l as CollectionLike, C as CreateEntitiesInputSchema, b as CreateRelationsInputSchema, D as DeleteEntitiesInputSchema, c as DeleteObservationsInputSchema, d as DeleteRelationsInputSchema, e as Entity, h as EntityDocument, E as EntitySchema, G as GraphManagerConfig, q as GraphMcpServer, H as HttpTransportConfig, g as KnowledgeGraph, a as KnowledgeGraphSchema, t as McpRequest, u as McpResponse, v as McpServerConfig, M as McpToolDefinition, s as McpToolResponse, O as OpenNodesInputSchema, k as OperationResult, f as Relation, i as RelationDocument, R as RelationSchema, S as SearchNodesInputSchema, m as createGraphMcpServer, o as createHttpTransport, p as createSseTransport, n as createStdioClient, r as runStdioTransport } from './index-BmsgR5Vk.js';
|
|
3
|
+
import 'zod';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Default knowledge graph client
|
|
7
|
+
* Connects to https://graph.do - no configuration needed
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { graph } from 'graph.do'
|
|
12
|
+
*
|
|
13
|
+
* await graph.createEntities([
|
|
14
|
+
* { name: 'Alice', entityType: 'Person', observations: ['Works at Acme'] }
|
|
15
|
+
* ])
|
|
16
|
+
*
|
|
17
|
+
* const results = await graph.searchNodes('Alice')
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
declare const graph: KnowledgeGraphManager;
|
|
21
|
+
/**
|
|
22
|
+
* Create a custom graph client with a different URL
|
|
23
|
+
*/
|
|
24
|
+
declare function createGraph(url?: string): KnowledgeGraphManager;
|
|
25
|
+
|
|
26
|
+
export { KnowledgeGraphManager, createGraph, graph };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import {
|
|
2
|
+
KnowledgeGraphManager
|
|
3
|
+
} from "./chunk-VXRM2HKS.js";
|
|
4
|
+
import {
|
|
5
|
+
AddObservationsInputSchema,
|
|
6
|
+
CreateEntitiesInputSchema,
|
|
7
|
+
CreateRelationsInputSchema,
|
|
8
|
+
DeleteEntitiesInputSchema,
|
|
9
|
+
DeleteObservationsInputSchema,
|
|
10
|
+
DeleteRelationsInputSchema,
|
|
11
|
+
EntitySchema,
|
|
12
|
+
KnowledgeGraphSchema,
|
|
13
|
+
OpenNodesInputSchema,
|
|
14
|
+
RelationSchema,
|
|
15
|
+
SearchNodesInputSchema,
|
|
16
|
+
createGraphMcpServer,
|
|
17
|
+
createHttpTransport,
|
|
18
|
+
createSseTransport,
|
|
19
|
+
createStdioClient,
|
|
20
|
+
runStdioTransport
|
|
21
|
+
} from "./chunk-SOVFPCTE.js";
|
|
22
|
+
|
|
23
|
+
// src/index.ts
|
|
24
|
+
import { MongoClient } from "mongo.do";
|
|
25
|
+
var DEFAULT_URL = "https://graph.do";
|
|
26
|
+
function createGraphClient(url = DEFAULT_URL) {
|
|
27
|
+
const client = new MongoClient(url);
|
|
28
|
+
const db = client.db("graph");
|
|
29
|
+
const entitiesCollection = db.collection("entities");
|
|
30
|
+
const relationsCollection = db.collection("relations");
|
|
31
|
+
return new KnowledgeGraphManager({
|
|
32
|
+
entities: entitiesCollection,
|
|
33
|
+
relations: relationsCollection
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
var graph = createGraphClient();
|
|
37
|
+
function createGraph(url) {
|
|
38
|
+
return createGraphClient(url);
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
AddObservationsInputSchema,
|
|
42
|
+
CreateEntitiesInputSchema,
|
|
43
|
+
CreateRelationsInputSchema,
|
|
44
|
+
DeleteEntitiesInputSchema,
|
|
45
|
+
DeleteObservationsInputSchema,
|
|
46
|
+
DeleteRelationsInputSchema,
|
|
47
|
+
EntitySchema,
|
|
48
|
+
KnowledgeGraphManager,
|
|
49
|
+
KnowledgeGraphSchema,
|
|
50
|
+
OpenNodesInputSchema,
|
|
51
|
+
RelationSchema,
|
|
52
|
+
SearchNodesInputSchema,
|
|
53
|
+
createGraph,
|
|
54
|
+
createGraphMcpServer,
|
|
55
|
+
createHttpTransport,
|
|
56
|
+
createSseTransport,
|
|
57
|
+
createStdioClient,
|
|
58
|
+
graph,
|
|
59
|
+
runStdioTransport
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Core types\nexport {\n EntitySchema,\n RelationSchema,\n KnowledgeGraphSchema,\n CreateEntitiesInputSchema,\n CreateRelationsInputSchema,\n AddObservationsInputSchema,\n DeleteEntitiesInputSchema,\n DeleteObservationsInputSchema,\n DeleteRelationsInputSchema,\n SearchNodesInputSchema,\n OpenNodesInputSchema,\n} from './types.js'\n\nexport type {\n Entity,\n Relation,\n KnowledgeGraph,\n EntityDocument,\n RelationDocument,\n AddObservationsResult,\n OperationResult,\n CollectionLike,\n} from './types.js'\n\n// Knowledge Graph Manager\nexport { KnowledgeGraphManager } from './graph-manager.js'\nexport type { GraphManagerConfig } from './graph-manager.js'\n\n// MCP exports\nexport {\n createGraphMcpServer,\n runStdioTransport,\n createStdioClient,\n createHttpTransport,\n createSseTransport,\n} from './mcp/index.js'\n\nexport type {\n GraphMcpServer,\n McpToolDefinition,\n McpToolResponse,\n McpRequest,\n McpResponse,\n McpServerConfig,\n HttpTransportConfig,\n} from './mcp/index.js'\n\n// Default graph client\nimport { MongoClient } from 'mongo.do'\nimport { KnowledgeGraphManager } from './graph-manager.js'\nimport type { CollectionLike, EntityDocument, RelationDocument } from './types.js'\n\nconst DEFAULT_URL = 'https://graph.do'\n\nfunction createGraphClient(url: string = DEFAULT_URL) {\n const client = new MongoClient(url)\n const db = client.db('graph')\n\n const entitiesCollection = db.collection('entities') as unknown as CollectionLike<EntityDocument>\n const relationsCollection = db.collection('relations') as unknown as CollectionLike<RelationDocument>\n\n return new KnowledgeGraphManager({\n entities: entitiesCollection,\n relations: relationsCollection,\n })\n}\n\n/**\n * Default knowledge graph client\n * Connects to https://graph.do - no configuration needed\n *\n * @example\n * ```typescript\n * import { graph } from 'graph.do'\n *\n * await graph.createEntities([\n * { name: 'Alice', entityType: 'Person', observations: ['Works at Acme'] }\n * ])\n *\n * const results = await graph.searchNodes('Alice')\n * ```\n */\nexport const graph = createGraphClient()\n\n/**\n * Create a custom graph client with a different URL\n */\nexport function createGraph(url?: string) {\n return createGraphClient(url)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAAS,mBAAmB;AAI5B,IAAM,cAAc;AAEpB,SAAS,kBAAkB,MAAc,aAAa;AACpD,QAAM,SAAS,IAAI,YAAY,GAAG;AAClC,QAAM,KAAK,OAAO,GAAG,OAAO;AAE5B,QAAM,qBAAqB,GAAG,WAAW,UAAU;AACnD,QAAM,sBAAsB,GAAG,WAAW,WAAW;AAErD,SAAO,IAAI,sBAAsB;AAAA,IAC/B,UAAU;AAAA,IACV,WAAW;AAAA,EACb,CAAC;AACH;AAiBO,IAAM,QAAQ,kBAAkB;AAKhC,SAAS,YAAY,KAAc;AACxC,SAAO,kBAAkB,GAAG;AAC9B;","names":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { q as GraphMcpServer, H as HttpTransportConfig, t as McpRequest, u as McpResponse, v as McpServerConfig, M as McpToolDefinition, s as McpToolResponse, m as createGraphMcpServer, o as createHttpTransport, p as createSseTransport, n as createStdioClient, r as runStdioTransport } from '../index-BmsgR5Vk.js';
|
|
2
|
+
import 'zod';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createGraphMcpServer,
|
|
3
|
+
createHttpTransport,
|
|
4
|
+
createSseTransport,
|
|
5
|
+
createStdioClient,
|
|
6
|
+
runStdioTransport
|
|
7
|
+
} from "../chunk-SOVFPCTE.js";
|
|
8
|
+
export {
|
|
9
|
+
createGraphMcpServer,
|
|
10
|
+
createHttpTransport,
|
|
11
|
+
createSseTransport,
|
|
12
|
+
createStdioClient,
|
|
13
|
+
runStdioTransport
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { MondoDatabase } from 'mongo.do';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cloudflare Worker entry point for graph.do
|
|
5
|
+
* Self-contained knowledge graph with built-in MongoDB storage
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
interface Env {
|
|
9
|
+
MONDO_DATABASE: DurableObjectNamespace;
|
|
10
|
+
}
|
|
11
|
+
declare const _default: {
|
|
12
|
+
fetch(request: Request, env: Env): Promise<Response>;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { type Env, _default as default };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import {
|
|
2
|
+
KnowledgeGraphManager
|
|
3
|
+
} from "../chunk-VXRM2HKS.js";
|
|
4
|
+
import {
|
|
5
|
+
createGraphMcpServer,
|
|
6
|
+
createHttpTransport
|
|
7
|
+
} from "../chunk-SOVFPCTE.js";
|
|
8
|
+
|
|
9
|
+
// src/worker/index.ts
|
|
10
|
+
import { MondoDatabase, MongoClient } from "mongo.do";
|
|
11
|
+
var cachedServer = null;
|
|
12
|
+
function getServer(env) {
|
|
13
|
+
if (cachedServer) return cachedServer;
|
|
14
|
+
const client = new MongoClient(env);
|
|
15
|
+
const db = client.db("graph");
|
|
16
|
+
const entitiesCollection = db.collection("entities");
|
|
17
|
+
const relationsCollection = db.collection("relations");
|
|
18
|
+
const graphManager = new KnowledgeGraphManager({
|
|
19
|
+
entities: entitiesCollection,
|
|
20
|
+
relations: relationsCollection
|
|
21
|
+
});
|
|
22
|
+
cachedServer = createGraphMcpServer({
|
|
23
|
+
name: "graph.do",
|
|
24
|
+
version: "0.1.0",
|
|
25
|
+
graphManager
|
|
26
|
+
});
|
|
27
|
+
return cachedServer;
|
|
28
|
+
}
|
|
29
|
+
var worker_default = {
|
|
30
|
+
async fetch(request, env) {
|
|
31
|
+
const url = new URL(request.url);
|
|
32
|
+
if (url.pathname === "/health" || url.pathname === "/") {
|
|
33
|
+
return new Response(
|
|
34
|
+
JSON.stringify({
|
|
35
|
+
status: "ok",
|
|
36
|
+
service: "graph.do",
|
|
37
|
+
version: "0.1.0"
|
|
38
|
+
}),
|
|
39
|
+
{
|
|
40
|
+
headers: { "Content-Type": "application/json" }
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
if (url.pathname.startsWith("/mcp")) {
|
|
45
|
+
const server = getServer(env);
|
|
46
|
+
const transport = createHttpTransport({ server });
|
|
47
|
+
return transport.handleRequest(request);
|
|
48
|
+
}
|
|
49
|
+
return new Response("Not Found", { status: 404 });
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
export {
|
|
53
|
+
MondoDatabase,
|
|
54
|
+
worker_default as default
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/worker/index.ts"],"sourcesContent":["/**\n * Cloudflare Worker entry point for graph.do\n * Self-contained knowledge graph with built-in MongoDB storage\n */\n\nimport { MondoDatabase, MongoClient } from 'mongo.do'\nimport { KnowledgeGraphManager } from '../graph-manager.js'\nimport { createGraphMcpServer, createHttpTransport } from '../mcp/index.js'\nimport type { CollectionLike, EntityDocument, RelationDocument } from '../types.js'\n\n// Re-export the Durable Object class so it's included in this worker\nexport { MondoDatabase }\n\nexport interface Env {\n // Built-in Durable Object binding (self-contained)\n MONDO_DATABASE: DurableObjectNamespace\n}\n\n// Cache the graph manager and MCP server per isolate\nlet cachedServer: ReturnType<typeof createGraphMcpServer> | null = null\n\nfunction getServer(env: Env) {\n if (cachedServer) return cachedServer\n\n // Create MongoDB client using the built-in Durable Object\n const client = new MongoClient(env as unknown as string)\n const db = client.db('graph')\n\n // Create collections for entities and relations\n const entitiesCollection = db.collection('entities') as unknown as CollectionLike<EntityDocument>\n const relationsCollection = db.collection('relations') as unknown as CollectionLike<RelationDocument>\n\n // Create graph manager\n const graphManager = new KnowledgeGraphManager({\n entities: entitiesCollection,\n relations: relationsCollection,\n })\n\n // Create MCP server\n cachedServer = createGraphMcpServer({\n name: 'graph.do',\n version: '0.1.0',\n graphManager,\n })\n\n return cachedServer\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n const url = new URL(request.url)\n\n // Health check\n if (url.pathname === '/health' || url.pathname === '/') {\n return new Response(\n JSON.stringify({\n status: 'ok',\n service: 'graph.do',\n version: '0.1.0',\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n }\n )\n }\n\n // MCP endpoints\n if (url.pathname.startsWith('/mcp')) {\n const server = getServer(env)\n const transport = createHttpTransport({ server })\n return transport.handleRequest(request)\n }\n\n return new Response('Not Found', { status: 404 })\n },\n}\n"],"mappings":";;;;;;;;;AAKA,SAAS,eAAe,mBAAmB;AAc3C,IAAI,eAA+D;AAEnE,SAAS,UAAU,KAAU;AAC3B,MAAI,aAAc,QAAO;AAGzB,QAAM,SAAS,IAAI,YAAY,GAAwB;AACvD,QAAM,KAAK,OAAO,GAAG,OAAO;AAG5B,QAAM,qBAAqB,GAAG,WAAW,UAAU;AACnD,QAAM,sBAAsB,GAAG,WAAW,WAAW;AAGrD,QAAM,eAAe,IAAI,sBAAsB;AAAA,IAC7C,UAAU;AAAA,IACV,WAAW;AAAA,EACb,CAAC;AAGD,iBAAe,qBAAqB;AAAA,IAClC,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,IAAO,iBAAQ;AAAA,EACb,MAAM,MAAM,SAAkB,KAA6B;AACzD,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAG/B,QAAI,IAAI,aAAa,aAAa,IAAI,aAAa,KAAK;AACtD,aAAO,IAAI;AAAA,QACT,KAAK,UAAU;AAAA,UACb,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,SAAS;AAAA,QACX,CAAC;AAAA,QACD;AAAA,UACE,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,IAAI,SAAS,WAAW,MAAM,GAAG;AACnC,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,YAAY,oBAAoB,EAAE,OAAO,CAAC;AAChD,aAAO,UAAU,cAAc,OAAO;AAAA,IACxC;AAEA,WAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,EAClD;AACF;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "graph.do",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Knowledge graph built on mongo.do with MCP server support",
|
|
5
|
+
"author": "Nathan Clevenger",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/nathanclevenger/graph.do.git"
|
|
9
|
+
},
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/nathanclevenger/graph.do/issues"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/nathanclevenger/graph.do#readme",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"main": "dist/index.js",
|
|
16
|
+
"types": "dist/index.d.ts",
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md",
|
|
20
|
+
"LICENSE"
|
|
21
|
+
],
|
|
22
|
+
"bin": {
|
|
23
|
+
"graph.do": "./dist/cli/index.js"
|
|
24
|
+
},
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"import": "./dist/index.js",
|
|
28
|
+
"types": "./dist/index.d.ts"
|
|
29
|
+
},
|
|
30
|
+
"./mcp": {
|
|
31
|
+
"import": "./dist/mcp/index.js",
|
|
32
|
+
"types": "./dist/mcp/index.d.ts"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"dev": "wrangler dev",
|
|
38
|
+
"start": "bun run src/cli/index.ts",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"test:watch": "vitest",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"deploy": "wrangler deploy",
|
|
43
|
+
"prepublishOnly": "npm run build"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"mongo.do": "^0.1.1",
|
|
47
|
+
"zod": "^4.3.5"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@cloudflare/vitest-pool-workers": "^0.11.1",
|
|
51
|
+
"@cloudflare/workers-types": "^4.20240925.0",
|
|
52
|
+
"@types/bun": "^1.2.4",
|
|
53
|
+
"@types/node": "^20.19.27",
|
|
54
|
+
"tsup": "^8.5.1",
|
|
55
|
+
"typescript": "^5.6.0",
|
|
56
|
+
"vitest": "^3.2.4",
|
|
57
|
+
"wrangler": "^4.54.0"
|
|
58
|
+
},
|
|
59
|
+
"keywords": [
|
|
60
|
+
"knowledge-graph",
|
|
61
|
+
"graph-database",
|
|
62
|
+
"mcp",
|
|
63
|
+
"model-context-protocol",
|
|
64
|
+
"mongo.do",
|
|
65
|
+
"cloudflare"
|
|
66
|
+
],
|
|
67
|
+
"license": "MIT",
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=18.0.0"
|
|
70
|
+
}
|
|
71
|
+
}
|