{
  "serverInfo": {
    "name": "notfair-mcp",
    "version": "0.1.0"
  },
  "authentication": {
    "required": true,
    "schemes": [
      "oauth2"
    ]
  },
  "tools": [
    {
      "name": "search",
      "title": "Search NotFair capabilities",
      "description": "Discover NotFair capabilities for Google Ads, Meta Ads, X Ads, LinkedIn Ads, Reddit Ads, TikTok Ads, Google Analytics, Google Search Console, GoHighLevel, and WordPress. Returns matching capability ids, exact input schemas, safety annotations, the corresponding executor, and the authenticated workspace's connected platforms with every connected account and property.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "description": "What you need to do, such as 'pause Meta campaign' or 'GA4 key event'."
          },
          "platform": {
            "type": "string",
            "enum": [
              "google_ads",
              "meta_ads",
              "x_ads",
              "linkedin_ads",
              "reddit_ads",
              "tiktok_ads",
              "search_console",
              "google_analytics",
              "gohighlevel",
              "wordpress"
            ]
          },
          "workflowId": {
            "description": "Optional workflow correlation UUID returned by search. Invalid values are safely replaced."
          }
        },
        "required": [
          "query"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false,
        "title": "Search NotFair capabilities"
      }
    },
    {
      "name": "executeRead",
      "title": "Execute a read-only NotFair capability",
      "description": "Execute one NotFair read-only capability by its exact id and validated arguments without changing external state. Contract repairs return a stable error code, safe guidance, and the workflowId to reuse.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "capabilityId": {
            "type": "string",
            "minLength": 1,
            "description": "Exact read-only capability id returned by search."
          },
          "arguments": {
            "default": {},
            "description": "Arguments matching the schema returned by search.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "workflowId": {
            "description": "Optional workflow correlation UUID returned by search. Invalid values are safely replaced."
          }
        },
        "required": [
          "capabilityId"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false,
        "title": "Execute a read-only NotFair capability"
      }
    },
    {
      "name": "execute",
      "title": "Execute a NotFair capability",
      "description": "Execute one NotFair write-capable capability by its exact id and validated arguments through the guarded platform handler. The operation may change external state. Contract repairs return a stable error code, safe guidance, and the workflowId to reuse.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "capabilityId": {
            "type": "string",
            "minLength": 1,
            "description": "Exact capability id returned by search."
          },
          "arguments": {
            "default": {},
            "description": "Arguments matching the schema returned by search.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "workflowId": {
            "description": "Optional workflow correlation UUID returned by search. Invalid values are safely replaced."
          },
          "reasoning": {
            "description": "Optional one-sentence reason for this change, as a string, such as \"Paused: $140 spent and 0 conversions in 30 days.\" Stored in the account's change history with the change. Longer text is cut at 1000 characters."
          }
        },
        "required": [
          "capabilityId"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "title": "Execute a NotFair capability"
      }
    },
    {
      "name": "submitToolFeedback",
      "title": "Submit NotFair tool feedback",
      "description": "Leave or file private, structured internal feedback about a bug, issue, or problem with a NotFair tool or capability encountered during a real task. Reports capture the affected capability, the expected and actual behavior, and supporting evidence for NotFair engineering. A report changes nothing in the user's connected accounts, but NotFair engineers read it along with the user and workspace that sent it: tell the user in one sentence what you will report and send it only if they agree. Summarize account details instead of pasting records, and leave out personal data.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "report_kind": {
            "type": "string",
            "enum": [
              "false_success",
              "unrecoverable_failure",
              "contract_mismatch",
              "missing_workflow",
              "operator_correction",
              "capability_request"
            ],
            "description": "Incident/capability class. false_success requires an authoritative readback; operator_correction requires an explicit owner correction."
          },
          "affected_tool": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NotFair's own tool surface only: one real tool name (e.g. 'pauseKeyword'). Use 'general' only when actual names multiple NotFair tools; never name an external connector or harness."
          },
          "problem_signature": {
            "type": "string",
            "minLength": 3,
            "maxLength": 120,
            "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+){1,11}$",
            "description": "Stable root-cause key reused for the same underlying problem, e.g. update-campaign-goals.custom-goal-name."
          },
          "expected": {
            "type": "string",
            "minLength": 10,
            "maxLength": 1000,
            "description": "What the agent reasonably expected from the NotFair tool surface or documented workflow."
          },
          "actual": {
            "type": "string",
            "minLength": 10,
            "maxLength": 1000,
            "description": "What actually happened. Include the exact result/error/readback fact that proves it."
          },
          "evidence_kind": {
            "type": "string",
            "enum": [
              "tool_result",
              "authoritative_readback",
              "documentation",
              "workflow_trace",
              "owner_correction"
            ],
            "description": "How actual was established. false_success requires authoritative_readback."
          },
          "suggestion": {
            "description": "Optional implementation hypothesis. Omit if the evidence does not support a specific fix.",
            "type": "string",
            "minLength": 10,
            "maxLength": 1000
          },
          "user_goal": {
            "description": "What the user was trying to accomplish — gives the team the use case context. Avoid PII.",
            "type": "string",
            "maxLength": 500
          },
          "related_request_id": {
            "description": "Optional request_id of the earlier NotFair call that caused friction, when the caller has it. This is not a conversation id.",
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "source": {
            "default": "agent",
            "description": "agent=live product signal; eval=controlled regression signal. Eval reports are excluded from customer-signal metrics.",
            "type": "string",
            "enum": [
              "agent",
              "eval"
            ]
          },
          "idempotency_key": {
            "description": "Optional dedup key. If the same key is submitted by this owner, the original feedback_id is returned without creating a duplicate. Omit to deduplicate this owner's reports by source + platform + report_kind + affected_tool + problem_signature.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          },
          "workflowId": {
            "description": "Optional workflow correlation UUID returned by search. Invalid values are safely replaced."
          }
        },
        "required": [
          "report_kind",
          "affected_tool",
          "problem_signature",
          "expected",
          "actual",
          "evidence_kind"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "title": "Submit NotFair tool feedback"
      }
    }
  ],
  "resources": [],
  "prompts": []
}
