{"_id":"@caelaxie/inoreader-mcp","_rev":"3-d1d8141a326fe7c8e3e626dc16198058","name":"@caelaxie/inoreader-mcp","dist-tags":{"latest":"2.0.2"},"versions":{"1.0.0":{"name":"@caelaxie/inoreader-mcp","version":"1.0.0","keywords":["inoreader","mcp"],"author":"","license":"MIT","_id":"@caelaxie/inoreader-mcp@1.0.0","maintainers":[{"name":"caelaxie","email":"caelaxie@icloud.com"}],"bin":{"inoreader-mcp":"dist/index.js"},"dist":{"shasum":"0f21258c1c6f4bf0736e625f6db1f956d63f7b7e","tarball":"https://registry.npmjs.org/@caelaxie/inoreader-mcp/-/inoreader-mcp-1.0.0.tgz","fileCount":5,"integrity":"sha512-bT+InxWUY1Bcnd8cA+A7wugU7iYibkWlGIkb+nCZYqXithhs/OJzWXHTomBRoyGnTjtny3hRm8HlqOq71izzJg==","signatures":[{"sig":"MEUCIHYOHbWEYzjaVcwmAC3gQi4e28dc/adb6TY9wC+ZBx0VAiEAs/mYq/n5JfkgrAz3a8q2fFcJb79N2/HGgVMKgd/b8KM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80110},"main":"./dist/index.js","type":"module","_from":"file:caelaxie-inoreader-mcp-1.0.0.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsx src/index.ts","lint":"eslint src test *.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","release:check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack --dry-run","release:major":"pnpm release:check && pnpm version major && pnpm publish --access public && git push --follow-tags","release:minor":"pnpm release:check && pnpm version minor && pnpm publish --access public && git push --follow-tags","release:patch":"pnpm release:check && pnpm version patch && pnpm publish --access public && git push --follow-tags","release:publish":"pnpm release:check && pnpm publish --access public"},"_npmUser":{"name":"caelaxie","email":"caelaxie@icloud.com"},"_resolved":"/private/var/folders/z3/pt0bs0g9139fb_bmws9x0s240000gn/T/3cfafdbaa5767776b3cab318ea1e2b8d/caelaxie-inoreader-mcp-1.0.0.tgz","_integrity":"sha512-bT+InxWUY1Bcnd8cA+A7wugU7iYibkWlGIkb+nCZYqXithhs/OJzWXHTomBRoyGnTjtny3hRm8HlqOq71izzJg==","_npmVersion":"11.9.0","description":"Local MCP server for Inoreader.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.4.3","effect":"^3.21.2","@effect/platform":"^0.96.1","@effect/platform-node":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.0","tsup":"^8.5.1","eslint":"^10.4.0","vitest":"^4.1.6","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.8.0","typescript-eslint":"^8.59.3"},"_npmOperationalInternal":{"tmp":"tmp/inoreader-mcp_1.0.0_1778917630646_0.0578562343164053","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@caelaxie/inoreader-mcp","version":"2.0.0","keywords":["inoreader","mcp"],"author":"","license":"MIT","_id":"@caelaxie/inoreader-mcp@2.0.0","maintainers":[{"name":"caelaxie","email":"caelaxie@icloud.com"}],"bin":{"inoreader-mcp":"dist/index.js"},"dist":{"shasum":"a326124517ad8d33b484e76f60461c4d836c1e5c","tarball":"https://registry.npmjs.org/@caelaxie/inoreader-mcp/-/inoreader-mcp-2.0.0.tgz","fileCount":5,"integrity":"sha512-H4ayqPHMBjT0ld6po1Paj0z3Cb+Wt7kHSjz8FT3sUD2elzhsOrBl4/vWVzteYhfUqLTXYRMQRRukBASVvY5AJw==","signatures":[{"sig":"MEUCIQCQs3dIioaYNe3xVeFxNKhp15h9mClazk8iBtCYlEJWHgIgGf2WuWRW1XJp2C3O31fOjMbtTfLRKIO/EPo380oECPE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111595},"main":"./dist/index.js","type":"module","_from":"file:caelaxie-inoreader-mcp-2.0.0.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsx src/index.ts","lint":"eslint src test *.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","release:check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack --dry-run","release:major":"pnpm release:check && pnpm version major && pnpm publish --access public && git push --follow-tags","release:minor":"pnpm release:check && pnpm version minor && pnpm publish --access public && git push --follow-tags","release:patch":"pnpm release:check && pnpm version patch && pnpm publish --access public && git push --follow-tags","release:publish":"pnpm release:check && pnpm publish --access public"},"_npmUser":{"name":"caelaxie","email":"caelaxie@icloud.com"},"_resolved":"/private/var/folders/z3/pt0bs0g9139fb_bmws9x0s240000gn/T/bbfa2d0047e4c5bc582908e04b5ac21e/caelaxie-inoreader-mcp-2.0.0.tgz","_integrity":"sha512-H4ayqPHMBjT0ld6po1Paj0z3Cb+Wt7kHSjz8FT3sUD2elzhsOrBl4/vWVzteYhfUqLTXYRMQRRukBASVvY5AJw==","_npmVersion":"11.9.0","description":"Local MCP server for Inoreader.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.4.3","effect":"^3.21.2","@effect/platform":"^0.96.1","@napi-rs/keyring":"^1.3.0","@effect/platform-node":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.0","tsup":"^8.5.1","eslint":"^10.4.0","vitest":"^4.1.6","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.8.0","typescript-eslint":"^8.59.3"},"_npmOperationalInternal":{"tmp":"tmp/inoreader-mcp_2.0.0_1778919925423_0.2682102963163737","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@caelaxie/inoreader-mcp","version":"2.0.2","description":"Remote Cloudflare MCP server for Inoreader.","type":"module","main":"./dist/worker.js","types":"./dist/worker.d.ts","publishConfig":{"access":"public"},"keywords":["inoreader","mcp"],"author":"","license":"MIT","dependencies":{"@cloudflare/workers-types":"^4.20260516.1","@effect/platform":"^0.96.1","@modelcontextprotocol/sdk":"^1.29.0","agents":"^0.12.4","effect":"^3.21.2","zod":"^4.4.3"},"devDependencies":{"@eslint/js":"^10.0.1","@types/node":"^25.8.0","eslint":"^10.4.0","tsup":"^8.5.1","tsx":"^4.22.0","typescript":"^6.0.3","typescript-eslint":"^8.59.3","vitest":"^4.1.6","wrangler":"^4.92.0"},"scripts":{"build":"tsup","dev":"wrangler dev","deploy":"wrangler deploy","lint":"eslint src test *.config.ts","release:check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack --dry-run","release:major":"pnpm release:check && pnpm version major && pnpm publish --access public && git push --follow-tags","release:minor":"pnpm release:check && pnpm version minor && pnpm publish --access public && git push --follow-tags","release:patch":"pnpm release:check && pnpm version patch && pnpm publish --access public && git push --follow-tags","release:publish":"pnpm release:check && pnpm publish --access public","test":"vitest run","typecheck":"tsc --noEmit"},"_id":"@caelaxie/inoreader-mcp@2.0.2","_integrity":"sha512-8dPfNkrY+Azt04XL5jaKODWBZ6r1+0CC9n9CcAM3IAHYokk2ANdKBR3bE/Gm8oTl+QgSZApwHbU6W+ViHVnU+g==","_resolved":"/private/var/folders/z3/pt0bs0g9139fb_bmws9x0s240000gn/T/061ec4735a6ef3e4c61f746ae324750a/caelaxie-inoreader-mcp-2.0.2.tgz","_from":"file:caelaxie-inoreader-mcp-2.0.2.tgz","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-8dPfNkrY+Azt04XL5jaKODWBZ6r1+0CC9n9CcAM3IAHYokk2ANdKBR3bE/Gm8oTl+QgSZApwHbU6W+ViHVnU+g==","shasum":"06d3526e538dfd1b2244b02387b474f5954514c2","tarball":"https://registry.npmjs.org/@caelaxie/inoreader-mcp/-/inoreader-mcp-2.0.2.tgz","fileCount":5,"unpackedSize":119830,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDX/TjAZDTKtUK57HVCxNTdNiHFJK4lYAIGDy+MmR9zGgIhAJ/V/FaSCP5m0yxPO129uFwSgjnQWiGDTcnT5gXPqgop"}]},"_npmUser":{"name":"caelaxie","email":"caelaxie@icloud.com"},"directories":{},"maintainers":[{"name":"caelaxie","email":"caelaxie@icloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/inoreader-mcp_2.0.2_1778965732152_0.6009858342775074"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-16T07:47:10.524Z","modified":"2026-05-16T21:08:52.422Z","1.0.0":"2026-05-16T07:47:10.810Z","2.0.0":"2026-05-16T08:25:25.570Z","2.0.2":"2026-05-16T21:08:52.291Z"},"license":"MIT","keywords":["inoreader","mcp"],"description":"Remote Cloudflare MCP server for Inoreader.","maintainers":[{"name":"caelaxie","email":"caelaxie@icloud.com"}],"readme":"# Inoreader MCP\n\nRemote Cloudflare MCP server for Inoreader.\n\n## Deploy\n\n1. Install dependencies and sign in to Cloudflare:\n\n```bash\npnpm install\npnpm wrangler login\n```\n\n2. Choose the deployed Worker URL.\n\nBy default this project deploys the Worker named `inoreader-mcp`. Use either a\n`workers.dev` hostname or a custom hostname that belongs to a Cloudflare zone.\n\nTo enable the default `workers.dev` deployment URL, add `workers_dev` to\n`wrangler.jsonc`:\n\n```jsonc\n{\n  \"name\": \"inoreader-mcp\",\n  \"workers_dev\": true\n}\n```\n\nThen use the final Worker URL from your Cloudflare account, for example:\n\n```text\nhttps://inoreader-mcp.<your-workers-subdomain>.workers.dev\n```\n\nTo use a custom domain where the Worker is the origin, add a `routes` entry with\n`custom_domain: true`:\n\n```jsonc\n{\n  \"routes\": [\n    {\n      \"pattern\": \"reader.example.com\",\n      \"custom_domain\": true\n    }\n  ]\n}\n```\n\nIf you need the Worker to run in front of an existing origin instead, configure a\nroute for a proxied DNS record:\n\n```jsonc\n{\n  \"routes\": [\n    {\n      \"pattern\": \"reader.example.com/*\",\n      \"zone_name\": \"example.com\"\n    }\n  ]\n}\n```\n\nAfter choosing the host, use it consistently for Inoreader OAuth, Cloudflare\nAccess, and MCP client configuration.\n\n3. Register an app in Inoreader preferences:\n\n```text\nhttps://www.inoreader.com/preferences/other\n```\n\nUse your deployed Worker callback URL as the redirect URI:\n\n```text\nhttps://<your-worker-domain>/callback\n```\n\nSet the Inoreader app access level to read/write. The Worker requests the\n`read write` OAuth scope because the MCP server exposes both read tools and\nwrite tools such as mark read, star, tag, and subscription edits. If the\nInoreader app is set to read only, the Connect Inoreader flow will fail with\n`invalid_scope`.\n\nInoreader labels the OAuth credentials as `App ID` and `App key`.\n\n4. Set Cloudflare Worker secrets from the Inoreader `App ID` and `App key`:\n\n```bash\npnpm wrangler secret put INOREADER_APP_ID\npnpm wrangler secret put INOREADER_APP_KEY\n```\n\n5. Deploy the Worker:\n\n```bash\npnpm run deploy\n```\n\n6. Protect the private Worker paths with Cloudflare Access.\n\nIn the Cloudflare dashboard, open Zero Trust, then Access, then Applications.\nAdd self-hosted applications for the private paths on the deployed Worker host:\n\n```text\nhttps://inoreader-mcp.<your-workers-subdomain>.workers.dev/setup\nhttps://inoreader-mcp.<your-workers-subdomain>.workers.dev/authorize\nhttps://inoreader-mcp.<your-workers-subdomain>.workers.dev/status\nhttps://inoreader-mcp.<your-workers-subdomain>.workers.dev/mcp\n```\n\nAdd an Allow policy for your email address on `/setup` and `/authorize`.\n\nFor non-browser MCP clients, create a Cloudflare Access service token and use it\nfor `/mcp`:\n\n1. In the Cloudflare Zero Trust dashboard, open Access, then Service Auth.\n2. Create a service token, for example `inoreader-mcp-codex`, and save the\n   generated Client ID and Client Secret. Cloudflare shows the secret once.\n3. Open the Access application that protects\n   `https://<your-worker-domain>/mcp`.\n4. Add a policy with Action set to Service Auth.\n5. In the Include rules, choose Service Token and select the specific token you\n   created. Do not use Any Access Service Token unless you intentionally want\n   every service token in scope to reach `/mcp`.\n\nDo not protect `/callback` with Cloudflare Access. Inoreader must be able to\nredirect the browser back to that path after OAuth, and Inoreader cannot send\nCloudflare Access service-token headers.\n\n7. Open the setup page in a browser and connect Inoreader:\n\n```text\nhttps://<your-worker-domain>/setup\n```\n\nThe Worker redirects to Inoreader, receives the OAuth callback at `/callback`,\nand stores the Inoreader refresh/access token state in the\n`InoreaderCredentials` Durable Object.\n\n## Connect MCP Clients\n\nUse the remote MCP endpoint directly:\n\n```text\nhttps://<your-worker-domain>/mcp\n```\n\nMCP clients should send these Cloudflare Access headers when calling `/mcp`:\n\n```http\nCF-Access-Client-Id: <cloudflare-access-client-id>.access\nCF-Access-Client-Secret: <cloudflare-access-client-secret>\n```\n\nSet them in your shell before starting Codex or OpenCode:\n\n```bash\nexport CF_ACCESS_CLIENT_ID=\"<cloudflare-access-client-id>.access\"\nexport CF_ACCESS_CLIENT_SECRET=\"<cloudflare-access-client-secret>\"\n```\n\n### Codex\n\nAdd this to `~/.codex/config.toml`:\n\n```toml\n[mcp_servers.inoreader]\nurl = \"https://<your-worker-domain>/mcp\"\n\n[mcp_servers.inoreader.env_http_headers]\n\"CF-Access-Client-Id\" = \"CF_ACCESS_CLIENT_ID\"\n\"CF-Access-Client-Secret\" = \"CF_ACCESS_CLIENT_SECRET\"\n```\n\nRestart Codex after changing the config.\n\n### OpenCode\n\nAdd this to `~/.config/opencode/opencode.json`:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"mcp\": {\n    \"inoreader\": {\n      \"type\": \"remote\",\n      \"url\": \"https://<your-worker-domain>/mcp\",\n      \"enabled\": true,\n      \"headers\": {\n        \"CF-Access-Client-Id\": \"{env:CF_ACCESS_CLIENT_ID}\",\n        \"CF-Access-Client-Secret\": \"{env:CF_ACCESS_CLIENT_SECRET}\"\n      }\n    }\n  }\n}\n```\n\nRestart OpenCode after changing the config.\n\nBrowser access to `/setup` uses your email-based Access policy.\n\n## Current Tools\n\n- `inoreader_status`: reports the configured Inoreader API base URL and whether OAuth credentials are configured.\n- `inoreader_get_user_info`: fetches authenticated account information.\n- `inoreader_list_subscriptions`: lists feeds and subscriptions.\n- `inoreader_get_unread_counts`: returns unread counters for feeds, folders, and tags.\n- `inoreader_get_stream_contents`: fetches articles from a stream.\n- `inoreader_mark_read`: marks one or more articles as read.\n- `inoreader_mark_unread`: marks one or more articles as unread.\n- `inoreader_star_article`: stars one or more articles.\n- `inoreader_unstar_article`: removes stars from one or more articles.\n- `inoreader_like_article`: likes one or more articles.\n- `inoreader_unlike_article`: removes likes from one or more articles.\n- `inoreader_broadcast_article`: broadcasts one or more articles.\n- `inoreader_unbroadcast_article`: removes broadcasts from one or more articles.\n- `inoreader_add_article_tag`: adds a custom tag to one or more articles.\n- `inoreader_remove_article_tag`: removes a custom tag from one or more articles.\n- `inoreader_edit_subscription`: renames a subscription or adds/removes it from folders.\n- `inoreader_follow_subscription`: follows a feed and optionally renames or folders it.\n- `inoreader_unfollow_subscription`: unfollows a feed.\n- `inoreader_rename_tag`: renames a tag or folder.\n- `inoreader_delete_tag`: deletes a tag or folder.\n\n## Developers\n\nInstall dependencies:\n\n```bash\npnpm install\n```\n\nRun locally with Wrangler:\n\n```bash\npnpm dev\n```\n\nWrangler serves the local Worker at `http://localhost:8787` by default. If you\nneed a different local port, add a `dev` block to `wrangler.jsonc`:\n\n```jsonc\n{\n  \"dev\": {\n    \"port\": 8788,\n    \"local_protocol\": \"http\"\n  }\n}\n```\n\nFor a preview that runs on Cloudflare infrastructure and connects to remote\nbindings, use Wrangler remote development:\n\n```bash\npnpm wrangler dev --remote\n```\n\nRun checks:\n\n```bash\npnpm lint\npnpm typecheck\npnpm test\npnpm build\n```\n","readmeFilename":"README.md"}