ワンクリックで
find-recipient-address-from-documents
Find postal addresses in past Paperless docs for a contact; always confirm with the user.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Find postal addresses in past Paperless docs for a contact; always confirm with the user.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Create a new contact (person or business) with ALL its channels and address in one call.
Fetch the full body and metadata of a single email by message_id.
Record a new bill / recurring expense
Create a new calendar event in Yorik's local calendar
Attach a postal address (home, work, billing, shipping) to an existing contact.
Attach a channel (email, phone, whatsapp, signal, sms, website, social) to a contact.
| name | find_recipient_address_from_documents |
| description | Find postal addresses in past Paperless docs for a contact; always confirm with the user. |
| when_to_use | When compose_check_recipient returned complete=false (the contact has no postal address on file), call this skill BEFORE asking the user. Flow: compose_check_recipient → complete=false ↓ find_recipient_address_from_documents(contact_id=42) ↓ candidates=[…] → present top candidate(s) to user, one short question: "Found this address in 'Mietvertrag 2024-09': Muststraße 12, 30159 Hannover. Use it?" candidates=[] → no Paperless hit, ASK user for the address. When the user confirms a candidate: 1. Call add_contact_address(contact_id=…, kind='home', line1=…, …) so it's saved for next time. 2. Call compose_draft(…). Don't call without compose_check_recipient first — this is the fallback when no address is on file, not a replacement. Cached results expire after 30 days (pass `use_cache=false` to force re-scan). Caps at 5 docs/call. |
| inputs | {"contact_id":{"type":"integer","required":true,"description":"Contact id returned by find_person."},"max_docs":{"type":"integer","required":false,"default":5,"description":"Cap on Paperless documents to scan. 1–10 sensible."},"use_cache":{"type":"boolean","required":false,"default":true,"description":"When true (default), returns previously-mined candidates if any exist. Pass false to force a fresh Paperless scan + LLM extract."}} |
| outputs | {"candidates":{"type":"array","description":"Address candidates with source_doc attribution. Empty if nothing found. Sorted by confidence DESC."},"scanned_count":{"type":"integer","description":"Number of Paperless documents actually scanned this call (0 when served from cache)."},"cached":{"type":"boolean","description":"True when the result came from the cache, false on fresh scan."}} |
| permissions | ["admin","member"] |
| side_effects | writes to contact_address_suggestions cache table (no external API mutations). |
| tags | ["compose","contacts","paperless","address","ocr"] |
The magic step in the Compose playbook. When compose_check_recipient
returns complete=false — meaning the contact has no postal address on
file — this skill scans the user's Paperless documents for past
correspondence with that person and extracts any postal addresses it
finds.
The user almost always has the address — it's on a past invoice, on
the rental contract, on a letter they scanned. The LLM looking it up
once and remembering it (via the contact_address_suggestions cache)
is dramatically better UX than asking "wie ist die Adresse von Hans"
every time.
correspondent AND where the contact's name appears in full-text.content field for each candidate
document (capped at max_docs).call_llm_extract LLM prompt
that powers WhatsApp/email address scraping. Letterheads tend to be
at the top, signatures at the bottom — so the skill keeps the first
and last 2KB of OCR text and discards the middle.source_kind='paperless' and
source_ref=str(paperless_doc_id) so the next call returns instantly.The _llm_hint field gives concrete next-turn guidance:
candidates=[] → "No documents found mentioning . Ask the
user for the address (one short question)."candidates=[…] → "Found addresses. Top match: <line1, postcode
city> (source: <doc_title>). Ask: 'Soll ich an diese Adresse
schicken?' If yes → add_contact_address + compose_draft."The skill never picks for the user — confirmation is always required before an address gets saved to the contact or used in a letter.