Skip to main content
Glama
auspham

Copilot Memory MCP

by auspham

Copilot Memory MCP

Give GitHub Copilot CLI (or any MCP-compatible agent) persistent memory across sessions.

Without this, Copilot CLI starts every session as a blank slate. With this MCP server running, it can save and recall knowledge — learning from experience just like you do.

What It Does

  • Saves memories — fixes, preferences, lessons, code snippets, project context

  • Recalls memories — full-text search across everything it's ever learned

  • Categorizes knowledge — preference, lesson, fix, context, convention, environment, snippet

  • Tracks usage — knows which memories are accessed most often

  • Persists in SQLite — lightweight, no external services, survives restarts

Related MCP server: sill-ensoul

Tools Provided

Memory Tools

Tool

Description

save_memory

Store a new piece of knowledge with category and tags

recall_memories

Search or browse past memories (full-text search)

update_memory

Update an existing memory when things change

forget_memory

Delete a memory that's no longer relevant

memory_stats

See what's in the knowledge base

Monitoring Tools

These solve the "Copilot stops and asks should I continue?" problem. Each tool runs a long-running polling loop internally, so Copilot uses one tool call instead of burning through its iteration limit.

Tool

Description

monitor_command

Run a command repeatedly, collect output, stop on pattern/change/exit code

watch_file

Watch a file for changes or a regex pattern match

poll_url

Poll a URL until expected HTTP status or body pattern

run_long_command

Run a single long command, stream output, stop on pattern

Quick Start

1. Clone and install

git clone <this-repo> ~/projects/copilot-memory-mcp
cd ~/projects/copilot-memory-mcp
uv sync

Or if you don't have uv:

cd ~/projects/copilot-memory-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install "mcp[cli]>=1.20"

2. Test it works

# Quick test — should print tool list
uv run mcp dev server.py

This opens the MCP Inspector in your browser where you can test the tools interactively.

3. Add to GitHub Copilot CLI

Edit (or create) your Copilot MCP config file:

Linux/macOS:

mkdir -p ~/.config/github-copilot
nano ~/.config/github-copilot/mcp.json

Windows:

%LOCALAPPDATA%\github-copilot\mcp.json

Add this content:

{
  "mcpServers": {
    "copilot-memory": {
      "command": "uv",
      "args": ["run", "--directory", "/FULL/PATH/TO/copilot-memory-mcp", "server.py"],
      "env": {}
    }
  }
}

Important: Replace /FULL/PATH/TO/copilot-memory-mcp with the actual absolute path.

If you don't have uv, use the venv Python directly:

{
  "mcpServers": {
    "copilot-memory": {
      "command": "/FULL/PATH/TO/copilot-memory-mcp/.venv/bin/python",
      "args": ["/FULL/PATH/TO/copilot-memory-mcp/server.py"],
      "env": {}
    }
  }
}

Copy the included template to your global Copilot instructions so it knows to USE the memory:

mkdir -p ~/.github
cp copilot-instructions-template.md ~/.github/copilot-instructions.md

Or for a specific repo:

cp copilot-instructions-template.md YOUR_REPO/.github/copilot-instructions.md

5. Use it

Start Copilot CLI normally. It will now have access to memory tools. The instructions file tells it to check memory at session start and save important learnings.

$ copilot

> Hey, can you check what you remember about this project?

# Copilot calls recall_memories() automatically
# and loads any past context

How the Learning Loop Works

Session 1:
  You: "Always use pytest, never unittest"
  Copilot saves: {category: "preference", content: "User prefers pytest over unittest"}

Session 2:
  Copilot starts → calls recall_memories() → loads preference
  Copilot: "I'll set up the tests with pytest as you prefer."
  You debug a tricky async issue together
  Copilot saves: {category: "fix", content: "asyncio.gather swallows exceptions — use return_exceptions=True"}

Session 3:
  Copilot starts → recalls all memories → knows your preferences AND past fixes
  You hit a similar async bug
  Copilot: "This looks like the asyncio.gather issue we fixed before — need return_exceptions=True"

Each session makes the next one smarter.

Monitoring — No More "Should I Continue?"

The monitoring tools solve Copilot CLI's biggest limitation: it stops and asks for confirmation during long-running tasks. These tools do the looping internally.

Example: Watch a Kubernetes deployment

You: "Deploy the new version and monitor until all pods are running"

