MCP 서버

wcway

com.wcway/wcway
지도 및 위치 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Finds nearby public toilets and returns distance, walking time, access, fees, hours, accessibility, and map links.

find_toilets_near
Find public toilets near a place
Use this when the user asks for the nearest public toilet, or for toilets near a street, station or town. Returns up to 20 toilets sorted by distance, with walk time, access rule, fee, open now, closing time, wheelchair access and a map link. Do not use it for toilet products or plumbing.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': [], 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude, WGS84. Send with lon, if you already know the coordinates.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude, WGS84.'}, 'free': {'type': 'boolean', 'description': 'Only toilets known to be free of charge.'}, 'limit': {'type': 'integer', 'default': 5, 'maximum': 20, 'minimum': 1}, 'place': {'type': 'string', 'maxLength': 200, 'minLength': 2, 'description': 'Street, station, landmark or town from the user message, for example Darmstadt Hauptbahnhof.'}, 'country': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': 'ISO 3166-1 alpha-2 code. Narrows the place lookup.'}, 'open_now': {'type': 'boolean', 'description': 'Drop toilets that are closed now. Toilets with unknown hours stay and show open_now unknown.'}, 'wheelchair': {'type': 'boolean', 'description': 'Only wheelchair-accessible toilets.'}, 'changing_table': {'type': 'boolean', 'description': 'Only toilets with a changing table.'}, 'no_purchase_needed': {'type': 'boolean', 'description': 'Only toilets that need no purchase.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'type': 'object', 'required': ['status', 'origin', 'results', 'attribution', 'display_note'], 'properties': {'bbox': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 4, 'minItems': 4, 'description': 'west, south, east, north of the origin and the results.'}, 'origin': {'anyOf': [{'type': 'object', 'required': ['lat', 'lon', 'label', 'source'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'label': {'type': 'string', 'examples': ['Luisenplatz, Darmstadt'], 'description': 'The place and its city. A position without a name shows its coordinates.'}, 'source': {'enum': ['place', 'coordinates', 'host_hint'], 'type': 'string'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'status': {'enum': ['ok', 'no_results', 'needs_location', 'place_not_found'], 'type': 'string', 'description': 'needs_location and place_not_found are not errors. Ask the user the question in ask_user.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'lat', 'lon', 'access', 'access_rule', 'scheme_name', 'fee', 'opening_hours', 'open_now', 'closes_at', 'wheelchair', 'changing_table', 'gender', 'operator', 'last_confirmed_at', 'verification_state', 'confirmations', 'cleanliness', 'confidence', 'source', 'partner', 'provenance', 'url', 'directions', 'geo', 'distance_m', 'walk_min', 'bearing'], 'properties': {'id': {'type': 'string', 'examples': ['lt_01J9ZQ']}, 'fee': {'type': 'object', 'required': ['required', 'amount', 'currency'], 'properties': {'amount': {'type': ['number', 'null']}, 'currency': {'type': ['string', 'null']}, 'required': {'type': ['boolean', 'null']}}, 'additionalProperties': False}, 'geo': {'type': 'string', 'description': 'geo: URI.'}, 'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': ['string', 'null']}, 'access': {'enum': ['public', 'permissive', 'customers', 'scheme', 'unknown'], 'type': 'string', 'description': 'Who may use the toilet. public: anyone. permissive: anyone, no purchase needed. customers: customers only. scheme: a public scheme opens a business toilet to everyone.'}, 'gender': {'type': 'array', 'items': {'enum': ['unisex', 'female', 'male'], 'type': 'string'}, 'description': 'Who the toilet is for. Empty when not known.'}, 'source': {'type': 'string'}, 'bearing': {'type': 'integer', 'maximum': 359, 'minimum': 0, 'description': 'Degrees from north.'}, 'partner': {'anyOf': [{'type': 'null'}, {'type': 'object', 'required': ['name', 'tier', 'conditions', 'opening_hours', 'open_now', 'closes_at'], 'properties': {'name': {'type': 'string', 'description': 'Business name that the partner gave and a moderator approved.'}, 'tier': {'enum': ['basic', 'plus'], 'type': 'string'}, 'open_now': {'anyOf': [{'type': 'boolean'}, {'const': 'unknown'}], 'description': "Open state from the hours of the business and its live switch, at the toilet's local time. false: the business closed the toilet for now, or its hours say closed. unknown: the business gave no usable hours."}, 'closes_at': {'type': ['string', 'null'], 'description': 'Local closing time with UTC offset, from the hours of the business. Null when unknown or when it never closes.'}, 'conditions': {'anyOf': [{'enum': ['everyone', 'customers'], 'type': 'string'}, {'type': 'null'}], 'description': 'What the business says about who may use the toilet. everyone: free for everyone. customers: customers only. Null when the business said nothing. It is the word of the business, not a checked fact.'}, 'opening_hours': {'type': ['string', 'null'], 'description': 'Opening hours that the business entered, in OpenStreetMap opening_hours syntax. Null when it entered none.'}}, 'additionalProperties': False}], 'description': "Set when the business behind the toilet pays for a Verified Partner listing. It buys visibility and a label. It never changes the order of the results. Show it as a label only. Conditions, opening_hours and open_now are statements of the business. The toilet's own fields (access, opening_hours, open_now) stay as they are."}, 'open_now': {'anyOf': [{'type': 'boolean'}, {'const': 'unknown'}], 'description': "Evaluated at the toilet's local time. The value unknown means the source has no usable hours."}, 'operator': {'type': ['string', 'null']}, 'walk_min': {'type': 'integer', 'minimum': 1}, 'closes_at': {'type': ['string', 'null'], 'description': 'Local closing time with UTC offset. Null when unknown or when it never closes.'}, 'confidence': {'enum': ['high', 'medium', 'low'], 'type': 'string'}, 'directions': {'type': 'object', 'required': ['google', 'apple'], 'properties': {'apple': {'type': 'string', 'format': 'uri'}, 'google': {'type': 'string', 'format': 'uri'}}, 'additionalProperties': False}, 'distance_m': {'type': 'integer', 'minimum': 0}, 'provenance': {'type': 'object', 'required': ['source', 'checked', 'decided'], 'properties': {'source': {'type': 'string', 'description': 'Source of the toilet record, for example osm.'}, 'checked': {'type': ['string', 'null'], 'description': 'Month of the last check in the source, for example 2025-06.'}, 'decided': {'type': 'object', 'description': 'Facts that people or a moderator decided. The keys are access, fee, fee_amount, wheelchair, changing_table, gender, opening_hours, name, operator and existence.', 'propertyNames': {'enum': ['access', 'fee', 'fee_amount', 'wheelchair', 'changing_table', 'gender', 'opening_hours', 'name', 'operator', 'existence']}, 'additionalProperties': {'type': 'object', 'required': ['by', 'votes_for', 'votes_total', 'as_of'], 'properties': {'by': {'enum': ['votes', 'moderator'], 'type': 'string', 'description': 'votes: most people voted for the shown value. moderator: a moderator locked the value.'}, 'as_of': {'type': 'string', 'description': 'Date of the last count.'}, 'votes_for': {'type': ['integer', 'null'], 'minimum': 0, 'description': 'People who voted for the shown value. The source value counts as one vote. Null for a moderator.'}, 'votes_total': {'type': ['integer', 'null'], 'minimum': 0, 'description': 'All votes in the last 24 months, including the source value.'}}, 'additionalProperties': False}}}, 'description': 'Where the facts come from. People can correct every fact. A value that most people vote for replaces the source value. Every fact comes from the source, unless decided lists it.', 'additionalProperties': False}, 'wheelchair': {'enum': ['yes', 'limited', 'no', 'unknown'], 'type': 'string'}, 'access_rule': {'enum': ['free', 'fee', 'customers', 'key', 'scheme', 'unknown'], 'type': 'string', 'description': 'free and fee: public toilet. customers: purchase or customer status needed. key: key needed. scheme: a public scheme opens a business toilet to everyone. unknown: fee not known.'}, 'cleanliness': {'anyOf': [{'type': 'object', 'required': ['average', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 1}, 'average': {'type': 'number', 'maximum': 5, 'minimum': 1}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'User ratings from 1 (dirty) to 5 (spotless). Each person has one rating, and the latest counts. Null when nobody rated it.'}, 'scheme_name': {'type': ['string', 'null']}, 'confirmations': {'type': 'integer', 'minimum': 0, 'description': 'User confirmations in the last 12 months.'}, 'opening_hours': {'type': ['string', 'null'], 'description': 'OpenStreetMap opening_hours syntax.'}, 'changing_table': {'enum': ['yes', 'no', 'unknown'], 'type': 'string'}, 'last_confirmed_at': {'type': ['string', 'null']}, 'verification_state': {'enum': ['unverified', 'source_claimed', 'community_confirmed', 'partner_confirmed', 'disputed'], 'type': 'string', 'description': 'disputed: an open user report says the toilet is gone, closed or wrong.'}}, 'additionalProperties': False}}, 'ask_user': {'type': 'string'}, 'attribution': {'type': 'object', 'required': ['text', 'license', 'url', 'license_notice_url'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'text': {'type': 'string', 'examples': ['© OpenStreetMap contributors']}, 'license': {'type': 'string', 'examples': ['ODbL-1.0']}, 'license_notice_url': {'type': 'string', 'format': 'uri', 'description': 'The page that lists every source with its licence and offers the data dumps.'}}, 'additionalProperties': False}, 'display_note': {'type': 'string'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['code', 'message', 'status', 'attribution'], 'properties': {'code': {'type': 'string'}, 'status': {'type': 'integer'}, 'message': {'type': 'string'}, 'attribution': {'type': 'object', 'required': ['text', 'license', 'url', 'license_notice_url'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'text': {'type': 'string', 'examples': ['© OpenStreetMap contributors']}, 'license': {'type': 'string', 'examples': ['ODbL-1.0']}, 'license_notice_url': {'type': 'string', 'format': 'uri', 'description': 'The page that lists every source with its licence and offers the data dumps.'}}, 'additionalProperties': False}, 'invalid_params': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'reason'], 'properties': {'name': {'type': 'string'}, 'reason': {'type': 'string'}}}}, 'retry_after_seconds': {'type': 'integer'}}, 'additionalProperties': False}]}
get_toilet
Get one public toilet
Use this when the user asks about one toilet from an earlier answer: hours, access rule, fee, last confirmation. Needs the id from find_toilets_near. The provenance field says how many people confirm each fact, or which source it comes from.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{1,64}$', 'description': 'Toilet id from find_toilets_near.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'type': 'object', 'required': ['toilet', 'attribution', 'display_note'], 'properties': {'toilet': {'type': 'object', 'required': ['id', 'name', 'lat', 'lon', 'access', 'access_rule', 'scheme_name', 'fee', 'opening_hours', 'open_now', 'closes_at', 'wheelchair', 'changing_table', 'gender', 'operator', 'last_confirmed_at', 'verification_state', 'confirmations', 'cleanliness', 'confidence', 'source', 'partner', 'provenance', 'url', 'directions', 'geo', 'image'], 'properties': {'id': {'type': 'string', 'examples': ['lt_01J9ZQ']}, 'fee': {'type': 'object', 'required': ['required', 'amount', 'currency'], 'properties': {'amount': {'type': ['number', 'null']}, 'currency': {'type': ['string', 'null']}, 'required': {'type': ['boolean', 'null']}}, 'additionalProperties': False}, 'geo': {'type': 'string', 'description': 'geo: URI.'}, 'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': ['string', 'null']}, 'image': {'anyOf': [{'type': 'object', 'required': ['url', 'width', 'height', 'credit', 'licence', 'licence_url', 'source_url'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'description': 'The picture, served from this site. A client needs no other host.'}, 'width': {'type': 'integer', 'minimum': 1}, 'credit': {'type': 'string', 'description': 'Name of the author. Show it next to the photo.'}, 'height': {'type': 'integer', 'minimum': 1}, 'licence': {'type': 'string', 'description': 'Short name of the licence, for example CC BY-SA 4.0. Show it next to the photo.'}, 'source_url': {'type': 'string', 'format': 'uri', 'description': 'Page of the picture at Wikimedia Commons or Panoramax.'}, 'licence_url': {'type': ['string', 'null'], 'format': 'uri', 'description': 'Text of the licence. Null for a work in the public domain.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'A photo of the toilet. OpenStreetMap links it from Wikimedia Commons or Panoramax. It is set only when the licence is free (CC0, public domain, CC BY, CC BY-SA, Etalab Open Licence) and the author is known. Else it is null. Show credit and licence next to the photo.'}, 'access': {'enum': ['public', 'permissive', 'customers', 'scheme', 'unknown'], 'type': 'string', 'description': 'Who may use the toilet. public: anyone. permissive: anyone, no purchase needed. customers: customers only. scheme: a public scheme opens a business toilet to everyone.'}, 'gender': {'type': 'array', 'items': {'enum': ['unisex', 'female', 'male'], 'type': 'string'}, 'description': 'Who the toilet is for. Empty when not known.'}, 'source': {'type': 'string'}, 'partner': {'anyOf': [{'type': 'null'}, {'type': 'object', 'required': ['name', 'tier', 'conditions', 'opening_hours', 'open_now', 'closes_at'], 'properties': {'name': {'type': 'string', 'description': 'Business name that the partner gave and a moderator approved.'}, 'tier': {'enum': ['basic', 'plus'], 'type': 'string'}, 'open_now': {'anyOf': [{'type': 'boolean'}, {'const': 'unknown'}], 'description': "Open state from the hours of the business and its live switch, at the toilet's local time. false: the business closed the toilet for now, or its hours say closed. unknown: the business gave no usable hours."}, 'closes_at': {'type': ['string', 'null'], 'description': 'Local closing time with UTC offset, from the hours of the business. Null when unknown or when it never closes.'}, 'conditions': {'anyOf': [{'enum': ['everyone', 'customers'], 'type': 'string'}, {'type': 'null'}], 'description': 'What the business says about who may use the toilet. everyone: free for everyone. customers: customers only. Null when the business said nothing. It is the word of the business, not a checked fact.'}, 'opening_hours': {'type': ['string', 'null'], 'description': 'Opening hours that the business entered, in OpenStreetMap opening_hours syntax. Null when it entered none.'}}, 'additionalProperties': False}], 'description': "Set when the business behind the toilet pays for a Verified Partner listing. It buys visibility and a label. It never changes the order of the results. Show it as a label only. Conditions, opening_hours and open_now are statements of the business. The toilet's own fields (access, opening_hours, open_now) stay as they are."}, 'open_now': {'anyOf': [{'type': 'boolean'}, {'const': 'unknown'}], 'description': "Evaluated at the toilet's local time. The value unknown means the source has no usable hours."}, 'operator': {'type': ['string', 'null']}, 'closes_at': {'type': ['string', 'null'], 'description': 'Local closing time with UTC offset. Null when unknown or when it never closes.'}, 'confidence': {'enum': ['high', 'medium', 'low'], 'type': 'string'}, 'directions': {'type': 'object', 'required': ['google', 'apple'], 'properties': {'apple': {'type': 'string', 'format': 'uri'}, 'google': {'type': 'string', 'format': 'uri'}}, 'additionalProperties': False}, 'provenance': {'type': 'object', 'required': ['source', 'checked', 'decided'], 'properties': {'source': {'type': 'string', 'description': 'Source of the toilet record, for example osm.'}, 'checked': {'type': ['string', 'null'], 'description': 'Month of the last check in the source, for example 2025-06.'}, 'decided': {'type': 'object', 'description': 'Facts that people or a moderator decided. The keys are access, fee, fee_amount, wheelchair, changing_table, gender, opening_hours, name, operator and existence.', 'propertyNames': {'enum': ['access', 'fee', 'fee_amount', 'wheelchair', 'changing_table', 'gender', 'opening_hours', 'name', 'operator', 'existence']}, 'additionalProperties': {'type': 'object', 'required': ['by', 'votes_for', 'votes_total', 'as_of'], 'properties': {'by': {'enum': ['votes', 'moderator'], 'type': 'string', 'description': 'votes: most people voted for the shown value. moderator: a moderator locked the value.'}, 'as_of': {'type': 'string', 'description': 'Date of the last count.'}, 'votes_for': {'type': ['integer', 'null'], 'minimum': 0, 'description': 'People who voted for the shown value. The source value counts as one vote. Null for a moderator.'}, 'votes_total': {'type': ['integer', 'null'], 'minimum': 0, 'description': 'All votes in the last 24 months, including the source value.'}}, 'additionalProperties': False}}}, 'description': 'Where the facts come from. People can correct every fact. A value that most people vote for replaces the source value. Every fact comes from the source, unless decided lists it.', 'additionalProperties': False}, 'wheelchair': {'enum': ['yes', 'limited', 'no', 'unknown'], 'type': 'string'}, 'access_rule': {'enum': ['free', 'fee', 'customers', 'key', 'scheme', 'unknown'], 'type': 'string', 'description': 'free and fee: public toilet. customers: purchase or customer status needed. key: key needed. scheme: a public scheme opens a business toilet to everyone. unknown: fee not known.'}, 'cleanliness': {'anyOf': [{'type': 'object', 'required': ['average', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 1}, 'average': {'type': 'number', 'maximum': 5, 'minimum': 1}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'User ratings from 1 (dirty) to 5 (spotless). Each person has one rating, and the latest counts. Null when nobody rated it.'}, 'scheme_name': {'type': ['string', 'null']}, 'confirmations': {'type': 'integer', 'minimum': 0, 'description': 'User confirmations in the last 12 months.'}, 'opening_hours': {'type': ['string', 'null'], 'description': 'OpenStreetMap opening_hours syntax.'}, 'changing_table': {'enum': ['yes', 'no', 'unknown'], 'type': 'string'}, 'last_confirmed_at': {'type': ['string', 'null']}, 'verification_state': {'enum': ['unverified', 'source_claimed', 'community_confirmed', 'partner_confirmed', 'disputed'], 'type': 'string', 'description': 'disputed: an open user report says the toilet is gone, closed or wrong.'}}, 'additionalProperties': False}, 'attribution': {'type': 'object', 'required': ['text', 'license', 'url', 'license_notice_url'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'text': {'type': 'string', 'examples': ['© OpenStreetMap contributors']}, 'license': {'type': 'string', 'examples': ['ODbL-1.0']}, 'license_notice_url': {'type': 'string', 'format': 'uri', 'description': 'The page that lists every source with its licence and offers the data dumps.'}}, 'additionalProperties': False}, 'display_note': {'type': 'string'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['code', 'message', 'status', 'attribution'], 'properties': {'code': {'type': 'string'}, 'status': {'type': 'integer'}, 'message': {'type': 'string'}, 'attribution': {'type': 'object', 'required': ['text', 'license', 'url', 'license_notice_url'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'text': {'type': 'string', 'examples': ['© OpenStreetMap contributors']}, 'license': {'type': 'string', 'examples': ['ODbL-1.0']}, 'license_notice_url': {'type': 'string', 'format': 'uri', 'description': 'The page that lists every source with its licence and offers the data dumps.'}}, 'additionalProperties': False}, 'invalid_params': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'reason'], 'properties': {'name': {'type': 'string'}, 'reason': {'type': 'string'}}}}, 'retry_after_seconds': {'type': 'integer'}}, 'additionalProperties': False}]}
추가됨
get_toilet
2026년 10월 5일 2:40 AM
추가됨
find_toilets_near
2026년 10월 5일 2:40 AM