Skip to main content
Glama
bmit20

timeline-mcp

by bmit20

timeline-mcp

MCP Server for Timeline-Aware Conversational Memory

A lightweight, deterministic MCP (Model Context Protocol) server that gives AI assistants a temporal memory layer — extracting events from conversation, normalizing relative time expressions, and maintaining structured timeline state so LLMs can answer consistently across multi-session conversations.


Project Overview

Conversational AI systems today have no native sense of time. They treat every message as a fresh interaction, with no awareness of how many days have passed since a user last reported an event. timeline-mcp solves this by sitting between the LLM and the conversation history as a dedicated temporal reasoning tool.

The server exposes five MCP tools that any MCP-compatible client (Claude, Continue, Cursor, etc.) can call:

#

Tool

Purpose

1

extract_timeline_events

Scan messages for events and normalize dates

2

build_timeline_state

Aggregate events into a coherent timeline

3

summarize_timeline_context

Generate an LLM-ready natural-language summary

4

days_since_event

Compute elapsed days since any tracked event

5

upsert_message_into_timeline

Incrementally update the timeline with new messages

Zero external dependencies beyond python-dateutil. Pure rule-based extraction — no ML, no randomness, fully deterministic.


Related MCP server: MultiService IA

Problem Statement

LLMs lose track of time across conversations.

This isn't a model quality issue — it's an architectural one. LLMs have no internal clock, no persistent state between sessions, and no mechanism to compute "how long ago" something happened relative to now. When a conversation spans days or weeks, the assistant's temporal reasoning collapses.

Concrete Failure Mode

Day 1   User: "I had appendicitis surgery two weeks ago."        → surgery = May 8
Day 3   User: "Still have some pain, but it's improving."
Day 7   User: "Feeling much better today."
Day 14  User: "Should I remove my stitches now?"
        Assistant: "You should remove them two weeks after surgery."
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                   WRONG. Two weeks have ALREADY passed.
                   The correct answer accounts for elapsed time.

The assistant interpreted "two weeks" as a future interval from today, rather than understanding that two weeks have already elapsed since the original surgery date. This class of error is systematic — it happens whenever relative time anchors drift across session boundaries.


Why Timeline-Aware Memory Matters

This problem is acute in any domain where time-sensitive follow-up matters:

Domain

Example Failure

Healthcare

Misjudging post-surgical recovery milestones, medication tapering schedules

Legal

Miscalculating filing deadlines relative to prior events

Project Management

Losing track of sprint days elapsed vs. original estimates

Habit Tracking

Recommending actions that don't account for days already passed

Customer Support

Failing to escalate based on how long an issue has been open

timeline-mcp provides a reusable, protocol-compliant solution. Instead of every assistant developer building their own temporal logic (or ignoring the problem), they can point their MCP client at this server and get structured timeline state for free.


Installation

Prerequisites: Python 3.11+

Option 1: System package (Debian/Ubuntu)

sudo apt install python3-dateutil
git clone https://github.com/your-org/timeline-mcp.git
cd timeline-mcp

Option 2: Virtual environment

git clone https://github.com/your-org/timeline-mcp.git
cd timeline-mcp
python3 -m venv .venv
.venv/bin/pip install python-dateutil

The only runtime dependency is python-dateutil (for ISO-8601 date parsing). Everything else uses the Python standard library.


Quick Start

Run the included medical follow-up example to see the full scenario:

PYTHONPATH=src python3 examples/medical_followup.py

Run all tests:

PYTHONPATH=src python3 -m unittest discover tests -v

Expected: 33 tests pass.


Running as an MCP Server

The server communicates via JSON-RPC 2.0 over stdio — no network ports, no configuration files. The client launches timeline-mcp as a child process and communicates over its stdin/stdout pipes.

How the command works

python3 -m timeline_mcp.server
         ^
         Runs the package as a Python module. The server loop
         reads JSON-RPC requests from stdin, processes them,
         and writes JSON-RPC responses to stdout.

The PYTHONPATH environment variable tells Python where to find the timeline_mcp package. If installed as a pip package, PYTHONPATH is not needed — the client can run timeline-mcp directly via the console script entry point.