Copilot runs:
  monitor_command(
    command="kubectl get pods -l app=myapp",
    interval_seconds=10,
    timeout_seconds=300,
    stop_pattern="1/1.*Running"
  )

→ Tool polls every 10s for up to 5 minutes
→ Returns all snapshots when pods are Running
→ ONE tool call, no iteration limit hit

Example: Watch a build log

You: "Start the build and tell me when it's done"

Copilot runs:
  run_long_command(
    command="npm run build 2>&1",
    timeout_seconds=300,
    stop_pattern="Build complete|ERROR"
  )

→ Captures the entire build output
→ Returns immediately when it sees success or failure

Example: Wait for a service to come up

You: "Deploy and let me know when the health check passes"

Copilot runs:
  poll_url(
    url="http://localhost:8080/health",
    expected_status=200,
    expected_body_pattern="healthy",
    interval_seconds=5,
    timeout_seconds=120
  )

→ Polls every 5s until 200 + "healthy" in body
→ Reports back with timing and response details

Max monitoring duration

Default max is 1 hour (3600 seconds). Override with env var:

{
  "mcpServers": {
    "copilot-memory": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/copilot-memory-mcp", "server.py"],
      "env": {
        "COPILOT_MEMORY_MAX_MONITOR": "7200"
      }
    }
  }
}

Configuration

Custom database location

By default, memories are stored in ~/.copilot-memory/memory.db. Override with:

{
  "mcpServers": {
    "copilot-memory": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/copilot-memory-mcp", "server.py"],
      "env": {
        "COPILOT_MEMORY_DB": "/custom/path/to/memory.db"
      }
    }
  }
}

SSE transport (for HTTP-based clients)

uv run server.py --transport sse

This starts an HTTP server (default port 8000) for clients that prefer SSE over stdio.

Works With Other Agents Too

This isn't Copilot-specific. Any MCP client can use it:

  • Claude Code — add to .mcp.json in your project

  • Cline (VS Code) — add to MCP server settings

  • Hermes Agent — add to config.yaml under mcp.servers

  • Cursor — add to MCP configuration

  • Any MCP-compatible tool

Claude Code example (.mcp.json in project root):

{
  "mcpServers": {
    "memory": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/copilot-memory-mcp", "server.py"]
    }
  }
}

File Structure

copilot-memory-mcp/
├── server.py                        # The MCP server (all-in-one)
├── copilot-instructions-template.md # Template to tell Copilot to use memory
├── pyproject.toml                   # Python project config
├── uv.lock                          # Dependency lock file
└── README.md                        # You're reading it

License

MIT — do whatever you want with it.

Available Tools

9 tools
forget_memoryB

Delete a memory that's no longer relevant.

Args:
    memory_id: The ID of the memory to delete.
ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states that the tool deletes a memory, making destruction obvious, but it does not mention whether deletion is permanent, reversible, or scoped in any way. The description lacks depth about consequences beyond the basic verb.

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?

The description is extremely concise: a single leading sentence followed by a compact argument list. Every word earns its place, and the action is front-loaded.

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?

For a simple one-parameter delete, the description provides the core operation and parameter meaning. However, the lack of any behavioral caveats (e.g., irreversibility) and the absence of guidance on sourcing a memory ID make it only partially complete. The presence of an output schema lightens the need to describe return values.

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?

With 0% schema description coverage, the description must compensate. 'memory_id: The ID of the memory to delete' adds only marginal meaning over the parameter name and integer type; it does not explain where the ID comes from (e.g., recall_memories) or what happens if an invalid or nonexistent ID is provided.

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 begins with 'Delete a memory' — a specific verb and resource that clearly identifies the operation. It is distinct from sibling tools like recall_memories, save_memory, and update_memory, though it does not explicitly name them as alternatives.

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 'that's no longer relevant' provides a condition for when to use the tool. However, it does not explicitly state when not to use it or mention alternatives such as update_memory for memories that still matter but need modification.

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

memory_statsA

Get statistics about stored memories.

Call this to understand what's in your knowledge base.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. 'Get' implies a read-only, non-destructive operation, which is helpful, but the description does not disclose what kind of statistics are returned or how this behaves relative to memory retrieval. The output schema may cover return shape, but the description itself adds limited behavioral context.

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?

