Skip to main content

Twenty CRM REST/GraphQL MCP Server for Agentic AI!

Project description

Twenty MCP

Status Version License

Documentation — Installation, deployment, usage across the MCP, API, and agent interfaces, and guidance for provisioning the Twenty CRM platform are maintained in the official documentation.

Twenty CRM Customer Relationship Management system orchestrator. Built with the highest architectural standards, incorporating dynamic facades, custom API routing, and FastMCP tool decoration.

Table of Contents


Overview

Twenty MCP provides a high-performance, model-optimized interface to Twenty capabilities. It isolates the model from underlying API transport complexity, ensuring safe, idempotent, and highly traceable system interactions.


Features

  • Dynamic Facade Orchestration: Integrates multi-inheritance clients cleanly under a single facade.
  • Battle-Tested Resilience: Out-of-the-box credential authentication, connection polling, and request retry strategies.
  • FastMCP Declarative Tools: Fast, native schema registration with full inline validation.
  • Complete Test Intent Diversity: Deep, automated unit, integration, and mock tests ensuring high code coverage.

⚙️ Dynamic Tool Selection & Visibility

This MCP server supports dynamic toolset selection and visibility filtering at runtime. This allows you to restrict the set of exposed tools in order to prevent blowing up the LLM's context window.

You can configure tool filtering via multiple input channels:

  • CLI Arguments: Pass --tools or --toolsets (or their disabled counterparts --disabled-tools and --disabled-toolsets) during startup.
  • Environment Variables: Define standard environment variables:
    • MCP_ENABLED_TOOLS / MCP_DISABLED_TOOLS
    • MCP_ENABLED_TAGS / MCP_DISABLED_TAGS
  • HTTP SSE Request Headers: Pass custom headers during transport initialization:
    • x-mcp-enabled-tools / x-mcp-disabled-tools
    • x-mcp-enabled-tags / x-mcp-disabled-tags
  • HTTP SSE Request Query Parameters: Append query parameters directly to your transport connection URL:
    • ?tools=tool1,tool2
    • ?tags=tag1

When query strings or parameters are supplied, an LLM-free Knowledge Graph resolution layer (using DynamicToolOrchestrator) matches query intents against known tool tags, names, or descriptions, with safe fallback and automated 24-hour background cache refreshing.


Installation

Install the slim [mcp] extra. The twenty-mcp[mcp] extra pulls only the FastMCP / FastAPI tooling (agent-utilities[mcp]). It deliberately excludes the heavy agent runtime (the epistemic-graph engine, pydantic-ai, dspy, llama-index, tree-sitter), so uvx/container installs are dramatically smaller and faster. Use the full [agent] extra only when you need the integrated Pydantic AI agent.

Pick the extra that matches what you want to run:

Extra Installs Use when
twenty-mcp[mcp] Slim MCP server only (agent-utilities[mcp] — FastMCP/FastAPI) You only run the MCP server (smallest install / image)
twenty-mcp[agent] Full agent runtime (agent-utilities[agent,logfire] — Pydantic AI + the epistemic-graph engine) You run the integrated agent
twenty-mcp[all] Everything (mcp + agent + logfire + gql) Development / both surfaces
# MCP server only (recommended for tool hosting — slim deps)
uv pip install "twenty-mcp[mcp]"

# Full agent runtime (Pydantic AI + epistemic-graph engine)
uv pip install "twenty-mcp[agent]"

# Everything (development)
uv pip install "twenty-mcp[all]"      # or: python -m pip install "twenty-mcp[all]"

Container images (:mcp vs :agent)

One multi-stage docker/Dockerfile builds two right-sized images, selected by --target:

Image tag Build target Contents Entrypoint
knucklessg1/twenty-mcp:mcp --target mcp twenty-mcp[mcp]slim, no engine/pydantic-ai/dspy/llama-index/tree-sitter twenty-mcp
knucklessg1/twenty-mcp:latest --target agent (default) twenty-mcp[agent]full agent runtime + epistemic-graph engine twenty-agent
docker build --target mcp   -t knucklessg1/twenty-mcp:mcp    docker/   # slim MCP server
docker build --target agent -t knucklessg1/twenty-mcp:latest docker/   # full agent

Knowledge-graph database (epistemic-graph)

The full agent ([agent] / :latest) embeds the epistemic-graph engine (pulled in transitively via agent-utilities[agent]). For production — or to share one knowledge graph across multiple agents — run epistemic-graph as its own database container and point the agent at it instead of embedding it. Deployment recipes (single-node + Raft HA), connection config, and the full database architecture (with diagrams) are documented in the epistemic-graph deployment guide. The slim [mcp] server does not require the database.


Usage

You can launch the FastMCP server in stdio mode via Python module execution:

import asyncio
from twenty_mcp.mcp_server import get_mcp_instance