Start the server manually (for testing)

cd timeline-mcp
PYTHONPATH=src python3 -m timeline_mcp.server
# Server is now waiting for JSON-RPC on stdin. Type a JSON-RPC
# request and press Enter, or pipe one in:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | PYTHONPATH=src python3 -m timeline_mcp.server

MCP Client Configuration

All MCP clients that support stdio transport use the same pattern: a command, an args array, and optionally an env map. Pre-built config snippets are available in examples/configs/.

Common pattern (all clients)

{
  "mcpServers": {
    "timeline-mcp": {
      "command": "python3",
      "args": ["-m", "timeline_mcp.server"],
      "env": {
        "PYTHONPATH": "/absolute/path/to/timeline-mcp/src"
      }
    }
  }
}

Replace /absolute/path/to/timeline-mcp/src with the actual path on your system. Use an absolute path — relative paths may resolve differently depending on how the client launches the process.

Virtual environment users: If you installed dependencies in a venv, point command to the venv's Python binary:

"command": "/absolute/path/to/timeline-mcp/.venv/bin/python3"

Claude Desktop

File: claude_desktop_config.json (see Anthropic docs)

{
  "mcpServers": {
    "timeline-mcp": {
      "command": "python3",
      "args": ["-m", "timeline_mcp.server"],
      "env": {
        "PYTHONPATH": "/absolute/path/to/timeline-mcp/src"
      }
    }
  }
}

After editing the config, restart Claude Desktop. The five timeline-mcp tools will appear in the tool list automatically.


Claude Code (CLI)

File: .claude/settings.json in your project, or ~/.claude/settings.json for all projects.

{
  "mcpServers": {
    "timeline-mcp": {
      "type": "stdio",
      "command": "python3",
      "args": ["-m", "timeline_mcp.server"],
      "env": {
        "PYTHONPATH": "/absolute/path/to/timeline-mcp/src"
      }
    }
  }
}

Claude Code requires the explicit "type": "stdio" field. Restart Claude Code or run /mcp reload to pick up the change.


Continue.dev (VS Code / JetBrains)

File: .continue/config.json (project) or ~/.continue/config.json (global)

{
  "experimental": {
    "mcpServers": {
      "timeline-mcp": {
        "command": "python3",
        "args": ["-m", "timeline_mcp.server"],
        "env": {
          "PYTHONPATH": "/absolute/path/to/timeline-mcp/src"
        }
      }
    }
  }
}

Note: Continue wraps MCP servers under the experimental key. Restart Continue or reload the config from the extension menu.


Cursor IDE

File: .cursor/mcp.json (project) or ~/.cursor/mcp.json (global)

{
  "mcpServers": {
    "timeline-mcp": {
      "command": "python3",
      "args": ["-m", "timeline_mcp.server"],
      "env": {
        "PYTHONPATH": "/absolute/path/to/timeline-mcp/src"
      }
    }
  }
}

Cursor discovers MCP servers on launch. Use the MCP panel (Ctrl+Shift+P → "MCP: Manage Servers") to verify.


Generic / Other Clients

Any MCP-compatible client that supports stdio transport uses the same structure. The three required fields are:

Field

Purpose

command

The executable to launch (e.g., python3)

args

Arguments passed to the command (e.g., ["-m", "timeline_mcp.server"])

env

Environment variables set for the child process (minimum: PYTHONPATH)

The server implements the MCP 2024-11-05 protocol version and supports initialize, tools/list, and tools/call methods.


MCP Tools — Full Reference

1. extract_timeline_events

Parse a list of conversation messages and extract timeline-relevant events with normalized dates.

Input:

{
  "messages": [
    {
      "id": "msg_1",
      "text": "I had appendicitis surgery two weeks ago.",
      "timestamp": "2026-05-22T10:00:00Z"
    }
  ]
}

Output:

{
  "events": [
    {
      "message_id": "msg_1",
      "event_type": "surgery",
      "time_expression": "two weeks ago",
      "normalized_date": "2026-05-08",
      "confidence": 0.89
    }
  ]
}

