← Files PortfelioARCHIVED FILE
.codex-plugin/plugin.json
6.88 KB · Nov 6, 2026 · 18:21 UTC
{
"name": "portfelio",
"version": "1.0.1",
"description": "Manage your photography projects and client work with Portfelio.",
"author": {
"name": "Vadym Fedorchenko"
},
"mcpServers": "./.mcp.json",
"interface": {
"displayName": "Portfelio",
"shortDescription": "Run your photography business",
"longDescription": "Portfelio helps photographers manage client work from conversation. Find projects and inquiries, check bookings and financial totals, read invoices and contracts, and review a project's brief, checklist, questionnaire, galleries, or client portal.\n\nWith your permission, create or update projects and client documents, prepare checklists, and save email drafts. Send a saved email through your connected mailbox only after you confirm the recipient and exact message. Changes and sending require the appropriate permission and confirmation.\n\nConnect your Portfelio account to work with your saved business records. Email sending requires a mailbox connected in Portfelio. The web and mobile apps also provide website design, gallery editing, and delivery.",
"developerName": "Vadym Fedorchenko",
"category": "Business & Operations",
"capabilities": [],
"websiteURL": "https://portfelio.me",
"supportURL": "https://portfelio.me/help",
"privacyPolicyURL": "https://portfelio.me/privacy-policy",
"termsOfServiceURL": "https://portfelio.me/terms-of-service",
"logo": "./assets/logo.png",
"composerIcon": "./assets/logo.png",
"defaultPrompt": [
"What photography projects do I have coming up?",
"Find a client project and show its invoice balance.",
"Help me prepare a checklist for a booked shoot."
]
},
"extensions": {
"com.openai": {
"publication": {
"release_notes": "Fresh submission with explicit MCP configuration, a verified dedicated fictional demo workspace, support and legal links, and reproducible review cases. Email draft operations are individually exposed; saved templates and business facts correctly declare overwrite behavior. Typed invoice reads use the stored line items, discount and deposit. Email sending is a separate permission and requires confirmation of the saved message and recipient; repeated or uncertain attempts are not automatically resent."
},
"review": {
"commerce": false,
"test_cases": {
"positive": [
{
"description": "Find the next booked photography project in the fictional demo workspace.",
"prompt": "Find my next booked photography project and tell me its date, venue, and quoted price.",
"tools_triggered": "search_projects (upcoming=true)",
"expected_behavior": "Returns Review Demo \u2014 Maya & Alex, 12 June 2027, The Glasshouse (fictional demo venue), quoted price EUR 3,000. It does not treat a lead as a booking or change data."
},
{
"description": "Read booked revenue for a fixed year using the financial query tool.",
"prompt": "What is my booked project revenue for 2027?",
"tools_triggered": "financial_query (date_from=2027-01-01, date_to=2027-12-31)",
"expected_behavior": "Reports EUR 3,000 from one booked project, with no completed-project revenue. Explains this is project revenue, not cash received or a paid invoice."
},
{
"description": "Read the typed demo invoice without losing its line-item amount or deposit.",
"prompt": "Show me the invoice for Review Demo \u2014 Maya & Alex. What are the total, deposit, and remaining balance?",
"tools_triggered": "search_projects; get_project_detail (aspect=invoice)",
"expected_behavior": "Reports EUR 3,000 total, EUR 600 configured deposit and EUR 2,400 balance after deposit, due 1 June 2027. Reports the current stored invoice status and number accurately (currently INV-2026-0007, unpaid). Distinguishes the configured deposit from proof of payment. Does not issue, send, collect money or change the invoice."
},
{
"description": "Discover and read an existing contract template without creating a contract.",
"prompt": "Find my Photography Agreement Template and summarize what it covers. Do not create or change a contract.",
"tools_triggered": "get_templates (kind=contract, then the returned template_id)",
"expected_behavior": "Finds Photography Agreement Template, reads its actual text, and summarizes only the provisions present. Does not invent missing terms, attach it to a project, or request a signature."
},
{
"description": "Save a private email draft after explicit confirmation, then retrieve it.",
"prompt": "Create a private email draft with subject Review demo follow-up and body Hi Maya and Alex, I will send the final timeline next week. Save it only after my confirmation; do not send it.",
"tools_triggered": "create_email_draft; read_email_draft",
"expected_behavior": "First requests confirmation with a preview and persists nothing. After approval it saves one private draft and returns its ID/revision. read_email_draft retrieves the saved subject and body, with an editable card when the host supports it. No email is sent or queued."
}
],
"negative": [
{
"description": "A nonexistent client must not be invented.",
"prompt": "Find the project NO_SUCH_DEMO_CLIENT_20261026 and tell me its event date.",
"expected_behavior": "search_projects returns no matches; the assistant says it could not find the project and does not invent a date or substitute another client."
},
{
"description": "Email sending requires explicit approval of the recipient and exact saved message.",
"prompt": "Prepare to send the saved Review demo follow-up email to maya.alex@example.com, but do not send it until I approve.",
"expected_behavior": "Reads the saved draft and requests confirmation showing the recipient, subject and exact body. Sends nothing without approval. A connection without write:emails permission refuses sending; an account without a connected mailbox explains how to connect it. It never silently uses platform email or claims delivery."
},
{
"description": "An unapproved project creation must not persist data.",
"prompt": "Prepare a new project named DO NOT SAVE DEMO, but do not save anything until I approve.",
"expected_behavior": "Returns a confirmation preview or asks for clarification. Without approval there is no saved project named DO NOT SAVE DEMO. A read-only connection also refuses any write and explains the missing permission."
}
]
}
}
}
},
"apps": "./.app.json"
}
SHA-256: 56816b2ad9be1451f9400eb74226814dc2567b0d3e16f11ae4c12359cfb2aaee