The description is two short sentences and front-loads the core action. The second sentence adds a usage cue, though it is somewhat generic and could be sharpened. No wasted words, but the second sentence is marginal.

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?

For a simple zero-parameter tool with an output schema, the description is mostly complete. It tells the agent why to call it and what it does. The main gap is the lack of explicit guidance on how this differs from recall_memories, which could lead to the wrong choice when the agent wants actual memory contents.

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 has zero parameters, so parameter semantics are not a challenge. The schema already covers 100% of the parameter surface, and the description correctly avoids inventing parameter details. Baseline 4 is appropriate for a no-parameter tool.

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 and resource ('Get statistics about stored memories') and implies a distinction from content retrieval tools like recall_memories. However, it stops short of explicitly differentiating itself from siblings: 'understand what's in your knowledge base' could be interpreted as retrieving actual memory contents rather than aggregate stats.

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?

It gives a clear calling context: use this when you need an understanding of the knowledge base. But it does not state when not to use it or name alternatives such as recall_memories for detailed content, leaving some routing judgment to the agent.

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

monitor_commandA

Run a shell command repeatedly and collect output over time.

USE THIS instead of running commands in a loop yourself — it handles
the polling so you don't burn through your iteration limit.

Examples:
    - Monitor a build: command="kubectl get pods", stop_pattern="Running"
    - Watch a deploy: command="curl -s http://localhost:8080/health", stop_pattern="ok"
    - Track a job: command="squeue -u $USER", stop_pattern="", stop_on_change=true
    - Wait for completion: command="cat /tmp/job.status", stop_pattern="DONE"

Args:
    command: Shell command to run each interval.
    interval_seconds: Seconds between each run (default 10, min 2).
    timeout_seconds: Max total seconds to monitor (default 300 = 5 min, max 3600).
    stop_pattern: Regex pattern — stop early when output matches this. Leave empty to run until timeout.
    stop_on_change: Stop when output changes from the first run.
    stop_on_exit_code: Stop when command returns this exit code (default -999 = disabled).
    max_snapshots: Max number of output snapshots to keep (default 50). Older ones are dropped.
ParametersJSON Schema
NameRequiredDescriptionDefault
commandYes
stop_patternNo
max_snapshotsNo
stop_on_changeNo
timeout_secondsNo
interval_secondsNo
stop_on_exit_codeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure, and it delivers: recurring execution, early stopping via regex, change detection, exit-code stopping, timeouts, intervals, and snapshot dropping. Minor gaps such as error handling for failed commands and whether stderr is captured prevent a perfect score, but the core behavior is clearly portrayed.

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?

The description opens with a one-sentence purpose, follows with an emphasized usage guideline, then gives four helpful examples, and closes with per-parameter explanations. Every section earns its place, and the structure is skimmable and 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?

Given the tool's complexity, the description covers all seven parameters, gives use cases, and explains stopping behavior thoroughly. Since an output schema exists, omitting return-format details is acceptable. The only shortfall is not mentioning shell environment, time-out behavior details, or error cases, which would make it fully complete.

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

Parameters5/5

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

The input schema has zero descriptions, but the Args block provides meaningful semantics for every parameter, including defaults, min/max bounds, and the meaning of stop_on_change, stop_on_exit_code, and max_snapshots. This fully compensates for the schema's lack of parameter documentation.

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 first sentence states a specific verb and resource: 'Run a shell command repeatedly and collect output over time.' This clearly distinguishes the tool from siblings like watch_file, poll_url, and run_long_command, which do not generically repeat arbitrary shell commands.

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 description explicitly directs agents to 'USE THIS instead of running commands in a loop yourself — it handles the polling so you don't burn through your iteration limit.' This gives a strong when-to-use signal, and the examples reinforce realistic scenarios. It does not, however, name sibling alternatives like watch_file or poll_url or state when not to use this tool.

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

poll_urlA

Poll a URL repeatedly until it returns expected status/content.

Useful for waiting on deployments, health checks, APIs.

Examples:
    - Health check: url="http://localhost:8080/health", expected_body_pattern="healthy"
    - Wait for deploy: url="https://myapp.com/version", expected_body_pattern="v2.1"
    - Wait for service: url="http://localhost:3000", expected_status=200

