JENRIKS Photo Archive
Read-only MCP server over the JENRIKS daily photoblog: one photo per day since 2006. No auth.
我该使用它吗
质量与安全性
发现(2)
- LOW在 get_photo 中
- LOW在 random_photo 中
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"photo-archive": {
"url": "https://jenriks.com/mcp"
}
}
}远程端点
https://jenriks.com/mcpstreamable-http它能做什么
工具清单
工具(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).
输入模式
{
"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
}输出模式
{
"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/).
输入模式
{
"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
}输出模式
{
"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.
输入模式
{
"type": "object",
"properties": {
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
],
"description": "Latest post by this photographer; omit for the newest post overall"
}
},
"required": [],
"additionalProperties": false
}输出模式
{
"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.
输入模式
{
"type": "object",
"properties": {
"photographer": {
"type": "string",
"enum": [
"Erik",
"Jens"
]
},
"category": {
"type": "string"
},
"year": {
"type": "integer",
"minimum": 2005
}
},
"required": [],
"additionalProperties": false
}输出模式
{
"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.
输入模式
{
"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
}输出模式
{
"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"
]
}社区
证据