Skip to main content
Glama
ploughran

Parcel MCP Server

by ploughran
README.md
# Parcel MCP Server

A mock MCP (Model Context Protocol) server that simulates small parcel and package operations. Designed for use with AI agents, it exposes 12 tools covering the common actions a driver or package processing centre would need to remedy recipient issues.

## Live Server

Hosted on Railway — always on, no setup required.

| | |
|---|---|
| **Health check** | https://parcel-mcp-server-production.up.railway.app/health |
| **MCP endpoint** | https://parcel-mcp-server-production.up.railway.app/mcp |
| **OAuth token URL** | https://parcel-mcp-server-production.up.railway.app/oauth/token |

## Salesforce Agentforce Registry Connection

To register this server in the Salesforce Agentforce Registry, use the following settings:

| Field | Value |
|---|---|
| MCP Server Name | Parcel MCP Server |
| Server URL | `https://parcel-mcp-server-production.up.railway.app/mcp` |
| Authentication Method | OAuth 2.0 |
| Identity Provider URL | `https://parcel-mcp-server-production.up.railway.app/oauth/token` |
| Scope | `read` |
| Client ID | any value |
| Client Secret | any value |

> The OAuth endpoint is a mock — it accepts any client ID and secret and returns a valid bearer token.

## Tools

| Tool | Description |
|---|---|
| `list_drivers` | List all active drivers with IDs, names, routes, and package counts — use this first to look up a driver by name |
| `track_package` | Look up status, location history, and delivery details by tracking number |
| `list_packages_for_driver` | List all packages assigned to a driver with status and recipient info |
| `update_delivery_status` | Log delivery attempts, exceptions, or completions |
| `correct_delivery_address` | Submit a corrected address for an invalid or undeliverable package |
| `schedule_redelivery` | Book a redelivery with preferred date and time window |
| `request_hold_for_pickup` | Hold a package at the nearest facility for recipient pickup |
| `initiate_return_to_sender` | Mark a package for return with a reason code |
| `update_recipient_contact` | Update phone or email for delivery notifications |
| `report_damaged_package` | File a damage claim with severity level |
| `get_facility_info` | Get hours, address, and accessibility info for the holding facility |
| `send_delivery_notification` | Send SMS or email notification to the recipient |
| `get_route_summary` | Get a driver's route stats — delivered, pending, exceptions |

## Mock Data

Ten packages across four driver routes cover all major delivery scenarios:

| Tracking # | Status | Recipient | Driver |
|---|---|---|---|
| `1Z999AA10123456784` | OUT_FOR_DELIVERY | Jane Smith, Denver CO | DRV-101 Carlos Rivera |
| `1Z999AA10234567895` | DELIVERY_EXCEPTION | Bob Johnson, Denver CO | DRV-101 Carlos Rivera |
| `1Z999AA10567890128` | DELIVERED | Susan Park, Denver CO | DRV-101 Carlos Rivera |
| `1Z999AA10345678906` | HELD_AT_FACILITY | Maria Garcia, Aurora CO | DRV-102 Priya Patel |
| `1Z999AA10456789017` | PENDING_ADDRESS_CORRECTION | Tom Lee, Denver CO | DRV-102 Priya Patel |
| `1Z999AA10678901239` | DELIVERED | David Kim, Aurora CO | DRV-102 Priya Patel |
| `1Z999AA10789012340` | OUT_FOR_DELIVERY | Rachel Torres, Denver CO | DRV-103 Marcus Webb |
| `1Z999AA10890123451` | DELIVERY_EXCEPTION | Kevin Nguyen, Denver CO | DRV-103 Marcus Webb |
| `1Z999AA10901234562` | IN_TRANSIT | Amanda Foster, Denver CO | DRV-104 Lisa Chen |
| `1Z999AA11012345673` | REDELIVERY_SCHEDULED | Chris Mendoza, Denver CO | DRV-104 Lisa Chen |

Four drivers are pre-loaded:

| Driver ID | Name | Route | Packages |
|---|---|---|---|
| `DRV-101` | Carlos Rivera | ROUTE-A | 3 |
| `DRV-102` | Priya Patel | ROUTE-B | 3 |
| `DRV-103` | Marcus Webb | ROUTE-C | 2 |
| `DRV-104` | Lisa Chen | ROUTE-D | 2 |

Use `list_drivers` to look up driver IDs by name before calling driver-specific tools.

## Architecture

The diagram below shows the full request flow from Agentforce through the Salesforce Apex invocable action to this MCP server.

```
┌─────────────────┐     invoke action      ┌──────────────────────┐
│   Agentforce    │ ─────────────────────► │  TrackParcelAction   │
│  Agent Studio   │ ◄─────────────────────  │  (@InvocableMethod)  │
└─────────────────┘     response           └──────────┬───────────┘
                                                       │
                              POST /oauth/token        │  POST /mcp
                         ┌─────────────────────────────┤
                         ▼                             ▼
               ┌──────────────────┐       ┌───────────────────────┐
               │   OAuth Server   │       │   Parcel MCP Server   │
               │ client_creds JWT │       │   JSON-RPC 2.0        │
               └──────────────────┘       │   tools/call          │
                                          └───────────┬───────────┘
                                                      │
                                          ┌───────────▼───────────┐
                                          │   Tool Handler        │
                                          │  track_package etc.   │
                                          └───────────────────────┘
```

An interactive HTML visualization (`mcp-visualization.html`) is included in the repo — open it in a browser to animate the full request/response flow, explore all 12 tools, and inspect parsed and raw JSON-RPC responses.

## Running Locally

No npm install required — the server uses only Node.js built-ins.

```bash
node server.js
# Server runs on http://localhost:3333
```

Or use the included launcher which starts the server and an ngrok tunnel together:

```bash
bash launch.command
```

The launcher prints your public ngrok URL and the Salesforce connection settings automatically.

## Redeploying to Railway

Any changes to `server.js` can be redeployed with:

```bash
railway up
```

Make sure you have the [Railway CLI](https://docs.railway.app/develop/cli) installed and are logged in (`railway login`).