FieldCamp
AI Field Service Software
- Category
- Operations
- Primary Subcategory
- Field Service Management Software
Integration details
Description
FieldCamp connects ChatGPT to your field service business. Look up clients and job history, check schedules and technician availability, create and update jobs, build estimates and invoices, record payments, and track inventory — all from a conversation. Ask things like "What's on tomorrow's schedule?", "Which invoices are overdue?", or "Create a job for a client next Tuesday at 10am." Requires a FieldCamp account; every action respects your account's roles and permissions.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Field Service Management Software
- Secondary Subcategories
- None listed
- Brand
- FieldCamp
- Access
- Account required
- First tracked
- 2026-09-10
- Tool count
- 98
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Field Service Management Software
View Category98 tools agents can invoke
Move a custom-object record to a new pipeline stage. `stage` must be one of this object's valid_statuses from get_data_model(slug); the transition is validated server-side against the account's pipeline rules first (allowed transitions, required fields) and a clear error is returned if it is not allowed. Use update_record for field changes — this tool ONLY changes the stage.
change_stage
Check scheduling conflicts for team members against proposed visit times. Considers weeklySchedule, specificHours (availability), and existing visit overlaps. REQUIRED parameters: - teamMemberIds: array of team member MongoDB IDs - visits: array of visit objects [{visitStartDateTime, visitEndDateTime}] in UTC - timezone: string — user's timezone for proper comparison (e.g. 'America/New_York') OPTIONAL: - excludeJobId: string — exclude a specific job when checking overlaps
check_team_schedule_conflicts
Execute a conversion rule on a record — creates a NEW record in the rule's target object (e.g. template → live record, unit → renewal job). Confirm with the user before calling. Valid rule_id values: the conversion_actions listed by get_data_model(slug). Each rule has trigger stages — the record must currently be in one of them. additional_data (optional) is merged into the created record.
convert_record
Convert a service request into an estimate document. REQUIRED: - request_id: MongoDB ObjectId of the request to convert OPTIONAL: - conversion_data: Dictionary with estimate options - dueDate: ISO date for the estimate due date - paymentTerms: integer — number of days (e.g., 30 for Net 30, 0 for Due on receipt) - comments: string - internalNotes: string This copies all line items and taxes from the request into a new estimate, and marks the request stage as "converted". Returns the converted estimate ID and number.
convert_request_to_estimate
⚠️ CALL SHAPE — pass arguments exactly as: {"event_data": { ...event fields... }} All record fields go INSIDE the *_data object, NOT at the top level (top-level keys are rejected as "unexpected keyword argument"). Create a new event in Google Calendar. REQUIRED fields in event_data: - title: string — event title - start: ISO 8601 datetime — event start time - end: ISO 8601 datetime — event end time OPTIONAL fields: - timeZone: string (e.g. 'UTC', 'America/New_York') - isAllDay: boolean — whether event spans full day - attendees: array of {email, optional, id} — invitees - recurrence: object — {frequency, interval, weekdays, count, until} - location: string or object — event location - description: string — event notes - colorId: string — color ID or hex color - metadata: object — custom metadata in extended properties
create_calendar_event
⚠️ CALL SHAPE — pass arguments exactly as: {"client_data": { ...client fields... }} All record fields go INSIDE the *_data object, NOT at the top level (top-level keys are rejected as "unexpected keyword argument"). Create a new client in FieldCamp. REQUIRED fields: - client_data: Dictionary containing client information CLIENT_DATA REQUIRED fields: - firstName OR email — at least one of these is required. - firstName: string (MUST split full names - "John Smith" → firstName: "John", lastName: "Smith") - email: string CLIENT_DATA OPTIONAL fields: - lastName: string (can be empty "") - propertyAddress: object with {street, city, state, country, zipCode, formattedAddress} (all optional; an address object, NOT a plain string) - phoneNumber: object {countryCode: "+1", number: "5551234567", countryIdentifier: "us"} - companyName, website, taxNumber: string - billingAddress, companyAddress: object - notes: string - stage: ACCOUNT-SPECIFIC — call get_data_model("client") for this account's real stage values (accounts rename/replace the defaults; sending a stale default fails or mislabels the client) - clientType: "business" or "individual" - properties: array - preferredTechnicianIds, jobFormIds: arrays of ids (Clients have no `tags` field — it is not accepted, so do not send it.) Example: { "firstName": "John", "lastName": "Smith", "email": "[email protected]", "phoneNumber": {"countryCode": "+1", "number": "5551234567", "countryIdentifier": "us"}, "propertyAddress": { "formattedAddress": "123 Main St, Toronto, Ontario, Canada", "city": "Toronto", "state": "Ontario", "country": "Canada" } }
create_client
Create a record of a CUSTOM object (e.g. slug="unit"). Call get_data_model(slug) FIRST — `data` must be keyed by the canonical field NAMES it returns (not labels), and `status` (optional initial pipeline stage) must be one of its valid_statuses. Relation fields take the target record's id (or array of ids for multi-relations). Example: create_record("unit", data={"serial_no": "GEN-002", "client_ref": "<client id>"}, status="active")
create_record
⚠️ CALL SHAPE — pass arguments exactly as: {"document_data": { ...document fields... }} All record fields go INSIDE the *_data object, NOT at the top level (top-level keys are rejected as "unexpected keyword argument"). Create a new invoice or estimate in FieldCamp. REQUIRED fields in document_data: - documentNumber: integer — this field is required. Obtain the next number via the get_document_number tool (pass the same documentType) and use its value here. - documentType: 1 (Invoice) or 2 (Estimate) (default: 1) OPTIONAL fields: - clientId: MongoDB ObjectId - title: string - date: ISO date (default: today) - dueDate: ISO date - items: array of line items [{name, quantity, rate, description, taxIds}] - discount: number - discountType: 1 (percentage) or 2 (flat) - subTotal: number - total: number - paymentStatus: "unpaid", "paid", "partial", "overdue". HONORED ONLY for ESTIMATES (documentType=2). For INVOICES (documentType=1, the default) the backend hard-forces paymentStatus="unpaid" no matter what you pass (silently overwritten). To mark an invoice paid/partial, use the record_payment tool. - paymentTerms: integer — number of days (e.g., 30 for Net 30, 0 for Due on receipt) - privateNotes: string (internal) — or `comments` for client-facing text. Documents have no `notes` field — it is not accepted, so do not send it. - terms: string - tags: array MULTI-OPTION ESTIMATE (give the customer choices): set documentType=2, isMultiOption=true, and provide estimateOptions instead of a single items[]. Each option = {name, description?, isDefault?, lineItems:[{name, quantity, rate, description?}]}. Omit top-level items[] when using estimateOptions. Example (create invoice): { "documentNumber": 1, "documentType": 1, "clientId": "68efbd5a689d240560536cd6", "items": [ {"name": "HVAC Repair", "quantity": 1, "rate": 150, "description": "Emergency repair"} ], "dueDate": "2026-02-28" } Example (multi-option estimate): { "documentNumber": 1, "documentType": 2, "isMultiOption": true, "clientId": "68efbd5a689d240560536cd6", "estimateOptions": [ {"name": "Good", "lineItems": [{"name": "Basic clean", "quantity": 1, "rate": 100}]}, {"name": "Best", "isDefault": true, "lineItems": [{"name": "Deep clean", "quantity": 1, "rate": 250}]} ] }
create_document
⚠️ CALL SHAPE — pass arguments exactly as: {"job_data": { ...job fields... }, "notes": "optional"} All record fields go INSIDE the *_data object, NOT at the top level (top-level keys are rejected as "unexpected keyword argument"). Create a new job in FieldCamp. REQUIRED parameters: - job_data: Dictionary containing job information OPTIONAL parameters: - notes: Additional notes for the job (default: "") JOB_DATA REQUIRED fields: - clientId: MongoDB ObjectId (from search_database or get_client_by_id) - jobType: "one-off", "recurring", or "multi-day" - jobNumber: string or number - startDateTime: ISO 8601 format (e.g., "2026-01-25T09:00:00.000Z") - jobAddress: object with {city, state, country, formattedAddress} JOB_DATA OPTIONAL fields: - jobTypeId: id from get_job_types — the account's job-type catalog ("Annual PM" vs "6-Month Checkup"). Distinct from jobType above. - targetRecordId + targetObjectSlug: link this job to a custom-object record (e.g. targetObjectSlug="unit", targetRecordId=<record id from list_records>). This is how PM jobs attach to the asset they service. - billToClientId: bill a different client than clientId (property manager / homeowner split). - endDateTime: ISO 8601 format - jobPhone: object {countryCode: "+1", number: "xxx", countryIdentifier: "us"} - assignedToTeams: array of team IDs - jobItems: array of line-item objects. Each REQUIRES `itemName` (string) + `price` (per-unit number); `quantity` defaults to 1 and `total` is auto-computed (price*quantity). Reference an existing item with `itemId` (24-hex items id — NOT productServiceId/id); omit itemId for an ad-hoc line. E.g. [{"itemName": "Air filter", "price": 20, "quantity": 2}] - ⚠️ linkedRecords is NOT accepted (rejected with 400 — the backend silently drops it). Use targetRecordId + targetObjectSlug (above) to link a record instead. - subTotal, tax, total, discount: numbers - jobStatus: ACCOUNT-SPECIFIC — call get_data_model("job") for this account's real stage values before setting one. Create does NOT validate (it stores whatever string is sent), so a stale/guessed value silently mislabels the job for filtering/UI. Defaults to "scheduled" if omitted. - priority: "low", "medium", "high" - timezone: string (e.g., "America/Toronto") - anyTime: boolean - serviceDuration: number (seconds) - scheduleLater: boolean RECURRING JOBS: set jobType="recurring" AND provide recurringOptions — a list like [{"frequency": "weekly", "interval": 1, "duration": {"value": 1, "unit": "month"}}] (frequency = daily/weekly/monthly; interval = every N periods). Complex patterns (specific weekdays, nth-weekday, days-of-month) use customSettings {monthlyType, nthWeekday, daysOfMonth, weekDays}; if the pattern is non-trivial or unclear, confirm the exact recurringOptions with the user instead of guessing. Example: { "clientId": "68efbd5a689d240560536cd6", "jobType": "one-off", "jobNumber": "JOB-001", "jobStatus": "scheduled", "jobAddress": { "formattedAddress": "123 Main St, Toronto, Ontario, Canada", "city": "Toronto", "state": "Ontario", "country": "Canada" }, "startDateTime": "2026-01-25T09:00:00.000Z", "endDateTime": "2026-01-25T17:00:00.000Z" }
create_job
⚠️ CALL SHAPE — pass arguments exactly as: {"product_service_data": { ...fields... }} All record fields go INSIDE the *_data object, NOT at the top level (top-level keys are rejected as "unexpected keyword argument"). Create a new product or service in FieldCamp. REQUIRED parameters: - product_service_data: Dictionary containing product/service information PRODUCT_SERVICE_DATA REQUIRED fields: - name: string - type: "Product" or "Service" - price: number PRODUCT_SERVICE_DATA OPTIONAL fields: - description: string - properties: array - isTaxExempt/exemptFromTax: boolean (default: false) - duration: number (minutes, for services) - isActive: boolean (default: true) - isInventoried/trackInventory: boolean (default: false). If true, `inventory` (below) is REQUIRED — the backend creates a stock row and 400s/500s without it. - categoryIds: array of category IDs - inventory: object — required when tracking is on. Shape: { "locationId": "<24-hex warehouse ObjectId>", // REQUIRED. This is the // warehouse key — NOT "warehouseId"/"warehouse"/"location" // (those are not accepted). Get one from get_warehouses. "sku": "SKU-001", // REQUIRED, must be GLOBALLY unique (duplicate 500s) "quantity": 10, // integer on-hand count (default 0) "lowStockAlert": 5, // integer reorder threshold (default 5) "binLocation": "A-1" // optional } - taxIds: array of tax IDs - formIds: array - settings: object with {onlineBooking, allowFillForm, serviceDuration, bookingType} - cost: number — internal unit cost (never client-facing); drives the estimate phase-margin breakdown (product cost → Material, service cost → Labor) - unitOfMeasurementId: string — unit of measurement id (sq ft, hour, each, …); valid ids from GET /api/unit-measures; reads return populated unitOfMeasurement Example: { "name": "GPU", "type": "Product", "price": 100, "description": "High-performance graphics card", "isActive": true, "exemptFromTax": false, "trackInventory": false }
create_product_service
Create a purchase order (order stock from a vendor) in FieldCamp. REQUIRED in po_data: - vendorId: the supplier to order from (use get_vendors to find it). - items: non-empty array of line items. Each item: {itemId, quantity, price}; set displayType:'kit' to order an inventory kit (the backend expands it into its component items). OPTIONAL in po_data: - poNumber, expectedDeliveryDate (ISO date), notes. Call get_vendors for the vendorId and get_products_services / get_inventory for item ids before creating.
create_purchase_order
⚠️ CALL SHAPE — pass arguments exactly as: {"request_data": { ...request fields... }} All record fields go INSIDE the *_data object, NOT at the top level (top-level keys are rejected as "unexpected keyword argument"). Create a new service request in FieldCamp. REQUIRED fields in request_data: - clientId: MongoDB ObjectId of the client OPTIONAL fields: - source: string (default: "manual") - description: string - urgency: string enum — "low", "medium", "high", "critical" (default: "medium") - requestAddress: object {formattedAddress, city, state, country} - startDate: ISO 8601 format - endDate: ISO 8601 format - stage: ACCOUNT-SPECIFIC (request pipeline is org-configurable) — call get_data_model("request") for this account's real stage slugs. Default: "new_request". Built-in default slugs: new_request, unscheduled, overdue, inspection_scheduled, inspection_complete, quote_created, quote_sent, converted, lost_no_response, lost_reject_quote, cancelled, duplicate - assignedTo: array of user MongoDB ObjectIds - notes: string - tags: array of strings - estimatedValue: number - items: array of line items [{itemId, itemName, quantity, rate}]. ⚠️ itemId is REQUIRED on each item and MUST be a real product/service id from get_products_services — items without a valid itemId cause a server error. If you have no product id, OMIT items entirely (use description/estimatedValue). - taxes: array of tax objects [{taxId, name, rate, taxType}] Example: { "clientId": "68efbd5a689d240560536cd6", "description": "HVAC repair needed", "urgency": "high", "stage": "new_request" }
create_request
Create a new task in FieldCamp. REQUIRED parameters: - name: Task name/title - scheduleDateTime: ISO 8601 format (e.g., "2026-01-25T14:00:00.000Z") OPTIONAL parameters: - instructions: Detailed task instructions - priority: "low", "normal", "high", "urgent" (default: "normal") - category: "admin", "maintenance", "follow_up", "inspection" (default: "follow_up") - assignedToId: MongoDB ObjectId of user to assign (search users collection) - clientId: MongoDB ObjectId of linked client - linkType: "client", "job", "estimate", "invoice" - jobId, estimateId, invoiceId: MongoDB ObjectIds for linked entities - propertyAddress: string - scheduleType: "once", "daily", "weekly", "monthly" (default: "once"). For a recurring task pass a non-"once" value AND a recurrenceRule — recurrence is driven by recurrenceRule; scheduleType is the stored label. - scheduleEndDate: ISO 8601 format (for recurring tasks) - allDay: boolean (default: false) - duration: minutes (default: 30) - recurrenceRule: e.g., "FREQ=DAILY;INTERVAL=1" (for recurring) - recurrenceCount: number of occurrences - reminderType: "email", "sms", "push" - reminderTime: minutes before task (default: 15) - tags: array of strings - emailTeam: boolean - notify assignee (default: false)
create_task
Create a tax rate in FieldCamp. REQUIRED in tax_data: - name: tax name (e.g. 'GST'). - rate: percentage as a number (e.g. 5 for 5%). OPTIONAL in tax_data: - taxType: 1 = exclusive (default), other values per settings. - description, applyOnAllItems (bool), countryId, stateId, effectiveDate (ISO date), applicationRules (array). The new tax id feeds the `taxIds` arrays on create_document and create_product_service. Admin / settings permission required.
create_tax
Create a vendor / supplier in FieldCamp. REQUIRED: - name: vendor name. OPTIONAL: - email: must be unique for the org (backend rejects a duplicate). - phone: composite OBJECT (dict), NOT a plain string — a bare string is rejected by the backend. Shape: {"countryCode": "+1", "number": "4155550100", "countryIdentifier": "us"} - address: composite OBJECT (dict), NOT a plain string — a bare string is rejected by the backend. Shape (sub-fields optional; at minimum pass {"formattedAddress": "..."}): {"formattedAddress": "...", "city": "...", "state": "..."} Returns the created vendor. Use its id as `preferredVendorId` on create_product_service / update_product_service. Call get_vendors first to check whether the vendor already exists.
create_vendor
Create a new visit/appointment for a job. REQUIRED parameters: - jobId: MongoDB ObjectId of the job (get from search_database or get_job_by_id) - visitStartDateTime: ISO 8601 format (e.g., "2026-01-25T14:00:00.000Z") - visitEndDateTime: ISO 8601 format (e.g., "2026-01-25T16:00:00.000Z") - teamId: List of team-member IDs. Pass as array (preferred, e.g. ["t1", "t2"]) or JSON-string (e.g. '["t1","t2"]'). Both forms are accepted; the server normalizes to an array on the wire. OPTIONAL parameters: - visitStatus: account-specific — call get_data_model("visit") for valid values (default: "scheduled") - priority: "low", "medium", "high" (default: "medium") - scheduleLater: "true" or "false" as string (default: "false") - anyTime: "true" or "false" as string - flexible time (default: "false") - isExtraVisit: "true" or "false" as string - extra visit beyond original (default: "false") - skillsId: required skills for the visit
create_visit
Create a warehouse / inventory location in FieldCamp. REQUIRED: - name: warehouse name. OPTIONAL: - warehouseType: stored as the warehouse type (e.g. 'Main Warehouse', 'Technician Truck/Van'). - address: composite OBJECT (dict), NOT a plain string — a bare string is rejected by the backend. Shape (all sub-fields optional; at minimum pass {"formattedAddress": "..."}): { "formattedAddress": "123 Main St, Austin, TX 78701, USA", "street": "123 Main St", "city": "Austin", "state": "TX", "country": "USA", "zipCode": "78701" } Returns the created warehouse. Use its id as fromWarehouseId / toWarehouseId on transfer_inventory and as the `warehouse` filter on get_inventory. Call get_warehouses first to check whether a matching location already exists.
create_warehouse
Delete an event from Google Calendar. REQUIRED: - eventId: string — ID of the calendar event to delete
delete_calendar_event
Delete a client from FieldCamp. ⚠️ WARNING: This is a destructive operation! REQUIRED: - client_id: MongoDB ObjectId of the client OPTIONAL: - forceDelete: "true" to permanently delete, "false" to soft delete (default: "false") Set forceDelete="true" to permanently delete the client and all associated data. Set forceDelete="false" to soft delete (can be recovered).
delete_client
Delete invoice(s) or estimate(s) from FieldCamp. ⚠️ WARNING: This is a destructive operation! REQUIRED: - document_ids: Array of document MongoDB ObjectIds to delete
delete_invoice
Delete inventory item(s) from FieldCamp. ⚠️ WARNING: This is a destructive operation! REQUIRED: - delete_ids: Array of inventory item MongoDB ObjectIds OPTIONAL: - current_warehouse_id: MongoDB ObjectId of warehouse (when an item exists in multiple warehouses, this picks which one to delete)
delete_inventory
Delete a single job from FieldCamp. ⚠️ WARNING: This is a destructive operation! REQUIRED: - job_id: MongoDB ObjectId of the job NOTE: This tool deletes ONE job at a time. If the user wants to delete multiple jobs, call this tool separately for each job_id.
delete_job
Delete product(s) or service(s) from FieldCamp. ⚠️ WARNING: This is a destructive operation! REQUIRED: - delete_ids: Array of product/service MongoDB ObjectIds to delete
delete_product_service
Delete one or more purchase orders in FieldCamp. REQUIRED: - delete_ids: array of purchase order ids to delete (from get_purchase_orders). DESTRUCTIVE: removes the purchase orders and their line items. Confirm with the user before calling.
delete_purchase_order
Delete a service request from FieldCamp (soft delete). ⚠️ WARNING: This is a destructive operation! REQUIRED: - request_id: MongoDB ObjectId of the request Sets the request status to 'Deleted' and removes related items and taxes. Only the request creator or parent user can delete.
delete_request
Delete a task from FieldCamp. ⚠️ WARNING: This is a destructive operation! REQUIRED: - task_id: MongoDB ObjectId of the task
delete_task
Delete one or more tax rates in FieldCamp. REQUIRED: - delete_ids: array of tax ids to delete (from get_taxes). DESTRUCTIVE: soft-deletes the taxes (status='Deleted') and marks any QuickBooks tax mappings deleted. Existing documents keep their stored tax values. Admin / settings permission required. Confirm with the user before calling.
delete_tax
Delete one or more vendors / suppliers in FieldCamp. REQUIRED: - delete_ids: array of vendor ids to delete (from get_vendors). DESTRUCTIVE: the backend archives each vendor and its related data, then removes the vendors and their purchase orders. Confirm with the user before calling.
delete_vendor
Delete a visit/appointment from FieldCamp. ⚠️ WARNING: This is a destructive operation! REQUIRED: - visitId: MongoDB ObjectId of the visit
delete_visit
Delete one or more warehouses / inventory locations in FieldCamp. REQUIRED: - delete_ids: array of warehouse ids to delete (from get_warehouses). DESTRUCTIVE: the backend archives each warehouse and its related data, then removes inventory transfers/items in those warehouses and flags affected products as non-inventory. Confirm with the user before calling.
delete_warehouse
Send an invoice or estimate to a client via email. REQUIRED: - to: array of recipient email addresses - subject: email subject line - message: email message body OPTIONAL: - documentId: MongoDB ID of the document (for tracking) - documentType: 1=Invoice, 2=Estimate - documentNumber: document number (for PDF filename) - documentViewUrl: URL for 'View Document' button in email - cc: array of CC email addresses - bcc: array of BCC email addresses - attachPdf: boolean — attach rendered PDF (default: false)
send_document_email
Fetch the FULL record for a single type-prefixed id returned by `search`. This is step two of the search→fetch retrieval pair: after `search` finds a record, call `fetch` with its `id` to pull the complete details (all fields) for clients, jobs, visits, products/services, invoices, estimates, requests, and tasks. It routes to the correct underlying record lookup automatically based on the id prefix — you do NOT need to know or call the entity-specific get_*_by_id tool yourself. PARAMETERS: - id: the TYPE-PREFIXED id from a `search` result, e.g. "client:<id>", "job:<id>", "invoice:<id>", "estimate:<id>", "request:<id>", "product:<id>", "visit:<id>", "task:<id>" (or "custom:<slug>:<id>"). RETURNS a JSON object: {"id", "title", "text", "url", "metadata"} where `text` is the full record serialized as readable JSON, `url` is the app deep link, and `metadata` carries key fields (status, totals, type, ...).
fetch
Return THIS account's LIVE, customized schema — the real pipeline status values, allowed transitions, and custom fields for an object. Pipelines, statuses and fields are CUSTOMIZABLE per account, so the default status names mentioned in other tools may not match this account. Call this BEFORE filtering/setting a status or creating/updating a record whenever you are unsure of the valid values for THIS account — then use the exact values it returns. Scoped to the caller's own organization. object_type: "client", "job", "visit", "invoice", "estimate", "request", "task", or "all" (default). Also accepts any CUSTOM object slug (tenant-defined — e.g. "unit"). "all" lists custom objects by name only; pass the specific slug to get its fields (keyed by canonical field NAME — use these exact names in create_record/update_record `data`), stages, transitions, and conversion actions (valid rule_id values for convert_record).
get_data_model
Get activity history for any entity (audit trail). REQUIRED: - module_id: MongoDB ObjectId of the record - module_type: "job", "visit", or a CUSTOM-OBJECT SLUG. Custom-object records DO have history: create/update/delete each write a History row keyed by the object slug. Pass the `slug` field from list_object_definitions VERBATIM — it is not the plural form and not the display name (real slugs look like "warnty", "contract_renewal", "all_mode", whose namePlural is a separate display-only field). A record with no history yet returns an empty list, which means "nothing recorded for this record", not "unsupported". NOT available here: "client" and "request". Client activity lives in a separate clientHistory table this endpoint does not read, and request activity is not recorded at all — both return an EMPTY result rather than an error, so do not read an empty response as "nothing ever changed". OPTIONAL: - page: page number (default: 1) - limit: max records per page (server-clamped to 30) Returns chronological activity log including who made changes, what was changed, descriptions, and timestamps. Use for: "What changes were made to this job?", "History of this visit?"
get_history
Get available team members for a specific time slot. Checks both visit overlaps and team member schedules (weeklySchedule/specificHours). REQUIRED parameters: - visitStartDateTime: ISO 8601 start time in UTC - visitEndDateTime: ISO 8601 end time in UTC - timezone: string — user's timezone (e.g. 'Asia/Kolkata') OPTIONAL: - requiredSkillIds: array of skill IDs to filter by required skills - excludeJobId: string — exclude this job from conflict check
get_available_team_members_schedule
Get business analytics and metrics data. This is the PREFERRED tool for totals, sums, rankings, and trends (e.g. total outstanding A/R, top clients, revenue over time) — it computes them server-side. Do not try to total these yourself by listing records. REQUIRED: - metric: The metric to retrieve (see list below) ⚠️ ALWAYS pass start_date AND end_date. Most metrics return an EMPTY result ("data": []) when no date range is given. For an "all-time" total, pass a wide range (e.g. start_date="2020-01-01" through a date in the future). Example: outstandingRevenue over a wide range returns the current total A/R; topRevenueClients returns the ranked client list. OPTIONAL: - start_date: ISO date (e.g., "2026-01-01") - end_date: ISO date (e.g., "2026-01-31") - group_by: "auto", "day", "week", "month", "quarter", "none" (default: "auto") - breakdown_by: dimension to break down by (see list below). NOTE: breakdown_by is applied PER-METRIC — not every dimension works with every metric, and a dimension the chosen metric doesn't support is silently ignored (no error; the result simply comes back without that breakdown). - filters: array of filter objects AVAILABLE METRICS: Jobs: totalJobsForChart, jobCompletionRate, jobVolumeTrends, avgJobValue, avgJobDuration, jobStatusDistribution, jobTypeDistribution, jobsByClient, jobsByAssignee Visits: totalVisits, visitSuccessRate, avgVisitDuration, visitsPerJob Financial: revenueTrends, paidRevenue, outstandingRevenue, overdueInvoiceAmount, invoiceCount, avgInvoiceValue, collectionRate, topRevenueClients, avgDaysToPayment Estimates: totalEstimates, estimateValue, estimateApprovalRate, estimateConversionRate CRM: newClientsOverTime, totalClients, totalRequests, clientConversionRate, requestConversionRate, clientsStages, requestsByStage Tasks: totalTasks, taskCompletionRate, overdueTasksCount, tasksByStatus, tasksByPriority Workforce: scheduledHoursByTechnician, jobsPerTechnician, technicianRevenue Geographic: jobsByCity, revenueByCity, clientsByCity BREAKDOWN DIMENSIONS: createdBy, assignedTo, teamId, clientId, clientType, clientStage, jobStatus, paymentStatus, visitStatus, jobType, city, state
get_analytics
Get complete client details by MongoDB ObjectId. PARAMETERS: - client_id: MongoDB ObjectId of the client Returns all client information including name, contact details, property address, billing address, tags, custom fields, and metadata.
get_client_by_id
Get documents (invoices and estimates) for a specific client. REQUIRED: - client_id: MongoDB ObjectId of the client OPTIONAL: - view: Set to "assigned" to only see documents assigned to current user Returns list of documents with document type (1=Invoice, 2=Estimate), document number, status, payment status, title, total, and date.
get_client_documents
Get payment history for a specific client. REQUIRED: - client_id: MongoDB ObjectId of the client OPTIONAL: - view: Set to "assigned" to only see payments from documents assigned to current user Returns list of payments with document number, payment amount, payment date, payment method, document total, and payment status. Sorted by payment date descending.
get_client_payment_history
Get products associated with a specific client from their jobs. REQUIRED: - client_id: MongoDB ObjectId of the client OPTIONAL: - view: Set to "assigned" to only see products from jobs assigned to current user Returns list of products with item name, description, quantity, price, total, and linked job number.
get_client_products
Get company information and settings. OPTIONAL: - withCurrencyData: when True, backend enriches the response with extra currency metadata. Default False (flag omitted from wire). Returns company details including business name, address, phone, email, website, timezone, currency, industry, mileage tracking settings, labor rate settings, and other configuration. Use for: Understanding business context (timezone, currency, industry) before performing operations.
get_company_info
Get the company's weekly business hours and specific hour exceptions (holidays, special hours). Returns weeklySchedule (7 days) and specificHours (date-specific overrides).
get_company_schedule
Get one custom-object record by MongoDB ObjectId. Returns the record's status (pipeline stage), its `data` object (keyed by canonical field names — see get_data_model(slug)), and system timestamps.
get_record
Get AI-powered dispatch suggestions for unassigned visits. Recommends technicians based on workload, availability, and client relationships. OPTIONAL parameters: - visitId: string — get suggestions for a specific unassigned visit - date: string (YYYY-MM-DD) — target date for finding unassigned visits (default: today)
get_dispatch_suggestions
Get inventory item details by MongoDB ObjectId. REQUIRED: - inventory_id: MongoDB ObjectId of the inventory item Returns complete inventory information including item details, warehouse, quantity, SKU, and metadata.
get_inventory_by_id
Get invoice or estimate details by MongoDB ObjectId. PARAMETERS: - document_id: MongoDB ObjectId of the invoice/estimate Returns complete document information including line items, payments, client details, and status.
get_invoice_by_id
Get complete job details by MongoDB ObjectId. PARAMETERS: - job_id: MongoDB ObjectId of the job - view: View options: 'all', 'own', 'viewAssigned' (default: 'all') Returns job information including client, visits, line items, invoices, and metadata.
get_job_by_id
List this account's job-type catalog — the named service types jobs are classified by (e.g. "Annual PM", "6-Month Checkup"), each with an id, description, and estimated duration. Use the returned `id` as `jobTypeId` in create_job/update_job job_data. Job types are account-defined; never guess a jobTypeId. PARAMETERS: - page / limit: pagination - search: filter by title (contains, case-insensitive)
get_job_types
Get the next available document number for invoices or estimates. REQUIRED: - documentType: integer — 1=Invoice, 2=Estimate
get_document_number
Get the next available job number. Returns the next sequential job number for job creation. Useful for previewing the job number before creating a job.
get_next_job_number
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are FieldCamp alternatives on ChatGPT?
As of 2026-09-10, FieldCamp competes with A4B CMMS, AI Dispatcher by FieldCamp, BlueSuite, Crisphive, D-Tools Cloud, EquipDash, EZFlow Pro, Field Control, Fielmo, Itcons.app Work Reports, Knowify, magicplan, Meistron, OpsBack, PracticPro, Presuo, ProjectBase Beta, Qminder, QuoteCraft AI, Relay Tow, ServiceM8, Sitemate, STACK, Sunwise, Trussi AI in ChatGPT Field Service Management Software, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.