Skip to main content
Glama

fuel-map-mcp

국내 여행 경로 상에서 가장 저렴한 주유소를 찾아주는 MCP 서버입니다.

아이디어: "서울에서 부산까지 가는 길에 기름이 떨어져가는데, 어디서 주유하는 게 가장 쌀까?"

카카오 내비게이션 API로 경로를 받아오고, 오피넷 API를 실시간으로 조회하여 경로상에서 가장 저렴한 주유소 5곳을 찾아줍니다.

주요 기능

  • 경로 조회: 출발지와 목적지를 입력하면 Kakao Mobility API로 최적 경로 계산

  • 최저가 주유소 검색: 경로를 2km 간격으로 샘플링하여 각 지점에서 1km 반경 내 주유소를 검색하고 최저가 5곳 반환

  • 좌표계 변환: WGS84 ↔ KATEC 자동 변환으로 정확한 위치 검색

  • 다양한 유종 지원: 휘발유, 경유, 등유, LPG

Related MCP server: opinet-mcp

아키텍처

[사용자: "강남역→판교역 최저가 주유소"]
                │
                ▼
    ┌─────────────────────────────┐
    │  카카오 Local API             │
    │  주소/장소명 → WGS84 좌표 변환  │
    └──────────┬──────────────────┘
               │
               ▼
    ┌─────────────────────────────┐
    │  카카오 Mobility API          │
    │  경로 조회 (거리, 시간, 좌표)    │
    └──────────┬──────────────────┘
               │
               ▼
    ┌─────────────────────────────┐
    │  경로 샘플링                   │
    │  2km 간격으로 좌표 추출         │
    │  (Haversine 거리 계산)         │
    └──────────┬──────────────────┘
               │
               ▼
    ┌─────────────────────────────┐
    │  Opinet API (실시간)          │
    │                              │
    │  각 샘플링 지점마다:            │
    │  • WGS84 → KATEC 변환         │
    │  • 1km 반경 내 주유소 검색      │
    │  • 가격순 정렬                 │
    │  • 중복 제거                  │
    └──────────┬──────────────────┘
               │
               ▼
    ┌─────────────────────────────┐
    │  응답 (MCP Tool)              │
    │                              │
    │  • 경로 정보 (거리, 시간)        │
    │  • 최저가 주유소 5곳:           │
    │    - 주유소명 / 브랜드          │
    │    - 가격 (원)                │
    │    - 경로 지점으로부터 거리 (m)  │
    │    - 좌표 (WGS84)             │
    └─────────────────────────────┘

설치 및 실행

환경 변수 설정

.env 파일에 API 키를 설정합니다:

KAKAO_REST_API_KEY=your_kakao_api_key
OPINET_API_KEY=your_opinet_api_key

로컬 실행

# 의존성 설치
uv sync

# MCP 서버 실행
python main.py

Docker 실행

# 이미지 빌드
docker build -t fuel-map-mcp .

# 컨테이너 실행
docker run -p 8000:8000 --env-file .env fuel-map-mcp

MCP Tools

1. get_route

출발지와 목적지를 입력받아 경로 정보를 반환합니다.

Parameters:

  • origin (str): 출발지 주소 또는 장소명

  • destination (str): 목적지 주소 또는 장소명

  • priority (str, optional): 경로 우선순위 (RECOMMEND, TIME, DISTANCE)

Returns:

  • 거리 (km)

  • 소요시간 (분)

  • 통행료, 택시 요금

  • 출발지/목적지 좌표

  • 경로 좌표 목록

2. find_cheapest_gas_stations_nearby

특정 위치 근처의 최저가 주유소 5곳을 찾습니다.

Parameters:

  • location (str): 위치 주소 또는 장소명 (예: "강남역", "서울시 강남구 테헤란로 212")

  • fuel_type (str, optional): 유종 코드

    • B027: 휘발유 (기본값)

    • D047: 경유

    • K015: 등유

    • C004: LPG

  • radius (int, optional): 검색 반경 (미터, 최대 5000, 기본: 1000)

Returns:

  • 검색 위치 정보 (이름, 좌표)

  • 최저가 주유소 5곳 (이름, 브랜드, 가격, 거리, 좌표)

  • 발견된 총 주유소 수

3. find_cheapest_gas_stations_on_route

경로상의 최저가 주유소 5곳을 찾습니다.

