Ar Io Gateway Operator
ar-io/ar-io-node
Operate any AR.IO node deployment — architecture, daily ops, diagnostics, and recurring pitfalls that apply to every operator.
Every Nylas API, plus a local SQLite mirror, cross-grant search, and confirm-by-hash sending no other Nylas tool has.
$ npx skills add mvanhorn/printing-press-library --skill pp-nylas -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mvanhorn/printing-press-library pp-nylas --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/mvanhorn/printing-press-library.git skills-src && mkdir -p .claude/skills && cp -r skills-src/cli-skills/pp-nylas .claude/skills/pp-nylas && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pp-nylas" agent skill from https://github.com/mvanhorn/printing-press-library/tree/main/cli-skills/pp-nylas into .claude/skills/pp-nylas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pp-nylas", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/mvanhorn/printing-press-library/tree/main/cli-skills/pp-nylasType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add mvanhorn/printing-press-library --skill pp-nylas -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mvanhorn/printing-press-library pp-nylas --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mvanhorn/printing-press-library.git skills-src && mkdir -p .agents/skills && cp -r skills-src/cli-skills/pp-nylas .agents/skills/pp-nylas && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pp-nylas" agent skill from https://github.com/mvanhorn/printing-press-library/tree/main/cli-skills/pp-nylas into .agents/skills/pp-nylas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pp-nylas", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mvanhorn/printing-press-library --skill pp-nylas -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mvanhorn/printing-press-library pp-nylas --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mvanhorn/printing-press-library.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/cli-skills/pp-nylas .cursor/skills/pp-nylas && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pp-nylas" agent skill from https://github.com/mvanhorn/printing-press-library/tree/main/cli-skills/pp-nylas into .cursor/skills/pp-nylas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pp-nylas", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/mvanhorn/printing-press-library.git --path cli-skills/pp-nylas--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add mvanhorn/printing-press-library --skill pp-nylas -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mvanhorn/printing-press-library pp-nylas --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mvanhorn/printing-press-library.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/cli-skills/pp-nylas .gemini/skills/pp-nylas && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pp-nylas" agent skill from https://github.com/mvanhorn/printing-press-library/tree/main/cli-skills/pp-nylas into .gemini/skills/pp-nylas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pp-nylas", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install mvanhorn/printing-press-library pp-nylasInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add mvanhorn/printing-press-library --skill pp-nylas -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mvanhorn/printing-press-library.git skills-src && mkdir -p .github/skills && cp -r skills-src/cli-skills/pp-nylas .github/skills/pp-nylas && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pp-nylas" agent skill from https://github.com/mvanhorn/printing-press-library/tree/main/cli-skills/pp-nylas into .github/skills/pp-nylas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pp-nylas", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mvanhorn/printing-press-library --skill pp-nylas -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install mvanhorn/printing-press-library pp-nylas --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mvanhorn/printing-press-library.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/cli-skills/pp-nylas .opencode/skills/pp-nylas && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pp-nylas" agent skill from https://github.com/mvanhorn/printing-press-library/tree/main/cli-skills/pp-nylas into .opencode/skills/pp-nylas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pp-nylas", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
pp-nylasEvery Nylas API, plus a local SQLite mirror, cross-grant search, and confirm-by-hash sending no other Nylas tool has.
Pp Nylas is an agent skill from mvanhorn/printing-press-library. Every Nylas API, plus a local SQLite mirror, cross-grant search, and confirm-by-hash sending no other Nylas tool has. Trigger phrases: search my Nylas inbox across all grants, what changed in Nylas in the last 2 hours, first-response time on my Nylas threads, replay a Nylas webhook locally, preview a Nylas send before it goes out, use nylas, run nylas-pp-cli.
Its SKILL.md is about 11k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering Email management and Webhooks. It works with SQLite. The repository describes itself as: Official library of CLIs generated by the CLI Printing Press. Endorsed, tested, and community-contributed. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 0fdcc7a. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadBashFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
claudenpxgojqFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
googleapis.comgraph.microsoft.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
NYLAS_API_KEYNYLAS_ACCESS_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Pp Nylas loads about 11k tokens when it runs. Until then it costs about 96 tokens; SKILL.md has 5,002 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, BashAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from mvanhorn/printing-press-library at commit 0fdcc7a, republished under its Apache-2.0 licence (© mvanhorn). 5,002 words, ~10,690 tokens.
.claude/skills/pp-nylas/SKILL.md (or your agent's skills folder).<!-- GENERATED FILE — DO NOT EDIT.
This file is a verbatim mirror of library/productivity/nylas/SKILL.md,
regenerated post-merge by tools/generate-skills/. Hand-edits here are
silently overwritten on the next regen. Edit the library/ source instead.
See the repository agent guide, section "Generated artifacts: registry.json, cli-skills/". -->
This skill drives the nylas-pp-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
$HOME/.local/bin on macOS/Linux and %LOCALAPPDATA%\Programs\PrintingPress\bin on Windows:npx -y @mvanhorn/printing-press-library install nylas --cli-onlynylas-pp-cli --version$PATH for the agent/runtime that will invoke this skill.If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.6 or newer):
go install github.com/mvanhorn/printing-press-library/library/productivity/nylas/cmd/nylas-pp-cli@latestIf --version reports "command not found" after install, the runtime cannot see the binary directory on $PATH. Do not proceed with skill commands until verification succeeds.
Reach for nylas-pp-cli when you need to query Nylas data across multiple grants, run repeat 'what changed since' polls cheaply, compose SQL over messages and events, or sample the wire payload of a send before it goes out. For pure single-call API parity with the official SDK, the official nylas-cli is also a fine choice.
These capabilities aren't available in any other tool for this API.
sync — Pull messages, events, threads, and contacts for one or all grants into a local SQLite mirror with per-(grant, resource) cursors so re-runs are incremental.
Reach for this when an agent needs to answer questions repeatedly without burning rate-limit on every call.
nylas-pp-cli sync --resources messages,events --since 24h --agentsince — Query the local mirror for resources changed in the last N (e.g. 2h, 24h) across all grants in one shot.
Cheapest path to 'what changed' polling without API round-trips.
nylas-pp-cli since 2h --resource messages --agent --select id,subject,from,grant_idsearch — FTS5 search over messages, threads, events, and contacts spanning every connected grant in a single query (use --type to filter by resource).
Use this to find references anywhere across a tenant without N separate searches.
nylas-pp-cli search "invoice overdue" --type messages --limit 50 --agentexport — Stream the local mirror (or a filtered slice) to NDJSON for downstream analytics tools like DuckDB or notebooks.
Pipe Nylas data into duckdb or a notebook in one command.
nylas-pp-cli export --resource messages --since 90d --format ndjsongravity — Rank contacts by cross-grant interaction weight (sent + received + meeting-attended), unified by email address.
Surfaces 'who actually matters to this tenant' in one call for CRM hygiene or agent prioritisation.
nylas-pp-cli gravity --top 25 --since 90d --agentresponse-time — Compute median and p90 first-response latency on threads where the grant-holder replied, sliced by grant or counterparty domain.
An SLA dashboard in one command, impossible against the live API in under five minutes of round-trips.
nylas-pp-cli response-time --group-by domain --since 30d --agentwebhook-replay — Re-fire any past webhook delivery from the local store into a local handler URL, optionally filtered by trigger or grant.
Reproduce a production webhook bug in seconds without waiting for the next event to fire.
nylas-pp-cli webhook-replay --since 24h --trigger message.created --to http://localhost:3000/hookgrants messages send — Use --dry-run to print the exact wire payload for any grants messages send call; pair with --yes (or --agent) to bypass interactive confirmation only when you've reviewed the preview.
Every destructive action is reviewable; an agent can show the payload before sending.
nylas-pp-cli grants messages send 550e8400-e29b-41d4-a716-446655440000 --to PII_EMAIL_EXAMPLE --body 'note' --dry-run
nylas-pp-cli grants messages send 550e8400-e29b-41d4-a716-446655440000 --to PII_EMAIL_EXAMPLE --body 'note' --yesgrants messages send — Pass the global --idempotent flag so an already-existing create result is treated as a successful no-op, making the send safe to retry inside an agent loop.
Safe to call inside an agent retry loop.
nylas-pp-cli grants messages send 550e8400-e29b-41d4-a716-446655440000 --to PII_EMAIL_EXAMPLE --body 'note' --idempotent --agentgrants doctor — Health-check every grant: token expiry, missing scopes for advertised features, recent webhook failures, sync lag.
Tells you which mailboxes are quietly broken before users notice.
nylas-pp-cli grants doctor --agentsql — Read-only SQL query against the local mirror with --json output.
Anything we forgot to expose as a verb, an LLM can still answer through SQL.
nylas-pp-cli sql "SELECT from_addr, COUNT(*) FROM messages GROUP BY 1 ORDER BY 2 DESC LIMIT 20" --agent--agent (global flag) — Single flag that forces --json --compact --no-input --no-color --yes defaults so any read command is LLM-safe in one switch.
One flag flips the entire CLI into LLM-safe mode; eliminates a class of prompt-eats-stdin bugs.
nylas-pp-cli grants get-all --agent --limit 10admin — Manage admin
nylas-pp-cli admin create-api-key — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage API Keys endpoints, you need to <a...nylas-pp-cli admin create-domain — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage Domains endpoints, you need a <a...nylas-pp-cli admin delete-api-key — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage API Keys endpoints, you need to <a...nylas-pp-cli admin delete-domain — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage Domains endpoints, you need a <a...nylas-pp-cli admin get-api-key — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage API Keys endpoints, you need to <a...nylas-pp-cli admin get-api-keys — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage API Keys endpoints, you need to <a...nylas-pp-cli admin get-domain — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage Domains endpoints, you need a <a...nylas-pp-cli admin get-domain-info — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage Domains endpoints, you need a <a...nylas-pp-cli admin list-domains — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage Domains endpoints, you need a <a...nylas-pp-cli admin update-domain — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage Domains endpoints, you need a <a...nylas-pp-cli admin verify-domain — <div id='admonition-warning'>⚠️ <b>Before you can use the Manage Domains endpoints, you need a <a...applications — In the context of the Nylas APIs, an "application" is the object record of your Nylas application.
<div id="admonition-info">🔍 <b>The term "application" can refer to any of three concepts</b>: your Nylas application, the project you're building ("your application" or "your app"), and applications that you use to connect to service providers ("provider auth applications"). We try to be specific in this documentation to avoid confusion. The API endpoints described here are for working with your Nylas application, specifically.</div>
The Nylas application is the central resource for your Nylas implementation. It collects the connectors that you use to store information about third party services that your application connects to, and stores the grants that you create when using connectors.
Nylas applications also allow you to define your specific branding, change the look and feel of the Nylas Hosted authentication flow, and list your application's callback URIs.
Your Nylas application includes a list of allowed callback URIs. These are known URIs that Nylas can direct users to after authentication. You need to define at least one callback URI so your users can complete the auth flow.
You must include any callback URIs you plan to use in this list. If an auth payload includes a callback URI that isn't on the list, the whole authentication flow fails.
<div id="admonition-warning">⚠️ <b>You can create, edit, and delete applications from the Nylas Dashboard</b>. You <i>cannot</i> create, edit, or delete them using the Nylas APIs.</div>
Keep the following limitations in mind as you work with Nylas applications:
Applications are the central resource that stores other Nylas resources. You must create an application before you can create any other parts of your Nylas implementation.
Applications can be associated with only one project at a time. While your project can have more than one Nylas application to provide different authentication experiences, you cannot share applications, connectors, or grants between more than one project.
Applications cannot be nested, and cannot be set up with parent-child relationships.
Your application must have at least one callback URI, or else it cannot finish the authentication flow, which means it cannot create grants. Nylas requires grants to access user data.
nylas-pp-cli applications add-callback-uri — Adds a callback URI to the specified Nylas application. Nylas uses callback URIs to redirect users to your project...
nylas-pp-cli applications delete-callback-uri — Deletes the specified callback URI.
nylas-pp-cli applications get — Gets the application object
nylas-pp-cli applications get-all-callback-uris — Returns a list of callback URIs for the specified Nylas application.
nylas-pp-cli applications get-callback-uri — Returns the specified callback URI.
nylas-pp-cli applications update — Updates a Nylas application using the client ID associated with the specified API key. <div...
nylas-pp-cli applications update-callback-uri — Updates the specified callback URI. If you don't define the platform, Nylas doesn't modify the existing settings....
calendars — The Nylas Calendar API allows you to create and manage calendars, and access the events they contain. Nylas uses the same commands to manage calendars across providers, and you can refer to specific calendars using the provider's calendar_id.
Depending on the provider, a calendar might be accessed by only one person, or shared among several users. Some common calendars might include Personal, Work, or Shared calendars.
A calendar might contain overlapping events or conflicting schedules. You can use the Get Availability endpoint to find the best time for an event by identifying time periods that have no conflicting events among all participants.
You must specify a calendar_id in all calls you make to the Nylas Calendar API. You can use primary to specify the primary calendar associated with a grant, or you can look up the ID of the calendar that you want to work with and use that.
For virtual calendars, the primary calendar is the first created for a virtual account. You cannot delete a virtual calendar that's designated as primary.
For iCloud, there is no primary calendar.
The Get Free/Busy Schedule endpoint is available for all providers, including Virtual Calendars, except for iCloud.
The Get Availability endpoint doesn't support the free_busy object.
Nylas allows you to create virtual calendars for users and resources that might not have calendars on your providers (for example, external contractors or meeting rooms). You can use the Nylas Calendar and Events APIs with the virtual accounts that power virtual calendars, just like you would any other account. Virtual accounts don't provide email or contacts features, so you can't use them with the Email or Contacts APIs.
For more information, see Using virtual calendars.
You can add metadata to new and existing calendars by including the metadata sub-object in your POST, PUT, or PATCH request. For more information, see the Metadata documentation.
The table below lists the Calendar endpoints and which scopes they require. The table shortens the full scope URI for space reasons, so add the prefix for the provider when requesting scopes.
The ☑️ in each column indicates the most restrictive scope you can request for each provider and still use that API. More permissive scopes appear under the minimum option. If you're already using one of the permissive scopes, you don't need to add the more restrictive scope.
| Endpoint | Google Scopes</br>https://www.googleapis.com/auth/... | Microsoft Scopes</br>https://graph.microsoft.com/... |
|---|---|---|
GET /calendars</br>GET /calendars/<CALENDAR_ID></br>POST /calendars/free-busy</br>POST /calendars/availability | /calendar.readonly ☑️</br>/calendar | Calendars.Read ☑️</br>Calendars.ReadWrite |
POST /calendars</br>PUT /calendars/<CALENDAR_ID></br>DELETE /calendars/<CALENDAR_ID> | /calendar ☑️ | Calendars.ReadWrite ☑️ |
For more information about scopes, see Using scopes to request user data.
You can subscribe to the following triggers so Nylas notifies you about changes to your users' calendar data:
calendar.createdcalendar.updatedcalendar.deletedFor more information, see the Calendar webhook notification schemas.
Microsoft Outlook events are often shared across all calendars in a user's account. If the user creates an event on one of their calendars, you can retrieve it using another calendar ID from their grant.
nylas-pp-cli calendars — Returns availability information for the specified user or group of users. All participants' email addresses must be...channels — Manage channels
nylas-pp-cli channels create-pubsub — Create a Pub/Sub channel in the specified application.nylas-pp-cli channels create-sns — Create an Amazon SNS notification channel in the specified application. The topic must be a valid Amazon SNS topic...nylas-pp-cli channels delete-pubsub-by-id — Delete a specific Pub/Sub channel from a specific Nylas application.nylas-pp-cli channels delete-sns-by-id — Delete a specific Amazon SNS notification channel from a specific Nylas application.nylas-pp-cli channels get-pubsub — Get the Pub/Sub channels for an application.nylas-pp-cli channels get-pubsub-by-id — Get a specific Pub/Sub channel from a specific Nylas application.nylas-pp-cli channels get-sns — Get the Amazon SNS notification channels for an application.nylas-pp-cli channels get-sns-by-id — Get a specific Amazon SNS notification channel from a specific Nylas application.nylas-pp-cli channels put-pubsub-by-id — Updates the specified Pub/Sub channel. When you make a PUT request, Nylas replaces all data in the nested object...nylas-pp-cli channels put-sns-by-id — Updates the specified Amazon SNS notification channel. When you make a PUT request, Nylas replaces all data in the...connect — Manage connect
nylas-pp-cli connect byo-auth — Manually creates a grant using the Bring Your Own (BYO) Authentication flow. If you're handling the OAuth flow in...nylas-pp-cli connect exchange-oauth2-token — The standard OAuth token endpoint for Hosted Authentication. This endpoint doesn't require authentication, as it is...nylas-pp-cli connect get-oauth2-flow — The initial OAuth 2.0 authorization request. Use this endpoint with the required query parameters to start the OAuth...nylas-pp-cli connect info-oauth2-token — Get info about a specific token based on the identifier you include. Use either the ID Token or Access...nylas-pp-cli connect revoke-oauth2-token-and-grant — Revokes the specified OAuth access token. When you revoke the token, Nylas doesn't revoke the grant or the...connectors — Manage connectors
nylas-pp-cli connectors create — Create a connector in your Nylas application. Connectors are how your Nylas application stores information it needs...nylas-pp-cli connectors delete-by-provider — Delete the existing connector for the provider you specify.nylas-pp-cli connectors get-all — List the connectors in your Nylas application.nylas-pp-cli connectors get-by-provider — Returns a connector for the specified provider.nylas-pp-cli connectors update-by-provider — Update the connector for the specified provider. When you make a PATCH request, Nylas replaces all data in the...domains — Manage domains
grants — Manage grants
nylas-pp-cli grants delete-by-id — Delete an existing grant by ID. You cannot re-authenticate the deleted grant. If you try to re-authenticate it,...nylas-pp-cli grants get-all — Returns all grants in your Nylas application.nylas-pp-cli grants get-by-access-token — Gets a grant using current access tokennylas-pp-cli grants get-by-id — Gets a grant with the provided ID. If the grant's grant_status is invalid, the grant has expired and needs to be...nylas-pp-cli grants patch-by-id — Updates the specified grant's stored settings or scope metadata. Common use cases: - Rotate a refresh token...lists — The Lists endpoints let you manage typed collections of values (email addresses, domains, or top-level domains) that can be referenced by Rules using the in_list condition operator. Lists provide a way to maintain dynamic allow lists and block lists that are evaluated during inbound rule processing and outbound send evaluation without needing to update individual rules.
Each list has a type that determines what kind of values it accepts and which rule condition fields it can be matched against:
domain — Domain names (for example, example.com). Matched against the from.domain or recipient.domain rule condition.tld — Top-level domains (for example, com, xyz). Matched against the from.tld or recipient.tld rule condition.address — Full email addresses (for example, PII_EMAIL_EXAMPLE). Matched against the from.address or recipient.address rule condition.List type is set at creation time and cannot be changed. Items within a list are managed via the /v3/lists/{list_id}/items sub-resource endpoints. Values are automatically normalized (lowercased and trimmed) and validated against the list's type. Duplicate additions are silently ignored.
nylas-pp-cli lists create — Creates a list for your application. Lists are typed collections of values (domains, TLDs, or email addresses) that...nylas-pp-cli lists delete — Deletes the specified list. This action is irreversible and cascades to all items in the list. Rules that reference...nylas-pp-cli lists get — Returns the specified list.nylas-pp-cli lists list-lists — Returns all lists for your application.nylas-pp-cli lists update — Updates the specified list. Only name and description can be updated. The list type is immutable after creation.migration-tools — Manage migration tools
nylas-pp-cli migration-tools migration-clone-single-account — Migrates a single v2 connected account to a v3 grant. Use this endpoint to migrate a few accounts to v3 as a test,...nylas-pp-cli migration-tools migration-get-jobs — Get information about the migration jobs for your application, including progress and status, for currently running...nylas-pp-cli migration-tools migration-import-v2-app — Import the settings from a v2 Nylas application to its linked v3 application. Before you use this endpoint, make...nylas-pp-cli migration-tools migration-link-v2v3-apps — Link an existing v2 application to an existing v3 application. <div id='admonition-warning'>⚠️<strong>Your v2...nylas-pp-cli migration-tools migration-snapshot-batch-clone — Starts a batch migration job to clone v2 connected accounts to v3 grants. Before you use this endpoint, your v2...nylas-pp-cli migration-tools translate-v2id-to-provider-id — Use the connected account ID and a resource type, with an optional list of specific Nylas IDs, to get a response...notetakers — Nylas Notetaker is a real-time meeting bot that you can invite to your online meetings. It records and transcribes your discussion, and delivers results to you using the Nylas API and webhook notifications.
The /v3/grants/<NYLAS_GRANT_ID>/notetakers endpoints let you interact with Nylas Notetaker while referencing a specific grant so you can use Notetaker's calendar sync features for your authenticated users.
The /v3/notetakers endpoints let you send Notetakers that aren't connected to a grant as standalone Notetakers.
Notetaker works with the Nylas Calendar API to automatically sync with calendars and events. When you sync Notetaker with a grant's calendar or event, Nylas tracks their join times and meeting links so the Notetaker is always sent to the meeting on time.
Nylas sends webhook notifications when a Notetaker bot is created, updated, or deleted, and when the recording media is available.
nylas-pp-cli notetakers delete-standalone — Permanently deletes the specified Notetaker and all associated data, including any recordings, transcripts,...nylas-pp-cli notetakers get-all-standalone — Returns a list of standalone Notetaker bots.nylas-pp-cli notetakers get-standalone — Returns the specified Notetaker bot and its details.nylas-pp-cli notetakers invite-standalone — Adds a standalone Notetaker bot to the specified meeting. <div id='admonition-info'>ℹ️ <b>Nylas doesn't...nylas-pp-cli notetakers update-standalone — Updates the specified scheduled standalone Notetaker bot.policies — The Policies endpoints let you define the operational configuration for Nylas Agent Accounts, including message limits, attachment constraints, spam detection settings, and linked rules for inbound message filtering. Each policy is scoped to your application and can be assigned to one or more Agent Accounts.
Policies let you control:
Policy limits are validated against your plan's maximum values. If a limit field is omitted, it defaults to the plan maximum. If a requested value exceeds the plan limit, the API returns an error.
nylas-pp-cli policies create-policy — Creates a policy for your application. Policies define message limits, spam detection settings, options, and linked...nylas-pp-cli policies delete-policy — Deletes the specified policy. This action is irreversible.nylas-pp-cli policies get-policy — Returns the specified policy.nylas-pp-cli policies list — Returns a list of all policies for your application.nylas-pp-cli policies update-policy — Updates the specified policy. All fields are optional — only provided fields are updated. The same plan-limit,...providers — Manage providers
nylas-pp-cli providers — Returns the provider if one is detected. This operation is rate limited to 20 calls per minute for each Nylas...rules — The Rules endpoints let you define automated filtering and routing logic for Nylas Agent Accounts. Each rule specifies a trigger (inbound or outbound), matching conditions, and actions to perform when those conditions are met.
Inbound rules run when mail arrives. Conditions match the sender — from.address, from.domain, or from.tld. Actions include blocking the message at the SMTP level, marking as spam, assigning to a folder, marking as read or starred, archiving, and trashing.
Outbound rules run before a send is submitted to the email provider. Conditions can match sender data (from.address, from.domain, from.tld), recipient data (recipient.address, recipient.domain, recipient.tld), or the send type via outbound.type (compose for new messages, reply for replies). A block action on an outbound rule rejects the send with HTTP 403 before it reaches the provider, so no message is delivered and no sent copy is stored. Non-blocking actions (mark_as_spam, archive, mark_as_read, mark_as_starred, assign_to_folder, trash) apply to the stored sent copy. recipient.* fields match against any recipient — including To, CC, BCC, and SMTP envelope recipients.
Inbound and outbound rules are isolated. Inbound rules never run during sends, and outbound rules never run on message receipt, so stored sent copies aren't re-evaluated against inbound rules.
Rules are evaluated in priority order (lower numbers first). Inbound rules are applied through the recipient grant's policy. Outbound rules are currently evaluated from the sending application's enabled outbound rules. The block action is terminal and cannot be combined with other actions.
Rules support the in_list condition operator, which checks field values against Lists (managed via the Lists API) for dynamic, maintainable allow and block lists. in_list works for from.* and recipient.* fields but not for outbound.type, which accepts only is and is_not.
Rule executions are audited per grant. List evaluation records with GET /v3/grants/{grant_id}/rule-evaluations to see which inbound or outbound rules ran, what normalized input was considered, and which actions were applied.
nylas-pp-cli rules create — Creates a rule for your application. A rule defines a trigger (inbound or outbound), conditions against sender...nylas-pp-cli rules delete — Deletes the specified rule. This action is irreversible. Policies that reference the rule no longer apply it during...nylas-pp-cli rules get — Returns the specified rule.nylas-pp-cli rules list — Returns a list of all rules for your application.nylas-pp-cli rules update — Updates the specified rule. All fields are optional — only provided fields are updated. The same validation rules...scheduling — Manage scheduling
nylas-pp-cli scheduling delete-bookings-id — Deletes the specified booking. Nylas also cancels the associated event on the provider. Nylas validates the provided...nylas-pp-cli scheduling delete-session — Deletes a specific session.nylas-pp-cli scheduling get-availability — Gets available time slots within the given time range, using the rules defined in the specified Configuration...nylas-pp-cli scheduling get-bookings-id — Returns the specified Booking object. Nylas validates the provided session ID and uses it to retrieve the related...nylas-pp-cli scheduling import-group-events — Imports existing events to your group events Configuration. You can import up to 20 events per request.nylas-pp-cli scheduling patch-bookings-id — Reschedules the specified booking. Nylas also updates the associated event on the provider. Nylas recommends against...nylas-pp-cli scheduling post-bookings — Books an event with the participants listed in the session's [Configuration...nylas-pp-cli scheduling post-sessions — Creates a new short-lived session that you can pass to the Scheduling Component to enforce user authentication. Your...nylas-pp-cli scheduling put-bookings-id — Confirms or cancels the specified pending booking. Nylas also updates the associated event on the provider. Nylas...nylas-pp-cli scheduling redirect — Redirects an existing v2 Scheduling Page to a v3 URL.nylas-pp-cli scheduling validate-time-slot — Validates whether the selected group event or time slot has changed, and is invalid. This can happen because... -...templates — Manage templates
nylas-pp-cli templates create-app-level — Creates an application-level template.nylas-pp-cli templates delete-app-level — Deletes the specified application-level template.nylas-pp-cli templates get-app-level — Returns the specified application-level template.nylas-pp-cli templates list-app-level — Returns a list of application-level templates.nylas-pp-cli templates render-html — Renders the HTML content of an application-level template using the provided variables and specified templating engine.nylas-pp-cli templates update-app-level — Updates the specified application-level template.webhooks — Manage webhooks
nylas-pp-cli webhooks delete-by-id — Delete a webhook destination record.nylas-pp-cli webhooks get-by-id — Get the webhook destinations for an application ID by webhook IDnylas-pp-cli webhooks get-destinations-application — Get a list of all webhook destinations for an application id.nylas-pp-cli webhooks get-mock-payload — Use this endpoint to see example notification payloads for the different Nylas events you specify, to the webhook...nylas-pp-cli webhooks post-destinations — Creates a webhook destination with the specified URL and list of trigger types. ### Webhook destinations and retry...nylas-pp-cli webhooks post-new-secret — Update the webhook secret value for a destination. The previous value will immediately stop being used and the new...nylas-pp-cli webhooks put-by-id — Update the values in a specific webhook destination. ### Limitations - You only need to specify fields that need to...nylas-pp-cli webhooks send-test-event — Use this endpoint to check if your project's webhook destination is configured correctly. Nylas sends a test webhook...workflows — Manage workflows
nylas-pp-cli workflows create — Creates an application-level workflow. <div id='admonition-info'>ℹ️ <b>You must have an existing <a...nylas-pp-cli workflows delete — Deletes the specified application-level workflow.nylas-pp-cli workflows get — Returns the specified application-level workflow.nylas-pp-cli workflows list — Returns all application-level workflows.nylas-pp-cli workflows update — Updates the specified application-level workflow.workspaces — Workspaces group and organize grants in a Nylas application by a common attribute, such as the email address domain (for example, nylas.com).
Nylas offers two endpoints to manage workspaces and the grants they contain:
Workspaces are designed to group grants by the top-level domain (TLD) of users' email addresses. Nylas allows you to manually assign grants to any workspace, but that workspace must have auto_group set to false.
When auto_group is set to false, Nylas doesn't automatically assign grants to that workspace. You'll need to manually assign grants to the workspace using the Update Workspace Assignments endpoint.
When auto_group is true, Nylas automatically assigns new grants to the workspace. You can move grants to a different workspace by making an Update Workspace Assignments request.
nylas-pp-cli workspaces autogroup — Configures automatic grouping settings for new or existing workspaces, depending on the filters set. If you don't...
nylas-pp-cli workspaces create — Creates a workspace.
nylas-pp-cli workspaces delete — Deletes the specified workspace.
nylas-pp-cli workspaces get — Returns the specified workspace.
nylas-pp-cli workspaces get-all — Returns all workspaces in your Nylas application. The application queried is determined based on the API key you use...
nylas-pp-cli workspaces update — Updates the specified workspace.
When you know what you want to do but not which command does it, ask the CLI directly:
nylas-pp-cli which "<capability in your own words>"which resolves a natural-language capability query to the best matching command from this CLI's curated feature index. Exit code 0 means at least one match; exit code 2 means no confident match — fall back to --help or use a narrower query.
nylas-pp-cli sync --resources messages --since 24h
nylas-pp-cli since 2h --resource messages --agent --select id,subject,from,grant_id,unread | jq '.[] | select(.unread)'Sync, then filter the mirror to the unread messages since 2h ago — answering 'what changed' from local data.
nylas-pp-cli search "renewal" --type messages --limit 100 --agent --select grant_id,subject,from,dateFTS5 full-text search across the local mirror; one query spans every connected grant.
nylas-pp-cli response-time --group-by domain --since 30d --agent --select domain,p50,p90,nCompute first-response latency from the local thread timeline, grouped by counterparty domain.
nylas-pp-cli grants messages send 550e8400-e29b-41d4-a716-446655440000 --to PII_EMAIL_EXAMPLE --subject "Q3" --body "..." --dry-run
nylas-pp-cli grants messages send 550e8400-e29b-41d4-a716-446655440000 --to PII_EMAIL_EXAMPLE --subject "Q3" --body "..." --yesTwo-step send: --dry-run prints the wire payload without calling the API; re-run with --yes to actually send.
nylas-pp-cli webhook-replay --since 24h --trigger message.created --to http://localhost:3000/hookRe-fires every persisted message.created delivery from the last day into your local handler — no production wait required.
Nylas V3 uses a bearer API key (Authorization: Bearer <NYLAS_API_KEY>) for application-level access to every grant. Set NYLAS_API_KEY in your environment or run nylas-pp-cli auth set-token. For per-user OAuth flows, NYLAS_ACCESS_TOKEN is also supported. The grant_id for each connected mailbox is a path parameter on every per-grant endpoint, not an auth header.
Run nylas-pp-cli doctor to verify setup.
Add --agent to any command. Expands to: --json --compact --no-input --no-color --yes.
Pipeable — JSON on stdout, errors on stderr
Filterable — --select keeps a subset of fields. Dotted paths descend into nested structures; arrays traverse element-wise. Critical for keeping context small on verbose APIs:
nylas-pp-cli applications get --agent --select id,name,statusPreviewable — --dry-run shows the request without sending
Offline-friendly — sync/search commands can use the local SQLite store when available
Non-interactive — never prompts, every input is a flag
Explicit retries — use --idempotent only when an already-existing create should count as success, and --ignore-missing only when a missing delete target should count as success
Commands that read from the local store or the API wrap output in a provenance envelope:
{
"meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
"results": <data>
}Parse .results for data and .meta.source to know whether it's live or local. A human-readable N results (live) summary is printed to stderr only when stdout is a terminal AND no machine-format flag (--json, --csv, --compact, --quiet, --plain, --select) is set — piped/agent consumers and explicit-format runs get pure JSON on stdout.
When you (or the agent) notice something off about this CLI, record it:
nylas-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
nylas-pp-cli feedback --stdin < notes.txt
nylas-pp-cli feedback list --json --limit 10Entries are stored locally at ~/.nylas-pp-cli/feedback.jsonl. They are never POSTed unless NYLAS_FEEDBACK_ENDPOINT is set AND either --send is passed or NYLAS_FEEDBACK_AUTO_SEND=true. Default behavior is local-only.
Write what surprised you, not a bug report. Short, specific, one line: that is the part that compounds.
Every command accepts --deliver <sink>. The output goes to the named sink in addition to (or instead of) stdout, so agents can route command results without hand-piping. Three sinks are supported:
| Sink | Effect |
|---|---|
stdout | Default; write to stdout only |
file:<path> | Atomically write output to <path> (tmp + rename) |
webhook:<url> | POST the output body to the URL (application/json or application/x-ndjson when --compact) |
Unknown schemes are refused with a structured error naming the supported set. Webhook failures return non-zero and log the URL + HTTP status on stderr.
A profile is a saved set of flag values, reused across invocations. Use it when a scheduled agent calls the same command every run with the same configuration - HeyGen's "Beacon" pattern.
nylas-pp-cli profile save briefing --json
nylas-pp-cli --profile briefing applications get
nylas-pp-cli profile list --json
nylas-pp-cli profile show briefing
nylas-pp-cli profile delete briefing --yesExplicit flags always win over profile values; profile values win over defaults. agent-context lists all available profiles under available_profiles so introspecting agents discover them at runtime.
For endpoints that submit long-running work, the generator detects the submit-then-poll pattern (a job_id/task_id/operation_id field in the response plus a sibling status endpoint) and wires up three extra flags on the submitting command:
| Flag | Purpose |
|---|---|
--wait | Block until the job reaches a terminal status instead of returning the job ID immediately |
--wait-timeout | Maximum wait duration (default 10m, 0 means no timeout) |
--wait-interval | Initial poll interval (default 2s; grows with exponential backoff up to 30s) |
Use async submission without --wait when you want to fire-and-forget; use --wait when you want one command to return the finished artifact.
| Code | Meaning |
|---|---|
| 0 | Success |
| 2 | Usage error (wrong arguments) |
| 3 | Resource not found |
| 4 | Authentication required |
| 5 | API error (upstream issue) |
| 7 | Rate limited (wait and retry) |
| 10 | Config error |
Parse $ARGUMENTS:
help, or --help → show nylas-pp-cli --help outputinstall → ends with mcp → MCP installation; otherwise → see Prerequisites above--agent)Install the MCP binary from this CLI's published public-library entry or pre-built release, then register it:
claude mcp add nylas-pp-mcp -- nylas-pp-mcpVerify: claude mcp list
which nylas-pp-cli
If not found, offer to install (see Prerequisites at the top of this skill).--agent flag:nylas-pp-cli <command> [subcommand] [args] --agentnylas-pp-cli <command> --help.© mvanhorn, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in cli-skills/pp-nylas of mvanhorn/printing-press-library.
Open the folder on GitHubat commit 0fdcc7a
Pp Nylas next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Pp Nylas this skillmvanhorn/printing-press-library | 2.1k | — | ~11k | Automated safety check: Notes | Apache-2.0 | |
| Ar Io Gateway Operatorar-io/ar-io-node | 127 | — | ~8.2k | Automated safety check: Notes | AGPL-3.0 | |
| Aqua Communicationquailyquaily/aqua | 258 | 1 repos | ~4.7k | Automated safety check: Notes | Apache-2.0 | |
| Watcher Creatorasheshgoplani/agent-deck | 1k | — | ~2.7k | Automated safety check: Pass | MIT | |
| E2a Doctortokencanopy/e2a | 192 | — | ~994 | Automated safety check: Pass | Apache-2.0 | |
| Agent Email Inboxviclafouch/meme-studio | 110 | 2 repos | ~10k | Automated safety check: Warn | None |
ar-io/ar-io-node
Operate any AR.IO node deployment — architecture, daily ops, diagnostics, and recurring pitfalls that apply to every operator.
quailyquaily/aqua
Aqua is a CLI-first message tool for AI agents. An agent skill from quailyquaily/aqua.
asheshgoplani/agent-deck
Guide for creating agent-deck watchers conversationally. An agent skill from asheshgoplani/agent-deck.
tokencanopy/e2a
A skill your agent uses when an existing e2a MCP connection, inbox, custom domain, protection policy, webhook, or message delivery is failing or unclear.
viclafouch/meme-studio
A skill your agent uses when setting up an email inbox for an AI agent (Moltbot, Clawdbot, or similar) - configuring inbound email, webhooks, tunneling for local development, and implementing…
sickn33/agentic-awesome-skills
Operate reply-aware cold outbound email workflows for AI agents with inboxes, contacts, templates, pacing, approvals, webhooks, and delivery metrics.
mvanhorn/printing-press-library
Desktop automation through the real Rust agent-desktop CLI, published in Printing Press through a small bridge.
mvanhorn/printing-press-library
Search, browse, and download Google Fonts from the terminal via the gfonts CLI.
mvanhorn/printing-press-library
The free, offline Trigger phrases: search 1688 for, find a factory on 1688 for, wholesale price on 1688 for, who is the cheapest supplier on 1688 for, compare 1688 suppliers for, use 1688, run 1688.
mvanhorn/printing-press-library
Inspect known Activity Japan plan IDs or URLs, compare dated prices and sessions, check language-sitemap coverage, and hand off to canonical booking pages.
mvanhorn/printing-press-library
Every Admin By Request portal action, plus a local SQLite mirror of audit, events, inventory and requests for ad-hoc...
mvanhorn/printing-press-library
macOS screen capture, window recording, GIF conversion, and agent evidence bundles from the terminal.
Works with
Categories
Every Nylas API, plus a local SQLite mirror, cross-grant search, and confirm-by-hash sending no other Nylas tool has. Pp Nylas is an agent skill from mvanhorn/printing-press-library. Every Nylas API, plus a local SQLite mirror, cross-grant search, and confirm-by-hash sending no other Nylas tool has.
Pp Nylas fits situations like: phrases: search my Nylas inbox across all grants; what changed in Nylas in the last 2 hours; first-response time on my Nylas threads; replay a Nylas webhook locally.
Run `npx skills add mvanhorn/printing-press-library --skill pp-nylas -a claude-code`. Or copy the skill folder (cli-skills/pp-nylas in mvanhorn/printing-press-library) into .claude/skills/pp-nylas in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mvanhorn/printing-press-library --skill pp-nylas -a codex`. Or copy the skill folder (cli-skills/pp-nylas in mvanhorn/printing-press-library) into .agents/skills/pp-nylas in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add mvanhorn/printing-press-library --skill pp-nylas -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pp-nylas, .gemini/skills/pp-nylas, .github/skills/pp-nylas and .opencode/skills/pp-nylas in your project.
Going by SKILL.md and its folder, Pp Nylas needs the command-line tools its instructions call (claude, npx, go and jq) and credentials named NYLAS_API_KEY and NYLAS_ACCESS_TOKEN. Our summary lists: Node.js. Its frontmatter pre-approves these tools: Read, Bash.
SKILL.md names 2 domains. In commands or code: googleapis.com and graph.microsoft.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Pp Nylas is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 11k tokens (SKILL.md is roughly 43k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Pp Nylas: Ar Io Gateway Operator (ar-io/ar-io-node, 127 stars), Aqua Communication (quailyquaily/aqua, 258 stars), Watcher Creator (asheshgoplani/agent-deck, 1k stars) and E2a Doctor (tokencanopy/e2a, 192 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
mvanhorn (a GitHub user) maintains it in mvanhorn/printing-press-library, which has 2,053 GitHub stars. The repository holds 505 skills in this directory. The repository was last updated on October 7, 2026.
Source: mvanhorn/printing-press-library on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.