Repro Copilot
A ChatGPT plugin backed by the existing Repro application. ChatGPT handles the conversation and writing; Repro remains the authority for accounts, permissions, prices, availability and workflow actions. No additional OpenAI API key is required.
Connect
Use the supplied plugin folder or ZIP in a host that accepts portable agent plugins. Alternatively, add a custom remote MCP app in ChatGPT with:
Name: Repro Copilot
MCP URL: https://reprodashboard.com/api/copilot/mcp
Authentication: OAuth
The host discovers OAuth metadata and registers a public client automatically. Leave manually supplied client credentials blank when the host supports dynamic registration. Sign in to your usual Repro account, review the exact account and scopes, then allow the connection. ChatGPT custom-app availability depends on the account and workspace's enabled developer capabilities. Public app-store distribution is a separate submission process.
Revoke a connection in Repro at https://reprodashboard.com/copilot/connections, also linked from account security. Connecting does not book shoots or send client notifications.
Integration controls
Open Settings → Integrations → ChatGPT. Integration administrators can switch Copilot on or off, select its ten feature groups, enable read-only access, and configure the official published ChatGPT listing URL. These settings apply on the server to existing connections and previously prepared actions. Roles and account permissions still apply. Saves are audited and reject stale versions.
Turning Copilot off blocks new connections and tool access and pauses watch checks. Saved watches resume when enabled. Users can revoke their own connections while Copilot is off. Refresh Repro in ChatGPT after changing controls to update the host's available tool list.
The connection button opens the configured Repro listing directly; ChatGPT and Repro still require the user's approval. Until a published listing URL is configured, the button opens ChatGPT Plugins with custom MCP setup instructions and a copyable server URL. Configuring a URL does not submit or publish an App Store listing.
Try: “Show shoots needing attention this week”, “Find my Oak Lane shoot”, “Compare available photographers for this service”, or “Prepare a photography request for this property”. Review the returned preview before confirming an action.
Included workflows
| Workflow | Tools | Behavior |
|---|---|---|
| Account | get_profile | Current connected identity and effective permissions |
| Shoots | search, fetch, list_shoots | Source links, role-scoped records, appropriate notes, pagination |
| Operations | operations_brief | Recorded workflow/media blockers with date basis |
| Booking | get_services, find_availability, prepare_booking | Existing-client lookup, visible catalog, actual availability, immutable priced review |
| Changes | prepare_reschedule, prepare_note, get_draft, commit_action | Expiring previews, stale-state rejection, single operation submission |
| Watches | prepare_watch, list_watches | Five-minute checks; Repro in-app alerts on changes |
| Accounting | finance_report | Collections by currency; photographer, editor and sales-rep payouts; explicit bases/exclusions |
| Studio | studio_status | Authorized workspace processing status |
| Marketing | listing_pack, client_insights | Grounded facts for draft copy and booking-activity comparisons |
| Help | support_guide | Existing Repro workflow knowledge |
Interactive cards provide shoot inspection, source navigation, account information, reports and explicit action review. They support light/dark appearance, mobile widths, keyboard navigation and safe text rendering.
Boundaries
- Client bookings remain Requested until the normal team approval process. Availability is not a reservation.
- Booking changes reuse the canonical Repro actions and their notification, calendar and provider rules. A saved record is not proof of notification delivery.
- Multi-unit bookings, advanced travel overrides, upload/download handling, paid Studio processing, payment capture, invoice approval, outbound outreach and publishing remain in their existing Repro screens.
- Watches notify inside Repro; they do not push messages into a closed ChatGPT conversation.
- Finance is restricted to authorized administrators, requires a finance grant, and is not a profit calculation. Accounts without accounting access receive read/write scopes only.
- Listing copy is generated by ChatGPT from returned facts; the plugin does not publish content or release gated media.
Authentication and operations
OAuth uses authorization code + PKCE S256, exact HTTPS ChatGPT callback matching, audience-bound opaque tokens stored as hashes, one-use codes, rotating refresh tokens with replay-family revocation, short access expiry and user-controlled revocation. Dashboard tokens are never accepted by MCP. Runtime permissions and active-account status are checked for each tool call.
Discovery: /.well-known/oauth-authorization-server and the path-aware /.well-known/oauth-protected-resource/api/copilot/mcp, with a root resource-metadata fallback. Canonical metadata also exists at /api/copilot/oauth/metadata and /api/copilot/oauth/resource. MCP is stateless Streamable HTTP POST with JSON responses. GET/SSE and session deletion return 405.
Laravel defines copilot:check-watches every five minutes and copilot:prune daily. Production runs dedicated Copilot-only cron entries for these commands; preserve those entries without enabling unrelated scheduled tasks. Expired previews cannot submit. An uncertain submitted operation stays in processing and is retained during pruning; retrieve that same draft and reconcile its outcome instead of creating a new booking.
Implementation lives in app/Services/Copilot, app/Http/Controllers/Copilot, resources/views/copilot/widget.blade.php, and the frontend consent/connections pages. Feature tests cover OAuth, access boundaries and action behavior; browser tests exercise the host bridge with fixtures. Actual rendering inside the user's ChatGPT host is the final connection check.
Platform references: plugin packaging, OAuth, MCP.