Supported event types: surgery, stitch_removal, symptom_start, medication_start, medication_stop, followup_visit

Supported time expressions: today, yesterday, tomorrow, N days ago, N weeks ago, last week, next week, in N days, N days/weeks after <event>, word numbers (two weeks ago)


2. build_timeline_state

Aggregate extracted events into a normalized timeline with anchor dates, derived fields, and recovery phase.

Input: List of events + reference datetime Output: TimelineState with anchor_events, event_log, derived (days_since_*), active_context (phase), conflicts


3. summarize_timeline_context

Generate a concise natural-language summary for injection into an LLM system prompt.

Output example: "The user had surgery 14 days ago. They are in the Post Op Recovery phase. No stitch removal event has been recorded yet."


4. days_since_event

Compute days since a named anchor event (e.g., surgery_date, stitch_removal_date).

Input: Timeline state + event name + reference time Output: {"event_name": "surgery_date", "days_since": 14}


5. upsert_message_into_timeline

The primary runtime tool — feed in one new message and the existing timeline state; get back the updated state.

Key behavior:

  • Detects new events in the message

  • Resolves relative time expressions using existing anchor dates

  • Merges new events with existing log (conflict resolution: prefers higher confidence, logs conflicts)

  • Recomputes all derived fields against the new message timestamp


Example Usage: Medical Follow-Up

Message 1 (May 8):  "I had appendicitis surgery today."
         → surgery_date: 2026-05-08, days_since: 0, phase: immediate_post_op

Message 2 (May 15): "I still have some pain."
         → symptom_start: 2026-05-15, days_since_surgery: 7, phase: early_recovery

Message 3 (May 22): "Should I remove my stitches now?"
         → days_since_surgery: 14, stitch_removal_date: null, phase: post_op_recovery
         → Summary: "The user had surgery 14 days ago. No stitch removal recorded."

Message 4 (May 23): "I removed my stitches yesterday."
         → stitch_removal_date: 2026-05-22, days_since_surgery: 15, phase: scar_care_early

The LLM receiving this context at Message 3 can correctly reason that the user is already at day 14 post-surgery and that stitch removal is appropriate now — rather than naively computing "two weeks from today."


Project Structure

timeline-mcp/
├── README.md
├── pyproject.toml
├── requirements.txt
├── src/
│   └── timeline_mcp/
│       ├── __init__.py
│       ├── server.py          # MCP JSON-RPC 2.0 server (stdio transport)
│       ├── schemas.py         # Dataclass models with dict serialization
│       ├── temporal.py        # Time expression parser (10+ patterns)
│       ├── extractors.py      # Event extraction via regex trigger phrases
│       ├── state.py           # Timeline construction, upsert, conflict resolution
│       ├── summarizer.py      # Template-based NL summary generation
│       └── constants.py       # EventType enum, trigger phrases, recovery phases
├── tests/
│   ├── test_temporal.py       # 13 tests — time expression parsing
│   ├── test_extractors.py     #  7 tests — event detection
│   ├── test_state.py          #  8 tests — state construction & updates
│   ├── test_summarizer.py     #  4 tests — summary generation
│   └── test_integration.py    #  1 test  — full 15-day scenario
└── examples/
    ├── medical_followup.py    # End-to-end demonstration script
    └── configs/
        ├── generic-stdio.json  # Generic MCP client config
        ├── claude-desktop.json # Claude Desktop config
        ├── claude-code.json    # Claude Code (CLI) config
        ├── continue-dev.json   # Continue.dev (VS Code) config
        └── cursor.json         # Cursor IDE config

Limitations

  • Rule-based extraction only. Uses regex patterns and keyword matching — no ML. Covers common phrasings well but will miss implicit, idiomatic, or highly variable event mentions.

  • English only. All trigger phrases, time expressions, and summaries target English text. Other languages would require separate pattern modules.

  • Single conversation scope. Each timeline state is self-contained. No cross-conversation aggregation, no user identity layer (MVP scope).

  • No persistence. State lives in memory only. Server restarts lose all timeline data. Persistent storage is a planned enhancement.

  • Confidence scores are heuristic. Based on match length, not statistical calibration. Useful for relative ranking within a session, not as absolute probabilities.

  • Recovery phases are illustrative. The phase labels (post_op_recovery, scar_care_early) are example mappings for the medical domain. They are not clinical guidance.


