JENRIKS MCP API

Model Context Protocol server (Streamable HTTP, JSON responses)

GitHub OpenAPI

Operations 5

POST /mcp MCP server (JSON-RPC 2.0 over Streamable HTTP, JSON responses) #
GET /mcp Not supported (no server-initiated event stream) #
GET /mcp/health MCP server health #
GET /.well-known/mcp/server-card.json MCP server card #
GET /server.json MCP Registry server.json manifest #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/jenriks-com:jenriks-com-mcp-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

jenriks-com-mcp-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: JENRIKS public MCP API
  version: 1.1.0
  summary: Read-only JSON API, NLWeb endpoint and MCP server for the JENRIKS daily photoblog (one photo per day since 2006).
  description: 'Everything here is public, read-only and free: no API key, no OAuth, no accounts, no write operations. Stable REST operations carry a major version in the path (/api/v1). Backward-compatible fields may be added within v1; breaking changes get a new major path. Before a version is removed, JENRIKS publishes a migration note at /developers/#versioning and signals it with RFC 9745 Deprecation and Link headers; a dated Sunset header is announced at least 90 days ahead. No sunset is scheduled. Search results page by offset or by an opaque cursor (next_cursor); POST /api/v1/batch runs up to 20 GET requests in one call. Every error is an RFC 9457 problem document (application/problem+json) with a stable code and a resolution hint. Quota: 120 requests per minute per client IP on /api, /mcp and /ask, advertised through RateLimit headers; a 429 carries Retry-After. Every page URL /x/y/ has a Markdown twin at /x/y.md (the homepage at /index.md); Accept: text/markdown or ?mode=agent on the page URL returns the same text, and machine documents wrap as /openapi.json.md, /server.json.md, /api/v1.md or /.well-known/.md. Photographs are copyrighted: credit the photographer and link the page; licensing via https://jenriks.com/contact/.'
  termsOfService: https://jenriks.com/developers/#licensing
  contact:
    name: JENRIKS
    url: https://jenriks.com/contact/
    email: jenriks@gmail.com
  license:
    name: 'Photographs: all rights reserved. API documents: may be copied freely.'
    url: https://jenriks.com/developers/#licensing
servers:
- url: https://jenriks.com
  description: JENRIKS production
tags:
- name: MCP
  description: Model Context Protocol server (Streamable HTTP, JSON responses)
paths:
  /mcp:
    post:
      operationId: mcp
      tags:
      - MCP
      summary: MCP server (JSON-RPC 2.0 over Streamable HTTP, JSON responses)
      security: []
      description: 'Methods: initialize, ping, tools/list, tools/call, resources/list, resources/read. Tools: search_photos (offset or opaque cursor paging), get_photo, get_latest_photo (optional photographer), random_photo, get_site_overview (optional include list); each declares an outputSchema and every photo carries geo coordinates or null. Stateless: no sessions, no server-initiated event stream. Server card: /.well-known/mcp/server-card.json; registry manifest: /server.json.'
      parameters:
      - name: MCP-Protocol-Version
        in: header
        required: false
        description: MCP protocol version negotiated during initialize (2025-06-18, 2025-03-26 or 2024-11-05); echoed in the response header of the same name
        schema:
          type: string
          enum:
          - '2025-06-18'
          - '2025-03-26'
          - '2024-11-05'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
              - $ref: '#/components/schemas/JsonRpcRequest'
              - type: array
                items:
                  $ref: '#/components/schemas/JsonRpcRequest'
                maxItems: 20
      responses:
        '200':
          description: JSON-RPC response (array when the request was a batch)
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
            MCP-Protocol-Version:
              schema:
                type: string
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/JsonRpcResponse'
                - type: array
                  items:
                    $ref: '#/components/schemas/JsonRpcResponse'
        '202':
          description: 'Notification accepted (JSON-RPC notification without id). This is an acknowledgement, not an asynchronous job: nothing is queued and there is nothing to poll.'
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
        '400':
          description: Body is not valid JSON (JSON-RPC parse error) or an invalid request
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcResponse'
        '413':
          description: Body larger than 64 KB
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '415':
          description: Content-Type is not application/json
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '405':
          description: Method not allowed
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
            Allow:
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '429':
          description: Rate limit exceeded (120 requests per minute per client IP)
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
            Retry-After:
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
    get:
      operationId: mcpGet
      tags:
      - MCP
      summary: Not supported (no server-initiated event stream)
      security: []
      responses:
        '405':
          description: Method not allowed; POST JSON-RPC instead
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
            Allow:
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /mcp/health:
    get:
      operationId: getMcpHealth
      tags:
      - MCP
      summary: MCP server health
      security: []
      responses:
        '200':
          description: Healthy
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Health'
        '503':
          description: Photo index unavailable
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /.well-known/mcp/server-card.json:
    get:
      operationId: getMcpServerCard
      summary: MCP server card
      description: Lists the tools with their input schemas, icons, repository and rate-limit policy. Also served at /mcp/server-card as application/mcp-server-card+json, and at /.well-known/mcp.json, /mcp.json, /mcp/manifest.json, /.well-known/mcp/manifest.json for clients that probe those paths.
      tags:
      - MCP
      security: []
      responses:
        '200':
          description: MCP server card
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/McpServerCard'
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /server.json:
    get:
      operationId: getMcpRegistryManifest
      summary: MCP Registry server.json manifest
      description: MCP Registry format (schema 2025-12-11) describing the remote Streamable HTTP endpoint, icons and repository.
      tags:
      - MCP
      security: []
      responses:
        '200':
          description: MCP Registry server.json manifest
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/McpRegistryServer'
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
components:
  schemas:
    McpRegistryServer:
      type: object
      required:
      - name
      - description
      - version
      properties:
        $schema:
          type: string
          format: uri
        name:
          type: string
        title:
          type: string
        description:
          type: string
        version:
          type: string
        websiteUrl:
          type: string
          format: uri
        remotes:
          type: array
          items:
            type: object
            required:
            - type
            - url
            properties:
              type:
                type: string
              url:
                type: string
                format: uri
    Health:
      type: object
      required:
      - status
      - server
      - version
      - endpoint
      - time
      properties:
        status:
          type: string
          enum:
          - ok
          - degraded
        server:
          type: string
        version:
          type: string
        endpoint:
          type: string
          format: uri
        photos_indexed:
          type:
          - integer
          - 'null'
        time:
          type: string
          format: date-time
    JsonRpcRequest:
      type: object
      required:
      - jsonrpc
      - method
      properties:
        jsonrpc:
          type: string
          const: '2.0'
        id:
          type:
          - string
          - integer
          - 'null'
        method:
          type: string
          examples:
          - initialize
          - tools/list
          - tools/call
          - resources/list
          - resources/read
          - ping
        params:
          type: object
    McpServerCard:
      type: object
      required:
      - name
      - version
      - description
      - serverInfo
      - transport
      - capabilities
      - remotes
      properties:
        $schema:
          type: string
          format: uri
        name:
          type: string
        title:
          type: string
        description:
          type: string
        version:
          type: string
        websiteUrl:
          type: string
          format: uri
        remotes:
          type: array
          items:
            type: object
            required:
            - type
            - url
            properties:
              type:
                type: string
              url:
                type: string
                format: uri
              supportedProtocolVersions:
                type: array
                items:
                  type: string
        serverInfo:
          type: object
          required:
          - name
          - version
          properties:
            name:
              type: string
            title:
              type: string
            version:
              type: string
        url:
          type: string
          format: uri
        transport:
          type: object
          required:
          - type
          - endpoint
          properties:
            type:
              type: string
            endpoint:
              type: string
              format: uri
        protocolVersion:
          type: string
        capabilities:
          type: object
        authentication:
          type: object
        documentation:
          type: string
          format: uri
        registryManifest:
          type: string
          format: uri
        health:
          type: string
          format: uri
        serverUrl:
          type: string
          format: uri
        icon:
          type: string
          format: uri
        icons:
          type: array
          items:
            type: object
            required:
            - src
            properties:
              src:
                type: string
                format: uri
              mimeType:
                type: string
              sizes:
                type: array
                items:
                  type: string
        repository:
          type: object
          required:
          - url
          - source
          properties:
            url:
              type: string
              format: uri
            source:
              type: string
        tools:
          type: array
          items:
            type: object
            required:
            - name
            - description
            - inputSchema
            properties:
              name:
                type: string
              title:
                type: string
              description:
                type: string
              inputSchema:
                type: object
              annotations:
                type: object
        agentGuide:
          type: string
          format: uri
        rateLimit:
          type: object
        errors:
          type: object
    JsonRpcResponse:
      type: object
      required:
      - jsonrpc
      - id
      properties:
        jsonrpc:
          type: string
          const: '2.0'
        id:
          type:
          - string
          - integer
          - 'null'
        result:
          type: object
        error:
          $ref: '#/components/schemas/JsonRpcError'
    Problem:
      type: object
      description: RFC 9457 problem details. Served as application/problem+json on every 4xx/5xx from /api, /mcp and the discovery documents, and on page URLs when the client accepts only JSON.
      required:
      - type
      - title
      - status
      - detail
      - instance
      - code
      - resolution
      properties:
        type:
          description: URI identifying the problem type; resolves to the matching entry in /developers/#errors
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
          minimum: 400
          maximum: 599
        detail:
          type: string
        instance:
          description: The request URL
          type: string
          format: uri
        code:
          description: Stable machine-readable code
          type: string
          enum:
          - not_found
          - api_route_not_found
          - photo_not_found
          - method_not_allowed
          - invalid_parameter
          - not_acceptable
          - unsupported_media_type
          - payload_too_large
          - rate_limit_exceeded
          - service_unavailable
        resolution:
          description: What to do instead
          type: string
        documentation_url:
          type: string
          format: uri
      additionalProperties: true
    JsonRpcError:
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: integer
        message:
          type: string
        data: {}
externalDocs:
  description: Developer documentation
  url: https://jenriks.com/developers/
x-api-lifecycle:
  current_major_version: v1
  deprecation_policy_url: https://jenriks.com/developers/#versioning
  sunset_notice_days: 90
x-deprecation-policy:
  policy_url: https://jenriks.com/developers/#versioning
  current_major_version: v1
  minimum_notice_days: 90
  signals:
  - 'Deprecation (RFC 9745, structured Date: @1735689600)'
  - Sunset (RFC 8594, HTTP-date)
  - Link rel="deprecation"
  openapi_marker: 'operations, parameters and schemas being retired carry deprecated: true'
  deprecated_versions: []
x-rate-limit-policy:
  name: public-read
  quota: 120
  window_seconds: 60
  partition: client IP address
  scope:
  - /api
  - /mcp
  - /ask