MCP App Store
by KeenEthics
Travel
Swarm by Foursquare icon

Swarm by Foursquare

by Foursquare Labs

Overview

Swarm helps you discover places, check in to where you go, and keep a personal history of your favorite spots. Find restaurants, cafés, parks, museums, bars, and other places nearby or anywhere in the world. Get recommendations based on location, save places to visit later, create and manage lists, and see where you've been over time. Whether you're planning a trip, exploring a new neighborhood, or trying to remember the great coffee shop you visited last year, Swarm makes it easy to find, organize, and revisit the places that matter to you.

Tools

activities_recent

ChatGPT
Get the friend activity feed (check-ins, likes, comments). Returns the first 10 activities; for more, pass a filter with a wider slice, e.g. {activities: {items: [:25 {type, checkin: {id, createdAt, user: {displayName}, venue: {name}}}]}}. To reach older activity, send the previous response's trailingMarker as beforeMarker and stop when moreData is false. Returns {activities: {leadingMarker: string, trailingMarker: string, moreData: boolean, items: [{type: string, checkin: Checkin}]}}. Default filter: {activities: {trailingMarker, moreData, items: [:10 {type, checkin: {id, createdAt, user: {displayName}, venue: {name}}}]}}

add_checkin

ChatGPT
Create a new check-in at a venue. Returns {checkin: Checkin}. Default filter: {checkin: {id, createdAt, venue: {id, name}}}

add_list_item

ChatGPT
Add a venue or tip to a list. Supply venueId or tipId — one of the two is required. A venue already on the list is rejected rather than added twice; use update_list_item to change an item already there. photoId must be a photo taken at the same venue, such as one get_venue, get_checkin or get_tip returns. Returns {item: {id: string, note?: {text: string}, venue?: Venue, tip?: Tip, photo?: Photo}}. Default filter: {item: {id, note: {text}, venue: {id, name}, tip: {id, text, venue: {id, name}}, photo: {id, prefix, suffix}}}

add_venue

ChatGPT
Add a new venue to the Foursquare database. A 409 means existing venues were matched as possible duplicates, which proximity alone can trigger; the error carries candidateDuplicateVenues and an ignoreDuplicatesKey. Check the candidates, and if none is really the same place, submit again with the same name plus ignoreDuplicates=true and that ignoreDuplicatesKey. Do not retry a 409 without them — it will be refused again. Returns {venue: Venue}. Default filter: {venue: {id, name}}

ask

ChatGPT
AI-powered place recommendations. Ask a natural language question like 'best tacos near me' or 'quiet coffee shop with wifi in Brooklyn'.. Returns {recommendations: [{venue: Venue}]}. Default filter: {recommendations: [{venue: {id, name, location: {city}, categories: [{id, name}]}}]}

create_list

ChatGPT
Create a new list. Returns {list: List}. Default filter: {list: {id, name, canonicalUrl}}

delete_checkin

ChatGPT
Delete one of the user's own check-ins. Only the owner can delete a check-in, and it cannot be recovered afterwards. Answers with an empty object on success, so read the absence of an error as the confirmation. Returns {} — empty on success

delete_list

ChatGPT
Delete a list. Answers with an empty object on success, so read the absence of an error as the confirmation rather than looking for deleted content in the response. Returns {} — empty on success

delete_list_item

ChatGPT
Remove items from a list. venueId removes every item in the list for that venue — both a saved venue and any tip at it — while tipId removes only that tip. The response lists the items that were removed, so its count is how many were deleted and not what the list now holds; call get_list for the new contents. Returns {items: {count: number, items: [{id: string, venue: Venue}]}}. Default filter: {items: {count, items: [{id, venue: {id, name}}]}}

flag_venue

