{
  "schema_version": "1.0",
  "name": "Fieldproxy",
  "category": "Field service management software",
  "summary": "AI-native field service management that is open by design. Get your own custom field service management within a day. Tailored to your workflows.",
  "verified": "October 18, 2026",
  "pricing": {
    "api_access_included_on_every_plan": true,
    "mcp_server_included_on_every_plan": true,
    "details": "https://www.fieldproxy.ai/pricing"
  },
  "docs": "https://www.fieldproxy.ai/developers/docs",
  "llms_txt": "https://www.fieldproxy.ai/developers/llms.txt",
  "openapi": "https://www.fieldproxy.ai/developers/openapi.json",
  "rest_api": {
    "base_url": "Per region, e.g. https://api-india-1.fieldproxy.ai or https://api-us-east-1.fieldproxy.ai",
    "base_url_discovery": {
      "method": "POST",
      "url": "https://api.fieldproxy.ai/auth/org",
      "body": {
        "orgid": "<workspace id>"
      },
      "read": "settings.url"
    },
    "auth": {
      "type": "apiKey",
      "header": "x-api-key"
    },
    "keys": {
      "created_in": "Settings, Security, API keys (one key per system)",
      "expiry": [
        "24h",
        "7d",
        "30d",
        "90d",
        "365d",
        "never"
      ],
      "operations": {
        "read": "/api/read",
        "insert": "/api/insert (and CSV import)",
        "update": "/api/update",
        "delete": "/api/delete"
      },
      "table_allowlist": "Optional; off = every table the workspace API can reach",
      "revocable": true
    },
    "endpoints": [
      {
        "method": "POST",
        "path": "/api/read",
        "body": {
          "tableName": "your_table",
          "condition": {
            "id": 1
          }
        },
        "does": "Reads the rows matching condition from one table"
      },
      {
        "method": "POST",
        "path": "/api/insert",
        "body": {
          "tableName": "your_table",
          "data": [
            {
              "name": "Gamma",
              "status": "open"
            }
          ]
        },
        "does": "Inserts an array of rows in one atomic statement; every row must have the same keys"
      },
      {
        "method": "POST",
        "path": "/api/update",
        "body": {
          "tableName": "your_table",
          "condition": {
            "status": "open"
          },
          "data": {
            "status": "closed"
          }
        },
        "does": "Sets data on every row matching condition"
      },
      {
        "method": "POST",
        "path": "/api/delete",
        "body": {
          "tableName": "your_table",
          "condition": {
            "id": 2
          }
        },
        "does": "Deletes every row matching condition"
      }
    ],
    "condition_rules": "Non-empty object of column-value pairs, ANDed, equality only; no operators, lists, patterns or null matching",
    "success_shape": {
      "rowCount": "integer",
      "table": "string",
      "tenant": "workspace id",
      "data": "array of rows (read only)",
      "message": "string (writes)"
    },
    "errors": {
      "400": "Invalid body (message names the field)",
      "401": "Authentication required (no key)",
      "403": "Invalid token / API key has been revoked / API key is not authorized for table '<name>'",
      "500": "Read, update or delete failed on an unknown column or bad value"
    },
    "rate_limit_headers": [
      "X-RateLimit-Limit",
      "X-RateLimit-Remaining",
      "X-RateLimit-Reset"
    ],
    "verified": "Live probe, 2026-10-18",
    "automations": "REST writes fire entity_event rules; /api/update also fires status_transition and field_threshold, one run per changed row",
    "docs": "https://www.fieldproxy.ai/developers/docs/rest-api"
  },
  "mcp": {
    "transport": "http",
    "address_pattern": "https://<api-host>/mcp",
    "address_examples": {
      "india": "https://api-india-1.fieldproxy.ai/mcp",
      "us_east": "https://api-us-east-1.fieldproxy.ai/mcp"
    },
    "address_notes": "Regional. Your workspace's address is shown in Settings, AI assistant when you create a key.",
    "built_in_tool_count": "170+",
    "auth": [
      {
        "type": "oauth",
        "notes": "Sign in with workspace ID, email and password; token lasts 1 hour and renews itself for 30 days. ChatGPT: dynamic client registration. Copilot Studio: OAuth 2.0 with dynamic discovery."
      },
      {
        "type": "bearer",
        "header": "Authorization: Bearer fpmcp.<key>",
        "notes": "Keys are created in Settings, AI assistant, New key, shown once, expire in 1 hour to 90 days, and can be limited by table, row, column and operation."
      }
    ],
    "scopes": {
      "data:read": "Schema, ready-made reports and read-only SQL on the workspace's own data",
      "data:write": "Record changes confirmed by a person and undoable; email and SMS drafts sent on confirm",
      "build": "New fields, tables, screens, automations, voice and text agents, and sandboxes (administrators, with Allow build on)"
    },
    "write_flow": [
      "propose_write (dry run, returns pending_id)",
      "confirm_write (after a person agrees, returns undo_id)",
      "undo_write"
    ],
    "clients": [
      "Claude",
      "Claude Code",
      "ChatGPT",
      "Microsoft 365 Copilot and Teams (Copilot Studio)",
      "GitHub Copilot",
      "Cursor",
      "OpenAI Codex",
      "Any MCP client"
    ],
    "tools": [
      {
        "group": "Schema and read-only SQL",
        "tools": [
          {
            "name": "describe_schema",
            "description": "List the tables this connection may read, or the full columns, types and foreign keys of up to 20 of them."
          },
          {
            "name": "run_sql",
            "description": "Run one read-only SELECT (or WITH … SELECT) on the workspace's data: up to 500 rows, 5-second limit."
          },
          {
            "name": "list_distinct_values",
            "description": "The distinct values in a column with their row counts (statuses, service types)."
          },
          {
            "name": "explain_change",
            "description": "Explain why a number changed between two periods, split by a dimension, biggest movers first."
          },
          {
            "name": "get_tables",
            "description": "The business tables screens can query, with columns, types, defaults and links."
          }
        ]
      },
      {
        "group": "Find records and ready-made reports",
        "tools": [
          {
            "name": "find_customers",
            "description": "Find customers and leads by name, company or email."
          },
          {
            "name": "find_jobs",
            "description": "Find jobs by status group, schedule window, customer, technician or text."
          },
          {
            "name": "find_technicians",
            "description": "List technicians with their user ids for assignment."
          },
          {
            "name": "find_invoices",
            "description": "Find overdue, outstanding or paid invoices."
          },
          {
            "name": "find_quotes",
            "description": "Find quotes by status, customer or expiry."
          },
          {
            "name": "find_contracts",
            "description": "Find service contracts, optionally those expiring soon."
          },
          {
            "name": "find_communications",
            "description": "Find sent emails and SMS from the communications log."
          },
          {
            "name": "todays_schedule",
            "description": "Today's jobs with time, customer, technician, status and priority."
          },
          {
            "name": "ops_report",
            "description": "A daily operations brief in one call: open jobs, unassigned work, technician load, overdue receivables."
          },
          {
            "name": "tech_workload",
            "description": "Active jobs and next-7-days jobs per technician."
          },
          {
            "name": "technician_jobs",
            "description": "All open jobs for one technician, by name or user id."
          },
          {
            "name": "dispatch_query",
            "description": "Booked minutes and job counts per technician for a day or a date range."
          },
          {
            "name": "get_tech_performance",
            "description": "Jobs scheduled, completed and completion rate per technician."
          },
          {
            "name": "ar_aging",
            "description": "Unpaid invoices with days past due."
          },
          {
            "name": "get_ar_aging",
            "description": "Outstanding balance bucketed by days overdue (current, 1–30, 31–60, 61–90, 90+)."
          },
          {
            "name": "analyze_funnel",
            "description": "Quote-to-close funnel over a date range."
          },
          {
            "name": "revenue_by_month",
            "description": "Collected revenue by month for the last 12 months."
          },
          {
            "name": "segment_customers",
            "description": "Top customers by lifetime value, or dormant customers."
          },
          {
            "name": "quotes_to_follow_up",
            "description": "Sent quotes due a follow-up."
          },
          {
            "name": "unbilled_completed_jobs",
            "description": "Completed billable jobs with no invoice yet."
          },
          {
            "name": "overdue_tasks",
            "description": "Tasks past their due date and not completed."
          },
          {
            "name": "jobs_chart",
            "description": "A bar chart of open jobs by status, technician, service type or priority."
          },
          {
            "name": "open_record",
            "description": "A link that opens one record on its own screen in the Fieldproxy web app."
          }
        ]
      },
      {
        "group": "Change data: propose, confirm, undo",
        "tools": [
          {
            "name": "propose_write",
            "description": "Dry-run one INSERT, UPDATE or DELETE (or up to 20 in one transaction) and return a preview and a pending_id. Nothing is saved."
          },
          {
            "name": "confirm_write",
            "description": "Apply a proposed change after the person agrees; returns the rows changed and an undo_id. Over 5 rows needs allow_bulk."
          },
          {
            "name": "undo_write",
            "description": "Reverse an applied change with its undo_id."
          },
          {
            "name": "cancel_write",
            "description": "Discard a prepared change or message draft."
          },
          {
            "name": "confirm_action",
            "description": "Carry out an action another tool proposed, once, after the person agrees."
          },
          {
            "name": "cancel_action",
            "description": "Drop a proposed action without doing it."
          },
          {
            "name": "import_records",
            "description": "Prepare an import of up to 1,000 CSV or spreadsheet rows into a table; updates instead of duplicating where an import profile exists."
          },
          {
            "name": "export_csv",
            "description": "Run one SELECT and save up to 10,000 rows as a CSV download link."
          },
          {
            "name": "comment_on_record",
            "description": "Prepare a comment on a record, with @mentions that notify people."
          },
          {
            "name": "record_history",
            "description": "A record's change history: who changed what, before and after."
          },
          {
            "name": "compare_record",
            "description": "How a record's fields differ between two times."
          },
          {
            "name": "revert_record",
            "description": "Propose putting a record's fields back to how they were after one audited change."
          },
          {
            "name": "list_deleted_records",
            "description": "Recently deleted records that can still be restored."
          },
          {
            "name": "restore_deleted_records",
            "description": "Propose restoring up to 50 deleted records."
          }
        ]
      },
      {
        "group": "Dispatch, routes and maps",
        "tools": [
          {
            "name": "plan_job_distribution",
            "description": "Plan who does which unassigned job over a date range under a daily cap. Read-only."
          },
          {
            "name": "plan_day_routes",
            "description": "Plan one day's routes per technician by road, with start times. Read-only."
          },
          {
            "name": "apply_schedule",
            "description": "Stage technician, date and time changes for up to 200 jobs; applied by confirm_write, undoable."
          },
          {
            "name": "calculate_route",
            "description": "Best visiting order for up to 50 stops as a round trip, with drive times."
          },
          {
            "name": "drive_time",
            "description": "Road drive time and distance between two places."
          },
          {
            "name": "nearest_technicians",
            "description": "The technicians closest to a place by road, from their latest positions."
          },
          {
            "name": "technician_locations",
            "description": "Each technician's latest position, time, battery and accuracy."
          },
          {
            "name": "technician_route",
            "description": "One technician's movement on a day."
          },
          {
            "name": "geocode_address",
            "description": "Coordinates for up to 10 addresses."
          },
          {
            "name": "reverse_geocode",
            "description": "The street address nearest a coordinate."
          },
          {
            "name": "list_service_zones",
            "description": "Service zones drawn on the map, optionally with GeoJSON outlines."
          },
          {
            "name": "zones_for_location",
            "description": "Which active service zones contain a place."
          },
          {
            "name": "save_service_zone",
            "description": "Propose creating or changing a service zone (administrators)."
          },
          {
            "name": "delete_service_zone",
            "description": "Propose deleting a service zone (administrators)."
          },
          {
            "name": "create_job_signoff_link",
            "description": "A no-login sign-off link for one job, for a subcontractor."
          }
        ]
      },
      {
        "group": "Email, SMS, inbox and notifications",
        "tools": [
          {
            "name": "draft_sms",
            "description": "Prepare text messages without sending them; at most 20 per draft and per hour."
          },
          {
            "name": "confirm_send",
            "description": "Send prepared messages after the person has read and agreed to them."
          },
          {
            "name": "search_inbox",
            "description": "Search your connected mailbox threads."
          },
          {
            "name": "read_email_thread",
            "description": "Read one email thread's newest messages."
          },
          {
            "name": "list_email_templates",
            "description": "Your and the team's email templates with their placeholders."
          },
          {
            "name": "get_email_template",
            "description": "One email template in full."
          },
          {
            "name": "save_email_template",
            "description": "Create or change an email template."
          },
          {
            "name": "set_email_followup",
            "description": "Remind yourself about an email thread later."
          },
          {
            "name": "list_email_followups",
            "description": "Your pending follow-up reminders on email threads."
          },
          {
            "name": "cancel_email_followup",
            "description": "Cancel a follow-up reminder."
          },
          {
            "name": "notify_users",
            "description": "Propose an in-app notification to up to 25 workspace users."
          },
          {
            "name": "set_reminder",
            "description": "Propose one email to be sent at a later time."
          }
        ]
      },
      {
        "group": "Documents, proposals, files and photos",
        "tools": [
          {
            "name": "list_document_templates",
            "description": "The workspace's PDF and Word document templates and their arguments."
          },
          {
            "name": "get_document_template",
            "description": "One document template's definition and versions."
          },
          {
            "name": "preview_document_template",
            "description": "Render a document template without saving it."
          },
          {
            "name": "save_document_template",
            "description": "Propose saving a document template (administrators); earlier versions are kept."
          },
          {
            "name": "rollback_document_template",
            "description": "Propose making an earlier template version current again."
          },
          {
            "name": "generate_document",
            "description": "Fill a document template for a record and get a PDF link."
          },
          {
            "name": "generate_pdf",
            "description": "Turn HTML into a branded PDF and get a link."
          },
          {
            "name": "list_estimate_templates",
            "description": "Estimate templates that can price a job from measurements."
          },
          {
            "name": "generate_estimate",
            "description": "Price a job from measurements with a published estimate template. Nothing is saved."
          },
          {
            "name": "list_proposal_templates",
            "description": "Proposal templates, their arguments and option tiers."
          },
          {
            "name": "preview_proposal",
            "description": "Show what a proposal would contain without creating it."
          },
          {
            "name": "issue_proposal",
            "description": "Propose issuing a proposal; returns the customer link on confirm."
          },
          {
            "name": "reissue_proposal",
            "description": "Propose replacing an open proposal with a fresh one."
          },
          {
            "name": "list_proposals",
            "description": "Proposals sent to customers and their status."
          },
          {
            "name": "get_proposal_link",
            "description": "A fresh link to an open proposal."
          },
          {
            "name": "list_proposal_blocks",
            "description": "The reusable proposal page library."
          },
          {
            "name": "save_proposal_block",
            "description": "Save a reusable proposal page."
          },
          {
            "name": "list_record_files",
            "description": "The photos, PDFs, documents and signatures stored on one record."
          },
          {
            "name": "read_file",
            "description": "Read the text of a stored PDF, Word, Excel, PowerPoint, CSV or email file."
          },
          {
            "name": "view_images",
            "description": "Look at up to 10 stored photos at once, for example before and after."
          }
        ]
      },
      {
        "group": "Dashboards, alerts, reports and insights",
        "tools": [
          {
            "name": "list_dashboards",
            "description": "Command Center dashboards you can see."
          },
          {
            "name": "view_dashboard",
            "description": "Open a dashboard: each tile's current data."
          },
          {
            "name": "create_dashboard",
            "description": "Propose a new, unpublished dashboard."
          },
          {
            "name": "add_dashboard_tile",
            "description": "Propose a dashboard tile from one read-only SELECT."
          },
          {
            "name": "list_alerts",
            "description": "Your data alerts."
          },
          {
            "name": "create_alert",
            "description": "Propose a data alert: a preset, new rows in a table, or a threshold."
          },
          {
            "name": "change_alert",
            "description": "Pause, resume, delete or check an alert."
          },
          {
            "name": "list_scheduled_reports",
            "description": "Your scheduled reports."
          },
          {
            "name": "schedule_report",
            "description": "Propose a daily, weekly or monthly report from one SELECT."
          },
          {
            "name": "change_scheduled_report",
            "description": "Pause, resume, delete or run a scheduled report."
          },
          {
            "name": "list_insights",
            "description": "The workspace's AI insights and when each last ran."
          },
          {
            "name": "run_insight",
            "description": "Run an insight now on current data."
          },
          {
            "name": "get_insight_result",
            "description": "The latest result of an insight with evidence."
          },
          {
            "name": "list_saved_views",
            "description": "Saved filter presets on an app view."
          },
          {
            "name": "save_saved_view",
            "description": "Save or change a filter preset."
          },
          {
            "name": "delete_saved_view",
            "description": "Delete a saved filter preset."
          },
          {
            "name": "integration_status",
            "description": "Status of the workspace's accounting and business integrations."
          },
          {
            "name": "sync_integration",
            "description": "Propose pulling the latest payment status from an integration."
          },
          {
            "name": "workspace_usage",
            "description": "Usage against the plan: records, seats and this month's AI credits."
          }
        ]
      },
      {
        "group": "Automations",
        "tools": [
          {
            "name": "get_automation_docs",
            "description": "The automation reference: overview, triggers, steps and recipes."
          },
          {
            "name": "list_automations",
            "description": "Every automation: on or off, its trigger, and whether it has been failing."
          },
          {
            "name": "get_automation",
            "description": "One automation's full trigger and steps."
          },
          {
            "name": "validate_automation",
            "description": "Check a rule definition without saving it."
          },
          {
            "name": "save_automation",
            "description": "Create or replace a rule. A new rule is always saved switched off."
          },
          {
            "name": "simulate_automation",
            "description": "Dry-run a saved automation against a real record. Nothing is written or sent."
          },
          {
            "name": "set_automation_enabled",
            "description": "Turn an automation on or off."
          },
          {
            "name": "run_automation",
            "description": "Propose running an automation now, for real."
          },
          {
            "name": "list_automation_runs",
            "description": "Recent runs by automation or status."
          },
          {
            "name": "list_automation_versions",
            "description": "An automation's change history."
          },
          {
            "name": "restore_automation_version",
            "description": "Put an automation back to an earlier version."
          },
          {
            "name": "list_failed_runs",
            "description": "The failure worklist."
          },
          {
            "name": "retry_automation_run",
            "description": "Propose retrying a failed run; normally resumes after completed steps."
          },
          {
            "name": "dismiss_failed_run",
            "description": "Propose marking a failure as handled."
          },
          {
            "name": "list_pending_approvals",
            "description": "Automation steps waiting for someone's approval."
          },
          {
            "name": "decide_approval",
            "description": "Propose approving or rejecting a waiting step (named approvers)."
          }
        ]
      },
      {
        "group": "Voice and text agents",
        "tools": [
          {
            "name": "list_agents",
            "description": "The workspace's voice (phone) and text (SMS and email) agents."
          },
          {
            "name": "get_agent",
            "description": "One agent's full configuration and its agent_hash."
          },
          {
            "name": "save_agent",
            "description": "Create or replace an agent. A new agent is saved switched off."
          },
          {
            "name": "simulate_agent",
            "description": "Test an agent with a conversation. Changes are staged, nothing is sent."
          },
          {
            "name": "set_agent_enabled",
            "description": "Turn an agent on or off."
          },
          {
            "name": "list_agent_conversations",
            "description": "Recent text conversations or calls with summaries and outcomes."
          },
          {
            "name": "list_calls",
            "description": "Voice-agent calls with direction, outcome and summary."
          },
          {
            "name": "get_call",
            "description": "One call in full: transcript, outcome, summary and tool use."
          },
          {
            "name": "my_agent_tasks",
            "description": "Your personal-agent tasks and what each is waiting on."
          },
          {
            "name": "agent_task_detail",
            "description": "One personal-agent task in full."
          },
          {
            "name": "agent_updates",
            "description": "What your personal agents reported recently."
          }
        ]
      },
      {
        "group": "Build: apps, screens, tables and workspace tools",
        "tools": [
          {
            "name": "get_widget_docs",
            "description": "The app-building reference for web or mobile: app, view, actions, schema and every widget."
          },
          {
            "name": "list_apps",
            "description": "The workspace's apps, web or mobile, and their live and newest versions."
          },
          {
            "name": "get_app",
            "description": "One app's settings, screen list and base_hash."
          },
          {
            "name": "get_view",
            "description": "One screen, whole or in part (find, outline, element, JSON Pointer)."
          },
          {
            "name": "create_app",
            "description": "Create a new app from compiled_data as version 1, not live."
          },
          {
            "name": "save_draft",
            "description": "Save a change to an app as a new draft version; checked before saving."
          },
          {
            "name": "edit_view",
            "description": "Change part of one screen with set, remove and insert operations, as a draft."
          },
          {
            "name": "validate_app",
            "description": "Check app JSON exactly as a save would (lint, SQL EXPLAIN, navigation) without saving."
          },
          {
            "name": "render_view",
            "description": "Draw a screen in a real browser: desktop and phone screenshots plus a design audit."
          },
          {
            "name": "publish_app",
            "description": "Make a draft version live for every user of the app."
          },
          {
            "name": "list_app_versions",
            "description": "Every saved version of an app and which one is live."
          },
          {
            "name": "rollback_app",
            "description": "Make an earlier version live again, checked like a publish."
          },
          {
            "name": "create_table",
            "description": "Propose a new business table (id, created_at, updated_at added)."
          },
          {
            "name": "add_column",
            "description": "Propose adding one column to an existing table."
          },
          {
            "name": "drop_column",
            "description": "Propose deleting a column that was added through MCP."
          },
          {
            "name": "drop_table",
            "description": "Propose deleting a table that was created through MCP."
          },
          {
            "name": "list_workspace_tools",
            "description": "The workspace's own AI tools (saved queries and actions)."
          },
          {
            "name": "get_workspace_tool",
            "description": "One workspace tool's definition."
          },
          {
            "name": "save_workspace_tool",
            "description": "Create or update a workspace tool (administrators); saved switched off."
          },
          {
            "name": "test_workspace_tool",
            "description": "Run a read workspace tool with sample parameters."
          },
          {
            "name": "set_workspace_tool_enabled",
            "description": "Switch a workspace tool on or off."
          }
        ]
      },
      {
        "group": "Sandboxes and promotion",
        "tools": [
          {
            "name": "create_sandbox",
            "description": "Make a private copy of the workspace to build in; it sends nothing and expires after 7 days unless extended."
          },
          {
            "name": "list_sandboxes",
            "description": "This workspace's sandboxes and when each expires."
          },
          {
            "name": "extend_sandbox",
            "description": "Push a sandbox's expiry out by 1–30 days (at most 90 days in all)."
          },
          {
            "name": "delete_sandbox",
            "description": "Delete a sandbox now; the live workspace is not touched."
          },
          {
            "name": "plan_promotion",
            "description": "Work out what copying apps, automations or agents from a sandbox to live would do, without changing anything."
          },
          {
            "name": "confirm_promotion",
            "description": "Apply a promotion: apps as drafts, automations and agents switched off."
          }
        ]
      },
      {
        "group": "AI memory, access and audit",
        "tools": [
          {
            "name": "get_workspace_instructions",
            "description": "The instructions the workspace wrote for its AI assistant."
          },
          {
            "name": "list_ai_memory",
            "description": "Command Center's standing instructions, yours and workspace-wide."
          },
          {
            "name": "add_ai_memory",
            "description": "Add a standing instruction for you or (administrators) the whole workspace."
          },
          {
            "name": "remove_ai_memory",
            "description": "Remove a standing instruction."
          },
          {
            "name": "list_ai_connections",
            "description": "Every MCP key and OAuth-connected app, with scopes, limits and status (administrators)."
          },
          {
            "name": "revoke_ai_access",
            "description": "Propose cutting off one key or connected app; it stops at once (administrators)."
          },
          {
            "name": "ai_activity_log",
            "description": "Every AI tool call: key, owner, tool, outcome and timing (administrators)."
          },
          {
            "name": "ai_usage_summary",
            "description": "AI connection calls and errors per key, person and tool (administrators)."
          },
          {
            "name": "workspace_activity",
            "description": "Who changed what across the workspace, with before and after values (administrators)."
          },
          {
            "name": "activity_summary",
            "description": "The busiest tables, sources and people in the audit trail."
          },
          {
            "name": "list_activity_alert_rules",
            "description": "Activity alert rules and how often each fired."
          },
          {
            "name": "create_activity_alert_rule",
            "description": "Propose an alert on bulk deletes, bulk changes, off-hours activity or field changes."
          },
          {
            "name": "list_activity_alerts",
            "description": "Alerts raised by activity rules."
          },
          {
            "name": "acknowledge_activity_alerts",
            "description": "Mark activity alerts as seen."
          },
          {
            "name": "log_turn",
            "description": "Save a conversation turn to the person's Command Center history; changes no data."
          }
        ]
      }
    ],
    "workspace_specific_tools": "Each workspace adds its own actions and saved tools; see list_workspace_tools and get_workspace_instructions."
  },
  "webhooks": {
    "inbound": {
      "method": "POST",
      "url": "https://<api-host>/automation/hooks/<workspace-id>/<rule-id>",
      "auth": "Optional shared secret in the x-automation-secret header (401 if wrong); rule must be enabled (404 otherwise)",
      "response": "202 {\"accepted\": true}; the rule runs asynchronously",
      "payload_access": "{{trigger.body.<field>}}"
    },
    "outbound": {
      "steps": [
        "http_request",
        "send_webhook",
        "call_integration",
        "db_sync"
      ],
      "signature": "send_webhook: X-Fieldproxy-Signature: t=<unix>,v1=<hex> = HMAC-SHA256 of `${t}.${body}`; plus X-Fieldproxy-Timestamp and X-Fieldproxy-Delivery",
      "secrets": "{{secrets.NAME}} from the workspace's encrypted vault (Settings, Secrets)"
    }
  },
  "automations": {
    "triggers": [
      "entity_event",
      "status_transition",
      "cron",
      "manual",
      "webhook",
      "beacon",
      "field_threshold",
      "time_in_state",
      "date_relative",
      "recurring_from_date",
      "zone_membership",
      "record_proximity",
      "device_silence",
      "schedule_conflict",
      "aggregate_threshold"
    ],
    "docs": "https://www.fieldproxy.ai/developers/docs/webhooks-automations"
  },
  "surfaces": [
    {
      "id": "rest",
      "name": "REST API",
      "description": "Your own systems read and write the workspace's data over HTTPS: POST /api/read, /api/insert (plus CSV import), /api/update and /api/delete on the workspace's regional API base. Writes fire the workspace's automations.",
      "auth": "An API key in the x-api-key header, created in Settings, Security, API keys: one per system, with an expiry, the operations it may use and optionally only some tables. Revocable.",
      "docs": "https://www.fieldproxy.ai/developers/docs/rest-api"
    },
    {
      "id": "mcp",
      "name": "MCP server",
      "description": "An official Model Context Protocol server over HTTP at https://<api-host>/mcp (for example https://api-india-1.fieldproxy.ai/mcp), with 170+ built-in tools. Claude, ChatGPT, Microsoft 365 Copilot and Teams (through Copilot Studio), GitHub Copilot, Cursor, OpenAI Codex, Claude Code and any other MCP client can read the workspace, run read-only SQL, propose changes, draft messages, run automations and build apps.",
      "auth": "OAuth sign-in (the token lasts 1 hour and renews itself for 30 days) or a scoped key (fpmcp.…) sent as Authorization: Bearer.",
      "docs": "https://www.fieldproxy.ai/developers/docs/authentication"
    },
    {
      "id": "sql",
      "name": "Read-only SQL",
      "description": "describe_schema lists every table and column the connection may read; run_sql runs one SELECT against the workspace's own Postgres database (up to 500 rows, 5-second limit). export_csv saves up to 10,000 rows as a CSV link.",
      "auth": "The MCP connection's data:read scope. Hidden columns are removed and row limits are applied by Postgres.",
      "docs": "https://www.fieldproxy.ai/developers/docs/data-model"
    },
    {
      "id": "webhooks",
      "name": "Webhooks in and out",
      "description": "In: an automation with a webhook trigger gets its own URL; any system POSTs JSON to it and the steps read {{trigger.body.field}}. Out: http_request (any method, headers, JSON or file body), send_webhook (HMAC-SHA256 signed), call_integration and db_sync, plus send_email, send_sms and place_call.",
      "auth": "In: no sign-in, an optional shared secret in the x-automation-secret header, and the rule must be on. Out: credentials from the encrypted secret vault as {{secrets.NAME}}, never written into the rule.",
      "docs": "https://www.fieldproxy.ai/developers/docs/webhooks-automations#webhook-trigger"
    },
    {
      "id": "automations",
      "name": "Automations API",
      "description": "Rules are JSON: a trigger (15 types, from record events and cron to SLA timers, zones and GPS arrival) and a list of steps (about 50 types). Create, validate, dry-run, enable, run, retry and restore versions.",
      "auth": "From the MCP server (save_automation, simulate_automation…) or the automation API with a signed-in administrator session.",
      "docs": "https://www.fieldproxy.ai/developers/docs/webhooks-automations"
    },
    {
      "id": "public-forms",
      "name": "Public forms and links",
      "description": "Open forms anyone can fill in, record links for one customer's quote, job or invoice (with signatures and Stripe payments), no-login customer portals, and lookup pages. Links can expire, be capped and be revoked.",
      "auth": "Built and published through the public-forms API by a signed-in administrator; the people filling them in need no login.",
      "docs": "https://www.fieldproxy.ai/developers/docs/public-forms"
    },
    {
      "id": "portal-users",
      "name": "Portal users",
      "description": "Customers, contractors and partners sign in with their own email and password to one web app and see only their own records, enforced by Postgres row security.",
      "auth": "Set up by an administrator in Settings, Portal users, then invited.",
      "docs": "https://www.fieldproxy.ai/developers/docs/public-forms#portal-users"
    },
    {
      "id": "apps-json",
      "name": "Apps as JSON",
      "description": "Every screen of the web and mobile apps is JSON: views, widgets, actions and the SQL behind them. Read, edit, validate, render, publish and roll back versions through MCP.",
      "auth": "The MCP build scope (an administrator, with Allow build switched on).",
      "docs": "https://www.fieldproxy.ai/developers/docs/apps-as-json"
    },
    {
      "id": "agents",
      "name": "Voice and text agents",
      "description": "Phone agents and SMS or email agents that answer customers from live data, configured as JSON with instructions, allowed tables, tools, hours and a knowledge base, and tested in a simulator.",
      "auth": "The MCP build scope, or the agent settings in the web app.",
      "docs": "https://www.fieldproxy.ai/developers/docs/agents"
    },
    {
      "id": "import-export",
      "name": "Import and export",
      "description": "Import CSV or Excel into any table (up to 1,000 rows per MCP import, dry-run first), and export CSV or Excel from any screen or query.",
      "auth": "In the app, or the MCP data:write and data:read scopes.",
      "docs": "https://www.fieldproxy.ai/developers/docs/limits-safety#import-export"
    }
  ],
  "reference_pages": [
    {
      "title": "Fieldproxy developer docs",
      "url": "https://www.fieldproxy.ai/developers/docs"
    },
    {
      "title": "Fieldproxy REST API",
      "url": "https://www.fieldproxy.ai/developers/docs/rest-api"
    },
    {
      "title": "Authentication and keys",
      "url": "https://www.fieldproxy.ai/developers/docs/authentication"
    },
    {
      "title": "Fieldproxy MCP tools reference",
      "url": "https://www.fieldproxy.ai/developers/docs/mcp-tools"
    },
    {
      "title": "Fieldproxy data model",
      "url": "https://www.fieldproxy.ai/developers/docs/data-model"
    },
    {
      "title": "Webhooks and automations",
      "url": "https://www.fieldproxy.ai/developers/docs/webhooks-automations"
    },
    {
      "title": "Public forms and links",
      "url": "https://www.fieldproxy.ai/developers/docs/public-forms"
    },
    {
      "title": "Apps as JSON (server-driven UI)",
      "url": "https://www.fieldproxy.ai/developers/docs/apps-as-json"
    },
    {
      "title": "Voice and text agents",
      "url": "https://www.fieldproxy.ai/developers/docs/agents"
    },
    {
      "title": "Limits and safety",
      "url": "https://www.fieldproxy.ai/developers/docs/limits-safety"
    }
  ],
  "notes": [
    "The REST and MCP hosts are regional; there is no single global data host (api.fieldproxy.ai only resolves a workspace's region)."
  ],
  "contact": "https://www.fieldproxy.ai/book-demo?source=capabilities-json"
}