Twenty Admin
Operate Twenty CRM, the Right.Link sales system of record, through the approved MCP. Keep every run predictable: connect, learn exact tool schemas, inspect current state, dry-run any intended write, ask for approval, execute only the approved change, then read back.
Twenty is shared with live sales work. Default to additive, non-destructive changes. Never send outreach, spend enrichment credits, delete records, or modify owner-specific structures unless the operator explicitly approves that exact action.
Branches
Use this skill for:
- Twenty reads: look up people, companies, campaigns, opportunities, notes, tasks, or metadata.
- Twenty writes: create, update, or match-or-create CRM records after an approved dry-run.
- Schema audits: inspect object/field metadata and identify safe additive extensions.
- Execution-skill drafting: draft or revise Paperclip company skills that teach engine agents how to use Twenty safely, such as RL-438.
Route elsewhere when:
- The request mutates Paperclip issues, agents, company skills, assignments, or approvals: use
paperclip-admin.
- The request creates or installs a Paperclip company skill in the library: use
paperclip-admin after this skill drafts the content.
- The request plans or triages outbound work: use
outbound-plan-work, outbound-triage, or the shared growth skills.
- The request sends outreach, launches sequences, enriches/spends credits, or changes external channel tools: use the dedicated channel skill or tool flow.
Operating Loop
- Confirm connectivity with
mcp__metamcp__twenty__list_object_metadata_names.
Done when the object list returns or the failure is reported with the current MCP config state.
- Load exact operation schemas from the catalog.
Done when every operation you intend to call has been learned with
learn_tools.
- Inspect current state before changing anything.
Done when the target records, identity keys, relevant metadata, and guarded fields are known or explicitly unavailable.
- For read-only work, answer with records, record ids, uncertainty, and source operation names.
Done when the user can tell what was read and what remains unknown.
- For mutating work, produce a dry-run.
Done when each target record is classified as
would-create, would-update, collision-skip, or blocked, with field-level diffs.
- Ask for approval before any create, update, upsert, metadata change, action, delete, Paperclip mutation, or external-account effect.
Done only when the operator approves the exact action.
- Execute only the approved operation.
Done when no extra records, fields, tools, or side effects are included.
- Read back and verify.
Done when every changed record is fetched again and the expected fields, ids, and guarded non-changes are confirmed.
Twenty MCP
Twenty is exposed through the metamcp aggregator under the twenty namespace. Tools are named mcp__metamcp__twenty__*.
The MCP server is metamcp in .mcp.json, using native SSE:
"metamcp": {
"type": "sse",
"url": "https://metamcp.dev.right.link/metamcp/sales/sse",
"headers": { "Authorization": "Bearer <token>" }
}
If Twenty tools are missing:
- Run
claude mcp list and confirm metamcp is connected.
- If it failed, verify the entry is native SSE with a Bearer header.
- Do not configure it through
mcp-proxy; that package is a stdio-to-SSE server wrapper and treats the URL as a command.
- After config changes, restart Claude Code or start a new session before expecting tools to appear.
Tool Pattern
Use the meta-tool layer. Do not guess concrete operation schemas.
mcp__metamcp__twenty__list_object_metadata_names for connectivity and object names.
mcp__metamcp__twenty__get_tool_catalog to browse available operations by category.
mcp__metamcp__twenty__learn_tools to fetch exact input schemas for every intended operation in one call.
mcp__metamcp__twenty__execute_tool to run an operation by exact learned name and schema.
Load Twenty built-in playbooks through list_skills / load_skills when the catalog shows a matching playbook, especially data-manipulation or metadata-building.
Core Model
Workspace objects include the standard Twenty set (people, companies, opportunities, notes, tasks, …) plus the outbound-engine golden-record objects built on top of it: campaign (reused as the engine campaign), campaignMembership (the suppression authority joining person ↔ campaign), campaignTouch (per-event touch history), sendingAccount, and engineConfig.
Person identity precedence:
linkedinLink.primaryLinkUrl
emails.primaryEmail
Two Person records are the same person if either key matches. Person also has companyId, plus the engine fields activeCampaignMembershipId (the one-active-campaign-per-person pointer) and a campaignMemberships collection.
The engine golden-record schema (identity keys, resolution, dedup/merge, suppression, routing) is documented in the twenty-engine-sync execution skill. This operator skill owns schema/metadata work and audits; it defers record-level engine read/write to that skill.
Before non-trivial writes, run a fresh get_object_metadata / get_field_metadata audit. Treat fields or relations with unclear ownership, existing workflow semantics, or populated values as guarded until the operator confirms they are safe to modify.
When adding custom objects/fields: type is a reserved field name (use a qualified name like touchType); new custom fields/objects are filed under the existing custom application id — there is no operator-settable application namespace on the metadata create path; and create_many_field_metadata validates atomically, so one invalid field rejects the whole batch.
Query Rules
select is required on find_*; use "*" or an explicit field list.
- MANY_TO_ONE relations are read through the foreign key column, for example
companyId.
- Filter fields are top-level keys with operator objects, for example
{ "emails": { "primaryEmail": { "eq": "a@b.com" } } }.
- Do not wrap filters in a
filter object.
- Do not put bare
eq, ilike, or similar operators at the top level.
- Use
and, or, and not arrays for compound filters.
orderBy uses scalar or composite objects, not dot notation.
Idempotent Match-Or-Create
For each input record:
- Query by all available identity keys with
find_many_<object> and explicit select.
- If zero matches, classify as
would-create.
- If one match, classify as
would-update by id, additive only.
- If more than one match, classify as
collision-skip and do not write.
Use upsert_many_<object> only after confirming the match field has a backing unique constraint. Standard email and LinkedIn fields are not unique by default.
Mutations
Read freely. Ask before any create, update, upsert, delete, schema change, action, Paperclip mutation, outreach, enrichment, or credit-spending operation.
Especially explicit approval is required for:
- any
delete_*
- overwriting a populated field
- shrinking or removing values from a multi-value field
- writes onto or near guarded objects or fields
- any METADATA/schema change
- any ACTION that contacts a person, drafts email, sends email, navigates an external app, or spends credits
- creating, updating, installing, or attaching a Paperclip company skill
When identity is ambiguous, stop. Report the collision and ask the operator how to resolve it.
Execution-Skill Drafting
The outbound golden-record execution skill twenty-engine-sync is already drafted and installed in the company skill library — it covers query, identity resolution, idempotent match-or-create, additive writes, golden-record merge/survivorship, fuzzy->QA routing, suppression, and routing. Revise it rather than re-drafting; create a new execution skill only for a genuinely separate capability.
When drafting or revising a Paperclip company skill for Twenty execution work:
- Read the related Paperclip issue and blockers through
paperclip-admin rules.
- Draft only the company-skill content locally unless the operator approves a Paperclip mutation.
- Keep the execution skill narrower than this operator skill: it should teach engine agents the CRM operations they need, not Paperclip administration.
- Include dry-run, idempotency, identity precedence, guarded-field handling, approval boundaries, readback verification, and no-outreach/no-credit-spend constraints.
- If the draft depends on unresolved schema details, mark those as blocked assumptions instead of inventing fields.
Do not install, attach, or update the Paperclip company skill library from this branch. That is a Paperclip mutation and must route through paperclip-admin with explicit approval.
Output
Report the operational facts:
- objects and identity keys processed
- tool operations used
- counts read
- per-record result:
matched-updated(id), created(id), collision-skipped, or blocked
- dry-run versus live write
- field diffs and guarded fields left unchanged
- unique constraint relied on, if any upsert was used
- errors, missing fields, unresolved blockers, and follow-up decisions
1---2name: twenty-admin3description: Twenty CRM operator skill for Right.Link. Use when the user wants to inspect or mutate Twenty CRM records, run identity-based match-or-create, audit Twenty schema/metadata, draft a Twenty execution company skill, or map Paperclip outbound-engine issues to safe CRM operations. Reads freely; dry-runs before writes; asks before every Twenty or Paperclip mutation.4---56# Twenty Admin78Operate Twenty CRM, the Right.Link sales system of record, through the approved MCP. Keep every run predictable: connect, learn exact tool schemas, inspect current state, dry-run any intended write, ask for approval, execute only the approved change, then read back.910Twenty is shared with live sales work. Default to additive, non-destructive changes. Never send outreach, spend enrichment credits, delete records, or modify owner-specific structures unless the operator explicitly approves that exact action.1112## Branches1314Use this skill for:1516- Twenty reads: look up people, companies, campaigns, opportunities, notes, tasks, or metadata.17- Twenty writes: create, update, or match-or-create CRM records after an approved dry-run.18- Schema audits: inspect object/field metadata and identify safe additive extensions.19- Execution-skill drafting: draft or revise Paperclip company skills that teach engine agents how to use Twenty safely, such as RL-438.2021Route elsewhere when:2223- The request mutates Paperclip issues, agents, company skills, assignments, or approvals: use `paperclip-admin`.24- The request creates or installs a Paperclip company skill in the library: use `paperclip-admin` after this skill drafts the content.25- The request plans or triages outbound work: use `outbound-plan-work`, `outbound-triage`, or the shared growth skills.26- The request sends outreach, launches sequences, enriches/spends credits, or changes external channel tools: use the dedicated channel skill or tool flow.2728## Operating Loop29301. Confirm connectivity with `mcp__metamcp__twenty__list_object_metadata_names`.31 Done when the object list returns or the failure is reported with the current MCP config state.322. Load exact operation schemas from the catalog.33 Done when every operation you intend to call has been learned with `learn_tools`.343. Inspect current state before changing anything.35 Done when the target records, identity keys, relevant metadata, and guarded fields are known or explicitly unavailable.364. For read-only work, answer with records, record ids, uncertainty, and source operation names.37 Done when the user can tell what was read and what remains unknown.385. For mutating work, produce a dry-run.39 Done when each target record is classified as `would-create`, `would-update`, `collision-skip`, or `blocked`, with field-level diffs.406. Ask for approval before any create, update, upsert, metadata change, action, delete, Paperclip mutation, or external-account effect.41 Done only when the operator approves the exact action.427. Execute only the approved operation.43 Done when no extra records, fields, tools, or side effects are included.448. Read back and verify.45 Done when every changed record is fetched again and the expected fields, ids, and guarded non-changes are confirmed.4647## Twenty MCP4849Twenty is exposed through the `metamcp` aggregator under the `twenty` namespace. Tools are named `mcp__metamcp__twenty__*`.5051The MCP server is `metamcp` in `.mcp.json`, using native SSE:5253```json54"metamcp": {55 "type": "sse",56 "url": "https://metamcp.dev.right.link/metamcp/sales/sse",57 "headers": { "Authorization": "Bearer <token>" }58}59```6061If Twenty tools are missing:62631. Run `claude mcp list` and confirm `metamcp` is connected.642. If it failed, verify the entry is native SSE with a Bearer header.653. Do not configure it through `mcp-proxy`; that package is a stdio-to-SSE server wrapper and treats the URL as a command.664. After config changes, restart Claude Code or start a new session before expecting tools to appear.6768## Tool Pattern6970Use the meta-tool layer. Do not guess concrete operation schemas.71721. `mcp__metamcp__twenty__list_object_metadata_names` for connectivity and object names.732. `mcp__metamcp__twenty__get_tool_catalog` to browse available operations by category.743. `mcp__metamcp__twenty__learn_tools` to fetch exact input schemas for every intended operation in one call.754. `mcp__metamcp__twenty__execute_tool` to run an operation by exact learned name and schema.7677Load Twenty built-in playbooks through `list_skills` / `load_skills` when the catalog shows a matching playbook, especially `data-manipulation` or `metadata-building`.7879## Core Model8081Workspace objects include the standard Twenty set (`people`, `companies`, `opportunities`, `notes`, `tasks`, …) plus the outbound-engine golden-record objects built on top of it: `campaign` (reused as the engine campaign), `campaignMembership` (the suppression authority joining person ↔ campaign), `campaignTouch` (per-event touch history), `sendingAccount`, and `engineConfig`.8283Person identity precedence:84851. `linkedinLink.primaryLinkUrl`862. `emails.primaryEmail`8788Two Person records are the same person if either key matches. Person also has `companyId`, plus the engine fields `activeCampaignMembershipId` (the one-active-campaign-per-person pointer) and a `campaignMemberships` collection.8990The engine golden-record schema (identity keys, resolution, dedup/merge, suppression, routing) is documented in the `twenty-engine-sync` execution skill. This operator skill owns schema/metadata work and audits; it defers record-level engine read/write to that skill.9192Before non-trivial writes, run a fresh `get_object_metadata` / `get_field_metadata` audit. Treat fields or relations with unclear ownership, existing workflow semantics, or populated values as guarded until the operator confirms they are safe to modify.9394When adding custom objects/fields: `type` is a reserved field name (use a qualified name like `touchType`); new custom fields/objects are filed under the existing custom application id — there is no operator-settable application namespace on the metadata create path; and `create_many_field_metadata` validates atomically, so one invalid field rejects the whole batch.9596## Query Rules9798- `select` is required on `find_*`; use `"*"` or an explicit field list.99- MANY_TO_ONE relations are read through the foreign key column, for example `companyId`.100- Filter fields are top-level keys with operator objects, for example `{ "emails": { "primaryEmail": { "eq": "a@b.com" } } }`.101- Do not wrap filters in a `filter` object.102- Do not put bare `eq`, `ilike`, or similar operators at the top level.103- Use `and`, `or`, and `not` arrays for compound filters.104- `orderBy` uses scalar or composite objects, not dot notation.105106## Idempotent Match-Or-Create107108For each input record:1091101. Query by all available identity keys with `find_many_<object>` and explicit `select`.1112. If zero matches, classify as `would-create`.1123. If one match, classify as `would-update` by id, additive only.1134. If more than one match, classify as `collision-skip` and do not write.114115Use `upsert_many_<object>` only after confirming the match field has a backing unique constraint. Standard email and LinkedIn fields are not unique by default.116117## Mutations118119Read freely. Ask before any create, update, upsert, delete, schema change, action, Paperclip mutation, outreach, enrichment, or credit-spending operation.120121Especially explicit approval is required for:122123- any `delete_*`124- overwriting a populated field125- shrinking or removing values from a multi-value field126- writes onto or near guarded objects or fields127- any METADATA/schema change128- any ACTION that contacts a person, drafts email, sends email, navigates an external app, or spends credits129- creating, updating, installing, or attaching a Paperclip company skill130131When identity is ambiguous, stop. Report the collision and ask the operator how to resolve it.132133## Execution-Skill Drafting134135The outbound golden-record execution skill `twenty-engine-sync` is already drafted and installed in the company skill library — it covers query, identity resolution, idempotent match-or-create, additive writes, golden-record merge/survivorship, fuzzy->QA routing, suppression, and routing. Revise it rather than re-drafting; create a new execution skill only for a genuinely separate capability.136137When drafting or revising a Paperclip company skill for Twenty execution work:1381391. Read the related Paperclip issue and blockers through `paperclip-admin` rules.1402. Draft only the company-skill content locally unless the operator approves a Paperclip mutation.1413. Keep the execution skill narrower than this operator skill: it should teach engine agents the CRM operations they need, not Paperclip administration.1424. Include dry-run, idempotency, identity precedence, guarded-field handling, approval boundaries, readback verification, and no-outreach/no-credit-spend constraints.1435. If the draft depends on unresolved schema details, mark those as blocked assumptions instead of inventing fields.144145Do not install, attach, or update the Paperclip company skill library from this branch. That is a Paperclip mutation and must route through `paperclip-admin` with explicit approval.146147## Output148149Report the operational facts:150151- objects and identity keys processed152- tool operations used153- counts read154- per-record result: `matched-updated(id)`, `created(id)`, `collision-skipped`, or `blocked`155- dry-run versus live write156- field diffs and guarded fields left unchanged157- unique constraint relied on, if any upsert was used158- errors, missing fields, unresolved blockers, and follow-up decisions