Chief of Staff
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GITHUB_TOKEN | No | GitHub personal access token with repo and read:user scopes. | |
| LINEAR_API_KEY | No | Linear personal API key. | |
| NOTION_API_KEY | No | Notion integration secret (ntn_…). | |
| STRIPE_API_KEY | No | Stripe secret or restricted API key. | |
| GRANOLA_API_KEY | No | Granola API key. | |
| SLACK_BOT_TOKEN | No | Slack bot token (xoxb-…). | |
| GOOGLE_CLIENT_ID | No | Google OAuth client ID for browser sign-in to Google APIs. Can be set in the client config or stored via `chief-of-staff-mcp login`. | |
| GOOGLE_CLIENT_SECRET | No | Google OAuth client secret used with GOOGLE_CLIENT_ID for browser sign-in to Google APIs. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| gcalendar_events_listC | List events matching a given search filter. |
| gmail_threads_listC | List Gmail threads. |
| linear_issues_listA | List issues, optionally filtered. Conditions on one filter object combine with AND. To find a team's open work, filter on team.key and state.type. |
| slack_chat_post_messageA | Send a message to a Slack channel, private group, or DM. Provide |
| gcalendar_events_getC | Get one event by its ID. |
| granola_notes_listA | List meeting notes, filtered by when they were created or last updated and optionally narrowed to one folder and its subfolders. Returns each note's id, title, owner and timestamps, not its content. Fetch that with notes_get. Only notes that already have a generated AI summary appear here. |
| granola_notes_getA | Read one meeting note: its AI summary, the people who attended, the calendar event it was taken against, and the folders it belongs to. Pass include='transcript' to get the transcript inline as well. A transcript too large to inline answers 413 TRANSCRIPT_TOO_LARGE. Read it with notes_transcript_get instead. |
| gdocs_documents_createA | Create a blank document with a title. Only the title is honoured — the document is created empty. To add content, call this and then documents_batch_update with the returned documentId. |
| linear_users_listA | List workspace members. Use this to resolve a person's name or email to the UUID that assignment expects. |
| linear_issue_createA | Create an issue. |
| linear_project_updates_listA | Read the status updates posted on projects — the periodic 'on track, here is what moved' notes. Filter by project for one project's history. |
| github_releases_listA | List a repository's releases, newest first. Tags that were never made into releases do not appear here — |
| stripe_subscriptions_listB | List subscriptions. Filter by customer or status. |
| gmail_threads_modifyB | Modify the labels on a thread, and so on every message in it. |
| gcalendar_events_quick_addA | Create an event from a plain-text description such as 'Appointment at Somewhere on June 3rd 10am-10:25am'. Google parses the time and title; use events_insert when the fields are already known. |
| gmail_threads_getC | Read a Gmail thread. |
| gcalendar_events_insertC | Create a calendar event; returns details of the event. |
| gmail_drafts_createC | Save an email draft to Gmail. |
| slack_conversations_historyB | Fetch recent messages from a Slack channel. |
| notion_data_sources_queryB | Get the rows of a data source, optionally filtered and sorted. The filter grammar is one condition per column type, composed with |
| notion_pages_createA | Create a page — as a subpage of another page, or as a row of a database by giving its |
| gforms_forms_createA | Create a new form from a title. Only the title and the document title are honoured: the form is created with no description, no items and default settings. To add questions, call this and then forms_batch_update with the returned formId. Pass unpublished=true to create a form that does not yet accept responses. |
| gforms_forms_responses_listA | List a form's submitted responses, newest page first, up to 5000 per page. The only supported filter is on submission time: pass filter='timestamp >= 2026-01-01T00:00:00Z' to read what has arrived since a point in time. Answers come back keyed by questionId. |
| linear_initiatives_listB | List initiatives — the grouping above a project, and what Linear replaced roadmaps with. |
| linear_initiative_getA | Get one initiative with its projects and links. |
| gsheets_spreadsheets_values_updateC | Sets values in a range of a spreadsheet. |
| linear_initiative_update_createC | Post a status update on an initiative. |
| gdrive_files_listA | List the user's files. Returns all files by default, including trashed files; add |
| gdrive_files_copyA | Create a copy of a file and apply any requested updates with patch semantics. Typically send a new |
| gsheets_spreadsheets_createA | Create a new spreadsheet. Set its title, locale and time zone, and the sheets it starts with; write cell values afterwards with |
| gdrive_permissions_createA | Create a permission for a file or shared drive. |
| gdrive_comments_listC | List a file's comments. The |
| slack_users_listA | List members of the workspace. Use this to resolve a person's name to the user ID that Slack mentions and filters expect. |
| gdocs_documents_getA | Read a document's full structural content. The document ID is the long string in its URL, between '/d/' and '/edit'. Pass include_tabs_content=true for a document with several tabs, since the default response covers only the first. |
| gdrive_permissions_listB | List a file's or shared drive's permissions. |
| gdrive_permissions_deleteA | Delete a permission. Concurrent permission writes on the same file are not supported. |
| linear_team_membership_deleteC | Remove a member from a team. |
| gsheets_spreadsheets_values_getC | Returns a range of values from a spreadsheet. |
| gmail_messages_listC | List messages in the user's mailbox. |
| gmail_messages_getB | Read one message, by the id messages_list returns. |
| gsheets_spreadsheets_values_appendC | Appends values to a spreadsheet. |
| gdrive_files_exportA | Export a Google Workspace document to the requested MIME type and return the exported content. Limited to 10 MB. Common MIME types: text/plain, text/html, text/csv, application/pdf. |
| notion_pages_update_markdownA | Replace a page's content with Markdown, which Notion parses into blocks. This replaces the whole body, so read it first if you mean to edit rather than overwrite. |
| notion_pages_updateA | Update a page's property values, icon, cover, or trash state. Properties not named are left alone, and a value set to null is cleared. This cannot move a page — use |
| linear_search_issuesA | Search issues by text, across titles and descriptions. Set |
| connectA | Connect one app this server uses. For an app that issues keys, says where to get one and the terminal command that stores it. For Google, once the user's own OAuth client is set, starts the browser sign-in and returns at once: the user approves in the browser and the next call works. To see which apps are connected, call |
| connection_statusA | See which apps this server is connected to, and how to connect each one that is not. Changes nothing. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| setup | Connect every app this server uses, the quickest way each one allows. |
| morning_brief | Today's meetings, emails that need you and issues due, in one message at 8am. |
| meeting_prep_pack | Last time you met them, what they emailed since and what you promised. |
| action_items_to_owners | Everything someone said they'd do is an assigned issue before the next meeting. |
| internal_weekly_update | Shipped, revenue, risks: drafted from the systems, edited by a human. |
| inbox_triage_into_tasks_and_time_blocks | Emails that are really tasks become issues with time held to do them. |
| email_to_calendar | 'Does Thursday 3pm work?' becomes an invite and a confirmation. |
| meetings_to_doc | A week of meetings summarised into a doc for the people who weren't there. |
| decision_log | Decisions made in channels get recorded with who, when and why. |
| offsite_planning | Dates, dietary needs and the agenda gathered and published. |
| okr_tracker | Initiative progress rolled up to the sheet and posted as an update. |
| fundraising_data_room | Folder assembled, revenue exported and access granted per investor. |
| unresolved_doc_comments_to_nudges | Comments that have waited three days get their owner pinged. |
| contract_renewal_calendar | Every contract's notice date is on a calendar 60 days ahead. |
| offboarding_access_sweep | Files shared with someone who left get revoked, with a report. |
| sheet_to_calendar | A schedule kept in a sheet becomes real events, with IDs written back. |
| inbox_to_sheet | Orders, signups or applications that arrive by email become rows. |
| drive_folder_to_notion | A migration that usually takes a week of copy-paste. |
| granola_to_notion_meeting_database | Every meeting note in the team's Notion with attendees and decisions as properties. |
| notion_tasks_and_linear | Non-engineers file in Notion and see the Linear status reflected back. |
| spreadsheet_backlog_to_linear | The backlog someone kept in a sheet moves to Linear, IDs written back. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 47 tools
Tools follow a resource+action pattern and most have clearly distinct purposes, with descriptions explicitly steering between similar pairs (e.g. events_insert vs events_quick_add, issues_list vs search_issues). A few near-neighbors exist (initiatives_list vs initiative_get, the various list tools across apps), but overlap is minimal and well-documented.
The dominant convention is a predictable app_resource_action pattern (gdrive_files_list, linear_issues_list, slack_chat_post_message). Minor deviations exist — unprefixed meta tools (connect, connection_status), a four-segment notion_pages_update_markdown, and the awkward linear_initiative_update_create — but overall it stays consistent and readable.
47 tools is heavy, well past the comfortable 3-15 range, and the surface is flat with no grouping to guide selection. However, the server genuinely aggregates ~12 distinct apps, so the count is roughly proportional rather than arbitrary bloat — borderline but defensible for this scope.
Coverage is broad, but several workflows dead-end: Gmail has no send, Calendar lacks update/delete, GitHub and Stripe expose only a single list tool each. Some descriptions reference operations not present in the tool set (documents_batch_update, forms_batch_update, pages_move), signaling real holes.