Skip to content

smry Product

by r.smry.ai · remote · no sign-in to list tools · v1.0.0 · published by ai.smry.r

Read public sources and manage a smry library, feeds, notes, highlights, files, and page monitors.

Deletes · 9Changes · 5

28 tools: 9 can delete or cancel things, 5 change things and 14 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http smry-product https://api.smry.ai/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "open_web_pages" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "open_web_pages" says "open": a word for a change.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

28 tools

Deletes or cancels 9Claude Code: deny
  • create_monitorCreate a scheduled web-change monitor whose detected changes arrive as an ordinary followed source — query, watch, and mutate it like any feed.No findings

    Why it is in this group

    • The name "create_monitor" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Create a scheduled web-change monitor whose detected changes arrive as an ordinary followed source — query, watch, and mutate it like any feed. Naming a collection that does not exist creates it. Active monitor limits are Free 3, Patron 10, and Pro 100; scheduled monthly credits are 150, 720, and 7,200, respectively. Page and sitemap runs reserve 1 credit; extract runs reserve 10. The shortest interval is 60 minutes and the default schedule is daily. The response reports remaining slots and scheduled credits. Example: {"name":"Example page changes","target":{"type":"page","url":"https://example.com"},"collection":"Research"}

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
  • create_news_queryCreates a Collection-compatible news query.No findings

    Why it is in this group

    • The name "create_news_query" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Creates a Collection-compatible news query. Google News RSS is the current adapter and is intentionally hidden behind this durable product type. Example: {"query":"open source databases","collection":"Research"}

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
  • follow_feedsFollow up to 20 feed or site URLs in one call.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Follow up to 20 feed or site URLs in one call. Site URLs are resolved to their published feed. Naming a collection that does not exist creates it. Returns a per-URL outcome — partial success is normal and legible, never all-or-nothing. Example: {"urls":["https://www.nasa.gov/feed/"],"collection":"Research"}

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
  • manage_collectionslist: Returns the same owner-scoped Collections shown in /feeds, including canonical filter state and revision.No findings

    Why it is in this group

    • The description's first verb is "list": a word for reading.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    list: Returns the same owner-scoped Collections shown in /feeds, including canonical filter state and revision. Required fields: none. Example: {"action":"list"} create: Creates the same named Collection used by the production /feeds UI. Required fields: name. Example: {"action":"create","name":"Research"} update: Membership is a complete replacement, matching the production Collection editor. Required fields: id. Example: {"action":"update","id":12,"name":"Engineering"} delete: Deletes a custom Collection and moves its inputs to Unsorted. Required fields: id. Example: {"action":"delete","id":12}

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
  • manage_feed_consumerscreate: Save a where predicate and let smry retain one processing checkpoint.No findings

    Why it is in this group

    • The description's first verb is "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    create: Save a where predicate and let smry retain one processing checkpoint. New consumers start at the current high-water mark, so they receive future discoveries rather than replaying history. For history, create the Consumer first, query the historical window separately, then poll; that order closes the query/create race. Create one per independent processing loop, not per source. Retrying the same case-insensitive name and predicate returns the existing Consumer; the same name with another predicate is a 409. Required fields: name. Example: {"action":"create","name":"Engineering briefing","where":{"collection":["Research"]}} list: List each saved consumer, its opaque acknowledged_cursor, delivery and acknowledgement timestamps, and how many matching entries are waiting past that checkpoint. Required fields: none. Example: {"action":"list"} ack: After processing every event returned by getFeedChanges for this consumer, acknowledge that response's next_cursor. Crashes before ack cause safe redelivery; stale, foreign, and invented cursors are rejected. Required fields: id, cursor. Example: {"action":"ack","id":7,"cursor":"<next_cursor from get_feed_changes>"} delete: Remove only the saved predicate and checkpoint. Followed sources, entries, and human read state are untouched. Required fields: id. Example: {"action":"delete","id":7}

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
  • manage_feed_filterpreview: Classifies a bounded recent sample and returns both binary decisions, uncertainty counts, reasons, and degradation status.No findings

    Why it is in this group

    • The description's first verb is "preview": a word for reading.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    preview: Classifies a bounded recent sample and returns both binary decisions, uncertainty counts, reasons, and degradation status. Save with applyFeedFilter using this preview token and Collection revision. Required fields: collection, filter. Example: {"action":"preview","collection":{"id":12},"filter":{"prompt":"Software engineering articles","whenUncertain":"include"}} apply: Atomically applies the exact preview when the Collection revision still matches. Passing a preview created with filter:null clears the filter. Required fields: previewToken, expectedRevision. Example: {"action":"apply","previewToken":"<previewToken from preview>","expectedRevision":0}

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
  • mutate_feedsPreview changes to matching sources, entries, or collections.No findings

    Why it is in this group

    • The description's first verb is "preview": a word for reading.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Preview changes to matching sources, entries, or collections. Default dry_run:true returns would_affect, sample, and commit_token without changing them. Commit by sending the same op and commit_token; retries replay the recorded result. Explicit dry_run:false applies immediately. sources.move needs set.collection; sources.rename needs set.title; collections.create/rename need set.name. Collections rename/delete need exactly one where.collection. Use manage_collections for direct collection CRUD. Check partial and each outcome after committing. Example: {"op":"collections.create","set":{"name":"Research"}} Example: {"op":"sources.move","where":{"source":{"include":[42]}},"set":{"collection":"Research"}} Example: {"op":"sources.move","commit_token":"<commit_token from preview>"}

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
  • remove_library_itemRemove one item from this account's library.No findings

    Why it is in this group

    • The name "remove_library_item" says "remove": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Remove one item from this account's library. Web sources are unaffected. For an uploaded file, its original, extracted text, and synced local copies are permanently deleted; highlights and notes are kept.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • set_feed_feedbackLess like this hides an included entry.No findings

    Why it is in this group

    • The name "set_feed_feedback" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Less like this hides an included entry. Feedback remains separate agent context and never silently revises the Collection filter. Example: {"entryId":42,"value":"less_like_this"}

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
Changes things 5Claude Code: ask
  • bulk_update_library_itemsAtomically move, tag, mark read, update progress, or correct classification for up to 100 library items.No findings

    Why it is in this group

    • The name "bulk_update_library_items" says "update": a word for a change.
    Description, as the server wrote it
    Atomically move, tag, mark read, update progress, or correct classification for up to 100 library items.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • open_web_pagesOpen up to four public pages.1 finding

    Why it is in this group

    • The name "open_web_pages" says "open": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "open_web_pages" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "open_web_pages" says "open": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Open up to four public pages. Pass a focused context to get only the passages relevant to that question (cheap and precise), or omit it to read the full page as clean Markdown with start-based pagination.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • save_articleSecurely extract a public URL and idempotently add it to the account's library.No findings

    Why it is in this group

    • The name "save_article" says "save": a word for a change.
    Description, as the server wrote it
    Securely extract a public URL and idempotently add it to the account's library. Returns alreadySaved=true for a duplicate and reports hard paywalls instead of claiming success.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • save_contentSave supplied source text without fetching a public URL.No findings

    Why it is in this group

    • The name "save_content" says "save": a word for a change.
    Description, as the server wrote it
    Save supplied source text without fetching a public URL. Use external_id for retry-safe creates; content_kind can correct automatic classification.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • update_library_itemMove, tag, mark read, update progress, or correct the classification of one library item.No findings

    Why it is in this group

    • The name "update_library_item" says "update": a word for a change.
    Description, as the server wrote it
    Move, tag, mark read, update progress, or correct the classification of one library item.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 14Claude Code: allow
  • discover_feed_inputsFind public feeds by topic or find a site's published feeds.No findings

    Why it is in this group

    • The description's first verb is "find": a word for reading.
    Description, as the server wrote it
    Find public feeds by topic or find a site's published feeds. This is the compact Developer API discovery adapter; use search_feeds for language, ranking, and source-type controls. Discovery does not subscribe; pass result feedUrl values to follow_feeds. Example: {"query":"https://www.nasa.gov","mode":"site"}

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_articleFetch clean, source-grounded text for a public article or YouTube URL, budgeted to a token limit and addressable by paragraph anchor.No findings

    Why it is in this group

    • The name "get_article" says "get": a word for reading.
    Description, as the server wrote it
    Fetch clean, source-grounded text for a public article or YouTube URL, budgeted to a token limit and addressable by paragraph anchor. Returns an outline of headings (empty when the source has none), the requested window, and a next_cursor when more remains. Prefer search_article when you have a specific question rather than needing the whole text.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • get_feed_changesOne stream, two checkpoint owners.No findings

    Why it is in this group

    • The name "get_feed_changes" says "get": a word for reading.
    Description, as the server wrote it
    One stream, two checkpoint owners. Stateful callers pass cursor:"latest", then store each next_cursor themselves; that first call only establishes the checkpoint and returns no events, so poll again with the returned next_cursor. Stateless scheduled agents pass consumer_id; smry retains the acknowledged position and the consumer's saved where predicate. Pass exactly one. Managed batches repeat until their next_cursor is acknowledged. Every response also carries a capped source-health attention block. To read what is already there rather than what changes next, use query_feeds. Example: {"cursor":"latest","limit":20} Example: {"consumer_id":7,"limit":20}

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_library_assetReturn an authenticated MCP resource link for an item's original file.No findings

    Why it is in this group

    • The name "get_library_asset" says "get": a word for reading.
    Description, as the server wrote it
    Return an authenticated MCP resource link for an item's original file. Set include_data=true to show images or audio inline, or embed another file up to 8 MiB. Larger originals remain readable through the streaming Developer API byte-range endpoint.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_library_changesRead the append-only library change stream, including deletions.No findings

    Why it is in this group

    • The name "get_library_changes" says "get": a word for reading.
    Description, as the server wrote it
    Read the append-only library change stream, including deletions. For a race-free first sync, call once with cursor=latest, list the library, then continue from the returned nextCursor.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_library_objectRead one object returned by list_library_objects.No findings

    Why it is in this group

    • The name "get_library_object" says "get": a word for reading.
    Description, as the server wrote it
    Read one object returned by list_library_objects. Item text and note/highlight bodies are bounded; item asset metadata includes the MCP resource URI for original bytes.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_saved_articleRead one library item by id.No findings

    Why it is in this group

    • The name "get_saved_article" says "get": a word for reading.
    Description, as the server wrote it
    Read one library item by id. Stored article text is token-budgeted and supports a paragraph cursor so long documents never flood the agent context.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_librarySearch this account's articles, websites, books, emails, PDFs, social posts, videos, podcast episodes, and documents.No findings

    Why it is in this group

    • The name "list_library" says "list": a word for reading.
    Description, as the server wrote it
    Search this account's articles, websites, books, emails, PDFs, social posts, videos, podcast episodes, and documents. For a normal text search, pass only query and limit. "Triage my inbox" is {"status":"inbox","limit":10}; "saved this week" is {"saved_after":"7d"}. Matching is shared with app search and REST, including spelling recovery (approximate=true). Optional filters are combined with AND: omit every filter the user did not explicitly request. Filter by exact tag, kind, capture method, format, or lifecycle; set view=history for recently read items. Items are ordered by most recent status change first (history view: last read first); continue with nextCursor. Item IDs select later tools and are not smry.ai routes; cite only each exact returned source URL.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_library_objectsSearch and paginate across the account's saved items, standalone notes, and highlights through one corpus.No findings

    Why it is in this group

    • The name "list_library_objects" says "list": a word for reading.
    Description, as the server wrote it
    Search and paginate across the account's saved items, standalone notes, and highlights through one corpus. Uses the same Postgres matching as the app and REST API; approximate=true identifies spelling recovery. Returns stable refs for get_library_object. Use list_library when you specifically need item lifecycle filters or reading history.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • query_feedsRead followed feeds.No findings

    Why it is in this group

    • The name "query_feeds" says "query": a word for reading.
    Description, as the server wrote it
    Read followed feeds. "What's new?" is {"since":"1d"}: newest published first, one line per entry with format:"compact". Other arguments are optional; add where.collection, where.source.include/exclude, where.unread, or where.match when requested. per_source_limit produces a bounded fair sample across pages; omit it to retrieve every matching article. select:"sources" returns fetch_status and last_fetched_at separately from publisher activity (health, silent_days, entries_7d/28d). Quiet publishers can have working feeds. select:"aggregate" returns grouped counts with optional trends. Classification-filtered queries report classification_coverage: pending articles have not been assessed, not rejected. Times accept "7d"/"36h"/"now" or ISO dates. Example: {"since":"1d","per_source_limit":3,"limit":40,"format":"compact"} Example: {"select":"entries","where":{"unread":true,"collection":["Research"]},"limit":10} Example: {"select":"sources","having":{"silent_days":{"gte":30}},"limit":10} Example: {"select":"aggregate","group_by":"collection","where":{"discovered_after":"7d"}}

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • search_articleRead a public article or YouTube URL and return only the passages relevant to your query, each anchored to its paragraph and labelled with the section it sits under.No findings

    Why it is in this group

    • The name "search_article" says "search": a word for reading.
    Description, as the server wrote it
    Read a public article or YouTube URL and return only the passages relevant to your query, each anchored to its paragraph and labelled with the section it sits under. Use this instead of get_article whenever you have a specific question about a link — it answers in a fraction of the tokens and the anchors stay citable.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • search_feedsUse the same discovery catalog and ranking as smry's Discover feeds page.No findings

    Why it is in this group

    • The name "search_feeds" says "search": a word for reading.
    Description, as the server wrote it
    Use the same discovery catalog and ranking as smry's Discover feeds page. Browse suggested sources with no query; search websites, RSS, Atom, podcasts, Reddit, and YouTube by topic; create a focused Google News source; or discover every feed published by a site URL. Use sort=popular for popularity ordering. This only discovers sources; use follow_feeds to follow results in an existing or new collection.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • search_saved_itemReturn only the stored passages relevant to a question about one library item.No findings

    Why it is in this group

    • The name "search_saved_item" says "search": a word for reading.
    Description, as the server wrote it
    Return only the stored passages relevant to a question about one library item. Use after list_library instead of reading a long book, PDF, email, transcript, or document from the beginning.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
  • search_webDiscover current public sources with up to four focused searches.No findings

    Why it is in this group

    • The name "search_web" says "search": a word for reading.
    Description, as the server wrote it
    Discover current public sources with up to four focused searches. Search snippets are discovery aids; open the strongest pages before citing substantive claims.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http smry-product https://api.smry.ai/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__smry-product__get_article",
      "mcp__smry-product__search_article",
      "mcp__smry-product__search_web",
      "mcp__smry-product__search_feeds",
      "mcp__smry-product__list_library_objects",
      "mcp__smry-product__get_library_object",
      "mcp__smry-product__get_library_asset",
      "mcp__smry-product__list_library",
      "mcp__smry-product__get_library_changes",
      "mcp__smry-product__get_saved_article",
      "mcp__smry-product__search_saved_item",
      "mcp__smry-product__query_feeds",
      "mcp__smry-product__discover_feed_inputs",
      "mcp__smry-product__get_feed_changes"
    ],
    "ask": [
      "mcp__smry-product__open_web_pages",
      "mcp__smry-product__save_content",
      "mcp__smry-product__save_article",
      "mcp__smry-product__update_library_item",
      "mcp__smry-product__bulk_update_library_items"
    ],
    "deny": [
      "mcp__smry-product__remove_library_item",
      "mcp__smry-product__manage_collections",
      "mcp__smry-product__manage_feed_filter",
      "mcp__smry-product__follow_feeds",
      "mcp__smry-product__create_news_query",
      "mcp__smry-product__set_feed_feedback",
      "mcp__smry-product__mutate_feeds",
      "mcp__smry-product__create_monitor",
      "mcp__smry-product__manage_feed_consumers"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as smry-product. Review it before you use it.