openrouteservice-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # openrouteservice-mcp
2
+
3
+ Query OpenRouteService (free key; set OPENROUTESERVICE_API_KEY): geocode, reverse geocode, driving directions.
4
+
5
+ ## Tools
6
+
7
+ - `geocode` — Forward geocode a place name.
8
+ - `reverse` — Place name for coordinates.
9
+ - `directions` — Car route between two points.
10
+
11
+ ## Source
12
+
13
+ [openrouteservice-mcp](https://github.com/mrfentmen/premium-mcps/tree/main/servers/openrouteservice-mcp)
package/dist/api.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare class OrsError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare function errorMessage(e: unknown): string;
5
+ export declare function geocode(query: string, limit?: string): Promise<string>;
6
+ export declare function reverse(lat: string, lon: string): Promise<string>;
7
+ export declare function directions(fromLon: string, fromLat: string, toLon: string, toLat: string): Promise<string>;
package/dist/api.js ADDED
@@ -0,0 +1,59 @@
1
+ export class OrsError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "OrsError";
5
+ }
6
+ }
7
+ export function errorMessage(e) {
8
+ return e instanceof Error ? e.message : String(e);
9
+ }
10
+ const UA = { "User-Agent": "awesome-mcps/1.0" };
11
+ function key() {
12
+ const k = process.env.OPENROUTESERVICE_API_KEY;
13
+ if (!k)
14
+ throw new OrsError("Set OPENROUTESERVICE_API_KEY (free openrouteservice key).");
15
+ return k;
16
+ }
17
+ async function get(path) {
18
+ const sep = path.includes("?") ? "&" : "?";
19
+ let res;
20
+ try {
21
+ res = await fetch(`https://api.openrouteservice.org${path}${sep}api_key=${encodeURIComponent(key())}`, {
22
+ headers: { ...UA, Accept: "application/json" },
23
+ signal: AbortSignal.timeout(25000),
24
+ });
25
+ }
26
+ catch (e) {
27
+ throw new OrsError(`Network error: ${e.message}`);
28
+ }
29
+ if (!res.ok) {
30
+ const body = (await res.text()).slice(0, 300);
31
+ throw new OrsError(`HTTP ${res.status}: ${body}`);
32
+ }
33
+ return (await res.text()).slice(0, 12000);
34
+ }
35
+ export function geocode(query, limit) {
36
+ const n = Math.min(Number(limit ?? 5) || 5, 20);
37
+ return get(`/geocode/search?text=${encodeURIComponent(query)}&size=${n}`);
38
+ }
39
+ export function reverse(lat, lon) {
40
+ return get(`/geocode/reverse?point.lat=${encodeURIComponent(lat)}&point.lon=${encodeURIComponent(lon)}&size=1`);
41
+ }
42
+ export async function directions(fromLon, fromLat, toLon, toLat) {
43
+ let res;
44
+ try {
45
+ res = await fetch("https://api.openrouteservice.org/v2/directions/driving-car", {
46
+ method: "POST",
47
+ headers: { ...UA, Accept: "application/json", "Content-Type": "application/json", Authorization: key() },
48
+ body: JSON.stringify({ coordinates: [[Number(fromLon), Number(fromLat)], [Number(toLon), Number(toLat)]] }),
49
+ signal: AbortSignal.timeout(25000),
50
+ });
51
+ }
52
+ catch (e) {
53
+ throw new OrsError(`Network error: ${e.message}`);
54
+ }
55
+ const text = await res.text();
56
+ if (!res.ok)
57
+ throw new OrsError(`HTTP ${res.status}: ${text.slice(0, 300)}`);
58
+ return text.slice(0, 8000);
59
+ }
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { createServer } from "./server.js";
3
+ async function main() {
4
+ const server = createServer();
5
+ const transport = new StdioServerTransport();
6
+ await server.connect(transport);
7
+ console.error("MCP server running on stdio");
8
+ }
9
+ main().catch((err) => {
10
+ console.error("Fatal error:", err);
11
+ process.exit(1);
12
+ });
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function createServer(): McpServer;
package/dist/server.js ADDED
@@ -0,0 +1,63 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { errorMessage, geocode, reverse, directions, } from "./api.js";
4
+ const text = (t) => ({ content: [{ type: "text", text: t }] });
5
+ const textError = (t) => ({ content: [{ type: "text", text: t }], isError: true });
6
+ const READ_ONLY = { readOnlyHint: true, openWorldHint: true };
7
+ export function createServer() {
8
+ const server = new McpServer({
9
+ name: "openrouteservice-mcp",
10
+ version: "1.0.0",
11
+ });
12
+ server.registerTool("geocode", {
13
+ title: "Geocode",
14
+ description: "Forward geocode a place name.",
15
+ inputSchema: z.object({
16
+ query: z.string().describe("Place name, e.g. Berlin."),
17
+ limit: z.string().describe("Max results (default 5, max 20).").optional()
18
+ }),
19
+ annotations: READ_ONLY,
20
+ }, async ({ query, limit }) => {
21
+ try {
22
+ return text(await geocode(query, limit));
23
+ }
24
+ catch (e) {
25
+ return textError(errorMessage(e));
26
+ }
27
+ });
28
+ server.registerTool("reverse", {
29
+ title: "Reverse geocode",
30
+ description: "Place name for coordinates.",
31
+ inputSchema: z.object({
32
+ lat: z.string().describe("Latitude."),
33
+ lon: z.string().describe("Longitude.")
34
+ }),
35
+ annotations: READ_ONLY,
36
+ }, async ({ lat, lon }) => {
37
+ try {
38
+ return text(await reverse(lat, lon));
39
+ }
40
+ catch (e) {
41
+ return textError(errorMessage(e));
42
+ }
43
+ });
44
+ server.registerTool("directions", {
45
+ title: "Driving directions",
46
+ description: "Car route between two points.",
47
+ inputSchema: z.object({
48
+ from_lon: z.string().describe("Origin longitude."),
49
+ from_lat: z.string().describe("Origin latitude."),
50
+ to_lon: z.string().describe("Destination longitude."),
51
+ to_lat: z.string().describe("Destination latitude.")
52
+ }),
53
+ annotations: READ_ONLY,
54
+ }, async ({ from_lon, from_lat, to_lon, to_lat }) => {
55
+ try {
56
+ return text(await directions(from_lon, from_lat, to_lon, to_lat));
57
+ }
58
+ catch (e) {
59
+ return textError(errorMessage(e));
60
+ }
61
+ });
62
+ return server;
63
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "openrouteservice-mcp",
3
+ "version": "1.0.0",
4
+ "description": "OpenRouteService geocoding and routing. Free key.",
5
+ "type": "module",
6
+ "mcpName": "io.github.mrfentmen/openrouteservice-mcp",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/mrfentmen/premium-mcps.git"
10
+ },
11
+ "bin": {
12
+ "openrouteservice-mcp": "./dist/index.js"
13
+ },
14
+ "main": "./dist/index.js",
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "start": "node dist/index.js",
21
+ "dev": "rm -rf dist && tsc -p tsconfig.json && node dist/index.js",
22
+ "inspect": "npx @modelcontextprotocol/inspector node dist/index.js"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "openrouteservice",
27
+ "geocoding",
28
+ "routing",
29
+ "maps"
30
+ ],
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.0.4",
34
+ "zod": "^3.23.8"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^22.0.0",
38
+ "typescript": "^5.6.0"
39
+ },
40
+ "engines": {
41
+ "node": ">=20"
42
+ }
43
+ }