Skip to main content
Glama
LQABR MCP HubSpot Server

LQABR MCP HubSpot Server

by TNE736

LQABR_MCP

LQABR 中心 HubSpot MCP 服务器。基于 FastMCP 构建,独立运行——不依赖 LQABR 单体仓库。

RUNNING.md —— 如何运行:设置、凭据、两种传输方式、agentgateway、故障排除。 CONSUMING.md —— 邮件/语音/调度代理如何调用它:ADK McpToolset、认证、接口契约、工具范围界定。 本文档是设计原理;上述两篇是操作流程。

LQABR_MCP/
├── hubspot-crm-mcp-server/
│   ├── __init__.py              (empty, per mcp.odt Step 4)
│   ├── hubspot_crm_server.py    the launcher — mcp.odt Step 5
│   ├── test_server.py           remote smoke test — handoff S8
│   ├── hubspot_mcp/             THE IMPLEMENTATION (vendored)
│   │   ├── __init__.py          provenance + drift warning — read this
│   │   ├── server.py            the FastMCP object + the two tools
│   │   ├── secrets.py           Secret Manager access
│   │   ├── obs/                 the four logs: system/process/audit/tokens
│   │   │   ├── __init__.py
│   │   │   ├── context.py       RunContext, run_id, lead_ref_id
│   │   │   └── loggers.py
│   │   └── hubspot/
│   │       ├── __init__.py
│   │       ├── crm.py           upsert_lead_profiles / get_lead_profile
│   │       ├── auth.py          get_hubspot_token(), short-lived M2M
│   │       ├── schema.py        LeadProfile, PushResult, property mapping
│   │       └── failures.py      failure taxonomy + CircuitBreaker
│   └── tests/                   61 tests ported from the mono-repo
├── .vscode/hubspot_mcp.json     stdio config — mcp.odt Steps 7–8
├── Dockerfile                   Cloud Run image — handoff S4
├── .dockerignore
├── pytest.ini
├── .python-version              3.12, matching the Dockerfile
├── .env.example                 mode switches + secret IDs (no values)
├── pyproject.toml
├── RUNNING.md                   step-by-step runbook — start here
├── CONSUMING.md                 client integration guide for other agents
└── README.md

这是分支,而非迁移

hubspot_mcp/ 是单体仓库实现的副本。仅重写了导入行;未更改任何逻辑、字段名或 HubSpot 属性名。 经差异验证——所有九个文件中唯一不同的行是:

- from lqabr_core.obs import get_obs, utc_now_iso
+ from ..obs import get_obs, utc_now_iso
- from lqabr_core.leadgen.secrets import ...
+ from ..secrets import ...

单体仓库仍需保留其副本。请勿删除。

模块

同时被以下模块使用

lqabr_core.obs

lead_profile/src 中的 8 个文件,text_voice/src 中的 2 个文件,lqabr_core/crm

lqabr_core.leadgen.*

12 个 lead_profile 文件(含 call_mcp.py),以及 evals/run_eval.py

lqabr_core.leadgen.secrets

lead_profile model.py,2 个测试文件

后果: 现在存在两条写入 HubSpot 的路径,携带相同的字段名和相同的 HubSpot 属性名——而数据契约规定这些名称就是契约。对 crm.py 的任何修复、任何认证变更、任何 HubSpot 属性重命名都必须在两处手动应用。没有任何机制强制同步。请为此预留预算,或计划淘汰其中一侧。

Related MCP server: LQABR HubSpot MCP Server

为何此代码位于单体仓库之外

LQABR 仓库在其根目录下有一个名为 mcp 的顶级包,这与 FastMCP 依赖的 mcp SDK 冲突。在仓库内部运行会破坏 FastMCP 自身的导入。

请勿将 LQABR 仓库根目录添加到 PYTHONPATH。

库:FastMCP,而非官方 SDK

依赖项为 fastmcp>=3.4.7。请勿添加 mcp>=2.0——两者互斥:

  • fastmcp 3.4.7 传递性地锁定 mcp<2.0,>=1.24.0(它会安装 mcp 1.29)。

  • MCPServer,即官方 SDK 的服务器类,仅存在于 mcp>=2.0 中。

