文档转换服务

Heroku MCP Doc Reader 是一个将HTML/PDF文档转换为Markdown格式的服务,支持自动和手动部署,适用于开发者和内容管理场景。

  • by floerer
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 floerer/mcp-server-takeover

使用说明

Heroku MCP文档阅读器(HTML/PDF-->Markdown)

自动部署

手动部署

从Heroku CLI设置所需的环境变量

使用Heroku CLI提取正确的值,而不是手动设置每个变量。

export APP_NAME=<your-heroku-app-name>
heroku create $APP_NAME

heroku buildpacks:set heroku/python -a $APP_NAME
# set a private API key that you create, for example:
heroku config:set API_KEY=$(openssl rand -hex 32) -a $APP_NAME
heroku config:set STDIO_MODE_ONLY=<true/false> -a $APP_NAME
# set the remote server type (module) that your web process will use (only relevant for web deployments)
heroku config:set REMOTE_SERVER_TRANSPORT_MODULE=<streamable_http_server/sse_server>

如果你 仅 希望本地部署 STDIO 能力(否 SSE server),运行:

heroku ps:scale web=0 -a $APP_NAME

如果您确实希望部署 SSE 服务器,运行:

heroku ps:scale web=1 -a $APP_NAME
heroku config:set WEB_CONCURRENCY=1 -a $APP_NAME

(可选)将这些配置变量放入本地.env文件中进行本地开发:

heroku config -a $APP_NAME --shell | tee .env > /dev/null

接下来,将您的应用程序连接到git仓库:

heroku git:remote -a $APP_NAME

并部署!

git push heroku main

通过以下方式查看日志:

heroku logs --tail -a $APP_NAME

局部测试

一次性软件包安装:

virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

本地流式HTTP、SSE

如果您正在测试(无状态)可流式HTTP或SSE,则需要在一个终端窗格中启动服务器:

source venv/bin/activate
export API_KEY=$(heroku config:get API_KEY -a $APP_NAME)
# Either run src.streamable_http_server or src.sse_server, here:
uvicorn src.streamable_http_server:app --reload

跑步 --reload 是可选的,但对当地发展很有帮助

接下来,在一个新窗格中,您可以尝试对服务器运行一些查询:

本地流式HTTP、SSE-请求示例

第一轮:

export API_KEY=$(heroku config:get API_KEY -a $APP_NAME)

在以下命令中,使用 example_clients/streamable_http_client.py 如果您运行了上面的流式HTTP服务器,或者 example_clients/sse_client.py 如果您正在运行SSE服务器。

列出工具:

python example_clients/streamable_http_client.py mcp list_tools | jq

示例工具调用请求-HTML: 注意:如果您已设置,这将故意不起作用 STDIO_MODE_ONLY 到 true.

python example_clients/streamable_http_client.py mcp call_tool --args '{
  "name": "html_to_markdown",
  "arguments": {
    "url": "https://example.com"
  }
}' | jq

示例工具调用请求-PDF:

python example_clients/streamable_http_client.py mcp call_tool --args '{
  "name": "pdf_to_markdown",
  "arguments": {
    "url": "https://arxiv.org/pdf/1706.03762"
  }
}' | jq

本地STDIO

有两种方法可以在STDIO模式下轻松测试MCP服务器:

1.本地STDIO-Python STDIO客户端示例

列出工具:

python example_clients/stdio_client.py mcp list_tools | jq

示例工具调用请求-HTML: 注意:如果您已设置,这将故意不起作用 STDIO_MODE_ONLY 到 true.

python example_clients/stdio_client.py mcp call_tool --args '{
  "name": "html_to_markdown",
  "arguments": {
    "url": "https://example.com"
  }
}' | jq

示例工具调用请求-PDF:

python example_clients/stdio_client.py mcp call_tool --args '{
  "name": "pdf_to_markdown",
  "arguments": {
    "url": "https://arxiv.org/pdf/1706.03762"
  }
}' | jq

2.本地STDIO-直拨电话

示例工具调用请求:

cat <<EOF | python -m src.stdio_server

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}

{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}

{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"html_to_markdown","arguments":{"url":"https://example.com"}}}

{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"pdf_to_markdown","arguments":{"url":"https://arxiv.org/pdf/1706.03762"}}}
EOF

(请注意,服务器希望客户端发送关闭请求,因此您可以使用CTRL-C停止连接)

远程测试

export API_KEY=$(heroku config:get API_KEY -a $APP_NAME)
export MCP_SERVER_URL=$(heroku info -s -a $APP_NAME | grep web_url | cut -d= -f2)

远程SSE

测试您的遥控器 SSE 在服务器上,您需要确保web进程确实已启动。为了节省成本,默认情况下,这个存储库在创建时不会启动web dynos,因为许多人只想使用 STDIO 模式(本地和一次性dyno)请求:

heroku ps:scale web=1 -a $APP_NAME

你只需要做一次,除非你把速度降到0网络动态以节省成本(heroku ps:scale web=0 -a $APP_NAME).要确认当前正在运行的dynos,请使用 heroku ps -a $APP_NAME.

接下来,您可以运行与中所示相同的查询 本地SSE-请求示例 测试部分-因为您已经设置 MCP_SERVER_URL,客户端将调用您部署的服务器。

远程STDIO

有两种方法可以在STDIO模式下测试远程MCP服务器:

1.远程STDIO-在服务器上运行的Python STDIO客户端示例

要针对部署的代码运行,您可以在一次性dyno中在部署的服务器上运行示例客户端代码:

heroku run --app $APP_NAME -- bash -c 'python -m example_clients.stdio_client mcp list_tools | jq'

或者:

heroku run --app $APP_NAME -- bash -c '
python -m example_clients.stdio_client mcp call_tool --args '\''{
  "name": "html_to_markdown",
  "arguments": {
    "url": "https://example.com"
  }
}'\'' | jq
'

2.远程STDIO-直接呼叫一次性Dyno

或者,您也可以在本地运行或模拟一个客户端,该客户端将您的客户端请求发送到一次性dyno:

heroku run --app "$APP_NAME" -- bash -c "python -m src.stdio_server 2> logs.txt" <<EOF

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}

{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}

{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"html_to_markdown","arguments":{"url":"https://example.com"}}}

{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"pdf_to_markdown","arguments":{"url":"https://arxiv.org/pdf/1706.03762"}}}
EOF

再次注意,由于我们通过单个命令运行请求,因此无法模拟客户端的关闭请求。

3.即将推出-Heroku MCP网关!

很快,您还可以将MCP仓库连接到Heroku的MCP网关,这将使一次性MCP dynos的流式请求和响应变得简单!

Heroku MCP网关实现了会合协议,因此您可以通过无缝的来回通信轻松地与MCP服务器进行一次性dynos(代码执行隔离!)通信。

之后 部署和注册 您在heroku上的MCP应用程序,向heroku的请求 v1/mcp/servers 将向您展示您注册的MCP工具以及向 v1/agents/heroku 将能够通过一次性dynos自动执行您的MCP工具。