Skip to main content
Glama
modelcontextprotocol

Knowledge Graph Memory Server

지식 그래프 메모리 서버

로컬 지식 그래프를 사용하는 영구 메모리의 기본 구현입니다. 이를 통해 Claude는 채팅 전반에 걸쳐 사용자에 대한 정보를 기억할 수 있습니다.

핵심 개념

엔티티(Entities)

엔티티는 지식 그래프의 기본 노드입니다. 각 엔티티는 다음을 가집니다:

  • 고유 이름(식별자)

  • 엔티티 유형(예: "사람", "조직", "이벤트")

  • 관찰 목록

예시:

{
  "name": "John_Smith",
  "entityType": "person",
  "observations": ["Speaks fluent Spanish"]
}

관계(Relations)

관계는 엔티티 간의 방향성 연결을 정의합니다. 관계는 항상 능동태로 저장되며 엔티티가 서로 어떻게 상호 작용하거나 관련되는지 설명합니다.

예시:

{
  "from": "John_Smith",
  "to": "Anthropic",
  "relationType": "works_at"
}

관찰(Observations)

관찰은 엔티티에 대한 개별적인 정보 조각입니다. 관찰의 특징은 다음과 같습니다:

  • 문자열로 저장됨

  • 특정 엔티티에 연결됨

  • 독립적으로 추가하거나 제거할 수 있음

  • 원자적이어야 함(관찰 하나당 사실 하나)

예시:

{
  "entityName": "John_Smith",
  "observations": [
    "Speaks fluent Spanish",
    "Graduated in 2019",
    "Prefers morning meetings"
  ]
}

Related MCP server: Loc Knowledge Graph Memory Server

API

도구(Tools)

  • create_entities

    • 지식 그래프에 여러 개의 새 엔티티 생성

    • 입력: entities (객체 배열)

      • 각 객체 포함 항목:

        • name (문자열): 엔티티 식별자

        • entityType (문자열): 유형 분류

        • observations (문자열[]): 연결된 관찰

    • 기존 이름이 있는 엔티티는 무시함

  • create_relations

    • 엔티티 간에 여러 개의 새 관계 생성

    • 입력: relations (객체 배열)

      • 각 객체 포함 항목:

        • from (문자열): 소스 엔티티 이름

        • to (문자열): 대상 엔티티 이름

        • relationType (문자열): 능동태로 된 관계 유형

    • 중복 관계는 건너뜀

  • add_observations

    • 기존 엔티티에 새 관찰 추가

    • 입력: observations (객체 배열)

      • 각 객체 포함 항목:

        • entityName (문자열): 대상 엔티티

        • contents (문자열[]): 추가할 새 관찰

    • 엔티티별로 추가된 관찰을 반환함

    • 엔티티가 존재하지 않으면 실패함

  • delete_entities

    • 엔티티 및 해당 관계 제거

    • 입력: entityNames (문자열[])

    • 연결된 관계의 계단식 삭제

    • 엔티티가 존재하지 않으면 조용히 처리됨

  • delete_observations

    • 엔티티에서 특정 관찰 제거

    • 입력: deletions (객체 배열)

      • 각 객체 포함 항목:

        • entityName (문자열): 대상 엔티티

        • observations (문자열[]): 제거할 관찰

    • 관찰이 존재하지 않으면 조용히 처리됨

  • delete_relations

    • 그래프에서 특정 관계 제거

    • 입력: relations (객체 배열)

      • 각 객체 포함 항목:

        • from (문자열): 소스 엔티티 이름

        • to (문자열): 대상 엔티티 이름

        • relationType (문자열): 관계 유형

    • 관계가 존재하지 않으면 조용히 처리됨

  • read_graph

    • 전체 지식 그래프 읽기

    • 입력 필요 없음

    • 모든 엔티티와 관계가 포함된 전체 그래프 구조 반환

  • search_nodes

    • 쿼리를 기반으로 노드 검색

    • 입력: query (문자열)

    • 검색 범위:

      • 엔티티 이름

      • 엔티티 유형

      • 관찰 내용

    • 일치하는 엔티티와 해당 관계 반환

  • open_nodes

    • 이름으로 특정 노드 검색

    • 입력: names (문자열[])

    • 반환:

      • 요청된 엔티티

      • 요청된 엔티티 간의 관계

    • 존재하지 않는 노드는 조용히 건너뜀

Claude Desktop에서 사용하기

설정

claude_desktop_config.json에 다음을 추가하세요:

