contact-vcard-extractor
Skill584 starsChanged 59 days agoMITView on GitHub
Extract contact information from text, chat logs, web pages, screenshots, business card photos, and QR codes/OCR results; clean names, phone numbers, email addresses, companies, job titles, addresses, and websites; generate vCard/.vcf files; and guide users to import them into iOS Contacts or share them with others. Trigger words include: extract contacts, save to contacts, generate vCard/.vcf, business card recognition, add contacts from images/screenshots/text, share contacts, and export contacts.
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 3 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 27
If the name or phone/email is missing, ask whether the user wants to add it.
- Very specific: line 29
Use the bundled script: /var/minis/skills/contact-vcard-extractor/scripts/contact_to_vcard.py
- Very specific: line 33
Use minis-open /var/minis/workspace/xxx.vcf to preview/share within the app.
- Very specific: line 34
If the user explicitly wants to open the import screen, run apple-open /var/minis/workspace/xxx.vcf or minis-open.
- Distinctive: line 41
After saving the OCR output as a text file, run the parsing script.
- Very specific: line 57
Multiple contacts: If the text or image clearly contains multiple people, generate separate .vcf files, or merge them into one contacts.vcf …
- Very specific: line 58
QR codes: If the QR code content is MECARD:, BEGIN:VCARD, tel:, mailto:, WeChat, or a URL, parse it according to the content.
- Very specific: line 61
File naming: Prefer Name.vcf; if the name is empty, use contact-YYYYMMDD-HHMM.vcf.
- Distinctive: line 80
After opening it, you can add it to Contacts or share it directly with someone else.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Contact vCard Extractor
Objective
Convert contact information from user-provided text or images into previewable, importable, and shareable .vcf vCard files. Prioritize the real user experience: extract the data and have the user confirm it before generating the file. Mark any uncertain fields and do not silently fill in guesses.
Typical Workflow
- Receive Input
- Text: Directly parse user messages, pasted text, or results extracted from web pages.
- Images: Business card photos, screenshots, posters, or chat screenshots. First use
apple-vision ocrto recognize text. If it appears to contain a QR code, useapple-vision barcode. - Files: First check
/var/minis/attachments/,/var/minis/workspace/, and/var/minis/mounts/.
- Extract Fields
- Name
FN/N - Phone
TEL: Multiple numbers must be split into separateTELentries. The number field should contain only the number itself. Do not append labels such as "front desk," "mobile," or "WeChat" to the number. Export all phone numbers uniformly asTEL;TYPE=CELL; users can change the type themselves if needed. Labels can be shown in the summary and, if necessary, placed in notes. - Email
EMAIL - Company
ORG - Job title
TITLE - Address
ADR - Website
URL - Notes
NOTE: Source, WeChat ID, uncategorized but long-term useful information, and uncertain recognition items. Do not include temporary to-dos, reminders, or next follow-up items.
- Name
- User Confirmation
- List the fields concisely and highlight content that may have been recognized incorrectly.
- If the name or phone/email is missing, ask whether the user wants to add it. If the user is in a hurry, generate an "Unnamed Contact."
- Generate vCard
- Use the bundled script:
/var/minis/skills/contact-vcard-extractor/scripts/contact_to_vcard.py - Output to
/var/minis/workspace/Contact Name.vcf. Remove special characters from the file name. If necessary, usecontact.vcf.
- Use the bundled script:
- Present and Import/Share
- Provide a Markdown file link:
[Import Contact](minis://workspace/xxx.vcf). - Use
minis-open /var/minis/workspace/xxx.vcfto preview/share within the app. - If the user explicitly wants to open the import screen, run
apple-open /var/minis/workspace/xxx.vcforminis-open. Usually, preferminis-opento stay in the chat.
- Provide a Markdown file link:
Image/OCR Command Pattern
apple-vision ocr /var/minis/attachments/card.jpg --lang zh-Hans,en --level accurate --compact
apple-vision barcode /var/minis/attachments/card.jpg --compactAfter saving the OCR output as a text file, run the parsing script.
Text-to-vCard Command
python3 /var/minis/skills/contact-vcard-extractor/scripts/contact_to_vcard.py \
--text-file /var/minis/workspace/contact_ocr.txt \
--out /var/minis/workspace/contact.vcf \
--jsonText can also be passed via stdin. Do not inline very long text in shell commands; for long text, first use file_write to write it to a file.
User Experience Details
- Do not include temporary information in contact notes: For example, to-dos such as "Send a quote next Tuesday," "Call back tomorrow," or "Follow up at the end of the month" should be removed from the vCard notes. In the reply, separately ask, "Would you like me to create a reminder or to-do item?" If the user explicitly agrees, use
apple-reminders createto create the reminder. - Phone fields must be clean and consistently CELL:
TELmay contain only numbers, such as010-66668888or13344445555. For "010-66668888 (front desk), mobile 13344445555," split it into two phone entries. Use "front desk/mobile" only as display labels or notes, and do not append them to the number. When exporting, useTEL;TYPE=CELLfor all phone numbers. Do not write types such asVOICE/HOME/WORKunless the user explicitly specifies them. - Do not import directly into Contacts unless the user explicitly confirms. First generate the vcf and have the user open it to confirm.
- Keep privacy prompts lightweight: Contacts are personal information. Remind users to confirm authorization and content only when sharing or processing in batches.
- Multiple contacts: If the text or image clearly contains multiple people, generate separate
.vcffiles, or merge them into onecontacts.vcffile containing multiple vCards. Finally, list each person in a table. - QR codes: If the QR code content is
MECARD:,BEGIN:VCARD,tel:,mailto:, WeChat, or a URL, parse it according to the content. Raw vCard content can be saved directly as.vcf; MECARD must be converted. - Chinese names: The vCard
Nfield can use the first character as the family name and the remaining characters as the given name. If uncertain, prioritize correct display inFN. - International numbers: Preserve
+Country Code, extensions, and spaces. Do not forcefully rewrite them. - File naming: Prefer
Name.vcf; if the name is empty, usecontact-YYYYMMDD-HHMM.vcf. - Final reply format:
- A one-sentence confirmation that it has been generated.
- A summary of the fields.
- A link to the file.
- "Tap it to add it to Contacts, or use the share button to send it to someone else."
Sample Reply
I’ve organized this business card:
| Field | Content |
| Name | Zhang San |
| Phone | +86 138 0000 0000 |
| zhangsan@example.com | |
| Company | Example Tech |
Import/Share Contact
After opening it, you can add it to Contacts or share it directly with someone else.
Bundled Script Notes
contact_to_vcard.py performs basic rule-based extraction and vCard escaping. It is not the only method: for complex input, low-quality OCR, or messy layouts, use model judgment to manually correct the fields before generating the vCard.
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 1
- lsongdev/skills★ 094% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository56 other files it gives its agents.
- android-devSkill
- android-ui-automationSkill
- apple-remindersSkill
- appstoreprice-hubSkill
- asc-cliSkill
- bilibili-hubSkill
- Clash 控制器Skill
- cloudflare-dnsSkill
- codex-imageSkill
- codex-on-ishSkill
- coredevice-toolkitSkill
- deepseek-usageSkill
- doubao-ttsSkill
- douyin-downloaderSkill
- evidence-chain-builderSkill
- exa-searchSkill
- free-ttsSkill
- fucai3d-latestSkill
- generative-ui-minisSkill
- github-sync-helperSkill
- health-sleep-analysisSkill
- health-training-checkinSkill
- hyperframes-cliSkill
- hyperframesSkill
- ios-devSkill
- korea-stockSkill
- maimai-hubSkill
- memos-apiSkill
- nano-bananaSkill
- notion-hubSkill
- openstreetmap-markerSkill
- pdf-converterSkill
- production-agent-publicSkill
- qbt-hubSkill
- quark-hubSkill
- reverse-dcfSkill
- self-improving-agentSkill
- shortcuts-builderSkill
- shortcut-share-fileSkill
- spotify-hubSkill
- stock-fund-flowSkill
- stock-priceSkill
- tavily-searchSkill
- tg-hubSkill
- todoocardSkill
- twitter-downloaderSkill
- twitter-x-hubSkill
- us-stockSkill
- web-content-extractorSkill
- web-searchSkill
- weibo-hubSkill
- whenpeakSkill
- xianyu-hubSkill
- xiaohongshu-hubSkill
- youtube-downloaderSkill
- ytmusic-hubSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

