packages/twenty-claude-skills/skills/twenty-record-presentation/SKILL.md
Retrieve the Twenty records needed to answer the user's question, then present them as a useful answer, not as raw API output. Always translate technical fields, timestamps, IDs, and nested structures into readable summaries that help the user scan, compare, and act.
Use the selected connected Twenty MCP server when it is available
get_tool_catalog → learn_tools → execute_toolStart with the answer or count, then show the records in the clearest compact shape:
Use English labels and prose. Keep user-provided names, record values, emails, URLs, and proper nouns unchanged.
Link records back to their original Twenty context whenever the workspace origin and record identity are known.
/object/:objectNameSingular/:objectRecordId.https://example.twenty.com/object/person/record-id.recordReferences from MCP responses when available to get objectNameSingular, recordId, and displayName.recordReferences is missing, use the record's id and the object name from the tool that returned it.Never expose ISO/RFC3339 timestamps as the main date display.
2026-05-05T09:43:18.123Z, 2026-05-05T09:43:18+02:00, Unix seconds, and Unix milliseconds.Z or an explicit offset to the user's timezone when known. If timezone is unknown, keep the source timezone or ask only when it changes the meaning.Examples, with user timezone Europe/Paris, UTC+2 in May:
2026-05-05T09:43:18.123Z → May 5, 2026, 11:43 AM2026-05-05 → May 5, 2026If the exact raw timestamp is relevant, put it after the readable value:
2026-05-05T09:43:18.123Z)Convert raw field names into user-facing labels:
createdAt → CreatedupdatedAt → Last updateddeletedAt → DeletedcreatedBy → Created byworkspaceMemberId → Workspace memberopportunityStage → Opportunity stagePrefer the label users see in Twenty when it is available from metadata. Otherwise, split camelCase, snake_case, and kebab-case into normal words.
Format values by meaning:
%, round only enough to stay meaningful.When the user asks for "latest", "recent", or "last records":
updatedAt for "recent activity" and createdAt for "newest records" unless the user's wording or object semantics points to another date.Make tables easy to scan before making them visually decorative.
:---), numeric money/count columns right-aligned (---:), and short status columns centered only when that actually improves scanning (:---:). [Name](record-url) in one cell. Do not also add emoji or extra symbols before the name.Use a compact table for comparable records:
I found 5 recent opportunities, sorted by last updated date.
| Name | Stage | Amount | Last updated |
| :--- | :--- | ---: | :--- |
| [Acme renewal](https://example.twenty.com/object/opportunity/record-id-1) | Negotiation | EUR 12,450 | May 5, 2026, 11:43 AM |
| [Globex expansion](https://example.twenty.com/object/opportunity/record-id-2) | Discovery | EUR 8,000 | May 4, 2026, 4:10 PM |
Use a labeled block for one important record:
**[Acme renewal](https://example.twenty.com/object/opportunity/record-id-1)**
- Stage: Negotiation
- Amount: EUR 12,450
- Next action: Not set
- Last updated: May 5, 2026, 11:43 AM
Show raw JSON, raw timestamps, internal IDs, or full nested objects only when the user asks for debugging, export, exact API payloads, schema inspection, or reproducible commands. Even then, put a readable summary before the raw block.
Example:
Acme renewal — Negotiation stage, EUR 12,450, last updated May 5, 2026, 11:43 AM. Full payload below:
json{ "id": "record-id-1", "name": "Acme renewal", "stage": "NEGOTIATION", "amountMicros": "12450000000", "currencyCode": "EUR", "updatedAt": "2026-05-05T09:43:18.123Z" }