Docker

{
  "mcpServers": {
    "memory": {
      "command": "docker",
      "args": ["run", "-i", "-v", "claude-memory:/app/dist", "--rm", "mcp/memory"]
    }
  }
}

NPX

{
  "mcpServers": {
    "memory": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-memory"
      ]
    }
  }
}

Windows에서는 cmd /c를 사용하여 npx를 실행하세요:

{
  "mcpServers": {
    "memory": {
      "command": "cmd",
      "args": [
        "/c",
        "npx",
        "-y",
        "@modelcontextprotocol/server-memory"
      ]
    }
  }
}

사용자 지정 설정이 포함된 NPX

서버는 다음 환경 변수를 사용하여 구성할 수 있습니다:

{
  "mcpServers": {
    "memory": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-memory"
      ],
      "env": {
        "MEMORY_FILE_PATH": "/path/to/custom/memory.jsonl"
      }
    }
  }
}

Windows에서는 다음을 사용하세요:

{
  "mcpServers": {
    "memory": {
      "command": "cmd",
      "args": [
        "/c",
        "npx",
        "-y",
        "@modelcontextprotocol/server-memory"
      ],
      "env": {
        "MEMORY_FILE_PATH": "/path/to/custom/memory.jsonl"
      }
    }
  }
}
  • MEMORY_FILE_PATH: 메모리 저장 JSONL 파일 경로 (기본값: 서버 디렉토리의 memory.jsonl)

VS Code 설치 지침

빠른 설치를 위해 아래의 원클릭 설치 버튼 중 하나를 사용하세요:

Install with NPX in VS Code Install with NPX in VS Code Insiders

Install with Docker in VS Code Install with Docker in VS Code Insiders

수동 설치의 경우, 다음 방법 중 하나를 사용하여 MCP 서버를 구성할 수 있습니다:

방법 1: 사용자 구성(권장) 사용자 수준 MCP 구성 파일에 구성을 추가합니다. 명령 팔레트(Ctrl + Shift + P)를 열고 MCP: Open User Configuration을 실행합니다. 그러면 서버 구성을 추가할 수 있는 사용자 mcp.json 파일이 열립니다.

방법 2: 작업 영역 구성 또는 작업 영역의 .vscode/mcp.json이라는 파일에 구성을 추가할 수 있습니다. 이렇게 하면 다른 사람들과 구성을 공유할 수 있습니다.

VS Code의 MCP 구성에 대한 자세한 내용은 공식 VS Code MCP 문서를 참조하세요.

NPX

{
  "servers": {
    "memory": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-memory"
      ]
    }
  }
}

Windows에서는 다음을 사용하세요:

{
  "servers": {
    "memory": {
      "command": "cmd",
      "args": [
        "/c",
        "npx",
        "-y",
        "@modelcontextprotocol/server-memory"
      ]
    }
  }
}

Docker

{
  "servers": {
    "memory": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "-v",
        "claude-memory:/app/dist",
        "--rm",
        "mcp/memory"
      ]
    }
  }
}

시스템 프롬프트

메모리 활용을 위한 프롬프트는 사용 사례에 따라 다릅니다. 프롬프트를 변경하면 모델이 생성되는 메모리의 빈도와 유형을 결정하는 데 도움이 됩니다.

다음은 채팅 개인화를 위한 프롬프트 예시입니다. 이 프롬프트를 Claude.ai 프로젝트의 "사용자 지정 지침(Custom Instructions)" 필드에 사용할 수 있습니다.

Follow these steps for each interaction:

1. User Identification:
   - You should assume that you are interacting with default_user
   - If you have not identified default_user, proactively try to do so.

2. Memory Retrieval:
   - Always begin your chat by saying only "Remembering..." and retrieve all relevant information from your knowledge graph
   - Always refer to your knowledge graph as your "memory"

3. Memory
   - While conversing with the user, be attentive to any new information that falls into these categories:
     a) Basic Identity (age, gender, location, job title, education level, etc.)
     b) Behaviors (interests, habits, etc.)
     c) Preferences (communication style, preferred language, etc.)
     d) Goals (goals, targets, aspirations, etc.)
     e) Relationships (personal and professional relationships up to 3 degrees of separation)

4. Memory Update:
   - If any new information was gathered during the interaction, update your memory as follows:
     a) Create entities for recurring organizations, people, and significant events
     b) Connect them to the current entities using relations
     c) Store facts about them as observations

빌드

Docker:

docker build -t mcp/memory -f src/memory/Dockerfile . 

참고: 이전 mcp/memory 볼륨에는 새 컨테이너에 의해 덮어쓰여질 수 있는 index.js 파일이 포함되어 있습니다. 저장소에 도커 볼륨을 사용하는 경우, 새 컨테이너를 시작하기 전에 이전 도커 볼륨의 index.js 파일을 삭제하세요.

라이선스

이 MCP 서버는 MIT 라이선스에 따라 라이선스가 부여됩니다. 즉, MIT 라이선스의 약관에 따라 소프트웨어를 자유롭게 사용, 수정 및 배포할 수 있습니다. 자세한 내용은 프로젝트 저장소의 LICENSE 파일을 참조하세요.

Available Tools

9 tools
add_observationsAdd ObservationsB

Add new observations to existing entities in the knowledge graph

ParametersJSON Schema
NameRequiredDescriptionDefault
observationsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false), so the description need not restate that this is a non-destructive write. It adds one piece of context beyond the annotations - additions target existing entities - but stays silent on whether duplicates are appended or deduplicated, which matters given idempotentHint=false, and on failure behavior for unknown entity names.

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

Conciseness4/5

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

A single front-loaded sentence with no filler. It is appropriately sized for the operation, though the brevity doubles as under-specification rather than pure economy.

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

Completeness3/5

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

An output schema exists, so return values need not be explained. However, for a non-idempotent mutation with an undocumented nested parameter shape, the description should say more about duplicate handling, entity-not-found behavior, and batch semantics to be complete.

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

Parameters2/5

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

Schema description coverage is 0% at the top level; the sole 'observations' parameter is an array of objects with no description, and the description does not explain its structure or the entityName/contents pairing. The schema at least documents the nested fields, but the description does nothing to compensate for the coverage gap.

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

Purpose4/5

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

Clear verb+resource: adds observation contents to entities in the knowledge graph. It also constrains scope to 'existing entities.' It does not explicitly contrast itself with siblings like create_entities or delete_observations, but the resource overlap is small enough to be inferable.

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

Usage Guidelines3/5

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

The phrase 'existing entities' implies a precondition (the entity must already exist) but never states it as a rule, nor what to do otherwise. No alternative is named, so an agent must infer that create_entities is for new entities and delete_observations for removal.

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

create_entitiesCreate EntitiesA

Create multiple new entities in the knowledge graph. An entity whose name already exists, or repeats an earlier entity in the same call, is skipped and its observations are not added; the result lists the skipped names in skipped. Use add_observations to add observations to an existing entity.

ParametersJSON Schema
NameRequiredDescriptionDefault
entitiesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
skippedNo
entitiesYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (not read-only, not destructive, not idempotent, closed world). The description goes further by disclosing the duplicate-skip semantics and that skipped names are reported in the `skipped` result field, which is real behavioral context not present in the annotations. It does not explain permission requirements or the effect on relations, leaving some room.

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 tightly packed sentences: purpose first, then the duplicate-handling rule, then the alternative tool. No filler, and the most decision-relevant information is front-loaded.

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?

An output schema exists, so return-value detail is not required, yet the description helpfully names the `skipped` field. Combined with annotations covering the write profile, an agent has enough to call it correctly; only the entity payload shape is left entirely to the schema.

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 description coverage is reported at 0%, so the description must carry more weight than it does. It adds the crucial uniqueness constraint on entity names and clarifies that observations attach to the entity, but it never explains the entity object's fields (name/entityType/observations) or their expected format. Baseline 3 for a single top-level parameter with partial compensation.

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?

States a specific verb and resource ('Create multiple new entities in the knowledge graph') and explicitly contrasts itself with the sibling add_observations. An agent can distinguish it from create_relations or add_observations without opening any schema.

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?

The final sentence routes the agent to add_observations for adding observations to an existing entity, which is genuine when-to-use guidance. It stops short of stating an explicit exclusion (e.g. 'do not use this to modify existing entities'), but the context is clear.

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

create_relationsCreate RelationsB

Create multiple new relations between entities in the knowledge graph. Relations should be in active voice

ParametersJSON Schema
NameRequiredDescriptionDefault
relationsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
relationsYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare the safety profile (non-read-only, non-destructive, non-idempotent, closed-world), so the description only needs to add context. It adds the bulk-creation and active-voice convention, but says nothing about what happens on partial failure, duplicates, or missing entities — relevant given idempotentHint=false.

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

