Skip to main content
Glama
vjsr007
by vjsr007

graph-node-upsert

Create or update graph nodes with labels, types, and properties using MCP Index Notes. Returns node ID for efficient knowledge graph management and relationship mapping.

Instructions

Create or update a graph node with label/type/props. Returns node id.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNo
labelYes
propsNo
typeNo

Implementation Reference

  • src/mcp.ts:164-168 (registration)
    Tool registration in the tools array defining name, description, and inputSchema.
    {
      name: 'graph-node-upsert',
      description: 'Create or update a graph node with label/type/props. Returns node id.',
      inputSchema: { type: 'object', properties: { id: { type: 'number' }, label: { type: 'string' }, type: { type: 'string' }, props: { type: 'object' } }, required: ['label'] },
    },
  • MCP tool handler that parses input with GraphNodeSchema and calls graph.upsertNode, returning the node ID.
    case 'graph-node-upsert': {
      const parsed = GraphNodeSchema.parse(args);
      const id = graph.upsertNode(parsed);
      return { content: [{ type: 'text', text: JSON.stringify({ id }) }] };
    }
  • Zod schema for validating graph node upsert input: id (opt), label (req), type (opt), props (opt).
    export const GraphNodeSchema = z.object({
      id: z.number().int().positive().optional(),
      label: z.string().min(1),
      type: z.string().optional(),
      props: z.record(z.any()).optional().default({}),
    });
    export type GraphNodeInput = z.infer<typeof GraphNodeSchema>;
  • Core upsertNode implementation in SqliteGraphStore: updates by id or label/type, inserts new if not exists, returns id.
    upsertNode(node: GraphNode): number {
      const props = JSON.stringify(node.props ?? {});
      if (node.id) {
        const info = this.db.prepare(`UPDATE graph_nodes SET label=?, type=?, props=? WHERE id=?`).run(node.label, node.type ?? null, props, node.id);
        if (info.changes === 0) throw new Error(`Node with id ${node.id} not found`);
        return node.id;
      }
      // Try find existing
      const existing = this.getNodeByLabel(node.label, node.type);
      if (existing) {
    this.db.prepare(`UPDATE graph_nodes SET props=? WHERE id=?`).run(props, existing.id);
        return existing.id!;
      }
      const info = this.db.prepare(`INSERT INTO graph_nodes(label, type, props) VALUES (?, ?, ?)`)
        .run(node.label, node.type ?? null, props);
      return Number(info.lastInsertRowid);
    }
  • Core upsertNode implementation in LiteGraphStore (fallback): in-memory upsert by id or label/type, returns id.
    upsertNode(node: GraphNode): number {
      if (node.id) {
        const existing = this.nodes.get(node.id);
        if (!existing) throw new Error(`Node with id ${node.id} not found`);
        const updated = { ...existing, label: node.label, type: node.type, props: node.props ?? existing.props };
        this.nodes.set(node.id, updated);
        this.labelIndex.set(this.keyFor(updated.label, updated.type), node.id);
        return node.id;
      }
      const idxKey = this.keyFor(node.label, node.type);
      const id = this.labelIndex.get(idxKey);
      if (id) {
        const updated = { ...this.nodes.get(id)!, props: node.props ?? this.nodes.get(id)!.props };
        this.nodes.set(id, updated);
        return id;
      }
      const newId = this.nextNodeId++;
      this.nodes.set(newId, { id: newId, label: node.label, type: node.type, props: node.props ?? {} });
      this.labelIndex.set(idxKey, newId);
      return newId;
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vjsr007/mcp-index-notes'

If you have feedback or need assistance with the MCP directory API, please join our Discord server