Unified History MCP
Config-driven MCP server for cross-domain full-text search across agent session logs, meeting transcripts, and notification files.
README
Unified History MCP
Config-driven MCP server for cross-domain full-text search across agent session logs, meeting transcripts, and notification files.
Quick Start
# Install from source (PyPI package coming soon)
pip install git+https://github.com/jmars/unified-history-mcp.git
# Create a config file at ~/.config/unified-history-mcp/config.toml
# or use the example as a starting point:
cp config.example.toml ~/.config/unified-history-mcp/config.toml
# Start the server
unified-history-mcp
Add to your MCP client configuration:
{
"mcpServers": {
"unified-history": {
"command": "unified-history-mcp"
}
}
}
Configuration
Configuration is loaded from the first existing location:
$UNIFIED_HISTORY_CONFIGenvironment variable~/.config/unified-history-mcp/config.toml./unified-history.toml(current working directory)
Domain Configuration
Each [domains.X] section defines a searchable domain:
| Field | Type | Default | Description |
|---|---|---|---|
dir |
string | required | Root directory for this domain's files |
pattern |
string | "*" |
Glob pattern for file discovery |
type |
string | "files" |
"files" or "dirs" |
extensions |
string[] | [] |
Allowed extensions (e.g. [".txt", ".docx"]) |
extractor |
string | "jsonl" |
Extractor: jsonl, txt, transcript, notification |
renderer |
string | (extractor) | Renderer override |
label |
string | "file" |
Human label: "session", "transcript", etc. |
fst_binary |
string | "fst-indexer" |
Path or name of the FST indexer binary |
fst_index_dir |
string | (dir) | Override for index directory |
date_field |
string | — | JSON field for date extraction (jsonl only) |
filters |
string[] | [] |
Supported filters: role, speaker |
Global Configuration
| Section | Field | Description |
|---|---|---|
[history] |
file |
Path to command history file |
[log] |
file |
Path to runtime log file |
MCP Tools
search(domain, query, ...)
Full-text search with FST fast path and regex fallback.
| Parameter | Type | Default | Description |
|---|---|---|---|
domain |
string | "all" |
Domain or "all" for cross-domain |
query |
string | "" |
Search text or regex pattern |
max_results |
int | 20 |
Maximum total matches |
date_from |
string | — | Start date (YYYY-MM-DD) |
date_to |
string | — | End date (YYYY-MM-DD, inclusive) |
regex |
bool | false |
Treat query as regex |
context_lines |
int | 2 |
Surrounding context lines per match |
case_sensitive |
bool | false |
Case-sensitive matching |
max_matches_per_file |
int | 5 |
Max matches from any single file |
role |
string | — | [sessions] Filter by role: user, assistant, tool |
speaker |
string | — | [transcripts] Filter by speaker name |
list_domain(domain, date_from, date_to, max_results)
List available files in a domain with metadata.
| Parameter | Type | Default | Description |
|---|---|---|---|
domain |
string | — | Domain to list |
date_from |
string | — | Start date (YYYY-MM-DD) |
date_to |
string | — | End date (YYYY-MM-DD, inclusive) |
max_results |
int | 50 |
Maximum entries to show |
read(domain, id, max_entries, role, speaker)
Read entries from a domain file.
| Parameter | Type | Default | Description |
|---|---|---|---|
domain |
string | — | Domain |
id |
string | — | File/directory name or unique prefix |
max_entries |
int | 50 |
Maximum entries (newest first) |
role |
string | — | [sessions] Filter by role |
speaker |
string | — | [transcripts] Filter by speaker name |
summary(domain, id)
Get the AI-generated summary for a domain entry.
| Parameter | Type | Description |
|---|---|---|
domain |
string | Domain (sessions, transcripts) |
id |
string | File/directory name or unique prefix |
rebuild(domain)
Rebuild FST indexes for configured domains.
| Parameter | Type | Default | Description |
|---|---|---|---|
domain |
string | "all" |
Domain or "all" for all |
search_history(query, max_results, regex, case_sensitive)
Search the command history file.
| Parameter | Type | Default | Description |
|---|---|---|---|
query |
string | — | Search text or regex pattern |
max_results |
int | 30 |
Maximum matches |
regex |
bool | false |
Treat query as regex |
case_sensitive |
bool | false |
Case-sensitive matching |
search_log(query, max_results, regex, case_sensitive, level)
Search the runtime log file.
| Parameter | Type | Default | Description |
|---|---|---|---|
query |
string | — | Search text or regex pattern |
max_results |
int | 30 |
Maximum matches |
regex |
bool | false |
Treat query as regex |
case_sensitive |
bool | false |
Case-sensitive matching |
level |
string | — | Filter by log level |
How It Works
- Configuration — TOML file defines domains, their directories, extractors, and renderers.
- Domain Discovery — Files are discovered via glob patterns with extension filtering.
- Fast Path (FST) — If the optional
fst-indexerbinary is installed and indexes are built (via therebuildtool), searches use the blazing-fast FST index. - Slow Path (Regex) — Falls back to line-by-line regex scanning across files when FST is unavailable.
- Extractors — Produce text entries for FST indexing from different file formats (JSONL, TXT, Tactiq transcripts, notifications).
- Renderers — Format entries for human-readable display in search results, listings, and read output.
Development
git clone https://github.com/jmars/unified-history-mcp.git
cd unified-history-mcp
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
Contributing
Contributions are welcome! See CONTRIBUTING.md for guidelines on setting up the dev environment, running tests, and submitting pull requests.
License
MIT — see LICENSE.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.