Parameters:

  • origin (str): 출발지 주소 또는 장소명

  • destination (str): 목적지 주소 또는 장소명

  • fuel_type (str, optional): 유종 코드

    • B027: 휘발유 (기본값)

    • D047: 경유

    • K015: 등유

    • C004: LPG

  • priority (str, optional): 경로 우선순위

Returns:

  • 경로 정보 (거리, 시간, 출발/도착지)

  • 최저가 주유소 5곳 (이름, 브랜드, 가격, 거리, 좌표)

  • 샘플링된 지점 수

  • 발견된 총 주유소 수

기술 스택

  • Python 3.13+

  • FastMCP: MCP 서버 프레임워크

  • httpx: 비동기 HTTP 클라이언트

  • pyproj: 좌표계 변환 (WGS84 ↔ KATEC)

  • python-dotenv: 환경 변수 관리

API 출처

License

This project is proprietary software.

Copyright (c) 2026 서지운 and 정보성

All rights reserved.

Unauthorized copying, modification, distribution, or use of this software, via any medium, is strictly prohibited without the express written permission of the copyright holders.

For licensing inquiries, please contact the copyright holders.

Available Tools

3 tools
find_cheapest_gas_stations_nearbyA
Read-onlyIdempotent

Finds the 5 cheapest gas stations near a specific location using Fuel Station Compass(주유소 나침반).

This tool searches for gas stations within the specified radius using Opinet API and returns the top 5 cheapest options sorted by price.

Args: location: Location address or place name (e.g., "Gangnam Station", "Seoul Gangnam-gu Teheran-ro 212") fuel_type: Fuel type code - B027: Gasoline(default), D047: Diesel, K015: Kerosene, C004: LPG radius: Search radius in meters (max 5000, default: 1000)

Returns: location: Search location name gas_stations: Top 5 cheapest gas stations [ { "name": Station name, "brand": Brand name, "price": Price in KRW, "distance": Distance from location in meters }, ... ]

ParametersJSON Schema
NameRequiredDescriptionDefault
radiusNo
locationYes
fuel_typeNoB027

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's added value is its disclosure of behavior beyond that: results are hard-capped at the top 5, sorted by price, sourced from the Opinet API, and radius is bounded at 5000m. It stops short of describing error behavior or what happens when fewer than 5 stations exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then organized into Args and Returns sections that are easy to scan. The only slight padding is the vendor name 'Fuel Station Compass(주유소 나침반)' and a redundant restatement of the sort order already implied by 'cheapest'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by documenting the return shape (location plus an array of stations with name, brand, price, distance). Combined with the fully documented parameters and annotations, an agent has everything needed to invoke and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning and it does: location is given with concrete example formats, fuel_type enumerates all four codes with the default (B027 Gasoline), and radius specifies units, maximum (5000m) and default (1000m). Nothing about the parameters is left ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (finds) and resource (the 5 cheapest gas stations) with clear scope: near a specified location, within a radius. An agent can immediately tell what it returns. It does not explicitly differentiate itself from the sibling find_cheapest_gas_stations_on_route, relying on the name and the phrase 'near a specific location' to imply the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never states when to prefer this tool over find_cheapest_gas_stations_on_route or get_route, nor any prerequisites or exclusions. Usage is only implied by the tool name and the 'near a specific location' phrasing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_cheapest_gas_stations_on_routeA
Read-onlyIdempotent

Finds the 5 cheapest gas stations along a route using Fuel Station Compass(주유소 나침반).

Samples the route and searches for gas stations within 1km radius at each point, returning the top 5 cheapest options.

Args: origin: Starting location (e.g., "Gangnam Station") destination: Destination (e.g., "Pangyo Station") fuel_type: B027(Gasoline), D047(Diesel), K015(Kerosene), C004(LPG) priority: RECOMMEND | TIME | DISTANCE (default: RECOMMEND)

Returns: route_info: Route details (distance_km, duration_min, origin/destination names) gas_stations: Top 5 cheapest stations with name, brand, price, distance