因此,一个项目只能使用 FastMCP 或 MCPServer,不能同时使用。本项目使用 FastMCP。此处未导入 MCPServer。

有两个值得注意的后果:

  • 传输名称不同。 FastMCP 的 HTTP 传输名为 "http"("streamable-http" 作为别名被接受),端点路径关键字参数为 path=。官方 SDK 则使用 streamable_http_path=。

  • 类型字段不同。 由于 mcp 被锁定在 1.x 版本,捆绑的类型使用 camelCase:Tool.inputSchema,而非 input_schema。

单体仓库的 lqabr_core/leadgen/server.py 仍在使用 MCPServer。这现在是两个代码库之间的第二个分歧点,叠加在分支之上。

运行

uv sync

# stdio — local ADK MCPToolset, or the VSCode config in .vscode/
uv run python hubspot-crm-mcp-server/hubspot_crm_server.py

# HTTP — what Cloud Run runs
uv run python hubspot-crm-mcp-server/hubspot_crm_server.py \
    --transport http --host 0.0.0.0 --port 8080

凭据

tools/list 不需要任何凭据。工具调用需要 HubSpot 令牌,该令牌来自Secret Manager——上下文 §7.6 / CLAUDE.md §5:凭据从不硬编码,也从不提交。

cp .env.example .env                    # holds mode switches + secret IDs only
gcloud auth application-default login
uv sync --extra gcp --extra test        # both extras; --extra gcp alone drops pytest
export UV_ENV_FILE=.env

uv sync --extra <x> 仅同步该额外集合,因此单独的 --extra gcp 会卸载 pytest。test_server.py 作为 CLI 运行而不需要 pytest,但 uv run pytest 显然需要它。

.env 不包含任何秘密值——仅包含 HUBSPOT_AUTH_MODE、LQABR_SECRET_PROJECT 和秘密的 ID。令牌本身在运行时通过 Secret Manager API 获取,保存在内存中,从不记录(审计行仅记录长度和最后四个字符),并缓存 900 秒,因此轮换无需重新部署。

auth.py 和 secrets.py 均采用故障关闭策略——未设置意味着显式错误,而非静默默认值。

LQABR_SECRET_BACKEND=env 作为离线工作或 CI 的最后手段存在。secrets.py 将其范围限定为“本地开发、CI 和测试”,并且没有自动回退机制——你必须手动输入。它会将实时凭据放入磁盘上的文件中。切勿在 Cloud Run 中设置。

每个标志都有环境变量默认值(MCP_TRANSPORT、MCP_HOST、PORT、MCP_PATH),因此容器启动时无需参数——Cloud Run 会注入 PORT。

测试

uv run pytest              # 61 tests, all passing, none touch real HubSpot

pytest.ini 将 hubspot-crm-mcp-server/ 添加到路径中,以便 import hubspot_mcp 能够解析——该文件夹本身不能是包,因为名称中包含连字符。

契约是十个字段,不是九个

LeadProfile 包含十个字段:九个是大家熟知的,再加上 contact_name(为 firstname/lastname 映射而添加)。单体仓库的 test_wrapper_shape_is_the_nine_fields_plus_ids 仍然断言 9 个字段,并且在那里一直失败——schema.py 是字节相同的,因此本项目继承了这个问题。

已于 2026-08-18 解决:代码是正确的,数字是过时的。测试已重命名为 test_wrapper_shape_is_the_contract_fields_plus_ids,现在断言字段名称而非数量,因此下次添加字段时会以可读的方式失败。

同样的修复仍需应用于单体仓库——那里的断言未更改,仍然失败。说明“9 个字段”的文档也应更正。

测试已部署的服务器

# local
uv run python hubspot-crm-mcp-server/test_server.py

# Cloud Run — mints a Google ID token via ADC
uv run python hubspot-crm-mcp-server/test_server.py \
    --url https://lqabr-mcp-server-xxxx.a.run.app/mcp --auth google

# one real read against HubSpot — writes nothing
... --auth google --employee-id EMP-00042

设计上为只读:它从不调用 upsert_lead_profile。发送 X-LQABR-Run-Id,以便服务器的审计日志归因于该调用(B10 修复)。