Conciseness4/5

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

Two short sentences, scope front-loaded, no filler. Minor looseness in the trailing convention sentence, but nothing wasted.

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

Completeness3/5

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

An output schema exists, so return values need not be explained. However, dependencies (entities must pre-exist), duplicate handling, and batch failure behavior are unaddressed for a non-idempotent write tool, leaving the agent to guess.

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 of the top-level parameter is 0% (the nested from/to/relationType fields do carry descriptions). The active-voice note adds useful meaning for relationType formatting, but the description never explains the array-of-objects shape or batch semantics beyond what the schema shows.

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

Purpose4/5

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

States a specific verb (create) and resource (relations between entities in the knowledge graph), plus the bulk nature ('multiple'). It is distinguishable from create_entities/add_observations by resource, though it never explicitly contrasts itself with those siblings.

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

Usage Guidelines2/5

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

No when-to-use guidance, no alternative named, and no prerequisites such as whether the referenced entities must already exist. 'Relations should be in active voice' is a content convention, not invocation guidance.

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

delete_entitiesDelete EntitiesB
DestructiveIdempotent

Delete multiple entities and their associated relations from the knowledge graph

ParametersJSON Schema
NameRequiredDescriptionDefault
entityNamesYesAn array of entity names to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
successYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds the non-obvious destruction scope — that associated relations are removed too — which is exactly the kind of context annotations cannot convey. It still omits permission requirements and behavior for non-existent entity names.

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

Conciseness4/5

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

A single sentence with zero filler, and the resource plus cascade behavior are front-loaded. It is efficient, though arguably truncated given the destructive bulk nature of the operation.

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

Completeness3/5

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

The output schema exists, so return values need no explanation, and the cascade is disclosed. Missing are the failure semantics an agent needs for a destructive bulk delete — what happens when some entity names don't exist, and whether the operation is irreversible/requires confirmation.

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?

One parameter at 100% schema description coverage ('An array of entity names to delete'), so the schema already does the work. The description adds no batching limits, name-matching semantics, or partial-failure behavior, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (delete) and resource (entities) plus a scope qualifier (multiple) and the cascade ('their associated relations'). It implicitly separates it from delete_relations and delete_observations, but never names those siblings, so the distinction requires inference.

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

Usage Guidelines2/5

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

No when-to-use guidance, no when-not-to-use, no mention of alternatives such as delete_relations for removing only the relationships. The agent must infer selection from the sibling names alone.

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

delete_observationsDelete ObservationsC
DestructiveIdempotent

Delete specific observations from entities in the knowledge graph

ParametersJSON Schema
NameRequiredDescriptionDefault
deletionsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
successYes

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds nothing behavioral beyond this: it does not say whether deleting all observations removes the entity, how unmatched observations or entity names are handled, or what permissions are required for a destructive mutation.

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

Conciseness4/5

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

A single tight sentence with the verb and scope front-loaded and no filler. It is efficient, though its brevity is also what leaves the guidance gaps noted elsewhere.

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

Completeness2/5

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

For a destructive, multi-target mutation with 0% schema coverage and nested batch input, the description is too thin: it omits error/idempotency behavior (does re-deleting a missing observation fail?), permission requirements, and how batch entries are processed. The existing output schema covers return values, but the invocation semantics remain under-documented.

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

Parameters2/5

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

Schema description coverage is 0% at the top level; the only parameter, 'deletions', is an array-of-objects whose grouping semantics (multiple entity/observation pairs in one call) are never explained in the description. The phrase 'specific observations from entities' only loosely hints at the entityName+observations shape already present in the schema, so it does not compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb (Delete) and a specific resource (observations) scoped to entities in the knowledge graph, which cleanly separates it from delete_entities and delete_relations. It stops short of explicitly naming those siblings or contrasting scope, but an agent can infer the distinction from the resource noun.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this over delete_entities, delete_relations, or add_observations. Prerequisites (entity must already exist, observations must be attached) and the alternative of overwriting via add_observations are never mentioned.

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

delete_relationsDelete RelationsB
DestructiveIdempotent

Delete multiple relations from the knowledge graph

ParametersJSON Schema
NameRequiredDescriptionDefault
relationsYesAn array of relations to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
successYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds the useful fact that this operates in batch ('multiple') and targets the knowledge graph, but says nothing about irreversibility consequences, permission requirements, or whether missing relations cause errors. With annotations carrying the safety burden, this is adequate but thin.

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

