Skip to main content

accelo-mcp

An unofficial Model Context Protocol server for the Accelo CRM platform. It exposes Accelo data and operations to MCP-compatible AI assistants through the documented Accelo REST API.

This project is not affiliated with or endorsed by Accelo. Users are responsible for their Accelo account, OAuth application, permissions, and data handling.

Installation

With uvx

The recommended installation for MCP hosts is:

{
  "mcpServers": {
    "accelo": {
      "command": "uvx",
      "args": ["accelo-mcp"],
      "env": {
        "ACCELO_DEPLOYMENT": "your-deployment",
        "ACCELO_CLIENT_ID": "your-client-id",
        "ACCELO_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

To pin a release:

"args": ["accelo-mcp==0.1.0"]

uvx installs the package into an isolated environment and runs the accelo-mcp command.

With pip

python3 -m pip install accelo-mcp
accelo-mcp

From source

git clone <repository-url>
cd accelo-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Configuration

Copy .env.example to .env, or provide these variables through the MCP host:

Variable Required Default Description
ACCELO_DEPLOYMENT Yes — Deployment prefix, such as example for example.accelo.com
ACCELO_CLIENT_ID Yes — OAuth2 client ID from an Accelo application
ACCELO_CLIENT_SECRET Depends on auth type — OAuth2 client secret; not required for public PKCE applications
ACCELO_AUTH_TYPE No web web, service, installed, or public
ACCELO_SCOPE No read(all) OAuth2 scope; defaults to read-only. Add write access explicitly, e.g. read(all),write(all), only if you need the write tools
ACCELO_REDIRECT_URI For web and public http://localhost:9876/callback (web only) Local OAuth callback URL. Optional for web (defaults as shown); required for public with no default. Must exactly match the redirect URI registered on the Accelo application.

HTTP transport variables (only used with --http or --sse):

Variable Default Description
ACCELO_MCP_HOST 127.0.0.1 Interface to bind. Set to 0.0.0.0 to accept connections from outside a container.
ACCELO_MCP_PORT 3000 TCP port to listen on.
ACCELO_MCP_PATH /mcp Streamable HTTP endpoint path.
ACCELO_MCP_JSON_RESPONSE false Return a single JSON response instead of an SSE stream.
ACCELO_MCP_STATELESS false Run without per-session state so any node can serve any request (suits horizontally scaled deployments).
ACCELO_MCP_ALLOWED_HOSTS — Comma-separated Host header allow-list for DNS-rebinding protection, e.g. your public hostname. Required when the server is reached through any hostname other than localhost.
ACCELO_MCP_ALLOWED_ORIGINS — Comma-separated Origin header allow-list.
ACCELO_MCP_DISABLE_DNS_REBINDING_PROTECTION false Disable the Host/Origin check entirely. Prefer setting the allow-lists above instead.

Create or obtain an OAuth application for the Accelo deployment you intend to access. Never commit client secrets, refresh tokens, access tokens, cookies, or webhook secrets.

Authentication types

All four authentication types use OAuth 2.0. They differ in whether a person authorises interactively in a browser and whether a client secret is required.

Auth type OAuth 2.0 grant Interactive browser login Client secret Typical use
web Authorisation Code + refresh token Yes, once Required Individual users; the recommended default
public Authorisation Code with PKCE + refresh token Yes, once Not required Publicly distributed clients that cannot keep a secret
installed Authorisation Code via PIN + refresh token Yes (approve, then enter a PIN) Required Installed clients using Accelo's PIN approval
service Client Credentials No Required Server-to-server automation under a shared service identity

Key points:

  • public still requires OAuth. "Public" means no client secret is distributed, not that authentication is skipped. On first run the server opens your browser, you log in to Accelo and authorise, Accelo redirects back to a local 127.0.0.1 callback listener, and the server exchanges the authorisation code (using a PKCE code_verifier) for tokens. No client secret is ever sent.
  • service is the only non-interactive flow. It authenticates as a service identity via the Client Credentials grant and never opens a browser. Every other type requires a one-time interactive authorisation.
  • After the first authorisation, web, public, and installed cache a refresh token and reauthorise silently, so the browser step is not repeated on later runs.
  • The redirect URI must line up in three places for web and public: the ACCELO_REDIRECT_URI you set, the port the local callback listener binds (derived from that URI, or 8080 if the URI has no explicit port), and the redirect URI registered on the Accelo application. Accelo rejects the authorisation request if its registered value does not match. For public, ACCELO_REDIRECT_URI is mandatory and has no default.

Tokens are cached locally at ~/.accelo-mcp/tokens.json with restrictive file permissions. The local callback listener binds to 127.0.0.1 only.

Usage

The default transport is stdio, which is suitable for Claude Desktop, Kiro, and other local MCP hosts:

accelo-mcp

For remote or networked hosts, run the server over Streamable HTTP (the current MCP HTTP transport):

accelo-mcp --http

This listens on http://127.0.0.1:3000/mcp by default. To serve from inside a container or behind a reverse proxy or load balancer, bind all interfaces and allow-list the public hostname so DNS-rebinding protection does not reject proxied requests:

ACCELO_MCP_HOST=0.0.0.0 \
ACCELO_MCP_PORT=8080 \
ACCELO_MCP_ALLOWED_HOSTS=mcp.example.com \
ACCELO_MCP_ALLOWED_ORIGINS=https://mcp.example.com \
accelo-mcp --http

Set ACCELO_MCP_STATELESS=true for horizontally scaled deployments where any instance may serve any request.

The older SSE transport is still available but deprecated; prefer --http for new deployments:

accelo-mcp --sse

The server provides 219 tools covering companies, contacts, affiliations, activities, projects, tickets, tasks, retainers, sales, billing, time tracking, custom fields, resources, workflow progressions, and related Accelo objects.

For complex queries, call accelo_get_context first. It describes the Accelo object model, relationships, filtering conventions, pagination, and field selection syntax.

Filtering and field selection

All list tools accept structured filters:

{"standing": "active"}
{"date_created_after": 1690000000}
{"status": [1, 2, 3]}
{"order_by_desc": "date_modified"}

Request linked or optional fields with fields:

website,phone
postal_address(city,state)
_ALL

Development

make install  # install the package and development dependencies
make test     # run tests
make lint     # run Ruff checks
make audit    # audit Python dependencies for known vulnerabilities
make check    # run lint, tests, and dependency audit
make build    # build a wheel and source distribution

Releasing

Releases are driven by the version in pyproject.toml. Bumping that version on main is the only manual step; validation, tagging, the GitHub Release, and the PyPI publish are automated by a single workflow.

  1. Bump version in pyproject.toml (for example 0.1.0 to 0.2.0) on a branch and merge it to main through a pull request. Follow semantic versioning.

  2. On merge, the Release workflow (.github/workflows/publish.yml) detects the changed version and, in one run:

    • runs make check (lint, tests, and dependency audit),
    • creates the matching v<version> tag and a GitHub Release with generated notes, and
    • builds the wheel and source distribution and publishes them to PyPI via OIDC Trusted Publishing (no stored API token).

    The workflow is idempotent: if the version is unchanged since the previous commit, or the tag already exists on the remote, it does nothing.

Tagging and publishing live in the same workflow on purpose. A tag pushed by the built-in GITHUB_TOKEN does not trigger a second workflow, so a separate tag-triggered publish job would never run. Folding both into one push-triggered workflow avoids that loop-guard.

To cut a release by hand, bump the version and push the tag yourself:

git tag v0.2.0   # must equal "v" + the pyproject.toml version
git push origin v0.2.0

Note that a hand-pushed tag alone does not publish (nothing is triggered by a tag push); publishing happens through the version bump on main. The Release workflow still verifies the tag equals v + the pyproject.toml version and fails if they differ, so the tag and the package version cannot drift.

Publishing to PyPI requires a configured pypi GitHub environment and a PyPI Trusted Publisher registered for this repository's publish.yml workflow. The workflow file must stay named publish.yml: PyPI matches the trusted publisher on the exact workflow filename, so renaming it breaks publishing even though the workflow's display name is "Release".

Security

Please report suspected vulnerabilities privately. See SECURITY.md for the reporting process. Do not include credentials, customer data, or access tokens in an issue.

License

MIT. See LICENSE.

Metadata

Release files for accelo-mcp 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for accelo-mcp 0.3.0
File Size Uploaded Provenance Actions
accelo_mcp-0.3.0.tar.gz 73.1 kB With provenance Details for accelo_mcp-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for accelo-mcp 0.3.0
File Interpreter ABI Platform Actions
accelo_mcp-0.3.0-py3-none-any.whl Python 3 none any Details for accelo_mcp-0.3.0-py3-none-any.whl

Total release size: 159.8 kB

Release files / accelo_mcp-0.3.0.tar.gz

Download URL accelo_mcp-0.3.0.tar.gz
Size 73.1 kB
Tags Source
SHA-256 checksum
How to use checksums
ef1194bca22ef4c87ab68385d649b14cac25cbc6e6144106ee8a907eee5862ab
BLAKE2b-256 checksum
How to use checksums
1e82b342820f6712ab6e3b3fadd668cf9317ab239c4e647cf7b75a753c126bd2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release files / accelo_mcp-0.3.0-py3-none-any.whl

Download URL accelo_mcp-0.3.0-py3-none-any.whl
Size 86.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4e481472867e532bca4a9eb63b446cc2229d2da05db7bf45492420c486e76f3a
BLAKE2b-256 checksum
How to use checksums
2e1859aa5257f24755617fd2ab60bd622aaf049b0a65be580f25bb4e02b54a4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Security for accelo-mcp 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for accelo_mcp-0.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page