ID 令牌的受众是服务基础 URL**,不含** /mcp。脚本会为你剥离它。

客户端使用 fastmcp.Client,它处理初始化握手,因此此文件中没有会话管道。头部信息承载在 StreamableHttpTransport 上。这现在与参考示例的库一致。

部署到 Cloud Run

两阶段 uv 构建,非 root mcp 用户,PID 1 为 Python,因此 SIGTERM 能干净地排空。自包含:无同级文件夹,无 git 依赖。

docker build -t lqabr-mcp-server .

提交 uv.lock 并在生产前将同步切换为 --frozen。

然后 S5–S8:创建 mcp-server-sa,授予 secretmanager.secretAccessor 权限于 lqabr-hubspot-access-token,部署 --no-allow-unauthenticated,授予三个代理服务账号 roles/run.invoker 权限,将 test_server.py 指向它。

公开的工具

工具

方向

备注

upsert_lead_profile

写入

公司 upsert → 联系人 upsert → 关联。幂等。

get_lead_profile

读取

契约字段 + contact_hs_id + company_hs_id。

去重:联系人依据 employee_id,公司依据 company_id。电子邮件位于自定义的 email_id 属性中。

待定事项。 注册的工具名称为 upsert_lead_profile(单数),但设计文档、会话交接和项目说明均使用 upsert_lead_profiles(复数),且底层函数也是复数。这是一个接口契约——在任何客户端连接之前解决它。

凭据

两种,从不混淆:

  • Google ID 令牌 证明 代理 → 此服务器(Cloud Run 服务到服务)。

  • HubSpot M2M 令牌 证明 此服务器 → HubSpot,在服务器内部每次调用时生成。调用者永远看不到它。

此服务是 HubSpot 凭据的唯一持有者。

已验证

在一个仅包含 fastmcp 3.4.7(它带来了 mcp 1.29)、requests 和 pytest 的干净虚拟环境中——lqabr_core 不存在(确认 ModuleNotFoundError),MCPServer 不存在(确认 ImportError):

  • 项目中任何地方均无 lqabr_core 导入

  • 移植的测试套件:61 通过,0 失败

  • stdio — tools/list 返回两个工具,PYTHONPATH 完全清除

  • --transport http — 绑定主机/端口/路径,完整的 fastmcp.Client 会话

  • --transport streamable-http — 别名被接受,提供相同的端点

  • test_server.py — 针对运行中的服务器通过,退出码 0

  • test_server.py 在 pytest 下 — 有服务器时 3 个通过,无服务器时 3 个跳过

  • 实时 call_tool 到达了真实链路:传输 → 工具 → crm.py → auth.py → secrets.py,仅在故意的 AuthConfigError / SecretConfigError 守卫处失败(测试环境中无 GCP 配置)。端到端布线已验证。

未验证: Docker 镜像从未构建——组装这些文件时没有可用的 Docker 守护进程。未接触过真实的 HubSpot;所有测试均使用模拟数据。

Available Tools

4 tools
get_blog_summaryA

Read one blog summary row by its publication timestamp. Read-only. Returns the seven contract fields plus ticket_hs_id. Not-found is a VALID result — found is false and summary is null — never an error. Check warnings: a non-empty list means more than one row shares this timestamp and the first was returned.

NameRequiredDescriptionDefault
blog_published_atYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description takes full responsibility for behavioral transparency. It clearly states the tool is read-only, describes the return fields and the non-error 'not-found' behavior, and warns about potential ambiguity with shared timestamps. The only minor omission is not specifying the exact return structure or whether it includes pagination.

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

Conciseness5/5

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

The description is four sentences, each with distinct value: purpose, safety, error handling, and edge-case warning. It is front-loaded with the core action, no wasted words.

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?

Given the simple single-parameter tool and presence of an output schema (which handles return structure), the description covers purpose, behavioral edges, and warnings adequately. The omission of timestamp format detail is minor and acceptable for a tool with just one parameter and no nested objects.

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

Parameters3/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 compensate. It explains that the single parameter 'blog_published_at' is a publication timestamp for identifying the row, which aligns with the schema. However, it does not provide format details (e.g., ISO 8601) or validation constraints beyond that, leaving the agent to infer from context.

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?

