From 6c5f9aaef31a6116c95d51e8da1358b0a944e0d6 Mon Sep 17 00:00:00 2001 From: Nick Barraclough Date: Wed, 6 May 2026 14:52:53 -0600 Subject: [PATCH] docs: refresh README to match converged Nylas SDK style Aligns the Ruby SDK README with the visual + structural conventions shared across the official Nylas SDKs (centered HTML header, badge row, dot-separated quick links, emoji-prefixed sections). Removes stale v3-beta and pre-v3 dashboard links; cross-links heavily to developer.nylas.com instead of duplicating content. Adds AI agents, security, sibling-SDKs, and reference sections, plus a Ruby-specific note on the tuple return convention and pagination via next_cursor. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 182 +++++++++++++++++++++++++++------------- diagrams/nylas-logo.png | Bin 0 -> 24968 bytes 2 files changed, 123 insertions(+), 59 deletions(-) create mode 100644 diagrams/nylas-logo.png diff --git a/README.md b/README.md index 3c584b54..b80499be 100644 --- a/README.md +++ b/README.md @@ -1,121 +1,185 @@ - - Aimeos logo - +
+ + Nylas + -# Nylas Ruby SDK +

Nylas Ruby SDK

-[![Gem (including prereleases)](https://img.shields.io/gem/v/nylas?include_prereleases)](https://rubygems.org/gems/nylas) -[![codecov](https://codecov.io/gh/nylas/nylas-ruby/branch/main/graph/badge.svg?token=IKH0YMH4KA)](https://codecov.io/gh/nylas/nylas-ruby) +

+ The official Ruby SDK for Nylas β€” the infrastructure that powers communications +

-This is the GitHub repository for the Nylas Ruby SDK. This repo is primarily for anyone who wants to make contributions to the SDK or install it from source. For documentation on how to use this SDK to access the Nylas Email, Calendar, or Contacts APIs, see the official [Ruby SDK Quickstart Guide](https://developer.nylas.com/docs/sdks/ruby/). +

+ version + code coverage + downloads + license +

-The Nylas Communications Platform provides REST APIs for [Email](https://developer.nylas.com/docs/email/), [Calendar](https://developer.nylas.com/docs/calendar/), and [Contacts](https://developer.nylas.com/docs/contacts/), and the Nylas SDK is the quickest way to build your integration using Ruby. +

+ πŸ“– SDK Guide Β· + πŸ“š API Reference Β· + πŸš€ Sign up Β· + πŸ’‘ Samples Β· + πŸ’¬ Forum +

+
-Here are some resources to help you get started: +
-- [Sign up for the Nylas v3 Beta program to access the v3 Dashboard](https://info.nylas.com/apiv3betasignup.html?utm_source=github&utm_medium=devrel-surfaces&utm_campaign=&utm_content=ruby-sdk-upgrade) -- [Nylas API v3 Quickstart Guide](https://developer.nylas.com/docs/v3-beta/v3-quickstart/) -- [Nylas SDK Reference](https://nylas-ruby-sdk-reference.pages.dev/) -- [Nylas API Reference](https://developer.nylas.com/docs/api/v3-beta/) -- [Nylas Samples repo for code samples and example applications](https://github.com/orgs/nylas-samples/repositories?q=&type=all&language=ruby) +The official Ruby SDK for [Nylas](https://developer.nylas.com/docs/v3/) β€” the infrastructure that powers communications. Integrate with Gmail, Microsoft, IMAP, Zoom, and 250+ email, calendar, and meeting providers in 5 minutes. Covers [Email](https://developer.nylas.com/docs/v3/email/), [Calendar](https://developer.nylas.com/docs/v3/calendar/), [Contacts](https://developer.nylas.com/docs/v3/email/contacts/), [Scheduler](https://developer.nylas.com/docs/v3/scheduler/), [Notetaker](https://developer.nylas.com/docs/v3/notetaker/), and [Agent Accounts](https://developer.nylas.com/docs/v3/agent-accounts/). -If you have a question about the Nylas Communications Platform, [contact Nylas Support](https://support.nylas.com/) for help. +This repository is for contributors and anyone installing the SDK from source. If you just want to use the SDK in your app, head straight to the **[Ruby SDK guide](https://developer.nylas.com/docs/v3/sdks/ruby/)** on developer.nylas.com. -## βš™οΈ Install +## Get started -### Prerequisites +1. [Sign up for a free Nylas account](https://dashboard-v3.nylas.com/register). +2. Follow the [getting started guide](https://developer.nylas.com/docs/v3/getting-started/) to provision an application and create your API key. +3. Bootstrap a project with the Nylas CLI: -- Ruby 3.0 or above. -- Ruby Frameworks: `httparty` and `yajl-ruby`. + ```bash + brew install nylas/nylas-cli/nylas + nylas init + ``` -### Install +## βš™οΈ Install -Add this line to your application's Gemfile: +> **Requirements:** Ruby 3.0 or later. + +Add the gem to your Gemfile: ```ruby -gem 'nylas' +gem "nylas" ``` -And then execute: +Then install: ```bash -bundle +bundle install ``` -To run scripts that use the Nylas Ruby SDK, install the `nylas` gem. +Or install it directly: ```bash gem install nylas ``` -To install the SDK from source, clone this repo and install with bundle. +### Build from source ```bash -git clone https://github.com/nylas/nylas-ruby.git && cd nylas-ruby +git clone https://github.com/nylas/nylas-ruby.git +cd nylas-ruby bundle install ``` -### Set up Ruby SDK for Development +Run the test suite with `rspec spec`. -Install [RubyGems](https://rubygems.org/pages/download) if you don't already have it: +## ⚑️ Usage -```shell -gem install bundler -gem update --system -``` +Initialize the client with your API key: -Install the SDK from source +```ruby +require "nylas" -```shell -bundle install +nylas = Nylas::Client.new( + api_key: "NYLAS_API_KEY" +) ``` -You can run tests locally using ```rspec```: +Then make a request β€” for example, list a grant's calendars: -```shell -rspec spec +```ruby +calendars, request_id, next_cursor = nylas.calendars.list(identifier: "GRANT_ID") ``` -## ⚑️ Usage +Every SDK call returns a tuple. List endpoints return `[data, request_id, next_cursor, headers]`; single-record endpoints return `[data, request_id]`. Destructure the elements you need and ignore the rest with `_`. Use `next_cursor` to paginate: -To use this SDK, you must first [sign up for the v3 Beta and get a free Nylas account](https://info.nylas.com/apiv3betasignup.html?utm_source=github&utm_medium=devrel-surfaces&utm_campaign=&utm_content=ruby-sdk-upgrade). +```ruby +cursor = nil +loop do + page, _request_id, cursor = nylas.calendars.list( + identifier: "GRANT_ID", + query_params: { page_token: cursor } + ) + page.each { |calendar| puts calendar[:name] } + break unless cursor +end +``` -Then, follow the Quickstart guide to [set up your first app and get your API keys](https://developer.nylas.com/docs/v3-beta/v3-quickstart/). +For step-by-step walkthroughs, see the developer guides: -For code examples that demonstrate how to use this SDK, take a look at our [Ruby repos in the Nylas Samples collection](https://github.com/orgs/nylas-samples/repositories?q=&type=all&language=ruby). +- [Email](https://developer.nylas.com/docs/v3/email/) +- [Calendar](https://developer.nylas.com/docs/v3/calendar/) +- [Scheduler](https://developer.nylas.com/docs/v3/scheduler/) +- [Notetaker](https://developer.nylas.com/docs/v3/notetaker/) +- [Agent Accounts](https://developer.nylas.com/docs/v3/agent-accounts/) +- [Notifications & webhooks](https://developer.nylas.com/docs/v3/notifications/) -### πŸš€ Making Your First Request +### Error handling -All of the functionality of the Nylas Communications Platform is available through the `Client` object. To access data for an account that’s connected to Nylas, create a new API client object and pass in your Nylas API key. In the following example, replace `NYLAS_API_KEY` with your Nylas API Key, and you can provide other additional configurations such as the Nylas API url and the timeout. +The SDK raises typed errors you can rescue. API failures raise `Nylas::NylasApiError` (with `type`, `status_code`, `request_id`, `provider_error`, `headers`); OAuth failures raise `Nylas::NylasOAuthError`; request timeouts raise `Nylas::NylasSdkTimeoutError`. ```ruby -require 'nylas' +begin + nylas.messages.find(identifier: "GRANT_ID", message_id: "MESSAGE_ID") +rescue Nylas::NylasApiError => e + warn "Nylas API error #{e.status_code} (#{e.type}): #{e.message}" +rescue Nylas::NylasSdkTimeoutError => e + warn "Request to #{e.url} timed out after #{e.timeout}s" +end +``` -nylas = Nylas::Client.new( - api_key: "NYLAS_API_KEY", -) +## πŸ’‘ Examples + +- Local examples live in [`examples/`](examples/) (messages, events, folders, notetaker). +- The [Nylas Samples org](https://github.com/orgs/nylas-samples/repositories?q=ruby) has end-to-end Ruby apps you can clone and run. + +## πŸ€– AI agents + +[nylas/skills](https://github.com/nylas/skills) drops Nylas into Claude Code, Cursor, Codex, and other agents that support the skills format: + +```bash +npx skills add nylas/skills +/plugin marketplace add nylas/skills # Claude Code ``` -Now, you can use `nylas` to access full email, calendar, and contacts functionality, for example to list all the calendars for a given account: +The CLI also installs an MCP server for Claude Desktop, Claude Code, Cursor, Windsurf, or VS Code: -```ruby -calendars, _request_ids = nylas.calendars.list(identifier: "GRANT_ID") +```bash +brew install nylas/nylas-cli/nylas +nylas mcp install ``` -## πŸ“š Documentation +Walkthrough: [give AI agents email access via MCP](https://cli.nylas.com/guides/give-ai-agents-email-access-via-mcp). -Nylas maintains a [reference guide for the Ruby SDK](https://nylas-ruby-sdk-reference.pages.dev/) to help you get familiar with the available methods and classes. +## πŸ“š Reference -## ✨ Upgrading from 5.x +- [Ruby SDK guide](https://developer.nylas.com/docs/v3/sdks/ruby/) +- [API reference](https://developer.nylas.com/docs/api/v3/) +- [Getting started](https://developer.nylas.com/docs/v3/getting-started/) +- [Email](https://developer.nylas.com/docs/v3/email/) Β· [Calendar](https://developer.nylas.com/docs/v3/calendar/) Β· [Scheduler](https://developer.nylas.com/docs/v3/scheduler/) Β· [Notetaker](https://developer.nylas.com/docs/v3/notetaker/) Β· [Agent Accounts](https://developer.nylas.com/docs/v3/agent-accounts/) Β· [Notifications](https://developer.nylas.com/docs/v3/notifications/) +- [Data residency](https://developer.nylas.com/docs/dev-guide/platform/data-residency/) +- [Nylas CLI](https://cli.nylas.com) +- [Forum](https://forums.nylas.com) -See [UPGRADE.md](UPGRADE.md) for instructions on upgrading from 5.x to 6.x. +## ✨ Upgrading -**Note**: The Ruby SDK v6.x is not compatible with the Nylas API earlier than v3-beta. If you are using Nylas v2.7 or earlier, continue using the v5.x Nylas Ruby SDK. +See [CHANGELOG.md](CHANGELOG.md) for release notes, and [UPGRADE.md](UPGRADE.md) for the 5.x β†’ 6.x migration guide. The 6.x line targets Nylas API v3; if you're still on v2.7 or earlier, stay on the 5.x SDK. ## πŸ’™ Contributing -Please refer to [Contributing](Contributing.md) for information about how to make contributions to this project. We welcome questions, bug reports, and pull requests. +Bug reports, questions, and pull requests are welcome. See [Contributing.md](Contributing.md) for the workflow, and the [Nylas Forum](https://forums.nylas.com) for broader discussion. + +## πŸ”’ Security + +To report a security vulnerability, follow the [Nylas Vulnerability Disclosure Policy](https://www.nylas.com/security/vulnerability-disclosure-policy/). Please don't open a public GitHub issue for security reports. + +## πŸ”— Other Nylas SDKs + +- [nylas-nodejs](https://github.com/nylas/nylas-nodejs) +- [nylas-python](https://github.com/nylas/nylas-python) +- [nylas-java](https://github.com/nylas/nylas-java) (Java & Kotlin) ## πŸ“ License -This project is licensed under the terms of the MIT license. Please refer to [LICENSE](LICENSE.txt) for the full terms. +MIT β€” see [LICENSE.txt](LICENSE.txt). diff --git a/diagrams/nylas-logo.png b/diagrams/nylas-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..87ad1f17660a56f91345697b5296a52f84033bf6 GIT binary patch literal 24968 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