Args:
    url: URL to poll.
    method: HTTP method (default GET).
    headers: Headers as "Key: Value" lines, newline-separated. Optional.
    expected_status: Stop when this HTTP status is returned (default 200).
    expected_body_pattern: Regex pattern — stop when response body matches. Leave empty to only check status.
    timeout_seconds: Max seconds to poll (default 300, max 3600).
    interval_seconds: Seconds between requests (default 10, min 2).
ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
methodNoGET
headersNo
expected_statusNo
timeout_secondsNo
interval_secondsNo
expected_body_patternNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden. It discloses the polling loop, stop conditions (status or body pattern), defaults for timeout and interval, and header format. It does not state what happens when the timeout expires or on network errors, which is a notable gap, but the core retry behavior is clearly described.

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?

The description is organized with a one-sentence summary, use cases, illustrative examples, and a compact argument list. Every section adds functional value—examples make the polling semantics concrete, and the Args block mirrors the schema without padding.

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?

Given the output schema exists, return values need not be explained. All input parameters and their interactions are covered, plus examples. The main omission is failure/timeout behavior, which matters for a polling tool, but overall the definition provides enough context for correct invocation in typical deployment and health-check workflows.

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

Parameters5/5

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

Schema description coverage is 0%, so the description is solely responsible for parameter meaning. It documents all seven parameters with practical details, including the regex semantics for expected_body_pattern, the exact header format, and the min/max/default values for timing parameters. This exceeds what the bare schema provides.

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 states a precise action: 'Poll a URL repeatedly until it returns expected status/content.' This clearly identifies the resource (URL), the operation (polling), and the completion condition, distinguishing it from the unrelated memory and monitoring siblings.

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 description names concrete use cases ('waiting on deployments, health checks, APIs') which tells an agent when to apply the tool. It does not explicitly discuss when not to use it or mention alternatives like monitor_command or watch_file, but the scenarios are clear enough for selection.

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

recall_memoriesA

Search and recall past memories.

Call this at the START of every session to load relevant context,
and whenever you need to remember something from the past.

Args:
    query: Search keywords (uses full-text search). Leave empty to get recent memories.
    category: Filter by category (preference, lesson, fix, context, convention, environment, snippet, general). Leave empty for all.
    limit: Max memories to return (default 20).
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
categoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses that query uses full-text search, that an empty query returns recent memories, and that category is an optional filter with an enumerated list. This is sufficient for a read-only recall tool, though it doesn't describe ordering or empty-result behavior explicitly.

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?

The description is tightly structured: one-sentence purpose, direct usage instruction, then a clean Args list. Every sentence provides necessary information, and the most important usage directive is front-loaded.

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

Completeness5/5

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

For a memory-retrieval tool with an existing output schema, this is complete. It tells the agent when to invoke, how to form the query, what filters are available, and the limit behavior. No critical operational aspect is missing.

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

Parameters5/5

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

Schema coverage is 0%, so the description fully compensates. It explains each parameter: query search semantics and empty-query behavior, category filter with all allowed values, and limit with its default of 20. This far exceeds the bare schema definitions.

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 opens with 'Search and recall past memories,' which names a specific verb and resource. It clearly differentiates from sibling write tools like save_memory and forget_memory, so an agent can identify this as the retrieval tool without ambiguity.

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?

It gives explicit call-time guidance: 'Call this at the START of every session' and 'whenever you need to remember something from the past.' It doesn't name alternatives explicitly, but the read-versus-write distinction across siblings is implicit, so the context is clear even without formal exclusions.

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

run_long_commandA

Run a long-running shell command and capture its full output.

Unlike monitor_command (which re-runs a command repeatedly), this runs
ONE command and streams its output until it finishes or times out.

Use for: builds, installs, database migrations, test suites, any single
command that takes a while.

Examples:
    - Build: command="npm run build", timeout_seconds=300
    - Tests: command="pytest -v", stop_pattern="FAILED|passed"
    - Install: command="apt install -y nginx", timeout_seconds=120

Args:
    command: Shell command to run.
    timeout_seconds: Max seconds to wait (default 600 = 10 min, max 3600).
    tail_lines: Number of output lines to return from the end (default 100).
    stream_check_interval: Seconds between progress checks (default 5).
    stop_pattern: Regex — kill the process early if output matches this.
ParametersJSON Schema
NameRequiredDescriptionDefault
commandYes
tail_linesNo
stop_patternNo
timeout_secondsNo
stream_check_intervalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral disclosure burden. It covers one-shot execution, streaming until completion or timeout, progress-check intervals, early termination via stop_pattern, and tail output. However, 'capture its full output' vs. 'tail_lines' returning only the end of output creates a minor ambiguity about what exactly is returned.

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?

