Skip to main content
Skills define what integrations your workflow can interact with. Each skill exposes a set of tools that the agent can call (via agentic loops) or that you can call deterministically (via agent.tools.*). In TypeScript, terse generate writes a single Skills object in src/terse.generated.ts. Import it and call the nested factory for the integration you want (for example Skills.github({ repos: [...] })). Built-in capabilities like Skills.web(), Skills.imageEdit(), and Skills.memory() are documented in their sections below.

GitHub

Read-only access to repositories.

Slack

Send messages and read conversations.
For slack_send_message, pass either channelId (a public or private channel id, or an existing DM channel id) or slackUserId (a member id, U…). Terse opens the DM if needed. If you pass both, channelId wins and the message goes there. After terse generate, use SlackChannel.*.channelId and SlackUser.*.userId from src/terse.generated.ts instead of hand-copying ids.

Linear

Create, update, and search issues.

Attio

Query and manage CRM records.

Notion

Read and write databases and pages. Optionally scope to specific databases or pages.
databases and pages are both optional. Omit them to give the model access to every database and page the integration can reach.

Gmail

Send emails (auto-send, no human review).

Gmail Draft

Create draft emails for a human to review and send manually.

Meta Ads

Read ad performance and manage ads, audiences, and offline conversions.
adAccount and pageId scope the agent: a tool call naming a different ad account or Page is denied. Omit both and the agent may use anything the connected login can reach. adAccountId is required on every tool that takes one; use the generated MetaAdsAdAccount values rather than raw strings. Notes:
  • Each list tool returns its own collection, a count, and truncated.
  • Insights need level: "ad" to attribute results to an individual creative, optionally split by breakdowns such as age or publisher_platform. meta_ads_read_insights pages up to 2000 rows and sets truncated: true beyond that; each breakdown multiplies the row count.
  • Meta cannot edit a creative or swap the one on an ad. Improve one by creating a new ad in the same ad set and pausing the old one; each ad keeps its own insights.
  • New ads enter PENDING_REVIEW and can come back DISAPPROVED. Re-read effective_status with meta_ads_list_ads before treating an ad as live.
  • meta_ads_set_status only pauses and resumes. There is no budget tool, so an automation cannot increase spend.

Creative formats

meta_ads_create_ad takes a creative object discriminated by format, so only the fields belonging to the chosen format are in scope. Each carousel card is itself discriminated, on media:
Shared across formats: linkUrl, callToAction, instagramActorId, urlTags, status. Format notes:
  • Only the fields you supply are sent, so an omitted callToAction leaves Meta’s default button. status is the exception: it defaults to PAUSED, not Meta’s ACTIVE.
  • Carousels containing a video card are Facebook-only: Meta does not support them on Instagram placements.
  • Dynamic creative is capped at 30 assets across media and text (ad_format and link_url each count as one), requires callToActions, and only works on an ad set with dynamic creative already enabled in Ads Manager.
  • Images are fetched by Meta from the URL you supply; videos and dynamic-creative images are uploaded first, so short-lived signed URLs work everywhere, including the ones Higgsfield returns. The result reports videoIds and imageHashes.

Connecting

Open Integrations, choose Meta Ads, and approve the business and assets Meta lists. Terse uses Facebook Login for Business, which issues a business integration system user token. Unlike a 60-day user token, it does not expire, so scheduled jobs keep running. It is revoked only when the client removes your app under Business settings, Connected apps. Terse checks connections on its maintenance pass and reports a revoked token instead of failing mid-run. Standard Access, granted automatically, covers every tool above for users with a role on your Meta app. Reaching ad accounts outside your app requires Advanced Access, App Review, and Business Verification. Standard Access rate limits are roughly 300 + 40 x active ads calls per hour for management and 600 + 400 x active ads for insights.

Higgsfield

Generate ad creative images from a text prompt, then animate them into video.
Notes:
  • The tools block until generation finishes. Each asset is copied into Terse storage and returned as a signed URL valid for 24 hours, ready to pass to meta_ads_create_ad as an imageUrl or videoUrl.
  • Every call spends Higgsfield credits, so both generators are writes and can be gated behind approval. Use batchSize: 4 for variants to compare, and match size to the placement (2048x1152 for feed, 1152x2048 for stories).
  • model trades cost against quality: dop-lite, dop-turbo (default), dop-standard.
  • A motion is a named camera move applied on top of your prompt. IDs are opaque, so discover them with higgsfield_list_motions, pass one as motionId, and scale it with motionStrength (0-1, defaults to 1).
