Location Memory
Location Memory is a private, self-hosted location archive system that ingests and analyzes personal location history (Google Timeline exports, OwnTracks, etc.) while preserving privacy. Key capabilities include:
Current location & weather:
current_locationreturns current address, local time, fix age, trip status, trip day, and distance from home; weather tools (weather_now,will_it_rain,weather_forecast,weather_models,weather_history) provide current, forecast, historical, and rain-probability data for current or past locations.Stays & places:
stayslists chronological stops with duration, trip context, and place, filterable by city/country/granularity/min duration;top_placesranks places by time spent;dayreconstructs a date's stays and journeys with transport mode and distance.Cities & countries:
cities_visitedandcountries_visitedsummarize time spent, visit counts, distinct days, and cities within countries.Trips:
tripslists trips with name, dates, nights, countries, cities, distance from home, and companions;tripprovides day-by-day itineraries, stays, journeys, tagged people, and notes.Stats & records:
travel_statscomputes kilometers by transport mode, flights, longest flight, days away vs. home, countries and cities touched;recordsreports personal extremes like highest altitude, fastest speed, farthest from home, four compass records, longest trip, most cities in a day, and longest flight.Home & coverage:
homemaintains a timeline of past home addresses for accurate distance calculations;location_coveragereports data spans, sources, and gaps of 2+ weeks.People (optional bridge):
who_was_therelinks trips to people;with_mereports days spent with someone including non-trip time;record_togetherlogs time spent with others.Advanced queries & privacy:
location_sqlallows read-only SELECTs against the schema; the server is self-contained with no telemetry, and supports bearer tokens, TLS enforcement, and read-only SQL access.
Allows importing Google Timeline location history exports into a private archive, enabling queries about past stays, trips, cities visited, and travel statistics.
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., "@Location Memorywhich cities did I go to last spring, and how long in each?"
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.
Location Memory
Where you were, when, for how long, and who with. A private location archive with an MCP server on top, so your agent can answer questions about your own past instead of asking you.
Your data stays in your Postgres. No hosted service, no telemetry, no account.
you: which cities did I go to last spring, and how long in each?
cities_visited(period: "last_90_days")
Lisbon 11 days 3 separate times 142h
Porto 4 days 1 time 61h
Paris 38 days — homeWhy this is not a table of coordinates
A position log answers "where was I at 14:03". Nobody asks that. People ask how long were we in Lisbon, how many times have I been to Japan, what did I do on the 8th, how far did I fly last year. Those are questions about stays and journeys, and you cannot recover either one from a stream of points without guessing.
So the archive keeps what the phone already knew and a geocoder can never reconstruct:
What | Where it comes from | Why it cannot be recomputed |
A stay, with a real start and end | the export | interpolating between fixes invents the boundaries |
Transport mode | the phone's sensors | a straight line between two points does not say "flying" |
Distance travelled | the export | the route is not the great circle |
Which place is home | the export's own profile | every "far from home" number depends on it |
Altitude and speed | the raw fix log | not derivable from lat/lon at all |
location_v_stays is the single spine everything reads: imported stays, followed by the live feed's tail after the last import, deduplicated at the seam.
Related MCP server: hippocampus-mcp
The two things it refuses to get wrong
A duration is measured, never modelled. Start and end come from the source. The one place a duration is inferred, a run of live pings in the same place, is capped at 72 hours, because a phone that goes quiet for a week did not stand still for a week.
"No record" is not "was not there". An archive built from an export plus a live feed has holes: the months between the day you exported and the day you installed the tracker, a phone you replaced, an app you uninstalled. location_coverage reports every gap of two weeks or more, measured from the data rather than written down, and every tool that comes back empty points at it. An agent that does not know where the holes are will tell you confidently that you have never been to Portugal.
Install
git clone https://github.com/michelgrolet/tars-location-mcp.git
cd tars-location-mcp
pip install -e .You need a Postgres. A container on the same laptop is fine, a free hosted project is fine:
docker run -d --name location-db -e POSTGRES_PASSWORD=local -p 5432:5432 postgres:16mkdir -p ~/.config/tars-location
cat > ~/.config/tars-location/.env <<'EOF'
LOCATION_DATABASE_URL=postgresql://postgres:local@127.0.0.1:5432/postgres
LOCATION_GEOCODER_CONTACT=you@example.com
LOCATION_FALLBACK_TZ=Europe/Paris
EOF
tars-location migrateLOCATION_GEOCODER_CONTACT has no default on purpose. Nominatim's usage policy asks for an address they can reach you at; without one you are an anonymous scraper and they are within their rights to block you.
Fill it
The past: a Google Timeline export
Google keeps Timeline on the phone now, so a Takeout of it holds settings only. Export from the device: Settings > Location > Location services > Timeline > Export Timeline data. That gives you a JSON file.
tars-location import ~/Downloads/location-history.json --geocode 200
tars-location detect-trips
tars-location statusFour export shapes are handled, because which one you get depends on the phone and on which door you exported through: the on-device semanticSegments, the same segments as a bare list, classic Takeout timelineObjects, and classic locations records. Re-running is the normal case: every export overlaps the last, every insert is on conflict do nothing, and a second pass adds only what is new.
Geocoding is deliberately not part of the insert. Nominatim allows one call a second and an export brings a thousand new places, so --geocode N drains N of them and the rest happen in the background:
tars-location enrich --geocode 25 # on a timer, every few minutesThe present: OwnTracks
tars-location token add --label pixel # prints the token once
tars-location serve --port 8080Point OwnTracks at it in HTTP mode, with the token as the password under Authentication. Put a reverse proxy doing TLS in front: the endpoint refuses to bind anything but loopback until you tell it one is there, because a bearer token over plain HTTP is a token in every hop's logs.
Connect an agent
# Codex
codex mcp add location \
--env LOCATION_ENV_FILE="$HOME/.config/tars-location/.env" \
-- uvx --from git+https://github.com/michelgrolet/tars-location-mcp tars-location-mcp
# Claude Code
claude mcp add -s user location \
-e LOCATION_ENV_FILE="$HOME/.config/tars-location/.env" \
-- uvx --from git+https://github.com/michelgrolet/tars-location-mcp tars-location-mcpAnything that speaks MCP over stdio works. Start a new session after adding the server.
With TARS, optionally
Location Memory is standalone and stays standalone: nothing above needs a particular harness. TARS is a harness for a personal agent that lists this in its extension registry, so if you happen to run it, one command does the clone and the wiring:
claude plugin install location-memory@tarsWhat that adds over the plain MCP server is when the tools fire: TARS puts the trigger in the one file it loads every session, so the agent checks where you were before answering rather than waiting to be told to.
The tools
Tool | What it answers |
| where you are now, which trip, day N of it, how far from home, and whether the fix is stale |
| every stop over a window, in order, with duration and trip |
| cities over a window: time in each, how many separate times, which days |
| the same by country, with the cities inside each |
| where you actually spend time, most first. Also how you find an address you half remember |
| trips newest first, with who was along |
| one trip in full: day by day, every stay, every journey with mode and distance |
| one date end to end |
| kilometres by mode, flights, days away against days at home |
| highest, fastest, farthest, the four compass extremes, longest flight, most cities in a day |
| where you have lived and when |
| what the archive holds, per source, and every gap |
| trips shared with a person, both directions. Needs the people bridge |
| days spent with someone and where they landed, trip or not. Needs the people bridge |
| log that someone was with you over a date range, times optional. Needs the people bridge |
| read-only SELECT for anything the rest does not shape |
| the chance of rain where you are, counted over ~120 ensemble members |
| what it is doing outside right now, and the next twelve hours |
| the days ahead: highs, rain, wind, UV, sunrise |
| the same forecast from seven national weather services, side by side |
| what the weather actually was on a past day, at the place you spent it |
Every windowed answer carries the period and timezone it used, and the number of stays it looked at. An answer that does not say what it covers is not an answer.
Weather, at coordinates it already has
An agent that knows where you are can answer the weather question you actually asked. Not what is the forecast for 48.89, 2.28 — will it rain here today, and on day four of the trip, and was it raining that Tuesday in Lisbon. The archive supplies the position, so none of these need one.
you: will it rain today?
will_it_rain()
62 %, likely. 1.4 mm expected, wettest around 17:00.
Dry from 09:00 to 14:00.
ECMWF 71 %, DWD 66 %, NOAA 49 % — 122 members, they broadly agree.Three things this does that a weather widget does not:
A chance of rain is counted, not read off. A single forecast cannot produce a probability. Three centres each run their model dozens of times from slightly perturbed starting states, and the share of those runs that ends up wet is the chance of rain. will_it_rain reads all ~120 members from ECMWF's ENS, DWD's ICON-EPS and NOAA's GEFS and counts them. Each centre is weighted equally rather than each member, or ECMWF's 51 members would outvote GEFS's 31 on nothing but ensemble size.
Disagreement is reported rather than averaged away. When the three centres land within 15 points, the number is worth trusting. When they do not, the answer says so, because a confident 40 % and a coin-flip 40 % should not read the same. weather_models is the same idea one level down: the deterministic run from seven independent services — ECMWF, NOAA, DWD, Météo-France, the Met Office, Environment Canada, JMA — with their spread.
"Best models" means independent centres, not a longer list. Each _seamless model chains that centre's own high-resolution regional model over its domain into its global one outside it: in France Météo-France is AROME at 1.3 km, over the US NOAA is HRRR at 3 km. Models that are only regional with someone else's global run behind them are deliberately left out — outside their domain they return ECMWF again, and a panel that counts the same forecast twice reports agreement it has not got.
Everything goes through Open-Meteo, free for non-commercial use and no key required. LOCATION_WEATHER_API_KEY switches to their commercial endpoints if you have a plan; LOCATION_WEATHER_UNITS=imperial switches the whole thing to °F, mph and inches.
Any of the five takes a place (matched against your own archive first, so a place you have been resolves to the spot you stood on rather than the centroid of the city) or a lat/lon pair. With neither, the question is about where you are, which is what it almost always is.
Trips are detected, not entered
A trip is a run of days spent outside the country you live in, or more than 100 km from home. That definition needs to know where home was at the time, which is why home is a timeline rather than a setting: anyone who has moved has several, and measuring a 2019 day against a 2025 address gets every distance wrong.
tars-location detect-tripsRuns are broken by a gap of more than a month, so a hole in the archive does not weld two visits into one four-year trip. A name you typed yourself is never overwritten: name_is_auto goes false the moment you rename a trip, and re-detection leaves it alone. Without that flag every re-run silently renames "Honeymoon" back to "Italy - June 2025".
People, optionally
"Who was I with in Lisbon" is the question a location archive cannot answer alone, and the one people actually ask. It needs a table of people, which is a different product with a different lifecycle, so it is a bridge and not a dependency:
tars-location migrate --with-people-bridgeIt refuses to run unless a people table exists, and the core schema never references one. Built against people-memory; any table with id, full_name, current_org and current_role works. Without the bridge, who_was_there says so plainly rather than returning a database error for an agent to misread.
Half of "who was I with" is not on a trip, though. A weekend at a friend's, an evening, a week at your parents' are none of them runs of nights far from home, so the archive never detects them. record_together is the other half: a window you draw yourself on a person, with times optional.
you: I was in Lisbon with Ana from the 11th to the 13th
record_together(person="Ana", since="2025-03-11", until="2025-03-13")
3 days · Lisbon, Portugal · Lisbon — March 2025Only who and when are stored. Cities, countries, days and the trip come from the archive at read time, so nothing about a place is ever written onto a person and nothing goes stale as the archive fills in. Dates with no clock time mean local midnights where you were standing, resolved from the archive itself: 2025-03-11 typed in Paris for a day spent in San Francisco means midnight in San Francisco, and the client is never asked to know that. with_me reads it back, and a window that covers a detected trip also shows up under who_was_there with via: "range" next to the people tagged on the trip by hand.
Security
This is the most personal database most people will ever own. Someone with a copy knows where you sleep.
The ingest endpoint needs a bearer token, compared in constant time against
location_auth, and it only ever inserts. The credential a phone carries cannot be used to read your history back out.It refuses to bind a public interface without TLS in front, because a bearer token over plain HTTP is a token in every hop's logs.
location_sqlis read-only enforced by Postgres, not by asking a model nicely: aset transaction read onlyblock with a statement timeout, rolled back at the end. An agent will eventually be handed a query by a web page it was summarizing, and the guard has to hold when it is.No credential is ever in the repo. The connection string lives in an env file outside it.
Full threat model, including what is not defended: SECURITY.md.
Tests
pytestThe parsers, the time maths and the guards run with no database. The schema tests need a real Postgres, because a migration reviewed by reading is a guess:
docker run -d --name location-test -e POSTGRES_PASSWORD=test -p 5433:5432 postgres:16
LOCATION_TEST_DATABASE_URL=postgresql://postgres:test@127.0.0.1:5433/postgres pytestCI runs both against Postgres 14 and 16, on Python 3.10 and 3.13.
Requirements
Python 3.10+, Postgres 13+, and psycopg. Nothing else: the geocoder, the HTTP endpoint and the JSON-RPC server are all standard library. A location archive is the wrong place to carry a dependency tree.
Not here yet
Polarsteps import, and a browser map over location_v_stays. Both exist in a private tree and are not extracted.
MIT.
Available Tools
14 toolscities_visitedA
Cities over a period, with time in each, how many separate times they were there, and which days. Use for 'which cities did I go to last spring'.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Start, YYYY-MM-DD or an ISO timestamp. | |
| until | No | End, exclusive. YYYY-MM-DD or ISO timestamp. | |
| period | No | Window to look at: today, yesterday, this_week, last_week, this_month, last_month, this_year, last_N_days, or all. Boundaries are local to where the user is, not UTC. Ignored when since/until are given. | |
| country | No | Filter to one country, name or ISO code. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It discloses the return content (time in each city, number of separate visits, specific days), which is meaningful beyond the input schema. It does not mention read-only semantics explicitly, but no side effects are suggested.
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, information-dense sentence with a practical example, no redundancy.
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 read-only query tool with four optional parameters and no output schema, the description covers the output fields and a concrete use case. It omits sort order and timezone handling, but the schema fills in parameter semantics.
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 100%, so the baseline is 3. The description's 'over a period' loosely maps to since/until/period, but it adds no parameter-specific detail beyond what the schema already provides.
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 identifies the resource as cities visited within a time range and specifies the output dimensions (time spent, visit counts, days). The example 'which cities did I go to last spring' distinguishes it from sibling tools like countries_visited, though it lacks an explicit imperative verb.
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 explicitly provides a concrete use case ('Use for...'), giving clear context for when to select this tool. It does not name sibling alternatives or state exclusions, but the example is sufficient to signal appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
countries_visitedA
Countries over a period: separate trips there, time spent, distinct days, and the cities inside each. Pass country for one of them ('how many times have I been to Japan').
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Start, YYYY-MM-DD or an ISO timestamp. | |
| until | No | End, exclusive. YYYY-MM-DD or ISO timestamp. | |
| period | No | Window to look at: today, yesterday, this_week, last_week, this_month, last_month, this_year, last_N_days, or all. Boundaries are local to where the user is, not UTC. Ignored when since/until are given. | |
| country | No | Filter to one country, name or ISO code. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the burden of disclosure. It explains the output structure (separate trips, time spent, distinct days, cities) and the country filter, but does not mention default behavior with no parameters, ordering, or edge cases like ambiguous country names. It provides a functional overview but lacks depth.
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 concise (two sentences), front-loaded with the purpose, and every sentence adds value. The example with the country filter is useful without being verbose.
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 no output schema, the description covers the key return elements (trips, time, days, cities) and the filtering behavior. It does not state the default when no country is provided or how the results are structured, but it is sufficiently complete for an agent to select and invoke the tool for common use cases.
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 input schema already provides 100% coverage of parameter meanings. The description adds a brief example for the country parameter, but since and until/period semantics are already well-documented in the schema, so minimal added value.
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 function: it provides country-level travel statistics over a period, including trips, time spent, distinct days, and cities. It also distinguishes itself from siblings like cities_visited and trips by focusing on countries as the aggregation unit.
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 for country-focused travel queries and gives a concrete example of filtering by country ('how many times have I been to Japan'). However, it does not explicitly contrast with alternatives such as cities_visited or trips, nor does it 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.
current_locationA
Where the user is right now: address, coordinates, their local time, how old the fix is, which trip they are on and day N of it, and how far from home. Read this before saying anything about where they are.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It discloses a rich set of behavioral details: the exact fields returned (including fix age, trip/day, distance from home), which implies potential staleness and contextual richness. It doesn't mention side effects or permissions, but for a read-only location tool this is reasonable.
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 plus a directive. It front-loads the core purpose, lists all relevant outputs, and includes a usage note. Every word earns its place; no fluff or repetition.
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 no parameters and no output schema, the description is remarkably complete. It enumerates all the data the agent will receive and provides a clear usage rule. There is no missing information that would prevent correct invocation or interpretation.
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 tool has zero parameters, so schema coverage is trivially 100%. No parameter explanation is needed. Baseline for 0 params is 4, and the description adds useful context about what the tool returns without needing to describe inputs.
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 what the tool does: it returns the user's current location with specific details (address, coordinates, local time, fix age, trip/day, distance from home). It uses a specific resource ('current location') and distinguishes from sibling tools like 'home' or 'trip' by emphasizing the current, real-time nature.
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 provides explicit usage guidance: 'Read this before saying anything about where they are.' This tells the agent when to use the tool (before making any location claims). It does not explicitly name alternatives or exclusions, but the directive is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dayA
One date end to end: where they woke up, every stay in order, the journeys between them with mode and distance, the trip it belongs to, and how far from home. Use for 'what did I do on the 8th'.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD. Default their today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses the tool's output content and ordering (stays in order, journeys between them, trip it belongs to), giving agents a detailed expectation of results. It doesn't discuss side effects, but as a read-only tool this is acceptable.
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 long with no fluff. The first sentence packs a dense but readable specification of what is returned; the second provides a concrete usage example. Every word earns its place.
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 one optional parameter and no output schema, the description is remarkably complete. It outlines the full response content, ordering, and association with trips, making the tool's behavior clear enough for an agent to invoke correctly without additional docs.
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 input schema already fully documents the sole parameter 'date' with format and default (100% coverage). The description adds no new parameter semantics beyond referencing a date example, so the baseline of 3 applies.
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 provides a comprehensive view of a single date: wake-up location, stays in order, journeys with mode and distance, trip association, and distance from home. It distinguishes itself from siblings like 'stays' or 'trip' by covering the full day's narrative.
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 explicitly advises using it for 'what did I do on the 8th', giving a clear use case. It doesn't mention alternatives or exclusions, but the context is sufficiently clear to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
homeA
Where they have lived and when. Home is a timeline, not a point, so anything home-relative has to read this rather than assume one address.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals a key trait: home is a timeline, not a point, meaning it returns a sequence over time rather than a single address. This prevents misuse, though it does not specify the exact output format or whether it includes current residences.
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?
Two concise sentences, front-loaded with the core purpose. Both sentences add distinct value: the first states what it returns, the second clarifies the conceptual model and usage. No wasted words.
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 no-parameter tool with no output schema, the description is mostly complete. It explains the fundamental difference from a point-in-time location and instructs on usage. It could be more explicit about return values (e.g., list of addresses with dates), but the phrase 'where they have lived and when' sufficiently implies this.
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 tool has zero parameters, giving a baseline of 4. The description adds context by explaining why no address parameter is needed: because home is a timeline covering all residences, so the tool should be consulted rather than assuming one address. This reinforces the parameter-less design.
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 provides a history of residences ('Where they have lived and when'), and explicitly distinguishes it from a single-address assumption. However, it lacks a specific verb like 'list' or 'get', and the purpose is expressed as a noun phrase rather than an actionable command.
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 second sentence gives direct usage guidance: 'anything home-relative has to read this rather than assume one address.' This tells the agent when to use this tool and warns against assuming a single point. It does not explicitly name alternative sibling tools, but the contrast with 'point' implies current_location or similar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
location_coverageA
What the archive actually holds, table by table, with the span each source covers and every gap of two weeks or more. Check this before concluding someone was never somewhere: 'no record' and 'was not there' are different answers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries full burden. It discloses that the tool returns coverage metadata (table-by-table, spans, gaps) rather than location data, and warns about the interpretive pitfall. This provides meaningful behavioral context beyond simply stating 'shows coverage.'
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 long and front-loaded: the first sentence states the tool's output directly, and the second provides a concise usage warning. Every word earns its place; there is no filler.
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 zero-parameter tool with no output schema, the description covers purpose, output scope, and usage context. It could optionally include an example of the response structure, but the current content is sufficient for an agent to decide when to use it and what to expect.
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 tool has zero parameters, and the schema confirms this with 100% coverage. The description adds context about the output (tables, spans, gaps) but no parameter details are needed. Per the rubric, 0 params yields a baseline of 4, and the description aligns well with that.
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 what the tool does: it reports what the archive holds, table by table, including the span each source covers and gaps of two weeks or more. It uses a specific resource ('the archive') and distinguishes itself from sibling location-query tools by focusing on data coverage rather than location data itself.
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 second sentence explicitly instructs when to use this tool: 'Check this before concluding someone was never somewhere.' It also explains the critical distinction between 'no record' and 'was not there,' which is valuable guidance. While it doesn't name specific alternative tools, the context makes the usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
location_sqlA
Read-only SELECT for questions the other tools do not shape. Tables: location_visits(started_at, ended_at, start_offset_m, place_id, semantic_type), location_activities(started_at, ended_at, mode, distance_m, start_lat, start_lon, end_lat, end_lon), location_places(id, lat, lon, address, label, city, admin, country, country_code, tz), location_pings, location_raw_positions(altitude_m, speed_ms), location_trips. Views: location_v_stays (the history spine), location_m_day_home (one row per day with the anchor place and km from home), location_v_records, location_v_home_periods. With the people bridge installed: location_trip_people, location_v_trip_people, people_v_trips.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Row cap. Default 200. | |
| query | Yes | A single SELECT statement. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the read-only nature ('Read-only SELECT'), which is critical safety information. However, it does not describe other behavioral traits such as query result limits (beyond schema), performance expectations, or error handling, leaving some uncertainty for a raw SQL tool.
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 opens with a concise, front-loaded purpose statement and then systematically organizes the database objects into Tables, Views, and a conditional 'people bridge' section. It is long due to the schema listing, but every piece is relevant for a raw SQL tool, so the length is justified.
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 complexity (arbitrary SQL), providing the full schema is essential and mostly complete. It also notes the optional people bridge installation. However, it lacks an example query, any note about query complexity limitations, or details on how results are returned, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema descriptions cover both parameters, the tool description adds substantial context for the 'query' parameter by enumerating all available tables and views with their columns. This transforms a generic 'SELECT statement' into something actionable. The 'limit' parameter is not elaborated further, so the score reflects the high value added for the primary parameter.
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 starts with 'Read-only SELECT', a specific verb and resource that clearly defines the tool's action. It also distinguishes itself from siblings with 'for questions the other tools do not shape', signaling it's the fallback for raw SQL queries. The detailed list of tables and views further specifies its domain.
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 phrase 'for questions the other tools do not shape' gives clear context for when to use this tool instead of dedicated tools. However, it does not name specific sibling tools or state explicit exclusions (e.g., 'use trips for travel overviews'), so the guidance is good but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recordsA
The extremes: highest point, fastest, farthest from home, the four compass records, longest trip, most cities in a day, longest flight. Each carries the window it was measured over, which is not the same for all of them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It adds useful behavioral context by noting that each record includes the window it was measured over, and that these windows differ across records. However, it does not disclose other potentially relevant behaviors such as whether the tool filters by current user, what units are returned, or any data freshness caveats.
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 highly concise and well-structured. It front-loads the core idea ('The extremes'), then provides a clean list of record types, and finishes with an important nuance about measurement windows. Every word earns its place; no fluff or redundancy.
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 zero parameters and no output schema, the description adequately sets expectations by listing the specific record types and indicating that each has a measurement window. It could go a bit further by clarifying what 'fastest' or 'farthest' refer to, but the level of detail is sufficient for a user to infer the tool's scope.
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 tool has zero parameters, so the baseline is 4. The description has no responsibility to explain parameters, and it correctly avoids any parameter-related noise. It does not need to compensate for schema gaps because there are none.
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 enumerates the content of the tool (various extremes like highest point, fastest, farthest from home, compass records, longest trip, most cities in a day, longest flight), making its purpose evident. It lacks an explicit verb like 'get' or 'list,' but the itemization effectively communicates what the tool provides and distinguishes it from sibling tools that focus on individual data points.
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 provides no guidance on when to use this tool versus the many siblings (e.g., top_places, trips, travel_stats). It does not mention alternatives or exclusion criteria. Usage context is only implied by the fact that it aggregates extremes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
staysA
The chronological list of stays over a period: every stop with start, end and duration, the trip it belongs to, and the place. Use it to reconstruct a day, a week or a trip in order.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Granularity. Default place, which is every stop. | |
| city | No | Filter to one city, by name. | |
| since | No | Start, YYYY-MM-DD or an ISO timestamp. | |
| until | No | End, exclusive. YYYY-MM-DD or ISO timestamp. | |
| period | No | Window to look at: today, yesterday, this_week, last_week, this_month, last_month, this_year, last_N_days, or all. Boundaries are local to where the user is, not UTC. Ignored when since/until are given. | |
| country | No | Filter to one country, name or ISO code. | |
| min_minutes | No | Drop stays shorter than this. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the chronological ordering and the output fields. However, it doesn't mention potential grouping behavior when the 'by' parameter is used, nor any default period or timezone considerations.
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?
Two sentences, front-loaded with the main purpose and followed by a concrete use case. Zero filler.
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 7 parameters and no output schema, the description explains the basic output structure but omits how parameters like 'by', 'period', and filters interact. The ambiguity between 'every stop' and the 'by' granularity leaves some gaps.
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?
All 7 parameters have schema descriptions (100% coverage), so the schema does the heavy lifting. The description adds no parameter-specific information beyond the general 'over a period' phrase.
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 ('list'), names the resource ('stays'), and specifies the scope ('over a period') and content ('every stop with start, end and duration, the trip it belongs to, and the place'). It also differentiates from siblings by explicitly mentioning reconstruction of a day/week/trip, which sibling tools like 'day' or 'trip' likely serve.
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?
It provides clear context: 'Use it to reconstruct a day, a week or a trip in order.' This tells when to use it, but it does not mention when not to use it or alternative tools explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_placesA
The places they spend time in, most time first: address, city, what the source calls the place, how many stops and how many hours. Use for 'where do I actually spend my time' or to find an address.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Filter to one city, by name. | |
| limit | No | How many places. Default 20. | |
| since | No | Start, YYYY-MM-DD or an ISO timestamp. | |
| until | No | End, exclusive. YYYY-MM-DD or ISO timestamp. | |
| period | No | Window to look at: today, yesterday, this_week, last_week, this_month, last_month, this_year, last_N_days, or all. Boundaries are local to where the user is, not UTC. Ignored when since/until are given. | |
| search | No | Match the label, address or city, case-insensitive. | |
| country | No | Filter to one country, name or ISO code. |
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. It discloses the ordering (most time first) and output fields, which is useful. However, it does not mention data source, potential inaccuracies, or that this is a read-only aggregation, leaving some gaps for a tool with no annotation support.
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 core function and output, and each sentence contributes. It avoids redundancy and is well-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 no output schema, the description covers return values (address, city, source label, stops, hours) and ordering. It omits caveats like pagination or data source limitations, but for a listing tool with well-specified schema, this is nearly complete.
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 100%, so the baseline is 3. The description adds little parameter-specific meaning beyond mentioning 'address' in the output, which indirectly relates to the search filter. It does not explain parameter interactions or defaults beyond what the schema already provides.
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 returns places ordered by time spent, with specific fields (address, city, source label, stops, hours). It also gives explicit use cases ('where do I actually spend my time' or to find an address), which distinguishes it from sibling tools like trips or stays.
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?
Provides clear use contexts: 'where do I actually spend my time' and 'find an address'. It does not name alternative tools or explicitly state when not to use it, but the guidance is sufficient to direct an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
travel_statsA
How much they moved over a period: kilometres by mode, number of flights and the longest, days away from home against days at home, countries and cities touched.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Start, YYYY-MM-DD or an ISO timestamp. | |
| until | No | End, exclusive. YYYY-MM-DD or ISO timestamp. | |
| period | No | Window to look at: today, yesterday, this_week, last_week, this_month, last_month, this_year, last_N_days, or all. Boundaries are local to where the user is, not UTC. Ignored when since/until are given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the output metrics but not behavioral details such as how 'home' is defined, whether the tool is read-only, or any edge-case handling. The read-only nature is implied by the stats context but not stated.
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 that efficiently enumerates the key output categories. Every word adds value, and the structure makes it easy to scan.
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 absence of an output schema, the description does a good job listing the main output dimensions (kilometres by mode, flights, days away, countries/cities). It is reasonably complete for a simple stats tool, though it could clarify the definition of 'home' or the read-only nature.
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 schema provides full descriptions for all three parameters (since, until, period), so the description adds little beyond reinforcing that the tool looks at 'a period'. It does not clarify parameter interactions beyond what the schema already states.
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 defines what the tool does: it reports movement stats over a period, listing specific metrics (km by mode, flights, days away from home vs at home, countries/cities). This distinguishes it from sibling tools like cities_visited or trips, which provide detailed lists rather than aggregate statistics.
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 a use case (getting travel summary stats) but gives no explicit guidance on when to prefer this tool over alternatives or when not to use it. It does not mention that detailed trip-level info is available in 'trips' or that cities_visited/countries_visited provide raw lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tripA
One trip in full: the day-by-day country and city, every stay, the journeys with mode and distance, the people tagged on it, and the note. Identify it by slug, by name, or by a date inside it.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Any date inside the trip, YYYY-MM-DD. | |
| name | No | Part of the trip name. | |
| slug | No | The trip slug, e.g. japan-2025-02-09. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It describes the data returned and the identification mechanism, but does not disclose behavior in edge cases (e.g., missing parameters, non-existent slug, multiple matches). It is not misleading, but could be more transparent about failure modes or read-only nature.
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?
Two concise sentences, front-loaded with the key output ('One trip in full') and a clear list of contained data. No redundant content; every phrase adds value.
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 absence of an output schema, the description effectively enumerates all major components (day-by-day country/city, stays, journeys with mode/distance, people, note). It also explains how to identify the trip. It could be slightly more explicit about the requirement to provide at least one identifier, but overall it is complete for a retrieval tool.
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 schema already provides descriptions for all three parameters (100% coverage), so the baseline is 3. The description adds beyond the schema by clarifying that the parameters are alternative identifiers ('by slug, by name, or by a date inside it') and elaborates on the date parameter ('any date inside the trip'). This enhances parameter semantics.
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 what the tool does: it retrieves a complete trip with all its details (day-by-day itinerary, stays, journeys, people, note). It uses a specific resource ('One trip') and distinguishes it from siblings like 'trips' (plural list) and 'day' (single day).
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 clear identification methods (slug, name, or date) and implies when to use this tool (when you need the full trip details). However, it does not explicitly exclude alternatives like 'day' or 'stays', so it lacks explicit 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tripsB
Trips, newest first: name, dates, nights, countries, cities, how far from home, and who was along. A trip is a run of nights outside the country they live in or over 100 km from it. Names edited by hand are kept.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many trips. Default 40. | |
| since | No | Start, YYYY-MM-DD or an ISO timestamp. | |
| until | No | End, exclusive. YYYY-MM-DD or ISO timestamp. | |
| period | No | Window to look at: today, yesterday, this_week, last_week, this_month, last_month, this_year, last_N_days, or all. Boundaries are local to where the user is, not UTC. Ignored when since/until are given. | |
| person | No | Only trips this person is tagged on, by name. Needs the optional people bridge. | |
| country | No | Filter to one country, name or ISO code. | |
| min_nights | No | Drop shorter trips. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It explains the trip definition and that hand-edited names are kept, which is useful. However, it does not disclose whether this is a read-only operation, how filtering interacts with the definition (e.g., country filter perhaps overrides the 100km rule), or behavior like default limits beyond 'Default 40' in schema.
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?
Description is two sentences, front-loaded with the most important usage info (newest first, fields), then the trip definition. It is compact, though it could be tighter by omitting the list of fields already implied by output.
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 7-parameter list tool with 100% schema coverage and no output schema, the description is average. It defines 'trip' and indicates hand-edited names, but doesn't clarify relationships with siblings like 'trip' or 'stays', nor what happens when filters conflict with the trip definition. Enough to select the tool, but gaps remain.
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 100% with good parameter descriptions, so baseline is 3. The tool description adds meaningful context: 'newest first', the trip definition (outside country or >100 km) that underpins 'min_nights' and filters, and the note about hand-edited names. This exceeds the baseline.
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 says it returns trips with specific fields (name, dates, nights, ...) and is newest first, which is a specific verb+resource. It distinguishes from siblings like 'trip' (singular) partly by being a list, but doesn't explicitly contrast with 'stays' or 'travel_stats'.
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 opening line implies a list of all trips with optional filters, but there's no explicit 'when to use' or 'when not to use'. Given there is a 'trip' sibling, the description doesn't say to use this for listings and 'trip' for a single trip. The mention of an optional people bridge is the only guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
who_was_thereA
The link between trips and a people graph, both ways. Pass person for the trips shared with them, trip for everyone tagged on it, neither for every tagged pairing. Needs the optional people bridge.
| Name | Required | Description | Default |
|---|---|---|---|
| trip | No | A trip slug. | |
| person | No | A person's name, partial is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the three behavioral modes based on parameters and the dependency on the people bridge. However, it does not describe the return format, error conditions, or what happens if both parameters are passed, which are meaningful gaps.
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 three sentences, front-loaded with the core concept, and each sentence provides distinct information. It is compact and free of fluff.
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?
The tool is simple with 2 optional parameters and no output schema. The description explains the parameter-driven behavior and a prerequisite, making it reasonably complete for this complexity. However, the lack of output format or error handling prevents a higher score.
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 100%, so baseline is 3. The description adds value by explaining the semantic meaning of each parameter combination: 'person' for trips, 'trip' for people, neither for all pairings. It also notes that person can be a partial name and trip is a slug, which aligns with the schema.
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 explains that this tool links trips and a people graph bidirectionally, with examples for each parameter combination. It distinguishes itself from sibling tools by focusing on the people graph rather than just location/trip data. However, it lacks a strong verb like 'list' or 'get', making the action slightly implicit.
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?
Usage is implied through the parameter examples: pass 'person' for trips shared, 'trip' for people tagged, neither for all pairings. It also notes a prerequisite (the optional people bridge). However, it does not explicitly mention when to prefer this tool over siblings or any exclusions.
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.
14 tool updates
v0.1.0- First observed
cities_visited - First observed
countries_visited - First observed
current_location - First observed
day - First observed
home - First observed
location_coverage - First observed
location_sql - First observed
records - First observed
stays - First observed
top_places - First observed
travel_stats - First observed
trip - First observed
trips - First observed
who_was_there
TDQS
Scored across 14 tools
Each tool targets a distinct query: current location, stay lists, city/country rollups, place rankings, trip lists/details, people links, day timeline, stats, records, home timeline, data coverage, and raw SQL. The boundaries are clear from the descriptions, so an agent can reliably select the right tool.
Tool names are all snake_case and readable, but they mix simple nouns (stays, trips, day, home) with compound descriptors (cities_visited, who_was_there, location_coverage). There is no consistent verb_noun or prefix pattern, though this inconsistency does not prevent comprehension.
With 14 tools, the set is well-scoped for a location memory server. Each tool earns its place by covering a distinct query type, and the count falls within the ideal 3-15 range.
The tool surface is thoroughly complete for its domain: current status, lists, aggregates, details, stats, extremes, home timeline, coverage gaps, and a raw SQL escape hatch. There are no obvious dead ends for common location-history questions.
Maintenance
Related MCP Connectors
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
Versioned agent memory in your own Postgres: portable context, permissioned, audit trail.
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Governed personal world model and memory for your AI agent. Pair once, connect over MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceSelf-hosted semantic memory for AI agents. Save worklogs, decisions, and notes via MCP, then recall them across sessions by meaning rather than keyword. Backed by Postgres + pgvector with local embeddings (multilingual-e5-base).1MIT
- AlicenseAqualityBmaintenanceA personal memory MCP server that ingests AI agent conversation logs from multiple platforms into a searchable PostgreSQL+pgvector database, enabling cross-session recall of past reasoning and decisions.6MIT
- AlicenseNot gradedqualityDmaintenanceA private, local-first MCP server that gives any AI long-term memory — its own diary. Zero models, zero network, zero subscription; smarter search than Notion, running entirely on your machine.MIT
- AlicenseAqualityBmaintenanceA local-first, privacy-first MCP server that passively indexes personal digital activity (screenshots, clipboard, notes, downloads, links) into a local database, enabling LLMs like Claude to access your context without cloud storage.4MIT