Conciseness4/5

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

A single efficient sentence with the verb and scope front-loaded and no filler. It is appropriately sized for a one-parameter tool, though it is so terse that it verges on under-specification rather than optimized conciseness.

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

Completeness3/5

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

An output schema exists so return values need not be explained, and annotations cover safety. However, for a destructive, non-readonly mutation, the description omits any caveat about unrecoverable deletion or partial-failure behavior across a batch, leaving a real gap for an agent deciding whether to call it.

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 description coverage is 100% and the single nested parameter's fields (from, to, relationType) are all documented in the schema. The description only echoes the batch nature of the array and adds no format or matching semantics, so baseline 3 applies since the schema does the heavy lifting.

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

Purpose4/5

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

The description states a specific verb (delete) plus resource (relations) and notes batch semantics ('multiple'), which distinguishes it from siblings like delete_entities and delete_observations. It does not explicitly name those alternatives, but the resource noun is unambiguous enough for an agent to route correctly.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool instead of delete_entities/delete_observations, no mention of prerequisites, and no note about what happens when a specified relation does not exist. The agent must infer usage purely from the name and resource.

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

open_nodesOpen NodesA
Read-onlyIdempotent

Open specific nodes in the knowledge graph by their names

ParametersJSON Schema
NameRequiredDescriptionDefault
namesYesAn array of entity names to retrieve

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
relationsYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, fully covering the safety profile. The description adds nothing beyond that profile — no statement about missing names, partial matches, or return behavior — so it earns only baseline credit.

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

Conciseness4/5

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

A single front-loaded sentence with no filler, correctly sized for a one-parameter tool. It is slightly under-specified rather than padded, which is the only reason it does not score a 5.

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?

With an output schema present and annotations covering safety and idempotency, the description does not need to explain return values. It is nearly complete for a simple exact-name retrieval, missing only the sibling differentiation needed to fully disambiguate from search_nodes and read_graph.

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 description coverage is 100% and the single 'names' parameter is documented in the schema as an array of entity names. The description's 'by their names' merely restates the parameter without adding format, matching, or ambiguity guidance, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (open/retrieve) and resource (nodes) plus the lookup key (names), so the operation is identifiable. However, it never differentiates itself from sibling read tools like search_nodes or read_graph, leaving the agent to infer the distinction from the word 'names' alone.

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

Usage Guidelines3/5

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

'by their names' implicitly signals exact-name lookup as opposed to the fuzzy matching implied by search_nodes, which is a usable usage hint. There is no explicit when-to-use/when-not guidance and no sibling is named as an alternative.

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

read_graphRead GraphA
Read-onlyIdempotent

Read the entire knowledge graph

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
relationsYes

TDQS

A3.5/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed-world scope, so the safety profile is fully covered. The description adds only the 'entire graph' scope and says nothing about cost, size, or pagination, which is a notable omission for a tool that returns the whole graph.

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?

A single front-loaded sentence with no filler; the operation and its scope are stated immediately.

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?

An output schema exists, so the description need not explain return values, and the safety semantics come from annotations. The only real gap is the absence of any hint about the volume/cost of reading an entire graph.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies.

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

Purpose4/5

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

States a specific verb ('Read') and resource ('the entire knowledge graph'), with 'entire' communicating full-graph scope. This implicitly separates it from the partial-retrieval siblings search_nodes and open_nodes, though none is named explicitly, which keeps it just short of a 5.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no mention of alternatives, even though search_nodes and open_nodes exist as obvious partial-access siblings. The agent must infer that this is the bulk/whole-graph option purely from the word 'entire'.

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

search_nodesSearch NodesB
Read-onlyIdempotent

Search for nodes in the knowledge graph based on a query

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe search query to match against entity names, types, and observation content

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
relationsYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered and the description only needs to add non-redundant context. It confirms the operation is query-based over the knowledge graph but says nothing about matching semantics (substring vs fuzzy), ranking, or result limits, so it is adequate rather than informative.

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

Conciseness4/5

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

One compact sentence with no filler, and the resource and input are front-loaded. It is efficient but leaves obvious room to add the differentiating clause about when to prefer it over read_graph.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the annotations cover the safety profile. What is missing is the positioning among the nine sibling graph tools, which matters for a search entry point in a graph API.

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 description coverage is 100% and the single 'query' parameter is fully documented in the schema as matching entity names, types, and observation content. The description adds no syntax, format, or matching details beyond that, so the baseline of 3 applies.

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

