MCP App Store
by KeenEthics
Business & Operations
Clearskies icon

Clearskies

by Scratchpad, Inc.

Overview

Clearskies is the context layer for revenue AI. One connection turns your CRM, calls, email, calendar, Slack, and support tickets into a single, always-current picture of every account, so ChatGPT works across complete records instead of rebuilding context and guessing what matters. Get deep analysis like win/loss and rep performance, and run workflows like pre-call prep, CRM hygiene, and deal risk. Context assembled once is context every team, tool, and agent can reuse, and it improves as your data grows.

Tools

account_get_contacts

ChatGPT
Everyone we know at an account: the external contacts on the customer side of a specific company — who works there, who we know there, who is linked to that account. Use after an account has been identified. To find a person when you do not know which account they belong to, use contacts_list instead.

account_get_deals

ChatGPT
The deals and opportunities on a specific account: what is open with them right now, what they have bought from us before, and their closed-won history. Use for questions about one company's pipeline, revenue, or deal status.

accounts_list

ChatGPT
Customer accounts, companies and organizations stored in Clearskies. Use it when the user names a company and asks whether we have anything on them, or asks about existing accounts and customers. Search matches both account names and domain names. If searching for 'goodwaygroup.com', it will match accounts with that domain. Try partial company names if full name doesn't match. For 'my accounts' or 'accounts I own', set ownedByMe: true to scope to the current user's owned accounts (resolved server-side; do not look up an owner id). If ownedByMe returns an error, relay that message to the user and do not retry the request without ownedByMe.

agent_capabilities_get

ChatGPT
What an agent can do here, and the rules it has to follow in this tenant: command/shortcut constraints, the available model catalog (with allowed verbosity and reasoning effort per model), and supported tools. Call this before creating or publishing an agent.

agent_draft_history_list

ChatGPT
Lists an agent's draft edit history, newest first: each entry has the version number, change kind, who edited it, when, and a delta of what changed from the previous version — but NOT the full content. To fetch a version's full content, call agents_get with that version number. Requires agentId; paginated with itemsPerPage and an opaque cursor.

agent_folders_create

ChatGPT
Make a new folder to organize agents in. Pass parentId to create it under another folder; omit parentId for a root folder.

agent_folders_delete

ChatGPT
Deletes an empty agent folder. Refuses folders that contain child folders or agents.

agent_folders_get

ChatGPT
Returns one agent folder by id: its name and parent. To see what is inside a named folder, pass its id as folderId to agents_list for the agents in it, or to agent_folders_list as parentId for its child folders.

agent_folders_list

ChatGPT
How agents are organized: lists the folders they are grouped into. Omit arguments to list all folders, set rootOnly:true for root folders, or pass parentId to list direct child folders.

agent_folders_update

ChatGPT
Renames an agent folder or moves it under another folder. Set clearParent:true to move it to root. Refuses self/descendant moves.

agent_validate

ChatGPT
Validates an agent against the publish rules without saving or changing anything. Returns valid:true if it would publish, or valid:false with per-field errors (name, template, command) so you can fix the draft with agents_update and re-check before calling agents_publish.

agents_create

ChatGPT
Build a new agent — one that writes a call recap, drafts a follow-up email, or answers in your own voice. Creates it as a draft (name, optional folderId/template/model/tools/command). Does not publish — publishing is a separate, explicit step. Returns the agent with status:'draft' and published:false.

agents_delete

ChatGPT
Deletes an agent (soft delete). Use this to clean up abandoned or never-published draft agents. Refuses to delete an agent that is still referenced by a workflow, returning the blocking workflow names so you can detach them first. Returns {id, deleted:true}.

agents_discard_draft

ChatGPT
Revert edits to an agent and go back to the live version: discards its pending draft variant, reverting to the published configuration. The agent must be published and have a draft. The draft is deleted.

agents_duplicate

ChatGPT
Copies an agent as a new draft (the name gets a ' (copy)' suffix). Does not publish. Returns the new agent with status:'draft' and published:false.

agents_get

ChatGPT
What is inside one agent, such as a follow-up email agent — the instructions, template, model and tools it runs with — in its published and/or draft variant. Also returns a draftHistory summary and accepts an optional version to return that historical version's full content in requestedVersion.

