Skip to main content
Glama

Graph Boost

graph_boost
Idempotent

Strengthen graph edges when users confirm recalled information. Use after a positive confirmation to increase relationship weight, saturating at 1.0.

Instructions

Increase an edge's weight when the user confirms recalled information. Call this when the user says 'yes', 'exactly', or confirms something you retrieved from the graph. Persists immediately; weight clamps at 1.0 so repeated boosts saturate rather than overflow. Returns the previous and new weight.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
from_nameYesSource entity name or ID
to_nameYesTarget entity name or ID
relationYesRelationship type (e.g. WORKS_ON, PREFERS)
amountNoBoost amount (default: 0.15)
reasonNoWhy boosting

Implementation Reference

  • The graph_boost tool handler: resolves from/to entity names to IDs (or slugifies them), then calls client.boost() to increase the edge weight, returning previous and new weights.
    }, async (args) => {
      try {
        const tenantId = currentTenant();
        const fromId = (await client.findEntityIdByName(tenantId, args.from_name)) ?? slugify(args.from_name);
        const toId = (await client.findEntityIdByName(tenantId, args.to_name)) ?? slugify(args.to_name);
        const result = await client.boost(tenantId, fromId, toId, args.relation as RelationshipType, args.amount);
        return toolResult({
          previous_weight: result.previous_weight,
          new_weight: result.new_weight,
          edge: { from: fromId, to: toId, type: args.relation },
        });
      } catch (err) {
        return toolError(`graph_boost failed: ${err instanceof Error ? err.message : String(err)}`);
      }
    });
  • Input schema for graph_boost: requires from_name, to_name, relation; optional amount (default 0.15) and reason.
    inputSchema: {
      from_name: z.string().describe("Source entity name or ID"),
      to_name: z.string().describe("Target entity name or ID"),
      relation: z.string().describe("Relationship type (e.g. WORKS_ON, PREFERS)"),
      amount: z.number().optional().default(0.15).describe("Boost amount (default: 0.15)"),
      reason: z.string().optional().describe("Why boosting"),
    },
  • Registers the 'graph_boost' tool with the MCP server, setting title, description, input schema, and idempotent annotation.
    server.registerTool("graph_boost", {
      title: "Graph Boost",
      description:
        "Increase an edge's weight when the user confirms recalled information. Call this when the user says 'yes', 'exactly', or confirms something you retrieved from the graph. Persists immediately; weight clamps at 1.0 so repeated boosts saturate rather than overflow. Returns the previous and new weight.",
      inputSchema: {
        from_name: z.string().describe("Source entity name or ID"),
        to_name: z.string().describe("Target entity name or ID"),
        relation: z.string().describe("Relationship type (e.g. WORKS_ON, PREFERS)"),
        amount: z.number().optional().default(0.15).describe("Boost amount (default: 0.15)"),
        reason: z.string().optional().describe("Why boosting"),
      },
      annotations: { idempotentHint: true },
    }, async (args) => {
      try {
        const tenantId = currentTenant();
        const fromId = (await client.findEntityIdByName(tenantId, args.from_name)) ?? slugify(args.from_name);
        const toId = (await client.findEntityIdByName(tenantId, args.to_name)) ?? slugify(args.to_name);
        const result = await client.boost(tenantId, fromId, toId, args.relation as RelationshipType, args.amount);
        return toolResult({
          previous_weight: result.previous_weight,
          new_weight: result.new_weight,
          edge: { from: fromId, to: toId, type: args.relation },
        });
      } catch (err) {
        return toolError(`graph_boost failed: ${err instanceof Error ? err.message : String(err)}`);
      }
    });
  • The Neo4jClient.boost() helper method: executes a Cypher query that increases the edge weight (clamped at 1.0), updates last_confirmed, and returns previous and new weight.
    async boost(
      tenantId: string,
      fromId: string,
      toId: string,
      type: RelationshipType,
      amount?: number,
    ): Promise<{ previous_weight: number; new_weight: number }> {
      const config = getConfig();
      const boostAmount = amount ?? config.weights.boost_on_confirm;
      const rows = await this.run(
        `
        MATCH (a:Entity {tenant_id: $tenantId, id: $fromId})-[r:\`${type}\`]->(b:Entity {tenant_id: $tenantId, id: $toId})
        WITH r, r.weight AS old_weight
        SET r.weight = CASE WHEN r.weight + $amount > 1.0 THEN 1.0 ELSE r.weight + $amount END,
            r.last_confirmed = datetime()
        RETURN old_weight, r.weight AS new_weight
        `,
        { tenantId, fromId, toId, amount: boostAmount },
      );
      const row = rows[0];
      if (!row) throw new Error(`Edge not found: ${fromId} -[${type}]-> ${toId} in tenant ${tenantId}`);
      return {
        previous_weight: Number(row["old_weight"]),
        new_weight: Number(row["new_weight"]),
      };
    }
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds key behavioral details beyond annotations: immediate persistence, weight clamping at 1.0 to prevent overflow, saturation on repeated boosts, and return of previous and new weight. No contradiction with idempotentHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each serving a distinct purpose: purpose, usage trigger, and behavioral details. No wasted words, front-loaded with primary action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, trigger, behavior, and return value. While it lacks explicit mention of error handling (e.g., missing edge), it is largely sufficient for a simple boost tool. No output schema exists, so the return info is valuable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good parameter descriptions. The tool description adds context about user confirmation and clamping but does not significantly elaborate on individual parameters beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool increases an edge's weight when the user confirms recalled information, which is a specific verb and resource. It distinguishes it from sibling tools like graph_weaken (weight decrease) and others by tying usage to user confirmation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call: when the user says 'yes', 'exactly', or confirms recalled information. However, it does not mention when not to use it or contrast with alternatives like graph_weaken for decreasing weight.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/stevepridemore/graph-memory'

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