222 lines
5.0 KiB
Markdown
222 lines
5.0 KiB
Markdown
# MCP Server for PARCOURSMOB
|
|
|
|
This package implements a Model Context Protocol (MCP) HTTP server for the PARCOURSMOB application, exposing journey search functionality as an MCP tool.
|
|
|
|
## Overview
|
|
|
|
The MCP server provides a standardized interface for AI assistants to search for multimodal journeys, including:
|
|
- Public transit routes
|
|
- Carpooling solutions (via operators like Mobicoop)
|
|
- Solidarity transport
|
|
- Organized carpools
|
|
- Fleet vehicles
|
|
- Local knowledge base solutions
|
|
|
|
## Configuration
|
|
|
|
Enable the MCP server in your config file:
|
|
|
|
```yaml
|
|
server:
|
|
mcp:
|
|
enabled: true
|
|
listen: "0.0.0.0:8081"
|
|
```
|
|
|
|
Or via environment variables:
|
|
```bash
|
|
export SERVER_MCP_ENABLED=true
|
|
export SERVER_MCP_LISTEN="0.0.0.0:8081"
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### Initialize
|
|
```http
|
|
POST /mcp/v1/initialize
|
|
```
|
|
|
|
Returns server capabilities and protocol version.
|
|
|
|
### List Tools
|
|
```http
|
|
GET /mcp/v1/tools/list
|
|
```
|
|
|
|
Returns available MCP tools.
|
|
|
|
### Call Tool
|
|
```http
|
|
POST /mcp/v1/tools/call
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"name": "search_journeys",
|
|
"arguments": {
|
|
"departure": "123 Main St, Paris, France",
|
|
"destination": "456 Oak Ave, Lyon, France",
|
|
"departure_date": "2025-01-20",
|
|
"departure_time": "14:30"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Health Check
|
|
```http
|
|
GET /health
|
|
```
|
|
|
|
## Available Tools
|
|
|
|
### search_journeys
|
|
|
|
Searches for multimodal journey options between two locations.
|
|
|
|
**Parameters:**
|
|
- `departure` (string, required): Departure address as text
|
|
- `destination` (string, required): Destination address as text
|
|
- `departure_date` (string, required): Date in YYYY-MM-DD format
|
|
- `departure_time` (string, required): Time in HH:MM format (24-hour)
|
|
- `passenger_id` (string, optional): Passenger ID to retrieve address from account
|
|
- `exclude_driver_ids` (array, optional): List of driver IDs to exclude from solidarity transport results
|
|
|
|
**Example Request:**
|
|
```bash
|
|
curl -X POST http://localhost:8081/mcp/v1/tools/call \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"name": "search_journeys",
|
|
"arguments": {
|
|
"departure": "Gare de Lyon, Paris",
|
|
"destination": "Part-Dieu, Lyon",
|
|
"departure_date": "2025-01-20",
|
|
"departure_time": "09:00"
|
|
}
|
|
}'
|
|
```
|
|
|
|
**Response Format:**
|
|
```json
|
|
{
|
|
"search_parameters": {
|
|
"departure": {
|
|
"label": "Gare de Lyon, Paris, France",
|
|
"coordinates": { "type": "Point", "coordinates": [2.3736, 48.8443] }
|
|
},
|
|
"destination": {
|
|
"label": "Part-Dieu, Lyon, France",
|
|
"coordinates": { "type": "Point", "coordinates": [4.8575, 45.7605] }
|
|
},
|
|
"departure_date": "2025-01-20",
|
|
"departure_time": "09:00"
|
|
},
|
|
"results": {
|
|
"CarpoolResults": [...],
|
|
"TransitResults": [...],
|
|
"VehicleResults": [...],
|
|
"DriverJourneys": [...],
|
|
"OrganizedCarpools": [...],
|
|
"KnowledgeBaseResults": [...]
|
|
}
|
|
}
|
|
```
|
|
|
|
## Architecture
|
|
|
|
### Package Structure
|
|
|
|
- `mcp.go`: HTTP server and request routing
|
|
- `tools.go`: Tool registration and execution
|
|
- `journey_search.go`: Journey search tool implementation
|
|
|
|
### Flow
|
|
|
|
1. HTTP request received at MCP endpoint
|
|
2. Tool name and arguments extracted
|
|
3. Addresses geocoded using Pelias geocoding service
|
|
4. Journey search executed via ApplicationHandler
|
|
5. Results formatted and returned as JSON
|
|
|
|
### Dependencies
|
|
|
|
The MCP server uses:
|
|
- Pelias geocoding service (configured via `geo.pelias.url`)
|
|
- ApplicationHandler for journey search business logic
|
|
- All backend services (GRPC): solidarity transport, carpool service, transit routing, fleets, etc.
|
|
|
|
## Integration with AI Assistants
|
|
|
|
The MCP server follows the Model Context Protocol specification, making it compatible with AI assistants that support MCP, such as Claude Desktop or other MCP-enabled tools.
|
|
|
|
Example Claude Desktop configuration:
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"parcoursmob": {
|
|
"url": "http://localhost:8081/mcp/v1"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Development
|
|
|
|
### Testing
|
|
|
|
Test the health endpoint:
|
|
```bash
|
|
curl http://localhost:8081/health
|
|
```
|
|
|
|
List available tools:
|
|
```bash
|
|
curl http://localhost:8081/mcp/v1/tools/list
|
|
```
|
|
|
|
Test journey search:
|
|
```bash
|
|
curl -X POST http://localhost:8081/mcp/v1/tools/call \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"name": "search_journeys",
|
|
"arguments": {
|
|
"departure": "Paris",
|
|
"destination": "Lyon",
|
|
"departure_date": "2025-01-20",
|
|
"departure_time": "10:00"
|
|
}
|
|
}'
|
|
```
|
|
|
|
### Adding New Tools
|
|
|
|
To add a new MCP tool:
|
|
|
|
1. Define the tool in `tools.go`:
|
|
```go
|
|
func (h *ToolsHandler) registerNewTool() {
|
|
tool := &Tool{
|
|
Name: "tool_name",
|
|
Description: "Tool description",
|
|
InputSchema: map[string]any{...},
|
|
}
|
|
h.tools["tool_name"] = tool
|
|
}
|
|
```
|
|
|
|
2. Implement the handler:
|
|
```go
|
|
func (h *ToolsHandler) handleNewTool(ctx context.Context, arguments map[string]any) (any, error) {
|
|
// Implementation
|
|
}
|
|
```
|
|
|
|
3. Add to CallTool switch statement in `tools.go`
|
|
|
|
## Notes
|
|
|
|
- All times are handled in Europe/Paris timezone
|
|
- Geocoding uses the first result from Pelias
|
|
- Journey search runs multiple transport mode queries in parallel
|
|
- Results include all available transport options for the requested route
|