Skip to main content

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.

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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

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