ChatGPT
Report a problem with a venue, changing a public record the whole product reads. Submits a moderation flag attributed to the user, which cannot be withdrawn. It is normally reviewed by a human first, EXCEPT for callers who can resolve it themselves — flagging their own content, or holding a high superuser level — where it takes effect immediately, closing or hiding the venue for everyone. A flag returned with resolved=true was applied that way. Confirm the venue is the right one before sending. Returns {id: string, name: string, flags: {count: number, items: [{id: string, type: string, resolved?: boolean, correct?: boolean}]}}. Default filter: {id, name, flags: {count, items: [{id, type, resolved, correct}]}}

follow_list

ChatGPT
Follow or unfollow a list. The returned following is the resulting state, so a caller can confirm the call from the response without re-reading the list. Returns {list: List}. Default filter: {list: {id, name, following}}

friends_nearby

ChatGPT
Get friends' recent check-ins around a location. Covers a recent window only (about a day), so it answers "who is out around here right now" rather than anything historical. Check-ins in the same city are preferred when choosing which ones to return, but what comes back is ordered newest first, not nearest first — a result's position says nothing about how far away it is, and the tail can be well outside the area. There is no radius to narrow, and no distance to sort on. Returns {recent: [Checkin]}. Default filter: {recent: [{id, user: {id, displayName}, venue: {id, name, location: {city}}, createdAt}]}

get_checkin

ChatGPT
Get details about a specific check-in. Returns {checkin: Checkin}. Default filter: {checkin: {id, createdAt, venue: {id, name, location: {city}}, shout, likes: {count}, comments: {count}, photos: {count, items: [{id, prefix, suffix}]}}}

get_event

ChatGPT
Get full details for one event: its times, the venue it is at, description, images, provider and participants. Read allDay first to know how the times are reported — a timed event carries startAt and endAt, an all-day one carries date instead. Returns {event: Event} — plus summary, text (the description), url, images (at most one), provider, stats and participants (performers, teams or cast, each with a role), all projectable. Default filter: {event: {id, name, allDay, startAt, endAt, date, venue: {id, name}, categories: [{id, name}]}}

get_event_categories

ChatGPT
Get the full hierarchy of event categories. There is no parentId: each category nests its own subcategories under a categories field, the same key the top-level array uses, so the tree recurses through that one field name rather than a flat list of parent-pointers. The default projection only goes three levels deep; project categories inside categories yourself to go further if needed. Returns {categories: [{id: string, name: string, pluralName: string, shortName: string, categoryCode: string, icon: {prefix: string, suffix: string}, categories?: [<this same shape>]}]} — a node's own subcategories nest under its categories field, recursing until a leaf category has none. Default filter: {categories: [{id, name, shortName, categoryCode, categories: [{id, name, shortName, categoryCode, categories: [{id, name, shortName, categoryCode}]}]}]}

get_friends

ChatGPT
Get a user's friends list. Use offset/limit to page through results. Returns {friends: {items: [User]}}. Default filter: {friends: {items: [{id, displayName, handle, homeCity}]}}

get_list

ChatGPT
Get details and items for a list. Special list IDs: 'self/todos' = My Saved Places, 'self/venuelikes' = My Liked Places; the same two work for another user as '{userId}/todos' and '{userId}/venuelikes'. Use offset/limit to page through results.. Returns {list: List}. Default filter: {list: {id, name, description, photo: {id, prefix, suffix}, listItems: {count, items: [{id, type, note: {text}, venue: {id, name}, tip: {id, text, venue: {id, name}}, photo: {id, prefix, suffix}}]}}}

get_tip

ChatGPT
Get details for a specific tip. Returns {tip: Tip}. Default filter: {tip: {id, text, user: {id, displayName}, venue: {id, name}, agreeCount, createdAt, photo: {id, prefix, suffix}}}

get_user_profile

ChatGPT
Get a user's profile. Returns {user: User}. Default filter: {user: {id, displayName, handle, homeCity, bio, friends: {count}, checkins: {count}}}

get_venue

ChatGPT
Get full details for a venue. Returns {venue: Venue}. Default filter: {venue: {id, name, location: {city}, rating, stats: {tipCount, checkinsCount}, bestPhoto: {id, prefix, suffix}, photos: {count, groups: [{type, items: [:5 {id, prefix, suffix}]}]}}}