async def main():
    mcp = get_mcp_instance()
    # Execute stdio loop or launch server
    print("MCP Server ready.")

if __name__ == "__main__":
    asyncio.run(main())

For direct shell launch, execute:

python -m twenty_mcp.mcp_server

Configuration

The package is fully configurable via the environment variables listed below. A local template is supplied inside .env.example — copy it to .env and fill in your service endpoint parameters before starting execution.

Connection & credentials

Variable Description Default
TWENTY_URL Twenty CRM Base Server URL http://localhost:3000
TWENTY_TOKEN Developer authentication token
TWENTY_MCP_BASE_URL Base API URL to query http://localhost:3000/api
TWENTY_API_PREFIX Twenty API custom path prefix http://localhost:3000/api/v1
TWENTY_MCP_USERNAME Auth username for service admin
TWENTY_MCP_PASSWORD Auth password for service
TWENTY_MCP_SSL_VERIFY TLS verification flag True

MCP server / transport

Variable Description Default
TRANSPORT stdio, streamable-http, or sse stdio
HOST Bind host (HTTP transports) 0.0.0.0
PORT Bind port (HTTP transports) 8000
MCP_TOOL_MODE Tool surface: condensed, verbose, or both condensed
MCP_ENABLED_TOOLS / MCP_DISABLED_TOOLS Comma-separated tool allow/deny list
MCP_ENABLED_TAGS / MCP_DISABLED_TAGS Comma-separated tag allow/deny list

Tool toggles

Each action-routed tool can be disabled individually via its toggle env var (set to false). The full list is in the MCP Tools table below (CRMTOOL, METADATATOOL, OAUTHTOOL, GRAPHQLTOOL).

Agent runtime (full [agent] runtime only)

Variable Description Default
MCP_URL URL of the MCP server the agent connects to http://localhost:8000/mcp
PROVIDER LLM provider (e.g. openai) openai
MODEL_ID Model id (e.g. gpt-4o) gpt-4o

MCP Tools

Auto-generated from the live MCP server — do not edit by hand.

Condensed action-routed tools (default — MCP_TOOL_MODE=condensed)

MCP Tool Toggle Env Var Description
twenty_discover_graphql_schema GRAPHQLTOOL Discover Twenty's underlying object/field/relation metadata (meta-model).
twenty_graphql GRAPHQLTOOL Execute raw GraphQL queries and mutations natively on Twenty.
twenty_mcp_crm CRMTOOL Manage Twenty MCP crm operations.
twenty_mcp_metadata METADATATOOL Manage Twenty MCP metadata schema operations.
twenty_mcp_oauth OAUTHTOOL Manage Twenty MCP OAuth and Webhooks operations.
twenty_provision_api_key GRAPHQLTOOL Programmatically provision a long-lived Twenty API key from user credentials (login->token->createApiKey->generateApiKeyToken on /metadata). Day-0 provisioning primitive.

Verbose 1:1 API-mapped tools (MCP_TOOL_MODE=verbose or both)