ParametersJSON Schema
NameRequiredDescriptionDefault
originYes
priorityNoRECOMMEND
fuel_typeNoB027
destinationYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds genuine behavioral context beyond that: the route is sampled, a 1km radius search is run per sample point, and results are capped at the top 5 cheapest. It lacks detail on rate limits or sampling granularity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope in the first sentence, then args and returns. The structure is clean and each line carries content, though the Args/Returns framing is slightly verbose for a four-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description spells out the return shape (route_info with distance_km/duration_min, and gas_stations with name/brand/price/distance), and all four parameters plus the sampling behavior are documented. An agent has everything needed to call and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden, and it does: origin/destination with examples, fuel_type with the actual code values (B027, D047, K015, C004) mapped to fuel names, and priority with its three allowed values and default. This is information the schema does not encode.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (finds cheapest gas stations) plus a scope qualifier ('along a route') that separates it from the sibling find_cheapest_gas_stations_nearby. An agent can distinguish it from get_route as well, since the returned entity is stations, not a route.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the name and scope – use this when you have an origin and destination and want stations along the path – but there is no explicit when-to-use/when-not guidance and the sibling find_cheapest_gas_stations_nearby is never mentioned, even though choosing between the two is the main routing decision.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_routeA
Read-onlyIdempotent

Retrieves route information between origin and destination using Fuel Station Compass(주유소 나침반).

This tool queries Kakao Mobility API to get detailed route information including distance, duration, tolls, and route coordinates.

Args: origin: Starting location address or place name (e.g., "Gangnam Station", "Seoul Gangnam-gu Teheran-ro 212") destination: Destination address or place name (e.g., "Pangyo Station") priority: Route priority - RECOMMEND | TIME | DISTANCE (default: RECOMMEND)

Returns: distance_km: Total distance in kilometers (1 decimal place) duration_min: Estimated travel time in minutes toll_fare: Toll fees in KRW taxi_fare: Estimated taxi fare in KRW origin: Origin location name and coordinates destination: Destination location name and coordinates

ParametersJSON Schema
NameRequiredDescriptionDefault
originYes
priorityNoRECOMMEND
destinationYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond that: it discloses the external dependency (Kakao Mobility API) and enumerates the returned fields, which is more than the annotations provide. Minor tension: it describes an external API call while annotations set openWorldHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line purpose, then Args/Returns blocks that are easy to scan. The Returns block is justified because there is no output schema, though the prose is slightly padded ('using Fuel Station Compass', parenthetical examples) relative to its information content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the Returns section correctly documents distance, duration, toll, taxi fare, and resolved origin/destination. Inputs are fully covered. The only real gap is the absence of any routing guidance relative to sibling tools, which is a usage concern rather than a completeness-of-call concern.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema has no enums, so the description carries the full burden — and it does: it documents all three parameters, gives concrete address/place-name examples for origin and destination, and supplies the RECOMMEND | TIME | DISTANCE value set plus the default that the schema omits entirely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Retrieves) and resource (route information between origin and destination), names the upstream service (Kakao Mobility API) and the branded surface (Fuel Station Compass). This clearly separates it from the two sibling gas-station search tools, which find stations rather than compute routes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says what the tool does but never says when to choose it over the siblings, nor that find_cheapest_gas_stations_on_route is the natural follow-up to a route it returns. There are no prerequisites, exclusions, or alternative-routing guidance.

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.

  1. 3 tool updatesv0.1.0
    • First observedfind_cheapest_gas_stations_nearby
    • First observedfind_cheapest_gas_stations_on_route
    • First observedget_route

TDQS

A3.9/5.0

Scored across 3 tools

Disambiguation4/5

The three tools have distinct purposes: route retrieval, station search near a point, and station search along a route. The two station-finding tools could be momentarily confused, but the 'nearby' vs 'on_route' naming and the differing required arguments (location vs origin/destination) clearly delineate them.

Naming Consistency3/5

Naming is mixed: 'get_route' uses a verb_noun pattern, while the other two are long descriptive phrases starting with 'find_'. The inconsistency is readable but breaks a predictable convention.

Tool Count3/5

Three tools is borderline thin for a fuel-mapping service. It covers core needs, but adding tools like price alerts or station details would likely be expected.

Completeness4/5

The surface covers route retrieval and finding cheap stations both nearby and along a route. Missing are operations like getting station details, user preferences, or fuel price trends, but the core workflow is complete.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides access to Korea Petroleum Corporation's Opinet fuel price API for South Korea. Enables querying of current national and regional fuel averages, recent price trends, lowest-price stations, and nearby gas station details through natural language.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Integrates Korean APIs (Naver, Kakao, TMAP) into LLM applications for search, maps, and directions.
    1
    10
    MIT