get_venue_categories

ChatGPT
Get the full hierarchy of venue categories. There is no parentId: each category nests its own subcategories under a categories field, the same key the top-level array uses, so the tree recurses through that one field name rather than a flat list of parent-pointers. The default projection only goes three levels deep (root, sub, subsub — the taxonomy's actual depth); project categories inside categories yourself to go further if a caller ever needs to. Returns {categories: [{id: string, name: string, pluralName: string, shortName: string, categoryCode: string, icon: {prefix: string, suffix: string}, categories?: [<this same shape>]}]} — a node's own subcategories nest under its categories field, recursing until a leaf category has none. Default filter: {categories: [{id, name, shortName, categoryCode, categories: [{id, name, shortName, categoryCode, categories: [{id, name, shortName, categoryCode}]}]}]}

get_venue_tips

ChatGPT
Get tips/reviews for a venue. Returns {tips: {items: [Tip]}}. Default filter: {tips: {items: [{id, text, user: {id, displayName}, agreeCount, disagreeCount}]}}

last_location

ChatGPT
Get the user's most recently reported coordinate, with the time it was recorded. Use this to supply ll to other tools when the client has not provided a location; check time before treating it as current. Returns {lat: number, lng: number, time: number}. Returns {} when no location is on record

match_concepts

ChatGPT
Match free-text phrases against Foursquare's internal taxonomies — venue categories, event categories and tastes — by meaning rather than by spelling. Use it to find what the taxonomy calls something ("izakaya" -> Japanese Restaurant), to check whether a concept exists in it at all, or to get the id add_venue and propose_venue_edit take in setCategoryIds. Prefer this over get_venue_categories, which returns the whole hierarchy. This is a vector embedding search over meaning, not an exact or keyword lookup, so a spurious match is possible — a plausible-looking row that is not actually what the phrase meant, sometimes ahead of a better one further down — and an empty matches array means the taxonomy has nothing close. Matches come back best-first; sanity-check an unfamiliar or high-stakes match against its name before relying on it. Returns {conceptMatches: [{concept: string, matches: [{type: string, id: string, name: string, score: number}]}]} — one entry per requested concept, in the order sent; a concept the taxonomies have nothing for comes back with an empty matches array rather than being omitted. score is omitted by default — see the tool description — and is projectable only for debugging, not for judging a match. Default filter: {conceptMatches: [{concept, matches: [{type, id, name}]}]}

move_list_item

ChatGPT
Reorder a list by moving one item directly after or before another item on the same list. Supply exactly one of afterId or beforeId. Item IDs are the ones get_list returns. The response is the list in its new order. Returns {list: List}. Default filter: {list: {id, name, listItems: {count, items: [{id, venue: {id, name}, tip: {id}}]}}}

nearby_lists

ChatGPT
Get lists near the current location. Returns {results: [{list: List}]}. Default filter: {results: [:20 {list: {id, name, user: {displayName}, listItems: {count}}}]}

next_venues

ChatGPT
Get venues people typically visit after this venue. Returns {nextVenues: {items: [Venue]}}. Default filter: {nextVenues: {items: [{id, name, location: {city}, categories: [{id, name}]}]}}

propose_venue_edit

ChatGPT
Suggest edits to an existing venue (name, location, contact, hours, categories), changing a public record the whole product reads. Each field accepted becomes a proposal for human review, EXCEPT for callers who can apply it themselves — editing their own content, or holding a high superuser level — where it takes effect immediately and cannot be withdrawn. A proposal returned with resolved=true was applied that way. Treat this as an edit that may be live the moment it is made, and confirm the values before sending. Returns {woes: [{id: string, type: string, resolved?: boolean}]}. Default filter: {woes: [{id, type, resolved}]}

scoreboard

ChatGPT
Get the weekly scoreboard (leaderboard) for a user, ranked best first. Scores every friend, so use offset/limit to page, stopping when a page comes back empty — there is no total and no hasMore. The window applies to the current and previous week alike, and each entry carries its own ranking, so a page past the first still reports true positions. userRank is the user's own standing whichever page is asked for; userIndex locates them within the returned page and is -1 when they fall outside. Returns {currentWeek: {scores: [{user: User, score: number, ranking: number}], userRank?: string, userIndex: number}, previousWeek?: {scores: [{user: User, score: number, ranking: number}], userRank?: string, userIndex: number}} — previousWeek is sent only once a previous week has scores, is ranked separately from the current one, and is not in the default filter; project it to read it. Default filter: {currentWeek: {scores: [{user: {id, displayName}, score, ranking}], userRank, userIndex}}

search_checkins

ChatGPT
Search your check-in history by venue name, date range, category, friend, geo area, or specific date (on this day). Returns {checkins: {items: [Checkin]}}. Default filter: {checkins: {items: [{id, createdAt, venue: {id, name, location: {city}}, shout}]}}

search_events

ChatGPT
Search for events by query, date range, and location. Results are grouped by venue — one entry per venue, carrying up to three of the events found there — so a result is a venue and not an event, and both limit and offset count venues. Returns {venues: [{venue: Venue, events: {count: number, items: [{id: string, name?: string, startAt?: number, endAt?: number, categories?: [string], score: number, showtimes?: [number], provider?: {name?: string, url?: string, iconUrl?: object}}]}}]} — a reduced event rather than the Event model: no venue, allDay or date, and categories are ID strings here, not objects. Default filter: {venues: [:10 {venue: {id, name}, events: {items: [{id, name, startAt, endAt}]}}]}

search_lists

ChatGPT
Search for lists by query. Returns {lists: [List]}. Default filter: {lists: [{id, name, description}]}

search_tips

ChatGPT
Search for tips by text query, location, or category. Returns {tips: [Tip]}. Default filter: {tips: [{id, text, user: {id, displayName}, venue: {id, name}, agreeCount}]}

search_users

ChatGPT
Search for users by name, phone, or email. Use offset/limit to page through results — there is no total and no hasMore, so stop when a page comes back empty. Returns {results: [{user: User}]}. Default filter: {results: [{user: {id, displayName, handle, homeCity}}]}

search_venues

ChatGPT
Find places near a location. Omit query to get the places the user is most likely at right now, ordered by likelihood — this is how to pick a venue to check in at. Pass query to find a place by name nearby. confident reports whether the top result is where the user is standing, and is present on the no-query path only — its absence on a query is not a weak match. Without a query the results also carry the parent venue of a match and venues from the wider area, so expect more than limit and some further away. Requires ll or near. Returns {venues: [Venue], confident: boolean}. Default filter: {venues: [{id, name, location: {city, state, distance}, categories: [{id, name}]}], confident}

show_checkin_map

ChatGPT
Show an interactive map. Renders in the conversation as a UI element rather than as text, so call it when the user wants to see a map rather than read a list. Takes an optional center point and zoom.

similar_venues

ChatGPT
Get venues similar to a given venue. Returns {similarVenues: {items: [Venue]}}. Default filter: {similarVenues: {items: [{id, name, location: {city}, categories: [{id, name}]}]}}

update_checkin

ChatGPT
Update an existing check-in (shout, visibility, tagged friends). Returns {checkin: Checkin}. Default filter: {checkin: {id, venue: {id, name}, shout}}

update_list

ChatGPT
Update a list's name, description or cover photo. Send only the fields being changed — anything omitted is left as it was. photoId sets the cover to a photo such as one get_venue, get_checkin or get_tip returns, and an empty string removes it. Returns {list: List}. Default filter: {list: {id, name, description, photo: {id, prefix, suffix}}}

update_list_item

ChatGPT
Edit an item already on a list in place, without removing and re-adding it: set its note, attach a tip, or set its photo. Send only what is changing; anything omitted is left as it was, and an empty string clears that field. Change the note or the tip, not both in one call — when text is sent, tipId is ignored. A photoId comes from the photos get_venue, get_checkin and get_tip return. Setting a photo leaves its visibility unchanged, so it shows on the list only to viewers allowed to see it; the first photo set becomes the list's cover if it has none. Returns {item: {id: string, note?: {text: string}, venue?: Venue, tip?: Tip, photo?: Photo}}. Default filter: {item: {id, note: {text}, venue: {id, name}, tip: {id, text, venue: {id, name}}, photo: {id, prefix, suffix}}}

user_activities

ChatGPT
Get activity feed for a specific user. Returns {activities: {items: [{type: string, createdAt: number, summary: {entities, text: string}}]}}. Default filter: {activities: {items: [:10 {type, createdAt, summary}]}}

user_likes

ChatGPT
Get venues the user has liked. Use offset/limit to page through results.. Returns {venues: {items: [Venue]}}. Default filter: {venues: {items: [{id, name, location: {city}, categories: [{id, name}]}]}}

user_lists

ChatGPT
Get a user's lists, grouped by the caller's relationship to each list. To page, send the previous response's cursor; stop when hasMore is false. Narrow to one group to page within it. 'yours' holds the user's saves and likes as lists, whose ids get_list accepts. Returns {lists: {cursor?: string, hasMore: boolean, groups: [{type: string, items: [List]}]}} — a group reports no count; page with cursor until hasMore is false. Default filter: {lists: {cursor, hasMore, groups: [{type, items: [{id, name, description, user: {displayName}, listItems: {count}}]}]}}

user_mayorships

ChatGPT
Get a user's current mayorships and contending mayorships. Returns {mayorships: [{venue: Venue, summary: string, mayor?: User}], contendingMayorships: [{venue: Venue, summary: string, mayor?: User}]}. Default filter: {mayorships: [:20 {venue: {id, name, location: {city}}, summary}], contendingMayorships: [:10 {venue: {id, name, location: {city}}, summary}]}

user_stats_categories

ChatGPT
Get a user's check-in stats broken down by venue category, busiest first. Use offset/limit to page through results — there is no total and no hasMore, and a short page does not mean the last one, so stop when a page comes back empty. ancestorCategoryId restricts to categories that are, or descend from, any of the given category id(s) — e.g. the id for "Asian Restaurant" returns the sushi places and Chinese restaurants the user has checked into, not a rolled-up Asian Restaurant total. Returns {categories: [{category: {name: string}, checkins: number, venues: number}]}. Default filter: {categories: [{category: {name}, checkins, venues}]}

user_stats_event_categories

ChatGPT
Get a user's check-in stats broken down by event category, busiest first. Use offset/limit to page through results — there is no total and no hasMore, and a short page does not mean the last one, so stop when a page comes back empty. ancestorCategoryId restricts to categories that are, or descend from, any of the given event category id(s). Returns {categories: [{category: {name: string}, checkinsCount: number}]}. Default filter: {categories: [{category: {name}, checkinsCount}]}

user_stats_friends

ChatGPT
Get a user's check-in stats broken down by friend (who they check in with). Returns {friends: [{user: User, checkinsCount: number}]}. Default filter: {friends: [:20 {user: {displayName}, checkinsCount}]}

user_stats_geos

ChatGPT
Get a user's check-in stats broken down by geographic area, one entry per country/state/city/neighborhood checked into. Returns a flat array by default, each entry carrying parentId (absent for a top-level entry) instead of nested children — pass flat=false for the nested shape instead, where each entry has children instead of parentId. woeType narrows which levels appear at all, in either shape: a skipped level's entries reparent to the nearest level still included, so the result stays a valid tree or a correctly linked flat list either way. ancestorGeoId restricts to the given geo id(s) and everything under them, at any depth — the id(s) themselves included, so a country's id returns that country along with its states and cities. limit/offset page over a stable order that works the same in either shape (parent immediately before its own descendants); there is no total and no hasMore, and a short page does not mean the last one, so stop when a page comes back empty. Returns {geos: [{id: string, name: string, type: string, venues: number, checkins?: number, ne: [number, number], sw: [number, number], img?: string, parentId?: string}]} — the flat (default) shape; with flat=false each entry has children?: [Geo] nested instead of parentId. checkins is present only when reading your own stats. type is one of country, state, city, neighborhood

user_stats_venues

ChatGPT
Get a user's check-in stats broken down by venue (most visited places). Returns {venues: [{venue: Venue, checkinsCount: number}]}. Default filter: {venues: [:20 {venue: {name}, checkinsCount}]}

user_tips

ChatGPT
Get tips written by a user. Returns {tips: {items: [Tip]}}. Default filter: {tips: {items: [{id, text, venue: {id, name}, agreeCount, createdAt}]}}

venue_attributes

ChatGPT
Get structured attributes for a venue (wifi, outdoor seating, credit cards, etc.). The whole taxonomy comes back whether or not the venue has been assessed on each entry, so read availability — "yes", "no", "na" or "unknown" — and never infer from displayValue being absent, which means nobody has answered rather than no. Returns {attributes: {groups: [{name: string, items: [{displayName: string, availability?: string, displayValue?: string}]}]}} — availability is yes/no/na/unknown; displayValue is present only when set. Default filter: {attributes: {groups: [{name, items: [{displayName, availability, displayValue}]}]}}

venue_events

ChatGPT
Get events at a venue. With neither afterTimestamp nor beforeTimestamp, this returns only the events in progress right now, which is usually none — pass either one to ask about a period instead. Returns {events: {items: [Event]}}. Default filter: {events: {items: [{id, name, startAt, endAt}]}}

venue_flags

ChatGPT
Get pending flags/reports on a venue. Returns {flags: {items: [{id: string, field: string, displayName: string, displayValue: string, reporters: [User], dateTime: string}]}} — dateTime is a localized display date, not a timestamp, and cannot be parsed or compared. Default filter: {flags: {items: [{id, field, displayName, displayValue, reporters: [{displayName}], dateTime}]}}

venue_listed

ChatGPT
Get lists that contain a venue, grouped by the caller's relationship to each list. To page, send the previous response's cursor; stop when hasMore is false. Narrow to one group to page within it. Returns {lists: {cursor?: string, hasMore: boolean, groups: [{type: string, items: [List]}]}} — a group reports no count; page with cursor until hasMore is false. Default filter: {lists: {cursor, hasMore, groups: [{type, items: [{id, name, description, user: {displayName}, listItems: {count}}]}]}}

activities_recent

Claude

add_checkin

Claude

add_list_item

Claude

add_venue

Claude

ask

Claude

create_list

Claude

delete_list

Claude

delete_list_item

Claude

flag_venue

Claude

follow_list

Claude

friends_nearby

Claude

get_checkin

Claude

get_event

Claude

get_friends

Claude

get_list

Claude

get_tip

Claude

get_user_profile

Claude

get_venue

Claude

get_venue_categories

Claude

get_venue_tips

Claude

last_location

Claude

nearby_lists

Claude

next_venues

Claude

propose_venue_edit

Claude

scoreboard

Claude

search_checkins

Claude

search_events

Claude

search_lists

Claude

search_tips

Claude

search_users

Claude

search_venues

Claude

similar_venues

Claude

update_checkin

Claude

update_list

Claude

user_activities

Claude

user_likes

Claude

user_lists

Claude

user_mayorships

Claude

user_stats_categories

Claude

user_stats_event_categories

Claude

user_stats_friends

Claude

user_stats_geos

Claude

user_stats_venues

Claude

user_tips

Claude

venue_attributes

Claude

venue_events

Claude

venue_flags

Claude

venue_listed

Claude

Capabilities

WritesInteractive

App Stats

104

Tools

ChatGPT, Claude

Platforms

Works with

ChatGPT
Claude

Data refreshed daily