microsoft/sharepoint-list-formatter
Use this skill any time SharePoint list is being fetched, searched, or shown to the user — whether it comes from a SharePoint/Microsoft 365 connector, a search result, a pasted export, or a fetched SharePoint URL. Apply it instead of dumping raw JSON or an ad hoc table whenever the user asks to "pull," "check," "look up," "find," or "show" anything from a SharePoint list, even if they never say the word "format.".
npx skills add https://github.com/microsoft/cat-agent-skills --skill sharepoint-list-formatter
Reformat every SharePoint result the same way so the person always gets a predictable, scannable table instead of a one-off dump, with a one-click path to open each item.
Every table, no matter the list type, keeps these:
If the list genuinely has no person field, or no description field, just drop that column rather than leaving it empty — "always present" means "always present when the underlying field exists," not padding in blank columns.
Column order left to right: Title, Description, person field(s), any dynamic columns (see below), Modified, Open.
Beyond the core columns, decide what to include using two signals together, don't default to a fixed template:
Don't add a column just because the API happened to return that field — extra columns the query didn't ask for and the list type doesn't demand just add noise. Aim for lean, relevant tables: usually 4-6 columns total including the core ones.
Don't silently re-sort rows by date, name, or anything else. When results come from a search or query, keep the relevance order the search already returned — that ordering reflects how well each item matched what was asked, and re-sorting throws that signal away. Only change the order if the user explicitly asks for one ("sort by due date", "show me overdue items first", "group by owner").
Jul 17, 2026 — never raw ISO strings like 2026-07-17T00:00:00Z—, applied consistently — never a blank cell, never "N/A" in one row and "-" in another., ?, or ! followed by a space or end of string. If that first sentence itself runs long (roughly 25+ words), truncate it with … rather than let one row blow out the table. Never include the full description text.If a query spans more than one SharePoint list, don't merge them into a single table with mismatched columns — each list type will have earned a different dynamic column set anyway. Give each source its own small heading and its own table:
### Project Tracker
| Title | Assigned To | Description | Status | Modified | Open |
|---|---|---|---|---|---|
| API rate limiting | Marcus Webb | Add throttling to the public endpoints… | **Blocked** | Jul 15, 2026 | [Open ↗](https://contoso.sharepoint.com/sites/Engineering/lists/Project%20Tracker/DispForm.aspx?ID=42) |
### Team Documents
| Title | Author | Modified | Open |
|---|---|---|---|
| Q3 Campaign Brief.docx | Sarah Nguyen | Jul 14, 2026 | [Open ↗](https://contoso.sharepoint.com/sites/Marketing/lists/Team%20Documents/DispForm.aspx?ID=118) |
Don't link to whatever URL field the API happens to return (webUrl, _links.self, etc.). Every "Open" link is built from this fixed path, populated with real values pulled from the source data:
/sites/[site name]/lists/[list name]/DispForm.aspx?ID=[itemID]
ID/id field)Prefix the tenant's SharePoint domain if it's known (e.g. https://contoso.sharepoint.com + the path above) so the link is fully clickable;
Format the url as Markdown:
Open ↗
Take microsoft/sharepoint-list-formatter from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.