Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

🎃 New adapter: Immich (self-hosted photo library, read-only)

Aperta
#1,238 2 commenti 0 reazioni 1 assegnatario Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@GallaGit ci sta già lavorando.

Dal 27/10/2026.

Valutazione

Difficoltà
3/5
Tempo stimato
Mezza giornata
Idoneità per principianti
75/100
Tipo di issue
Funzionalità
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
json, node.js, typescript
Ambito
backend

Direzione di ricerca

Start by running npm run adapter:new -- immich --region intl --auth API_KEY to scaffold packages/backend/src/adapters/intl/immich.json. Copy baseUrl and envVarMeta from intl/grafana.json and API_KEY header from intl/clockify.json. Define the 8 GET tools per the table, add immich.live.spec.ts, and run npx jest src/adapters/intl/immich in packages/backend. Done when validate-adapters is clean, tests pass, logo SVG and docs exist.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

enhancement hacktoberfest help wanted

Part of the October Challenge #997.

Why

Immich is the most popular self-hosted alternative to Google Photos (immich-app/immich has over 115k GitHub stars). Its REST API covers the user's library: albums, assets with EXIF data, recognised people, places and a month-by-month timeline. With an adapter, a user could ask "how many photos and videos do I have?", "which albums are shared with me?", "how many pictures of Anna did we take each month this year?" or "where and with which camera was this photo taken?". The catalog has Google Photos but no Immich (ls packages/backend/src/adapters/*/ | grep -i immich finds nothing).

Self-hosted vs Cloud

  • Self-hosted: available in Community and Business. Catalog adapters have no edition gating. Immich usually runs on a home server or NAS (http://192.168.x.x:2283). The outbound SSRF guard blocks private addresses by default, so the operator must allow the host through SSRF_ALLOWED_HOSTS or the admin-editable allowlist (settings/site-settings.controller.ts:229-233). intl/directus.json:9 already words this for a self-hosted product; reuse that wording in instructions.
  • Cloud (DEPLOYMENT_MODE=cloud): available, but only for instances reachable from the public internet (for example behind a reverse proxy). A private IP or a local hostname is refused, and the allowlist cannot be edited on Cloud (those routes answer 404, same file). instructions must say this. On Cloud trial plans, installs count toward the trial's connector limit (license/license-guard.service.ts:75-80).
  • Who can use it: any role except VIEWER can install it (adapters/adapters.controller.ts:306). The connector and its encrypted authConfig belong to the installer's organization. An Immich API key reads one user's personal photos, faces and locations, so instructions must recommend assigning the connector only to MCP servers whose users may see that library.

What to build

packages/backend/src/adapters/intl/immich.json. Start with npm run adapter:new -- immich --region intl --auth API_KEY.

  • API docs: the reference at https://api.immich.app, generated from the OpenAPI spec in the repo (open-api/immich-openapi-specs.json, e.g. https://github.com/immich-app/immich/blob/v3.3.5/open-api/immich-openapi-specs.json). API keys: https://docs.immich.app/features/command-line-interface ("Obtain the API Key"). Use https://api.immich.app as docsUrl.
  • Target version: Immich 3.x (current release 3.3.5). The API changed between 2.x and 3.0: GET /albums swapped shared for isOwned/isShared/name, and GET /albums/{id} no longer returns the album's assets. Build against the 3.x spec and state "Immich 3.0 or newer" in instructions.
  • Base URL: user-supplied, "baseUrl": "{{IMMICH_URL}}/api", the same pattern as intl/grafana.json:46. IMMICH_URL is the address the user opens Immich at, without /api and without a trailing slash (default port 2283). Immich's own examples use http://<host>:2283/api as the API root. Add envVarMeta with kind: "address" and a no-trailing-slash pattern, as intl/grafana.json:15-33 does.
  • Auth: API_KEY with headerName: "x-api-key" and apiKey: "{{IMMICH_API_KEY}}" (the api_key security scheme in the spec). Same shape as intl/clockify.json:15-19. The user creates the key in the web UI under Account Settings → API Keys and can restrict its permissions. The 8 tools below need only user.read, asset.read, asset.statistics, album.read and person.read.
  • Category: storage (same as intl/google-photos.json:7). probe: immich_get_my_user. healthcheckPath: /server/ping (no permission needed, returns {"res":"pong"}).
Tool Endpoint Expected hints
immich_get_my_user GET /users/me (name, email, quota usage) · user.read read-only
immich_get_asset_statistics GET /assets/statistics (isFavorite, isTrashed, visibility: archive/timeline/hidden/locked) → images, videos, total · asset.statistics read-only
immich_list_albums GET /albums (isOwned, isShared, name exact match, assetId) · album.read read-only
immich_get_album GET /albums/{id} (metadata, assetCount, albumUsers, date range; no asset list in 3.x) · album.read read-only
immich_get_asset GET /assets/{id} (file name, dates, exifInfo, people, tags) · asset.read read-only
immich_search_people GET /search/person (name required, withHidden) · person.read read-only
immich_get_timeline_buckets GET /timeline/buckets (albumId, personId, tagId, isFavorite, isTrashed, visibility) → asset count per month · asset.read read-only
immich_search_places GET /search/places (name required) → place names with coordinates · asset.read read-only

All tools are GET, so they are derived as readOnlyHint: true, destructiveHint: false (docs/tool-definition.md:782-806). Details the tool definitions must get right:

  • All ids are UUIDs. Tool descriptions must say where each id comes from: album ids from immich_list_albums, person ids from immich_search_people, asset ids from the album or asset responses.
  • immich_get_asset returns originalPath (the file path on the Immich server) and checksum. Drop both with responseMapping.transform.exclude (docs/tool-definition.md:627).
  • immich_get_timeline_buckets answers "how many per month" questions; say so in its description, since there is no GET asset search.
  • Use only parameters that exist since Immich 3.0. For example, the name filter on GET /people arrived in 3.3, which is why people are searched through /search/person.

Where to look

  • packages/backend/src/adapters/intl/grafana.json — self-hosted product with a user-supplied URL: baseUrl (line 46), envVarMeta (lines 15-33), verifyHints (lines 34-39).
  • packages/backend/src/adapters/intl/directus.json — smaller self-hosted read-only adapter; instructions (line 9) explain the SSRF allowlist.
  • packages/backend/src/adapters/intl/clockify.json:15-19 — API_KEY with a custom header name.
  • packages/backend/src/adapters/intl/todoist.live.spec.ts — the minimal spec template; intl/grafana.live.spec.ts:25-37 and intl/directus.live.spec.ts:135-139 show live tests against a user-supplied URL, gated by an env flag.
  • docs/tool-definition.md — response mapping and exclude (line 627).
  • .github/CONTRIBUTING.md:137 — the "Add an adapter" checklist; #982 — good-first-issue adapter guide.

Acceptance criteria

  • intl/immich.json exists with the 8 read-only tools, requiredEnvVars: ["IMMICH_URL","IMMICH_API_KEY"], envVarMeta for both, and a docsUrl.
  • No tool uses POST/PUT/PATCH/DELETE (asserted in the spec).
  • validate-adapters.mjs --warn is clean (the validator requires instructions ≥ 800 chars and each tool description ≥ 60 chars, scripts/validate-adapters.mjs:32-33); catalog.ts is regenerated; adapter-count.mjs --check passes.
  • intl/immich.live.spec.ts: static checks (base URL {{IMMICH_URL}}/api, x-api-key header, read-only methods, originalPath excluded from immich_get_asset); with RUN_IMMICH_LIVE=1 plus IMMICH_URL and IMMICH_API_KEY it calls /users/me and /albums on a real instance. npx jest src/adapters/intl/immich passes in packages/backend.
  • Logo at packages/frontend/public/logos/connectors/immich.svg.
  • instructions cover: minimum Immich version 3.0, where to create the key and the five permissions it needs, the SSRF allowlist on self-hosted, and public reachability on Cloud.
  • Docs updated: optional content/guides/en/immich-to-mcp.mdx.

Out of scope

  • Smart and metadata search (POST /search/smart, POST /search/metadata). They only read, but as POST they derive as writes; shipping them needs an annotations: {"readOnlyHint": true} override (docs/tool-definition.md:832). Good follow-up issue.
  • Uploading, editing, favouriting, archiving, trashing or deleting assets; creating or changing albums, people, tags and shared links.
  • Downloading originals, thumbnails or video streams (binary responses).
  • Admin endpoints (users, jobs, server statistics, system config) and API key management.

Free / test instance: run Immich locally with Docker Compose (https://docs.immich.app/install/docker-compose), upload a few photos and create an API key under Account Settings → API Keys. To look at real response shapes first, the public demo at https://demo.immich.app (login [email protected] / demo) runs 3.3.5. It is shared with everyone, so create your own key on your local instance, not there.

Size

S (a few hours)

How to claim

Comment "I'd like to work on this" and we'll assign you. Rules in #997.

Lingua principale
TypeScript
Stelle
856
Fork
82
Merge medio
7h 49m
PR unite (30g)
302

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di HelpCode-ai/anythingmcp

Tutte le issue di HelpCode-ai/anythingmcp

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.