Vifo
Server Details
Travel notebook your AI agent writes from your photos and remarks over MCP.
- Status
- Healthy
- Uptime
- 61.1% over 38 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 30 tools
Each tool targets a distinct resource and action: uploads, media, remarks, timeline blocks, share links, and trip settings are cleanly separated. Even the several link-related tools (share vs upload vs show) have clearly different purposes and lifecycles.
The vast majority use a clear snake_case verb_noun pattern (create_trip, update_media, list_remarks, revoke_share_link). Minor deviations like account_status, learn, and search keep it from being perfectly uniform, but the convention is highly predictable overall.
Thirty tools is above the 25+ threshold and feels heavy for the apparent scope. While the domain is fairly broad, many tools could be consolidated, such as the three set_trip_* tools or the separate share/upload link operations.
The toolkit covers the main creation, reading, and updating workflows for trips, media, timeline blocks, and remarks. However, there are notable lifecycle gaps: no way to delete a trip, media item, timeline block, or remark, which leaves agents unable to undo mistakes or remove content.
Available Tools
53 toolsaccount_statusAccount statusARead-onlyInspect
This account's tier and quota usage. Check before large batch uploads so you can warn at the wall instead of failing halfway; also answers 'how much room do I have left'. A cap of null means unlimited on this tier.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation read-only, and the description adds meaningful context: the tool reports tier, quota usage, and the special meaning of a null cap (unlimited). It does not describe exact response fields, but for a simple read-only status tool the added context is adequate.
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 tight sentences with no filler. The core purpose is front-loaded, followed by a concrete usage trigger and the one non-obvious semantic detail (null cap). Every sentence 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?
For a parameterless read-only tool with no output schema, the description covers what it reports (tier and quota usage), why to call it (pre-flight check), and how to interpret an important value (null cap). It is complete enough for an agent to decide when to call it, though exact response fields are not enumerated.
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?
There are zero parameters, so there is no schema burden. The description goes beyond schema by explaining the meaning of the cap field (null means unlimited), which helps interpret results.
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?
Description clearly identifies the tool as reporting this account's tier and quota usage, with a specific use case (checking before large batch uploads). It distinguishes itself from sibling tools, none of which report account status or quota.
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?
Explicitly states when to check it: before large batch uploads, to warn at the quota wall rather than failing midway, and to answer 'how much room do I have left'. No exclusion or alternative is needed since no sibling tool serves this role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_blockAdd to timelineAInspect
Add one block to a trip's timeline. This is the only way to write to a timeline; a DAY_MARKER block separates days. Layouts and their payload shapes: learn('block_types').
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | See learn('block_types/<TYPE>'). | |
| badge | No | A short label for what kind of moment this is — a meal, a museum, checking in. Shown to readers, so name the occasion, not the data. | |
| payload | Yes | Content for this layout; shape depends on type. title / subtitle / text / caption / facts / badge are printed on the page and read by people who were not there, so write them in the traveller's language, not English. No field names or debugging traces, and no coordinates — the share page withholds those on purpose. The worked examples in learn('block_types') are written in English only to show the shape of each payload; your text goes in the traveller's language. See learn('voice'). | |
| trip_id | Yes | (must not be empty) | |
| sort_key | No | Manual ordering override; defaults to occurred_at_utc. | |
| client_id | Yes | Your own key for this block, so a retry does not create a duplicate. (must not be empty) | |
| tz_offset | No | Minutes east of UTC; defaults to the trip's own offset. | |
| occurred_at_utc | Yes | When this happened, epoch milliseconds UTC. Orders the timeline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false (not read-only, not idempotent, not destructive), and the description does not contradict them. It adds useful behavioral context: the DAY_MARKER rule for separating days and the fact that this is the sole write mechanism. It doesn't disclose retry semantics, but those are implied by idempotentHint=false and the client_id param in the schema. This is a reasonable amount of added context beyond the annotations.
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, zero filler. The purpose is front-loaded, the key domain rule (DAY_MARKER) is included, and the reference to learn is concise. Every clause 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?
For a tool with 8 params, a nested payload object, and an enum, the description is concise but sufficient because it defers to learn('block_types') for the complex payload details. It doesn't describe return values, but there's no output schema, so that's not required. It covers the core action and provides a clear path to the necessary knowledge.
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 each parameter described, so the schema carries the heavy lifting. The description adds value by pointing to learn('block_types') for payload shapes, which directly addresses the most complex parameter (payload). It also implicitly reinforces the client_id deduplication purpose by mentioning 'only way to write,' though it doesn't restate the schema details.
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 ('Add'), resource ('block'), and scope ('to a trip's timeline'). It also declares 'This is the only way to write to a timeline,' which distinguishes it from read-only siblings like get_timeline and update_block. This makes the tool's purpose unmistakable.
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 establishes when to use this tool: 'This is the only way to write to a timeline.' It also directs the agent to learn('block_types') for layout specifics, which is a clear pointer for payload construction. It doesn't mention alternatives for updating existing blocks, but given that it's the only write path, the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_personArchive personInspect
Archive a person with expected_version, preserving historical relationships. Self cannot be archived.
| Name | Required | Description | Default |
|---|---|---|---|
| person_id | Yes | (must not be empty, at most 200 characters) | |
| expected_version | Yes | (≥1) |
capture_remarkSave the traveller's words verbatimInspect
Write down what the traveller just said, verbatim. Remarks are the raw record of their words - about a photo, a meal, the trip itself - kept exactly as said. Do not polish, summarise or translate. Give trip_id (and media_ids if the words are about specific photos) when you know them; otherwise the remark waits in the pending pool for you to file later with file_remark.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The traveller's own words, exactly as said. Not a transcript of recorded audio - video speech-to-text lives on its own field, written by transcribe_video. | |
| trip_id | No | Omit if you do not know yet; file_remark can set it later. | |
| media_ids | No | The photos these words are about, if any. | |
| tz_offset | No | Minutes east of UTC where they said it, e.g. 540 for Tokyo, -300 for New York. Defaults to the trip's own offset. | |
| location_name | No | Where they were, in their words. | |
| occurred_at_utc | No | Epoch milliseconds UTC. Defaults to now - use it when they are recalling something earlier. | |
| speaker_person_id | No | (must not be empty) |
confirm_uploadFile an uploadInspect
Step two: the bytes are up, now file the media. A description is required — an entry with no words is not worth keeping. Pass the EXIF you parsed locally as structured fields. See learn('recipes/exif') for what each source value means.
| Name | Required | Description | Default |
|---|---|---|---|
| geo | No | Reverse-geocoded place. Normally you leave this out — send lat/lng and the server fills it. Kept separately from location_name. See learn('recipes/geocode'). | |
| lat | No | ||
| lng | No | ||
| exif | No | Any remaining EXIF fields, as JSON. | |
| credit | No | Required when provenance is 'reference'. | |
| source | No | Where this came in from, e.g. 'agent' or 'shortcut'. | |
| keywords | No | Space-separated search terms, in the traveller's language. | |
| media_id | Yes | From request_upload. (must not be empty) | |
| tz_offset | No | Minutes east of UTC at the place of capture (Tokyo 540, Paris 120). | |
| tz_source | No | Where tz_offset came from. 'assumed' means guessed from your own clock. See learn('recipes/exif'). | |
| provenance | No | 'reference' means someone else's picture and requires credit. | |
| description | Yes | What this shows. People read it — the traveller years from now, and friends who open the share link — so write it in the language the traveller speaks, not English. Be concrete: name the dish, the street, the light. (must not be empty) | |
| exif_source | No | ||
| orientation | No | EXIF Orientation, 1-8. | |
| location_name | No | What the traveller calls this place — a venue or landmark, not an administrative area. | |
| occurred_at_utc | No | Capture time, epoch milliseconds UTC. | |
| contributor_person_id | No | (must not be empty) |
create_experienceSave experienceInspect
Save a user-owned experience with at least one valid evidence source. Blocks expand their media dependencies. See learn('knowledge').
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | (must not be empty, at most 200 characters) | |
| origin | No | Explicit needs the user's remark as evidence; this is provenance, not confirmation. | |
| topics | No | (at most 20 items) | |
| sources | Yes | (at least 1 item, at most 50 items) | |
| summary | Yes | (must not be empty, at most 4000 characters) | |
| trip_id | No | ||
| city_key | No | (at most 200 characters) | |
| block_ids | No | Blocks using this knowledge; deleting them does not invalidate it. (at most 50 items) | |
| place_key | No | (at most 200 characters) | |
| tz_offset | No | (≥-840, ≤840) | |
| ended_at_utc | No | ||
| participants | No | (at most 50 items) | |
| location_name | No | (at most 200 characters) | |
| started_at_utc | No |
create_memorySave memoryInspect
Save a user-owned memory with at least one valid evidence source. Blocks expand their media dependencies. See learn('knowledge').
| Name | Required | Description | Default |
|---|---|---|---|
| origin | No | Explicit needs the user's remark as evidence; this is provenance, not confirmation. | |
| sources | Yes | (at least 1 item, at most 50 items) | |
| category | Yes | ||
| block_ids | No | Blocks using this knowledge; deleting them does not invalidate it. (at most 50 items) | |
| statement | Yes | (must not be empty, at most 4000 characters) | |
| topic_key | No | (at most 200 characters) | |
| subject_kind | No | ||
| subject_label | No | (at most 200 characters) | |
| subject_person_id | No | (must not be empty, at most 200 characters) |
create_personCreate personInspect
Create a person owned by your account. Duplicate names are allowed; select stable person_id when binding identity.
| Name | Required | Description | Default |
|---|---|---|---|
| aliases | No | (at most 20 items) | |
| display_name | Yes | (must not be empty, at most 100 characters) |
create_recall_questionnaireCreate recall questionsIdempotentInspect
Ask 1–3 high-value, source-backed questions for one trip. Returns a writable bearer recall link once; anyone holding it may answer. Never blocks trip editing or automatically updates knowledge. Learn recall first. Keep uncertain/no-impression choices and permit skipping.
| Name | Required | Description | Default |
|---|---|---|---|
| intro | No | (at most 1000 characters) | |
| title | Yes | (must not be empty, at most 200 characters) | |
| trip_id | Yes | ||
| questions | Yes | (at least 1 item, at most 3 items) | |
| expires_at | No | UTC milliseconds, default 7 days and maximum 30 days | |
| idempotency_key | Yes | (must not be empty, at most 200 characters) | |
| replace_existing | No | Explicitly revoke identical previous questionnaires and create a new link; preserves their answers |
create_tripStart a tripBInspect
Start a trip - one journey, one notebook. Photos and timeline blocks hang off it.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | What to call this trip, in the traveller's language. (must not be empty) | |
| end_date | No | YYYY-MM-DD. (must match ^\d{4}-\d{2}-\d{2}$) | |
| start_date | No | YYYY-MM-DD. (must match ^\d{4}-\d{2}-\d{2}$) | |
| default_tz_offset | No | Minutes east of UTC for this trip (Tokyo 540, Paris 120). Blocks inherit it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnly=false, idempotent=false, destructive=false). The description adds context that a trip acts as a notebook holding photos and timeline blocks, though it does not disclose behavioral details such as default date/timezone handling or duplicate-trip behavior.
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 short sentences with no filler. The action is front-loaded and the conceptual model is conveyed in one clause, so every phrase 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?
For a simple create-with-title tool with full schema coverage and annotation context, the description plus schema is sufficient for correct invocation. It provides useful anchoring of what a trip represents, though a short pointer to update_trip for later modifications would round it out.
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 title, end_date, start_date, and default_tz_offset all already described. The tool description adds no parameter-level meaning beyond the schema, 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 uses 'Start a trip' as the verb+resource and adds a conceptual model with 'one journey, one notebook,' making it clear this is the trip-creation entry point. It does not explicitly differentiate from update_trip, but 'start' versus update is reasonably distinct.
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 about when to use this tool versus alternatives like update_trip or set_trip_*. An agent must infer from the name alone that this is the creation operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_upload_linkOpen an upload linkInspect
Open an upload link for a trip, for one person. Use it whenever the photos are on the traveller's phone or were pasted into the chat where you cannot reach the bytes - this is the main road for getting photos in. Whoever holds it can send photos, videos and notes from a phone browser without signing in. Omit for to open the traveller's own link; give a name (for: 'Tom') to open a companion's - everything that arrives through it is recorded under that name, so you can credit it and decide what to curate. Opening again for the same person replaces the old link (it stops working at once). Links close by themselves after 30 days without use.
| Name | Required | Description | Default |
|---|---|---|---|
| for | No | Who this link is for, e.g. 'Tom'. Omit for the traveller's own link. (at most 40 characters) | |
| trip_id | Yes | (must not be empty) | |
| person_id | No | Stable ID from list_people; use it to distinguish same-name people. (must not be empty) |
file_remarkFile a remarkIdempotentInspect
File a remark: set which trip it belongs to, attach the photos it talks about, mark it processed. This tool cannot touch the text - remarks are verbatim and stay that way.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Defaults to 'filed' when the remark ends up with a trip. Filing without a trip is refused - words with no trip stay pending, where list_remarks can still find them. | |
| trip_id | No | The trip these words belong to. | |
| media_ids | No | The photos these words are about. Replaces the current list. | |
| remark_id | Yes | (must not be empty) | |
| speaker_person_id | No | (must not be empty) |
get_experienceRead experienceARead-onlyInspect
Read a experience with evidence and versions. Set include_inactive=true for a review bundle; inactive content must not be used for generation.
| Name | Required | Description | Default |
|---|---|---|---|
| experience_id | Yes | (must not be empty, at most 200 characters) | |
| include_inactive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral value beyond them: it discloses that inactive content is returned under a flag but must not be used for generation, a caveat an agent could not infer from the schema or annotations.
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 core action before the flag guidance, and nothing is padding. Minor grammar slip ('a experience') and no wasted clauses.
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 does state what comes back (evidence and versions) and flags the inactive-content caveat. It is nearly sufficient for a two-parameter read tool; only the relationship to list_experiences is left implicit.
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 50% – include_inactive has no schema description – and the description compensates by explaining exactly what that flag does and when to set it. The experience_id constraint is carried by the schema, so this is a net-positive contribution rather than a repeat.
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?
States a specific verb ('Read') and resource ('experience') and names what the payload contains ('evidence and versions'), which distinguishes it from list_experiences and the memory/timeline readers. However it never explicitly contrasts itself with the nearest sibling list_experiences, so it stops short of full sibling differentiation.
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?
Gives a concrete usage condition: set include_inactive=true when a review bundle is wanted, plus the constraint that inactive content must not be used for generation. It does not state when to prefer this over list_experiences or review_experience, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memoryRead memoryARead-onlyInspect
Read a memory with evidence and versions. Set include_inactive=true for a review bundle; inactive content must not be used for generation.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | (must not be empty, at most 200 characters) | |
| include_inactive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new context: the return contents (evidence and versions) and the constraint that inactive content is not valid for generation, which is real behavioral guidance.
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 tight sentences with no waste; the core action is front-loaded and the parameter guidance follows immediately.
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 2-param read tool with no output schema, the description covers the action, the key param, and the inactive-content caveat. It runs slightly short on explicit sibling differentiation but nothing needed to call it correctly is missing.
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 50%: memory_id has only constraint text and include_inactive has no description at all. The description compensates by explaining what include_inactive does (review bundle) and its downstream generation constraint, filling the gap the schema leaves.
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?
States a specific verb (read) and resource (memory) and adds that it returns evidence and versions, which distinguishes it from list_memories and create/update_memory. It doesn't explicitly contrast itself with the closest siblings like get_experience or review_memory.
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?
Gives clear conditional guidance: set include_inactive=true for a review bundle, and warns inactive content must not be used for generation. It doesn't state when to prefer this tool over siblings such as review_memory, but the parameter-level guidance is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_personRead personRead-onlyInspect
Read a person, including an archived historical identity. Does not enumerate memories or trips.
| Name | Required | Description | Default |
|---|---|---|---|
| person_id | Yes | (must not be empty, at most 200 characters) |
get_recall_answersRead recall answersRead-onlyInspect
Read answers changed since a questionnaire version and context_changes for source changes even without new answers. Includes raw supplements, source snapshots and link_holder/unverified attribution. Review changes before using existing knowledge tools; skipped questions are not preferences.
| Name | Required | Description | Default |
|---|---|---|---|
| since_version | No | (≥0) | |
| questionnaire_id | Yes |
get_recall_questionnaireRead recall questionsRead-onlyInspect
Read your recall definition, progress, current answers and source-change flags. Never returns a token or reconstructs its link.
| Name | Required | Description | Default |
|---|---|---|---|
| questionnaire_id | Yes |
get_timelineRead timelineARead-onlyInspect
Read a trip's timeline: every block with its full payload, plus a summary of the media it references. update_block replaces a payload whole, so read it from here before editing.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | One local day only, YYYY-MM-DD. (must match ^\d{4}-\d{2}-\d{2}$) | |
| limit | No | Default 50, max 200. | |
| cursor | No | next_cursor from the previous page. | |
| trip_id | Yes | (must not be empty) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the return content (full block payloads and media summaries) and the editorial workflow implication. It adds useful behavioral context without contradicting the annotations.
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 purpose and return contents, followed by a directly actionable caveat. Every clause contributes information and 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 read-only tool with a readOnlyHint and fully documented parameters, the description covers the key behavioral details and the read-before-edit workflow. It does not explicitly describe pagination, but limit and cursor are already documented in the schema.
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 documents all four parameters with full descriptions and constraints, so the description need not repeat them. The description adds no parameter-level detail beyond what the schema provides, earning the baseline score.
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 ('read'), identifies the resource ('a trip's timeline'), and details what is returned ('every block with its full payload, plus a summary of the media it references'). It also distinguishes itself from update_block by explaining the replacement semantics.
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 explicitly tells the agent to read from this tool before editing because update_block replaces a payload whole, which is clear usage guidance. It does not mention other siblings like list_media or get_trip_state, so it is not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_travel_contextRead travel contextRead-onlyInspect
Get current facts, preferences and optional history for a trip. History is a candidate, not an instruction to compare every block.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | (≥1, ≤20) | |
| query | No | (at most 4000 characters) | |
| topics | No | (at most 20 items) | |
| purpose | Yes | ||
| trip_id | Yes | (must not be empty, at most 200 characters) | |
| person_ids | No | (at most 10 items) |
get_trip_stateCheck trip progressARead-onlyInspect
Where a trip stands: how much is written, what is missing, whether it has a cover yet. Call this when picking a trip back up. media_quota says how many more photos or videos this trip can hold (cap null means unlimited) — check it before a big batch.
| Name | Required | Description | Default |
|---|---|---|---|
| trip_id | Yes | (must not be empty) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations have readOnlyHint=true and openWorldHint=false, so the tool is read-only. The description adds the media_quota cap semantics (cap null means unlimited), which is beyond annotations and gives important behavioral context for a trip capacity check. It doesn't contradict annotations. It also explains the media_quota field directly in the description, which is beyond the schema (schema only says 'must not be empty' for trip_id). This adds value for the agent, but it could be more explicit about what happens when a trip is not found (error behavior).
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, which is appropriately concise. It front-loads the purpose ('Where a trip stands') and then gives usage context. The media_quota detail is relevant but perhaps could be trimmed, but it's not excessive. Every sentence serves a purpose: the first describes the tool's output, the second gives usage guidance. It's 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?
Given the tool has one parameter (trip_id) and no output schema, the description covers the main relevant aspects: what the tool reports (progress, cover, media quota). The only missing piece is error behavior (e.g., invalid trip_id), but since the schema enforces non-empty, and the read-only nature is in annotations, this is sufficient for the agent to call it correctly. The description is complete for a simple check 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?
Schema description coverage is 100%, so the schema documents trip_id. The description does not elaborate on trip_id format, but it's a simple ID with a must-not-be-empty constraint. The description adds value by clarifying the media_quota field (a parameter-like construct) even though it's not in the input schema. Since the coverage is high, a baseline 3 applies, but the description adds context about the quota semantics, which nudges it to a 4.
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?
Description clearly states it checks trip progress: how much is written, what's missing, whether cover exists. It also mentions the media_quota field, which is a specific aspect. This is a specific verb+resource (check trip state) and the main purpose is unambiguous. The title is an adequate shorthand already, but the description adds specific details like cover and media_quota.
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?
Explicitly says 'Call this when picking a trip back up' and mentions to check media_quota before a big batch. This gives clear when-to-use guidance. It also differentiates from the start, though it doesn't explicitly say 'don't use for X', but the context of picking up a trip is specific enough. Words like 'where a trip stands' and 'before a big batch' give actionable scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_profileRead travel preferencesRead-onlyInspect
Read current travel, food and writing preferences for an active person; defaults to self. Same-topic items are retained; no generated profile summary.
| Name | Required | Description | Default |
|---|---|---|---|
| person_id | No | (must not be empty, at most 200 characters) |
learnHow this worksRead-onlyInspect
How Vifo works. Without a topic you get the index and an overview; with one you get that guide in full.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | One of: recall | people | knowledge | workflow | block_types | block_types/<TYPE> | media | pipeline | head | theme | voice | rules | recipes | recipes/<name>. Leave empty for the index. |
list_experiencesList experiencesRead-onlyInspect
Read experience resources, default active only. Explicit status=2/3 is inspection, not a task queue. Can reverse-query a source.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | (≥1, ≤100) | |
| query | No | (at most 4000 characters) | |
| topic | No | (must not be empty, at most 200 characters) | |
| cursor | No | ||
| status | No | ||
| trip_id | No | (must not be empty, at most 200 characters) | |
| person_id | No | (must not be empty, at most 200 characters) | |
| source_id | No | (must not be empty, at most 200 characters) | |
| source_kind | No |
list_mediaList photosRead-onlyInspect
List your photos and videos. Use it to find what still needs work: 'unclaimed' is the pool of media not yet in any trip, 'missing_description' is what came in from an upload link and has no words yet.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 50, max 200. | |
| cursor | No | Previous next_cursor; keep filter/trip_id unchanged. | |
| filter | No | Default 'all'. 'missing_geo' has coordinates but no place name yet. | |
| trip_id | No | Only media in this trip. |
list_memoriesList memoriesRead-onlyInspect
Read memory resources, default active only. Explicit status=2/3 is inspection, not a task queue. Can reverse-query a source.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | (≥1, ≤100) | |
| query | No | (at most 4000 characters) | |
| topic | No | (must not be empty, at most 200 characters) | |
| cursor | No | ||
| status | No | ||
| category | No | ||
| person_id | No | (must not be empty, at most 200 characters) | |
| source_id | No | (must not be empty, at most 200 characters) | |
| source_kind | No |
list_peopleList peopleRead-onlyInspect
List owned people with bounded pagination. Names and aliases are search hints; ambiguous names require selection.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | (≥1, ≤100) | |
| query | No | (at most 100 characters) | |
| cursor | No | (at most 4096 characters) | |
| include_archived | No |
list_remarksRead the traveller's wordsARead-onlyInspect
Read what the traveller said, verbatim. Default shows pending remarks - words nobody has processed yet, often typed on the upload page or sent by a companion through an upload link. Start here when organising: read them, quote what belongs on the page exactly, then file_remark each one.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 50, max 200. | |
| state | No | Default 'pending' - the ones still waiting for you. | |
| cursor | No | next_cursor from a previous page. | |
| trip_id | No | Only remarks filed to (or submitted through) this trip. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds value by explaining that remarks are returned verbatim and that the default is pending (unprocessed) remarks, which is useful context about the output content. It also clarifies the source of pending remarks (upload page or companion via upload link). No contradiction with annotations.
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. It front-loads the core action ('Read what the traveller said, verbatim'), then provides context on the default and the recommended workflow. Every clause serves a purpose, making it highly efficient and 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?
For a read-only list tool with no output schema, the description explains the content (verbatim remarks), the default filter (pending), and the intended use case (organising before filing). It doesn't explicitly describe the output structure or pagination, but the schema covers cursor and limit. The description is sufficient for an agent to understand the tool's role and how to invoke it correctly, though a bit more on the output shape would be ideal.
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% – all four parameters have descriptive comments. The description itself does not elaborate on parameter details, but it does reinforce the default state behavior ('Default shows pending remarks') which aligns with the state parameter default. Since the schema already documents the parameters, the description adds only marginal semantic value beyond the schema, warranting the baseline score of 3.
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: reading the traveller's remarks verbatim. It specifies the default behavior (pending remarks) and distinguishes it from related tools by mentioning the follow-up action of filing remarks, making it easy to tell apart from siblings like file_remark.
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 a clear workflow: 'Start here when organising' and then 'file_remark each one', which signals when to use this tool (the reading step) versus filing. It also implies that the state parameter controls whether you see pending or filed remarks, though it doesn't explicitly state when to use other tools. The guidance is strong but could be more explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tripsList tripsRead-onlyInspect
List your trips. Default order matches the traveller's own page exactly: trips with no dates come first - those are the ones still being filled in, usually the journey they are on right now - then dated trips, newest journey first. Use order='updated' to see what was touched most recently instead. Call this when you do not know a trip_id yet.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 20, max 100. | |
| order | No | 'date' (default): trips without dates first (still being filled in, most recently edited first), then by start date, newest first. 'updated': most recently edited first - handy for picking up where you left off. | |
| cursor | No | next_cursor from the previous page. Only valid with the same order it was issued under. | |
| person_id | No | Filter explicitly recorded trip participants. (must not be empty, at most 200 characters) |
request_uploadDeclare an uploadInspect
Step one of putting a file in: declare it and get upload URLs back (videos also get one for their cover frame). PUT the bytes, then call confirm_upload. Leave out trip_id when you do not know where it belongs yet — it waits in a pool. See learn('recipes/upload').
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | image or video; photo is a legacy alias for image. | |
| trip_id | No | Optional. Without it the file waits in the unclaimed pool. | |
| size_bytes | Yes | Size of the original file in bytes. | |
| content_hash | Yes | SHA-256 of the original bytes, lowercase hex. Used to skip re-uploading. (must not be empty) |
resolve_placeLook up a place nameARead-onlyInspect
Turn coordinates into a place name. The server queries and caches it, so you never call a geocoder yourself. Filing media with lat/lng does this automatically - reach for this tool when filling in old photos. It returns administrative levels; the landmark name is yours to write into location_name.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude, -90 to 90. | |
| lng | Yes | Longitude, -180 to 180. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true, so the read-only nature is known, but the description adds that the server queries and caches results ('you never call a geocoder yourself') and that it returns administrative levels while the landmark name is left for the user to write into location_name. This is useful behavioral context beyond annotations, though it doesn't detail response format.
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?
Three sentences, each purposeful: purpose, usage context/behavior, and output handling. The most important information (what it does) is front-loaded. No redundancy or 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 simple two-parameter read-only tool with no output schema, the description covers purpose, when to use, server-side behavior, and what the tool returns (administrative levels). It also clarifies that the landmark name must be written by the caller. Minor gap: exact structure of administrative levels is not specified, but this is acceptable given simplicity and annotations.
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 already documents lat and lng with ranges (100% coverage). The description does not add parameter-specific meaning beyond what the schema provides; it mentions 'lat/lng' in context but not new semantics. Baseline 3 is appropriate since schema handles parameter documentation.
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 ('Turn coordinates into a place name') with a clear resource (coordinates) and output (place name). It also distinguishes itself from sibling tools by noting that media filing does this automatically, making it the manual alternative for old photos. This is a precise, non-tautological statement.
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?
Explicitly says when to use: 'reach for this tool when filling in old photos' and clarifies that automatic filing already performs this task, implying a fallback scenario. It gives clear context and implicitly tells the agent not to use it when filing media automatically.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_personRestore personInspect
Restore an archived person with expected_version.
| Name | Required | Description | Default |
|---|---|---|---|
| person_id | Yes | (must not be empty, at most 200 characters) | |
| expected_version | Yes | (≥1) |
review_experienceVerify experienceInspect
Actively verify a experience. Valid review requires the chosen sources with observed_version from a fresh bundle; invalid needs a reason. Version conflicts roll back all changes.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | (must not be empty, at most 200 characters) | |
| origin | No | Explicit needs the user's remark as evidence; this is provenance, not confirmation. | |
| reason | No | (at most 4000 characters) | |
| topics | No | (at most 20 items) | |
| sources | No | (at least 1 item, at most 50 items) | |
| summary | No | (must not be empty, at most 4000 characters) | |
| trip_id | No | ||
| city_key | No | (at most 200 characters) | |
| decision | Yes | ||
| block_ids | No | Blocks using this knowledge; deleting them does not invalidate it. (at most 50 items) | |
| place_key | No | (at most 200 characters) | |
| tz_offset | No | (≥-840, ≤840) | |
| ended_at_utc | No | ||
| participants | No | (at most 50 items) | |
| experience_id | Yes | (must not be empty, at most 200 characters) | |
| location_name | No | (at most 200 characters) | |
| started_at_utc | No | ||
| expected_version | Yes | (≥1) |
review_memoryVerify memoryInspect
Actively verify a memory. Valid review requires the chosen sources with observed_version from a fresh bundle; invalid needs a reason. Version conflicts roll back all changes.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | No | Explicit needs the user's remark as evidence; this is provenance, not confirmation. | |
| reason | No | (at most 4000 characters) | |
| sources | No | (at least 1 item, at most 50 items) | |
| category | No | ||
| decision | Yes | ||
| block_ids | No | Blocks using this knowledge; deleting them does not invalidate it. (at most 50 items) | |
| memory_id | Yes | (must not be empty, at most 200 characters) | |
| statement | No | (must not be empty, at most 4000 characters) | |
| topic_key | No | (at most 200 characters) | |
| subject_kind | No | ||
| subject_label | No | (at most 200 characters) | |
| expected_version | Yes | (≥1) | |
| subject_person_id | No | (must not be empty, at most 200 characters) |
revoke_upload_linkRevoke an upload linkIdempotentInspect
Close an upload link. Omit for to close the traveller's own; give a name to close that person's; all: true closes every link on the trip.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Close every live link on this trip. | |
| for | No | Whose link to close. Omit for the traveller's own. (at most 40 characters) | |
| trip_id | Yes | (must not be empty) | |
| person_id | No | Stable ID from list_people or get_trip_state; can revoke an archived person's link. (must not be empty) |
searchSearchRead-onlyInspect
Find source media, remarks and journal blocks; for memories, experiences and preferences use get_travel_context. City/kind/date filters apply to media; trip applies to all results. Two independent parts: structured filters (trip, city, kind, date range) and an optional query word. The query is not a filter - it is the sort order. With a query you get the closest matches, ranked; without one you get everything the filters allow, in time order, with a cursor to page through all of it. For 'what did I eat this year' style questions, omit the query and set brief - you get a one-line catalogue to scan and group yourself, which no ranked search can do completely.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Reverse-geocoded city, e.g. Kyoto. Exact match. | |
| kind | No | Material type. Setting it also leaves remarks out - words are not media. | |
| brief | No | Return one compact line per item (id, local time, city, keywords) instead of full descriptions. Roughly a third of the tokens - use it whenever you are scanning rather than reading. | |
| limit | No | Default 20, max 200. | |
| query | No | What to look for, in the traveller's language. Omit it to enumerate rather than rank. | |
| cursor | No | From a previous response's next_cursor. Only meaningful without a query. | |
| to_utc | No | Epoch milliseconds UTC. | |
| trip_id | No | One trip; omit for all of them. | |
| from_utc | No | Epoch milliseconds UTC. |
set_experience_peopleSet experience participantsInspect
Replace the full experience participant set using expected_version. Does not infer feelings or preferences.
| Name | Required | Description | Default |
|---|---|---|---|
| participants | Yes | (at most 50 items) | |
| experience_id | Yes | (must not be empty, at most 200 characters) | |
| expected_version | Yes | (≥1) |
set_trip_endingWrite the closingAIdempotentInspect
Write the closing passage that ends a trip's page — what the journey left behind. It is not a second summary: the summary opens the page and tells a stranger what kind of trip this was, while the closing is read after they have been through all of it, so it can say the thing that only makes sense once you have seen the whole thing. Write it once the timeline is actually finished. If nothing comes to mind, leave it out - a forced ending reads worse than none.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Two or three sentences, printed at the very end of the page. Read by people, so write it in the traveller's language, not English. Ground it in what actually happened on this trip, not in travel-writing sentiment. (must not be empty) | |
| clear | No | Remove the closing instead of writing one. | |
| trip_id | Yes | (must not be empty) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context: it should be written in the traveller's language, grounded in actual trip events, and a forced ending is worse than none. This goes beyond annotations and helps the agent produce appropriate content.
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 and front-loaded with the core purpose. Each sentence adds value: the primary action, the contrast with summary, the timing requirement, and the quality guidance. No wasted words, and it flows logically.
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 three parameters are fully documented in the schema and the description explains the tool's role and usage conditions, it is largely complete. It doesn't explicitly mention the clear parameter for removing a closing, but the schema covers that. The description gives enough conceptual context for an agent to decide when and how to invoke it.
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 all parameters (text, clear, trip_id) are well-documented. The description does not add any parameter-specific semantics beyond the schema, but it does hint at the 'clear' concept via 'leave it out' (though it doesn't explicitly link to the parameter). Baseline of 3 is appropriate given full 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 clearly states the tool writes the closing passage for a trip's page, using a specific verb ('write') and resource ('closing passage'). It explicitly differentiates this from a summary, noting the summary opens the page while the closing comes after the whole journey is seen, which distinguishes it from sibling tools like set_trip_head or set_trip_theme.
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 clear context on when to use it: write it once the timeline is finished, and skip it if nothing comes to mind to avoid a forced ending. It also explains the distinction from the summary, which guides when not to use it for that purpose. However, it doesn't name other sibling tools like set_trip_head or set_trip_theme, but the summary contrast is a strong enough alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_trip_headSet cover and highlightsAIdempotentInspect
Set a trip's cover and highlights — the curated layer above the timeline. summary is the only original writing; the ref fields point at blocks that already exist. The first call needs all four fields; later calls may send only what changes. Read the current one from get_trip_state. Guidance: learn('head').
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | Cover layout. See learn('head') for what each one shows. | |
| replace | No | Replace the whole head instead of merging into it. Then all four fields are required. | |
| summary | No | Two or three sentences on what this trip turned out to be. Read by people, so write it in the traveller's language, not English. See learn('head'). (must not be empty) | |
| trip_id | Yes | (must not be empty) | |
| cover_refs | No | Block ids whose first photo makes the cover, in order. (at least 1 item, at most 5 items) | |
| highlight_refs | No | Block ids for the highlight strip; 3-5 works best. (at least 1 item, at most 5 items) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains key behaviors: summary is the only original writing, refs must point to existing blocks, and calls are merge-like after the first. This is valuable context that annotations alone do not provide, and it is consistent with readOnlyHint=false and idempotentHint=true.
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 compact and front-loaded, opening with purpose and then providing constraints, call pattern, and guidance. Every sentence earns its place and there is no filler or redundant restating of the title.
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?
Covers purpose, ref semantics, partial-update behavior, reading current state, and external guidance. Minor ambiguity remains about which four fields are required on the first call, and the replace behavior is only in the schema, but the overall definition is complete enough for such a complex 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?
Schema description coverage is 100%, so the baseline is 3. The description adds cross-parameter meaning by clarifying that ref fields reference existing blocks, that summary is original, and that partial updates are allowed after the first call. It does not repeat each parameter's schema text, which is appropriate.
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?
Description states a specific verb and resource: sets a trip's cover and highlights, and characterizes it as the curated layer above the timeline. This clearly separates it from siblings like set_trip_ending, set_trip_theme, and update_trip without needing to open schemas.
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?
Gives explicit workflow guidance: first call needs all four fields, later calls may send only changes, and the current head should be read via get_trip_state. It also points to learn('head') for further guidance. It does not explicitly state when not to use this tool versus alternatives, but the usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_trip_peopleSet trip participantsInspect
Replace the full trip participant set using expected_people_version. Membership does not imply participation in every experience.
| Name | Required | Description | Default |
|---|---|---|---|
| trip_id | Yes | (must not be empty, at most 200 characters) | |
| participants | Yes | (at most 50 items) | |
| expected_people_version | Yes | (≥1) |
set_trip_themeRestyle the pageAIdempotentInspect
Restyle one trip's page within a fixed set of tokens — colours, heading face, photo treatment. Colours are checked for contrast and rejected if unreadable. Send only the tokens you want to change. Full list: learn('theme').
| Name | Required | Description | Default |
|---|---|---|---|
| tokens | Yes | ||
| replace | No | Replace the whole theme instead of merging; unsent tokens go back to default. | |
| trip_id | Yes | (must not be empty) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that colours are contrast-checked and rejected if unreadable, and that styling is constrained to a fixed set of tokens. This adds meaningful runtime behavior; it does not contradict the idempotent or non-destructive hints.
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?
Four short sentences, each earning its place: the action, the token scope, the validation behavior, and the way to get the full list. No filler 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 moderately complex tool with nested token objectsys, the description covers the key behavioral and partial-update aspects and directs the agent to learn('theme') for the authoritative token list. The schema covers the remaining parameter details, and no output schema is required for a restyle operation.
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 description adds useful partial-update semantics ('Send only the tokens you want to change') and categorizes tokens as colours, heading face, and photo treatment. However, the schema already documents most parameters, and the description does not explain the replace flag or individual token constraints.
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?
States a specific verb ('Restyle') and resource ('one trip's page') and scopes the work to a fixed set of tokens. This clearly separates it from sibling tools like set_trip_head or set_trip_ending, which target different aspects of a trip.
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?
Gives an explicit usage rule ('Send only the tokens you want to change') and points to learn('theme') for the full token list. It does not explicitly contrast with sibling tools, but the purpose statement and sibling names make the appropriate context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_mediaShow items to the travellerAIdempotentInspect
Show the traveller a set of their own photos and videos: a short-lived link, no sign-in needed. Use it when you want them to look before you decide — 'are these three from the Kyoto trip?', 'here is what is still unfiled', 'day 3 in the order I have it', or the results of a search. Pick the scope with exactly one of three: media_ids (the ones search or list_media returned, in the order you want them shown), trip_id (everything in that trip, narrowable with from/to), or unfiled: true (everything not filed into a trip yet — use this rather than listing the unclaimed pool and passing its ids back). Each item carries a number so they can answer 'the 2nd and 5th'. Not a share link: this is for the owner, read-only, expires in 24 hours (1–72), and shows raw material rather than the finished trip. Calling again with the same selection returns the same link while it is live, with the new note on it — so ask your next question by calling again, not by sending the old address with a new question in the chat.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | YYYY-MM-DD, inclusive. Only with trip_id. | |
| from | No | YYYY-MM-DD, inclusive, local to the photo. Only with trip_id. | |
| note | No | Shown at the top of the page — the question you want answered. (at most 500 characters) | |
| trip_id | No | Everything in this trip; narrow with from/to. A live view: the page re-reads the trip every time it is opened, so material added later shows up and material moved out or deleted disappears. (must not be empty) | |
| unfiled | No | Pass true for everything not filed into a trip yet. Only true is a selection — there is no unfiled: false; to show something else, leave this out and give media_ids or trip_id. A live view: the page re-reads the pool every time it is opened, so anything filed into a trip in the meantime drops off it. | |
| media_ids | No | Specific items, in the order to show them. (at least 1 item, at most 200 items) | |
| ttl_hours | No | Default 24. (≥1, ≤72) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors beyond annotations: link expiry (24 hours, 1–72), no sign-in needed, live-view behavior for trip_id and unfiled, item numbering, and idempotent regeneration with the same link and updated note. This complements the idempotentHint annotation and clarifies the read-only nature of the resulting page.
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 long but dense and front-loaded with the core purpose. It uses examples and clear scope rules; some sentences could be tightened, but each contributes either usage guidance, behavioral context, or a distinction from alternatives.
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?
Despite having no output schema, the description conveys what the agent gets back: a short-lived link, the same link on repeat calls, item numbering for reference, and the note display. It also addresses authentication, expiry, and live-view behavior, making it sufficiently complete for correct invocation.
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 covers all parameters at 100%, but the description adds selection semantics: exactly one of media_ids, trip_id, or unfiled:true, ordering for media_ids, and why unfiled:true is preferable to passing a pool of ids. This goes beyond the schema's per-parameter descriptions without duplicating them.
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 and resource: 'Show the traveller a set of their own photos and videos: a short-lived link, no sign-in needed.' It clearly distinguishes itself from share links and other siblings by emphasizing this is for the owner, read-only, and temporary.
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 gives explicit when-to-use guidance ('Use it when you want them to look before you decide') with concrete examples, and provides exclusions: 'Not a share link' and 'use unfiled rather than listing the unclaimed pool and passing its ids back.' It also names related tools like search and list_media, making the choice of scope clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_videoTranscribe a videoAIdempotentInspect
Transcribe what is said in a video. Not done automatically — ask for it only when the traveller wants what was said kept, because a travel video's audio often catches other people talking, and turning that into a written record is a different thing from keeping the video. The transcript is stored on the media and returned to you; it is raw speech-to-text, so treat it as material to write from, not as finished text for the page.
| Name | Required | Description | Default |
|---|---|---|---|
| redo | No | Transcribe again even if there is already a transcript. | |
| media_id | Yes | (must not be empty) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the transcript is 'stored on the media and returned', adding a side-effect beyond the annotations. It also warns the output is 'raw speech-to-text' and should be treated as source material, which is useful for how the agent handles the result.
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?
Three sentences, each carrying a distinct function: purpose, usage condition, and output/behavior. No redundant phrasing, and the core purpose is front-loaded.
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 two-parameter tool with annotations for idempotence and destructiveness, the description covers the key behavioral facts: when to invoke, what gets stored, and what the returned data is like. The lack of an output schema is mitigated by the explicit statement that the transcript is returned.
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 fully documents both parameters (media_id, redo) with descriptions, so the description does not need to repeat them. The description adds no parameter-level detail, so baseline 3 is appropriate.
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?
States a specific verb+resource ('Transcribe what is said in a video') and immediately clarifies it is a written-record operation, not just video handling. This differentiates it from sibling media tools like view_media or update_media, so an agent can identify when this tool is relevant.
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?
Explicitly conditions use: 'ask for it only when the traveller wants what was said kept' and says it is 'Not done automatically'. It also contrasts transcription with 'keeping the video', giving a clear when-not-to-use signal without needing a sibling name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_blockEdit a timeline blockAIdempotentInspect
Edit one timeline block: its content, badge or time, or switch it to a different layout (pass type together with a payload matching that layout). The payload replaces the old one whole, so read it with get_timeline first.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only when switching layout; payload must come with it and match. | |
| badge | No | ||
| payload | No | Replaces the old payload entirely. title / subtitle / text / caption / facts / badge are printed on the page and read by people who were not there, so write them in the traveller's language, not English. No field names or debugging traces, and no coordinates — the share page withholds those on purpose. The worked examples in learn('block_types') are written in English only to show the shape of each payload; your text goes in the traveller's language. See learn('voice'). | |
| trip_id | Yes | (must not be empty) | |
| block_id | Yes | (must not be empty) | |
| sort_key | No | ||
| tz_offset | No | ||
| occurred_at_utc | No | ||
| expected_version | Yes | The version you read. A mismatch is rejected so you cannot overwrite someone else's edit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as non-read-only, non-destructive, and idempotent. The description adds valuable behavior beyond that: the payload replaces the old one whole, and switching layout requires type plus a matching payload. This warns the agent about an important side effect without contradicting the annotations.
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 tight sentences with no filler. The most important behavioral fact, full payload replacement, is placed early and immediately followed by the required precondition.
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 complex 9-parameter mutation with a nested payload and no output schema, the description plus schema covers the core flow: fetching current state first, replacing the payload, switching layouts, and version guarding. It is not fully complete—return behavior and sort_key semantics are not addressed—but it is strong enough for correct invocation in most 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?
Schema description coverage is only 56%, so the description needs to compensate. It does clarify payload semantics and the type/payload relationship, and 'badge or time' maps to some fields. However, it leaves sort_key, tz_offset, and occurred_at_utc semantics largely implicit, so the low coverage is not fully compensated.
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 opens with a specific verb and resource, 'Edit one timeline block', and enumerates the editable aspects: content, badge, time, or layout. This clearly separates it from siblings like add_block and get_timeline.
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 gives an explicit precondition: 'read it with get_timeline first', which is essential before replacing a payload. It does not explicitly name alternatives or when-not-to-use cases, but the edit-vs-add distinction is strongly implied by the wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_experienceEdit experienceInspect
Edit a experience using expected_version; changed knowledge needs review before use. You cannot directly set status.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | (must not be empty, at most 200 characters) | |
| origin | No | Explicit needs the user's remark as evidence; this is provenance, not confirmation. | |
| topics | No | (at most 20 items) | |
| sources | No | (at least 1 item, at most 50 items) | |
| summary | No | (must not be empty, at most 4000 characters) | |
| trip_id | No | ||
| city_key | No | (at most 200 characters) | |
| block_ids | No | Blocks using this knowledge; deleting them does not invalidate it. (at most 50 items) | |
| place_key | No | (at most 200 characters) | |
| tz_offset | No | (≥-840, ≤840) | |
| ended_at_utc | No | ||
| participants | No | (at most 50 items) | |
| experience_id | Yes | (must not be empty, at most 200 characters) | |
| location_name | No | (at most 200 characters) | |
| started_at_utc | No | ||
| expected_version | Yes | (≥1) |
update_mediaEdit photo detailsIdempotentInspect
Edit one photo or video: claim it into a trip, rewrite its description, or correct its time, place, crop and rotation. When you correct a timestamp or coordinates, correct exif_source / tz_source in the same call — the value and the evidence for it must stay consistent.
| Name | Required | Description | Default |
|---|---|---|---|
| geo | No | Reverse-geocoded place. Normally filled by the server from lat/lng — you rarely set it. See learn('recipes/geocode'). | |
| lat | No | ||
| lng | No | ||
| crop | No | Crop, two forms: an explicit rectangle {x,y,w,h} in 0-1 fractions from the top-left, or {aspect, gravity} to let the server frame it. null clears the crop. See learn('media'). | |
| focal | No | Subject position as {x,y} in 0-1 fractions. Layouts frame around it instead of the centre. Does not alter the image. | |
| credit | No | Where a reference image came from. | |
| rotate | No | Clockwise degrees; null clears rotation. EXIF orientation is already applied; use this only for a deliberate turn. | |
| preview | No | Return the cropped result for you to look at (default true). Turn off for batch edits. | |
| trip_id | No | Claim this media into one of your trips. Unclaimed media sits in a pool until then. | |
| keywords | No | Space-separated search terms, in the traveller's language. | |
| media_id | Yes | (must not be empty) | |
| tz_offset | No | Minutes east of UTC at the place of capture (Tokyo 540, Paris 120). | |
| tz_source | No | Where tz_offset came from. Set to 'given' once you supply a real one. | |
| provenance | No | 'reference' means someone else's picture and requires credit. Switching back to 'own' clears credit. | |
| description | No | What this shows. People read it — the traveller years from now, and friends who open the share link — so write it in the language the traveller speaks, not English. Be concrete: name the dish, the street, the light. Empty is rejected. | |
| exif_source | No | Where the time and coordinates came from. See learn('recipes/exif'). | |
| location_name | No | What the traveller calls this place — a venue or landmark. Reverse geocoding fills geo separately. | |
| occurred_at_utc | No | Capture time, epoch milliseconds UTC. | |
| contributor_person_id | No | (must not be empty) |
update_memoryEdit memoryInspect
Edit a memory using expected_version; changed knowledge needs review before use. You cannot directly set status.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | No | Explicit needs the user's remark as evidence; this is provenance, not confirmation. | |
| sources | No | (at least 1 item, at most 50 items) | |
| category | No | ||
| block_ids | No | Blocks using this knowledge; deleting them does not invalidate it. (at most 50 items) | |
| memory_id | Yes | (must not be empty, at most 200 characters) | |
| statement | No | (must not be empty, at most 4000 characters) | |
| topic_key | No | (at most 200 characters) | |
| subject_kind | No | ||
| subject_label | No | (at most 200 characters) | |
| expected_version | Yes | (≥1) | |
| subject_person_id | No | (must not be empty, at most 200 characters) |
update_personEdit personInspect
Edit a person name or aliases with expected_version. Historical attribution and sender snapshots retain their identity.
| Name | Required | Description | Default |
|---|---|---|---|
| aliases | No | (at most 20 items) | |
| person_id | Yes | (must not be empty, at most 200 characters) | |
| display_name | No | (must not be empty, at most 100 characters) | |
| expected_version | Yes | (≥1) |
update_tripEdit tripBIdempotentInspect
Rename a trip or correct its dates and default timezone.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | (must not be empty) | |
| trip_id | Yes | (must not be empty) | |
| end_date | No | (must match ^\d{4}-\d{2}-\d{2}$) | |
| start_date | No | (must match ^\d{4}-\d{2}-\d{2}$) | |
| default_tz_offset | No | Minutes east of UTC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about what can be changed but doesn't disclose additional behaviors like validation between start/end dates or partial-update semantics. Since annotations are strong, the description's marginal value is sufficient for a 3.
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?
A single, front-loaded sentence with zero redundancy. It names the three key actions (rename, correct dates, correct timezone) efficiently. Slightly more specific language about partial updates would push it higher, but it's already concise and 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?
The tool has 5 parameters but only one required, and no output schema. The description explains the purpose but doesn't cover edge cases like what happens if only end_date is provided, validation between start/end dates, or the meaning of default_tz_offset (though the schema defines it). For a mutation tool with multiple optional fields, this is a moderate gap.
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 100% coverage with descriptions for all five parameters. The description groups them (title, dates, timezone) which adds minor organization but no new semantic meaning beyond the schema. It doesn't hint at relationships between fields (e.g., date ordering). Baseline 3 is appropriate when the schema carries the bulk of the load.
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 clear verb ('rename/correct') and resource ('trip'), and specifies the exact attributes (title, dates, default timezone). It distinguishes from sibling tools like create_trip, update_block, and set_trip_ending, though it doesn't explicitly name a sibling as an alternative.
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 this tool (to rename or correct a trip's dates/timezone) but doesn't explicitly contrast it with siblings like set_trip_ending or set_trip_head, which modify specific fields. An agent would infer usage from context but without explicit exclusions, it's adequate but not exceptional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upgrade_linkUpgrade linkAInspect
Generate a Paddle checkout link for upgrading THIS account to Plus (no sign-in needed). The link is tied to this account only; the response names the account (masked email) — tell the traveller. Only call when the user explicitly asks to upgrade or after a quota error told you to offer it. plan: monthly ($6.9) or yearly ($39.9).
| Name | Required | Description | Default |
|---|---|---|---|
| plan | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, idempotentHint=false, openWorldHint=true), providing little behavioral info. The description adds crucial context: the link is tied to this account only, the response names the account (masked email) and instructs to tell the traveller. It is non-idempotent but doesn't detail side effects (e.g., generating a unique link), but given the context, this is sufficient.
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 compact: 3 sentences, front-loading the core action and key constraint (no sign-in needed), then usage conditions and plan details. Every sentence adds value: purpose, behavior, when-to-use, and parameters. 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?
Given the tool's simplicity (1 parameter, no output schema), the description covers the essential elements: what it does, when to use it, the plan options with pricing, and the behavioral nuance (account-tied link). The only minor gap is not describing the response format fully, but it mentions the masked email. It's complete enough for an agent to call 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 schema has only one parameter (plan) with an enum, so it's fully specified in the schema. The description adds pricing details ($6.9/$39.9) which help the agent communicate, but the parameter semantics are already clear from the enum. Since schema coverage is 0% but the parameter is self-explanatory, the baseline is 3.
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 verb (generate) and resource (Paddle checkout link for upgrading THIS account to Plus), and adds a key differentiator: no sign-in needed. It distinguishes itself from sibling tools like create_share_link and create_upload_link by specifying the upgrade context.
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 conditions: 'Only call when the user explicitly asks to upgrade or after a quota error told you to offer it.' This gives clear when-to-use guidance and implicitly excludes other scenarios. It also specifies the plan parameter options (monthly/yearly) with pricing, helping the agent decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_mediaLook at photosARead-onlyInspect
Look at the pictures themselves, with their time and place attached — you can only describe what you have seen. Name specific media_ids, or give a trip_id to pull a batch. Videos come back as their cover frame. The images enter your model's context; the server runs no image analysis of its own.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 6. | |
| width | No | Default 400; ask for 800 only to check detail. | |
| filter | No | With trip_id. Default 'missing_description'. | |
| trip_id | No | Pull a batch from this trip instead. | |
| media_ids | No | Up to 6. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the readOnlyHint annotation: images enter the model's context, the server runs no image analysis itself, videos return as cover frames, and metadata (time and place) is attached. This tells the agent exactly what to expect from the call and how to interpret results.
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?
Three tight, front-loaded sentences cover purpose, usage, and behavior with zero redundancy. Every sentence earns its place, and the most important information (what the tool does) leads off.
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 sufficiently explains what the agent receives (images, metadata, cover frames) and how to request them (media_ids or trip_id). It also states the no-analysis limitation, which is critical for the agent to know it must interpret images itself. Nothing essential is missing.
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 minor value by explaining the relationship between media_ids and trip_id ('Name specific media_ids, or give a trip_id to pull a batch') and the concept of batching, but does not add significant meaning beyond what the schema already defines.
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 'Look at the pictures themselves' – a specific verb and resource – and clarifies that it returns actual media content with time and place attached. This distinguishes it from listing tools like list_media (metadata only) and conveys its core function clearly.
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 gives clear usage instructions: name specific media_ids or provide trip_id for a batch, and notes the 'filter' option with trip_id. While it implies this is for viewing actual content ('you can only describe what you have seen'), it does not explicitly name alternatives or state when not to use this tool, leaving some inference to the agent.
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.
4 tool updates
- Added
create_recall_questionnaire - Added
get_recall_answers - Added
get_recall_questionnaire - Changed
learn1 field changed- changed
Input schema / properties / topic / descriptionPrevious value: -"One of: people | knowledge | workflow | block_types | block_types/<TYPE> | media | pipeline | head | theme | voice | rules | recipes | recipes/<name>. Leave empty for the index."New value: +"One of: recall | people | knowledge | workflow | block_types | block_types/<TYPE> | media | pipeline | head | theme | voice | rules | recipes | recipes/<name>. Leave empty for the index."
28 tool updates
- Added
archive_person - Changed
capture_remark1 field changed- added
Input schema / properties / speaker_person_idAdded value: +{ + "description": "(must not be empty)", + "type": "string" +}
- Changed
confirm_upload1 field changed- added
Input schema / properties / contributor_person_idAdded value: +{ + "description": "(must not be empty)", + "type": "string" +}
- Changed
create_experience1 field changed- added
Input schema / properties / participantsAdded value: +{ + "description": "(at most 50 items)", + "items": { + "additionalProperties": false, + "properties": { + "person_id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "role": { + "enum": [ + "participant", + "guide", + "local_contact", + "other" + ], + "type": "string" + } + }, + "required": [ + "person_id", + "role" + ], + "type": "object" + }, + "type": "array" +}
- Changed
create_memory1 field changed- added
Input schema / properties / subject_person_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Added
create_person - Changed
create_upload_link1 field changed- added
Input schema / properties / person_idAdded value: +{ + "description": "Stable ID from list_people; use it to distinguish same-name people. (must not be empty)", + "type": "string" +}
- Changed
file_remark1 field changed- added
Input schema / properties / speaker_person_idAdded value: +{ + "description": "(must not be empty)", + "type": [ + "string", + "null" + ] +}
- Added
get_person - Changed
get_travel_context1 field changed- added
Input schema / properties / person_idsAdded value: +{ + "description": "(at most 10 items)", + "items": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "type": "array" +}
- Changed
get_user_profile1 field changed- added
Input schema / properties / person_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Changed
learn1 field changed- changed
Input schema / properties / topic / descriptionPrevious value: -"One of: knowledge | workflow | block_types | block_types/<TYPE> | media | pipeline | head | theme | voice | rules | recipes | recipes/<name>. Leave empty for the index."New value: +"One of: people | knowledge | workflow | block_types | block_types/<TYPE> | media | pipeline | head | theme | voice | rules | recipes | recipes/<name>. Leave empty for the index."
- Changed
list_experiences1 field changed- added
Input schema / properties / person_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Changed
list_media1 field changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Previous next_cursor; keep filter/trip_id unchanged.", + "type": "string" +}
- Changed
list_memories1 field changed- added
Input schema / properties / person_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Added
list_people - Changed
list_trips1 field changed- added
Input schema / properties / person_idAdded value: +{ + "description": "Filter explicitly recorded trip participants. (must not be empty, at most 200 characters)", + "type": "string" +}
- Changed
request_upload2 fields changed- added
Input schema / properties / kind / descriptionAdded value: +"image or video; photo is a legacy alias for image." - changed
Input schema / properties / kind / enumPrevious value: -[ - "image", - "video" -]New value: +[ + "image", + "video", + "photo" +]
- Added
restore_person - Changed
review_experience1 field changed- added
Input schema / properties / participantsAdded value: +{ + "description": "(at most 50 items)", + "items": { + "additionalProperties": false, + "properties": { + "person_id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "role": { + "enum": [ + "participant", + "guide", + "local_contact", + "other" + ], + "type": "string" + } + }, + "required": [ + "person_id", + "role" + ], + "type": "object" + }, + "type": "array" +}
- Changed
review_memory1 field changed- added
Input schema / properties / subject_person_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Changed
revoke_upload_link1 field changed- added
Input schema / properties / person_idAdded value: +{ + "description": "Stable ID from list_people or get_trip_state; can revoke an archived person's link. (must not be empty)", + "type": "string" +}
- Added
set_experience_people - Added
set_trip_people - Changed
update_experience1 field changed- added
Input schema / properties / participantsAdded value: +{ + "description": "(at most 50 items)", + "items": { + "additionalProperties": false, + "properties": { + "person_id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "role": { + "enum": [ + "participant", + "guide", + "local_contact", + "other" + ], + "type": "string" + } + }, + "required": [ + "person_id", + "role" + ], + "type": "object" + }, + "type": "array" +}
- Changed
update_media4 fields changed- added
Input schema / properties / contributor_person_idAdded value: +{ + "description": "(must not be empty)", + "type": [ + "string", + "null" + ] +} - changed
Input schema / properties / rotate / descriptionPrevious value: -"Clockwise degrees. EXIF orientation is already applied; use this only for a deliberate turn."New value: +"Clockwise degrees; null clears rotation. EXIF orientation is already applied; use this only for a deliberate turn." - changed
Input schema / properties / rotate / enumPrevious value: -[ - 90, - 180, - 270 -]New value: +[ + 90, + 180, + 270, + null +] - changed
Input schema / properties / rotate / typePrevious value: -"number"New value: +[ + "number", + "null" +]
- Changed
update_memory1 field changed- added
Input schema / properties / subject_person_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Added
update_person
13 tool updates
- Added
create_experience - Added
create_memory - Added
get_experience - Added
get_memory - Added
get_travel_context - Added
get_user_profile - Changed
learn1 field changed- changed
Input schema / properties / topic / descriptionPrevious value: -"One of: workflow | block_types | block_types/<TYPE> | media | pipeline | head | theme | voice | rules | recipes | recipes/<name>. Leave empty for the index."New value: +"One of: knowledge | workflow | block_types | block_types/<TYPE> | media | pipeline | head | theme | voice | rules | recipes | recipes/<name>. Leave empty for the index."
- Added
list_experiences - Added
list_memories - Added
review_experience - Added
review_memory - Added
update_experience - Added
update_memory
30 tool updates
- First observed
account_status - First observed
add_block - First observed
capture_remark - First observed
confirm_upload - First observed
create_share_link - First observed
create_trip - First observed
create_upload_link - First observed
file_remark - First observed
get_timeline - First observed
get_trip_state - First observed
learn - First observed
list_media - First observed
list_remarks - First observed
list_trips - First observed
request_upload - First observed
resolve_place - First observed
revoke_share_link - First observed
revoke_upload_link - First observed
search - First observed
set_trip_ending - First observed
set_trip_head - First observed
set_trip_theme - First observed
show_media - First observed
transcribe_video - First observed
update_block - First observed
update_media - First observed
update_share_link - First observed
update_trip - First observed
upgrade_link - First observed
view_media
Related MCP Connectors
Multilingual travel guides, gear picks and booking links for AI travel agents.
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Travel tools for AI agents: plan and edit real trips, search stays and tours, import travel videos.
- TravolpOAuthcom.travolp
Travel planner: create, edit, and explore trip itineraries from your Travolp AI assistant.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables travel-related queries and planning including weather, train and flight information, itinerary generation, and travel knowledge retrieval via RAG, using an AI agent with MCP protocol.-

autonomad-travelofficial
AlicenseAqualityDmaintenanceAI travel agent over MCP — live flights, hotels, activities, and events worldwide, then completes the booking on autonomad.ai.8112 npm2MIT- FlicenseNot gradedqualityCmaintenanceConnects any MCP-capable assistant to your personal travel journal over a hosted remote endpoint, letting you review past and upcoming trips, see lifetime travel stats, find photos by description, and add, import or edit bookings, stays, activities and expenses.-
- FlicenseNot gradedqualityBmaintenanceEnables an AI companion to take a small solo trip to a real, specific place, choosing its own steps over 4–10 rounds and then writing its own travelogue and picking one thing to bring home. Each journey becomes a station on a self-hosted roadbook map with coordinates, the traveler's own words, their souvenir, and a matching photo, with unfinished trips never lost and no ghostwriting by the engine.-
Glama MCP Gateway
Add one secure layer between your agents and this server.