Atlas / MCP servers / jezweb / Twenty CRM

Twenty CRMSAFE

mcp/jezweb/twenty-crm-2
Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
29 19r · 10w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
52
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://opensource.org/licenses/MIT) [](https://www.typescriptlang.org/) [](https://twenty.com/) [](https://modelcontextprotocol.io/)

A Model Context Protocol (MCP) server that provides seamless integration with the Twenty CRM API, enabling LLM agents to interact with your CRM data through well-defined, typed tools.

📋 Table of Contents

  • Overview
  • Prerequisites
  • Quick Start
  • Installation
  • Configuration
  • OAuth Authentication
  • Verification
  • IDE Integration
  • Usage
  • Troubleshooting
  • Additional Resources

Overview

This MCP server transforms your Twenty CRM instance into a powerful tool accessible by Claude and other MCP-compatible AI assistants. It provides comprehensive access to contacts, companies, tasks, and notes with full TypeScript support and robust error handling.

Key Features

  • 🤝 Contact Management: Create, retrieve, update, and search contacts
  • 🏢 Company Management: Full company lifecycle management
  • 💼 Opportunity Tracking: Complete sales pipeline management
  • 📝 Activity Management: Unified timeline view with filtering
  • ✅ Task Management: Create and manage tasks
  • 🔗 Relationship Management: Link entities and analyze connections
  • 🔍 Metadata Discovery: Explore CRM schema and field definitions
  • 🔐 OAuth 2.1 Authentication: Secure user-specific API key management
  • 🔒 Full TypeScript Support: Type-safe operations with validation

Total: 29 MCP Tools providing comprehensive CRM automation

Read from source at commit 8d310d85a21cOBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add twenty-mcp-server --env API_KEY_ENCRYPTION_SECRET=${API_KEY_ENCRYPTION_SECRET} --env AUTH_ENABLED=${AUTH_ENABLED} --env AUTH_PROVIDER=${AUTH_PROVIDER} --env CLERK_PUBLISHABLE_KEY=${CLERK_PUBLISHABLE_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "twenty-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "API_KEY_ENCRYPTION_SECRET": "${API_KEY_ENCRYPTION_SECRET}",
        "AUTH_ENABLED": "${AUTH_ENABLED}",
        "AUTH_PROVIDER": "${AUTH_PROVIDER}",
        "CLERK_PUBLISHABLE_KEY": "${CLERK_PUBLISHABLE_KEY}"
      }
    }
  }
}
03

Exposed tools (29)

19 read · 10 write · 0 destructive.

ToolRiskDescription
create_commentwriteCreate a comment on any CRM record
create_companywriteCreate a new company in Twenty CRM
create_contactwriteCreate a new contact (person) in Twenty CRM
create_notewriteCreate a new note in Twenty CRM
create_opportunitywriteCreate a new opportunity/deal in Twenty CRM
create_taskwriteCreate a new task in Twenty CRM
filter_activitiesreadFilter activities by specific criteria
find_orphaned_recordsreadFind records that are missing important relationships (companies without contacts, contacts without companies, etc.)
get_activitiesreadGet unified activities timeline from Twenty CRM (tasks, notes, etc.)
get_companyreadRetrieve a company by ID from Twenty CRM
get_company_contactsreadGet all contacts (people) associated with a specific company
get_contactreadRetrieve a contact by ID from Twenty CRM
get_entity_activitiesreadGet all activities related to a specific entity (person, company, or opportunity)
get_field_metadatareadGet detailed information about fields, either for a specific object or across all objects
get_object_schemareadGet detailed schema information for a specific object including all fields and their types
get_opportunityreadRetrieve an opportunity by ID from Twenty CRM
get_person_opportunitiesreadGet all opportunities where a specific person is the point of contact
get_relationship_summaryreadGet a summary of all relationships for a specific entity (company or person)
get_tasksreadRetrieve tasks from Twenty CRM
link_opportunity_to_companyreadLink an opportunity to a company and/or point of contact
list_all_objectsreadList all objects (entities) available in Twenty CRM with their metadata
list_opportunities_by_stagereadList all opportunities grouped by their sales stage (pipeline view)
search_companiesreadSearch for companies in Twenty CRM
search_contactsreadSearch for contacts in Twenty CRM
search_opportunitiesreadSearch for opportunities in Twenty CRM with various filters
transfer_contact_to_companywriteTransfer a contact (person) from one company to another
update_companywriteUpdate an existing company in Twenty CRM
update_contactwriteUpdate an existing contact in Twenty CRM
update_opportunitywriteUpdate an existing opportunity in Twenty CRM
04

Trust audit

SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
none-observed
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (13)

MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/http-server.ts:249
console.log(`Example: http://localhost:${port}/mcp?apiKey=YOUR_API_KEY&baseUrl=https://api.twenty.com`);
LOWInventory / provenance · inv.hidden_file · CWE-1104
.env.auth-test
.env.auth-test
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
examples/oauth-client.js:76
console.log(`   Token Endpoint: ${metadata.token_endpoint}`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
examples/oauth-client.js:102
console.log('i️  For this demo, we\\'ll simulate the callback with a mock token');
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
examples/oauth-client.js:116
console.log(`   Access Token: ${this.accessToken.substring(0, 20)}...`);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/index.ts:34
const packagePath = join(__dirname, '../../package.json');
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@clerk/clerk-sdk-node, @clerk/types, @modelcontextprotocol/sdk, @types/inquirer, chalk, commander, graphql, graphql-request
Why it matters. 16 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
OAUTH.md:169
POST https://your-app.clerk.accounts.dev/oauth/token
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
MCP_SETUP.md:106
# Load environment variables and run test
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:406
- **Windows**: The npm scripts automatically read .env files
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:420
# Windows - npm scripts read .env automatically
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:899
# Option 1: Load from .env file
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
TESTING.md:23
# Load environment variables first
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 8d310d85a21cfull audit observations/trust-audit/mcp-server/jezweb__twenty-crm-2.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-088d310d85a21cSAFEB89first audit
06

Questions

What tools does Twenty CRM expose?

29 in total: 19 read-only, 10 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Twenty CRM safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does Twenty CRM need?

It reads API_KEY_ENCRYPTION_SECRET, AUTH_ENABLED, AUTH_PROVIDER, CLERK_PUBLISHABLE_KEY, CLERK_SECRET_KEY, REQUIRE_AUTH, SMITHERY_CONFIG_APIKEY and TWENTY_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Twenty CRM run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as twenty-mcp-server at 1.3.0.

How current is this page?

The grade is for one exact copy of the source (8d310d85a21c), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement