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: 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