agents_list

ChatGPT
Lists the agents that exist here (id, name, status): which agents are published and live, and which are still drafts. Filter by status.

agents_move

ChatGPT
Moves an agent into a folder or to root without changing its draft or published configuration. Pass folderId, or clearFolder:true to remove it from its folder.

agents_publish

ChatGPT
Validates an agent's draft and, if valid, publishes it — promoting the draft to the live configuration. An agent must be published before a workflow's runAgent node can reference it. Fails with the validation rule that was violated (e.g. a template is required) without changing publish state; fix the draft and call again. Returns the agent with status:'published' and published:true.

agents_unpublish

ChatGPT
Take an agent down for now: unpublishes a published agent, removing it from the live surface and returning it to draft so it can be edited and republished. Reversible. Returns the agent with status:'draft' and published:false.

agents_update

ChatGPT
Partially updates an agent: pass only the fields to change (name, description, template, model, reasoningEffort, verbosity, webSearch, command). Edits the draft, creating one from the published variant when needed, so the live configuration is untouched until you publish. Does not publish. Returns the agent with its draft state.

calendar_get_upcoming

ChatGPT
Upcoming meetings on the calendar, scheduled within a time window — today, this afternoon, tomorrow, this week, or whatever is coming up next. Use it for the calendar and schedule ahead, the next meeting to prep for, and pre-call prep automation. Covers the whole tenant, and returns one entry per attendee who synced an invite, so a meeting several colleagues attend appears once for each of them and totalCount counts entries rather than distinct meetings. Each entry carries two ids: eventId is the Clearskies event record id — pass it to events_get_contents, and return it wherever a Clearskies event or meeting record id is required (e.g. a workflow Find Records selection); id is the calendar source row, which no other tool accepts. eventId is omitted when the event has no Clearskies record yet.

changed_records_list

ChatGPT
Which deals or accounts changed: the records whose stage, amount, close date, owner or any other tracked field changed in a time window, newest change first, each record once — including records that moved from one value to another, e.g. stage moved from Discovery to Negotiation. Returns record ids and an exact totalCount (omitted, with a warning, when counting takes too long); pass the ids to deals_list or accounts_list for the records, or to find_record_changes for what changed. Only account and deal have change history.

channels_list

ChatGPT
List Slack and Microsoft Teams channels synced into Clearskies, each with the account(s) it is linked to. Use this to answer a question about a chat channel referred to by name (e.g. "what's been discussed in the deal-room channel?" or "summarize the GenePoint Teams channel"): call channels_list with the channel name in search, take the matching channel's id, then pass it to events_list as an internal.channels filter to read only that channel's threads — an account can have several channels linked (e.g. an internal channel and a Slack Connect channel), so filtering by linkedAccounts[].id returns all of them mixed together. This is the only path from a Teams channel to its content — Teams threads are not returned by events_search or by the events_list query arg, so read them with events_get_contents instead of searching. Filter by source ('slack' or 'ms_teams') or set linkedOnly to only channels tied to an account. If several channels share a name (every Teams team has a 'General'), disambiguate by teamName or linked account.

contacts_list

ChatGPT
Find anyone outside our company: external people — customers, prospects, partners. Use this to find a person across all accounts when you don't know which account they belong to, or to check whether we have anyone with a given name or email address. Searches by name and email. Not internal employees or teammates — use employees_list for those. For 'my contacts', set ownedByMe: true to scope to the current user's owned contacts (resolved server-side; do not look up an owner id). If ownedByMe returns an error, relay that message to the user and do not retry the request without ownedByMe.

crm_records_list

ChatGPT
Records of a custom CRM object type synced from Salesforce or HubSpot: cases, notes, subscriptions, contracts, invoices, assets, products and any other custom object. Use it for the subscription, case or note records logged against an account — pass linkedAccountIds (Clearskies account ids from accounts_list). Use object_definitions_list for objectType values. For standard objects (account, contact, deal, employee) use accounts_list, contacts_list, deals_list or employees_list instead.

deal_get_people

