HubSpot MCP服务器

基于HubSpot API的模型上下文协议服务器,提供流式HTTP和每请求令牌验证,适用于Docker部署。

  • by SufiSR
  • JavaScript
  • 本地部署
  • 更新于
在 GitHub 查看 SufiSR/hubspot-mcp

使用说明

HubSpot MCP Server

Streamable HTTP + per-request HubSpot token · Docker-ready

上游

该项目基于 新三实验室/hubspot mcp --广泛 模型上下文协议(MCP) 服务器 HubSpot API感谢原作者提供的实现和工具界面。

与原来相比有什么变化

区域 原始 此叉子
HTTP传输 @smithery/sdk createStatefulServer (通过Smithery/init负载进行配置) 快速 +官方 StreamableHTTPServerTransport 从 @modelcontextprotocol/sdk
HTTP身份验证 env或Smithery提供的配置中的令牌 Authorization: Bearer … 按请求(LibreChat OAuth注入此内容);可选的 HUBSPOT_ACCESS_TOKEN 仅在容器的env中
史密瑟里 smithery.yaml,专注于Smithery的文档 移除 --仅限自托管
码头工人 基于pnpm的图像 npm ci + package-lock.json, EXPOSE 3000,入口点 node dist/index.js
编排 — docker-compose.yml:主机端口 8003 → 容器 3000
npm Docker中的pnpm锁文件 .npmrc (legacy-peer-deps=true) + package-lock.json 用于可重复安装
构建 tsc node --max-old-space-size=4096 包装 npm run build 用于大型单文件编译
持续集成 GitHub操作工作流 已删除工作流 (没有 .github/workflows)
get_current_time 工具 — 添加 --返回服务器的当前UTC时间戳,以便LLM可以将相对日期表达式(“今年”、“上个月”、“今天”)解析为精确的 startTime/endTime 价值观。LibreChat不会在系统提示中注入当前日期,因此这对于可靠的日期过滤查询是必要的。

参与总结: engagement_summary_associated 返回a 默认LLM已优化 JSON形状(threads + other_engagements 和 timestamp, from, to, content).用这个来回答以下问题 “总结与X公司的沟通” --它避免了来自 engagement_details_get_associated清洁工作包括: 标准化小写主题 和 合并线程 不同之处仅在于 Re:/Fw:/空白; UTF-8清理 (滴mojibake像 ÿè); 硬切 在第一个 From: / Sent: / On … wrote: / -----; 免责声明/签名/警告 剥离; 领先的 Hi Name, 移除 当剩下足够的尸体时; 删除消息 少于 10 有意义的(非停用词)单词,除非它们包含 统一资源定位符 (然后≥5个这样的单词)。集 llmOptimize: false 对于年龄较大的群体 engagements 阵列(EMAIL_THREAD +生的 body). 真相来源: src/llmEmailCleaner.ts.可选 Python镜像: preprocessing/email_cleaner.py (离线CLI;手动保持同步)。

不变: stdio传输,原始 112 HubSpot API工具, HUBSPOT_ACCESS_TOKEN 从本地/stdio的env,可选 TELEMETRY_ENABLED,核心MIT许可证和原始工具代码路径。

先决条件

HubSpot专用应用访问令牌(PAT)。看 HubSpot API概述.

快速入门(Docker)

docker compose up --build -d

MCP URL(来自主机): http://localhost:8003/mcp
在Docker网络内部,使用 http://<service>:3000/mcp 并设置 PORT=3000 (compose中的默认设置)。

Librechat(streamable-http)

将LibreChat指向您部署的URL 私人应用令牌 (无OAuth),将其作为Bearer传递:

mcpServers:
  hubspot:
    type: streamable-http
    url: "https://your-host:8003/mcp"
    headers:
      Authorization: "Bearer {{HUBSPOT_ACCESS_TOKEN}}"
    customUserVars:
      HUBSPOT_ACCESS_TOKEN:
        title: "HubSpot access token"
        description: "Private app token from HubSpot developer settings"

MCP Accept 标头必须同时允许JSON和SSE,例如。 application/json, text/event-stream (LibreChat这样做是为了流式传输HTTP)。

