timeline-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@timeline-mcpHow many days since my appendicitis surgery?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Scan messages for events and normalize dates |
2 |
| Aggregate events into a coherent timeline |
3 |
| Generate an LLM-ready natural-language summary |
4 |
| Compute elapsed days since any tracked event |
5 |
| 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-mcpOption 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-dateutilThe 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.pyRun all tests:
PYTHONPATH=src python3 -m unittest discover tests -vExpected: 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.serverMCP 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
commandto 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 |
| The executable to launch (e.g., |
| Arguments passed to the command (e.g., |
| Environment variables set for the child process (minimum: |
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_earlyThe 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 configLimitations
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:
GitHub Sponsors: github.com/sponsors/your-org
Open Collective: opencollective.com/timeline-mcp
Contribute: PRs, issues, and documentation improvements are always welcome
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 toolsbuild_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.
| Name | Required | Description | Default |
|---|---|---|---|
| events | Yes | ||
| reference_time | Yes | ISO-8601 datetime for reference |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| event_name | Yes | ||
| reference_time | Yes | ISO-8601 datetime | |
| timeline_state | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| messages | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeline_state | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| existing_timeline_state | Yes |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
build_timeline_state - First observed
days_since_event - First observed
extract_timeline_events - First observed
summarize_timeline_context - First observed
upsert_message_into_timeline
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
- EngramOAuthapp.getengram
Persistent, verbatim, searchable memory for AI assistants — one memory across every MCP client.
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
An MCP memory server. One memory your agents share — across models, devices and apps.
Cross-tool persistent memory and context for AI assistants over MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA MCP server that provides persistent memory for AI assistants, storing personal information, relationships, and observations to enable personalized and contextual conversations.4-
- AlicenseNot gradedqualityBmaintenanceA 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
- FlicenseNot gradedqualityCmaintenanceA personal memory MCP server that stores and retrieves conversation memories, enabling AI agents to recall past discussions, promises, and preferences using natural language.-
- FlicenseNot gradedqualityCmaintenanceA remote MCP server that gives AI assistants a shared memory, enabling structured handoffs, journaling, and notes for seamless continuation across sessions.-