Purpose4/5

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

The description names a specific verb (Search) and resource (nodes in the knowledge graph) with a clear input basis (a query). It does not, however, distinguish this from siblings like read_graph or open_nodes, which also retrieve node data, so the agent cannot tell them apart from the description alone.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no mention of alternatives such as read_graph (whole graph) or open_nodes (direct lookup by name). The agent must infer from the tool name alone that this is the query-matching retrieval path.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updates
    • Changedadd_observations2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "addedObservations": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "entityName": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "entityName",
        +          "addedObservations"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_entities2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "entities": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entityType": {
        +            "description": "The type of the entity",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "The name of the entity",
        +            "type": "string"
        +          },
        +          "observations": {
        +            "description": "An array of observation contents associated with the entity",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "entityType",
        +          "observations"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "skipped": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "entities"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_relations2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "relations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "from": {
        +            "description": "The name of the entity where the relation starts",
        +            "type": "string"
        +          },
        +          "relationType": {
        +            "description": "The type of the relation",
        +            "type": "string"
        +          },
        +          "to": {
        +            "description": "The name of the entity where the relation ends",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "from",
        +          "to",
        +          "relationType"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "relations"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_entities2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_observations2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_relations2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedopen_nodes2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "entities": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entityType": {
        +            "description": "The type of the entity",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "The name of the entity",
        +            "type": "string"
        +          },
        +          "observations": {
        +            "description": "An array of observation contents associated with the entity",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "entityType",
        +          "observations"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "relations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "from": {
        +            "description": "The name of the entity where the relation starts",
        +            "type": "string"
        +          },
        +          "relationType": {
        +            "description": "The type of the relation",
        +            "type": "string"
        +          },
        +          "to": {
        +            "description": "The name of the entity where the relation ends",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "from",
        +          "to",
        +          "relationType"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "entities",
        +    "relations"
        +  ],
        +  "type": "object"
        +}
    • Changedread_graph2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "entities": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entityType": {
        +            "description": "The type of the entity",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "The name of the entity",
        +            "type": "string"
        +          },
        +          "observations": {
        +            "description": "An array of observation contents associated with the entity",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "entityType",
        +          "observations"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "relations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "from": {
        +            "description": "The name of the entity where the relation starts",
        +            "type": "string"
        +          },
        +          "relationType": {
        +            "description": "The type of the relation",
        +            "type": "string"
        +          },
        +          "to": {
        +            "description": "The name of the entity where the relation ends",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "from",
        +          "to",
        +          "relationType"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "entities",
        +    "relations"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_nodes3 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / query / maxLength
        Added value: +2048
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "entities": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entityType": {
        +            "description": "The type of the entity",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "The name of the entity",
        +            "type": "string"
        +          },
        +          "observations": {
        +            "description": "An array of observation contents associated with the entity",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "entityType",
        +          "observations"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "relations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "from": {
        +            "description": "The name of the entity where the relation starts",
        +            "type": "string"
        +          },
        +          "relationType": {
        +            "description": "The type of the relation",
        +            "type": "string"
        +          },
        +          "to": {
        +            "description": "The name of the entity where the relation ends",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "from",
        +          "to",
        +          "relationType"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "entities",
        +    "relations"
        +  ],
        +  "type": "object"
        +}
  2. 9 tool updatesv1.0.0
    • First observedadd_observations
    • First observedcreate_entities
    • First observedcreate_relations
    • First observeddelete_entities
    • First observeddelete_observations
    • First observeddelete_relations
    • First observedopen_nodes
    • First observedread_graph
    • First observedsearch_nodes

TDQS

A3.6/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct resource and action: entities, relations, or observations with create/delete/add operations, plus read, search, and open for retrieval. The descriptions clarify boundary cases, such as create_entities skipping existing entities and add_observations handling existing entities.

Naming Consistency5/5

All names use consistent snake_case with a clear verb_noun pattern: delete_entities, create_relations, add_observations, read_graph, search_nodes, open_nodes. The few variations (add vs create) are semantically appropriate and do not break consistency.

Tool Count5/5

Nine tools is well-scoped for a knowledge graph memory server, covering the essential create, delete, and retrieval operations without redundancy. Every tool appears to earn its place.

Completeness4/5

The surface covers entity, relation, and observation creation/deletion plus graph read, node search, and node opening. Minor gaps exist, such as no direct update or rename operation, but these can be worked around by deleting and recreating entities or relations.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers