Vifo
Server Details
Travel notebook your AI agent writes from your photos and remarks over MCP.
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 48.5% over 59 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 59 tools
The set contains many parallel resource families (experience/memory CRUD, trip state/context/profile, share/upload links, wrapped tools) that are conceptually distinct but easy to confuse. Descriptions are detailed, but the breadth of 59 tools makes misselection likely, especially between near-identical create/get/update/review pairs for experiences and memories.
Names are mostly snake_case and often follow verb_noun patterns (create_trip, get_timeline, update_media), but there are notable deviations like account_status, search, learn, and inconsistent wrapped naming (get_trip_wrapped, publish_trip_wrapped, save_trip_wrapped, manage_wrapped_link). The convention is readable but not uniform.
59 tools is far beyond a typical well-scoped toolset and creates a heavy surface for any agent. While the domain is broad, many operations are specialized variants of the same lifecycle, so the count feels excessive and harmful to coherence.
The surface covers trips, timeline blocks, media, people, knowledge, recall, sharing, uploads, wrapped publishing, search, transcription, and account upgrade, which is unusually complete. Some lifecycle gaps remain (e.g., no clear delete/archive for trips, media, or blocks), but core workflows are covered.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
- Changed
capture_remark1 field changed- added
Input schema / properties / confirmation_reasonAdded value: +{ + "description": "Nonblank owner confirmation for selected identity; required when correcting identity. (must not be empty, at most 2000 characters)", + "type": "string" +}
- Changed
confirm_upload1 field changed- added
Input schema / properties / confirmation_reasonAdded value: +{ + "description": "Explicit owner confirmation for selected contributor_person_id, which must be supplied together with this reason; does not identify photographer or depicted people. (must not be empty, at most 2000 characters)", + "type": "string" +}
- Changed
create_person2 fields changed- added
Input schema / properties / alias_recordsAdded value: +{ + "description": "(at most 20 items)", + "items": { + "additionalProperties": false, + "properties": { + "alias": { + "description": "(must not be empty, at most 100 characters)", + "type": "string" + }, + "confirmation_reason": { + "description": "(must not be empty, at most 1000 characters)", + "type": "string" + }, + "expected_version": { + "description": "(≥1)", + "type": "integer" + }, + "id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "scope": { + "enum": [ + "global", + "trip" + ], + "type": "string" + }, + "source": { + "enum": [ + "user_confirmed", + "imported", + "agent_inferred" + ], + "type": "string" + }, + "status": { + "enum": [ + "confirmed", + "candidate", + "rejected" + ], + "type": "string" + }, + "trip_id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + } + }, + "required": [ + "alias", + "scope", + "source", + "status" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / request_keyAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Changed
create_upload_link1 field changed- added
Input schema / properties / request_keyAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Changed
file_remark2 fields changed- added
Input schema / properties / confirmation_reasonAdded value: +{ + "description": "Nonblank owner confirmation for selected identity; required when correcting identity. (must not be empty, at most 2000 characters)", + "type": "string" +} - added
Input schema / properties / expected_source_versionAdded value: +{ + "description": "Required observed semantic source version for unlinked identity correction. (≥1)", + "type": "integer" +}
- Changed
get_person1 field changed- added
Input schema / properties / trip_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Changed
list_people1 field changed- added
Input schema / properties / trip_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +}
- Added
rebind_person_attribution - Changed
set_trip_people1 field changed- added
Input schema / properties / participants / items / properties / display_name_snapshotAdded value: +{ + "description": "(must not be empty, at most 100 characters)", + "type": "string" +}
- Changed
update_media2 fields changed- added
Input schema / properties / confirmation_reasonAdded value: +{ + "description": "Required nonblank owner reason for identity correction. (must not be empty, at most 2000 characters)", + "type": "string" +} - added
Input schema / properties / expected_source_versionAdded value: +{ + "description": "Required observed semantic source version for unlinked identity correction. (≥1)", + "type": "integer" +}
- Changed
update_person1 field changed- added
Input schema / properties / alias_recordsAdded value: +{ + "description": "(at most 20 items)", + "items": { + "additionalProperties": false, + "properties": { + "alias": { + "description": "(must not be empty, at most 100 characters)", + "type": "string" + }, + "confirmation_reason": { + "description": "(must not be empty, at most 1000 characters)", + "type": "string" + }, + "expected_version": { + "description": "(≥1)", + "type": "integer" + }, + "id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "scope": { + "enum": [ + "global", + "trip" + ], + "type": "string" + }, + "source": { + "enum": [ + "user_confirmed", + "imported", + "agent_inferred" + ], + "type": "string" + }, + "status": { + "enum": [ + "confirmed", + "candidate", + "rejected" + ], + "type": "string" + }, + "trip_id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + } + }, + "required": [ + "alias", + "scope", + "source", + "status" + ], + "type": "object" + }, + "type": "array" +}
4 tool updates
- Changed
get_trip_state1 field changed- added
Input schema / properties / knowledge_source_cursorAdded value: +{ + "description": "(must not be empty, at most 100000 characters)", + "type": "string" +}
- Changed
list_experiences1 field changed- changed
Input schema / properties / person_id / descriptionPrevious value: -"(must not be empty, at most 200 characters)"New value: +"Stable account-owned person ID; filters recorded Experience participants. Trip attendance alone does not match. (must not be empty, at most 200 characters)"
- Changed
list_memories1 field changed- changed
Input schema / properties / person_id / descriptionPrevious value: -"(must not be empty, at most 200 characters)"New value: +"Stable account-owned person ID; filters the Memory subject, not its speaker or author. (must not be empty, at most 200 characters)"
- Changed
record_trip_review4 fields changed- added
Input schema / properties / reviews / items / properties / knowledge / properties / decisions / items / properties / attribution_statusAdded value: +{ + "description": "confirmed has subjects; unresolved has no confirmed subject and permits only skipped; not_personal permits Experience without subjects.", + "enum": [ + "confirmed", + "unresolved", + "not_personal" + ], + "type": "string" +} - added
Input schema / properties / reviews / items / properties / knowledge / properties / decisions / items / properties / statementAdded value: +{ + "description": "(must not be empty, at most 2000 characters)", + "type": "string" +} - added
Input schema / properties / reviews / items / properties / knowledge / properties / decisions / items / properties / subject_person_idsAdded value: +{ + "description": "Confirmed subjects: Memory at most one person; Experience all confirmed recorded participants. Never infer identity from photo uploaders or unanswered/unverified Recall. (at most 50 items)", + "items": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / reviews / items / properties / knowledge / properties / source_coverageAdded value: +{ + "description": "Explicit source audit, at most 100 records per resumable batch. Optional for legacy compatibility; absent or empty coverage never establishes completion. (at most 100 items)", + "items": { + "additionalProperties": false, + "properties": { + "candidate_keys": { + "description": "(at most 50 items)", + "items": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "type": "array" + }, + "checked_person_ids": { + "description": "People considered for this source, including attributed Remark speaker as a hint and separately confirmed candidate subjects; speaker is not automatically fact subject. (at most 50 items)", + "items": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "type": "array" + }, + "reason": { + "description": "(must not be empty, at most 1000 characters, must match \\S)", + "type": "string" + }, + "result": { + "enum": [ + "candidates", + "no_candidates", + "needs_attribution" + ], + "type": "string" + }, + "source_id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "source_kind": { + "enum": [ + "trip", + "media", + "remark", + "block", + "recall_answer" + ], + "type": "string" + }, + "source_signature": { + "description": "(must match ^[a-f0-9]{64}$)", + "type": "string" + } + }, + "required": [ + "source_kind", + "source_id", + "source_signature", + "result", + "checked_person_ids", + "candidate_keys", + "reason" + ], + "type": "object" + }, + "type": "array" +}
2 tool updates
- Changed
get_trip_state2 fields changed- added
Input schema / properties / affected_sourcesAdded value: +{ + "description": "(at least 1 item, at most 100 items)", + "items": { + "additionalProperties": false, + "properties": { + "source_id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "source_kind": { + "enum": [ + "trip", + "media", + "remark", + "block" + ], + "type": "string" + } + }, + "required": [ + "source_kind", + "source_id" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / knowledge_review_cursorAdded value: +{ + "description": "(must not be empty, at most 100000 characters)", + "type": "string" +}
- Changed
record_trip_review2 fields changed- added
Input schema / properties / affected_sourcesAdded value: +{ + "description": "(at least 1 item, at most 100 items)", + "items": { + "additionalProperties": false, + "properties": { + "source_id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "source_kind": { + "enum": [ + "trip", + "media", + "remark", + "block" + ], + "type": "string" + } + }, + "required": [ + "source_kind", + "source_id" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / reviews / items / properties / payload / properties / maintenance_deferredAdded value: +{ + "description": "(at most 100 items)", + "items": { + "additionalProperties": false, + "properties": { + "expected_version": { + "description": "(≥1)", + "type": "integer" + }, + "id": { + "description": "(must not be empty, at most 200 characters)", + "type": "string" + }, + "kind": { + "enum": [ + "experience", + "memory" + ], + "type": "string" + }, + "reason": { + "description": "(must not be empty, at most 1000 characters, must match \\S)", + "type": "string" + } + }, + "required": [ + "kind", + "id", + "expected_version", + "reason" + ], + "type": "object" + }, + "type": "array" +}
1 tool update
- Changed
record_trip_review3 fields changed- changed
Input schema / properties / reviews / items / properties / outcome / descriptionPrevious value: -"(at most 100 characters)"New value: +"timeline: organised, unchanged, no_material; recall_prompt: offered, existing_sufficient, no_useful_question, user_declined; recall_answers: incorporated, no_relevant_change, needs_attribution, no_answers; knowledge: evaluated; discoveries: published, updated, still_valid, insufficient_evidence, user_declined" - added
Input schema / properties / reviews / items / properties / outcome / enumAdded value: +[ + "organised", + "unchanged", + "no_material", + "offered", + "existing_sufficient", + "no_useful_question", + "user_declined", + "incorporated", + "no_relevant_change", + "needs_attribution", + "no_answers", + "evaluated", + "published", + "updated", + "still_valid", + "insufficient_evidence" +] - changed
Input schema / properties / reviews / items / properties / reason / descriptionPrevious value: -"(must not be empty, at most 1000 characters)"New value: +"Non-blank explanation of the actual checks and evidence; free text, not an outcome code. (must not be empty, at most 1000 characters, must match \\S)"
4 tool updates
- Removed
get_knowledge_evaluation - Changed
get_trip_state7 fields changed- added
Input schema / properties / detail_limitAdded value: +{ + "description": "(≥1, ≤100)", + "type": "integer" +} - added
Input schema / properties / includeAdded value: +{ + "description": "(at most 2 items)", + "items": { + "enum": [ + "knowledge_details", + "recall_details" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / knowledge_exclusion_cursorAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +} - added
Input schema / properties / recall_cursorAdded value: +{ + "description": "(must not be empty, at most 1000 characters)", + "type": "string" +} - added
Input schema / properties / request_idAdded value: +{ + "description": "(must not be empty, at most 200 characters)", + "type": "string" +} - added
Input schema / properties / scopeAdded value: +{ + "enum": [ + "organise", + "targeted" + ], + "type": "string" +} - added
Input schema / properties / stepsAdded value: +{ + "description": "(at least 1 item, at most 5 items)", + "items": { + "enum": [ + "timeline", + "recall_prompt", + "recall_answers", + "knowledge", + "discoveries" + ], + "type": "string" + }, + "type": "array" +}
- Removed
record_knowledge_evaluation - Added
record_trip_review
5 tool updates
- Added
get_knowledge_evaluation - Changed
manage_wrapped_link1 field changed- changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Unique operation key. Reuse only for an identical retry; replay never recovers a bearer URL. (must not be empty)"New value: +"Unique operation key. Reuse only for an identical retry; replay never recovers independent Wrapped capability tokens. Save/publish may resolve a currently valid unified Trip URL. (must not be empty)"
- Changed
publish_trip_wrapped2 fields changed- changed
Input schema / properties / expires_at / descriptionPrevious value: -"Future UTC milliseconds; null means indefinite share. Preview requires a future time within 30 days."New value: +"Legacy retries only. Omit for new publication requests: publishing only updates content. Manage link expiry through explicit sharing operations." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Unique operation key. Reuse only for an identical retry; replay never recovers a bearer URL. (must not be empty)"New value: +"Unique operation key. Reuse only for an identical retry; replay never recovers independent Wrapped capability tokens. Save/publish may resolve a currently valid unified Trip URL. (must not be empty)"
- Added
record_knowledge_evaluation - Changed
save_trip_wrapped3 fields changed- changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Unique operation key. Reuse only for an identical retry; replay never recovers a bearer URL. (must not be empty)"New value: +"Unique operation key. Reuse only for an identical retry; replay never recovers independent Wrapped capability tokens. Save/publish may resolve a currently valid unified Trip URL. (must not be empty)" - added
Input schema / properties / modeAdded value: +{ + "description": "Default publish saves and publishes in one operation; preview explicitly saves without publishing.", + "enum": [ + "publish", + "preview" + ], + "type": "string" +} - changed
Input schema / properties / preview_expires_at / descriptionPrevious value: -"Future UTC milliseconds, within 30 days; first preview only. Default seven days."New value: +"Only with mode=preview: future UTC milliseconds within 30 days; first preview only. Default seven days."
5 tool updates
- Added
get_trip_wrapped - Changed
learn1 field changed- changed
Input schema / properties / topic / descriptionPrevious 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."New value: +"One of: wrapped | recall | people | knowledge | workflow | block_types | block_types/<TYPE> | media | pipeline | head | theme | voice | rules | recipes | recipes/<name>. Leave empty for the index."
- Added
manage_wrapped_link - Added
publish_trip_wrapped - Added
save_trip_wrapped
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
Travel ledger for AI: journeys, stays, expenses, tax-residency day counts and Schengen 90/180.
Multilingual travel guides, gear picks and booking links for AI travel agents.
Travel ledger for AI agents. Log journeys, stays and expenses from booking emails, then get tax-residency day counts, Schengen 90/180 status and your current country from your own travel history.
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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.8340 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.26-
Glama MCP Gateway
Add one secure layer between your agents and this server.