ChatGPT
Retrieve the people involved in a specific deal — its stakeholders — each with every source's claim about their part in it. Use when the user asks who is on a deal, who the champion, decision maker or economic buyer is, who to contact about it, or which of our own team is working it; also use it to check whether a deal has an identified buying committee at all. Returns one row per person — external contacts and internal employees alike, see personType — with a nested links array holding one entry per source that connected them to the deal. Read links before asserting a role: a salesforce or hubspot link is a recorded CRM fact (confidence 1.0, and on Salesforce isPrimary marks the primary contact role), while an llm link is inferred from call, email and Slack content and its confidence (0-1) is the model's own score. The same person often carries several links and the sources can disagree; when they do, attribute each role to its source rather than merging them. Roles are free text from each source, not a fixed vocabulary. People are ranked CRM-confirmed first, then by confidence. An empty result means no source has linked anyone to this deal — it is not evidence that the deal has no stakeholders.

deals_list

ChatGPT
Deals and opportunities in the pipeline: find a named deal, a renewal or a specific opportunity, or filter down to the open deals closing this quarter. For 'the most recently updated', 'largest' or 'closing soonest' deals, set sortBy to a sortable fieldId from object_get_fields_schema (e.g. internal.updated_at, internal.amount, internal.close_date) with orderDir, and pass fieldIds for only the fields you need, rather than paging through everything. For 'my deals', 'my opps', or 'my pipeline', set ownedByMe: true to scope to the current user's owned deals (resolved server-side; do not look up an owner id). If ownedByMe returns an error, relay that message to the user and do not retry the request without ownedByMe.

employees_list

ChatGPT
Our own people: employees, teammates, coworkers, colleagues, staff and sales reps who work here. Use this for who is on our team or our sales team, for someone described as one of ours or internal, and to look up a teammate's name, email address or title. Not customers, prospects, or partners — use contacts_list for those.

events_get_contents

ChatGPT
Read the full contents of events you already have ids for: what people say on a call, the transcript of what was actually said in a meeting, and the full text and body of an email thread. This is the direct lookup for an event id — from a workflow trigger, events_list, events_search or scratchpad_resolve_link — so call it straight away rather than searching for the event first; events_list cannot filter by event id. Each event comes back with its type, start and end, linked entities, participants and content. For meetings, content.meeting.calls is a list — a meeting can have multiple linked recordings (retried recordings, reused calendar links, multiple recording providers); inspect each call and pick the one the user is asking about. A call carrying transcriptNote has no retrievable transcript: its text is not in this response and no other tool can fetch it, so read the note and stop searching for it.

events_list

ChatGPT
Meetings, calls, emails, Slack threads and every other past activity: what has happened with an account, the meetings held last week, the activity tied to a renewal or any other deal, the most recent calls we have recordings for. Set the optional query arg for semantic search over event contents — it is ANDed with all other filters, so you can combine semantic search with exact filtering in one call rather than choosing between this and events_search. query does not search Microsoft Teams threads: to find a topic in a Teams channel, list its threads with internal.channels and read them with events_get_contents. Filter on internal.deals with a deal id from deals_list for the activity linked to a deal, on internal.channels with a channel id from channels_list for the threads of one Slack or Teams channel (each returned thread carries its channel as a chat_channel entity), set hasCall true for recorded calls across all providers, and transcriptStatus 'completed' to require a usable transcript. This tool cannot filter by Clearskies event id: if you already have one, call events_get_contents with it instead of searching here.

find_record_changes

ChatGPT
What changed on a deal or an account, when it changed and who changed it. Answers when a close date moved or slipped, who pushed an opportunity to next quarter, who touched the amount or the stage, and what changed on a record in the last two weeks. Returns each change as {field, old→new value, when it was recorded, who and which system made it}. Each change also carries sourceRecordId, the id of the CRM record whose sync produced it, absent for changes made in Clearskies and for changes recorded before it was captured; one account or deal can hold several CRM records, so two changes with different sourceRecordIds came from different CRM records. A change also carries reason when it came from switching which CRM record the account or deal reflects, not from an edit in the CRM: primary_promoted when its previous primary record was removed and another took over, primary_overridden when an admin chose a different primary record. Such a change can move many fields at once. Select the records with the same inputs as deals_list/accounts_list (objectType + optional ids + optional filters from object_get_fields_schema). Only account and deal have change history; other object types are rejected. History is delta-only with no backfill, so a record has no changes before it was first tracked. There is no cursor, each response is capped at 128 KiB and each old or new value at 2000 characters, so target the records you need with ids or filters and narrow with fieldId and from/to rather than reading broadly.

