HistoRank

MCP Server

Query and analyze ~100,000 historical events enriched by four AI models — Gemini, DeepSeek, Claude, and ChatGPT.

MCP endpoint https://mcp.historank.fun/mcp

Connect your client

Claude Desktop

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "historank": {
      "command": "npx",
      "args": ["mcp-remote", "https://mcp.historank.fun/mcp"]
    }
  }
}

Restart Claude Desktop after saving.

Claude Code (CLI)

Run in your terminal:

claude mcp add --transport http \
  historank \
  https://mcp.historank.fun/mcp

Or add with scope flag: --scope user to make it available across all projects.

Cursor

Project: .cursor/mcp.json  ·  Global: ~/.cursor/mcp.json

{
  "mcpServers": {
    "historank": {
      "url": "https://mcp.historank.fun/mcp"
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "historank": {
      "serverUrl": "https://mcp.historank.fun/mcp"
    }
  }
}

Gemini CLI

~/.gemini/settings.json

{
  "mcpServers": {
    "historank": {
      "httpUrl": "https://mcp.historank.fun/mcp"
    }
  }
}

ChatGPT Desktop

Open Settings → Connectors in the ChatGPT desktop app and add a new MCP server with the endpoint URL:

https://mcp.historank.fun/mcp

Requires ChatGPT desktop app with MCP support enabled.

Quick start

Once connected, follow these steps:

  1. Call get_event_schema to see all available field names — needed for sort, fields, and group_by.
  2. Use query_events to retrieve events across all models, or query_model_events to scope to one model with clean field names.
  3. Use aggregate_events to count, sum, or average events grouped by any field (e.g. events per decade).

Tools

get_event_schema

Returns the list of all available field names. Call this first to discover valid values for sort, fields, and group_by.

query_events

Query events across all four AI models with full filtering, sorting, and pagination. Returns records with model-prefixed fields (e.g. gemini_title).

limitoffsetsortfields date_fromdate_toyearmonthdecadecentury searchlocationcountrycategory min_significancetags_containsbboxmodel filter_gtfilter_ltfilter_eqfilter_nefilter_infilter_nin

get_event

Fetch a single event by its numeric ID.

id

aggregate_events

Aggregate events by one or more fields. Supports running totals and partitioned cumulative calculations. All filter params from query_events are supported.

group_byaggregatefield include_cumulativecum_partition_bycum_order_by

aggregate options: count · avg · min · max · sum · weighted_avg

filter_gt/filter_lt on count, value, aggregated_value, or cumulative_value become HAVING clauses.

get_distinct_values

All distinct values for any field across the full dataset. Useful for exploring categories, countries, or tags.

field

query_model_events

Like query_events but scoped to one AI model. Returns clean field names without the model prefix — title instead of gemini_title. Bare and prefixed field names both work.

model_name

aggregate_model_events

Like aggregate_events but scoped to one model's annotations. Bare field names are auto-prefixed.

model_namegroup_byaggregate

get_distinct_model_values

Distinct values for a field scoped to a specific model. Bare field names are auto-prefixed (e.g. country_namegemini_country_name).

model_namefield

get_significance_buckets

Histogram of a model's historical significance ratings grouped into buckets. Shows the full rating distribution for the filtered subset.

model_namebucket_size

count_words_in_description

Word frequency analysis across the description field for a filtered subset. Stop words excluded. Results sorted by frequency descending.

limit

count_words_in_tags

Word frequency across all tags for a specific model. Multi-word tags are tokenized; stop words excluded.

model_namelimit

Filter params

All filter params use field:value format. Comma-separate for multiple conditions.

ParamOperatorExample
filter_gtfield > valuefilter_gt=year:-100
filter_ltfield < valuefilter_lt=year:1
filter_eqfield = valuefilter_eq=main_category:War
filter_nefield != valuefilter_ne=main_category:War
filter_infield IN (…)filter_in=year:1939|1940|1945
filter_ninfield NOT IN (…)filter_nin=main_category:War|Politics

On aggregate tools, filter_gt/filter_lt on aggregate result fields (count, value, etc.) become HAVING clauses rather than WHERE.

Date formats

FormatExampleNotes
CE date1939-09-01Standard ISO 8601
BC date0044-03-15 BCAppend space + BC
BC shorthand-44-03-15Negative year prefix
year paramyear=-44BC years are negative integers
decade paramdecade=-4044 BC → decade -40
century paramcentury=-10044 BC → century -100

Sorting: prefix any field with - for descending. Example: sort=-gemini_historical_significance_rating. NULLs always sort last.

AI models

Each event is annotated independently by four models. Model-specific fields are prefixed with the model name.

ModelPrefixKey fields
Geminigemini_title · historical_significance_rating · historical_significance_explanation · tags · location · country_name · latitude · longitude
DeepSeekdeepseek_
Claudeclaude_
ChatGPTchatgpt_