49 per-operation tools — one per public API method (click to expand)
MCP Tool Toggle Env Var Description
twenty_batch_create_records CRM_APITOOL Batch create up to 60 records for any object.
twenty_batch_delete_records CRM_APITOOL Batch delete up to 60 records by ID for any object.
twenty_batch_update_records CRM_APITOOL Batch update up to 60 records for any object.
twenty_client_credentials_oauth_token OAUTH_APITOOL Perform a server-to-server client credentials flow to get a workspace-scoped token.
twenty_create_company CRM_APITOOL Create a company in CRM.
twenty_create_metadata_field METADATA_APITOOL Create a custom field on a standard or custom object.
twenty_create_metadata_object METADATA_APITOOL Create a new custom object schema (e.g. Invoice).
twenty_create_metadata_relation METADATA_APITOOL Create a bidirectional relation between objects.
twenty_create_opportunity CRM_APITOOL Create opportunity.
twenty_create_person CRM_APITOOL Create a person in CRM.
twenty_create_record CRM_APITOOL Create a new record for any custom or built-in object.
twenty_delete_company CRM_APITOOL Delete a company by ID.
twenty_delete_metadata_field METADATA_APITOOL Delete a custom field from an object schema.
twenty_delete_metadata_object METADATA_APITOOL Delete a custom object schema.
twenty_delete_metadata_relation METADATA_APITOOL Delete an existing relation by relation ID.
twenty_delete_opportunity CRM_APITOOL Delete an opportunity by ID.
twenty_delete_person CRM_APITOOL Delete a contact by ID.
twenty_delete_record CRM_APITOOL Delete a record by ID for any custom or built-in object.
twenty_exchange_oauth_token OAUTH_APITOOL Exchange an authorization code for access and refresh tokens.
twenty_execute_gql CRM_APITOOL Execute arbitrary GraphQL queries on core and custom schemas.
twenty_find_duplicates CRM_APITOOL Find duplicate records for an object by data payload or record IDs.
twenty_find_records CRM_APITOOL Ergonomic record search wrapper mapping to Twenty REST query params.
twenty_get_companies CRM_APITOOL Get CRM companies.
twenty_get_company CRM_APITOOL Get a specific company by ID.
twenty_get_metadata METADATA_APITOOL Fetch complete workspace metadata schema.
twenty_get_metadata_field METADATA_APITOOL Fetch a specific field schema by ID.
twenty_get_metadata_fields METADATA_APITOOL Fetch all field schemas.
twenty_get_metadata_object METADATA_APITOOL Fetch a specific object schema by name or ID.
twenty_get_metadata_objects METADATA_APITOOL Fetch all object schemas.
twenty_get_metadata_relation METADATA_APITOOL Fetch a specific relation schema by ID.
twenty_get_metadata_relations METADATA_APITOOL Fetch all relation schemas.
twenty_get_oauth_discovery OAUTH_APITOOL Fetch the standard OAuth configuration server discovery metadata.
twenty_get_opportunities CRM_APITOOL Get opportunities.
twenty_get_opportunity CRM_APITOOL Get a specific opportunity by ID.
twenty_get_people CRM_APITOOL Get CRM contacts.
twenty_get_person CRM_APITOOL Get a specific contact by ID.
twenty_get_record CRM_APITOOL Fetch a specific record by ID for any custom or built-in object.
twenty_get_records CRM_APITOOL Fetch a list of records for any custom or built-in object.
twenty_refresh_oauth_token OAUTH_APITOOL Refresh an expired access token using a refresh token.
twenty_register_oauth_client OAUTH_APITOOL Register a new OAuth client dynamically per RFC 7591.
twenty_request_metadata METADATA_APITOOL Internal helper for Routing Metadata requests under /rest/metadata or /metadata.
twenty_update_company CRM_APITOOL Update a company's fields by ID.
twenty_update_metadata_field METADATA_APITOOL Update an existing field's metadata configuration.
twenty_update_metadata_object METADATA_APITOOL Update a custom object schema.
twenty_update_metadata_relation METADATA_APITOOL Update an existing relation by relation ID.
twenty_update_opportunity CRM_APITOOL Update an opportunity's fields by ID.
twenty_update_person CRM_APITOOL Update a contact's fields.
twenty_update_record CRM_APITOOL Update an existing record by ID for any custom or built-in object.
twenty_validate_webhook_signature OAUTH_APITOOL Validate an incoming webhook signature using HMAC SHA256 (timing safe).

6 action-routed tool(s) (default) · 49 verbose 1:1 tool(s). Each is enabled unless its <DOMAIN>TOOL toggle is set false; MCP_TOOL_MODE selects the surface (condensed default · verbose 1:1 · both). Auto-generated — do not edit.

See docs/overview.md or docs/concepts.md for deeper operational examples.


Architecture

This package uses the standardized Agent-Utilities dynamic facade architecture:

graph TD
    User([User Agent]) --> Server[FastMCP Server]
    Server --> Facade[Api Dynamic Facade]
    Facade --> ClientBase[ApiClientBase]
    Facade --> Auth[Credentials Auth Handler]
    ClientBase --> Service([External Service API])

Deployment

Bare-Metal (Standard pip)

  1. Set up your Python virtual environment (>= 3.10).
  2. Install the package: pip install .[all]
  3. Export credentials:
    export TWENTY_URL="http://localhost:3000"
    
  4. Run: python -m twenty_mcp.mcp_server

Container (Docker Compose)

A standard compose structure is provided inside the docker/ folder. Build and deploy:

docker compose -f docker/compose.yml up --build -d

Additional Deployment Options

twenty-mcp can also run as a local container (Docker / Podman / uv) or be consumed from a remote deployment. The Deployment guide has full, copy-paste mcp_config.json for all four transports — stdio, streamable-http, local container / uv, and remote URL:

  • Local container / uv — launch the server from mcp_config.json via uvx, docker run, or podman run, or point at a local streamable-http container by url.
  • Remote URL — connect to a server deployed behind Caddy at http://twenty-mcp.arpa/mcp using the "url" key.

Documentation

The complete documentation is published as the official documentation site and is the recommended reference for installation, deployment, and day-to-day operation.

Page Contents
Installation pip, source, extras, prebuilt Docker image
Deployment run the MCP and agent servers, Compose, Caddy + Technitium, env config
Usage the MCP tools, the Api client, the A2A agent
Backing Platform deploy Twenty CRM with Docker
Overview the dynamic facade architecture
Concepts concept registry (CONCEPT:TWENTY-*)

Contributing

Please audit all code changes against ecosystem guidelines in CONTRIBUTING.md if available, and run:

pre-commit run --all-files

License

This project is licensed under the MIT License. See the LICENSE file for complete details.

Deploy with agent-os-genesis

This package can be provisioned for you — skill-guided — by the agent-os-genesis universal skill (its single-package deploy mode): it picks your install method, seeds secrets to OpenBao/Vault (or .env), trusts your enterprise CA, registers the MCP server, and verifies it — the same machinery that stands up the whole Agent OS, narrowed to just this package. Ask your agent to "deploy twenty-mcp with agent-os-genesis".

Install mode Command
Bare-metal, prod (PyPI) uvx twenty-mcp · or uv tool install twenty-mcp
Bare-metal, dev (editable) uv pip install -e ".[all]" · or pip install -e ".[all]"
Container, prod deploy knucklessg1/twenty-mcp:latest via docker-compose / swarm / podman / podman-compose / kubernetes
Container, dev (editable) deploy docker/compose.dev.yml (source-mounted at /src; edits live on restart)

Secrets are read-existing + seeded via vault_sync — you are only prompted for what's missing.

Environment Variables

Package environment variables

Variable Example Description
TWENTY_URL http://localhost:3000 Twenty CRM Base Server URL
TWENTY_TOKEN twenty_developer_access_token Developer authentication token
TWENTY_MCP_BASE_URL http://localhost:3000/api Base API URL to query
TWENTY_MCP_USERNAME admin Auth username for service
TWENTY_MCP_PASSWORD secure_password Auth password for service
TWENTY_MCP_SSL_VERIFY True SSL verification flag
CRMTOOL True CRM Tool Enabled Flag
METADATATOOL True Metadata Tool Enabled Flag
OAUTHTOOL True OAuth Tool Enabled Flag
GRAPHQLTOOL True GraphQL Tool Enabled Flag
TWENTY_API_PREFIX http://localhost:3000/api/v1 Twenty API custom path prefix (if needed)

Inherited agent-utilities variables (apply to every connector)

Variable Example Description
TRANSPORT stdio MCP transport: stdio
HOST 0.0.0.0 Bind host (HTTP transports)
PORT 8000 Bind port (HTTP transports)
MCP_TOOL_MODE condensed Tool surface: condensed
MCP_ENABLED_TOOLS Comma-separated tool allow-list
MCP_DISABLED_TOOLS Comma-separated tool deny-list
MCP_ENABLED_TAGS Comma-separated tag allow-list
MCP_DISABLED_TAGS Comma-separated tag deny-list
EUNOMIA_TYPE none Authorization mode: none
EUNOMIA_POLICY_FILE mcp_policies.json Embedded Eunomia policy file
EUNOMIA_REMOTE_URL Remote Eunomia authorization server URL
ENABLE_OTEL False Enable OpenTelemetry export
OTEL_EXPORTER_OTLP_ENDPOINT OTLP collector endpoint
MCP_CLIENT_AUTH Outbound MCP auth (oidc-client-credentials for fleet calls)
OIDC_CLIENT_ID OIDC client id (service-account auth)
OIDC_CLIENT_SECRET OIDC client secret (service-account auth)
DEBUG False Verbose logging
PYTHONUNBUFFERED 1 Unbuffered stdout (recommended in containers)
MCP_URL http://localhost:8000/mcp URL of the MCP server the agent connects to
PROVIDER openai LLM provider for the agent
MODEL_ID gpt-4o Model id for the agent
ENABLE_WEB_UI True Serve the AG-UI web interface

11 package + 22 inherited variable(s). Auto-generated from .env.example + the shared agent-utilities set — do not edit.

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

twenty_mcp-1.0.1.tar.gz (39.0 kB view details)

Uploaded Source

Built Distribution

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

twenty_mcp-1.0.1-py3-none-any.whl (41.1 kB view details)

Uploaded Python 3

File details

Details for the file twenty_mcp-1.0.1.tar.gz.

File metadata

  • Download URL: twenty_mcp-1.0.1.tar.gz
  • Upload date:
  • Size: 39.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for twenty_mcp-1.0.1.tar.gz
Algorithm Hash digest
SHA256 c2fe325427e11b82983ec2e6fd273cdca4a62a03297614c4a26509162035fe00
MD5 4ab430ac0bec1b704e6c5f8e54184954
BLAKE2b-256 a588af75569e470a2eaf9de64e7fea778583a24a3f9001f6e7ca0b9c6be11caf

See more details on using hashes here.

File details

Details for the file twenty_mcp-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: twenty_mcp-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 41.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for twenty_mcp-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5114de1cf13ee48eb31ee61097a614ac2c37d9a80653d7892cf8b659876946be
MD5 150a70ac7a03bfdb212181d71b9872c1
BLAKE2b-256 ef275e4b91a35f116a5fb1b60f968e67bc109b7cd1382e33513aa0676574bfad

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