There is no text-to-video path, so a video ad is always two calls:

Connecting

Generate a key in the API keys section of cloud.higgsfield.ai. (platform.higgsfield.ai is the API host, not a sign-up page.) Higgsfield issues a Key ID and a Key Secret: copy both, and make sure the account has credits. Paste them as a single colon-joined string, KEY_ID:KEY_SECRET, with no spaces, quotes, or the literal Key prefix from Higgsfield’s header examples. Use the Higgsfield card in the console, or stdin from the CLI so the secret stays out of your shell history:
Terse validates the pair against Higgsfield at connect time and stores it write-only. Rotate it in the Higgsfield dashboard and reconnect if you suspect it leaked.

Snowflake

Read-only SQL query execution.

Datadog

Read-only access to logs and RUM events. Optionally scope to specific log indexes.
indexes is optional. Omit it to search across every index the integration can reach.

PostHog

Read-only access to product analytics. Supports US PostHog Cloud (us.posthog.com) only; EU-hosted PostHog is not supported.
terse generate also emits a PosthogEventName union of the custom event names observed in your project over the last 180 days, so eventName filters are checked at compile time. Built-in $-prefixed events like $pageview are always accepted.

LaunchDarkly

Read-only access to feature flags.

WorkOS

Read-only access to users and organizations.

Apollo

Lead and company enrichment plus prospect search via Apollo.io, using your own Apollo API key.
Credit and key notes:
  • Person and organization enrichment consume Apollo export credits per matched record. Prefer apolloBulkEnrichPeople for lists.
  • apolloSearchPeople consumes no credits but requires the connected key to be an Apollo master API key, and its results never include emails — pass result ids to apolloBulkEnrichPeople to unlock contact data.
  • apollo_list_job_postings works with any Apollo key but consumes credits per page returned — fetch one large page (up to 500 postings) instead of paging in small steps. Postings carry title/URL/location/date metadata only, no descriptions.
  • Personal emails are only returned when revealPersonalEmails is set, and Apollo suppresses them for people in GDPR regions.

Google Search Console

Read Search Analytics and manage the properties and sitemaps of a connected Google account.
terse generate writes one GoogleSearchConsoleSite static per property the connected account can access, so you reference properties by name instead of pasting identifiers. Property and data notes:
  • A property is either a URL-prefix property (https://example.com/, trailing slash included) or a Domain property (sc-domain:example.com).
  • The properties you pass to the skill are the only ones the agent may act on, except google_search_console_list_sites, which lists everything the account can see. A Domain property also covers its subdomains.
  • Search Analytics dates are inclusive YYYY-MM-DD in PST and the data lags by roughly 2-3 days, so the most recent days come back empty rather than as zero traffic.
  • Query-grouped results omit anonymized queries, so their clicks will not sum to the property total.
  • Submitting a sitemap only queues it. Check the outcome later with google_search_console_get_sitemap.
  • Property access follows the connected Google account, not your Terse organization, so connect the account that actually appears in Search Console.
Search Console uses the sensitive webmasters scope. While the OAuth client is in Testing status, only Google accounts on its test-user list can connect, capped at 100. An access-blocked error is usually that list.

Web (built-in)

Web search and research tools available to all workflows.
Pass allowedDomains to restrict the agent to a whitelist of sites. When set, web_search results and web_extract page fetches are limited to those domains and their subdomains; requests to any other domain are blocked.

Image Edit (built-in)

Edit and generate images.

Memory (built-in)

Gives a job a persistent /memories directory it can read and write across runs. With the skill added, the agent checks /memories before starting and records progress, context, and learnings as it works, so later runs pick up where earlier ones left off.

What persists between runs

Only files under /memories carry over. Every run otherwise starts fresh from your deployed code, so anything written elsewhere in the run is discarded. Anything the agent saves to /memories is still there on the next run.

How memory is organized

  • Per project — each project has its own isolated memory. Jobs in different projects never share memory.
  • Per job — within a project, every job gets its own private space; one job cannot see another job’s memory.
  • Scoped to /memories — all paths stay inside the /memories directory.
Cleanup is automatic: deleting a job removes that job’s memory, and deleting a project removes all memory for the project. terse test runs against a separate, isolated test memory, so local testing never touches what your deployed job has saved.

Inspecting memory

Use the terse memory commands to list, read, write, and delete a job’s memory files from the terminal. Add --test to any of them to target the isolated terse test memory instead of production.