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, andtruncated. - Insights need
level: "ad"to attribute results to an individual creative, optionally split bybreakdownssuch asageorpublisher_platform.meta_ads_read_insightspages up to 2000 rows and setstruncated: truebeyond 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_REVIEWand can come backDISAPPROVED. Re-readeffective_statuswithmeta_ads_list_adsbefore treating an ad as live. meta_ads_set_statusonly 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:
linkUrl, callToAction, instagramActorId, urlTags, status.
Format notes:
- Only the fields you supply are sent, so an omitted
callToActionleaves Meta’s default button.statusis the exception: it defaults toPAUSED, not Meta’sACTIVE. - 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_formatandlink_urleach count as one), requirescallToActions, 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
videoIdsandimageHashes.
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 roughly300 + 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_adas animageUrlorvideoUrl. - Every call spends Higgsfield credits, so both generators are writes and can be gated behind approval. Use
batchSize: 4for variants to compare, and matchsizeto the placement (2048x1152for feed,1152x2048for stories). modeltrades 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 asmotionId, and scale it withmotionStrength(0-1, defaults to 1).
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:
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
apolloBulkEnrichPeoplefor lists. apolloSearchPeopleconsumes no credits but requires the connected key to be an Apollo master API key, and its results never include emails — pass resultids toapolloBulkEnrichPeopleto unlock contact data.apollo_list_job_postingsworks 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
revealPersonalEmailsis 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-DDin 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.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/memoriesdirectory.
terse test runs against a separate, isolated test memory, so local testing never touches what your deployed job has saved.
Inspecting memory
Use theterse 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.