{
  "tools": [
    {
      "name": "get_tenors",
      "title": "Supported Tenors",
      "description": "/v1/fx/tenors. Lists supported tenors separately for USD interest rates (`usdRate`) and FX forwards (`fxForward`).\nThe lists are independent of quote availability and can differ; a rate tenor does not imply an FX forward tenor.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$defs": {
          "Tenor": {
            "type": "string",
            "enum": [
              "1D",
              "SN",
              "1W",
              "2W",
              "3W",
              "1M",
              "2M",
              "3M",
              "4M",
              "5M",
              "6M",
              "7M",
              "8M",
              "9M",
              "10M",
              "11M",
              "1Y",
              "12M"
            ]
          }
        },
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "fxForward": {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/Tenor"
                }
              },
              "usdRate": {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/Tenor"
                }
              }
            },
            "required": [
              "fxForward",
              "usdRate"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Supported Tenors",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/tenors"
      }
    },
    {
      "name": "get_currency_pairs",
      "title": "Supported Currency Pairs",
      "description": "/v1/fx/currency-pairs. Lists currencies and currency pairs published by the calculation conventions.\nThe plural list keys are `currencies` and `pairs`. Returns USDKRW and USDJPY in `pairs`,\nwith JPY, KRW and USD in `currencies`.\nSpot and forward quote availability is described by each quote operation.\nCurrency and pair conventions are available from `/v1/fx/config`.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "currencies": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "JPY",
                    "KRW",
                    "USD"
                  ]
                }
              },
              "pairs": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "USDKRW",
                    "USDJPY",
                    "JPYKRW"
                  ]
                }
              }
            },
            "required": [
              "currencies",
              "pairs"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Supported Currency Pairs",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/currency-pairs"
      }
    },
    {
      "name": "get_config",
      "title": "Calculation Conventions",
      "description": "/v1/fx/config. Returns currency day-count conventions and calendars in `currencies`, and base currency,\nquote currency, spot lag and point factor in `pairs`. A currency listed here has published\nconventions; it does not follow that every product accepts it. JPY conventions are listed\nwhile `zero-rate` and `discount-factor` still serve USD and KRW only.\n\n`currencies` carries one row per currency, identified by `currency`. `curveMethod` describes\nthe active production calculation path: `OIS_BOOTSTRAP` builds USD from SOFR OIS quotes, while\n`FX_SWAP_IMPLIED` derives KRW and JPY from the USD curve and FX spot and swap points.\n`daycount` is the convention used to report rates from that curve. It does not advertise\nan OIS convention that the production curve builder does not use.\n\n`pointFactor` converts a quote-currency change to swap points:\n`points = (outright - spot) * pointFactor`. Convert points back to quote-currency units with\n`outright = spot + points / pointFactor`. Both USDKRW and USDJPY currently use 100.\nThese are reference conventions; quote responses provide their applicable settlement dates.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$defs": {
          "Currency": {
            "type": "string",
            "enum": [
              "JPY",
              "KRW",
              "USD"
            ]
          }
        },
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "currencies": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "calendar": {
                      "type": "string",
                      "enum": [
                        "USD_NEWYORK",
                        "KRW_SEOUL",
                        "JPY_TOKYO"
                      ]
                    },
                    "currency": {
                      "$ref": "#/$defs/Currency"
                    },
                    "curveMethod": {
                      "type": "string",
                      "enum": [
                        "OIS_BOOTSTRAP",
                        "FX_SWAP_IMPLIED"
                      ],
                      "description": "Method used to construct the published curve for this currency."
                    },
                    "daycount": {
                      "type": "string",
                      "enum": [
                        "ACT/360",
                        "ACT/365"
                      ],
                      "description": "Actual-day convention used when reporting rates from this curve."
                    }
                  },
                  "required": [
                    "calendar",
                    "currency",
                    "curveMethod",
                    "daycount"
                  ]
                }
              },
              "pairs": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "base": {
                      "$ref": "#/$defs/Currency"
                    },
                    "pair": {
                      "type": "string",
                      "enum": [
                        "USDKRW",
                        "USDJPY",
                        "JPYKRW"
                      ]
                    },
                    "pointFactor": {
                      "type": "number",
                      "description": "Multiplier from the quote-currency change to swap points: points = (outright - spot) * pointFactor. Convert points back by dividing by this value."
                    },
                    "quote": {
                      "$ref": "#/$defs/Currency"
                    },
                    "spotLag": {
                      "type": "integer"
                    }
                  },
                  "required": [
                    "base",
                    "pair",
                    "pointFactor",
                    "quote",
                    "spotLag"
                  ]
                }
              }
            },
            "required": [
              "currencies",
              "pairs"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Calculation Conventions",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/config"
      }
    },
    {
      "name": "calculate_dates",
      "title": "Settlement and Maturity Dates",
      "description": "/v1/fx/calculate-dates. Calculates `spotDate` from `tradeDate` and the currency pair's spot lag, then adds the tenor and\nadjusts to obtain `maturityDate`. Business days require both New York and Seoul to be open.\n`isTradeDateBusinessDay`, `isSpotDateEom` and `eomRuleApplied` explain the result;\nend of month means the last business day, not necessarily the last calendar day.\n`spotDays` overrides the default lag. Disabling `eomRule` skips the end-of-month rule.\nFor `OVERNIGHT`, `TOM_NEXT` and `SPOT_NEXT` anchors, business-day offsets replace the tenor.\nCalendar coverage is currently limited to 2026; unavailable coverage returns error code 5000 without estimating dates.\nCalculation conventions and holiday data are provisional and results may change.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "anchor": {
            "type": "string",
            "enum": [
              "SPOT",
              "OVERNIGHT",
              "TOM_NEXT",
              "SPOT_NEXT"
            ],
            "default": "SPOT"
          },
          "eomRule": {
            "type": "boolean",
            "description": "Applies to month and year tenors only. Day and week tenors roll Following and are unaffected by this flag; `eomRuleApplied` reports what was used.",
            "default": true
          },
          "pair": {
            "type": "string",
            "default": "USDKRW"
          },
          "spotDays": {
            "type": [
              "integer",
              "null"
            ]
          },
          "tenor": {
            "type": "string",
            "enum": [
              "1D",
              "SN",
              "1W",
              "2W",
              "3W",
              "1M",
              "2M",
              "3M",
              "4M",
              "5M",
              "6M",
              "7M",
              "8M",
              "9M",
              "10M",
              "11M",
              "1Y",
              "12M"
            ]
          },
          "tradeDate": {
            "type": "string",
            "format": "date"
          }
        },
        "required": [
          "tenor",
          "tradeDate"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "businessDays": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "calendars": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "daysToMaturity": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "eomRuleApplied": {
                "type": "boolean"
              },
              "isSpotDateEom": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "isTradeDateBusinessDay": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "maturityDate": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "pair": {
                "type": "string"
              },
              "spotDate": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "spotDays": {
                "type": "integer"
              },
              "tenor": {
                "type": "string",
                "enum": [
                  "1D",
                  "SN",
                  "1W",
                  "2W",
                  "3W",
                  "1M",
                  "2M",
                  "3M",
                  "4M",
                  "5M",
                  "6M",
                  "7M",
                  "8M",
                  "9M",
                  "10M",
                  "11M",
                  "1Y",
                  "12M"
                ]
              },
              "tradeDate": {
                "type": "string",
                "format": "date"
              }
            },
            "required": [
              "calendars",
              "eomRuleApplied",
              "pair",
              "spotDays",
              "tenor",
              "tradeDate"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Settlement and Maturity Dates",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/calculate-dates"
      }
    },
    {
      "name": "get_spot",
      "title": "Spot Exchange Rate",
      "description": "/v1/fx/spot. Returns the spot exchange rate and settlement date for a currency pair. USDKRW is supported;\nUSDJPY is available when its spot service is enabled. Spot availability does not imply support for other calculations.\n`bid` and `ask` are quotes per USD 1; `spotRate` is their midpoint, or the available single rate.\nMissing or expired quotes produce null price fields and null `referenceAt`. `referenceAt` is the observation\ntime of the quote, not a retrieval time, and uses ISO-8601 with milliseconds in timeZone (UTC when omitted or null).\n`lastTradedPrice` and `lastTradedAt` describe the last available USDKRW trade, independently of quote expiry.\nThe trade timestamp includes the date and requested timeZone offset; lastTradedAtKst remains KST-fixed. Its date is inferred from the observation date\nand may be inaccurate for trades retransmitted after a market closure. Missing trade values are null;\na last trade does not necessarily represent a recent trade.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pair": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "description": "통화쌍",
            "default": "USDKRW"
          },
          "timeZone": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": [
              "string",
              "null"
            ],
            "description": "IANA area/location time zone for response timestamps, for example Asia/Seoul. Omitted or null means UTC. Calendar dates and prices are unchanged.",
            "default": "UTC"
          }
        },
        "required": [],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "ask": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Ask in KRW or JPY per USD; null when this side is not provided."
              },
              "bid": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Bid in KRW or JPY per USD; null when this side is not provided."
              },
              "lastTradedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Estimated trade date and time in timeZone (default UTC), with seconds; null without a trade clock. Date is inferred from the observation and can be inaccurate after closures.",
                "format": "date-time"
              },
              "lastTradedAtKst": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "KST-fixed legacy timestamp. Use lastTradedAt for the requested timeZone.",
                "format": "date-time"
              },
              "lastTradedPrice": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Last traded price from the latest priced LS observation; USDKRW only, otherwise null."
              },
              "pair": {
                "type": "string"
              },
              "referenceAt": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Snapshot observation time in timeZone (default UTC), with milliseconds; null when no snapshot exists.",
                "format": "date-time"
              },
              "spotDate": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "spotRate": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "pair"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Spot Exchange Rate",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/spot"
      }
    },
    {
      "name": "calculate_forward",
      "title": "Forward Exchange Rate",
      "description": "/v1/fx/calculate-forward. Calculates swap points and a forward exchange rate between `spotDate` and the later `targetDate`.\nThe requested spot date anchors the calculation; points are the difference between the curve values at both dates.\nStandard tenors use available values and intermediate dates use linear interpolation in calendar days.\nThere is no extrapolation beyond the curve: unavailable points or forward rates are null.\n`midPoints` is in pips and `mid` is in currency units (`midPoints / pointFactor`).\nRead `pointFactor` for the pair from `GET /v1/fx/config`.\n`referenceAt` is the observation time in timeZone (UTC when omitted or null); calendar dates are unchanged.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "pair": {
            "type": "string",
            "default": "USDKRW"
          },
          "spotDate": {
            "type": "string",
            "format": "date"
          },
          "targetDate": {
            "type": "string",
            "format": "date"
          },
          "timeZone": {
            "type": [
              "string",
              "null"
            ],
            "description": "IANA area/location time zone for response timestamps, for example Asia/Seoul. Omitted or null means UTC. Calendar dates and prices are unchanged.",
            "default": "UTC"
          }
        },
        "required": [
          "spotDate",
          "targetDate"
        ]
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "days": {
                "type": "integer"
              },
              "mid": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "midForward": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "midPoints": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "pair": {
                "type": "string"
              },
              "referenceAt": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Observation time of the source values in timeZone (default UTC), with milliseconds; null when no observation backs the response.",
                "format": "date-time"
              },
              "spotDate": {
                "type": "string",
                "format": "date"
              },
              "spotRate": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "targetDate": {
                "type": "string",
                "format": "date"
              }
            },
            "required": [
              "days",
              "pair",
              "spotDate",
              "targetDate"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Forward Exchange Rate",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/calculate-forward"
      }
    },
    {
      "name": "get_term_structure",
      "title": "Swap Point Term Structure",
      "description": "/v1/fx/term-structure. Returns available swap points by tenor for the currency pair. Missing tenors are omitted.\n`bid`, `ask` and `mid` are quote-currency units per USD 1; negative and zero points are valid.\n`mid` is the average of available two-sided quotes. Single-value quotes can have null `bid` and `ask`.\n`midPips` is `mid` converted to pips using the pair's `pointFactor` from `GET /v1/fx/config`.\nAn omitted `spotDate` uses the standard spot settlement date.\n`days` is the calendar-day interval to maturity; `spPerDay` is `mid / days` and is null for missing or nonpositive days.\nMissing dates are not estimated. With no available quotes, `points` is empty and `referenceAt` is null.\n`referenceDate` is the UTC date of the source observation, independent of timeZone.\nTimestamps use timeZone (default UTC); calendar dates are unchanged.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pair": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "description": "통화쌍",
            "default": "USDKRW"
          },
          "spotDate": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date",
            "description": "기준 결제일. 생략하면 스냅샷의 결제일"
          },
          "timeZone": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": [
              "string",
              "null"
            ],
            "description": "IANA area/location time zone for response timestamps, for example Asia/Seoul. Omitted or null means UTC. Calendar dates and prices are unchanged.",
            "default": "UTC"
          }
        },
        "required": [],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "pair": {
                "type": "string"
              },
              "points": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ask": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "bid": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "days": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "maturity": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date",
                      "description": "Use maturityDate."
                    },
                    "mid": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "midPips": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "spPerDay": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "tenor": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "tenor"
                  ]
                }
              },
              "referenceAt": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Observation time of the source values in timeZone (default UTC), with milliseconds; null when no observation backs the response.",
                "format": "date-time"
              },
              "referenceDate": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "spotDate": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "spotRate": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "pair",
              "points"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Swap Point Term Structure",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/term-structure"
      }
    },
    {
      "name": "get_swap_point",
      "title": "Forward Swap Points",
      "description": "/v1/fx/swap-point. Returns forward-starting swap points between `nearDate` and `farDate`, as far-leg points minus near-leg points.\n`nearDate` must follow `spotDate` and `farDate` must follow `nearDate`.\nEach leg uses the same interpolation as the forward calculation. If either leg is unavailable or outside\nthe curve, `fxf` is null. `referenceAt` is the observation time in timeZone (UTC when omitted or null); calendar dates are unchanged.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pair": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "description": "통화쌍",
            "default": "USDKRW"
          },
          "nearDate": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date",
            "description": "near leg 만기"
          },
          "farDate": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date",
            "description": "far leg 만기"
          },
          "spotDate": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date",
            "description": "기준 결제일. 생략하면 스냅샷의 결제일"
          },
          "timeZone": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": [
              "string",
              "null"
            ],
            "description": "IANA area/location time zone for response timestamps, for example Asia/Seoul. Omitted or null means UTC. Calendar dates and prices are unchanged.",
            "default": "UTC"
          }
        },
        "required": [
          "nearDate",
          "farDate"
        ],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$defs": {
          "SwapPointLeg": {
            "type": "object",
            "properties": {
              "fwdMid": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "mid": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          }
        },
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "far": {
                "$ref": "#/$defs/SwapPointLeg"
              },
              "farDays": {
                "type": "integer"
              },
              "farMaturity": {
                "type": "string",
                "format": "date",
                "description": "Use farMaturityDate."
              },
              "fxf": {
                "type": "object",
                "properties": {
                  "mid": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "midPips": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "near": {
                "$ref": "#/$defs/SwapPointLeg"
              },
              "nearDays": {
                "type": "integer"
              },
              "nearMaturity": {
                "type": "string",
                "format": "date",
                "description": "Use nearMaturityDate."
              },
              "pair": {
                "type": "string"
              },
              "referenceAt": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Observation time of the source values in timeZone (default UTC), with milliseconds; null when no observation backs the response.",
                "format": "date-time"
              },
              "spotDate": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "spotRate": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "far",
              "farDays",
              "farMaturity",
              "fxf",
              "near",
              "nearDays",
              "nearMaturity",
              "pair"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Forward Swap Points",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/swap-point"
      }
    },
    {
      "name": "get_zero_rate",
      "title": "Zero Rate",
      "description": "/v1/fx/zero-rate. Returns a zero rate for USD or KRW, for exactly one of `maturityDate` or `tenor`. The deprecated `date` alias is accepted only without `maturityDate`.\nA tenor resolves to a maturity date using the convention that built that curve: SOFR OIS termination for USD, the FX forward value date for the implied KRW curve.\nOther currencies are unsupported and answer 4000, which is different from a supported currency with no value.\nThe rate is derived from the discount factor using simple interest: `DF = 1 / (1 + r * yf)`.\n`curveBaseDate` is the curve's base date and may differ from the FX settlement date.\nOn the curve base date, `zeroRate` is null because the period is zero.\nMissing data or dates outside the curve produce null values; there is no extrapolation.\n`referenceAt` is the observation time of the curve inputs in timeZone (default UTC); calendar dates are unchanged.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "currency": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "description": "통화. USD와 KRW. `tenor`는 그 커브를 세운 관례로 만기일이 된다"
          },
          "date": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date",
            "deprecated": true,
            "description": "Deprecated alias for maturityDate. Do not supply both date names."
          },
          "tenor": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "enum": [
              "1D",
              "SN",
              "1W",
              "2W",
              "3W",
              "1M",
              "2M",
              "3M",
              "4M",
              "5M",
              "6M",
              "7M",
              "8M",
              "9M",
              "10M",
              "11M",
              "1Y",
              "12M"
            ],
            "description": "만기. `maturityDate`와 택일"
          },
          "timeZone": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": [
              "string",
              "null"
            ],
            "description": "IANA area/location time zone for response timestamps, for example Asia/Seoul. Omitted or null means UTC. Calendar dates and prices are unchanged.",
            "default": "UTC"
          },
          "maturityDate": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date",
            "description": "Maturity calendar date. Use either maturityDate or tenor, not both."
          }
        },
        "required": [
          "currency"
        ],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "allOf": [
              {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "currency": {
                    "type": "string",
                    "enum": [
                      "JPY",
                      "KRW",
                      "USD"
                    ]
                  },
                  "curveBaseDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date"
                  },
                  "date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date",
                    "description": "Use maturityDate."
                  },
                  "daycount": {
                    "anyOf": [
                      {
                        "type": "null"
                      },
                      {
                        "type": "string",
                        "enum": [
                          "ACT/360",
                          "ACT/365"
                        ]
                      }
                    ]
                  },
                  "referenceAt": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Observation time of the source values in timeZone (default UTC), with milliseconds; null when no observation backs the response.",
                    "format": "date-time"
                  },
                  "tenor": {
                    "anyOf": [
                      {
                        "type": "null"
                      },
                      {
                        "type": "string",
                        "enum": [
                          "1D",
                          "SN",
                          "1W",
                          "2W",
                          "3W",
                          "1M",
                          "2M",
                          "3M",
                          "4M",
                          "5M",
                          "6M",
                          "7M",
                          "8M",
                          "9M",
                          "10M",
                          "11M",
                          "1Y",
                          "12M"
                        ]
                      }
                    ]
                  },
                  "yearFraction": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "zeroRate": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                },
                "required": [
                  "currency"
                ],
                "description": "지정 통화·날짜의 zero rate. 커브 범위 밖이면 `zeroRate`가 `null`이다."
              },
              {
                "description": "payload. 실패 응답에서는 항상 `null`이다."
              }
            ]
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Zero Rate",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/zero-rate"
      }
    },
    {
      "name": "get_discount_factor",
      "title": "Discount Factor",
      "description": "/v1/fx/discount-factor. Returns a discount factor and corresponding simple-interest zero rate for USD or KRW, for exactly one\nof `maturityDate` or `tenor`. The deprecated `date` alias is accepted only without `maturityDate`.\nA tenor resolves to a maturity date using the convention that built that curve: SOFR OIS termination for USD, the FX forward value date for the implied KRW curve.\nOther currencies are unsupported and answer 4000, which is different from a supported currency with no value.\n`curveBaseDate` is the curve's base date and may differ from the FX settlement date.\nOn the curve base date, the discount factor is 1.0 and `zeroRate` is null.\nMissing data or dates outside the curve produce null values; there is no extrapolation.\n`referenceAt` is the observation time of the curve inputs in timeZone (default UTC); calendar dates are unchanged.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "currency": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "description": "통화. USD와 KRW. `tenor`는 그 커브를 세운 관례로 만기일이 된다"
          },
          "date": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date",
            "deprecated": true,
            "description": "Deprecated alias for maturityDate. Do not supply both date names."
          },
          "tenor": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "enum": [
              "1D",
              "SN",
              "1W",
              "2W",
              "3W",
              "1M",
              "2M",
              "3M",
              "4M",
              "5M",
              "6M",
              "7M",
              "8M",
              "9M",
              "10M",
              "11M",
              "1Y",
              "12M"
            ],
            "description": "만기. `maturityDate`와 택일"
          },
          "timeZone": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": [
              "string",
              "null"
            ],
            "description": "IANA area/location time zone for response timestamps, for example Asia/Seoul. Omitted or null means UTC. Calendar dates and prices are unchanged.",
            "default": "UTC"
          },
          "maturityDate": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date",
            "description": "Maturity calendar date. Use either maturityDate or tenor, not both."
          }
        },
        "required": [
          "currency"
        ],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "currency": {
                "type": "string",
                "enum": [
                  "JPY",
                  "KRW",
                  "USD"
                ]
              },
              "curveBaseDate": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "date": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date",
                "description": "Use maturityDate."
              },
              "daycount": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "string",
                    "enum": [
                      "ACT/360",
                      "ACT/365"
                    ]
                  }
                ]
              },
              "discountFactor": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "referenceAt": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Observation time of the source values in timeZone (default UTC), with milliseconds; null when no observation backs the response.",
                "format": "date-time"
              },
              "tenor": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "string",
                    "enum": [
                      "1D",
                      "SN",
                      "1W",
                      "2W",
                      "3W",
                      "1M",
                      "2M",
                      "3M",
                      "4M",
                      "5M",
                      "6M",
                      "7M",
                      "8M",
                      "9M",
                      "10M",
                      "11M",
                      "1Y",
                      "12M"
                    ]
                  }
                ]
              },
              "yearFraction": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "zeroRate": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "currency"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Discount Factor",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/fx/discount-factor"
      }
    },
    {
      "name": "get_business_day",
      "title": "Business Day",
      "description": "/v1/calendars/business-day. Returns the business day at `offset` business days from `date` in the selected `calendar`.\n`offset` 0 returns `date` itself when it is a business day, and the next business day otherwise.\nPositive values move forward and negative values move backward; the range is -30 to 30.\n`isBusinessDay` and `reason` describe the requested `date`; `resultDate` is the answer.\n`certainty` describes `resultDate`: PREDICTED when any day the search passed through comes from a\nrule-generated revision, so the answer can move once the real holiday schedule is published.\nDates outside the calendar's published coverage return an error.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "date": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "format": "date"
          },
          "calendar": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "string",
            "enum": [
              "USD_NEWYORK",
              "KRW_SEOUL",
              "JPY_TOKYO"
            ]
          },
          "offset": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "integer",
            "default": 0
          }
        },
        "required": [
          "date",
          "calendar"
        ],
        "additionalProperties": true
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "성공은 `0`. 실패는 에러 번호(`4000`·`4220`·`5000`)."
          },
          "data": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "calendar": {
                "type": "string",
                "enum": [
                  "USD_NEWYORK",
                  "KRW_SEOUL",
                  "JPY_TOKYO"
                ]
              },
              "certainty": {
                "type": "string"
              },
              "date": {
                "type": "string",
                "format": "date"
              },
              "isBusinessDay": {
                "type": "boolean"
              },
              "reason": {
                "type": "string"
              },
              "resultDate": {
                "type": "string",
                "format": "date"
              }
            },
            "required": [
              "calendar",
              "certainty",
              "date",
              "isBusinessDay",
              "reason",
              "resultDate"
            ],
            "description": "payload. 실패 응답에서는 항상 `null`이다."
          },
          "message": {
            "type": "string",
            "description": "성공은 빈 문자열. 실패는 유저에게 노출해도 되는 메시지."
          },
          "meta": {
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "clientRequestId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Client correlation value received in X-Request-ID; null when absent."
                  },
                  "requestAt": {
                    "type": "string",
                    "description": "UTC time when the server received the request."
                  },
                  "requestId": {
                    "type": "string",
                    "description": "Server-generated UUID for response and log correlation."
                  },
                  "responseAt": {
                    "type": "string",
                    "description": "UTC time when the response envelope was created."
                  }
                },
                "required": [
                  "clientRequestId",
                  "requestAt",
                  "requestId",
                  "responseAt"
                ],
                "description": "Request-response metadata shared by REST and MCP results."
              },
              {
                "description": "REST와 MCP가 공유하는 요청·응답 처리 메타데이터."
              }
            ]
          }
        },
        "required": [
          "code",
          "message",
          "meta"
        ],
        "description": "\n        SNAP 응답 래퍼. 성공은 `code: 0` · `message: \"\"`이고 payload는 `data`에 담긴다.\n        프런트엔드는 `code`로 분기한다.\n\n        **\"데이터 없음\"은 실패가 아니다.** 요청이 유효한데 스냅샷이 아직 안 들어왔거나 요청한\n        만기가 커브 범위 밖이면 `code: 0`으로 응답하고 `data` 안쪽 필드를 `null`로 둔다.\n    "
      },
      "annotations": {
        "title": "Business Day",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "restPath": "/v1/calendars/business-day"
      }
    }
  ]
}