Safety Disclaimer

timeline-mcp is NOT a medical device. It does not provide medical advice, diagnosis, prognosis, or treatment recommendations.

This tool:

  • Tracks dates and computes elapsed time intervals

  • Detects mentions of medical events in conversation text

  • Labels recovery phases using a static day-range lookup table

This tool does not:

  • Make clinical decisions or recommendations

  • Replace professional medical judgment

  • Store, transmit, or process Protected Health Information (PHI) in a HIPAA-compliant manner

  • Validate the accuracy of user-reported medical events

Any medical-domain examples in this repository are for illustration only. The core capability is temporal reasoning — it applies equally to project management, legal workflows, habit tracking, customer support, and any other domain where elapsed time matters.

If you are building a healthcare application, consult with qualified medical and legal professionals.


Roadmap

v0.2 (next)

  • Persistent timeline storage (SQLite)

  • Multi-user / multi-session timeline isolation

  • Confidence scoring based on explicit vs. implicit date resolution

  • Additional event types: lab_result, imaging, physical_therapy, diet_change

v0.3

  • Persian (Farsi) language module — separate trigger phrase and time expression tables

  • Calendar-aware date computation (skip weekends/holidays for business-day intervals)

  • Timeline visualization as structured JSON for rendering

v1.0

  • Conflict resolution strategies (user-prompted, majority-vote, source-weighted)

  • Adapter examples for Claude Desktop, Continue.dev, Cursor, and OpenAI

  • Comprehensive benchmark dataset for temporal extraction accuracy

  • Full internationalization framework for trigger phrases


Sponsorship & Support

timeline-mcp is an open-source project built to solve a real problem in conversational AI. It is maintained by independent developers who believe LLMs should be able to track time reliably.

If this project is useful to you or your organization, please consider supporting it:

Commercial support and custom integrations are available. Contact timeline-mcp@example.com for inquiries about:

  • Priority feature development

  • Custom event type and domain modeling

  • On-premises deployment support

  • HIPAA-compliant configuration guidance


License

MIT — see LICENSE for details.

Available Tools

5 tools
build_timeline_stateB

Create a normalized timeline state from extracted events. Aggregates events, resolves duplicates, computes derived fields like days_since_surgery, and determines the current recovery phase.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventsYes
reference_timeYesISO-8601 datetime for reference

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose key behaviors: aggregation, deduplication, derived field computation, and phase determination. However, it doesn't disclose what happens to conflicting events during deduplication, whether the input events are mutated, or what the output structure looks like. The description adds value but leaves important behavioral details unspecified.

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 sentences, front-loaded with the primary purpose and followed by specific operations. Every sentence earns its place. It's concise and structured well, though it could arguably be more explicit about usage context.

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 tool with 2 parameters, no output schema, and no annotations, the description covers the main operations but leaves gaps: no output format description, no mention of error conditions (e.g., empty events array), no details on how duplicates are resolved. The sibling tools suggest a pipeline context, but the description doesn't fully situate this tool within that pipeline.

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 50%: reference_time has a description, but events does not. The description mentions 'events' and 'reference_time' implicitly through 'extracted events' and 'days_since_surgery' (which requires reference_time), but it doesn't add detail about the events array structure or how reference_time is used beyond the schema. The description partially compensates for the schema gap but doesn't fully explain the relationship between the two parameters.

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 clearly states the tool's purpose: creating a normalized timeline state from extracted events. It lists specific operations (aggregates events, resolves duplicates, computes derived fields, determines recovery phase) that distinguish it from siblings like extract_timeline_events or summarize_timeline_context. However, it doesn't explicitly name a sibling to differentiate from, so it loses a point.

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 description implies usage context: it takes extracted events and produces a normalized state, which suggests it should be used after extract_timeline_events and before summarize_timeline_context. However, it doesn't explicitly state when to use this tool versus alternatives like upsert_message_into_timeline or days_since_event. The usage guidance is implied but not explicit.

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