The description is well-structured: a one-line summary, a comparison with the sibling, a use-case list, concrete examples, and a clear Args section. Every sentence is informative; the examples use realistic values, and the section headers make scanning easy.

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

Completeness5/5

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

Given 5 parameters, no annotations, and an output schema handling the return shape, this description covers everything an agent needs to invoke the tool correctly: what it does, when to use it, how it differs from the closest sibling, parameter details with defaults, and example usage. There are no significant gaps.

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

Parameters5/5

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

Schema description coverage is 0%, so the description alone must explain all 5 parameters. It does so thoroughly: each arg gets a meaning, default value, and in some cases a max or format (e.g., timeout_seconds default 600/max 3600, stop_pattern as regex that kills the process). Example command pairings make the semantics even clearer.

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 opens with a precise verb+resource statement: 'Run a long-running shell command and capture its full output.' It explicitly distinguishes itself from monitor_command, so an agent can immediately recognize this tool's unique role among siblings.

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

Usage Guidelines5/5

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

It names the specific alternative (monitor_command) and explains the key difference: this runs ONE command, whereas that re-runs repeatedly. It also lists concrete use cases (builds, installs, migrations, test suites), providing clear when-to-use guidance.

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

save_memoryA

Save a piece of knowledge to persistent memory.

Call this when you learn something worth remembering:
- User preferences or corrections
- Bug fixes and their root causes
- Project conventions or patterns
- Environment details (OS, tools, versions)
- Code snippets that solved tricky problems
- Decisions and their reasoning

Args:
    content: What to remember. Be specific and concise.
    category: One of: preference, lesson, fix, context, convention, environment, snippet, general
    tags: Comma-separated tags for easier recall (e.g. "python,debugging,asyncio")
ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
contentYes
categoryNogeneral

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It does disclose that the write is persistent and that the tool stores knowledge, but it does not describe duplicate handling, overwrite behavior, or effects on existing memories. This is a noticeable gap for a mutation tool.

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?

The description is well organized: purpose, trigger examples, then argument details. It is front-loaded and every section earns its place without filler or redundancy.

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 what the tool does, when to use it, and all parameters, while return behavior is left to the output schema. It is slightly incomplete because it does not address existing memory entries or differentiate sibling update/forget scenarios, but for a simple save-style tool this is acceptable.

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

Parameters5/5

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

Even though the schema has no parameter descriptions, the Args section documents all three parameters: content guidance, valid category values, and tag format with an example. This fully compensates for the 0% schema description coverage.

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 opens with a specific verb and resource: 'Save a piece of knowledge to persistent memory.' This clearly communicates what the tool does and distinguishes it from sibling memory tools like recall_memories and forget_memory.

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 description gives an explicit trigger: 'Call this when you learn something worth remembering,' followed by concrete categories. It does not mention when to avoid using it or when to use update_memory or forget_memory instead, so it stops short of full decision-rule coverage.

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

update_memoryA

Update an existing memory.

Use when a previous memory is outdated or needs correction.

Args:
    memory_id: The ID of the memory to update.
    content: New content (leave empty to keep existing).
    category: New category (leave empty to keep existing).
    tags: New tags (leave empty to keep existing).
ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
contentNo
categoryNo
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries full responsibility for behavior disclosure. It explains the merge-like behavior of leaving fields empty to keep existing values, but it does not disclose what happens on invalid memory_id, whether changes are reversible, or any side effects.

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?

The description is compact and well-structured: a one-sentence purpose, a one-sentence usage rule, then a clear parameter list. Every line earns its place, and the most important 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?

For a simple four-parameter tool with an output schema, the description covers purpose, usage, and parameter semantics adequately. The main gaps are behavioral details, such as missing-memory handling and how to clear a field, but these are not critical for basic correct invocation.

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?

With 0% schema description coverage, the description compensates well by explaining each parameter beyond the schema's type/title/default fields. 'Leave empty to keep existing' adds real semantic value, though it leaves unspecified how one would intentionally clear a field.

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 action, 'Update an existing memory,' identifying both the verb and resource. The use case in the next sentence helps distinguish this from save_memory and recall_memories, though it does not explicitly name the alternative tools.

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 description gives clear guidance on when to use the tool: when a previous memory is outdated or needs correction. It does not mention exclusions or explicitly compare with save_memory, but the provided context is sufficient for most decisions.

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