上海证券交易所 GET /mcp 返回一个keep-alive事件流(某些客户端同时使用 POST /mcp).

LibreChat+HubSpot OAuth(LibreChat的承载者)

LibreChat运行OAuth流并发送 Authorization: Bearer <access_token> 对于这个MCP。配置 oauth: 阻止您的服务器密钥输入 librechat.yaml (授权URL、令牌URL、客户端id/秘密、重定向URI、作用域)--请参阅 LibreChat MCP服务器→ oauth.

OAuth如何与此MCP协同工作

MCP 不实现OAuth本身LibreChat处理完整的OAuth流程(重定向、令牌交换、存储)。MCP是一种 被动代币消费者.

  1. LibreChat连接到MCP并完成MCP握手(initialize, tools/list) — 这可以在没有令牌的情况下工作.
  2. LibreChat看到 oauth 在其配置中插入块,并使用HubSpot启动OAuth流。
  3. 用户授权后,LibreChat存储令牌并重新连接 Authorization: Bearer <token>.
  4. 工具调用现在已成功到达HubSpot。

如果工具运行 之前 代币可用,HubSpot API工具返回 isError: true 和文本 Authentication required.

每次请求使用的凭据: Authorization: Bearer … 胜利否则 HUBSPOT_ACCESS_TOKEN 从容器环境(例如,用于非OAuth设置的PAT)。

HubSpot HTTP调用使用 10秒 默认超时;用以下方式覆盖 HUBSPOT_API_TIMEOUT_MS (毫秒)。

本地stdio(光标、克劳德桌面等)

与上游相同:运行构建的服务器并设置 HUBSPOT_ACCESS_TOKEN 在客户端环境中。

{
  "mcpServers": {
    "hubspot": {
      "command": "node",
      "args": ["/absolute/path/to/hubspot-mcp/dist/index.js"],
      "env": {
        "HUBSPOT_ACCESS_TOKEN": "your-access-token-here"
      }
    }
  }
}

从克隆构建:

npm ci
npm run build
npm start

环境变量

变量 描述 必填项? 默认值
HUBSPOT_ACCESS_TOKEN HubSpot PAT(stdio/默认服务器实例) 是,仅用于stdio,不带标头 --
PORT 容器内的HTTP侦听器端口 否 3000
TELEMETRY_ENABLED OpenTetry到供应商端点 否 true (套 false 在编写中禁用)

对于 超文本传输协议,有效令牌取自 X-Auth-Token 或 Authorization: Bearer 根据每一项请求;环境 HUBSPOT_ACCESS_TOKEN 仍被使用 标准 同一过程的侧面。

工具

这个叉子暴露了 114工具 (上游 112 加 get_current_time 和 engagement_summary_associated)--看 新三实验室/hubspot mcp (公司、联系人、潜在客户、交易管道通过通用对象、约定、批处理API等)。使用客户的 tools/list 对于规范名称和模式。

离线LLM清洁(可选)

之后 npm run build,您可以从已保存的文件中复制与默认工具输出相同的JSON { "engagements": [...] } 有效载荷(例如,与 llmOptimize: false):

npm run llm-clean -- path/to/grouped.json path/to/output.json
# equivalent: node scripts/run-llm-clean.mjs …

看 examples/llm_optimized_format.example.json 对于响应形状。不要提交真实的CRM数据(请参阅 .gitignore例如。 examples/llm_optimized_comparison_output.json, deduped_clean.json).

开发与测试

npm ci
npm run build
npm test          # Jest: e2e (MCP) + unit tests for llmEmailCleaner

LLM清洁行为涵盖在 **test/llmEmailCleaner.test.ts**The preprocessing/ 文件夹是仅用于脚本的可选Python端口(此仓库中没有pytest套件)。

贡献

欢迎发布问题和PR 这 Docker、HTTP认证和LibreChat集成的仓库。对于核心HubSpot工具行为的更改,考虑在上游做出贡献 新三实验室/hubspot mcp 所以每个人都受益。

数据收集和隐私

上游可以通过以下方式收集可选遥测数据 @shinzolabs/instrumentation-mcp.见原件 隐私政策 并设置 TELEMETRY_ENABLED=false 如果你不想要它(例如 docker-compose.yml).

许可证

麻省理工学院