Skip to main content

CRM agent skills (HubSpot + Salesforce) for Concinno — Databricks 2026 enterprise agent top use case.

Project description

concinno-skills-crm

CRM agent skills for Concinno — HubSpot + Salesforce. Databricks 2026 State of AI Agents places customer experience (~40 % of enterprise use cases) at the top of the agent workload pile; CRM is the system-of-record, so it is the first ecosystem we ship after concinno-skills-chat and concinno-skills-google.

Status

MVP (0.1.0) — four tools, two ecosystems:

Tool class Platform Underlying SDK SDK licence
HubSpotContact HubSpot hubspot-api-client Apache-2.0
HubSpotDeal HubSpot hubspot-api-client Apache-2.0
SalesforceQuery Salesforce simple-salesforce Apache-2.0
SalesforceUpsert Salesforce simple-salesforce Apache-2.0

Pipedrive / Zoho / Microsoft Dynamics are deferred to 0.2.x until a maintained Python SDK with a permissive licence is proven stable.

Install

pip install concinno-skills-crm

Both SDKs are hard dependencies and pulled in automatically.

Credentials

Tokens live under well-known keys in the Concinno CredentialStore, which reads (in order):

  1. Runtime overrides via CredentialStore.set(...).
  2. Env var CONCINNO_CRED_<UPPER_KEY>.
  3. ~/.concinno/credentials.json.

HubSpot

Key Env var
hubspot_access_token CONCINNO_CRED_HUBSPOT_ACCESS_TOKEN

Produce the token via HubSpot → Settings → Integrations → Private Apps (or an OAuth install if you run a marketplace app).

Salesforce

Two auth flows are supported. Provide one set of keys:

Password + security token flow:

Key Env var
salesforce_username CONCINNO_CRED_SALESFORCE_USERNAME
salesforce_password CONCINNO_CRED_SALESFORCE_PASSWORD
salesforce_security_token CONCINNO_CRED_SALESFORCE_SECURITY_TOKEN

Session-id flow (when you already hold a bearer session):

Key Env var
salesforce_session_id CONCINNO_CRED_SALESFORCE_SESSION_ID
salesforce_instance_url CONCINNO_CRED_SALESFORCE_INSTANCE_URL

Optional for both flows: salesforce_domain — set to "test" for a sandbox org, default is "login".

Example ~/.concinno/credentials.json:

{
  "hubspot_access_token": "pat-na1-...",
  "salesforce_username": "me@example.com",
  "salesforce_password": "secret",
  "salesforce_security_token": "abcdef",
  "salesforce_domain": "login"
}

Missing credentials return {"error": "no <service> credentials — set via CredentialStore / env ..."} rather than crashing.

Usage via Concinno ToolRegistry

When the consumer sets CONCINNO_LOAD_PLUGINS=1, the default registry auto-mounts every CRM tool:

import os
os.environ["CONCINNO_LOAD_PLUGINS"] = "1"

from concinno.tools.registry import get_default_registry

reg = get_default_registry()
assert {
    "HubSpotContact",
    "HubSpotDeal",
    "SalesforceQuery",
    "SalesforceUpsert",
} <= set(reg.list_deferred())

Direct Python usage

from concinno_skills_crm import (
    HubSpotContact,
    HubSpotDeal,
    SalesforceQuery,
    SalesforceUpsert,
)

HubSpotContact().call(
    action="create",
    properties={"email": "a@b.com", "firstname": "A"},
)
HubSpotDeal().call(action="list", limit=50)
SalesforceQuery().call(
    action="soql",
    query="SELECT Id, Name FROM Account LIMIT 5",
)
SalesforceUpsert().call(
    action="upsert",
    sobject="Account",
    external_id_field="External_Id__c",
    external_id="X123",
    data={"Name": "Acme"},
)

All tools return {"ok": True, ...} (or {"results": [...]} for list) on success and {"error": "..."} on failure — same shape as every other Concinno built-in tool. No exceptions escape call().

Concurrency

All four tools set is_concurrency_safe = False. CRM clients hold session + rate-limit state, and serial calls are the sane default for HubSpot's per-account budget and Salesforce's API limits (typically 15k / 24h / org per free tier).

Safety notes

  • SalesforceQuery.soql forwards the query string verbatim but warn-logs when a DML verb (UPDATE / DELETE / INSERT / UPSERT / MERGE) leads the string — SFDC's /query endpoint will reject it, this is purely triage help.
  • list actions cap the page size at 100 (HubSpot) / 1000 (defensive). Larger pulls belong in a 0.2.x list_all action with explicit pagination.

License

Apache-2.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

concinno_skills_crm-0.1.0.tar.gz (42.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

concinno_skills_crm-0.1.0-py3-none-any.whl (17.8 kB view details)

Uploaded Python 3

File details

Details for the file concinno_skills_crm-0.1.0.tar.gz.

File metadata

  • Download URL: concinno_skills_crm-0.1.0.tar.gz
  • Upload date:
  • Size: 42.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for concinno_skills_crm-0.1.0.tar.gz
Algorithm Hash digest
SHA256 516adca6dcf71bcd90cfc4e47778a6ad3458ea1a7c8adfe5d2aaa962dce7fcad
MD5 a6b2f126fed410e97a318bebbce2ab1e
BLAKE2b-256 830ec232d9e52e58086ebde81ed0f1005b520f8c35e00693db1fd4fffb2f8052

See more details on using hashes here.

File details

Details for the file concinno_skills_crm-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for concinno_skills_crm-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 61c535e9cbc1341534797cb2b67c6a9ca0f55f1154f57881c56b2eb3cdf81ba2
MD5 d6957b4b7506e698984ad2e75dfa23a4
BLAKE2b-256 cbe87520b29f43c4aa81ec04bfd48229c25d0342f5d2e5f654dc96d8b14ad968

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page