watch_fileA

Watch a file for changes or a specific pattern.

Useful for monitoring log files, build outputs, job status files.

Examples:
    - Watch a log: path="/var/log/app.log", pattern="ERROR|FATAL"
    - Wait for file: path="/tmp/job_done.flag", pattern=""
    - Tail a build log: path="build.log", pattern="BUILD SUCCESS|BUILD FAILURE"

Args:
    path: File path to watch.
    pattern: Regex pattern to stop on when found in the file. Leave empty to stop on any change.
    timeout_seconds: Max seconds to watch (default 300, max 3600).
    interval_seconds: Seconds between checks (default 5, min 2).
    tail_lines: Number of lines from end of file to return (default 50).
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
patternNo
tail_linesNo
timeout_secondsNo
interval_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations present, the description carries the full behavioral disclosure burden. It does a solid job by explaining stop conditions (pattern found, or any change when pattern is empty), timeout default and max, polling interval, and tail_lines returned. It does not explicitly describe a timeout error scenario or how it handles a non-existent file, which are mild gaps.

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?

The description is wll-organized: a one-sentence purpose, a brief use-case list, three illustrative examples, and a compact Args block. Every sentence contributes useful information, and the layout makes defaults and constraints easy to scan.

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, use cases, and each parameter with defaults/limits, while the output schema covers return values. It does not explicitly state timeout/error behavior or relationship to sibling monitoring tools, but for a file-watch tool with strong parameter documentation it is largely complete.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate, and it does fully. The Args section explains each parameter: path, regex pattern semantics and empty-pattern behavior, timeout defaults/max, interval defaults/min, and the purpose of tail_lines. This adds materially beyond the schema's types and defaults.

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 opens with 'Watch a file for changes or a specific pattern', naming a specific verb and resource, and the examples clarify the intended file-focused scope. It does not explicitly contrast with sibling tools like monitor_command or poll_url, so differentiation is implicit rather than named.

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 description states 'Useful for monitoring log files, build outputs, job status files' and gives three concrete usage examples, which gives the agent clear context for when to call it. However, it does not state when not to use it or name alternatives such as poll_url for URLs, so it lacks explicit exclusion guidance.

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. Dates show when Glama detected each change.

  1. 9 tool updatesv0.1.0
    • First observedforget_memory
    • First observedmemory_stats
    • First observedmonitor_command
    • First observedpoll_url
    • First observedrecall_memories
    • First observedrun_long_command
    • First observedsave_memory
    • First observedupdate_memory
    • First observedwatch_file

TDQS

A3.9/5.0
Disambiguation4/5

The memory tools (recall, save, update, forget, stats) are clearly distinct, and the monitoring tools (monitor_command, run_long_command, watch_file, poll_url) each target a different mechanism. The only potential confusion is between monitor_command and run_long_command, but their descriptions explicitly differentiate repeated polling from single long-running execution.

Naming Consistency4/5

Most tools follow a verb_noun convention (save_memory, update_memory, monitor_command, watch_file, poll_url, run_long_command). Minor deviations include recall_memories (plural noun) and memory_stats (noun_noun), which break the strict pattern but remain predictable and readable.

Tool Count4/5

At 9 tools, the count is reasonable and not overwhelming. However, the set mixes two unrelated domains (memory persistence and process/URL monitoring), making the scope feel broader than the server name suggests. Still, no tool is redundant and the number is appropriate for its combined purpose.

Completeness4/5

The memory lifecycle is complete with recall, save, update, delete, and stats. The monitoring tools cover common asynchronous scenarios: repeated command polling, single long-running command, file watching, and HTTP polling. Minor gaps exist (e.g., no direct tag-based listing, no explicit 'wait' tool), but agents can work around these.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides persistent, cooperative memory for LLMs via MCP, with SQLite storage and tools for capturing, recalling, consolidating, crystallizing, and forgetting memories across sessions.
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides persistent, searchable memory for AI agents across any MCP-compatible client, storing project context, user preferences, and session learnings locally in SQLite with tools to save, retrieve, search, and manage them.
    12
    133
    MIT

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/auspham/copilot-memory-mcp'

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