The description specifies a clear verb ('read'), a specific resource ('blog summary row'), and the unique identifier ('publication timestamp'). It also distinguishes from siblings like 'upsert_blog_summary' and 'get_lead_profile' by focusing on reading a blog summary.

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

Usage Guidelines4/5

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

The description provides context on when to use this tool: reading a single blog summary by timestamp. It does not explicitly mention when not to use it or alternatives, but the sibling list and the read-only nature imply a contrast with upsert_blog_summary. Some guidance on the 'not-found' and 'warnings' behavior aids correct usage.

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

get_lead_profileA

Read one lead's current state from HubSpot. Read-only. Returns the nine contract fields plus contact_hs_id and company_hs_id so you can write status back without re-searching. Check company_resolved: when false, the company fields are unpopulated and warnings explains why.

NameRequiredDescriptionDefault
emailNo
employee_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden for behavioral disclosure. It covers read-only safety, enumerates the returned fields, and explains the company_resolved flag and warnings. This is substantial context for a read tool, though it does not cover error cases or edge behaviors in detail.

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

Conciseness5/5

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

The description is two sentences with no redundancy. The first sentence states the core purpose and safety, and the second adds essential behavioral details. Every word contributes value.

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?

For a simple read tool with an output schema, the description covers the main aspects: purpose, return fields, and a key data-quality flag. However, it omits parameter usage, which is a notable gap given the low schema coverage. The output schema likely documents return values, so that is not a deficiency.

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

Parameters2/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 compensate. It does not mention email or employee_id at all, nor explain how the lead is identified, whether identifiers are mutually exclusive, or what happens if neither is provided. The schema only provides types and defaults, leaving the semantic meaning entirely unexplained.

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?

The description clearly states the tool's function: 'Read one lead's current state from HubSpot.' It uses a specific verb and resource, and explicitly declares read-only behavior. It differentiates from siblings by focusing on leads rather than blog summaries and by contrasting with upsert operations.

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

Usage Guidelines4/5

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

The description implies usage context by stating the returned IDs are 'so you can write status back without re-searching,' suggesting it is the read-before-write companion to upsert_lead_profile. It also instructs to check company_resolved for interpreting data. However, it does not explicitly name alternatives or provide when-not-to-use guidance.

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

upsert_blog_summaryA

Put one published blog post into HubSpot: the ONLY writer to the blog summary store. Searches on blog_published_at, then updates that row or creates one — a single upsert, so calling it twice for the same post is safe and does not duplicate. Returns the ticket id and whether the row was created or updated. blog_industry must be exactly one of FINANCIAL_SERVICES, LEGAL_SERVICES, HEALTHCARE — a near-miss selects zero leads and raises no error. Bad data is recorded and reported as failed, never silently dropped.

NameRequiredDescriptionDefault
subjectYes
blog_summaryYes
blog_industryYes
summary_ref_idNo
blog_published_atYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and excels: it reveals the upsert logic (no duplicates), mentions the return value (ticket id and created/updated status), warns about exact value requirements for blog_industry, and states that bad data is recorded and reported as failed. This is comprehensive behavioral disclosure beyond what any annotation could provide.

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

Conciseness5/5

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

The description is compact, every sentence adds critical information, and key points are front-loaded. It covers purpose, safety, return value, parameter constraints, and error handling without redundancy.

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?

Given the tool has 5 parameters, an output schema, and no annotations, the description provides all necessary behavioral context including upsert semantics, exact enum values, and failure behavior. The return value is described, and the output schema structure is implied but not needed in detail. This is complete for an agent to use the tool correctly.

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

Parameters4/5

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

The schema has 0% description coverage, so the description must compensate. It explicitly explains the blog_industry parameter's allowed values and failure behavior, and implies the meaning of blog_published_at as the search key. It does not detail subject, blog_summary, or summary_ref_id, but the overall intent is clear enough given the tool's purpose.

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?

The description clearly states the tool puts a blog post into HubSpot using an upsert strategy, specifies it is the only writer to the blog summary store, and distinguishes itself from siblings by focusing on blog summaries rather than lead profiles. The verb 'put' combined with 'published blog post' and 'upsert' gives a concrete, specific purpose.

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

