JENRIKS Photo Archive
Read-only MCP server over the JENRIKS daily photoblog: one photo per day since 2006. No auth.
Sollte ich dies verwenden
Qualität und Sicherheit
Befunde (2)
- LOWin get_photo
- LOWin random_photo
Basierend auf einer automatisierten Analyse der Tool-Definitionen und der Einhaltung des Protokolls.
Kontextkosten
Dies ist die ungefähre Anzahl der Tokens, die jedes Mal verbraucht werden, wenn die Tools des Servers in den Kontext eines Modells geladen werden. Höhere Werte verringern die Aufmerksamkeit, die für andere Aufgaben verfügbar ist.
Installieren
Installation mit einem Klick
Fügen Sie dies Ihrer Datei `claude_desktop_config.json` hinzu:
{
"mcpServers": {
"photo-archive": {
"url": "https://jenriks.com/mcp"
}
}
}Remote-Endpunkte
https://jenriks.com/mcpstreamable-httpWas es kann
Tool-Inventar
Tools (5)
🟢search_photos(query, photographer, category, year, location, ...)
Search the JENRIKS archive (one photo per day since 2006). Free-text query matches title, place, categories, tags and photographer; filters narrow by photographer, category, year and location. Returns permanent page URLs, credits, coordinates and image URLs, newest first. Page with offset, or with the opaque cursor from next_cursor (cursor wins when both are sent).
Eingabe-Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Free text, e.g. \"harbour\", \"Barcelona\", \"fog\""
},
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
]
},
"category": {
"type": "string",
"description": "One of: Abstract, Architecture, B&W, Humans, Landscapes, Macro, Nature, News, Street, Studio, Time exposure"
},
"year": {
"type": "integer",
"minimum": 2005,
"description": "Four-digit publication year"
},
"location": {
"type": "string",
"description": "City or country name, e.g. \"Iceland\""
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 10
},
"offset": {
"type": "integer",
"minimum": 0,
"default": 0
},
"cursor": {
"type": "string",
"description": "Opaque page token from next_cursor; overrides offset"
}
},
"required": [],
"additionalProperties": false
}Ausgabe-Schema
{
"type": "object",
"properties": {
"total_matches": {
"type": "integer",
"minimum": 0
},
"offset": {
"description": "Offset of the first returned row; 0 when a cursor was used",
"type": "integer",
"minimum": 0
},
"returned": {
"type": "integer",
"minimum": 0
},
"photos": {
"type": "array",
"items": {
"type": "object",
"required": [
"title",
"photographer",
"date",
"url",
"categories",
"tags",
"image",
"credit"
],
"properties": {
"title": {
"type": "string"
},
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
]
},
"date": {
"description": "Publication date, YYYY-MM-DD",
"type": "string",
"format": "date"
},
"url": {
"description": "Permanent page URL",
"type": "string",
"format": "uri"
},
"location": {
"type": [
"string",
"null"
],
"description": "City and country when known"
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"image": {
"type": "object",
"required": [
"full"
],
"properties": {
"full": {
"description": "1600 px long edge",
"type": "string",
"format": "uri"
},
"thumbnail": {
"description": "400 px long edge",
"type": [
"string",
"null"
],
"format": "uri"
}
}
},
"credit": {
"description": "Ready-made credit line: photographer, JENRIKS, page URL",
"type": "string"
},
"geo": {
"type": [
"object",
"null"
],
"description": "WGS 84 coordinates of the location when the post carries them, otherwise null",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"longitude": {
"type": "number",
"minimum": -180,
"maximum": 180
}
}
}
}
}
},
"next_offset": {
"description": "Kept for offset paging; present when more matches exist",
"type": "integer"
},
"has_more": {
"description": "True when another page exists",
"type": "boolean"
},
"next_cursor": {
"description": "Opaque token for the next page; null on the last page. Send it back as cursor.",
"type": [
"string",
"null"
]
},
"cursor": {
"description": "Echo of the cursor this page was fetched with, when one was sent",
"type": "string"
},
"links": {
"type": "object",
"required": [
"self"
],
"properties": {
"self": {
"description": "This request",
"type": "string",
"format": "uri"
},
"next": {
"description": "The same request with cursor=next_cursor and no offset; null on the last page",
"type": [
"string",
"null"
],
"format": "uri"
}
}
}
},
"required": [
"total_matches",
"offset",
"returned",
"photos",
"has_more",
"next_cursor"
]
}🟢get_photo(date, url)
Return one JENRIKS post by publication date (YYYY-MM-DD) or by page URL / path (/YYYY/MM/DD/slug/).
Eingabe-Schema
{
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD"
},
"url": {
"type": "string",
"description": "Page URL or path, e.g. /2026/09/04/liminal-space/"
}
},
"required": [],
"additionalProperties": false
}Ausgabe-Schema
{
"type": "object",
"properties": {
"found": {
"type": "boolean"
},
"photo": {
"type": "object",
"required": [
"title",
"photographer",
"date",
"url",
"categories",
"tags",
"image",
"credit"
],
"properties": {
"title": {
"type": "string"
},
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
]
},
"date": {
"description": "Publication date, YYYY-MM-DD",
"type": "string",
"format": "date"
},
"url": {
"description": "Permanent page URL",
"type": "string",
"format": "uri"
},
"location": {
"type": [
"string",
"null"
],
"description": "City and country when known"
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"image": {
"type": "object",
"required": [
"full"
],
"properties": {
"full": {
"description": "1600 px long edge",
"type": "string",
"format": "uri"
},
"thumbnail": {
"description": "400 px long edge",
"type": [
"string",
"null"
],
"format": "uri"
}
}
},
"credit": {
"description": "Ready-made credit line: photographer, JENRIKS, page URL",
"type": "string"
},
"geo": {
"type": [
"object",
"null"
],
"description": "WGS 84 coordinates of the location when the post carries them, otherwise null",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"longitude": {
"type": "number",
"minimum": -180,
"maximum": 180
}
}
}
}
},
"date": {
"type": "string"
},
"url": {
"type": "string"
},
"hint": {
"type": "string"
}
},
"required": [
"found"
]
}🟢get_latest_photo(photographer)
Return today's JENRIKS photo (the newest post), or the newest post by one photographer when photographer is set. A new photo appears every day at 00:00 Europe/Berlin.
Eingabe-Schema
{
"type": "object",
"properties": {
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
],
"description": "Latest post by this photographer; omit for the newest post overall"
}
},
"required": [],
"additionalProperties": false
}Ausgabe-Schema
{
"type": "object",
"properties": {
"photo": {
"type": "object",
"required": [
"title",
"photographer",
"date",
"url",
"categories",
"tags",
"image",
"credit"
],
"properties": {
"title": {
"type": "string"
},
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
]
},
"date": {
"description": "Publication date, YYYY-MM-DD",
"type": "string",
"format": "date"
},
"url": {
"description": "Permanent page URL",
"type": "string",
"format": "uri"
},
"location": {
"type": [
"string",
"null"
],
"description": "City and country when known"
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"image": {
"type": "object",
"required": [
"full"
],
"properties": {
"full": {
"description": "1600 px long edge",
"type": "string",
"format": "uri"
},
"thumbnail": {
"description": "400 px long edge",
"type": [
"string",
"null"
],
"format": "uri"
}
}
},
"credit": {
"description": "Ready-made credit line: photographer, JENRIKS, page URL",
"type": "string"
},
"geo": {
"type": [
"object",
"null"
],
"description": "WGS 84 coordinates of the location when the post carries them, otherwise null",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"longitude": {
"type": "number",
"minimum": -180,
"maximum": 180
}
}
}
}
}
},
"required": [
"photo"
]
}🟢random_photo(photographer, category, year)
Return a random JENRIKS photo, optionally limited to a photographer, category or year.
Eingabe-Schema
{
"type": "object",
"properties": {
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
]
},
"category": {
"type": "string"
},
"year": {
"type": "integer",
"minimum": 2005
}
},
"required": [],
"additionalProperties": false
}Ausgabe-Schema
{
"type": "object",
"properties": {
"found": {
"type": "boolean"
},
"photo": {
"type": "object",
"required": [
"title",
"photographer",
"date",
"url",
"categories",
"tags",
"image",
"credit"
],
"properties": {
"title": {
"type": "string"
},
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
]
},
"date": {
"description": "Publication date, YYYY-MM-DD",
"type": "string",
"format": "date"
},
"url": {
"description": "Permanent page URL",
"type": "string",
"format": "uri"
},
"location": {
"type": [
"string",
"null"
],
"description": "City and country when known"
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"image": {
"type": "object",
"required": [
"full"
],
"properties": {
"full": {
"description": "1600 px long edge",
"type": "string",
"format": "uri"
},
"thumbnail": {
"description": "400 px long edge",
"type": [
"string",
"null"
],
"format": "uri"
}
}
},
"credit": {
"description": "Ready-made credit line: photographer, JENRIKS, page URL",
"type": "string"
},
"geo": {
"type": [
"object",
"null"
],
"description": "WGS 84 coordinates of the location when the post carries them, otherwise null",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"longitude": {
"type": "number",
"minimum": -180,
"maximum": 180
}
}
}
}
},
"pool_size": {
"type": "integer"
},
"hint": {
"type": "string"
}
},
"required": [
"found"
]
}🟢get_site_overview(include)
Totals, photographers, categories with counts, posts per year, section URLs, URL pattern and license terms. Pass include to keep only some of those blocks next to the totals and dates.
Eingabe-Schema
{
"type": "object",
"properties": {
"include": {
"type": "array",
"items": {
"type": "string",
"enum": [
"photographers",
"categories",
"years",
"sections",
"license"
]
},
"uniqueItems": true,
"description": "Blocks to keep besides site, description, totals and dates; omit for everything"
}
},
"required": [],
"additionalProperties": false
}Ausgabe-Schema
{
"type": "object",
"properties": {
"site": {
"type": "string"
},
"description": {
"type": "string"
},
"total_photos": {
"type": "integer"
},
"first_date": {
"type": "string",
"format": "date"
},
"latest_date": {
"type": "string",
"format": "date"
},
"photographers": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"full_name",
"photos",
"page"
],
"properties": {
"name": {
"type": "string"
},
"full_name": {
"type": "string"
},
"photos": {
"type": "integer"
},
"page": {
"type": "string",
"format": "uri"
}
}
}
},
"categories": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"photos"
],
"properties": {
"name": {
"type": "string"
},
"photos": {
"type": "integer"
}
}
}
},
"years": {
"type": "array",
"items": {
"type": "object",
"required": [
"year",
"photos"
],
"properties": {
"year": {
"type": "string"
},
"photos": {
"type": "integer"
}
}
}
},
"sections": {
"type": "object",
"additionalProperties": {
"type": "string",
"format": "uri"
}
},
"url_pattern": {
"type": "string"
},
"license": {
"type": "string"
}
},
"required": [
"site",
"description",
"total_photos",
"first_date",
"latest_date",
"photographers",
"categories",
"years",
"sections",
"url_pattern",
"license"
]
}Community
Nachweis