frame_destinations_list

ChatGPT
The calling user's writable Frame drives, folders and Frames, for filling in a createFrame or editFrame workflow node. Pass a drive or folder id with selectable:true as createFrame.folderId (defaultFolderId is the caller's private drive), and a Frame id as editFrame.frameId; path is the display label. connection.status says whether the caller has connected Frame; anything other than connected returns an empty tree.

github_activities_list

ChatGPT
List GitHub activity (PRs authored/merged/closed, reviews, commits) synced from GitHub, stalest-first. Filter by assignee email (resolved to the person's linked GitHub logins) or an explicit githubLogin, kind, open-only, and updatedBefore (RFC3339) to find PRs that need attention (e.g. open with no recent activity). Returns PR state, draft status, labels, ticket codes, and the upstream last-updated time.

identity_get

ChatGPT
The signed-in user and the workspace this connection is logged in to: name, email, userId, personId, tenant name, optional photo URL. Answers who is logged in, whose account this is, and which workspace or tenant you are connected to right now. Use it to confirm scope before other tools. personId is the caller's identity for ownership filters; prefer the ownedByMe argument on list tools over filtering by this id manually.

object_definitions_list

ChatGPT
What kinds of records exist here: every standard and custom CRM object synced from Salesforce or HubSpot — account, contact, deal, case, note, subscription and whatever else this tenant has. Use it to discover what is actually synced and whether a custom object exists before querying it. Each item's objectType is the value to pass to object_get_fields_schema, crm_records_list, and list-tool filters. Also returns schemaStatus.fingerprint, a content hash of the query-relevant schema for every listed object — compare it against a stored fingerprint to decide whether a cached local schema snapshot is still current — and schemaStatus.lastCheckedAt, when Clearskies last refreshed CRM schema metadata (NOT when the schema content changed, and NOT a record-sync watermark). Schema-content freshness is signalled by the fingerprint alone, not by any timestamp.

object_get_fields_schema

ChatGPT
What fields are on an object type: lists all the fields, columns and properties of a deal, opportunity, account, contact, employee or custom object, with each field's label, data type, whether it is editable or read-only, and its picklist options — the possible values a field such as stage, status or type accepts — plus validFilters for the list tools. Use objectType from object_definitions_list.

records_aggregate

ChatGPT
Count, sum, average, min and max over deals, opportunities, pipeline, accounts, customers, contacts, calls or any custom object. Answers how many, how much, total, average, biggest and smallest, broken down by stage, owner, rep, month or quarter, or by which industries customers come from. Use this instead of listing records and counting the rows yourself.

slack_users_list

ChatGPT
List the people in this tenant who have a Slack account, each with their Slack member id. This is the only way to obtain one, and it is what a sendSlackMessage user recipient takes: search by name or email, then pass the matching row's slackUserId (a Slack id such as "U0123456789") as the recipient's value. The row's personId is a Clearskies id and is NOT a valid recipient value — workflow_validate rejects it, and a workflow published with one fails every live run with channel_not_found. For channel recipients use channels_list and take externalId. Filter by personType ('internal', 'external', 'other').

submit_mcp_feedback

ChatGPT
Report friction, gaps, or failed workflows encountered while using these tools. Pass the business question you were pursuing and one or more issues (each with a type, severity, and details). Use this whenever a tool result was missing, confusing, empty, too large, slow, or a needed capability was unavailable. Never charged.

support_tickets_list

ChatGPT
List support tickets synced from Linear or Pylon, stalest-first. Filter by assignee email, provider, open-only, and updatedBefore (RFC3339) to find tickets that need attention (e.g. unowned, stale, or not updated in N days). Returns ticket state, lifecycle type, owner, and the upstream last-updated time.

views_create

ChatGPT
Build a filtered list the user can open up in the app — my deals closing this quarter, accounts with no recent activity — as an ephemeral AI-owned view (filter, columns, sort) for the calling user. Associates with the current ask_ai chat when one is in context. Returns viewId and a URL the user can open. For multi-object questions, call once per objectType and return all URLs. Prefer views_update over views_create when a relevant view already exists in this chat.

views_update

ChatGPT
Partial update of an ephemeral AI view you own. Pass only the fields to change. Pass filters:[] to clear the filter. Rejects views you don't own and non-AI views.

workflow_capabilities_get

ChatGPT
Returns a Markdown guide to building workflows for this tenant: node types and their required fields, trigger types and which are runtime-supported, variable syntax, the draft-vs-published model, and worked examples. Call this first before creating or editing a workflow.

workflow_draft_history_list

ChatGPT
What has changed on a workflow recently: lists its draft edit history, newest first — each entry has the version number, change kind, who edited it, when, and a delta of what changed from the previous version, but NOT the full configuration. To fetch a version's full configuration, call workflows_get with that version number. Requires workflowId; paginated with itemsPerPage and an opaque cursor.

workflow_folders_create

ChatGPT
Make a new folder to organize workflows in. Pass parentId to create it under another folder; omit parentId for a root folder.

workflow_folders_delete

ChatGPT
Deletes an empty workflow folder. Refuses folders that contain child folders or workflows.

workflow_folders_get

ChatGPT
One workflow folder by id: its name and parent. To see what is in a folder, pass its id as folderId to workflows_list for the workflows in that folder, or as parentId to workflow_folders_list for its child folders.

workflow_folders_list

ChatGPT
How workflows are organized: lists the folders they are grouped into. Omit arguments to list all folders, set rootOnly:true for root folders, or pass parentId to list direct child folders.

workflow_folders_update

ChatGPT
Renames a workflow folder or moves it under another folder. Set clearParent:true to move it to root. Refuses self/descendant moves.

workflow_node_patch

ChatGPT
Applies an ordered batch of node operations (addNode/updateNode/replaceNode/deleteNode) to a workflow's working draft without resending the whole configuration. You author nodes and placement intent ("after X", "before Y", "inside loop L") and supply each node's id (e.g. agent-1); the backend wires all edges and reconnects neighbors on delete. The batch is transactional: if any op fails, nothing is saved and the failing op's index is returned. This is mutate-only — it does not validate-for-publish or publish; call workflow_validate then workflows_publish. Optional expectedVersion guards against the published version having moved since you read the workflow; concurrent draft edits are last-write-wins. Use workflow_capabilities_get for node shapes and workflow_variables_get for referenceable {{...}} variables. Both afterNodeId and beforeNodeId splice linearly into a single chain; there is no primitive to add a node as an additional parallel successor — to author parallel branches, use workflows_update with the whole configuration.

workflow_runs_get

ChatGPT
Get a single workflow run by id, including full per-step status, inputs, outputs, errors, and timing. Use workflow_runs_list to find run ids, then this to inspect one run in detail.

workflow_runs_list

ChatGPT
Has a workflow been running? Lists its run and execution history — every time it fired, with per-step status, errors, and outputs. Use it to check whether an automation is firing at all, investigate why a run failed, find runs for a particular account or meeting, or list recent runs by time range. Requires workflowId — get it from a workflow listing surface or workflow URL. Results are ordered most-recent first.

workflow_test_run_get

ChatGPT
Get a workflow test run (dry run) by its testRunId, including status and per-step results. testRunId comes from workflow_test_run_start. While the run is still pending or running the response carries retryAfterSeconds — wait that many seconds, then call this again; the field is absent once the run has finished.

workflow_test_run_start

ChatGPT
Starts a dry-run of a workflow and returns a testRunId and status. The required input depends on the workflow's trigger: recordId for a salesforceRecordCreated trigger (use workflow_trigger_records_list to find one), meetingId for meeting triggers (meetingStarted/meetingEnded), and no input for scheduled triggers. When the input is missing or wrong, returns an actionable error naming the tool to find a valid input. Poll results with workflow_runs_list.

workflow_trigger_records_list

ChatGPT
Lists the candidate inputs valid for a workflow's trigger, to use as a test-run input: meetings for meeting triggers (meetingStarted/meetingEnded), Salesforce records for record triggers (salesforceRecordCreated). Pick one and pass its id to workflow_test_run_start (a meetingId for meeting triggers, a recordId for record triggers). Scheduled workflows take no input. Supports search on the candidate label and pagination.

workflow_validate

ChatGPT
Will this workflow publish, or is something missing? Validates a configuration against the publish rules without saving — pass an inline configuration. Returns valid plus per-node/per-field errors and any non-blocking warnings. Use it to check a draft and self-correct before workflows_publish.

workflow_variables_get

ChatGPT
What you can reference in a workflow's Slack message or any other field — the meeting title, the account name, a record value — as {{...}} template variables. Lists them as a compact skeleton: the trigger entity and each findRecords/createSalesforce step, each with its objectType, objectPath (e.g. find-1.records), cardinality, system fields, and inline references to related objects. It does NOT enumerate scalar fields — call object_get_fields_schema with a node's objectType to list them, then reference a value as {{<objectPath>.<fieldName>}} (e.g. {{find-1.records.subject}}). Each reference lists subFields that always resolve (id/name, or person identity fields) plus a drillable flag: when true, call object_get_fields_schema(referenceToObj) for additional fields that resolve one hop deep; when false, only subFields resolve. createSalesforce records carry no drillable references — their fields (including id/reference fields like OwnerId) are listed by object_get_fields_schema. Provide either an existing workflowId or an inline configuration you're drafting.

workflows_create

ChatGPT
Creates a draft workflow from a configuration (name required; optional description, configuration, folderId). Does not publish — publishing is a separate, explicit step. The configuration is not validated until you publish; call workflow_capabilities_get for the node types. Returns the workflow with status:'draft' and published:false.

workflows_delete

ChatGPT
Deletes a workflow (soft delete): removes it from every surface and, if it was published, deletes its Temporal schedule so it stops firing. Use this to clean up abandoned or never-published draft workflows. Returns {id, deleted:true}.

workflows_discard_draft

ChatGPT
Throw away the changes in a workflow's pending draft and go back to what is live, reverting to the published configuration. The workflow must be published and have a draft. The draft is deleted.

workflows_duplicate

ChatGPT
Copies a workflow as a new draft (the name gets a ' (copy)' suffix). The copy takes the source's latest configuration: its pending draft when one exists, otherwise the published live config. Does not publish — publishing is a separate, explicit step. Returns the new workflow with status:'draft' and published:false.

workflows_get

ChatGPT
What one workflow or automation does, step by step: returns its live (published) and draft configurations, clearly labeled. Also returns a draftHistory summary and accepts an optional version to return that historical version's full configuration in requestedVersion.

workflows_list

ChatGPT
Lists the workflows and automations that exist here (id, name, status, hasDraft, version), including which are published and running live and which are still drafts. Filter by status. Set includeConfig:true to include each workflow's current configuration — the pending draft when hasDraft is true, otherwise the live one; use workflows_get to see the live and draft configs side by side.

workflows_move

ChatGPT
Moves a workflow into a folder or to root without changing its graph, draft, or publication state. Pass folderId, or clearFolder:true to remove it from its folder.

workflows_publish

ChatGPT
Validates a workflow's draft and, if valid, publishes it — promoting the draft to the live configuration and installing its trigger/schedule. On a validation failure the draft is left unchanged and the violated rule is returned; fix it and call again. Returns the workflow with status:'published' and published:true.

workflows_unpublish

ChatGPT
Turn a workflow or automation off for now: unpublishes a published workflow, removing it from the live surface (deleting its Temporal schedule if it had a scheduled trigger) and returning it to draft so it can be edited and republished. Reversible. Returns the workflow with status:'draft' and published:false.

workflows_update

ChatGPT
Partially updates a workflow: pass only the fields to change (name, description, configuration, folderId, clearFolder). A configuration replaces the entire graph; on a published workflow it is saved as a pending draft (publish to make it live), on a draft it is applied directly. Does not publish. Returns the workflow with its current draft state.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

71

Tools

3

Prompts

ChatGPT

Platforms

Category

CRM Records

Works with

ChatGPT

Data refreshed daily