miniflux-mcp
Version:
A read-only MCP server for the Miniflux RSS reader.
506 lines (503 loc) • 15.5 kB
YAML
openapi: 3.0.3
info:
title: Miniflux MCP Read-Only API
version: 0.0.1
description: |
Read-only subset of Miniflux API for MCP usage. Covers listing/searching feeds, listing feeds in a category, and fetching details of a single feed.
servers:
- url: https://miniflux.example.org
description: Example Miniflux instance
security:
- XAuthToken: []
- basicAuth: []
paths:
/v1/categories:
get:
summary: Get Categories
description: |
Returns all categories for the authenticated user. Optionally include counters since Miniflux 2.0.46.
MCP guidance: Expose this operation as the `listCategories` tool to allow browsing categories.
x-mcp-function: listCategories
x-mcp-guidance: |
Expose as `listCategories` for user browsing.
operationId: getCategories
parameters:
- name: counts
in: query
required: false
schema:
type: boolean
description: Include total_unread and feed_count (since 2.0.46)
responses:
'200':
description: A list of categories
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Category'
'401': { $ref: '#/components/responses/UnauthorizedError' }
'403': { $ref: '#/components/responses/ForbiddenError' }
'500': { $ref: '#/components/responses/ServerError' }
/v1/feeds:
get:
summary: Get All Feeds
description: |
Returns all feeds for the authenticated user. This endpoint is used by the `listFeeds` tool to get a list of all feeds.
operationId: getFeeds
x-mcp-function: listFeeds
x-mcp-guidance: |
Expose as `listFeeds` for user browsing.
responses:
'200':
description: A list of all feeds
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Feed'
'401': { $ref: '#/components/responses/UnauthorizedError' }
'403': { $ref: '#/components/responses/ForbiddenError' }
'500': { $ref: '#/components/responses/ServerError' }
/v1/categories/{categoryID}/feeds:
get:
summary: Get Category Feeds
description: Returns feeds for a specific category.
operationId: getCategoryFeeds
x-mcp-function: searchFeedsByCategory
x-mcp-guidance: |
This operation requires a numeric `category_id`.
parameters:
- name: categoryID
in: path
required: true
schema:
type: integer
responses:
'200':
description: A list of feeds in the category
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Feed'
'401': { $ref: '#/components/responses/UnauthorizedError' }
'403': { $ref: '#/components/responses/ForbiddenError' }
'500': { $ref: '#/components/responses/ServerError' }
/v1/feeds/{feedID}:
get:
summary: Get Feed
description: Returns details for a single feed. (Not exposed as a dedicated MCP tool; feed details are discoverable via listFeeds output or by resolving an ID with resolveId.)
operationId: getFeed
parameters:
- name: feedID
in: path
required: true
schema:
type: integer
responses:
'200':
description: Feed details
content:
application/json:
schema:
$ref: '#/components/schemas/Feed'
'401': { $ref: '#/components/responses/UnauthorizedError' }
'403': { $ref: '#/components/responses/ForbiddenError' }
'404':
description: Feed not found
'500': { $ref: '#/components/responses/ServerError' }
/v1/entries:
get:
summary: Get Entries
description: Returns entries (articles) across all feeds for the authenticated user.
operationId: getEntries
x-mcp-function: searchEntries
parameters:
- $ref: '#/components/parameters/status'
- $ref: '#/components/parameters/offset'
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/order'
- $ref: '#/components/parameters/direction'
- $ref: '#/components/parameters/before'
- $ref: '#/components/parameters/after'
- $ref: '#/components/parameters/published_before'
- $ref: '#/components/parameters/published_after'
- $ref: '#/components/parameters/changed_before'
- $ref: '#/components/parameters/changed_after'
- $ref: '#/components/parameters/before_entry_id'
- $ref: '#/components/parameters/after_entry_id'
- $ref: '#/components/parameters/starred'
- $ref: '#/components/parameters/search'
- $ref: '#/components/parameters/category_id'
responses:
'200':
description: Paginated entries list
content:
application/json:
schema:
$ref: '#/components/schemas/EntriesResponse'
'401': { $ref: '#/components/responses/UnauthorizedError' }
'403': { $ref: '#/components/responses/ForbiddenError' }
'500': { $ref: '#/components/responses/ServerError' }
/v1/categories/{categoryID}/entries:
get:
summary: Get Category Entries
description: Returns entries for a specific category.
operationId: getCategoryEntries
x-mcp-function: searchEntries
x-mcp-guidance: |
This operation requires a numeric `category_id`.
parameters:
- name: categoryID
in: path
required: true
schema:
type: integer
- $ref: '#/components/parameters/status'
- $ref: '#/components/parameters/offset'
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/order'
- $ref: '#/components/parameters/direction'
- $ref: '#/components/parameters/before'
- $ref: '#/components/parameters/after'
- $ref: '#/components/parameters/published_before'
- $ref: '#/components/parameters/published_after'
- $ref: '#/components/parameters/changed_before'
- $ref: '#/components/parameters/changed_after'
- $ref: '#/components/parameters/before_entry_id'
- $ref: '#/components/parameters/after_entry_id'
- $ref: '#/components/parameters/starred'
- $ref: '#/components/parameters/search'
responses:
'200':
description: Paginated entries list for the category
content:
application/json:
schema:
$ref: '#/components/schemas/EntriesResponse'
'401': { $ref: '#/components/responses/UnauthorizedError' }
'403': { $ref: '#/components/responses/ForbiddenError' }
'500': { $ref: '#/components/responses/ServerError' }
/v1/feeds/{feedID}/entries:
get:
summary: Get Feed Entries
description: Returns entries for a specific feed.
operationId: getFeedEntries
x-mcp-function: searchEntries
parameters:
- name: feedID
in: path
required: true
schema:
type: integer
- $ref: '#/components/parameters/status'
- $ref: '#/components/parameters/offset'
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/order'
- $ref: '#/components/parameters/direction'
- $ref: '#/components/parameters/before'
- $ref: '#/components/parameters/after'
- $ref: '#/components/parameters/published_before'
- $ref: '#/components/parameters/published_after'
- $ref: '#/components/parameters/changed_before'
- $ref: '#/components/parameters/changed_after'
- $ref: '#/components/parameters/before_entry_id'
- $ref: '#/components/parameters/after_entry_id'
- $ref: '#/components/parameters/starred'
- $ref: '#/components/parameters/search'
responses:
'200':
description: Paginated entries list for the feed
content:
application/json:
schema:
$ref: '#/components/schemas/EntriesResponse'
'401': { $ref: '#/components/responses/UnauthorizedError' }
'403': { $ref: '#/components/responses/ForbiddenError' }
'500': { $ref: '#/components/responses/ServerError' }
components:
securitySchemes:
XAuthToken:
type: apiKey
in: header
name: X-Auth-Token
description: API token authentication
basicAuth:
type: http
scheme: basic
responses:
UnauthorizedError:
description: Unauthorized
ForbiddenError:
description: Forbidden
ServerError:
description: Internal Server Error
parameters:
status:
name: status
in: query
description: Entry status; repeat parameter to filter multiple statuses
schema:
type: array
items:
type: string
enum: [read, unread, removed]
style: form
explode: true
offset:
name: offset
in: query
schema:
type: integer
minimum: 0
limit:
name: limit
in: query
schema:
type: integer
minimum: 1
maximum: 200
order:
name: order
in: query
schema:
type: string
enum: [id, status, published_at, category_title, category_id]
direction:
name: direction
in: query
schema:
type: string
enum: [asc, desc]
before:
name: before
in: query
description: Unix timestamp; include entries created before this time
schema:
type: integer
format: int64
after:
name: after
in: query
description: Unix timestamp; include entries created after this time
schema:
type: integer
format: int64
published_before:
name: published_before
in: query
description: Unix timestamp; include entries published before this time
schema:
type: integer
format: int64
published_after:
name: published_after
in: query
description: Unix timestamp; include entries published after this time
schema:
type: integer
format: int64
changed_before:
name: changed_before
in: query
description: Unix timestamp; include entries changed before this time
schema:
type: integer
format: int64
changed_after:
name: changed_after
in: query
description: Unix timestamp; include entries changed after this time
schema:
type: integer
format: int64
before_entry_id:
name: before_entry_id
in: query
schema:
type: integer
format: int64
after_entry_id:
name: after_entry_id
in: query
schema:
type: integer
format: int64
starred:
name: starred
in: query
schema:
type: boolean
search:
name: search
in: query
schema:
type: string
category_id:
name: category_id
in: query
description: Filter entries by category id (for /v1/entries only)
schema:
type: integer
schemas:
Category:
type: object
properties:
id:
type: integer
user_id:
type: integer
title:
type: string
hide_globally:
type: boolean
feed_count:
type: integer
nullable: true
total_unread:
type: integer
nullable: true
Feed:
type: object
properties:
id:
type: integer
user_id:
type: integer
title:
type: string
site_url:
type: string
feed_url:
type: string
checked_at:
type: string
format: date-time
nullable: true
etag_header:
type: string
nullable: true
last_modified_header:
type: string
nullable: true
parsing_error_message:
type: string
nullable: true
parsing_error_count:
type: integer
nullable: true
scraper_rules:
type: string
nullable: true
rewrite_rules:
type: string
nullable: true
crawler:
type: boolean
nullable: true
blocklist_rules:
type: string
nullable: true
keeplist_rules:
type: string
nullable: true
user_agent:
type: string
nullable: true
username:
type: string
nullable: true
password:
type: string
nullable: true
disabled:
type: boolean
nullable: true
ignore_http_cache:
type: boolean
nullable: true
fetch_via_proxy:
type: boolean
nullable: true
category:
$ref: '#/components/schemas/Category'
icon:
type: object
nullable: true
properties:
feed_id:
type: integer
icon_id:
type: integer
FeedIcon:
type: object
properties:
id:
type: integer
data:
type: string
description: mime;data base64
mime_type:
type: string
Entry:
type: object
properties:
id:
type: integer
user_id:
type: integer
feed_id:
type: integer
title:
type: string
url:
type: string
comments_url:
type: string
nullable: true
author:
type: string
nullable: true
content:
type: string
hash:
type: string
published_at:
type: string
format: date-time
created_at:
type: string
format: date-time
status:
type: string
enum: [read, unread, removed]
share_code:
type: string
nullable: true
starred:
type: boolean
reading_time:
type: integer
enclosures:
type: array
items:
type: object
feed:
$ref: '#/components/schemas/Feed'
tags:
type: array
items:
type: string
EntriesResponse:
type: object
properties:
total:
type: integer
entries:
type: array
items:
$ref: '#/components/schemas/Entry'