days_since_eventC

Return the number of days since a named timeline event (e.g., surgery_date).

ParametersJSON Schema
NameRequiredDescriptionDefault
event_nameYes
reference_timeYesISO-8601 datetime
timeline_stateYes

TDQS

C2.9/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden. It does convey that the operation is a pure calculation ('Return the number of days') and gives an example of an event name, but it does not disclose behavior for missing events, how timeline_state is read, or inclusive/exclusive edge cases.

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 a single, front-loaded sentence with an illustrative example and no filler. It is as concise as possible, though it achieves that concision by omitting necessary detail.

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?

Given a nested timeline_state object, no output schema, and no annotations, the description is under-specified. It omits the shape/meaning of timeline_state, the relationship between event_name and timeline_state, and failure behavior, so an agent lacks enough context to call it reliably.

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 coverage is only 33% (just reference_time is described), and the description does not compensate. It explains event_name only indirectly through 'named timeline event' and an example, while timeline_state remains completely unexplained – an agent cannot tell how event_name relates to the timeline_state object.

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 ('Return'), a resource ('number of days since a named timeline event'), and gives a concrete example ('surgery_date'). It is clearly distinct from the sibling tools, though it does not explicitly call out the difference.

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 guidance is provided on when to use this tool instead of alternatives such as extract_timeline_events or summarize_timeline_context. The intended use is only implied by the name and the 'since a named timeline event' phrase.

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

extract_timeline_eventsB

Extract timeline-relevant events from a list of conversation messages. Parses time expressions and detects event types like surgery, stitch removal, symptom start, medication start/stop, and follow-up visits.

ParametersJSON Schema
NameRequiredDescriptionDefault
messagesYes

TDQS

B3.3/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 full burden of behavioral disclosure. It does disclose core behavior: parsing time expressions and detecting event categories, and 'extract' implies a non-mutating operation. However, it does not state whether input is modified, what the output looks like, or any limitations, which leaves some behavioral detail unspecified.

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 two sentences with no filler. The core purpose is front-loaded, and the second sentence adds useful detail about parsing behavior and event types without repeating schema information.

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 extractor, the description covers the input and the extraction behavior quite well. However, it omits the expected output shape and the integration point with sibling tools such as build_timeline_state. It is minimally viable but not fully self-sufficient for an agent deciding how to chain these timeline tools.

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?

With only one parameter, the schema already defines the messages array structure and the ISO-8601 timestamp field. The description adds that the input is a list of conversation messages and that time expressions in them are parsed, which helps connect the parameter to the tool's behavior. It does not explain the role of 'id' or further elaborate on timestamp semantics, but the description partially compensates for low schema coverage.

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 uses a specific verb ('extract') and a clear resource ('timeline-relevant events from a list of conversation messages'), and it enumerates concrete event types such as surgery, stitch removal, and medication start/stop. It does not explicitly contrast with sibling tools, but the extraction framing is distinct from build, summarize, days_since, and upsert.

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?

The description gives no guidance on when to use this tool versus its siblings. Given that build_timeline_state, summarize_timeline_context, days_since_event, and upsert_message_into_timeline exist, the description should state that this is the preprocessing extraction step and what the alternatives are for. Usage is only implied by naming the input.

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

summarize_timeline_contextC

Generate a short timeline-aware summary for insertion into an LLM system prompt or tool context.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeline_stateYes

TDQS

C2.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 the full burden of behavioral disclosure. It only says it generates a summary, with no mention of whether the operation is read-only, whether it modifies any state, what the output format is, or any constraints. For a tool with zero annotation coverage, this is insufficiently transparent.

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 a single well-formed sentence that front-loads the core verb and object. It uses no unnecessary words and is appropriately sized for a straightforward tool. It could be more informative, but for what it contains, it is concise and structured.

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

Completeness1/5

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

With one nested object parameter, no output schema, and no annotations, the description must compensate by explaining what timeline_state is and what the summary looks like. It does neither, leaving the agent to guess about input structure and return format. This is a significant gap for a tool that is meant to be invoked correctly.

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

Parameters1/5

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

