{
  "workflow": {
    "id": 5540,
    "name": "Query bicycle incident data with BikeWise API through MCP server",
    "views": 221,
    "recentViews": 0,
    "totalViews": 221,
    "createdAt": "2025-07-01T21:28:34.770Z",
    "description": "Complete MCP server exposing 4 BikeWise API v2 API operations to AI agents.\n\n## ⚡ Quick Setup\nNeed help? Want access to more workflows and even live Q&A sessions with a top verified n8n creator.. All 100% free?\n\n[Join the community](https://www.skool.com/n8n-nodes-automation-lab-1570/about)\n\n1. **Import** this workflow into your n8n instance\n2. **Credentials** Add BikeWise API v2 credentials\n3. **Activate** the workflow to start your MCP server\n4. **Copy** the webhook URL from the MCP trigger node\n5. **Connect** AI agents using the MCP URL\n\n## 🔧 How it Works\n\nThis workflow converts the BikeWise API v2 API into an MCP-compatible interface for AI agents.\n\n• **MCP Trigger**: Serves as your server endpoint for AI agent requests\n• **HTTP Request Nodes**: Handle API calls to https://bikewise.org/api\n• **AI Expressions**: Automatically populate parameters via `$fromAI()` placeholders\n• **Native Integration**: Returns responses directly to the AI agent\n\n## 📋 Available Operations (4 total)\n\n### 🔧 V2 (4 endpoints)\n\n• **GET /v2/incidents**: Paginated incidents matching parameters\n• **GET /v2/incidents/{id}**: GET /v2/incidents/{id}\n• **GET /v2/locations**: Unpaginated geojson response\n• **GET /v2/locations/markers**: Unpaginated geojson response with simplestyled markers\n\n## 🤖 AI Integration\n\n**Parameter Handling**: AI agents automatically provide values for:\n• Path parameters and identifiers\n• Query parameters and filters\n• Request body data\n• Headers and authentication\n\n**Response Format**: Native BikeWise API v2 API responses with full data structure\n\n**Error Handling**: Built-in n8n HTTP request error management\n\n## 💡 Usage Examples\n\nConnect this MCP server to any AI agent or workflow:\n\n• **Claude Desktop**: Add MCP server URL to configuration\n• **Cursor**: Add MCP server SSE URL to configuration\n• **Custom AI Apps**: Use MCP URL as tool endpoint\n• **API Integration**: Direct HTTP calls to MCP endpoints\n\n## ✨ Benefits\n\n• **Zero Setup**: No parameter mapping or configuration needed\n• **AI-Ready**: Built-in `$fromAI()` expressions for all parameters\n• **Production Ready**: Native n8n HTTP request handling and logging\n• **Extensible**: Easily modify or add custom logic\n\n&gt; 🆓 **[Free for community use](https://github.com/Cfomodz/community-use)!** Ready to deploy in under 2 minutes.",
    "workflow": {
      "id": "5eglr5Z0WCErDn3R",
      "meta": null,
      "name": "BikeWise API v2 MCP Server",
      "tags": [],
      "nodes": [
        {
          "id": "9c63f65b-fe8e-4589-af2e-c6494ed2cc23",
          "name": "Setup Instructions",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1380,
            -240
          ],
          "parameters": {
            "color": 4,
            "height": 1060,
            "content": "### ⚙️ Setup Instructions\n\n1. **Import Workflow**: \nLoad this workflow into your n8n instance\n\n2. **Authentication**: \nNo authentication required\n\n3. **Activate Workflow**:\nEnable the workflow to start the MCP server\n\n4. **Get MCP URL**: \nCopy the webhook URL from the MCP trigger\n\n5. **Connect AI Agent**:\nUse the MCP URL in your AI agent configuration\n\n\n### 💡 Usage Notes\n• Parameters are auto-populated by AI using $fromAI() expressions\n• With 4 API endpoints available as tools\n• Responses maintain original API structure\n\n\n### 🛠️ Customization\n• Add data transformation nodes if needed\n• Implement custom error handling\n• Add logging or monitoring nodes\n\n• Modify parameter defaults in any HTTP request node as needed\n\n### 💬 Need Help?\nPing me on [discord](https://discord.me/cfomodz) for integration guidance and custom automations. Check the [n8n documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolmcp/) for more information."
          },
          "typeVersion": 1
        },
        {
          "id": "a59fbca1-c0ae-4b1f-9b96-770127a503a7",
          "name": "Workflow Overview",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1120,
            -240
          ],
          "parameters": {
            "width": 420,
            "height": 920,
            "content": "## 🛠️ BikeWise API v2 MCP Server ✅ 4 operations\n\n### About\nThis is an API for accessing information about bicycling related incidents. You can find the source code on GitHub.\n\n### 🔧 How it Works\n\nThis workflow converts the BikeWise API v2 API into an MCP-compatible interface for AI agents.\n\n• **MCP Trigger**: Serves as your server endpoint for AI agent requests\n• **HTTP Request Nodes**: Handle API calls to https://bikewise.org/api\n• **AI Expressions**: Automatically populate parameters via `$fromAI()` placeholders\n• **Native Integration**: Returns responses directly to the AI agent\n\n\n### 📋 Available Operations (4 endpoints)\n\n**Incidents (2 operations)**\npaginated, get incident\n\n**Locations (2 operations)**\nunpaginated\n\n"
          },
          "typeVersion": 1
        },
        {
          "id": "5ae7a51a-cdb8-4894-a459-ab6d2768fec9",
          "name": "BikeWise API v2 MCP Server",
          "type": "@n8n/n8n-nodes-langchain.mcpTrigger",
          "position": [
            -620,
            -240
          ],
          "webhookId": "303b9214-d2af-4b50-971a-4cd839d8d90f",
          "parameters": {
            "path": "bikewise-api-v2-mcp"
          },
          "typeVersion": 1
        },
        {
          "id": "8a8f750b-47b0-44a5-a426-6bf2922b81dd",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -660,
            -100
          ],
          "parameters": {
            "color": 2,
            "width": 500,
            "height": 200,
            "content": "## Incidents"
          },
          "typeVersion": 1
        },
        {
          "id": "183655c7-a526-408e-ad65-5defb32736ed",
          "name": "Paginated incidents matching parameters",
          "type": "n8n-nodes-base.httpRequestTool",
          "position": [
            -520,
            -60
          ],
          "parameters": {
            "url": "=https://bikewise.org/api/v2/incidents",
            "options": {},
            "sendQuery": true,
            "authentication": "genericCredentialType",
            "genericAuthType": "httpHeaderAuth",
            "queryParameters": {
              "parameters": [
                {
                  "name": "page",
                  "value": "={{ $fromAI('page', 'Page of results to fetch.', 'number', 1) }}"
                },
                {
                  "name": "per_page",
                  "value": "={{ $fromAI('per_page', 'Number of results to return per page.', 'number') }}"
                },
                {
                  "name": "occurred_before",
                  "value": "={{ $fromAI('occurred_before', 'End of period', 'number') }}"
                },
                {
                  "name": "occurred_after",
                  "value": "={{ $fromAI('occurred_after', 'Start of period', 'number') }}"
                },
                {
                  "name": "incident_type",
                  "value": "={{ $fromAI('incident_type', 'Only incidents of specific type', 'string') }}"
                },
                {
                  "name": "proximity",
                  "value": "={{ $fromAI('proximity', 'Center of location for proximity search', 'string') }}"
                },
                {
                  "name": "proximity_square",
                  "value": "={{ $fromAI('proximity_square', 'Size of the proximity search', 'number', 100) }}"
                },
                {
                  "name": "query",
                  "value": "={{ $fromAI('query', 'Full text search of incidents', 'string') }}"
                }
              ]
            },
            "toolDescription": "Paginated incidents matching parameters\n\nParameters:\n- Query parameters:\n  • page (optional) - Page of results to fetch.\n  • per_page (optional) - Number of results to return per page.\n  • occurred_before (optional) - End of period\n  • occurred_after (optional) - Start of period\n  • incident_type (optional) - Only incidents of specific type\n  • proximity (optional) - Center of location for proximity search\n  • proximity_square (optional) - Size of the proximity search\n  • query (optional) - Full text search of incidents"
          },
          "typeVersion": 4.2
        },
        {
          "id": "fe64c701-e2d5-4e92-9cff-c9d14f089201",
          "name": "Get incident",
          "type": "n8n-nodes-base.httpRequestTool",
          "position": [
            -320,
            -60
          ],
          "parameters": {
            "url": "=https://bikewise.org/api/v2/incidents/{{ $fromAI('id', 'Incident ID', 'number') }}",
            "options": {},
            "authentication": "genericCredentialType",
            "genericAuthType": "httpHeaderAuth",
            "toolDescription": "GET--version-incidents--id---format-\n\nParameters:\n- Path parameters:\n  • id (required) - Incident ID"
          },
          "typeVersion": 4.2
        },
        {
          "id": "8ad79cc0-cc10-42ce-84a4-7768150d43ec",
          "name": "Description - incidents",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -120,
            -60
          ],
          "parameters": {
            "width": 500,
            "height": 120,
            "content": "## 📋 Incidents\n\nIncidents matching parameters"
          },
          "typeVersion": 1
        },
        {
          "id": "e1739cdf-de05-4259-b6fc-78fdf7f84dc2",
          "name": "Sticky Note2",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -660,
            140
          ],
          "parameters": {
            "color": 3,
            "width": 500,
            "height": 200,
            "content": "## Locations"
          },
          "typeVersion": 1
        },
        {
          "id": "85ea58a8-599f-4db5-bbfd-022d49284082",
          "name": "Unpaginated geojson response",
          "type": "n8n-nodes-base.httpRequestTool",
          "position": [
            -520,
            180
          ],
          "parameters": {
            "url": "=https://bikewise.org/api/v2/locations",
            "options": {},
            "sendQuery": true,
            "authentication": "genericCredentialType",
            "genericAuthType": "httpHeaderAuth",
            "queryParameters": {
              "parameters": [
                {
                  "name": "occurred_before",
                  "value": "={{ $fromAI('occurred_before', 'End of period', 'number') }}"
                },
                {
                  "name": "occurred_after",
                  "value": "={{ $fromAI('occurred_after', 'Start of period', 'number') }}"
                },
                {
                  "name": "incident_type",
                  "value": "={{ $fromAI('incident_type', 'Only incidents of specific type', 'string') }}"
                },
                {
                  "name": "proximity",
                  "value": "={{ $fromAI('proximity', 'Center of location for proximity search', 'string') }}"
                },
                {
                  "name": "proximity_square",
                  "value": "={{ $fromAI('proximity_square', 'Size of the proximity search', 'number', 100) }}"
                },
                {
                  "name": "query",
                  "value": "={{ $fromAI('query', 'Full text search of incidents', 'string') }}"
                },
                {
                  "name": "limit",
                  "value": "={{ $fromAI('limit', 'Max number of results to return. Defaults to 100', 'number') }}"
                },
                {
                  "name": "all",
                  "value": "={{ $fromAI('all', 'Give âem all to me. Will ignore limit', 'boolean') }}"
                }
              ]
            },
            "toolDescription": "Unpaginated geojson response\n\nParameters:\n- Query parameters:\n  • occurred_before (optional) - End of period\n  • occurred_after (optional) - Start of period\n  • incident_type (optional) - Only incidents of specific type\n  • proximity (optional) - Center of location for proximity search\n  • proximity_square (optional) - Size of the proximity search\n  • query (optional) - Full text search of incidents\n  • limit (optional) - Max number of results to return. Defaults to 100\n  • all (optional) - Give âem all to me. Will ignore limit"
          },
          "typeVersion": 4.2
        },
        {
          "id": "cd37d253-b9ae-40b7-be61-a62adb3b1338",
          "name": "Unpaginated geojson response with simplestyled markers",
          "type": "n8n-nodes-base.httpRequestTool",
          "position": [
            -320,
            180
          ],
          "parameters": {
            "url": "=https://bikewise.org/api/v2/locations/markers",
            "options": {},
            "sendQuery": true,
            "authentication": "genericCredentialType",
            "genericAuthType": "httpHeaderAuth",
            "queryParameters": {
              "parameters": [
                {
                  "name": "occurred_before",
                  "value": "={{ $fromAI('occurred_before', 'End of period', 'number') }}"
                },
                {
                  "name": "occurred_after",
                  "value": "={{ $fromAI('occurred_after', 'Start of period', 'number') }}"
                },
                {
                  "name": "incident_type",
                  "value": "={{ $fromAI('incident_type', 'Only incidents of specific type', 'string') }}"
                },
                {
                  "name": "proximity",
                  "value": "={{ $fromAI('proximity', 'Center of location for proximity search', 'string') }}"
                },
                {
                  "name": "proximity_square",
                  "value": "={{ $fromAI('proximity_square', 'Size of the proximity search', 'number', 100) }}"
                },
                {
                  "name": "query",
                  "value": "={{ $fromAI('query', 'Full text search of incidents', 'string') }}"
                },
                {
                  "name": "limit",
                  "value": "={{ $fromAI('limit', 'Max number of results to return. Defaults to 100', 'number') }}"
                },
                {
                  "name": "all",
                  "value": "={{ $fromAI('all', 'Give âem all to me. Will ignore limit', 'boolean') }}"
                }
              ]
            },
            "toolDescription": "Unpaginated geojson response with simplestyled markers\n\nParameters:\n- Query parameters:\n  • occurred_before (optional) - End of period\n  • occurred_after (optional) - Start of period\n  • incident_type (optional) - Only incidents of specific type\n  • proximity (optional) - Center of location for proximity search\n  • proximity_square (optional) - Size of the proximity search\n  • query (optional) - Full text search of incidents\n  • limit (optional) - Max number of results to return. Defaults to 100\n  • all (optional) - Give âem all to me. Will ignore limit"
          },
          "typeVersion": 4.2
        },
        {
          "id": "b9463aea-103f-4de0-b00e-ef0bc3a2b9ed",
          "name": "Description - locations",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -120,
            180
          ],
          "parameters": {
            "width": 500,
            "height": 120,
            "content": "## 📋 Locations\n\nGeoJSON response for matching incidents"
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "shared": [
        {
          "role": "workflow:owner",
          "project": {
            "id": "G5fce9xGuBAsWBXe",
            "icon": null,
            "name": "David Ashby <david.ashby.lds@gmail.com>",
            "type": "personal",
            "createdAt": "2025-06-04T02:55:02.013Z",
            "updatedAt": "2025-06-04T02:56:01.361Z",
            "projectRelations": [
              {
                "role": "project:personalOwner",
                "user": {
                  "id": "715c1c00-cb48-4712-9a32-f1f4b6db2b30",
                  "role": "global:owner",
                  "email": "david.ashby.lds@gmail.com",
                  "disabled": false,
                  "lastName": "Ashby",
                  "settings": {
                    "npsSurvey": {
                      "responded": true,
                      "lastShownAt": 1749357655581
                    },
                    "userActivated": true,
                    "userActivatedAt": 1749075994495,
                    "easyAIWorkflowOnboarded": true,
                    "firstSuccessfulWorkflowId": "3N3vVikZb3MckFYm"
                  },
                  "createdAt": "2025-06-04T02:55:01.745Z",
                  "firstName": "David",
                  "isPending": false,
                  "updatedAt": "2025-06-08T04:40:58.399Z",
                  "mfaEnabled": false,
                  "personalizationAnswers": {
                    "version": "v4",
                    "personalization_survey_n8n_version": "1.95.3",
                    "personalization_survey_submitted_at": "2025-06-04T02:56:07.075Z"
                  }
                },
                "userId": "715c1c00-cb48-4712-9a32-f1f4b6db2b30",
                "createdAt": "2025-06-04T02:55:02.013Z",
                "projectId": "G5fce9xGuBAsWBXe",
                "updatedAt": "2025-06-04T02:55:02.013Z"
              }
            ]
          },
          "createdAt": "2025-07-01T21:27:46.720Z",
          "projectId": "G5fce9xGuBAsWBXe",
          "updatedAt": "2025-07-01T21:27:46.720Z",
          "workflowId": "5eglr5Z0WCErDn3R"
        }
      ],
      "pinData": {},
      "settings": {
        "timezone": "America/New_York"
      },
      "createdAt": "2025-07-01T21:27:46.717Z",
      "updatedAt": "2025-07-01T21:28:02.000Z",
      "versionId": "0564f0fd-027c-45e7-b3a8-884d54985f7d",
      "isArchived": false,
      "staticData": null,
      "connections": {
        "Get incident": {
          "ai_tool": [
            [
              {
                "node": "BikeWise API v2 MCP Server",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Unpaginated geojson response": {
          "ai_tool": [
            [
              {
                "node": "BikeWise API v2 MCP Server",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Paginated incidents matching parameters": {
          "ai_tool": [
            [
              {
                "node": "BikeWise API v2 MCP Server",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Unpaginated geojson response with simplestyled markers": {
          "ai_tool": [
            [
              {
                "node": "BikeWise API v2 MCP Server",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        }
      },
      "triggerCount": 0
    },
    "lastUpdatedBy": 29,
    "workflowInfo": {
      "nodeCount": 11,
      "nodeTypes": {
        "n8n-nodes-base.stickyNote": {
          "count": 6
        },
        "n8n-nodes-base.httpRequestTool": {
          "count": 4
        },
        "@n8n/n8n-nodes-langchain.mcpTrigger": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "David Ashby",
      "username": "cfomodz",
      "bio": "Unlimited Access to my paid workflows 👇 For the cost of one a month",
      "verified": true,
      "links": [
        "https://www.skool.com/n8n-automation-lab"
      ],
      "avatar": "https://gravatar.com/avatar/0118796cfdab829a3307d407dfeeb01a3952eb402584a45a211e4ef7d15edbbf?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 1293,
        "icon": "file:../mcp.svg",
        "name": "@n8n/n8n-nodes-langchain.mcpTrigger",
        "codex": {
          "data": {
            "alias": [
              "Model Context Protocol",
              "MCP Server"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.mcptrigger/"
                }
              ]
            },
            "categories": [
              "AI",
              "Core Nodes",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Root Nodes",
                "Model Context Protocol"
              ],
              "Core Nodes": [
                "Other Trigger Nodes"
              ]
            }
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "MCP Server Trigger"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwIiBoZWlnaHQ9IjE4MCIgdmlld0JveD0iMCAwIDE5NSAxOTUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+Cgk8ZyBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMTIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+CgkJPHBhdGggZD0iTTI1IDk3Ljg1MjhMOTIuODgyMyAyOS45NzA2QzEwMi4yNTUgMjAuNTk4IDExNy40NTEgMjAuNTk4IDEyNi44MjMgMjkuOTcwNlYyOS45NzA2QzEzNi4xOTYgMzkuMzQzMSAxMzYuMTk2IDU0LjUzOTEgMTI2LjgyMyA2My45MTE3TDc1LjU1ODEgMTE1LjE3NyIvPgoJCTxwYXRoIGQ9Ik03Ni4yNjUzIDExNC40N0wxMjYuODIzIDYzLjkxMTdDMTM2LjE5NiA1NC41MzkxIDE1MS4zOTIgNTQuNTM5MSAxNjAuNzY1IDYzLjkxMTdMMTYxLjExOCA2NC4yNjUyQzE3MC40OTEgNzMuNjM3OCAxNzAuNDkxIDg4LjgzMzggMTYxLjExOCA5OC4yMDYzTDk5LjcyNDggMTU5LjZDOTYuNjAwNiAxNjIuNzI0IDk2LjYwMDYgMTY3Ljc4OSA5OS43MjQ4IDE3MC45MTNMMTEyLjMzMSAxODMuNTIiLz4KCQk8cGF0aCBkPSJNMTA5Ljg1MyA0Ni45NDExTDU5LjY0ODIgOTcuMTQ1N0M1MC4yNzU3IDEwNi41MTggNTAuMjc1NyAxMjEuNzE0IDU5LjY0ODIgMTMxLjA4N1YxMzEuMDg3QzY5LjAyMDggMTQwLjQ1OSA4NC4yMTY4IDE0MC40NTkgOTMuNTg5NCAxMzEuMDg3TDE0My43OTQgODAuODgyMiIvPgoJPC9nPgo8L3N2Zz4K"
        },
        "displayName": "MCP Server Trigger",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          },
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 5,
        "name": "Engineering"
      },
      {
        "id": 47,
        "name": "AI Chatbot"
      }
    ],
    "image": []
  }
}