Usage Guidelines4/5

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

The description explicitly states this is for published blog posts and mentions that calling it twice is safe due to upsert behavior. It does not explicitly list when not to use it or name alternatives among siblings, but the sibling tools (upsert_lead_profile, get_lead_profile, get_blog_summary) have different focuses, so the usage context is clear enough.

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

upsert_lead_profileA

Create or update one lead in HubSpot: upserts the Company, upserts the Contact, and associates them. Creating and updating are ONE upsert, so calling this twice for the same lead is safe and does not duplicate. Returns the HubSpot ids. Bad data is recorded and reported as failed, never silently dropped.

NameRequiredDescriptionDefault
emailNo
phoneNo
industryNo
job_titleNo
company_idYes
employee_idYes
lead_ref_idNo
annual_revenue_mNo
decision_maker_flagYes
frequency_of_purchaseNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It reveals the internal operations (upsert Company, upsert Contact, associate), idempotency, return value (IDs), and error handling (bad data recorded and reported, never silently dropped). This is comprehensive for safety and side effects.

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

Conciseness5/5

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

The description is three sentences, each earning its place: first sentence defines the action, second sentence emphasizes idempotency, third sentence covers error handling and return values. No redundancy or unnecessary detail.

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

Completeness3/5

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

The description adequately covers purpose, safety, and error behavior, and the output schema covers return values. However, given the high parameter count (10) and zero schema descriptions, the lack of parameter guidance leaves the description incomplete for correct invocation. It is sufficient for understanding what the tool does but not for parameter selection.

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

Parameters1/5

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

Schema description coverage is 0%, and the description does not explain the purpose or format of any of the 10 parameters (e.g., what employee_id, company_id, decision_maker_flag represent). The description must compensate for the lack of schema parameter descriptions, but it fails to do so, leaving the agent to guess parameter semantics from names alone.

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?

The description clearly states the action ('Create or update one lead'), the resource ('lead in HubSpot'), and specifics that it upserts both Company and Contact and associates them. It distinguishes itself from sibling tools like 'get_lead_profile' (read-only) and 'upsert_blog_summary' (different entity).

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?

The description explains that calling the tool twice is safe and does not duplicate, indicating idempotency. However, it does not provide explicit guidance on when to use this tool versus alternatives (e.g., get_lead_profile for reads) or when not to use it, leaving usage context implied.

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. 4 tool updatesv0.1.0
    • First observedget_blog_summary
    • First observedget_lead_profile
    • First observedupsert_blog_summary
    • First observedupsert_lead_profile

TDQS

A3.8/5.0

Scored across 4 tools

Disambiguation2/5

The tools clearly separate lead and blog summary domains, but within each domain the upsert and get tools have high semantic overlap in purpose, though descriptions help distinguish read vs. write.

Naming Consistency4/5

All tool names follow a consistent verb_noun pattern (upsert/get + lead_profile/blog_summary) with snake_case, very predictable. Minor point: 'upsert' is a valid term but less common than 'create_or_update'.

Tool Count4/5

4 tools is a reasonable count for a focused HubSpot integration covering two entities (lead and blog summary) with basic CRUD. It's slightly thin but appropriate for a narrow scope.

Completeness3/5

Coverage is incomplete: lead profiles have upsert+get but no ability to delete or list/filter leads. Blog summaries similarly lack delete and listing. The domain surface has notable missing operations that could hinder workflows.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Exposes HubSpot CRM data and actions as tools for AI agents, enabling contact lookup, company search, contact creation, and activity logging via natural language.
    4
    506 npm
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables interaction with HubSpot CRM through two tools (upsert_lead_profile and get_lead_profile) for managing lead profiles, using FastMCP with Secret Manager-based authentication and supporting both stdio and HTTP transports.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to interact with HubSpot CRM data, providing tools to create and retrieve contacts, companies, activities, and conversations, plus semantic search across previously retrieved data. Built-in vector storage and caching help overcome HubSpot API limitations and improve response times.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to interact with HubSpot CRM data for creating and retrieving contacts, companies, activity, and conversations, with built-in vector storage and caching for faster semantic search.
    -