The only parameter timeline_state has 0% schema description coverage, and the description does not mention it at all. 'Timeline-aware' hints at the input's role, but does not explain what timeline_state should contain or how it relates to the summary. The description adds no semantic value for the parameter beyond the schema's bare object type.

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 ('Generate') and resource ('short timeline-aware summary'), and identifies the use case ('insertion into an LLM system prompt or tool context'). This is clear enough to distinguish it from sibling tools like extract_timeline_events or days_since_event, though it could be more explicit that it summarizes a timeline_state object.

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 description implies usage by stating the output is intended for system prompts or tool context, giving context for when to use it. However, it provides no explicit comparison to sibling tools, no conditions that select it over alternatives, and no mention of prerequisites or exclusions.

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

upsert_message_into_timelineB

Incrementally update a running timeline with one new message. Extracts events, merges into existing state, and recomputes derived fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes
existing_timeline_stateYes

TDQS

B3/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of disclosing behavioral traits. It mentions the internal pipeline (extract, merge, recompute) but does not clarify whether the input existing_timeline_state is mutated, whether the operation is idempotent, what the return value is, or how duplicate messages are handled. This is a significant gap for an upsert-style operation.

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 a single sentence with no wasted words. It front-loads the primary purpose and quickly conveys the key operations, making it easy to scan and parse.

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?

Given the tool's moderate complexity (nested objects, 2 required params, no annotations, no output schema), the description is not complete enough. It omits critical details such as the expected shape of existing_timeline_state, whether the updated state is returned, and how errors or duplicates are handled. An agent would struggle to invoke this tool correctly without additional information.

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%, so the description must compensate for the schema's lack of parameter details. It does not: it only refers to 'one new message' and 'existing state' without explaining the structure of existing_timeline_state, how message.id/text/timestamp are used, or any constraints. The description adds minimal semantic value beyond the parameter names.

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 clearly states the action: 'Incrementally update a running timeline with one new message,' and outlines the sub-steps of extracting events, merging, and recomputing derived fields. It implicitly distinguishes from build_timeline_state by focusing on incremental update, but it does not explicitly name or contrast with siblings.

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 description implies when to use the tool: when there is a new message to add to an existing timeline state. However, it does not explicitly state when not to use it or mention alternatives like extract_timeline_events or build_timeline_state, so the guidance is only implied rather than directly actionable.

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. 5 tool updatesv0.1.0
    • First observedbuild_timeline_state
    • First observeddays_since_event
    • First observedextract_timeline_events
    • First observedsummarize_timeline_context
    • First observedupsert_message_into_timeline

TDQS

B3.3/5.0

Scored across 5 tools

Disambiguation4/5

Most tools are clearly separated by their role in the pipeline: extraction, state building, summarization, and querying. There is minor overlap between build_timeline_state and upsert_message_into_timeline since both aggregate events and recompute derived fields, but the incremental vs bulk distinction is clear enough.

Naming Consistency4/5

The naming mostly follows a verb_noun pattern: extract_timeline_events, build_timeline_state, summarize_timeline_context, upsert_message_into_timeline. The exception is days_since_event, which is not a verb-led action name and breaks the pattern slightly.

Tool Count5/5

Five tools is well-scoped for a focused timeline-management server. Each tool covers a distinct stage of the workflow without redundancy or excessive granularity.

Completeness4/5

The core lifecycle is covered: extraction, state construction, incremental updates, summarization, and queries. Minor gaps include lack of an explicit reset/clear operation or a way to remove individual events, but these are not critical for the intended use case.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A MCP server that provides persistent memory for AI assistants, storing personal information, relationships, and observations to enable personalized and contextual conversations.
    4
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    A local MCP server that provides a sovereign memory substrate for LLMs, enabling capture, recall, explanation, and anticipation of conversation turns with bi-temporal events and a strict read-only query surface.
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    A personal memory MCP server that stores and retrieves conversation memories, enabling AI agents to recall past discussions, promises, and preferences using natural language.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    A remote MCP server that gives AI assistants a shared memory, enabling structured handoffs, journaling, and notes for seamless continuation across sessions.
    -