packages/twenty-codex-plugin/references/use-twenty-mcp/result-formatting.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.
Resolve the intended workspace before selecting a Twenty MCP server:
setup.md instead of falling back to a different workspace.Use the selected connected Twenty MCP server when it is available:
learn_tools -> execute_tool
setup.md; do not invent workspace data.Record links need a workspace origin, such as https://example.twenty.com or http://workspace.localhost:3001.
/mcp./mcp.Start with the answer or count, then show the records in the clearest compact shape:
Workspace column if it improves scanning. Use separate sections only when each workspace needs different columns.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.{workspaceOrigin}/object/{objectNameSingular}/{recordId}.http://workspace.localhost:3001/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.recordReferences and workspace origin are both available, the first record-name column or record heading MUST link the display name. Do not output unlinked record names in that case.Record column with the object name and record ID, or say that direct links need the workspace URL.Add a small visual identifier next to records when it improves scanning and the source data provides one.
react-markdown and remark-gfm, without raw HTML rendering. Do not rely on HTML such as ``..height: auto and only caps max-width. Do not place full-size photos or large avatars in tables unless the image URL is already a small thumbnail.avatarUrl, logo, or image field when present and non-empty.emails.primaryEmail, website, domainName, or equivalent fields only for display or favicon lookup; never expose private internal domains as external image requests.Domain, Company, or Source column instead of an image.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:
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:
Created: May 5, 2026, 11:43 AM (raw: 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:
Not set, or omit if the field is irrelevant.Yes / No.EUR 12,450 or USD 12,450 based on the record currency.%, round only enough to stay meaningful.When the user asks for "latest", "recent", or "last records":
sorted by Last updated.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 (:---:).Icon, Logo, or Avatar column followed by a linked record-name column. [Name](record-url) in one cell. Do not also add emoji or extra symbols before the name.Created, Updated, Amount, and Source to the right of variable-width fields such as Name, Company, Person, and Domain.May 5, 2026, 11:43 AM or May 5, 11:43.Use a compact table for comparable records:
I found 5 recent opportunities, sorted by last updated date.
| Logo | 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 |
For recent companies with recordReferences, link the company name:
I found 5 recent companies, sorted by Created.
| Company | Domain | Created |
| :--- | :--- | :--- |
| [Acme](https://workspace.example/object/company/00000000-0000-0000-0000-000000000001) | [acme.example](https://acme.example) | May 5, 2026, 11:43 AM |
Use a labelled 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.