货币汇率API工具

Frankfurter MCP是一个基于Frankfurter API的货币汇率查询和转换工具,通过Model Context Protocol(MCP)为语言模型代理提供访问服务。

  • by anirbanbasu
  • Python
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 anirbanbasu/frankfurtermcp

使用说明

法兰克福MCP

法兰克福香肠 是一个有用的API,用于欧洲中央银行等来源发布的最新货币汇率、历史数据或时间序列。如果您必须访问Frankfurter API作为通过模型上下文协议(MCP)公开的语言模型代理的工具,则您需要FrankfurterMCP。

安装

如果您的目标是使用此MCP服务器上可用的工具,请参阅下面的用法>客户端小节.

克隆此存储库的目录将称为 工作目录 或 西部数据 在下文中。

安装 只是 管理项目任务。

安装 紫外线。若要在虚拟环境中安装依赖关系最小的项目,请运行 just install 在 西部数据。安装所有非必需的依赖项(这些是开发和测试所必需的),跑 just install-all 相反。

环境变量

以下是可用于配置应用程序的环境变量列表。文件中提供了环境变量模板 .env.template. 请注意,下表中列出的默认值并不总是与 .env.template 文件.

可以指定以下环境变量,前缀为 FASTMCP_: HOST, PORT, DEBUG 和 LOG_LEVEL.

底层HTTP客户端还尊重一些环境变量,如中所述 HTTPX库此外, SSL_CERT_FILE 和 SSL_CERT_DIR 可以配置为使用托管API端点或中间HTTP(S)代理服务器的自签名证书。

法兰克福MCP将缓存对法兰克福API的调用,以提高性能。缓存有两种不同的策略。对于响应对于某些参数(例如历史速率查找)不变的API调用,使用最近最少使用(LRU)缓存。对于响应确实发生变化的API调用,例如最新速率查找,使用生存时间(TTL)缓存,默认生存时间设置为15分钟。可以使用环境变量调整缓存参数,见下文。

变量 [默认值]和描述
LOG_LEVEL [信息]日志记录级别。更改此级别也会影响可能使用相同环境变量的其他依赖库的日志输出。请参阅以下有效值 Python日志记录文档.
HTTPX_TIMEOUT [5.0]底层HTTP客户端等待法兰克福API响应的时间(以秒为单位)。可接受的值范围在5.0到60.0之间。
HTTPX_VERIFY_SSL [True]如果您使用的是具有自签名证书的代理服务器,则可以将此变量设置为False以关闭SSL证书验证。但是,将其设置为False 建议不要:请改用 SSL_CERT_FILE 和 SSL_CERT_DIR 变量,以正确配置自签名证书。
FAST_MCP_HOST [localhost]此变量指定MCP服务器必须绑定到哪个主机,除非服务器传输(见下文)设置为 stdio. 请注意,通过指定以下内容运行服务器以绑定到任何IP 0.0.0.0 构成安全威胁。这样的设置只应在演示环境中使用。
FAST_MCP_PORT [8000]此变量指定MCP服务器必须侦听的端口,除非服务器传输(见下文)设置为 stdio.
CORS_MIDDLEWARE_ALLOW_ORIGINS [“localhost”,“127.0.0.1”]此变量指定 跨源资源共享(CORS) 除非服务器传输(见下文)设置为 stdio.你 必须 如果您想使用以下命令通过HTTP传输测试此服务器,请将其显式设置为“*”(这样做会收到警告) MCP检查员如下所述.
MCP_SERVER_TRANSPORT [stdio]可接受的选项是 stdio, sse 或 streamable-http然而,在 .env.template,默认值设置为 stdio.
MCP_SERVER_INCLUDE_METADATA_IN_RESPONSE [True]这指定了每次工具调用的MCP响应中是否包含其他元数据。例如,附加元数据将包括法兰克福服务器的API URL等,用于获得响应。
FRANKFURTER_API_URL [https://api.frankfurter.dev/v1]如果你是 自托管法兰克福API,您应该将其更改为部署的API端点地址。
LRU_CACHE_MAX_SIZE [1024]API调用的最近最少使用(LRU)缓存的最大大小。可接受的值范围在128到65536之间。
TTL_CACHE_MAX_SIZE [256]API调用的生存时间(TTL)缓存的最大大小。可接受的值范围在64到16384之间。
TTL_CACHE_TTL_SECONDS [900]API调用的生存时间(TTL)缓存的时间限制(以秒为单位)。可接受的值范围在60到3600之间。
UVICORN_LIMIT_CONCURRENCY [100]服务器将接受的最大并发连接数。这有助于防止因太多同时连接而导致的资源耗尽。仅适用于使用HTTP传输时(sse 或 streamable-http).可接受的值范围在10到10000之间。
UVICORN_TIMEOUT_KEEP_ALIVE [60]保持空闲连接活动的超时时间(秒)。在此期间之后,空闲连接将被关闭以释放资源。仅适用于使用HTTP传输时(sse 或 streamable-http).可接受的值范围在60到300之间。
UVICORN_TIMEOUT_GRACEFUL_SHUTDOWN [5]正常关机的超时时间(秒)。服务器将等待活动连接完成这么长时间,然后强制关闭。仅适用于使用HTTP传输时(sse 或 streamable-http).可接受的值范围在5到60之间。
RATE_LIMIT_MAX_REQUESTS_PER_SECOND [10.0]使用令牌桶算法每秒允许的最大请求数。这实施了费率限制,以防止API滥用,并确保公平的资源分配。可接受的值范围在1.0到10000.0之间。
RATE_LIMIT_BURST_CAPACITY [20]速率限制器的突发容量,允许超过每秒限制的短突发请求。这为合法的使用模式提供了灵活性,同时仍然可以防止持续的高请求率。可接受的值范围在2x和5x之间 RATE_LIMIT_MAX_REQUESTS_PER_SECOND 价值。
REQUEST_SIZE_LIMIT_BYTES [102400]HTTP请求体的最大字节大小(默认为100KB)。超过此限制的请求将被拒绝,状态代码为413。这可以防止来自大型有效载荷的内存耗尽攻击。仅适用于使用HTTP传输时(sse 或 streamable-http).可接受的值范围在10240(10KB)和524288(512KB)之间。
DOCKER_TMPFS_SIZE_MB [100]临时文件系统的大小(MB)(/tmp)在Docker中以只读根文件系统运行时。此临时存储用于运行时文件操作。如果应用程序需要更多的临时存储来缓存或处理大型数据集,请增加此值。仅在使用Docker Compose部署时相关。

用法

以下小节说明了如何将法兰克福MCP作为服务器运行,以及如何从MCP客户端访问它。

服务器

在运行服务器时,您可以选择使用 stdio 传输或HTTP选项(sse 或更新的 streamable-http).

使用默认设置和 MCP_SERVER_TRANSPORT 着手 sse 或 streamable-http,MCP端点将通过HTTP在 http://localhost:8000/sse 用于服务器发送事件(SSE)传输,或 http://localhost:8000/mcp 用于流式HTTP传输。

如果你想运行法兰克福MCP stdio 传输和默认参数,在不使用的情况下执行以下命令 .env.template 文件。

服务器与 uv

可选的:复制 .env.template 文件到a .env 文件在 西部数据,如果您想使用默认设置以外的任何设置,则可以修改上述环境变量。或者,在shell上,您可以导出要修改的环境变量。

在中运行以下命令 西部数据 启动MCP服务器。

uv run frankfurtermcp

服务器与 pip 来自PyPI包

使用以下命令从PyPI添加此包 pip 在虚拟环境中(可能由 uv, pyenv 或 conda)然后通过运行以下命令启动服务器。

可选的:添加a .env 包含以下内容的文件 .env.template 如果您想修改上述环境变量的默认值,请使用文件。或者,在shell上,您可以导出要修改的环境变量。

pip install frankfurtermcp
python -m frankfurtermcp.server

使用Docker的服务器

此存储库中提供了一个Dockerfile, local.dockerfile,用于将法兰克福MCP服务器装入集装箱。首先,复制一份 .env.template 到一个 .env 文件。然后,修改以下变量 .env 文件需要。

  • FASTMCP_HOST:设置为 0.0.0.0 以允许外部进入容器。 这仅用于本地测试,不建议用于生产部署.
  • CORS_MIDDLEWARE_ALLOW_ORIGINS:设置为 * 以允许从任何来源对MCP服务器进行外部访问。 如果您想通过HTTP传输使用MCP Inspector测试服务器,则需要这样做,不建议用于生产部署.

要构建镜像,请创建容器并使用Docker Compose启动它,在中运行以下命令 西部数据.

如果您将端口更改为8000以外的任何端口 .env, 请记住更改中的端口号 docker-compose.yml.

备注所需的Docker Compose最低版本为2.24.0。您可以通过运行以下命令来检查您的版本 docker compose version。如果您有旧版本,请更新Docker Desktop以获取最新的Docker Compose。此外,后端必须支持BuildKit。

docker compose up --build

要在分离模式(背景)下运行,请添加 -d 标志:

docker compose up -d --build

要停止容器:

docker compose down

若要运行容器并使用本地Frankfurter API服务器,请运行以下命令。附上 -d 标志以分离模式运行。检查 local_api.env.template 文件,以指定本地API服务器使用的可选环境变量。

备注:首次启动时,当地法兰克福API可能需要一些时间来获取更新的汇率。对于随后的运行,本地Frankfurter API将使用缓存的数据,并且应该更快地启动,尽管它仍然会获取最新的速率。

FRANKFURTER_API_URL=http://frankfurter_api:8080/v1 docker compose --profile local_api up --build frankfurtermcp frankfurter_api

停止使用创建的容器组 local_api profile,运行以下命令。

docker compose --profile local_api down

这 docker-compose.yml 该文件包括使用只读文件系统(在相关情况下)进行安全强化、删除功能和资源限制。

备注:本地API服务器是使用 法兰克福GitHub仓库,因此这可能是不稳定的。如果你想使用特定的提交,请更改 context 字段为 build 在...之下 frankfurter_api_base 在 docker-compose.yml 文件指向特定的提交哈希。, https://github.com/lineofflight/frankfurter.git#0b6dbd80716f5abe27e8759fc548b74d35fa82b9 使用commit 0b6dbd80716f5abe27e8759fc548b74d35fa82b9.

成功构建和容器启动后,MCP服务器将通过HTTP在以下位置可用 http://localhost:8000/sse 用于服务器发送事件(SSE)传输,或 http://localhost:8000/mcp 用于流式HTTP传输。如果您还启动本地Frankfurter API服务器,API端点将在 http://localhost:8080/v1.

云托管服务器

当前可用的云托管选项如下。

  • FastMCP云:https://frankfurtermcp.fastmcp.app/mcp
  • 格拉玛。人工智能:https://glama.ai/mcp/servers/@阿尼班巴苏/法兰克福

客户端访问

本小节解释了客户端连接和测试法兰克福MCP服务器的方法。

MCP官方目视检查员

这 MCP检查员 是一个 官方的 模型上下文协议工具,可供开发人员用于测试和调试MCP服务器。这是探索MCP服务器的最全面的方法。

要使用它,您必须安装Node.js。安装和管理的最佳方式 node 以及MCP检查器等软件包将使用 节点版本管理器(或, nvm).一旦你有 nvm 安装后,您可以安装和使用最新的长期发布版本 node 通过执行以下操作。

nvm install --lts
nvm use --lts

之后(安装并)通过执行以下步骤运行MCP检查器 西部数据.

npx @modelcontextprotocol/inspector uv run frankfurtermcp

这将在端口6274创建一个带有身份验证令牌的本地URL,您可以在浏览器上复制和浏览该URL。进入MCP检查器UI后,按 连接 连接到MCP服务器。此后,您可以探索服务器上可用的工具。

Claude Desktop、Visual Studio等

要运行的服务器条目 stdio 您可以在Claude Desktop、Visual Studio Code等系统中使用的传输如下。

{
    "command": "uv",
    "args": [
        "run",
        "frankfurtermcp"
    ]
}

或者,使用 uvx:

{
    "command": "uvx",
    "args": [
        "frankfurtermcp"
    ]
}

而不是拥有 frankfurtermcp 作为列表中的最后一项 args,您可能需要指定脚本的完整路径,例如。, 西部数据/.venv/bin/frankfurtermcp.同样,不使用 uv,您还可以使用以下JSON配置,并将路径正确替换为 python3.12例如,例如 西部数据/.venv/bin/python3.12.

{
    "command": "python3.12",
    "args": [
        "-m",
        "frankfurtermcp.server"
    ]
}

可用MCP功能列表

法兰克福MCP具有以下MCP功能。

工具

下表列出了FrankfurterMCP服务器公开的工具名称。此处显示的描述用于文档目的,可能与模型上下文协议上公开的实际描述不同。

名称 描述
get_supported_currencies 获取法兰克福API支持的货币列表。
get_latest_exchange_rates 获取给定基础货币的特定货币的最新汇率。
convert_currency_latest 使用最新汇率将金额从一种货币转换为另一种货币。
get_historical_exchange_rates 获取给定基础货币的特定日期或日期范围内特定货币的历史汇率。
convert_currency_specific_date 使用特定日期的汇率将金额从一种货币转换为另一种货币。
greet 收到法兰克福MCP服务器的问候。 这主要用于内部测试.

为了简洁起见,下表中没有列出每个工具的必需和可选参数,但MCP客户端可以通过协议获得这些参数。

贡献

安装 prek。然后启用 prek 通过在 西部数据.

prek install

欢迎拉取请求。对于重大更改,请先打开一个问题来讨论您想要更改的内容。

测试和覆盖

要运行提供的测试用例,请执行以下操作。添加旗帜 --capture=tee-sys 以显示进一步的控制台输出。

uv run --group test pytest tests/

调用 just test-coverage 运行所有测试并生成覆盖率报告,如下所示。如果运行了所有测试,生成的覆盖率报告可能如下。

---------------------------------------------------------------------------------------- benchmark: 2 tests ---------------------------------------------------------------------------------------
Name (time in ms)                         Min               Max              Mean            StdDev            Median               IQR            Outliers       OPS            Rounds  Iterations
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_get_historical_exchange_rates     4.4944 (1.0)      5.1512 (1.0)      4.7919 (1.0)      0.2460 (1.0)      4.7819 (1.0)      0.3249 (1.0)           2;0  208.6840 (1.0)           5           1
test_get_latest_exchange_rates         4.7937 (1.07)     5.6976 (1.11)     5.3257 (1.11)     0.3345 (1.36)     5.4182 (1.13)     0.3575 (1.10)          2;0  187.7702 (0.90)          5           1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Legend:
  Outliers: 1 Standard Deviation from Mean; 1.5 IQR (InterQuartile Range) from 1st Quartile and 3rd Quartile.
  OPS: Operations Per Second, computed as 1 / Mean
=============================================================== 15 passed in 4.09s ===============================================================
Name    Stmts   Miss    Cover   Missing
---------------------------------------
TOTAL     265      0  100.00%

6 files skipped due to complete coverage.
Test coverage complete.

许可证

麻省理工学院.

安全注意事项

本节记录了漏洞扫描中与安全相关的发现,并为部署决策提供了背景。

Airtable漏洞扫描结果和基本原理

检查与安全相关的发现 Airtable漏洞扫描 (搜索 frankfurtermcp)下面,连同理论基础和反驳论点。

规则ID 问题和反参数
MCP-R001 问题:工具在服务器启动时动态注册,无需加密签名、不可变版本控制或完整性检查。该架构允许热重载场景(通过 register_features 模式),但不存在签名验证或批准流程。

反驳论点:工具不是从外部源或插件加载的,而是直接在应用程序源代码中定义的。通过版本控制和代码审查流程确保完整性。由于工具是应用程序二进制文件的一部分(不是动态加载的插件),加密签名会增加复杂性,而不会带来有意义的安全效益。
MCP-R004 问题:服务器发出警告,但接受CORS源中的通配符。

反驳论点:使用HTTP传输时,此服务器不打算直接在生产环境中运行。 对于具有更严格CORS源控制的部署,用户应使用 .env.template 默认值(127.0.0.1)并在反向代理级别使用适当的CORS源控件将服务器部署在自己的反向代理后面.
MCP-R013 问题:当服务器绑定到127.0.0.1以外的任何IP时,不支持HTTPS。

反驳论点:使用HTTP传输时,此服务器不打算直接在支持HTTPS的生产环境中运行。 对于需要HTTPS支持的部署,用户应使用 .env.template 默认值(127.0.0.1)并使用适当的HTTPS配置将服务器部署在自己的反向代理后面.
MCP-R018 问题:没有身份验证或授权检查。

反驳论点:使用HTTP传输时,此服务器不打算直接在多用户操作模式下运行。 对于具有访问控制的部署,用户应使用 .env.template 默认值(127.0.0.1)并使用适当的安全控制将服务器部署在自己的反向代理后面.

项目状态

项目的当前状态为 活跃的 截至本README的最后一次更新。看 更新日志 查看详细的更改列表。