Connector
An MCP server at https://api.useopyt.com/mcp. It lets
claude.ai, chatgpt.com and other MCP clients use the library Opyt builds on your Mac:
search it, open an item, summarize it, see what is new, and put the sources behind an
answer on one reader-view page. It can also save a link, follow a topic, add a person,
remove an item, and invite or cut off a reader. Changes to the library are made by Opyt
on your Mac: while you wait when the Mac is awake, otherwise when it is next on.
| Endpoint | https://api.useopyt.com/mcp, MCP over
Streamable HTTP |
| Sign-in | OAuth 2.1 with PKCE and dynamic client registration, through your Google account. No client ID or secret to enter. |
| Google scopes | openid only |
| Tools | Twelve. Five Read: search,
open, aggregate, latest,
status. Seven Write: reader_view,
share, unshare, hopper, forget,
watch, add_oracle |
| Write tools | reader_view makes a page of
sources on Opyt's server, where anyone with its link can comment. share makes an invite and
unshare cuts one reader off. hopper saves a link,
watch follows a topic, add_oracle adds a person and
forget removes an item or stops following a person. Two are destructive:
forget and unshare. No payments and no messages. |
| Price | Free. Opyt has no plans and takes no payments. |
| Requires | Opyt set up on a Mac (macOS only) and connected to the same Google account you sign in with here |
| Regions | None set by Opyt |
| Age | 13 or older (terms) |
| Support | hello@useopyt.com |
Updated 2026-10-13. Privacy policy: useopyt.com/privacy.
Before you start
The connector is for people who use Opyt on a Mac and want to use their library from somewhere else: claude.ai or chatgpt.com in a browser or on a phone, or any MCP client that connects to remote servers. The library holds the posts, articles, papers and repositories Opyt collected for you: what you saved, and what the people you chose to follow published. The connector serves a copy of it, and only to you.
Setup
Three parts, in order: Opyt on your Mac, the link to your Google account, then the connector in your client.
openid scope only.https://api.useopyt.com/mcp. It is an address to paste, not a page
to visit. Name it Opyt if asked, leave Advanced settings alone (no client ID, no
secret), and click Add.https://api.useopyt.com/mcp into
MCP server URL.A client that connects to remote MCP servers with OAuth needs only the address
https://api.useopyt.com/mcp. It registers itself, so there is no client ID or
secret to enter, and the sign-in is the same: Allow Access on the Opyt page, then
Google.
Then ask about your library. If the connector answers that no library is connected, see status and errors.
Authentication
| Endpoint | https://api.useopyt.com/mcp: MCP
Streamable HTTP, stateless, JSON answers |
| Discovery | /.well-known/oauth-protected-resource/mcp
(RFC 9728) and /.well-known/oauth-authorization-server (RFC 8414), on
api.useopyt.com |
| Registration | https://api.useopyt.com/register,
dynamic client registration (RFC 7591). Clients are public: no secret. |
| Flow | Authorization code with PKCE (S256), then
refresh tokens |
| Tokens | Bearer, in the Authorization header |
| Revocation | https://api.useopyt.com/revoke
(RFC 7009), for an access or a refresh token |
| Google scopes | openid only |
A request with no token gets HTTP 401 and a WWW-Authenticate header that
points to the discovery document. That is how a client knows to start the sign-in.
The consent page. Before Google, an Opyt page titled “Application Access Request” names the application asking (for example Claude or ChatGPT), says it wants to access the MCP server Opyt, and shows the address the sign-in will be sent back to. Allow Access continues to Google; Deny stops. It appears on every new sign-in.
Google. Google then asks you to sign in and approve. Opyt uses one value from the
sign-in: your Google account ID (sub), to find the library you linked from
your Mac. It asks Google for openid only, so the sign-in carries no email
address and no name. The connector gets no access to Gmail, Drive, contacts or anything else in your
Google account, and your password goes only to Google.
Permissions. A token can call all twelve tools: five read the library, three
write what Opyt's server holds for it (a page of sources, an invite, a reader's access),
and four ask Opyt on your Mac to change the library. A token reaches only the library
linked to the Google account that signed in: it reads that one, changes that one, takes
down only the pages it made and cuts off only its readers. A call from any other account
answers no_library.
Lifetimes and revoking. Access tokens follow Google's lifetime (about an hour),
and your client refreshes them. A client that revokes its token, as clients may when you
disconnect the connector, ends that sign-in at once: Opyt deletes the Google sign-in
behind it and asks Google to revoke it. Removing Opyt's access from your Google account ends
the sign-in too. Saying “unshare” in Opyt on your Mac deletes the Google link, after which
every call answers no_library.
Tools
Twelve tools. Five are classified Read: none creates, changes or deletes data,
changes permissions, or acts on your behalf. Each declares the MCP annotations
readOnlyHint: true, destructiveHint: false,
idempotentHint: true and openWorldHint: false. Seven are
Write, each with readOnlyHint: false:
reader_view, share, hopper,
watch and add_oracle declare
destructiveHint: false, idempotentHint: false and
openWorldHint: true.forget and unshare take something away and cannot be
undone. They declare destructiveHint: true,
idempotentHint: true and openWorldHint: false, so a client
that asks before destructive tools asks before each. Both also preview first and act
only with confirm=True.Every tool returns a JSON object.
| Tool | Classification | What it does |
|---|---|---|
| search | read · not sensitive | Keyword search over the library, filtered by author, source, kind, tags and date. |
| open | read · not sensitive | One item in full: its stored text, source link and dates. |
| aggregate | read · not sensitive | Counts by kind and source, the most frequent authors, and the newest item descriptions. |
| latest | read · not sensitive | What arrived most recently, with a cursor to read on. |
| status | read · not sensitive | Whether a library is linked, how many items it holds, and when it was last published. |
| reader_view | write · not sensitive | Puts the sources behind an answer on one private page, or takes one down. |
| share | write · not sensitive | Makes a one-time invite for one person to search the library, or for an agent you run. |
| unshare | write · destructive | Cuts off one person or agent you invited. |
| hopper | write · not sensitive | Saves one link into the library: a paper, a repository, a post or an article. |
| forget | write · destructive | Removes items from the library, or stops following one person. |
| watch | write · not sensitive | Follows a topic: what to search for every day, and which of your people write about it. |
| add_oracle | write · not sensitive | Adds a person whose writing the library collects from then on. |
Changes to the library. The library lives on your Mac, and no tool
writes to the copy the connector reads. So hopper, forget,
watch and add_oracle hand the change to Opyt on your Mac, which
makes it and uploads the result. With the Mac awake, the answer comes back while the
assistant waits, within about 25 seconds. Otherwise the answer's status says
where it stands:
working: it is being done now.later: your Mac is asleep or off. The change is kept for a week and made
when the Mac is next on with Opyt running; after a week it is dropped.When a change finishes after its answer was given, the next answer of any tool carries
one line about it under earlier, once, and status lists recent
changes with how each ended.
Searches the library by keyword (BM25). It matches the words in
query, not their meaning, so several short searches in the words a source
would use find more than one long question. Each hit is a card with a snippet, not a
statement of what the source says: open it before quoting it. Title
annotation: “Search your library”.
search(query, who=None, who_id=None, source_type=None, what_kind=None,
tags=None, date_from=None, date_to=None, k=8, offset=0) -> dict
"@name"), profile URL or id.
It matches only people already in the library; a name it does not know matches
nothing, and a notice says so."x" · "github" ·
"substack" · "blog" · "paper"."opinion" (posts) or "artifact"
(repositories, papers)."ai-agents"). An item matches
if it carries any of them."2026",
"2026-05" or "2026-05-11". A partial date widens to its
natural edge, so "2026" means 2026-01-01."2026" means 2026-12-31. Items with no date are left out when either
bound is set.80next_offset of the
previous page of the same search. Pages reach the first 250 results.atom_id (pass it to
open), cite (a Markdown link to the source: write the
item's name inside it), source_url, who_name,
who_id, when_ts, source_type,
what_kind, description, snippet,
score, body_state and payload
(source-specific counts such as likes or stars).k (with the offset of
the next page).offset, with the same query and filters, for the next page. Null on the
last one. Pages continue one ranking, so nothing repeats or is skipped.authors,
sources, topics, date_span,
corpus_newest (when the library last took an item in), and
resolved_who when who was given.ran (always
"bm25" here), the candidate and ranked counts, and the filters as
applied.{hits, candidates}: items the owner's standing
keyword searches found, rather than saved or written by someone they follow,
ranked separately from hits.no_library or not_arrived: see
status and errors.query or an argument of the wrong type
returns an MCP tool error (isError: true) whose text names the
problem.offset of 250 or more answers an error that says to
narrow the search instead; it is not counted as a read.One item from the library: its stored text, source link and dates. A
text longer than 60,000 characters comes in pages. body_state says whether
the text in the answer is the whole source; a partial text should not be presented as
complete. Title annotation: “Open an item”.
open(atom_id, offset=0) -> dict
search hit, an aggregate row or
a latest item.0next_offset of the previous page.body_state "partial"."complete" · "partial" ·
"absent" · "pending", with body_basis
saying how that was decided.atom_id, source_type,
what_kind, who_id, when_ts,
when_precision, description,
raw_available, payload.atom_id answers {"atom_id": …, "error": "not
found"}, an ordinary answer rather than a tool error.offset outside the text answers an error that gives
the text's length; it is not counted as a read.no_library or not_arrived: see
status and errors.What the library holds over an optional scope: counts by kind and source, the most frequent authors, and the newest item descriptions. With no arguments, the whole library. Title annotation: “Summarize your library”.
aggregate(tags=None, what_kind=None, source_type=None,
who_id=None, date_from=None, date_to=None) -> dict
search."opinion" or "artifact".search.search(who=…)'s insights.resolved_who.search.search.{who_id, count}.{atom_id, description,
who_id, when_ts}.scope (as applied) and notices.total: 0 with a notice.no_library or not_arrived: see
status and errors.What arrived in the library most recently, oldest first: items the
owner saved, and items the people they follow wrote or linked to. With no cursor, the newest
limit items. To read on, pass the previous answer's next
values back as since and since_id. It records nothing about
what was shown. Title annotation: “What's new”.
latest(since=None, since_id=None, limit=50) -> dict
next.since from a previous answer: when an item
entered the library.next.since_id from the same answer, which breaks
ties between items that arrived in the same second.50atom_id, description,
source_url, who, who_id,
when_ts (published), seen_at (entered the library),
source_type, what_kind and
entry_mode.{since, since_id}: pass these back to continue. An
empty page echoes the cursor it was given.notices.no_library or not_arrived: see
status and errors.Whether this Google account has a library here, how many items it holds, when it was last published, and what you asked to change in it lately. Title annotation: “Library status”.
status() -> dict
"ready", or the same no_library and
not_arrived answers every tool gives."YYYY-MM-DD HH:MM:SS"."keyword".tool, asked (UTC),
args and answer, the answer that tool gives now. A long
watch preview is read from here once it is done.Puts the sources behind an answer on one page at Opyt's server: every post and thread with its photos and video, every article in full, a repository's README, a paper as its PDF. The assistant names the items, since Opyt cannot see the conversation. Title annotation: “Reader view of sources”.
reader_view(atom_ids=None, title=None, note=None, delete=None) -> dict
atom_id of search hits or open results. At most 50."made" · "deleted" ·
"not_found" · "refused", with a
message.made: the page's link, the day it expires, and
any ids that are not in the library and so are not on the page.not_found: none of the ids is in the library, or no page this library
made has that link.refused: no items, or more than 50.no_library or not_arrived: see
status and errors.Saves one link into the library: a research paper, a GitHub repository, a Substack post, an article or blog post, or one X post. One step, with no preview: the assistant reads the link itself first. Video and audio pages cannot be read. Title annotation: “Save a link”.
hopper(reference, kind_hint=None) -> dict
"substack" for a Substack post on its own domain."saved" · "already_present" · "blocked" (the site turned the read away; worth another try later) · "failed" · "unroutable", each with its reason; or "working" · "later": not done yet, see changes to the library.saved and already_present: the item's id. search and open find it here a minute or two later.saved: it was stored without its title, date or author.failed, blocked or unroutable: nothing was stored.no_library or not_arrived: see status and errors.Removes items from the library for good, or stops following one person while keeping what the library already holds from them. Give exactly one of atom_id, atom_ids or oracle. Two steps: a preview, then the removal. Title annotation: “Forget an item or Oracle”.
forget(atom_id=None, atom_ids=None, oracle=None, confirm=False) -> dict
atom_id of a search hit or an open result.who_id from a search hit.False"preview" · "forgotten" · "not_found" · "ambiguous" (several people match, with candidates) · "error"; or "working" · "later": not done yet, see changes to the library.atom_id, description, author (who_id), date and source_url.not_found: no such item or person; nothing was removed.no_library or not_arrived: see status and errors.Follows topics: you say what you want to stay up to date on, and Opyt searches for it every day, outside the library (new papers, repositories, X posts and Substack posts) and among the posts of the people you follow. Title annotation: “Follow topics”.
watch(action, name=None, watches=None, words=None, people=None, topic_id=None, drop_watches=None) -> dict
"preview" (what a topic would have found last month; writes nothing) · "create" · "edit" · "drop" (stop following) · "list".{"name": "Boltz-2", "sources": ["github", "openalex"]}. Each may carry spellings, sources and, for X, context words.list or create."preview" · "ok" · "refused" · "error"; "working" · "later": not done yet, see changes to the library. "unavailable": a list or a preview was asked for while your Mac is off, and there is nothing to do later.ok: the topic as it now stands.working, status returns the preview once it is done.latest does not list them: it shows what has entered the library.refused or error: the reason says why; nothing changed.no_library or not_arrived: see status and errors.Adds one person to those the library follows, so their writing is collected from then on: their X posts when your X is connected, their Substack or blog, their papers. One step, with no preview: the assistant confirms with you who the person is first, looking them up with its own web search when unsure. Title annotation: “Add an Oracle”.
add_oracle(reference, x_lookback=None, web_lookback=None, scholar_lookback=None, scholar_topics=None) -> dict
"@karpathy") or the URL of their Substack, blog or site. A name alone cannot be added."6mo" (the default), "1yr" or "2yr"; "since_last" brings someone already added up to date."1yr", "2yr", "5yr" or "all" (the default)."2yr", "5yr", "10yr" or "all" (the default)."added" · "not_added", with the reason in message; or "working" · "later": not done yet, see changes to the library.added: who was added, and whether the library already followed them.not_added: the reference could not be resolved to a person or site; nothing was written.no_library or not_arrived: see status and errors.Examples
Each works on any library once the connector is on in the chat. The items named in the answer come back as links to their sources.
| Ask | What the assistant does |
|---|---|
| “Using Opyt, what have the people I follow said about AI agents this year? Quote the two strongest points and link them.” | search with a date
filter, then open on the best hits to quote their own text. |
| “What's new in my Opyt library since last week?” | latest,
then a short list of what arrived, each with its link. |
| “Give me an overview of my Opyt library: who is in it, what kinds of sources, and what came in most recently.” | aggregate (and
status for its size and when it was last updated). |
| “Find the most recent paper in my Opyt library and summarize it, with its link.” | search or latest to find it, then
open, reading a long paper page by page. |
| “Save this paper to my Opyt library: arxiv.org/abs/…” | Reads the link,
then hopper. With your Mac on it answers that it is saved; a search
finds it a minute or two later. |
| “Keep me up to date on Boltz-2 in Opyt.” | watch with
preview, shows what it would have found last month, then
create when you agree. |
| “Add @karpathy to the people I follow in Opyt.” | Confirms with you who
that is, then add_oracle. Their writing arrives over the following
hours. |
| “Remove that post from my Opyt library.” | forget as a
preview, reads you what would go, then forget with
confirm when you say yes. |
| “Give Maya access to my Opyt library.” | share as a preview,
then with confirm: a one-time link for you to send her. |
Status handling
The two status answers come back from every tool as an ordinary answer,
{"status": …, "message": …}, whose message says what to do in plain words.
| Answer | Meaning | What to do |
|---|---|---|
| ready | From status: a library is linked and
published. | Read it. |
| no_library | No library is linked to the Google account that signed in. | Set up Opyt on a Mac and say “connect Opyt to Google” there with this same account, or reconnect the connector with the account you linked. The message points to this page. |
| not_arrived | The account is linked, but the Mac has not published a copy yet. | Leave the Mac awake with Opyt set up. The first copy usually lands within minutes of connecting. |
| error: "not found" | From open: no item has that
id in this library. | Use an id from search,
aggregate or latest. |
| working | From a change to the library: Opyt on the Mac is making it now, and it took longer than the answer waited. | Nothing.
status says how it ended, and the next answer carries a line about it
under earlier. |
| later | From a change to the library: the Mac is asleep or off, or Opyt is not running there. | Nothing, or wake the Mac. The change is made when it is next on, within a week. |
| unavailable | From watch: a list or a preview of
topics was asked for while the Mac is off. | Ask again when the Mac is on. |
| failed | From a change to the library: Opyt on the Mac could not make it. | The message says why. |
| tool error | An MCP tool error (isError: true): an
argument is missing or has the wrong type, or a date is malformed. | The error text names the problem. Fix it and call again. |
| HTTP 401 | No token, or an expired or revoked one. | The
client signs in again; the WWW-Authenticate header points to the
discovery document. |
| HTTP 503 | The server is handling its limit of 256 requests at once. | Retry after a short wait. |
Freshness. The connector serves a copy, not the Mac's live library. The Mac
uploads a new copy about once an hour while it is awake, when the library has changed.
Saying “update my shared library” in Opyt on the Mac uploads one at once. status's
last_published_at says when the current copy was uploaded, and
search's insights.corpus_newest says when the library in that
copy last took an item in. The copy only moves while the Mac is awake.
Troubleshooting
| What you see | Why | What to do |
|---|---|---|
| The app can't add or reach the connector | The address is mistyped, or on chatgpt.com developer mode is off. | Use exactly
https://api.useopyt.com/mcp. On chatgpt.com, developer mode needs a paid
plan and has to be switched on first. |
| Google's sign-in page shows an error | The sign-in did not finish. | Close it and connect again. If it repeats, write to hello@useopyt.com with the error text. |
| Every answer says no Opyt library is connected | You signed in with a different Google account from the one your Mac is connected to. | Disconnect the connector and connect again with that account, or say “connect Opyt to Google” on the Mac with the account you signed in with here. |
| It says the library has not been published yet | The Mac has not uploaded a copy: it is asleep, or Opyt is not running there. | Wake the Mac and open the app Opyt is set up in. Saying “update my shared library” there uploads at once. |
| Answers miss what you saved in the last hour | The connector reads a copy, which the Mac updates about once an hour. | Say “update my shared library” on the
Mac. status shows when the copy was last updated. |
| A search finds nothing on a subject you know is there | Search matches words, not meaning. | Ask again in the words the source would use, or with fewer words. A person's name only filters to people you follow in Opyt. |
| A save or another change says it will happen when your computer is next on | The Mac is asleep or off, or Opyt is not running on it. Changes to the library are made there. | Wake the Mac and open the app Opyt is set up in. The change is made within moments, and the next answer says so. |
| It says that though the Mac is on | Opyt on the Mac is older than this feature. It updates itself within about six hours of a new release. | Leave the Mac on. The change is kept for a week and made once Opyt has updated. |
| You are not sure a change went through | — | Ask for the library's status: it lists what you asked to change lately and how each ended. |
| Something you saved is not in search yet | The Mac saved it, and the connector's copy follows at the next upload. | Ask again in a minute or two. |
| A long article or paper looks cut off | Texts over 60,000 characters come in pages. | Ask the assistant to read the rest; it continues with
next_offset. |
| It worked, then every answer says no library | “unshare” on the Mac deleted the copy and the Google link. | Say “connect Opyt to Google” on the Mac again. |
| You want to disconnect | — | Remove the connector in the app's connector settings. To also remove Opyt's access to your Google account, use myaccount.google.com/connections. |
Anything else: hello@useopyt.com.
Limits
| search | k defaults to 8, at most 25 hits a page;
more come in pages (offset, next_offset), to the first
250 |
| open | raw at most 60,000 characters; a longer
text comes in pages (offset, next_offset) |
| latest | limit defaults to 50, from 1 to 100
items |
| aggregate | Up to 15 authors and 12 recent descriptions; the counts cover the whole scope |
| status | A small answer, with the last ten changes |
| reader_view | At most 50 items a page |
| hopper, forget, watch, add_oracle | The answer waits up to about 25 seconds for the Mac; a change not made within a week is dropped |
These per-answer caps are the connector's only limits. It sets no request quota per account. They keep every answer under about 65,000 characters (measured on a library of 8,937 items), inside the limits chat apps put on a tool result.
Data
In short; the privacy policy has the full detail.
Deleting it. Say “unshare” in Opyt on your Mac and confirm. That deletes everything Opyt's server holds for your library: the copy, the Google link, every invite and every reader's and agent's key, the changes waiting for your Mac, its reader-view pages and the read counts. The library on your Mac stays, and nothing is uploaded again unless you share or connect to Google again. If you no longer have the Mac, email hello@useopyt.com and the same things are deleted. A client that revokes its token ends that sign-in, and its Google sign-in is deleted.
Agents
An agent that is not an MCP client, one that can only call web addresses, uses a library over plain HTTPS with a key it gets by redeeming an invite link. There is no Google sign-in on this path: the key names the library.
share). It searches
and opens the library and can change nothing.agent=True, for an
agent you run yourself. It reads the library and also acts as you: every write tool on
this page has a route of the same name, such as
POST https://api.useopyt.com/v1/library/hopper, with the same arguments
and the same answers. It cannot make an invite for another agent.forget or
unshare happens. Give an agent key only to an agent you trust with your
library.unshare with its name, here or in Opyt on your
Mac. Its next call is refused.The routes, the redeem call and the answers are documented for agents in llms.txt, under “Reading a shared knowledge base over plain HTTPS”.
Support
Opyt is operated from the United States. Contact for anything on this page: hello@useopyt.com.