{
  "_type": "export",
  "__export_format": 4,
  "__export_date": "2026-09-11T13:49:04.540833",
  "__export_source": "reportei.flux:docs/collections",
  "resources": [
    {
      "_id": "wrk_flux_mcp",
      "_type": "workspace",
      "parentId": null,
      "name": "Flux · MCP connector",
      "description": "Fluxo completo do connector MCP: descoberta, registro dinâmico, consentimento e chamadas MCP. Ver https://developers.reportei.com/flux",
      "scope": "collection"
    },
    {
      "_id": "env_flux_mcp",
      "_type": "environment",
      "parentId": "wrk_flux_mcp",
      "name": "Produção",
      "data": {
        "flux_url": "https://flux.reportei.com",
        "redirect_uri": "http://localhost:8765/callback",
        "scopes": "projects:read posts:read reviews:read integrations:read",
        "code_verifier": "flux-mcp-postman-verifier-com-43-caracteres-ok",
        "code_challenge": "yBCIeW2gSd4QaLqR-ieiSjNqh-QMOx-ZcSoCKyfDoG4",
        "client_id": "",
        "code": "",
        "credential": "",
        "mcp_session": ""
      },
      "metaSortKey": 1
    },
    {
      "_id": "grp_1",
      "_type": "request_group",
      "parentId": "wrk_flux_mcp",
      "name": "1 · Descoberta",
      "metaSortKey": -3,
      "environment": {}
    },
    {
      "_id": "grp_2",
      "_type": "request_group",
      "parentId": "wrk_flux_mcp",
      "name": "2 · OAuth",
      "metaSortKey": -2,
      "environment": {}
    },
    {
      "_id": "grp_3",
      "_type": "request_group",
      "parentId": "wrk_flux_mcp",
      "name": "3 · MCP",
      "metaSortKey": -1,
      "environment": {}
    },
    {
      "_id": "req_401",
      "_type": "request",
      "parentId": "grp_1",
      "name": "Desafio: chamada sem credencial (401)",
      "method": "POST",
      "url": "{{ _.flux_url }}/mcp/v1",
      "description": "Responde 401 com WWW-Authenticate apontando o resource metadata — é assim que o cliente MCP descobre onde autorizar.",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "metaSortKey": -100,
      "settingEncodeUrl": false,
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 2,\n  \"method\": \"tools/list\"\n}"
      }
    },
    {
      "_id": "req_prm",
      "_type": "request",
      "parentId": "grp_1",
      "name": "Protected Resource Metadata (RFC 9728)",
      "method": "GET",
      "url": "{{ _.flux_url }}/.well-known/oauth-protected-resource",
      "description": "O campo resource casa caractere a caractere com a URL digitada no cliente; authorization_servers aponta o próprio Flux.",
      "headers": [],
      "metaSortKey": -99,
      "settingEncodeUrl": false
    },
    {
      "_id": "req_asm",
      "_type": "request",
      "parentId": "grp_1",
      "name": "Authorization Server Metadata (RFC 8414)",
      "method": "GET",
      "url": "{{ _.flux_url }}/.well-known/oauth-authorization-server",
      "description": "Sem registration_endpoint, o Claude Code recusa a conexão com 'does not support dynamic client registration'.",
      "headers": [],
      "metaSortKey": -98,
      "settingEncodeUrl": false
    },
    {
      "_id": "req_reg",
      "_type": "request",
      "parentId": "grp_2",
      "name": "Registro dinâmico do cliente (RFC 7591)",
      "method": "POST",
      "url": "{{ _.flux_url }}/oauth/mcp/register",
      "description": "Copie o client_id da resposta para a variável de ambiente client_id.\n\nA redirect_uri passa pela allowlist do Flux; fora dela, 400 invalid_redirect_uri.",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "metaSortKey": -100,
      "settingEncodeUrl": false,
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"redirect_uris\": [\n    \"{{ _.redirect_uri }}\"\n  ],\n  \"client_name\": \"Insomnia\"\n}"
      }
    },
    {
      "_id": "req_authz",
      "_type": "request",
      "parentId": "grp_2",
      "name": "Autorização: abra esta URL no navegador",
      "method": "GET",
      "url": "{{ _.flux_url }}/oauth/mcp/authorize?client_id={{ _.client_id }}&redirect_uri={{ _.redirect_uri }}&response_type=code&scope={{ _.scopes }}&state=insomnia&code_challenge={{ _.code_challenge }}&code_challenge_method=S256",
      "description": "PASSO MANUAL. Exige sessão de navegador: é onde você escolhe a conta e as permissões na tela do Reportei Auth.\n\nUse o preview da URL desta request, abra no navegador, autorize, e copie o code= da URL de retorno para a variável code.",
      "headers": [],
      "metaSortKey": -99,
      "settingEncodeUrl": false
    },
    {
      "_id": "req_token",
      "_type": "request",
      "parentId": "grp_2",
      "name": "Token: troca o code pela credencial",
      "method": "POST",
      "url": "{{ _.flux_url }}/oauth/mcp/token",
      "description": "O code vale 60 segundos e é de uso único. Copie o access_token para a variável credential.",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "metaSortKey": -98,
      "settingEncodeUrl": false,
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"grant_type\": \"authorization_code\",\n  \"code\": \"{{ _.code }}\",\n  \"client_id\": \"{{ _.client_id }}\",\n  \"redirect_uri\": \"{{ _.redirect_uri }}\",\n  \"code_verifier\": \"{{ _.code_verifier }}\"\n}"
      }
    },
    {
      "_id": "req_init",
      "_type": "request",
      "parentId": "grp_3",
      "name": "initialize (abre a sessão)",
      "method": "POST",
      "url": "{{ _.flux_url }}/mcp/v1",
      "description": "Copie o header Mcp-Session-Id da resposta para a variável mcp_session.",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Authorization",
          "value": "Bearer {{ _.credential }}"
        }
      ],
      "metaSortKey": -100,
      "settingEncodeUrl": false,
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"initialize\",\n  \"params\": {\n    \"protocolVersion\": \"2025-06-18\",\n    \"capabilities\": {},\n    \"clientInfo\": {\n      \"name\": \"insomnia\",\n      \"version\": \"1.0\"\n    }\n  }\n}"
      }
    },
    {
      "_id": "req_tools",
      "_type": "request",
      "parentId": "grp_3",
      "name": "tools/list",
      "method": "POST",
      "url": "{{ _.flux_url }}/mcp/v1",
      "description": "O catálogo varia com os escopos do token: o que não foi autorizado não aparece.",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Authorization",
          "value": "Bearer {{ _.credential }}"
        },
        {
          "name": "Mcp-Session-Id",
          "value": "{{ _.mcp_session }}"
        },
        {
          "name": "Mcp-Protocol-Version",
          "value": "2025-06-18"
        }
      ],
      "metaSortKey": -99,
      "settingEncodeUrl": false,
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 2,\n  \"method\": \"tools/list\"\n}"
      }
    },
    {
      "_id": "req_call",
      "_type": "request",
      "parentId": "grp_3",
      "name": "tools/call · flux_list_projects",
      "method": "POST",
      "url": "{{ _.flux_url }}/mcp/v1",
      "description": "Erro de tool sai em HTTP 200 com is_error no corpo (ADR-16).",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Authorization",
          "value": "Bearer {{ _.credential }}"
        },
        {
          "name": "Mcp-Session-Id",
          "value": "{{ _.mcp_session }}"
        },
        {
          "name": "Mcp-Protocol-Version",
          "value": "2025-06-18"
        }
      ],
      "metaSortKey": -98,
      "settingEncodeUrl": false,
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 3,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"flux_list_projects\",\n    \"arguments\": {\n      \"per_page\": 5\n    }\n  }\n}"
      }
    },
    {
      "_id": "req_close",
      "_type": "request",
      "parentId": "grp_3",
      "name": "Encerrar a sessão",
      "method": "DELETE",
      "url": "{{ _.flux_url }}/mcp/v1",
      "description": "Libera a sessão do lado do servidor.",
      "headers": [
        {
          "name": "Authorization",
          "value": "Bearer {{ _.credential }}"
        },
        {
          "name": "Mcp-Session-Id",
          "value": "{{ _.mcp_session }}"
        },
        {
          "name": "Mcp-Protocol-Version",
          "value": "2025-06-18"
        }
      ],
      "metaSortKey": -97,
      "settingEncodeUrl": false
    }
  ]
}